深度学习篇---docker迁移深度学习项目至linux平台
在Windows上开发深度学习项目最后部署或迁移到Linux上跑。好消息是Docker 做这件事几乎完美因为容器内部就是Linux环境你在Windows上构建的镜像放到Linux上跑天然无缝。核心思路一次打包到处运行你用Docker打包的镜像里面装的是Linux版的Python、Linux版的PyTorch、Linux版的CUDA库不依赖你宿主机是Windows还是Linux。所以流程分为两大步在Windows上把项目做成Docker镜像把镜像搬到Linux服务器用GPU跑起来唯一不同的就是第二步的Linux环境准备。第一步在Windows上打包和之前一样快速回顾假设你已经按上轮说的在项目根目录准备了三个文件Dockerfile以PyTorch CUDA 11.8为例FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04 RUN apt-get update apt-get install -y \ python3.10 python3-pip git wget \ rm -rf /var/lib/apt/lists/* RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.10 1 WORKDIR /workspace COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple COPY . . CMD [python, main.py].dockerignore__pycache__ *.pyc .git *.pth *.ckpt data/然后在PowerShell里构建并导出docker build -t my-dl-project:v1 . docker save -o my-dl-project.tar my-dl-project:v1第二步在Linux服务器上恢复并运行这是你需要重点看的新部分。2.1 给Linux装好DockerUbuntu/Debian 系统# 官方一键安装脚本 curl -fsSL https://get.docker.com | bash # 把当前用户加入docker组免sudo sudo usermod -aG docker $USER # 退出重新登录生效CentOS/RHEL 系统curl -fsSL https://get.docker.com | bash sudo systemctl enable docker --now sudo usermod -aG docker $USER验证docker --version2.2 给Linux装上NVIDIA Container Toolkit让Docker能调用GPU这是最关键的一步没有它容器里就看不到显卡。Ubuntu/Debian 安装推荐 nvidia 官方源# 添加nvidia官方仓库 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 dockerCentOS/RHEL 安装distribution$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo sudo yum install -y nvidia-container-toolkit sudo systemctl restart docker验证GPU是否可用docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi如果能看到类似你Windows上nvidia-smi的输出显卡型号、驱动版本、CUDA版本就说明Docker已经能调用GPU了。2.3 把镜像导入Linux把Windows上导出的my-dl-project.tar传到Linux服务器用U盘、scp、或者网盘都行然后在Linux上加载docker load -i my-dl-project.tar验证docker images你就能看到my-dl-project:v1了。2.4 在Linux上用GPU跑你的项目基本运行直接执行CMD里写的命令比如python main.pydocker run --gpus all --rm my-dl-project:v1更实用的运行方式挂载数据、进入交互终端docker run --gpus all -it --rm \ -v /home/你的用户名/data:/workspace/data \ -v /home/你的用户名/models:/workspace/models \ my-dl-project:v1 \ bash-v 宿主机目录:容器内目录把Linux上的数据目录挂进去这样模型权重、训练数据就不用打进镜像里最后加bash覆盖默认的CMD让你先进终端手动执行进去之后你就可以像在Windows上一样运行python main.py # 或者 python train.py --batch_size 32第三步Windows ↔ Linux 双向无忧的核心原理图下面这张图清晰地展示了 Docker 如何抹平两个操作系统之间的差异实现整个深度学习项目的平滑迁移。一份可以直接在多平台使用的Docker Compose编排如果你的项目变复杂了比如需要配合MySQL、Redis一起跑直接用Docker Compose在Windows写的docker-compose.yml在Linux上也照用不误。version: 3.8 services: trainer: image: my-dl-project:v1 runtime: nvidia environment: - NVIDIA_VISIBLE_DEVICESall volumes: - /home/用户名/data:/workspace/data - /home/用户名/models:/workspace/models command: python train.py --epochs 100 deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu]在Linux上启动docker compose up几个跨平台特别要注意的点路径分隔符Windows路径是D:\data\imagesLinux是/home/user/data/images。但在Docker里容器内部永远用Linux风格/workspace/data你只需要在-v挂载时写对宿主机的路径就行。GPU驱动Linux服务器不需要装CUDA Toolkit本身只需要装好NVIDIA驱动和nvidia-container-toolkit容器内部镜像已经自带了正确的CUDA版本。文件权限有时候Linux上挂载的目录会有权限问题简单粗暴的做法是在Dockerfile里加一句RUN chmod -R 777 /workspace或者运行时加-u root。如果你的Linux服务器是租的云GPU比如AutoDL、矩池云它们通常已经内置了Docker和nvidia-docker你只需要上传镜像或直接传tar包就行不用自己装。