docker打包本地conda虛擬環(huán)境并遠(yuǎn)程部署的詳細(xì)過程
由于我的實(shí)驗(yàn)代碼在某些數(shù)據(jù)集上經(jīng)常OOM,所以我想把本地環(huán)境直接打包為docker,以便在遠(yuǎn)程服務(wù)器上直接運(yùn)行
將本地復(fù)雜的深度學(xué)習(xí)環(huán)境(尤其是涉及 CUDA 的 GS-SLAM 項(xiàng)目)遷移到遠(yuǎn)程服務(wù)器,使用 Docker 是最穩(wěn)妥的選擇。這能避免遠(yuǎn)程服務(wù)器上驅(qū)動(dòng)、庫版本不一致導(dǎo)致的“環(huán)境地獄”。
為了保證效率,建議遵循以下流程:構(gòu)建基礎(chǔ)鏡像 -> 導(dǎo)出 Conda 環(huán)境 -> 映射代碼與數(shù)據(jù)。
第一階段:本地準(zhǔn)備(Docker 化)
不要直接把幾百 GB 的數(shù)據(jù)打包進(jìn)鏡像,這樣鏡像會臃腫且不可移植。我們只把 環(huán)境 打包。
1.導(dǎo)出 Conda 環(huán)境
conda activate my2dgsslam conda env export > environment.yml

將environment.yml中的pip部分復(fù)制粘貼到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.構(gòu)建dockerfile
# 1. 基礎(chǔ)鏡像:Ubuntu 22.04 + CUDA 11.8 (完美支持 H20 的 sm_90 架構(gòu))
FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04
# 2. 避免交互式安裝,設(shè)置時(shí)區(qū)為東八區(qū)
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. 安裝基礎(chǔ)依賴
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 國內(nèi)源
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. 創(chuàng)建 Python 3.9 純凈環(huán)境
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. 復(fù)制并安裝其他第三方庫 (僅復(fù)制依賴文件,不包含項(xiàng)目代碼)
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 算力架構(gòu)聲明 (sm_90)
# 雖然這里不編譯,但設(shè)置這個(gè)環(huán)境變量可以確保后續(xù)你手動(dòng)編譯時(shí),nvcc 編譯器直接生成 H20 的原生機(jī)器碼
ENV TORCH_CUDA_ARCH_LIST="9.0"
# 默認(rèn)啟動(dòng) bash
CMD ["/bin/bash"]3.構(gòu)建docker鏡像
我們構(gòu)建docker時(shí)不是用代理,取消一下代理設(shè)置
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為以下內(nèi)容,注釋或刪除關(guān)于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
確認(rèn)代理真的消失
docker info | grep -i proxy
無任何輸出
接下來構(gòu)建docker
docker build -t 2dgsslam_base:v1 .

測試一下
先驗(yàn)證 GPU 是否可用(非常重要)
運(yùn)行容器:
sudo docker run --gpus all -it 2dgsslam_base:v1
進(jìn)入后測試:
nvidia-smi
測試 PyTorch GPU
在容器里:
import torch print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))
正常輸出應(yīng)該是:
True
NVIDIA H20 / A100 / etc.
第二階段:保存docker鏡像上傳到遠(yuǎn)程服務(wù)器
先將鏡像導(dǎo)出為tar文件
docker save -o 2dgsslam_base_v1.tar 2dgsslam_base:v1

目前遠(yuǎn)程服務(wù)器只接收tar.gz 壓縮包
要將 Docker 鏡像保存為 tar.gz 壓縮包,核心是先將鏡像導(dǎo)出為 tar 文件,再用壓縮工具打包成 tar.gz
查看要保存的鏡像名稱 / ID
先確認(rèn)鏡像的準(zhǔn)確標(biāo)識(名稱 + 標(biāo)簽 或 ID)
docker images

將 tar 壓縮為 tar.gz
用 gzip 命令壓縮(壓縮后體積更小,便于傳輸 / 存儲):
# 格式:gzip 要壓縮的tar文件 gzip my_image.tar # 執(zhí)行后會生成 my_image.tar.gz,原 tar 文件會被刪除 # 若想保留原 tar 文件,加 -k 參數(shù):gzip -k my_image.tar
文件權(quán)限不夠,導(dǎo)致無法上傳至遠(yuǎn)程服務(wù)器
-rw------- 1 root root 12400622118 Mar 21 13:03 2dgsslam_base_v1.tar.gz
修改文件權(quán)限
sudo chmod 644 2dgsslam_base_v1.tar.gz
使用sftp連接服務(wù)器
sftp 用戶名@yourIP
上傳鏡像
put -r 本地文件路徑 遠(yuǎn)程路徑
鏡像已經(jīng)上傳到服務(wù)器上

在服務(wù)器網(wǎng)頁控制頁面導(dǎo)入鏡像


導(dǎo)入完成
第三階段:掛載項(xiàng)目目錄運(yùn)行
在服務(wù)器控制頁面創(chuàng)建開發(fā)環(huán)境選擇剛剛導(dǎo)入的鏡像



啟動(dòng)命令
sudo docker run --gpus all -it -v /服務(wù)器上項(xiàng)目路徑/SA-GS-SLAM:/workspace 2dgsslam_base:v1
cd /workspace
第四階段:vscode遠(yuǎn)程連接
ssh連接遠(yuǎn)程服務(wù)器docker



到此這篇關(guān)于docker打包本地conda虛擬環(huán)境并遠(yuǎn)程部署的文章就介紹到這了,更多相關(guān)docker打包本地conda虛擬環(huán)境內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker打包本地conda虛擬環(huán)境并遠(yuǎn)程部署的詳細(xì)過程
這篇文章給大家介紹docker打包本地conda虛擬環(huán)境并遠(yuǎn)程部署的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2026-03-03
使用Docker Compose創(chuàng)建LAMP環(huán)境的詳細(xì)步驟
現(xiàn)如今,通過 Docker 容器化部署環(huán)境已經(jīng)逐漸成為主流,特別是在部署像 LAMP 這樣的復(fù)雜環(huán)境時(shí),本教程旨在帶您完成使用 Docker-Compose 建立 LAMP 環(huán)境的整個(gè)過程,同時(shí)還包括定制 PHP 環(huán)境的步驟,需要的朋友可以參考下2024-12-12
docker鏡像倉庫hub.docker.com無法訪問的解決方法
最近許多群友都詢問為什么無法訪問Docker鏡像倉庫,本文就來介紹一下docker鏡像倉庫hub.docker.com無法訪問的解決方法,感興趣的可以了解一下2023-08-08
如何查看docker run啟動(dòng)參數(shù)命令(推薦)
這篇文章主要介紹了如何查看docker run啟動(dòng)參數(shù)命令,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
從入門到實(shí)戰(zhàn)全面解析Docker鏡像常用命令
Docker 作為容器化技術(shù)的標(biāo)桿工具,其鏡像管理能力是實(shí)現(xiàn)高效 CI/CD 流程的核心,本文將為大家?guī)鞤ocker 鏡像常用命令的全方位解析,希望對大家有所幫助2025-11-11
docker-compose部署nacos 2.2.3的詳細(xì)過程
這篇文章主要介紹了docker-compose部署nacos 2.2.3的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-11-11

