🚀 MLOps实战训练营

学习进度

阶段 1-2: 环境搭建 → 首次MLflow实验

目标: 从0到30%信心值 🎯

📅 第1阶段:环境预备

🎯 为什么这样做?

MLOps环境复杂,依赖众多。一键脚本可以避免手动安装时的版本冲突和遗漏。

⚠️ 常见问题预警

如果脚本执行中断,不要慌!查看具体错误信息,大部分问题都有标准解决方案。

系统初始化脚本

💡 所有代码块默认收起,点击标题栏可展开查看完整代码,支持一键复制
🐧 ubuntu_mlops_setup.sh
#!/bin/bash
# Ubuntu 24.04 MLOps环境一键部署脚本(经过完整验证)
set -e  # 遇到错误立即停止

echo "🚀 Ubuntu 24.04 MLOps环境部署开始..."
echo "📋 预计用时:15-20分钟(取决于网络速度)"

# 错误处理函数
error_handler() {
    echo "❌ 脚本在第 $1 行执行失败"
    echo "💡 请检查错误信息,常见解决方案:"
    echo "   1. 网络问题:重新运行脚本"
    echo "   2. 权限问题:确保有sudo权限"
    echo "   3. 磁盘空间:确保至少有5GB可用空间"
    exit 1
}
trap 'error_handler $LINENO' ERR

# 1. 系统更新(24.04首次必做)
echo "🔄 步骤1/9: 系统更新..."
sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y
echo "✅ 系统更新完成"

# 2. 安装开发依赖(24.04 Python 3.12需要)
sudo apt install -y \
    software-properties-common \
    build-essential \
    python3-dev \
    python3-pip \
    python3-venv \
    git \
    curl \
    wget \
    vim \
    htop \
    tree \
    jq \
    unzip

# 3. 创建专用虚拟环境(24.04推荐隔离)
python3 -m venv ~/mlops-env
source ~/mlops-env/bin/activate

# 4. 升级核心工具(避免24.04兼容问题)
pip install --upgrade pip setuptools wheel

# 5. 安装MLOps核心包(经过完整验证的版本)
pip install \
    mlflow==2.11.1 \
    dvc[s3]==3.48.4 \
    prefect==2.16.1 \
    bentoml==1.2.5 \
    scikit-learn==1.5.2 \
    pandas==2.2.2 \
    numpy==1.26.4 \
    matplotlib==3.8.3 \
    seaborn==0.13.2 \
    jupyter==1.0.0 \
    click==8.1.7 \
    joblib==1.4.2 \
    flask==3.1.1 \
    psutil==7.0.0

# 6. 安装PyTorch(CPU版,适合学习)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
# 安装griffe包
pip install griffe
pip uninstall prefect -y
pip install --upgrade prefect

# 7. Docker安装(24.04官方方法)
# 清理旧版本
sudo apt remove -y docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc

# 添加Docker官方源
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 8. 配置Docker权限和优化
sudo usermod -aG docker $USER
sudo systemctl enable docker

# Docker daemon优化配置(24.04性能调优)
sudo mkdir -p /etc/docker
sudo cat > /etc/docker/daemon.json << EOF
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "storage-driver": "overlay2",
  "exec-opts": ["native.cgroupdriver=systemd"],
  "features": {
    "buildkit": true
  }
}
EOF

sudo systemctl restart docker

# 9. 安装Kubernetes工具
# Kind(24.04兼容版本)
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-amd64
chmod +x ./kind && sudo mv ./kind /usr/local/bin/kind

# kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

# 10. 创建项目结构
mkdir -p ~/mlops-project/{data/{raw,processed},models,src,notebooks,configs,docker,k8s,scripts,logs}
cd ~/mlops-project

# 11. 配置环境变量(24.04优化)
cat >> ~/.bashrc << EOF

# MLOps环境配置
export MLOPS_HOME=~/mlops-project
export PYTHONPATH=\$MLOPS_HOME/src:\$PYTHONPATH
source ~/mlops-env/bin/activate

# Docker优化
export DOCKER_BUILDKIT=1
export COMPOSE_DOCKER_CLI_BUILD=1

# Python 3.12优化
export PYTHONHASHSEED=0
export TOKENIZERS_PARALLELISM=false
EOF

# 12. 下载测试数据集
cd ~/mlops-project
python3 << 'EOF'
from sklearn.datasets import fetch_california_housing
import pandas as pd
import os

os.makedirs('data/raw', exist_ok=True)
data = fetch_california_housing(as_frame=True)
data.frame.to_csv('data/raw/california_housing.csv', index=False)
print(f"✅ 数据集下载完成: {data.frame.shape}")
EOF

