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的底层基础设施。

版本选择建议:Python 3.10+(兼容PyTorch 2.x与TensorFlow 2.12+);Docker Engine 24+;Kubernetes 1.28+(或使用Minikube 1.32+);Jenkins 2.440+ 或 GitLab Runner 16+。避免使用过旧版本导致兼容性问题。
AI/MLOps 环境搭建四层架构 Python 3.10+ 解释器 + pip venv/conda 核心作用: • 模型代码执行环境(PyTorch/TensorFlow/Scikit-learn) • 依赖管理:requirements.txt / pyproject.toml / conda env.yml Docker 24+ 镜像 + 容器 Dockerfile 核心作用: • 将Python环境 + 系统依赖 + CUDA驱动封装为镜像 • 常用命令:docker build / docker run / docker push • 镜像仓库:Docker Hub / Harbor / 云镜像仓库 Kubernetes 1.28+ Pod / Deployment Service / PVC 核心作用: • 容器编排:自动调度、弹性伸缩、故障自愈 • 关键资源:Deployment(无状态)、Job/CronJob(训练任务) • 本地开发:Minikube / kind / k3s CI/CD 工具 Jenkins / GitLab CI 核心作用: • 自动化流水线:代码提交 → 构建镜像 → 运行测试 → 部署到K8s • 触发方式:Git Webhook / 定时触发 / 手动触发 层级关系 代码层 环境层 调度层 自动化层

方法流程:从零搭建一套可用的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 → 训练完成后自动评估指标 → 若准确率达标则更新部署。整个过程无需人工干预,环境完全一致。

误区与复盘:环境搭建中的常见陷阱

高频错误1:在Docker容器内使用GPU但未安装nvidia-container-toolkit。 仅安装Docker是不够的,必须额外安装NVIDIA容器工具包,否则容器内无法访问GPU资源。正确做法是:
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
高频错误2:Python依赖版本冲突导致训练结果不可复现。 解决方案:使用pip freeze > requirements.txt锁定精确版本,或使用Poetry管理依赖。对于深度学习项目,还需锁定CUDA和cuDNN版本,并在Dockerfile中明确标注。
复盘建议:每次环境变更后,务必执行docker commit或更新Dockerfile并推送新镜像,确保镜像版本与代码版本一一对应。建议在CI流水线中加入环境一致性检查步骤,对比本地与容器中的关键库版本。

环境搭建是MLOps的基石,但并非一次性工作。随着项目迭代,依赖升级、GPU驱动更新、K8s集群扩容都会带来新的挑战。建议团队将环境配置代码化(Infrastructure as Code),使用Terraform管理云资源,使用Ansible配置宿主机,使用Helm管理K8s应用,从而让环境像代码一样可版本控制、可审计、可回滚。只有将环境搭建纳入DevOps体系,才能真正实现AI项目的持续交付与持续训练。