docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > docker打包本地conda虚拟环境

docker打包本地conda虚拟环境并远程部署的详细过程

作者:Uncertainty!!

这篇文章给大家介绍docker打包本地conda虚拟环境并远程部署的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

由于我的实验代码在某些数据集上经常OOM,所以我想把本地环境直接打包为docker,以便在远程服务器上直接运行

将本地复杂的深度学习环境(尤其是涉及 CUDA 的 GS-SLAM 项目)迁移到远程服务器,使用 Docker 是最稳妥的选择。这能避免远程服务器上驱动、库版本不一致导致的“环境地狱”。

为了保证效率,建议遵循以下流程:构建基础镜像 -> 导出 Conda 环境 -> 映射代码与数据。

第一阶段:本地准备(Docker 化)

不要直接把几百 GB 的数据打包进镜像,这样镜像会臃肿且不可移植。我们只把 环境 打包。

1.导出 Conda 环境

conda activate my2dgsslam
conda env export > environment.yml

将environment.yml中的pip部分复制粘贴到requirement.txt

addict
appdirs
argcomplete
attrs
backcall
click
comm
configargparse
cycler
dash
dash-core-components
dash-html-components
dash-table
decorator
docker-pycreds
evo
fastjsonschema
flask
fonttools
gitdb
gitpython
glfw
imageio
imgviz
importlib-metadata
importlib-resources
ipython
ipywidgets
itsdangerous
jedi
jinja2
joblib
jsonschema
jupyter-core
jupyterlab-widgets
kiwisolver
lietorch
lpips
markdown-it-py
markupsafe
matplotlib
matplotlib-inline
mdurl
munch
natsort
nbformat
nest-asyncio
open3d
opencv-python
packaging
pandas
parso
pexpect
pickleshare
pillow
pkgutil-resolve-name
platformdirs
plotly
prompt-toolkit
protobuf
psutil
ptyprocess
pyglm
pygments
pyopengl
pyparsing
pyquaternion
pyrsistent
python-dateutil
pytz
pyyaml
retrying
rich
ruff
scikit-learn
scipy
seaborn
sentry-sdk
setproctitle
smmap
tenacity
threadpoolctl
torchmetrics
traitlets
trimesh
wandb
wcwidth
werkzeug
widgetsnbextension
zipp

2.构建dockerfile

# 1. 基础镜像:Ubuntu 22.04 + CUDA 11.8 (完美支持 H20 的 sm_90 架构)
FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04
# 2. 避免交互式安装,设置时区为东八区
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai
# 3. 替换 apt 源为阿里云
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
    sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# 4. 安装基础依赖
RUN apt-get update && apt-get install -y \
    wget curl git tzdata build-essential ninja-build \
    libgl1-mesa-glx libglib2.0-0 \
    && ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
    && dpkg-reconfigure --frontend noninteractive tzdata \
    && rm -rf /var/lib/apt/lists/*
# 5. 安装 Miniconda
RUN wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda.sh && \
    bash /tmp/miniconda.sh -b -p /opt/conda && \
    rm /tmp/miniconda.sh
ENV PATH=/opt/conda/bin:$PATH
# 6. 配置 Conda 和 Pip 国内源
RUN conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ && \
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ && \
    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
WORKDIR /workspace
#接受tos条款
RUN conda tos accept
# 7. 创建 Python 3.9 纯净环境
RUN conda create -n 2dgsslam python=3.9 -y && \
    conda clean -afy
RUN echo "source /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
    echo "conda activate 2dgsslam" >> ~/.bashrc
# 8. 核心步骤:显式安装 PyTorch 2.1.2 (cu118 版本)
RUN /bin/bash -c "source /opt/conda/etc/profile.d/conda.sh && conda activate 2dgsslam && \
    pip install torch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 --index-url https://download.pytorch.org/whl/cu118"
# 9. 复制并安装其他第三方库 (仅复制依赖文件,不包含项目代码)
COPY requirements.txt .
RUN /bin/bash -c "source /opt/conda/etc/profile.d/conda.sh && conda activate 2dgsslam && \
    pip install -r requirements.txt"
# 10. H20 算力架构声明 (sm_90)
# 虽然这里不编译,但设置这个环境变量可以确保后续你手动编译时,nvcc 编译器直接生成 H20 的原生机器码
ENV TORCH_CUDA_ARCH_LIST="9.0"
# 默认启动 bash
CMD ["/bin/bash"]

3.构建docker镜像

我们构建docker时不是用代理,取消一下代理设置

ls /etc/systemd/system/docker.service.d/

删除

ls /etc/systemd/system/docker.service.d/

删除文件前可以备份,请删除以下文件

http-proxy.conf
https-proxy.conf
sudo rm -rf /etc/systemd/system/docker.service.d/*

查看配置文件

cat /etc/docker/daemon.json

修改daemon.json为以下内容,注释或删除关于proxy的命令

{
  "runtimes": {
    "nvidia": {
      "args": [],
      "path": "nvidia-container-runtime"
    }
  },
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://mirror.aliyuncs.com"
  ]
}

重载 systemd + 重启 Docker

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart docker

确认代理真的消失

docker info | grep -i proxy

无任何输出

接下来构建docker

docker build -t 2dgsslam_base:v1 .

测试一下
先验证 GPU 是否可用(非常重要)
运行容器:

sudo docker run --gpus all -it 2dgsslam_base:v1

进入后测试:

nvidia-smi

测试 PyTorch GPU
在容器里:

import torch
print(torch.cuda.is_available())
print(torch.cuda.get_device_name(0))

正常输出应该是:
True
NVIDIA H20 / A100 / etc.

第二阶段:保存docker镜像上传到远程服务器

先将镜像导出为tar文件

docker save -o 2dgsslam_base_v1.tar 2dgsslam_base:v1

目前远程服务器只接收tar.gz 压缩包
要将 Docker 镜像保存为 tar.gz 压缩包,核心是先将镜像导出为 tar 文件,再用压缩工具打包成 tar.gz

查看要保存的镜像名称 / ID
先确认镜像的准确标识(名称 + 标签 或 ID)

docker images

将 tar 压缩为 tar.gz
用 gzip 命令压缩(压缩后体积更小,便于传输 / 存储):

# 格式:gzip 要压缩的tar文件
gzip my_image.tar
# 执行后会生成 my_image.tar.gz,原 tar 文件会被删除
# 若想保留原 tar 文件,加 -k 参数:gzip -k my_image.tar

文件权限不够,导致无法上传至远程服务器

-rw-------  1 root      root      12400622118 Mar 21 13:03 2dgsslam_base_v1.tar.gz

修改文件权限

sudo chmod 644 2dgsslam_base_v1.tar.gz

使用sftp连接服务器

sftp 用户名@yourIP

上传镜像

put -r 本地文件路径 远程路径

镜像已经上传到服务器上

在服务器网页控制页面导入镜像

导入完成

第三阶段:挂载项目目录运行

在服务器控制页面创建开发环境选择刚刚导入的镜像

启动命令

sudo docker run --gpus all -it -v /服务器上项目路径/SA-GS-SLAM:/workspace 2dgsslam_base:v1
cd /workspace

第四阶段:vscode远程连接

ssh连接远程服务器docker

到此这篇关于docker打包本地conda虚拟环境并远程部署的文章就介绍到这了,更多相关docker打包本地conda虚拟环境内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文