{"id":"mlflow","name":"mlflow","summary":"MLflow(フレームワークに依存しないMLライフサイクルプラットフォーム)で、MLflowによるML実験の追跡、バージョン管理、モデルの本番展開、実験の再現","body":"# MLflow: ML Lifecycle Management Platform\n\n## When to Use This Skill\n\nUse MLflow when you need to:\n- **Track ML experiments** with parameters, metrics, and artifacts\n- **Manage model registry** with versioning and stage transitions\n- **Deploy models** to various platforms (local, cloud, serving)\n- **Reproduce experiments** with project configurations\n- **Compare model versions** and performance metrics\n- **Collaborate** on ML projects with team workflows\n- **Integrate** with any ML framework (framework-agnostic)\n\n**Users**: 20,000+ organizations | **GitHub Stars**: 23k+ | **License**: Apache 2.0\n\n## Installation\n\n```bash\n# Install MLflow\npip install mlflow\n\n# Install with extras\npip install mlflow[extras]  # Includes SQLAlchemy, boto3, etc.\n\n# Start MLflow UI\nmlflow ui\n\n# Access at http://localhost:5000\n```\n\n## Quick Start\n\n### Basic Tracking\n\n```python\nimport mlflow\n\n# Start a run\nwith mlflow.start_run():\n    # Log parameters\n    mlflow.log_param(\"learning_rate\", 0.001)\n    mlflow.log_param(\"batch_size\", 32)\n\n    # Your training code\n    model = train_model()\n\n    # Log metrics\n    mlflow.log_metric(\"train_loss\", 0.15)\n    mlflow.log_metric(\"val_accuracy\", 0.92)\n\n    # Log model\n    mlflow.sklearn.log_model(model, \"model\")\n```\n\n### Autologging (Automatic Tracking)\n\n```python\nimport mlflow\nfrom sklearn.ensemble import RandomForestClassifier\n\n# Enable autologging\nmlflow.autolog()\n\n# Train (automatically logged)\nmodel = RandomForestClassifier(n_estimators=100, max_depth=5)\nmodel.fit(X_train, y_train)\n\n# Metrics, parameters, and model logged automatically!\n```\n\n## Core Concepts\n\n### 1. Experiments and Runs\n\n**Experiment**: Logical container for related runs\n**Run**: Single execution of ML code (parameters, metrics, artifacts)\n\n```python\nimport mlflow\n\n# Create/set experiment\nmlflow.set_experiment(\"my-experiment\")\n\n# Start a run\nwith mlflow.start_run(run_name=\"baseline-model\"):\n    # Log params\n    mlflow.log_param(\"model\", \"ResNet50\")\n    mlflow.log_param(\"epochs\", 10)\n\n    # Train\n    model = train()\n\n    # Log metrics\n    mlflow.log_metric(\"accuracy\", 0.95)\n\n    # Log model\n    mlflow.pytorch.log_model(model, \"model\")\n\n# Run ID is automatically generated\nprint(f\"Run ID: {mlflow.active_run().info.run_id}\")\n```\n\n### 2. Logging Parameters\n\n```python\nwith mlflow.start_run():\n    # Single parameter\n    mlflow.log_param(\"learning_rate\", 0.001)\n\n    # Multiple parameters\n    mlflow.log_params({\n        \"batch_size\": 32,\n        \"epochs\": 50,\n        \"optimizer\": \"Adam\",\n        \"dropout\": 0.2\n    })\n\n    # Nested parameters (as dict)\n    config = {\n        \"model\": {\n            \"architecture\": \"ResNet50\",\n            \"pretrained\": True\n        },\n        \"training\": {\n            \"lr\": 0.001,\n            \"weight_decay\": 1e-4\n        }\n    }\n\n    # Log as JSON string or individual params\n    for key, value in config.items():\n        mlflow.log_param(key, str(value))\n```\n\n### 3. Logging Metrics\n\n```python\nwith mlflow.start_run():\n    # Training loop\n    for epoch in range(NUM_EPOCHS):\n        train_loss = train_epoch()\n        val_loss = validate()\n\n        # Log metrics at each step\n        mlflow.log_metric(\"train_loss\", train_loss, step=epoch)\n        mlflow.log_metric(\"val_loss\", val_loss, step=epoch)\n\n        # Log multiple metrics\n        mlflow.log_metrics({\n            \"train_accuracy\": train_acc,\n            \"val_accuracy\": val_acc\n        }, step=epoch)\n\n    # Log final metrics (no step)\n    mlflow.log_metric(\"final_accuracy\", final_acc)\n```\n\n### 4. Logging Artifacts\n\n```python\nwith mlflow.start_run():\n    # Log file\n    model.save('model.pkl')\n    mlflow.log_artifact('model.pkl')\n\n    # Log directory\n    os.makedirs('plots', exist_ok=True)\n    plt.savefig('plots/loss_curve.png')\n    mlflow.log_artifacts('plots')\n\n    # Log text\n    with open('config.txt', 'w') as f:\n        f.write(str(config))\n    mlflow.log_artifact('config.txt')\n\n    # Log dict as JSON\n    mlflow.log_dict({'config': config}, 'config.json')\n```\n\n### 5. Logging Models\n\n```python\n# PyTorch\nimport mlflow.pytorch\n\nwith mlflow.start_run():\n    model = train_pytorch_model()\n    mlflow.pytorch.log_model(model, \"model\")\n\n# Scikit-learn\nimport mlflow.sklearn\n\nwith mlflow.start_run():\n    model = train_sklearn_model()\n    mlflow.sklearn.log_model(model, \"model\")\n\n# Keras/TensorFlow\nimport mlflow.keras\n\nwith mlflow.start_run():\n    model = train_keras_model()\n    mlflow.keras.log_model(model, \"model\")\n\n# HuggingFace Transformers\nimport mlflow.transformers\n\nwith mlflow.start_run():\n    mlflow.transformers.log_model(\n        transformers_model={\n            \"model\": model,\n            \"tokenizer\": tokenizer\n        },\n        artifact_path=\"model\"\n    )\n```\n\n## Autologging\n\nAutomatically log metrics, parameters, and models for popular frameworks.\n\n### Enable Autologging\n\n```python\nimport mlflow\n\n# Enable for all supported frameworks\nmlflow.autolog()\n\n# Or enable for specific framework\nmlflow.sklearn.autolog()\nmlflow.pytorch.autolog()\nmlflow.keras.autolog()\nmlflow.xgboost.autolog()\n```\n\n### Autologging with Scikit-learn\n\n```python\nimport mlflow\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.model_selection import train_test_split\n\n# Enable autologging\nmlflow.sklearn.autolog()\n\n# Split data\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n\n# Train (automatically logs params, metrics, model)\nwith mlflow.start_run():\n    model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=42)\n    model.fit(X_train, y_train)\n\n    # Metrics like accuracy, f1_score logged automatically\n    # Model logged automatically\n    # Training duration logged\n```\n\n### Autologging with PyTorch Lightning\n\n```python\nimport mlflow\nimport pytorch_lightning as pl\n\n# Enable autologging\nmlflow.pytorch.autolog()\n\n# Train\nwith mlflow.start_run():\n    trainer = pl.Trainer(max_epochs=10)\n    trainer.fit(model, datamodule=dm)\n\n    # Hyperparameters logged\n    # Training metrics logged\n    # Best model checkpoint logged\n```\n\n## Model Registry\n\nManage model lifecycle with versioning and stage transitions.\n\n### Register Model\n\n```python\nimport mlflow\n\n# Log and register model\nwith mlflow.start_run():\n    model = train_model()\n\n    # Log model\n    mlflow.sklearn.log_model(\n        model,\n        \"model\",\n        registered_model_name=\"my-classifier\"  # Register immediately\n    )\n\n# Or register later\nrun_id = \"abc123\"\nmodel_uri = f\"runs:/{run_id}/model\"\nmlflow.register_model(model_uri, \"my-classifier\")\n```\n\n### Model Stages\n\nTransition models between stages: **None** → **Staging** → **Production** → **Archived**\n\n```python\nfrom mlflow.tracking import MlflowClient\n\nclient = MlflowClient()\n\n# Promote to staging\nclient.transition_model_version_stage(\n    name=\"my-classifier\",\n    version=3,\n    stage=\"Staging\"\n)\n\n# Promote to production\nclient.transition_model_version_stage(\n    name=\"my-classifier\",\n    version=3,\n    stage=\"Production\",\n    archive_existing_versions=True  # Archive old production versions\n)\n\n# Archive model\nclient.transition_model_version_stage(\n    name=\"my-classifier\",\n    version=2,\n    stage=\"Archived\"\n)\n```\n\n### Load Model from Registry\n\n```python\nimport mlflow.pyfunc\n\n# Load latest production model\nmodel = mlflow.pyfunc.load_model(\"models:/my-classifier/Production\")\n\n# Load specific version\nmodel = mlflow.pyfunc.load_model(\"models:/my-classifier/3\")\n\n# Load from staging\nmodel = mlflow.pyfunc.load_model(\"models:/my-classifier/Staging\")\n\n# Use model\npredictions = model.predict(X_test)\n```\n\n### Model Versioning\n\n```python\nclient = MlflowClient()\n\n# List all versions\nversions = client.search_model_versions(\"name='my-classifier'\")\n\nfor v in versions:\n    print(f\"Version {v.version}: {v.current_stage}\")\n\n# Get latest version by stage\nlatest_prod = client.get_latest_versions(\"my-classifier\", stages=[\"Production\"])\nlatest_staging = client.get_latest_versions(\"my-classifier\", stages=[\"Staging\"])\n\n# Get model version details\nversion_info = client.get_model_version(name=\"my-classifier\", version=\"3\")\nprint(f\"Run ID: {version_info.run_id}\")\nprint(f\"Stage: {version_info.current_stage}\")\nprint(f\"Tags: {version_info.tags}\")\n```\n\n### Model Annotations\n\n```python\nclient = MlflowClient()\n\n# Add description\nclient.update_model_version(\n    name=\"my-classifier\",\n    version=\"3\",\n    description=\"ResNet50 classifier trained on 1M images with 95% accuracy\"\n)\n\n# Add tags\nclient.set_model_version_tag(\n    name=\"my-classifier\",\n    version=\"3\",\n    key=\"validation_status\",\n    value=\"approved\"\n)\n\nclient.set_model_version_tag(\n    name=\"my-classifier\",\n    version=\"3\",\n    key=\"deployed_date\",\n    value=\"2025-01-15\"\n)\n```\n\n## Searching Runs\n\nFind runs programmatically.\n\n```python\nfrom mlflow.tracking import MlflowClient\n\nclient = MlflowClient()\n\n# Search all runs in experiment\nexperiment_id = client.get_experiment_by_name(\"my-experiment\").experiment_id\nruns = client.search_runs(\n    experiment_ids=[experiment_id],\n    filter_string=\"metrics.accuracy > 0.9\",\n    order_by=[\"metrics.accuracy DESC\"],\n    max_results=10\n)\n\nfor run in runs:\n    print(f\"Run ID: {run.info.run_id}\")\n    print(f\"Accuracy: {run.data.metrics['accuracy']}\")\n    print(f\"Params: {run.data.params}\")\n\n# Search with complex filters\nruns = client.search_runs(\n    experiment_ids=[experiment_id],\n    filter_string=\"\"\"\n        metrics.accuracy > 0.9 AND\n        params.model = 'ResNet50' AND\n        tags.dataset = 'ImageNet'\n    \"\"\",\n    order_by=[\"metrics.f1_score DESC\"]\n)\n```\n\n## Integration Examples\n\n### PyTorch\n\n```python\nimport mlflow\nimport torch\nimport torch.nn as nn\n\n# Enable autologging\nmlflow.pytorch.autolog()\n\nwith mlflow.start_run():\n    # Log config\n    config = {\n        \"lr\": 0.001,\n        \"epochs\": 10,\n        \"batch_size\": 32\n    }\n    mlflow.log_params(config)\n\n    # Train\n    model = create_model()\n    optimizer = torch.optim.Adam(model.parameters(), lr=config[\"lr\"])\n\n    for epoch in range(config[\"epochs\"]):\n        train_loss = train_epoch(model, optimizer, train_loader)\n        val_loss, val_acc = validate(model, val_loader)\n\n        # Log metrics\n        mlflow.log_metrics({\n            \"train_loss\": train_loss,\n            \"val_loss\": val_loss,\n            \"val_accuracy\": val_acc\n        }, step=epoch)\n\n    # Log model\n    mlflow.pytorch.log_model(model, \"model\")\n```\n\n### HuggingFace Transformers\n\n```python\nimport mlflow\nfrom transformers import Trainer, TrainingArguments\n\n# Enable autologging\nmlflow.transformers.autolog()\n\ntraining_args = TrainingArguments(\n    output_dir=\"./results\",\n    num_train_epochs=3,\n    per_device_train_batch_size=16,\n    evaluation_strategy=\"epoch\",\n    save_strategy=\"epoch\",\n    load_best_model_at_end=True\n)\n\n# Start MLflow run\nwith mlflow.start_run():\n    trainer = Trainer(\n        model=model,\n        args=training_args,\n        train_dataset=train_dataset,\n        eval_dataset=eval_dataset\n    )\n\n    # Train (automatically logged)\n    trainer.train()\n\n    # Log final model to registry\n    mlflow.transformers.log_model(\n        transformers_model={\n            \"model\": trainer.model,\n            \"tokenizer\": tokenizer\n        },\n        artifact_path=\"model\",\n        registered_model_name=\"hf-classifier\"\n    )\n```\n\n### XGBoost\n\n```python\nimport mlflow\nimport xgboost as xgb\n\n# Enable autologging\nmlflow.xgboost.autolog()\n\nwith mlflow.start_run():\n    dtrain = xgb.DMatrix(X_train, label=y_train)\n    dval = xgb.DMatrix(X_val, label=y_val)\n\n    params = {\n        'max_depth': 6,\n        'learning_rate': 0.1,\n        'objective': 'binary:logistic',\n        'eval_metric': ['logloss', 'auc']\n    }\n\n    # Train (automatically logged)\n    model = xgb.train(\n        params,\n        dtrain,\n        num_boost_round=100,\n        evals=[(dtrain, 'train'), (dval, 'val')],\n        early_stopping_rounds=10\n    )\n\n    # Model and metrics logged automatically\n```\n\n## Best Practices\n\n### 1. Organize with Experiments\n\n```python\n# ✅ Good: Separate experiments for different tasks\nmlflow.set_experiment(\"sentiment-analysis\")\nmlflow.set_experiment(\"image-classification\")\nmlflow.set_experiment(\"recommendation-system\")\n\n# ❌ Bad: Everything in one experiment\nmlflow.set_experiment(\"all-models\")\n```\n\n### 2. Use Descriptive Run Names\n\n```python\n# ✅ Good: Descriptive names\nwith mlflow.start_run(run_name=\"resnet50-imagenet-lr0.001-bs32\"):\n    train()\n\n# ❌ Bad: No name (auto-generated UUID)\nwith mlflow.start_run():\n    train()\n```\n\n### 3. Log Comprehensive Metadata\n\n```python\nwith mlflow.start_run():\n    # Log hyperparameters\n    mlflow.log_params({\n        \"learning_rate\": 0.001,\n        \"batch_size\": 32,\n        \"epochs\": 50\n    })\n\n    # Log system info\n    mlflow.set_tags({\n        \"dataset\": \"ImageNet\",\n        \"framework\": \"PyTorch 2.0\",\n        \"gpu\": \"A100\",\n        \"git_commit\": get_git_commit()\n    })\n\n    # Log data info\n    mlflow.log_param(\"train_samples\", len(train_dataset))\n    mlflow.log_param(\"val_samples\", len(val_dataset))\n```\n\n### 4. Track Model Lineage\n\n```python\n# Link runs to understand lineage\nwith mlflow.start_run(run_name=\"preprocessing\"):\n    data = preprocess()\n    mlflow.log_artifact(\"data.csv\")\n    preprocessing_run_id = mlflow.active_run().info.run_id\n\nwith mlflow.start_run(run_name=\"training\"):\n    # Reference parent run\n    mlflow.set_tag(\"preprocessing_run_id\", preprocessing_run_id)\n    model = train(data)\n```\n\n### 5. Use Model Registry for Deployment\n\n```python\n# ✅ Good: Use registry for production\nmodel_uri = \"models:/my-classifier/Production\"\nmodel = mlflow.pyfunc.load_model(model_uri)\n\n# ❌ Bad: Hard-code run IDs\nmodel_uri = \"runs:/abc123/model\"\nmodel = mlflow.pyfunc.load_model(model_uri)\n```\n\n## Deployment\n\n### Serve Model Locally\n\n```bash\n# Serve registered model\nmlflow models serve -m \"models:/my-classifier/Production\" -p 5001\n\n# Serve from run\nmlflow models serve -m \"runs:/<RUN_ID>/model\" -p 5001\n\n# Test endpoint\ncurl http://127.0.0.1:5001/invocations -H 'Content-Type: application/json' -d '{\n  \"inputs\": [[1.0, 2.0, 3.0, 4.0]]\n}'\n```\n\n### Deploy to Cloud\n\n```bash\n# Deploy to AWS SageMaker\nmlflow sagemaker deploy -m \"models:/my-classifier/Production\" --region-name us-west-2\n\n# Deploy to Azure ML\nmlflow azureml deploy -m \"models:/my-classifier/Production\"\n```\n\n## Configuration\n\n### Tracking Server\n\n```bash\n# Start tracking server with backend store\nmlflow server \\\n  --backend-store-uri postgresql://user:password@localhost/mlflow \\\n  --default-artifact-root s3://my-bucket/mlflow \\\n  --host 0.0.0.0 \\\n  --port 5000\n```\n\n### Client Configuration\n\n```python\nimport mlflow\n\n# Set tracking URI\nmlflow.set_tracking_uri(\"http://localhost:5000\")\n\n# Or use environment variable\n# export MLFLOW_TRACKING_URI=http://localhost:5000\n```\n\n## Resources\n\n- **Documentation**: https://mlflow.org/docs/latest\n- **GitHub**: https://github.com/mlflow/mlflow (23k+ stars)\n- **Examples**: https://github.com/mlflow/mlflow/tree/master/examples\n- **Community**: https://mlflow.org/community\n\n## See Also\n\n- `references/tracking.md` - Comprehensive tracking guide\n- `references/model-registry.md` - Model lifecycle management\n- `references/deployment.md` - Production deployment patterns","author":"@Orchestra-Research","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/Orchestra-Research/AI-Research-SKILLs/tree/main/13-mlops/mlflow","license":"MIT","category":"coding","lang":"en","tokens":3844,"stars":0,"calls30d":1,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[{"path":"references/deployment.md","size":16695,"sha256":"e3fbee780f5b8dddedadd53bbe3db490eb2611bea920ea52849e10262841539d"},{"path":"references/model-registry.md","size":17475,"sha256":"fdfdfb609e1fa3123c5948ecce3275eef8ce0b9437ca2e957bb22a6eb29372eb"},{"path":"references/tracking.md","size":14970,"sha256":"e2b63991f10bf208d8444791c62b0a83c049c37da0c5722e4124805dfb1ba405"}],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[],"scannedAt":"2026-08-22","hasScripts":false,"networkEndpoints":["kserve.github.io","mlflow.org"]}}