1、课程导论与基础环境准备:模型部署流水线概念、为什么需要自动化、环境搭建(Docker、Python、Git)
1.1 模型部署流水线到底是什么?
先聊聊概念。模型部署流水线,说白了就是把训练好的模型从实验室搬到生产环境的一套自动化流程。你想想看,以前我们训练完模型,是不是经常手动导出、手动拷贝、手动配置环境?嗯,这套流程一旦重复三次以上,人就容易出错。
我个人习惯把流水线拆成四个阶段:模型打包 → 环境构建 → 部署发布 → 监控反馈。每个阶段都有对应的工具和最佳实践。我在项目中遇到过最典型的场景是:模型在开发机上跑得好好的,一上生产环境就报错。为什么?环境不一致。流水线要解决的就是这个痛点。
核心要点:流水线不是花架子,它是用来保证「开发环境能跑,生产环境也能跑」的工程化手段。
1.2 为什么需要自动化?
这个问题我经常被问到。有人觉得手动部署也挺好,反正模型更新不频繁。但实际情况是——手动部署是事故的温床。
我曾经因为手动部署漏了一个依赖包,导致线上服务挂了整整两个小时。那次之后,我彻底转向了自动化流水线。原因有三:
- 可重复性:自动化流程每次执行结果一致,不会因为操作者不同而出现偏差
- 可追溯:每次部署都有日志,出了问题能快速定位是哪个环节
- 效率提升:一次配置,多次使用。模型更新后,一键触发整个流程
你想想看,如果模型每天都要更新,手动部署得配多少人?自动化之后,一个人就能管理几十个模型的发布周期。
我的建议:刚开始别追求大而全的自动化。先把最痛的点自动化掉,比如环境构建和模型打包。剩下的慢慢补。
1.3 环境搭建:Docker、Python、Git
好,理论说完了,咱们动手。环境搭建是流水线的地基,地基不稳,后面全白搭。我习惯按这个顺序来:Docker → Python → Git。
1.3.1 Docker:环境一致性的救星
Docker 解决的是「在我机器上能跑」的问题。说白了,它把整个运行环境打包成一个镜像,走到哪都能跑。
安装 Docker 其实很简单。我建议用官方脚本,省心:
# Ubuntu/Debian 系统
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# 验证安装
docker --version
# 输出示例:Docker version 24.0.7, build afdd53b
安装完成后,记得把当前用户加入 docker 组,不然每次都要 sudo:
sudo usermod -aG docker $USER
# 退出重新登录,或者执行 newgrp docker 生效
注意:我曾经遇到过 Docker 安装后无法启动的情况,多半是因为 WSL2 或内核模块没配置好。Ubuntu 用户记得先升级内核:sudo apt update && sudo apt upgrade -y
1.3.2 Python:模型部署的主力语言
Python 版本管理是个坑。我见过太多人因为系统自带的 Python 版本太低,导致依赖冲突。我的做法是用 pyenv 管理多版本 Python。
安装 pyenv:
# 安装依赖
sudo apt update
sudo apt install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
# 安装 pyenv
curl https://pyenv.run | bash
# 配置环境变量(加到 ~/.bashrc 或 ~/.zshrc)
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
# 重新加载配置
source ~/.bashrc
# 安装 Python 3.10(模型部署常用版本)
pyenv install 3.10.12
pyenv global 3.10.12
# 验证
python --version
# 输出:Python 3.10.12
我个人习惯用 pipenv 或 poetry 管理项目依赖,而不是直接用 pip。为什么?因为 pip 的依赖解析太弱了,经常出现版本冲突。poetry 的 lock 文件能保证团队环境一致。
# 安装 poetry
curl -sSL https://install.python-poetry.org | python3 -
# 初始化项目
poetry new my-ml-project
cd my-ml-project
poetry add torch torchvision flask
1.3.3 Git:版本控制的基石
Git 不用多说了吧?但我要强调一点:模型文件也要纳入版本控制。很多人只把代码放 Git,模型文件用网盘传,结果版本对不上,出了事查都查不了。
我的做法是用 Git LFS(Large File Storage)管理大模型文件:
# 安装 Git LFS
sudo apt install git-lfs
git lfs install
# 在项目中跟踪模型文件
git lfs track "*.pt"
git lfs track "*.h5"
git lfs track "*.pth"
# 正常提交即可
git add .gitattributes
git add model.pt
git commit -m "add model with LFS"
git push
避坑指南:我曾经因为没加 .gitignore,把几百 MB 的虚拟环境目录也提交了。建议项目根目录下放一个 .gitignore,至少忽略 __pycache__/、.venv/、*.egg-info/。
1.4 环境验证:跑一个最小示例
环境搭好了,得验证一下能不能用。我习惯写一个极简的 Flask 服务,加载一个虚拟模型,看看整个链路通不通。
# app.py
from flask import Flask, request, jsonify
import torch
import torch.nn as nn
# 定义一个虚拟模型
class DummyModel(nn.Module):
def __init__(self):
super().__init__()
self.fc = nn.Linear(10, 2)
def forward(self, x):
return self.fc(x)
app = Flask(__name__)
model = DummyModel()
model.eval()
@app.route('/predict', methods=['POST'])
def predict():
data = request.json
input_tensor = torch.tensor(data['features'], dtype=torch.float32)
with torch.no_grad():
output = model(input_tensor)
return jsonify({'prediction': output.tolist()})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
用 Docker 跑起来:
# Dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
# 构建并运行
docker build -t ml-deploy-demo .
docker run -p 5000:5000 ml-deploy-demo
测试一下:
curl -X POST http://localhost:5000/predict \
-H "Content-Type: application/json" \
-d '{"features": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]}'
# 返回示例
{"prediction": [[0.123, -0.456]]}
验证通过的标准:Docker 容器能正常启动,API 能返回预测结果。这就说明你的环境搭建是成功的。
1.5 本章小结
这一章我们做了三件事:理解了流水线的概念和必要性,搭建了 Docker、Python、Git 三大基础工具,最后跑通了一个最小示例。嗯,地基已经打好了。
下一章我们会深入流水线的第一个环节——模型打包与版本管理。到时候我会分享一些我在实际项目中踩过的坑,比如模型序列化格式的选择、元数据管理等等。
记住一句话:自动化不是目的,稳定可靠才是。环境搭好了,后面的事就顺了。