1. 离线Ubuntu深度学习环境搭建全攻略
在工业现场、保密实验室或网络受限环境中,我们常会遇到需要在完全离线的Ubuntu系统上配置深度学习环境的挑战。不同于在线安装的便捷,离线部署需要解决依赖包传递、版本匹配、环境隔离等一系列技术难题。本文将基于Ubuntu 20.04 LTS系统,详细演示如何通过本地化部署完成从驱动安装到框架测试的全流程。
提示:建议准备至少50GB可用空间的U盘或移动硬盘作为离线包中转站,所有操作需在具有网络连接的另一台同架构计算机上预先完成准备工作。
1.1 环境预检与规划
首先确认目标机器的硬件配置和系统状态:
bash复制# 查看系统版本
lsb_release -a
# 查看显卡型号
lspci | grep -i nvidia
# 查看CPU架构
uname -m
典型离线部署需要准备以下组件:
- NVIDIA驱动.run文件(与显卡型号严格匹配)
- CUDA Toolkit本地安装包(需与驱动版本兼容)
- cuDNN库文件(需与CUDA版本对应)
- Python离线安装包(建议Miniconda)
- 深度学习框架whl文件(PyTorch/TensorFlow等)
- 第三方库依赖树(通过pip download收集)
1.2 依赖包下载策略
在联网机器上使用以下命令生成完整依赖清单:
bash复制# 创建虚拟环境
python -m venv dl_env
source dl_env/bin/activate
# 下载PyTorch全家桶(示例版本1.12.0)
pip download torch==1.12.0+cu113 torchvision==0.13.0+cu113 torchaudio==0.12.0 \
--extra-index-url https://download.pytorch.org/whl/cu113
# 导出依赖清单
pip freeze > requirements.txt
pip download -r requirements.txt
关键注意事项:
- CUDA版本必须与驱动版本匹配(如CUDA 11.3需驱动版本≥465.19.01)
- 下载的whl文件需与目标机Python版本、架构一致(如cp38-cp38-linux_x86_64)
- 建议使用相同Ubuntu版本的docker容器进行依赖收集,避免ABI不兼容
2. 核心组件离线安装
2.1 NVIDIA驱动部署
将下载好的驱动文件(如NVIDIA-Linux-x86_64-470.82.01.run)传输到目标机后:
bash复制# 关闭图形界面
sudo systemctl isolate multi-user.target
# 赋予执行权限并安装
chmod +x NVIDIA-Linux-x86_64-470.82.01.run
sudo ./NVIDIA-Linux-x86_64-470.82.01.run --no-opengl-files -s
# 验证安装
nvidia-smi
常见问题处理:
- 若提示"Unable to find the kernel source tree":
需安装对应内核头文件:bash复制sudo apt-get install linux-headers-$(uname -r)
2.2 CUDA Toolkit安装
解压本地安装包(如cuda_11.3.0_465.19.01_linux.run):
bash复制sudo sh cuda_11.3.0_465.19.01_linux.run --silent --toolkit --override
配置环境变量:
bash复制echo 'export PATH=/usr/local/cuda-11.3/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.3/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
验证安装:
bash复制nvcc -V
/usr/local/cuda-11.3/extras/demo_suite/deviceQuery
2.3 cuDNN库部署
解压cudnn-11.3-linux-x64-v8.2.1.32.tgz后:
bash复制sudo cp cuda/include/cudnn*.h /usr/local/cuda-11.3/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-11.3/lib64
sudo chmod a+r /usr/local/cuda-11.3/include/cudnn*.h /usr/local/cuda-11.3/lib64/libcudnn*
3. Python环境构建
3.1 Miniconda离线安装
传输Miniconda3-py38_4.12.0-Linux-x86_64.sh到目标机:
bash复制bash Miniconda3-py38_4.12.0-Linux-x86_64.sh -b -p $HOME/miniconda
source ~/miniconda/bin/activate
3.2 离线包安装
将所有下载的whl文件放入packages目录后:
bash复制pip install --no-index --find-links=./packages -r requirements.txt
特殊技巧:
- 对于复杂依赖,可使用pip-licenses生成依赖树:
bash复制
pip install pip-licenses pip-licenses --format=json > dependencies.json - 遇到ABI不兼容时,可尝试强制重命名.so文件:
bash复制
patchelf --set-soname libnew.so libold.so
4. 深度学习框架验证
4.1 PyTorch功能测试
创建test_gpu.py:
python复制import torch
print(f"PyTorch版本: {torch.__version__}")
print(f"CUDA可用: {torch.cuda.is_available()}")
print(f"设备数量: {torch.cuda.device_count()}")
print(f"当前设备: {torch.cuda.current_device()}")
print(f"设备名称: {torch.cuda.get_device_name(0)}")
x = torch.randn(3,3).cuda()
print(x @ x.T)
执行验证:
bash复制python test_gpu.py
4.2 性能基准测试
使用torch.utils.benchmark进行基准测试:
python复制from torch.utils.benchmark import Timer
setup = "x=torch.randn(1024,1024).cuda()"
counts = [10, 100, 1000]
for count in counts:
timer = Timer(
stmt="x @ x.T",
setup=setup,
globals={"torch": torch}
)
print(f"次数: {count}, 耗时: {timer.timeit(count).mean * 1000:.2f}ms")
5. 离线环境维护技巧
5.1 依赖更新方案
建立本地仓库目录结构:
code复制/local_repo
├── apt
│ ├── pool
│ └── dists
└── pip
├── torch
└── common
对于APT包:
bash复制# 在联网机下载
apt-get download $(apt-cache depends --recurse python3 | grep "^\w" | sort -u)
# 在离线机安装
sudo dpkg -i *.deb
对于Python包:
bash复制# 使用devpi搭建本地索引
pip install devpi-client
devpi-server --init
devpi use http://localhost:3141
devpi upload --from-dir ./packages
5.2 环境备份与迁移
使用conda-pack进行环境打包:
bash复制conda install -c conda-forge conda-pack
conda pack -n dl_env -o dl_env.tar.gz
在目标机恢复:
bash复制mkdir -p ~/envs
tar -xzf dl_env.tar.gz -C ~/envs
source ~/envs/dl_env/bin/activate
5.3 常见故障排查
-
CUDA版本不匹配:
bash复制# 查看驱动支持的最高CUDA版本 nvidia-smi --query-gpu=driver_version --format=csv # 对比CUDA Toolkit版本 nvcc -V -
库文件冲突:
bash复制# 查看动态库链接 ldd $(which python) | grep cuda # 修复链接 sudo ldconfig /usr/local/cuda/lib64 -
内存不足时:
bash复制# 使用交换分区 sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
我在某军工项目的实际部署中,发现通过Docker导出镜像的方式能显著简化离线部署流程。具体做法是在联网环境构建完整镜像后:
bash复制docker save -o dl_env.tar dl_image:latest
然后将tar文件传输到离线机加载:
bash复制docker load -i dl_env.tar
这种方式尤其适合需要部署多台相同配置机器的场景,能保证环境绝对一致。
