3. 环境搭建:Python、Docker、Kubernetes、CI/CD工具的安装与配置
核心原理:本地环境与云端环境的一致性鸿沟
AI工程与MLOps的落地,首先面临的是环境一致性问题。在本地开发时,Python解释器版本、CUDA驱动、依赖库版本都可能与生产环境不同。这种“在我机器上能跑”的困境,在AI项目中尤为致命——因为模型训练不仅依赖代码,还依赖底层硬件驱动、数学库(如cuDNN)和系统库。Docker通过镜像打包将应用及其依赖封装为不可变单元,解决了“代码能跑”的问题;Kubernetes则进一步解决“跑在哪里、如何调度、如何扩展”的问题;而CI/CD工具(如Jenkins、GitLab CI)将上述过程自动化,形成从代码提交到模型部署的流水线。
本章节的核心逻辑是:Python提供计算逻辑,Docker提供环境隔离,Kubernetes提供资源编排,CI/CD提供自动化粘合。四者缺一不可,共同构成MLOps的底层基础设施。
方法流程:从零搭建一套可用的MLOps基础环境
以下流程以Ubuntu 22.04 LTS为宿主机,逐步完成四层环境的安装与验证。每一步都附带关键命令,便于读者直接复制执行。
步骤1:Python环境安装与虚拟环境配置
# 安装Python 3.10及开发工具
sudo apt update
sudo apt install -y python3.10 python3.10-venv python3.10-dev python3-pip
# 创建项目虚拟环境
python3.10 -m venv ~/mlops_env
source ~/mlops_env/bin/activate
# 验证版本
python --version # 应输出 Python 3.10.x
pip --version # 应输出 pip 22.x
建议使用虚拟环境隔离不同项目的依赖,避免全局污染。对于深度学习项目,还需额外安装CUDA驱动和cuDNN,并验证PyTorch能否识别GPU:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
python -c "import torch; print(torch.cuda.is_available())" # 输出True表示GPU可用
步骤2:Docker安装与镜像配置
# 安装Docker Engine
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER # 将当前用户加入docker组
newgrp docker # 刷新用户组
# 验证安装
docker --version # Docker version 24.x
docker run hello-world # 测试容器运行
# 配置镜像加速(国内环境)
sudo tee /etc/docker/daemon.json <<'EOF'
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
sudo systemctl restart docker
对于AI项目,建议编写多阶段Dockerfile,将基础镜像、依赖安装和代码复制分离,减小最终镜像体积:
# Dockerfile 示例
FROM python:3.10-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --prefix=/install -r requirements.txt
FROM python:3.10-slim
COPY --from=builder /install /usr/local
COPY . /app
WORKDIR /app
CMD ["python", "train.py"]
步骤3:Kubernetes环境搭建(Minikube方案)
# 安装Minikube(适合本地开发)
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 启动集群(需先安装Docker驱动)
minikube start --driver=docker --cpus=4 --memory=8192
# 安装kubectl命令行工具
sudo apt install -y kubectl
# 验证集群状态
kubectl get nodes # 应显示一个Ready状态的节点
kubectl get pods -A # 查看系统组件运行状态
生产环境建议使用云托管的Kubernetes服务(如AKS、EKS、GKE),或使用kubeadm自行搭建多节点集群。Minikube仅用于本地开发和CI测试。
步骤4:CI/CD工具安装与流水线配置
以GitLab CI为例(因其与Git仓库天然集成,适合AI团队):
# 在项目根目录创建 .gitlab-ci.yml
stages:
- build
- test
- deploy
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
build_image:
stage: build
script:
- docker build -t $IMAGE_TAG .
- docker push $IMAGE_TAG
only:
- main
test_model:
stage: test
script:
- python -m pytest tests/
only:
- main
deploy_k8s:
stage: deploy
script:
- kubectl set image deployment/ml-app ml-app=$IMAGE_TAG
only:
- main
若选择Jenkins,则需额外安装Kubernetes插件和Docker Pipeline插件,并在系统配置中连接K8s集群凭据。
案例场景:一个典型的ML训练流水线环境
假设团队正在开发一个图像分类模型,需要每天自动训练并部署到测试环境。完整的环境配置如下表所示:
| 层级 | 工具/版本 | 配置要点 | 验证命令 |
|---|---|---|---|
| 代码层 | Python 3.10 + PyTorch 2.1 | 使用venv隔离,requirements.txt锁定版本 | python -c "import torch; print(torch.__version__)" |
| 环境层 | Docker 24 + CUDA 11.8镜像 | 基础镜像:nvidia/cuda:11.8-cudnn8-devel |
docker run --gpus all nvidia/cuda:11.8 nvidia-smi |
| 调度层 | Kubernetes 1.28 + GPU节点 | 安装NVIDIA Device Plugin,配置nvidia-docker | kubectl describe node | grep -A5 "Capacity" |
| 自动化层 | GitLab CI 16 + GitLab Runner | Runner使用Docker executor,挂载GPU | 流水线日志中查看GPU信息 |
该流水线的执行流程为:代码push到main分支 → GitLab CI触发 → 构建带GPU支持的Docker镜像 → 推送至私有仓库 → 在K8s集群中启动训练Job → 训练完成后自动评估指标 → 若准确率达标则更新部署。整个过程无需人工干预,环境完全一致。
误区与复盘:环境搭建中的常见陷阱
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
pip freeze > requirements.txt锁定精确版本,或使用Poetry管理依赖。对于深度学习项目,还需锁定CUDA和cuDNN版本,并在Dockerfile中明确标注。
docker commit或更新Dockerfile并推送新镜像,确保镜像版本与代码版本一一对应。建议在CI流水线中加入环境一致性检查步骤,对比本地与容器中的关键库版本。
环境搭建是MLOps的基石,但并非一次性工作。随着项目迭代,依赖升级、GPU驱动更新、K8s集群扩容都会带来新的挑战。建议团队将环境配置代码化(Infrastructure as Code),使用Terraform管理云资源,使用Ansible配置宿主机,使用Helm管理K8s应用,从而让环境像代码一样可版本控制、可审计、可回滚。只有将环境搭建纳入DevOps体系,才能真正实现AI项目的持续交付与持续训练。