开源项目mlops-course使用教程:从实验到生产的完整MLOps实践指南
概述
MLOps(机器学习运维)是现代机器学习项目从开发到生产部署的关键实践。mlops-course项目是一个全面的开源课程,旨在教会开发者如何将机器学习与软件工程相结合,设计、开发、部署和迭代生产级的机器学习应用。
本教程将带你深入了解如何使用mlops-course项目,从环境设置到生产部署,掌握完整的MLOps工作流程。
项目架构与核心组件
mlops-course项目采用模块化设计,包含以下核心组件:
代码结构
madewithml/
├── config.py # 配置管理
├── data.py # 数据加载与预处理
├── evaluate.py # 模型评估
├── models.py # 模型定义
├── predict.py # 预测推理
├── serve.py # 模型服务
├── train.py # 模型训练
├── tune.py # 超参数调优
└── utils.py # 工具函数
技术栈
- Ray: 分布式计算框架
- PyTorch: 深度学习框架
- MLflow: 实验跟踪与管理
- FastAPI: Web服务框架
- Anyscale: 云原生ML平台
环境设置与安装
本地环境配置
# 克隆项目仓库
git clone https://gitcode.com/gh_mirrors/ml/mlops-course
cd mlops-course
# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate
# 安装依赖
pip install --upgrade pip setuptools wheel
pip install -r requirements.txt
# 设置Python路径
export PYTHONPATH=$PYTHONPATH:$PWD
Anyscale云环境配置
对于生产环境,推荐使用Anyscale Workspace:
# 创建工作空间
anyscale workspace create --name madewithml --project madewithml
# 配置集群环境
anyscale cluster-env build deploy/cluster_env.yaml --name madewithml-cluster-env
# 配置计算资源
anyscale cluster-compute create deploy/cluster_compute.yaml --name madewithml-cluster-compute
数据准备与探索
数据集结构
项目使用多标签文本分类数据集,包含以下字段:
| 字段名 | 类型 | 描述 |
|---|---|---|
| id | int | 项目唯一标识 |
| created_on | datetime | 创建时间 |
| title | string | 项目标题 |
| description | string | 项目描述 |
| tag | string | 分类标签 |
数据分布分析
import pandas as pd
from collections import Counter
# 加载数据
DATASET_LOC = "https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/dataset.csv"
df = pd.read_csv(DATASET_LOC)
# 标签分布分析
tag_distribution = Counter(df.tag)
print("标签分布:", tag_distribution.most_common())
输出结果:
标签分布: [
('natural-language-processing', 310),
('computer-vision', 285),
('other', 106),
('mlops', 63)
]
数据预处理流程
模型训练与调优
基础训练配置
# 设置环境变量
export EXPERIMENT_NAME="llm"
export DATASET_LOC="https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/dataset.csv"
export TRAIN_LOOP_CONFIG='{"dropout_p": 0.5, "lr": 1e-4, "lr_factor": 0.8, "lr_patience": 3}'
# 启动训练任务
python madewithml/train.py \
--experiment-name "$EXPERIMENT_NAME" \
--dataset-loc "$DATASET_LOC" \
--train-loop-config "$TRAIN_LOOP_CONFIG" \
--num-workers 1 \
--cpu-per-worker 3 \
--gpu-per-worker 1 \
--num-epochs 10 \
--batch-size 256 \
--results-fp results/training_results.json
超参数调优
# 超参数搜索配置
export INITIAL_PARAMS="[{\"train_loop_config\": $TRAIN_LOOP_CONFIG}]"
# 启动调优任务
python madewithml/tune.py \
--experiment-name "$EXPERIMENT_NAME" \
--dataset-loc "$DATASET_LOC" \
--initial-params "$INITIAL_PARAMS" \
--num-runs 2 \
--num-workers 1 \
--cpu-per-worker 3 \
--gpu-per-worker 1 \
--num-epochs 10 \
--batch-size 256 \
--results-fp results/tuning_results.json
训练监控指标
| 指标名称 | 描述 | 优化方向 |
|---|---|---|
| train_loss | 训练损失 | 最小化 |
| val_loss | 验证损失 | 最小化 |
| val_accuracy | 验证准确率 | 最大化 |
| learning_rate | 学习率 | 自适应调整 |
实验跟踪与管理
MLflow集成配置
# 启动MLflow跟踪服务器
export MODEL_REGISTRY=$(python -c "from madewithml import config; print(config.MODEL_REGISTRY)")
mlflow server -h 0.0.0.0 -p 8080 --backend-store-uri $MODEL_REGISTRY
实验跟踪功能对比
| 功能 | MLflow | Weights & Biases | Comet |
|---|---|---|---|
| 实验跟踪 | ✅ | ✅ | ✅ |
| 模型注册 | ✅ | ✅ | ✅ |
| artifact存储 | ✅ | ✅ | ✅ |
| 超参数比较 | ✅ | ✅ | ✅ |
| 可视化分析 | ✅ | ✅ | ✅ |
| 协作功能 | ⚠️ | ✅ | ✅ |
模型评估与验证
性能评估流程
# 获取最佳模型运行ID
export RUN_ID=$(python madewithml/predict.py get-best-run-id \
--experiment-name $EXPERIMENT_NAME \
--metric val_loss \
--mode ASC)
# 执行模型评估
export HOLDOUT_LOC="https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/holdout.csv"
python madewithml/evaluate.py \
--run-id $RUN_ID \
--dataset-loc $HOLDOUT_LOC \
--results-fp results/evaluation_results.json
评估指标体系
评估结果示例:
{
"timestamp": "2023-06-09 09:26:18",
"run_id": "6149e3fec8d24f1492d4a4cabd5c06f6",
"overall": {
"precision": 0.9076,
"recall": 0.9058,
"f1": 0.9047,
"num_samples": 191.0
},
"per_class": {
"computer-vision": {
"precision": 0.9231,
"recall": 0.8571,
"f1": 0.8889
},
# ... 其他类别指标
}
}
模型部署与服务
本地服务部署
# 启动Ray服务
ray start --head
# 部署模型服务
python madewithml/serve.py --run_id $RUN_ID
API接口说明
预测接口
curl -X POST -H "Content-Type: application/json" -d '{
"title": "Transfer learning with transformers",
"description": "Using transformers for transfer learning on text classification tasks."
}' http://127.0.0.1:8000/predict
评估接口
curl -X POST -H "Content-Type: application/json" -d '{
"dataset_loc": "https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/holdout.csv"
}' http://127.0.0.1:8000/evaluate
生产环境部署
# deploy/services/serve_model.yaml
ray_serve_config:
import_path: deploy.services.serve_model:entrypoint
runtime_env:
working_dir: .
upload_path: s3://madewithml/$GITHUB_USERNAME/services
env_vars:
GITHUB_USERNAME: $GITHUB_USERNAME
持续集成与交付(CI/CD)
GitHub Actions工作流
name: MLOps Workflows
on:
push:
branches: [ dev ]
pull_request:
branches: [ main ]
jobs:
train-and-evaluate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run training and evaluation
run: |
python madewithml/train.py --experiment-name "ci-cd" --dataset-loc $DATASET_LOC
CI/CD流水线架构
测试策略与质量保障
代码测试
# 运行代码测试
python3 -m pytest tests/code --verbose --disable-warnings
# 数据测试
export DATASET_LOC="https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/dataset.csv"
pytest --dataset-loc=$DATASET_LOC tests/data --verbose --disable-warnings
# 模型测试
pytest --run-id=$RUN_ID tests/model --verbose --disable-warnings
# 覆盖率测试
python3 -m pytest --cov madewithml --cov-report html
测试金字塔结构
监控与维护
性能监控指标
| 监控类别 | 具体指标 | 告警阈值 |
|---|---|---|
| 服务可用性 | 响应时间 | > 500ms |
| 资源使用 | CPU使用率 | > 80% |
| 资源使用 | 内存使用率 | > 85% |
| 模型性能 | 预测准确率 | < 85% |
| 数据质量 | 输入数据分布偏移 | > 10% |
日志与追踪
import logging
import mlflow
# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# 记录实验信息
with mlflow.start_run():
mlflow.log_param("learning_rate", 0.01)
mlflow.log_metric("accuracy", 0.85)
mlflow.log_artifact("model.pkl")
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