# 13. 初始化Git仓库
git init
cat > .gitignore << EOF
__pycache__/
*.pyc
*.pyo
*.pyd
.Python
env/
venv/
mlops-env/
.venv/
.env
.DS_Store
.vscode/
.idea/
*.log
*.sqlite
mlruns/
.dvc/cache/
models/*.pkl
*.tmp
node_modules/
EOF

git add .
git config --global user.name "MLOps Student"
git config --global user.email "mlops@example.com"
git commit -m "Initial MLOps project setup on Ubuntu 24.04"

echo ""
echo "🎉 Ubuntu 24.04 MLOps环境部署完成!"
echo ""
echo "验证命令:"
echo "source ~/.bashrc"
echo "python --version"
echo "docker --version" 
echo "kind --version"
echo "kubectl version --client"
echo ""
echo "⚠️  请重新登录或运行 'source ~/.bashrc' 使配置生效"
echo "然后执行验证命令确认环境正常"

📅 第2阶段:第一个MLflow实验(感受成功)

🎯 为什么从MLflow开始?

MLflow是MLOps的核心工具,它让实验变得可追踪、可复现。在实际工作中,你经常需要向领导展示"这个模型为什么比上一版本好",MLflow就是你的答案。

新手常见问题及解决方案

问题1:mlflow: command not found
  • 原因:虚拟环境未激活或MLflow未安装
  • 解决:source ~/mlops-env/bin/activate && pip install mlflow==2.11.1
  • 举一反三:所有工具都要在正确环境中运行,这是MLOps的基础
问题2:端口5000被占用
  • 原因:macOS的AirPlay默认占用5000端口
  • 解决:mlflow ui --port 5001 或关闭AirPlay接收
  • 举一反三:生产环境中端口冲突很常见,要学会灵活调整

上午:理解并运行

🐍 src/day1_quickstart.py
"""
Day 1: 第一个MLflow实验
目标:让你看到MLflow UI中的第一个实验记录
"""

import mlflow
import mlflow.sklearn
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import pandas as pd
import numpy as np
from datetime import datetime

def load_data():
    """加载并预处理数据"""
    print("📊 加载数据...")
    df = pd.read_csv('data/raw/california_housing.csv')
    
    # 基本信息
    print(f"数据集形状: {df.shape}")
    print(f"特征列: {list(df.columns[:-1])}")
    print(f"目标列: {df.columns[-1]}")
    
    # 分离特征和目标
    X = df.drop('MedHouseVal', axis=1)
    y = df['MedHouseVal']
    
    return X, y

def run_baseline_experiment():
    """运行基线实验"""
    # 加载数据
    X, y = load_data()
    
    # 分割数据
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=42
    )
    
    # 设置MLflow实验
    mlflow.set_experiment("day1-baseline-experiment")
    
    # 开始MLflow运行
    with mlflow.start_run(run_name=f"baseline-{datetime.now().strftime('%Y%m%d-%H%M%S')}"):
        print("🚀 开始训练基线模型...")
        
        # 训练模型
        model = LinearRegression()
        model.fit(X_train, y_train)
        
        # 预测
        train_pred = model.predict(X_train)
        test_pred = model.predict(X_test)
        
        # 计算指标
        train_mse = mean_squared_error(y_train, train_pred)
        test_mse = mean_squared_error(y_test, test_pred)
        train_r2 = r2_score(y_train, train_pred)
        test_r2 = r2_score(y_test, test_pred)
        
        # 记录参数
        mlflow.log_param("model_type", "LinearRegression")
        mlflow.log_param("test_size", 0.2)
        mlflow.log_param("random_state", 42)
        mlflow.log_param("n_features", X_train.shape[1])
        mlflow.log_param("n_samples", X_train.shape[0])
        
        # 记录指标
        mlflow.log_metric("train_mse", train_mse)
        mlflow.log_metric("test_mse", test_mse)
        mlflow.log_metric("train_r2", train_r2)
        mlflow.log_metric("test_r2", test_r2)
        
        # 记录模型
        mlflow.sklearn.log_model(
            model, 
            "model",
            registered_model_name="baseline_house_price_model"
        )
        
        # 记录数据集信息
        mlflow.log_dict({
            "dataset_info": {
                "shape": list(X.shape),
                "features": list(X.columns),
                "target": "MedHouseVal"
            }
        }, "dataset_info.json")
        
        print("✅ 模型训练完成!")
        print(f"训练MSE: {train_mse:.4f}")
        print(f"测试MSE: {test_mse:.4f}")
        print(f"测试R²: {test_r2:.4f}")
        
        return model, test_mse, test_r2

if __name__ == "__main__":
    print("🎯 Day 1: 第一个MLflow实验")
    print("=" * 50)
    
    # 运行实验
    model, mse, r2 = run_baseline_experiment()
    
    print("\n🎉 Day 1 完成!")
    print(f"🔥 基线模型性能: MSE={mse:.4f}, R²={r2:.4f}")
    print("\n下一步:")
    print("1. 运行: mlflow ui")
    print("2. 浏览器打开: http://localhost:5000")
    print("3. 查看你的第一个实验记录!")

晚上:查看结果+Git提交

🔧 运行命令
# 运行第一个实验
cd ~/mlops-project
python src/day1_quickstart.py

# 启动MLflow UI(新终端)
nohup mlflow ui --host 0.0.0.0 --port 5000 >> mlflow-ui.log 2>&1 &

# 如果是云服务器,需要开放端口
# sudo ufw allow 5000/tcp

# Git提交第一天成果
git add .
git commit -m "Day 1: First MLflow experiment with baseline model

- Created baseline linear regression model
- MSE: ~0.5, R²: ~0.6  
- MLflow tracking working properly
- Environment fully setup on Ubuntu 24.04"

🏆 阶段 1-2 成就解锁

  • MLflow UI显示第一个实验
  • 模型训练成功并记录指标
  • Git仓库开始追踪代码
  • 信心值:从0到30%

🚀 下一步预告

阶段 3: 将使用DVC构建数据版本管理系统,让数据处理流程变得可重现!

你将学会回答"这个模型是用哪版数据训练的?"这种关键问题,这在生产环境中是必需的能力。