[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M79DSYVESE9E98Y5ZKJSZSH9":3,"skill-same:01M79DSYVESE9E98Y5ZKJSZSH9":51},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":27,"commitSha":28,"skillDirectory":29,"forksCount":30,"repositoryHtmlUrl":31,"repositoryHomepageUrl":32,"ownerHtmlUrl":33,"ownerBlogUrl":34,"ownerDescription":35,"updatedAt":36,"install":37,"resources":50},"01M79DSYVESE9E98Y5ZKJSZSH9","mlflow-mlops-pipeline",null,"Build and manage end-to-end MLOps pipelines using MLflow for experiment tracking, model registry, artifact logging, autologging, model evaluation, and deployment serving. Triggers when integrating MLflow tracking servers, configuring S3\u002FGCS backend stores, writing custom PyFunc models, automating hyperparameter tuning (Optuna), registering models, or building FastAPI\u002FDocker inference services.","hamzabellouch\u002Fagent-skills","hamzabellouch","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F237856042?v=4","01M79BRYW7XAMK3YDWQEMTWGWS","Hamza Bellouch","01M79BRYWXQV3JK2TGVTX8GN2A",8,"MIT","https:\u002F\u002Fgithub.com\u002Fhamzabellouch\u002Fagent-skills\u002Fblob\u002Fmain\u002FProgramming\u002FAI_Engineering_and_Platforms\u002FMLOps_and_Lifecycle\u002Fmlflow-mlops-pipeline\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: mlflow-mlops-pipeline\nmetadata:\n  category: Machine Learning Operations (MLOps)\ndescription: >-\n  Build and manage end-to-end MLOps pipelines using MLflow for experiment tracking, model registry, artifact logging,\n  autologging, model evaluation, and deployment serving. Triggers when integrating MLflow tracking servers, configuring\n  S3\u002FGCS backend stores, writing custom PyFunc models, automating hyperparameter tuning (Optuna), registering models,\n  or building FastAPI\u002FDocker inference services.\ncompatibility: Python (>= 3.9), MLflow (>= 2.8.0), scikit-learn \u002F PyTorch \u002F TensorFlow, PostgreSQL \u002F S3 \u002F GCS\n---\n\n# MLflow MLOps Pipelines & Experiment Tracking\n\nEnd-to-end MLOps patterns for tracking experiments, managing model registries, versioning artifacts, evaluating metrics, and deploying models using MLflow.\n\n---\n\n## 1. MLOps Architecture Overview\n\n```text\n+-------------------+      +---------------------------------+      +------------------------+\n|  Training Data    | ---> | ML Training Pipeline (PyTorch)  | ---> |  MLflow Tracking Server|\n|  (S3 \u002F Snowflake) |      | (Autolog + Custom PyFunc)       |      |  (PostgreSQL Backend)  |\n+-------------------+      +---------------------------------+      +------------------------+\n                                                                                |\n                                                                                v\n+-------------------+      +---------------------------------+      +------------------------+\n|  Inference Client | ---> | FastAPI \u002F MLflow Serve API      | \u003C--- |  MLflow Model Registry |\n|  (REST \u002F gRPC)    |      | (Container App \u002F KServe)        |      |  (S3 Artifact Store)   |\n+-------------------+      +---------------------------------+      +------------------------+\n```\n\n---\n\n## 2. Remote Tracking Server & Backend Configuration\n\n### Environment Variables setup (`.env`)\n\n```env\nMLFLOW_TRACKING_URI=postgresql:\u002F\u002Fmlflow_user:secure_password@db.prod.internal:5432\u002Fmlflow_db\nMLFLOW_S3_ENDPOINT_URL=https:\u002F\u002Fs3.us-east-1.amazonaws.com\nMLFLOW_PYTHON_BIN=\u002Fusr\u002Fbin\u002Fpython3\nAWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE\nAWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI\u002FK7MDENG\u002FbPxRfiCYEXAMPLEKEY\n```\n\n---\n\n## 3. Production Training & Tracking Pipeline (`train_pipeline.py`)\n\nComplete Python implementation showcasing dataset logging, Optuna hyperparameter optimization, autologging, custom metrics, and model registration.\n\n```python\nimport os\nimport sys\nimport logging\nimport optuna\nimport pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import GradientBoostingClassifier\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score\nimport mlflow\nimport mlflow.sklearn\nfrom mlflow.models.signature import infer_signature\n\n# Configure Logging\nlogging.basicConfig(level=logging.INFO)\nlogger = logging.getLogger(__name__)\n\n# Initialize MLflow Tracking Server\nTRACKING_URI = os.getenv(\"MLFLOW_TRACKING_URI\", \"http:\u002F\u002Flocalhost:5000\")\nmlflow.set_tracking_uri(TRACKING_URI)\nEXPERIMENT_NAME = \"customer_churn_prediction\"\nmlflow.set_experiment(EXPERIMENT_NAME)\n\ndef load_and_preprocess_data():\n    \"\"\"Generates synthetic dataset for illustration.\"\"\"\n    np.random.seed(42)\n    X = np.random.randn(1000, 10)\n    y = (X[:, 0] + X[:, 1] > 0).astype(int)\n    feature_names = [f\"feature_{i}\" for i in range(10)]\n    df = pd.DataFrame(X, columns=feature_names)\n    df['target'] = y\n    return df, feature_names\n\ndef train_and_evaluate():\n    df, feature_names = load_and_preprocess_data()\n    X = df[feature_names]\n    y = df['target']\n    \n    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n\n    def objective(trial):\n        with mlflow.start_run(nested=True):\n            n_estimators = trial.suggest_int('n_estimators', 50, 300)\n            max_depth = trial.suggest_int('max_depth', 3, 10)\n            learning_rate = trial.suggest_float('learning_rate', 0.01, 0.2)\n\n            model = GradientBoostingClassifier(\n                n_estimators=n_estimators,\n                max_depth=max_depth,\n                learning_rate=learning_rate,\n                random_state=42\n            )\n            model.fit(X_train, y_train)\n            \n            preds = model.predict(X_test)\n            acc = accuracy_score(y_test, preds)\n            \n            # Log params & metrics for sub-run\n            mlflow.log_params({\n                \"n_estimators\": n_estimators,\n                \"max_depth\": max_depth,\n                \"learning_rate\": learning_rate\n            })\n            mlflow.log_metric(\"val_accuracy\", acc)\n            \n            return acc\n\n    # Parent MLflow Run for Hyperparameter Sweep\n    with mlflow.start_run(run_name=\"optuna_sweep_parent\") as parent_run:\n        study = optuna.create_study(direction=\"maximize\")\n        study.optimize(objective, n_trials=5)\n\n        best_params = study.best_params\n        logger.info(f\"Best Hyperparameters: {best_params}\")\n\n        # Train Final Champion Model\n        champion_model = GradientBoostingClassifier(**best_params, random_state=42)\n        champion_model.fit(X_train, y_train)\n\n        # Evaluate Champion Model\n        y_pred = champion_model.predict(X_test)\n        y_proba = champion_model.predict_proba(X_test)[:, 1]\n\n        metrics = {\n            \"accuracy\": accuracy_score(y_test, y_pred),\n            \"precision\": precision_score(y_test, y_pred),\n            \"recall\": recall_score(y_test, y_pred),\n            \"f1_score\": f1_score(y_test, y_pred),\n            \"roc_auc\": roc_auc_score(y_test, y_proba)\n        }\n\n        # Log metrics to parent run\n        mlflow.log_params(best_params)\n        mlflow.log_metrics(metrics)\n\n        # Log Model Signature & Input Example\n        signature = infer_signature(X_test, champion_model.predict(X_test))\n        input_example = X_test.head(3)\n\n        # Register Champion Model to MLflow Model Registry\n        model_info = mlflow.sklearn.log_model(\n            sk_model=champion_model,\n            artifact_path=\"model\",\n            signature=signature,\n            input_example=input_example,\n            registered_model_name=\"CustomerChurnClassifier\"\n        )\n        logger.info(f\"Model logged successfully: {model_info.model_uri}\")\n\nif __name__ == \"__main__\":\n    train_and_evaluate()\n```\n\n---\n\n## 4. Custom PyFunc Wrapper for Preprocessing Pipelines (`custom_pyfunc.py`)\n\nWhen your inference workflow requires custom pre-processing or feature transformations before executing model prediction:\n\n```python\nimport mlflow.pyfunc\nimport numpy as np\nimport pandas as pd\n\nclass ChurnPipelineWrapper(mlflow.pyfunc.PythonModel):\n    def __init__(self, model, scaler):\n        self.model = model\n        self.scaler = scaler\n\n    def predict(self, context, model_input: pd.DataFrame) -> np.ndarray:\n        \"\"\"Custom inference method handling pre-processing.\"\"\"\n        # 1. Fill missing values\n        cleaned_input = model_input.fillna(0)\n        \n        # 2. Scale features\n        scaled_input = self.scaler.transform(cleaned_input)\n        \n        # 3. Model predict probabilities\n        probabilities = self.model.predict_proba(scaled_input)[:, 1]\n        \n        return np.where(probabilities > 0.5, 1, 0)\n\n# Save custom PyFunc model\n# mlflow.pyfunc.log_model(\n#     artifact_path=\"churn_pyfunc_model\",\n#     python_model=ChurnPipelineWrapper(model, scaler),\n#     registered_model_name=\"CustomerChurnPyFunc\"\n# )\n```\n\n---\n\n## 5. Automated Model Registry & Production Promotion (`promote_model.py`)\n\nScript for CI\u002FCD pipelines to evaluate candidate models and transition stages dynamically.\n\n```python\nimport os\nimport logging\nfrom mlflow.tracking import MlflowClient\n\nlogging.basicConfig(level=logging.INFO)\nlogger = logging.getLogger(__name__)\n\nclient = MlflowClient(tracking_uri=os.getenv(\"MLFLOW_TRACKING_URI\"))\nMODEL_NAME = \"CustomerChurnClassifier\"\n\ndef promote_latest_model():\n    # Fetch latest version of model\n    latest_versions = client.get_latest_versions(MODEL_NAME, stages=[\"None\"])\n    if not latest_versions:\n        logger.info(\"No new model versions found for promotion.\")\n        return\n\n    latest_version = latest_versions[0].version\n    run_id = latest_versions[0].run_id\n\n    # Fetch metric performance\n    run_data = client.get_run(run_id)\n    accuracy = run_data.data.metrics.get(\"accuracy\", 0.0)\n\n    ACCURACY_THRESHOLD = 0.85\n\n    if accuracy >= ACCURACY_THRESHOLD:\n        logger.info(f\"Model version {latest_version} passed check (Accuracy: {accuracy:.4f}). Transitioning to Production.\")\n        \n        # Archive current Production models\n        for mv in client.search_model_versions(f\"name='{MODEL_NAME}'\"):\n            if mv.current_stage == \"Production\":\n                client.transition_model_version_stage(\n                    name=MODEL_NAME,\n                    version=mv.version,\n                    stage=\"Archived\"\n                )\n\n        # Promote new model to Production\n        client.transition_model_version_stage(\n            name=MODEL_NAME,\n            version=latest_version,\n            stage=\"Production\"\n        )\n    else:\n        logger.warning(f\"Model version {latest_version} failed validation (Accuracy: {accuracy:.4f} \u003C {ACCURACY_THRESHOLD}).\")\n\nif __name__ == \"__main__\":\n    promote_latest_model()\n```\n\n---\n\n## 6. Serving MLflow Models via FastAPI (`serve_fastapi.py`)\n\n```python\nfrom fastapi import FastAPI, HTTPException\nfrom pydantic import BaseModel\nimport pandas as pd\nimport mlflow.pyfunc\nimport os\n\napp = FastAPI(title=\"MLflow Model Serving API\", version=\"1.0.0\")\n\n# Load model from MLflow Registry on startup\nMODEL_URI = os.getenv(\"MODEL_URI\", \"models:\u002FCustomerChurnClassifier\u002FProduction\")\nmodel = None\n\n@app.on_event(\"startup\")\ndef load_model():\n    global model\n    mlflow.set_tracking_uri(os.getenv(\"MLFLOW_TRACKING_URI\", \"http:\u002F\u002Flocalhost:5000\"))\n    model = mlflow.pyfunc.load_model(MODEL_URI)\n\nclass InferenceRequest(BaseModel):\n    features: list[dict]\n\n@app.post(\"\u002Fpredict\")\ndef predict(request: InferenceRequest):\n    if not model:\n        raise HTTPException(status_code=500, detail=\"Model not initialized\")\n    \n    df = pd.DataFrame(request.features)\n    predictions = model.predict(df)\n    return {\"predictions\": predictions.tolist()}\n```\n\n---\n\n## 7. MLOps Best Practices Checklist\n\n1. **Artifact Store Isolation**: Store artifacts in dedicated cloud bucket prefixes per environment (`s3:\u002F\u002Fmy-ml-artifacts-prod\u002F`).\n2. **Model Signatures**: Always log explicit inputs and outputs signatures using `mlflow.models.signature.infer_signature`.\n3. **Environment Lock**: Log `conda.yaml` or `requirements.txt` environment locks alongside models to guarantee reproducible containerized deployments.\n4. **Deterministic Run Names**: Set clear, human-readable run names (`mlflow.start_run(run_name=\"xgboost_baseline_v1\")`) instead of relying on default UUID strings.\n","# MLflow MLOps Pipelines & Experiment Tracking\n\nEnd-to-end MLOps patterns for tracking experiments, managing model registries, versioning artifacts, evaluating metrics, and deploying models using MLflow.\n\n---\n\n## 1. MLOps Architecture Overview\n\n```text\n+-------------------+      +---------------------------------+      +------------------------+\n|  Training Data    | ---> | ML Training Pipeline (PyTorch)  | ---> |  MLflow Tracking Server|\n|  (S3 \u002F Snowflake) |      | (Autolog + Custom PyFunc)       |      |  (PostgreSQL Backend)  |\n+-------------------+      +---------------------------------+      +------------------------+\n                                                                                |\n                                                                                v\n+-------------------+      +---------------------------------+      +------------------------+\n|  Inference Client | ---> | FastAPI \u002F MLflow Serve API      | \u003C--- |  MLflow Model Registry |\n|  (REST \u002F gRPC)    |      | (Container App \u002F KServe)        |      |  (S3 Artifact Store)   |\n+-------------------+      +---------------------------------+      +------------------------+\n```\n\n---\n\n## 2. Remote Tracking Server & Backend Configuration\n\n### Environment Variables setup (`.env`)\n\n```env\nMLFLOW_TRACKING_URI=postgresql:\u002F\u002Fmlflow_user:secure_password@db.prod.internal:5432\u002Fmlflow_db\nMLFLOW_S3_ENDPOINT_URL=https:\u002F\u002Fs3.us-east-1.amazonaws.com\nMLFLOW_PYTHON_BIN=\u002Fusr\u002Fbin\u002Fpython3\nAWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE\nAWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI\u002FK7MDENG\u002FbPxRfiCYEXAMPLEKEY\n```\n\n---\n\n## 3. Production Training & Tracking Pipeline (`train_pipeline.py`)\n\nComplete Python implementation showcasing dataset logging, Optuna hyperparameter optimization, autologging, custom metrics, and model registration.\n\n```python\nimport os\nimport sys\nimport logging\nimport optuna\nimport pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import GradientBoostingClassifier\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score\nimport mlflow\nimport mlflow.sklearn\nfrom mlflow.models.signature import infer_signature\n\n# Configure Logging\nlogging.basicConfig(level=logging.INFO)\nlogger = logging.getLogger(__name__)\n\n# Initialize MLflow Tracking Server\nTRACKING_URI = os.getenv(\"MLFLOW_TRACKING_URI\", \"http:\u002F\u002Flocalhost:5000\")\nmlflow.set_tracking_uri(TRACKING_URI)\nEXPERIMENT_NAME = \"customer_churn_prediction\"\nmlflow.set_experiment(EXPERIMENT_NAME)\n\ndef load_and_preprocess_data():\n    \"\"\"Generates synthetic dataset for illustration.\"\"\"\n    np.random.seed(42)\n    X = np.random.randn(1000, 10)\n    y = (X[:, 0] + X[:, 1] > 0).astype(int)\n    feature_names = [f\"feature_{i}\" for i in range(10)]\n    df = pd.DataFrame(X, columns=feature_names)\n    df['target'] = y\n    return df, feature_names\n\ndef train_and_evaluate():\n    df, feature_names = load_and_preprocess_data()\n    X = df[feature_names]\n    y = df['target']\n    \n    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n\n    def objective(trial):\n        with mlflow.start_run(nested=True):\n            n_estimators = trial.suggest_int('n_estimators', 50, 300)\n            max_depth = trial.suggest_int('max_depth', 3, 10)\n            learning_rate = trial.suggest_float('learning_rate', 0.01, 0.2)\n\n            model = GradientBoostingClassifier(\n                n_estimators=n_estimators,\n                max_depth=max_depth,\n                learning_rate=learning_rate,\n                random_state=42\n            )\n            model.fit(X_train, y_train)\n            \n            preds = model.predict(X_test)\n            acc = accuracy_score(y_test, preds)\n            \n            # Log params & metrics for sub-run\n            mlflow.log_params({\n                \"n_estimators\": n_estimators,\n                \"max_depth\": max_depth,\n                \"learning_rate\": learning_rate\n            })\n            mlflow.log_metric(\"val_accuracy\", acc)\n            \n            return acc\n\n    # Parent MLflow Run for Hyperparameter Sweep\n    with mlflow.start_run(run_name=\"optuna_sweep_parent\") as parent_run:\n        study = optuna.create_study(direction=\"maximize\")\n        study.optimize(objective, n_trials=5)\n\n        best_params = study.best_params\n        logger.info(f\"Best Hyperparameters: {best_params}\")\n\n        # Train Final Champion Model\n        champion_model = GradientBoostingClassifier(**best_params, random_state=42)\n        champion_model.fit(X_train, y_train)\n\n        # Evaluate Champion Model\n        y_pred = champion_model.predict(X_test)\n        y_proba = champion_model.predict_proba(X_test)[:, 1]\n\n        metrics = {\n            \"accuracy\": accuracy_score(y_test, y_pred),\n            \"precision\": precision_score(y_test, y_pred),\n            \"recall\": recall_score(y_test, y_pred),\n            \"f1_score\": f1_score(y_test, y_pred),\n            \"roc_auc\": roc_auc_score(y_test, y_proba)\n        }\n\n        # Log metrics to parent run\n        mlflow.log_params(best_params)\n        mlflow.log_metrics(metrics)\n\n        # Log Model Signature & Input Example\n        signature = infer_signature(X_test, champion_model.predict(X_test))\n        input_example = X_test.head(3)\n\n        # Register Champion Model to MLflow Model Registry\n        model_info = mlflow.sklearn.log_model(\n            sk_model=champion_model,\n            artifact_path=\"model\",\n            signature=signature,\n            input_example=input_example,\n            registered_model_name=\"CustomerChurnClassifier\"\n        )\n        logger.info(f\"Model logged successfully: {model_info.model_uri}\")\n\nif __name__ == \"__main__\":\n    train_and_evaluate()\n```\n\n---\n\n## 4. Custom PyFunc Wrapper for Preprocessing Pipelines (`custom_pyfunc.py`)\n\nWhen your inference workflow requires custom pre-processing or feature transformations before executing model prediction:\n\n```python\nimport mlflow.pyfunc\nimport numpy as np\nimport pandas as pd\n\nclass ChurnPipelineWrapper(mlflow.pyfunc.PythonModel):\n    def __init__(self, model, scaler):\n        self.model = model\n        self.scaler = scaler\n\n    def predict(self, context, model_input: pd.DataFrame) -> np.ndarray:\n        \"\"\"Custom inference method handling pre-processing.\"\"\"\n        # 1. Fill missing values\n        cleaned_input = model_input.fillna(0)\n        \n        # 2. Scale features\n        scaled_input = self.scaler.transform(cleaned_input)\n        \n        # 3. Model predict probabilities\n        probabilities = self.model.predict_proba(scaled_input)[:, 1]\n        \n        return np.where(probabilities > 0.5, 1, 0)\n\n# Save custom PyFunc model\n# mlflow.pyfunc.log_model(\n#     artifact_path=\"churn_pyfunc_model\",\n#     python_model=ChurnPipelineWrapper(model, scaler),\n#     registered_model_name=\"CustomerChurnPyFunc\"\n# )\n```\n\n---\n\n## 5. Automated Model Registry & Production Promotion (`promote_model.py`)\n\nScript for CI\u002FCD pipelines to evaluate candidate models and transition stages dynamically.\n\n```python\nimport os\nimport logging\nfrom mlflow.tracking import MlflowClient\n\nlogging.basicConfig(level=logging.INFO)\nlogger = logging.getLogger(__name__)\n\nclient = MlflowClient(tracking_uri=os.getenv(\"MLFLOW_TRACKING_URI\"))\nMODEL_NAME = \"CustomerChurnClassifier\"\n\ndef promote_latest_model():\n    # Fetch latest version of model\n    latest_versions = client.get_latest_versions(MODEL_NAME, stages=[\"None\"])\n    if not latest_versions:\n        logger.info(\"No new model versions found for promotion.\")\n        return\n\n    latest_version = latest_versions[0].version\n    run_id = latest_versions[0].run_id\n\n    # Fetch metric performance\n    run_data = client.get_run(run_id)\n    accuracy = run_data.data.metrics.get(\"accuracy\", 0.0)\n\n    ACCURACY_THRESHOLD = 0.85\n\n    if accuracy >= ACCURACY_THRESHOLD:\n        logger.info(f\"Model version {latest_version} passed check (Accuracy: {accuracy:.4f}). Transitioning to Production.\")\n        \n        # Archive current Production models\n        for mv in client.search_model_versions(f\"name='{MODEL_NAME}'\"):\n            if mv.current_stage == \"Production\":\n                client.transition_model_version_stage(\n                    name=MODEL_NAME,\n                    version=mv.version,\n                    stage=\"Archived\"\n                )\n\n        # Promote new model to Production\n        client.transition_model_version_stage(\n            name=MODEL_NAME,\n            version=latest_version,\n            stage=\"Production\"\n        )\n    else:\n        logger.warning(f\"Model version {latest_version} failed validation (Accuracy: {accuracy:.4f} \u003C {ACCURACY_THRESHOLD}).\")\n\nif __name__ == \"__main__\":\n    promote_latest_model()\n```\n\n---\n\n## 6. Serving MLflow Models via FastAPI (`serve_fastapi.py`)\n\n```python\nfrom fastapi import FastAPI, HTTPException\nfrom pydantic import BaseModel\nimport pandas as pd\nimport mlflow.pyfunc\nimport os\n\napp = FastAPI(title=\"MLflow Model Serving API\", version=\"1.0.0\")\n\n# Load model from MLflow Registry on startup\nMODEL_URI = os.getenv(\"MODEL_URI\", \"models:\u002FCustomerChurnClassifier\u002FProduction\")\nmodel = None\n\n@app.on_event(\"startup\")\ndef load_model():\n    global model\n    mlflow.set_tracking_uri(os.getenv(\"MLFLOW_TRACKING_URI\", \"http:\u002F\u002Flocalhost:5000\"))\n    model = mlflow.pyfunc.load_model(MODEL_URI)\n\nclass InferenceRequest(BaseModel):\n    features: list[dict]\n\n@app.post(\"\u002Fpredict\")\ndef predict(request: InferenceRequest):\n    if not model:\n        raise HTTPException(status_code=500, detail=\"Model not initialized\")\n    \n    df = pd.DataFrame(request.features)\n    predictions = model.predict(df)\n    return {\"predictions\": predictions.tolist()}\n```\n\n---\n\n## 7. MLOps Best Practices Checklist\n\n1. **Artifact Store Isolation**: Store artifacts in dedicated cloud bucket prefixes per environment (`s3:\u002F\u002Fmy-ml-artifacts-prod\u002F`).\n2. **Model Signatures**: Always log explicit inputs and outputs signatures using `mlflow.models.signature.infer_signature`.\n3. **Environment Lock**: Log `conda.yaml` or `requirements.txt` environment locks alongside models to guarantee reproducible containerized deployments.\n4. **Deterministic Run Names**: Set clear, human-readable run names (`mlflow.start_run(run_name=\"xgboost_baseline_v1\")`) instead of relying on default UUID strings.\n",{"name":5,"metadata":24,"description":7,"compatibility":26},{"category":25},"Machine Learning Operations (MLOps)","Python (>= 3.9), MLflow (>= 2.8.0), scikit-learn \u002F PyTorch \u002F TensorFlow, PostgreSQL \u002F S3 \u002F GCS","main","e905af21e5f1e1c3ca605e9656c3a7930360a84e","Programming\u002FAI_Engineering_and_Platforms\u002FMLOps_and_Lifecycle\u002Fmlflow-mlops-pipeline",1,"https:\u002F\u002Fgithub.com\u002Fhamzabellouch\u002Fagent-skills","https:\u002F\u002Fhamzabellouch.github.io\u002F","https:\u002F\u002Fgithub.com\u002Fhamzabellouch","hamzabellouch.github.io","CEO & Founder of @tknoglobal | Researcher in Technology & Applied Sciences.","2026-10-17 03:20:19",{"source":8,"skillName":5,"commands":38,"prompt":48,"zipAvailable":49},[39,42,45],{"tool":40,"command":41},"npx","npx skills add hamzabellouch\u002Fagent-skills --skill mlflow-mlops-pipeline",{"tool":43,"command":44},"bunx","bunx skills add hamzabellouch\u002Fagent-skills --skill mlflow-mlops-pipeline",{"tool":46,"command":47},"pnpm","pnpm dlx skills add hamzabellouch\u002Fagent-skills --skill mlflow-mlops-pipeline","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fhamzabellouch\u002Fagent-skills\u002Fblob\u002Fmain\u002FProgramming\u002FAI_Engineering_and_Platforms\u002FMLOps_and_Lifecycle\u002Fmlflow-mlops-pipeline\u002FSKILL.md",true,[],[52,59,66,73,80,87],{"skillNo":53,"name":54,"nameZh":6,"description":55,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":56,"categories":57,"keywords":58,"publishedAt":19},"01M79FHH2H815A9TAP6WNKH4Q8","security-audit","Comprehensive security guidance, source code audit, vulnerability assessment, and penetration test review for codebases, APIs, microservices, CLI tools, libraries, and LLM-backed applications. Triggers on requests to audit a codebase, conduct security reviews, find vulnerabilities or flaws, pen-test source code, or when the user asks in Arabic (فحص أمني، تدقيق الكود أمنياً، مراجعة الثغرات، فحص أمان المشروع). Supports Guidance mode (focused review) and Full Audit mode (deterministic 6-phase harness).","https:\u002F\u002Fgithub.com\u002Fhamzabellouch\u002Fagent-skills\u002Fblob\u002Fmain\u002FSecurity\u002FSecurity_Audit_and_Code_Review\u002Fsecurity-audit\u002FSKILL.md",[],[],{"skillNo":60,"name":61,"nameZh":6,"description":62,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":65,"publishedAt":19},"01M79FHBGXVBY6VQ1X7ETAZMF1","malware-analysis-reversing","Production malware analysis workflows, reverse engineering methodologies, isolated sandbox triage, static\u002Fdynamic binary analysis, memory forensics, and YARA detection rule authoring.","https:\u002F\u002Fgithub.com\u002Fhamzabellouch\u002Fagent-skills\u002Fblob\u002Fmain\u002FSecurity\u002FOffensive_Security_and_Pentesting\u002Fmalware-analysis-reversing\u002FSKILL.md",[],[],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":19},"01M79FH6EACDR801TZCE4R8SAC","application-security-pentesting","Production Application Security (AppSec) standards, OWASP Top 10 vulnerability remediation, SAST\u002FDAST pipeline integration, secure code review, threat modeling, and defensive security posture.","https:\u002F\u002Fgithub.com\u002Fhamzabellouch\u002Fagent-skills\u002Fblob\u002Fmain\u002FSecurity\u002FOffensive_Security_and_Pentesting\u002Fapplication-security-pentesting\u002FSKILL.md",[],[],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":19},"01M79FH0VKVT44FK923K520ZQA","oauth2-oidc-security-flows","Implement enterprise OAuth 2.1 and OpenID Connect (OIDC) authorization code flow with Proof Key for Code Exchange (PKCE), state and nonce verification, refresh token rotation, token revocation, and centralized IdP federation (Keycloak, Auth0, Okta). Trigger when building secure authentication, single sign-on (SSO), or third-party delegated authorization.","https:\u002F\u002Fgithub.com\u002Fhamzabellouch\u002Fagent-skills\u002Fblob\u002Fmain\u002FSecurity\u002FIdentity_and_Access_Management_IAM\u002Foauth2-oidc-security-flows\u002FSKILL.md",[],[],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":19},"01M79FGVVB3R4T88XXD8FRSV5B","jwt-session-management-hardening","Harden JWT-based authentication and session lifecycles using asymmetric signing (RS256\u002FEdDSA), JWKS rotation, strict claims validation, Redis-backed sliding window sessions, revocation lists, and secure HttpOnly cookie storage. Trigger when implementing token validation, session revocation, or hardening API authentication.","https:\u002F\u002Fgithub.com\u002Fhamzabellouch\u002Fagent-skills\u002Fblob\u002Fmain\u002FSecurity\u002FIdentity_and_Access_Management_IAM\u002Fjwt-session-management-hardening\u002FSKILL.md",[],[],{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":93,"publishedAt":19},"01M79FGNCPZ85CVEY0B3NE4H3B","soc2-compliance-automation","Best practices for implementing SOC 2 Type II compliance controls, continuous evidence collection, infrastructure policy-as-code, and automated security monitoring. Use when automating Trust Services Criteria (Security, Availability, Confidentiality, Processing Integrity, Privacy), audit logging, IAM least privilege, or CI\u002FCD security gates.","https:\u002F\u002Fgithub.com\u002Fhamzabellouch\u002Fagent-skills\u002Fblob\u002Fmain\u002FSecurity\u002FGovernance_Compliance_and_Legal_Tech\u002Fsoc2-compliance-automation\u002FSKILL.md",[],[]]