离线服务器算法部署环境配置
本文将详细记录我如何为一台全新的离线服务器配置必要的运行环境,包括基础编译工具、NVIDIA显卡驱动以及NVIDIA-Docker,以便顺利部署深度学习算法。
前提条件:
- 目标离线服务器已安装操作系统(本文以Ubuntu 18.04为例)。
- Docker 服务已安装并运行。
- Docker-Compose 已安装。
核心思路:
利用一台有网络的服务器(与目标服务器操作系统一致或兼容)下载所有需要的软件包和驱动,然后将这些文件拷贝到离线服务器进行安装。
阶段一:在线服务器资源下载
在有网络的服务器上,我们需要下载以下几类关键文件:
- 基础编译环境和依赖库的
.deb
包。 - NVIDIA 显卡驱动的
.run
安装包。 - NVIDIA-Docker (或
nvidia-container-toolkit
) 的.deb
包。
1.1 准备基础编译环境和依赖库
为了确保离线环境的纯净与一致性,我选择使用Docker容器(基于ubuntu:18.04
)来下载基础依赖包。这样做的好处是可以模拟目标服务器的操作系统环境,减少兼容性问题。
以下是我使用的命令序列:
首先,拉取官方的Ubuntu 18.04镜像:
docker pull ubuntu:18.04
然后,运行一个容器,并将宿主机的一个目录(例如 /path/on/host/for_debs)挂载到容器的 /downloaded_debs 目录,用于存放下载的 .deb 包:
docker run -it --rm \-v /path/on/host/for_debs:/downloaded_debs \ubuntu:18.04 /bin/bash
进入容器后,执行以下命令更新apt缓存,安装一些下载工具,然后仅下载我们需要的包到本地缓存,最后再拷贝出来:
# 在容器内部执行:
apt-get update
apt-get install -y apt-utils ca-certificates # ca-certificates 用于HTTPS下载# 清理旧的缓存(可选,但推荐)
apt-get clean# 仅下载指定的依赖包及其所有依赖项,不进行安装
# 注意:这里的包列表非常详细,是根据项目需求和驱动编译可能需要的依赖梳理的
# 实际操作中,您可能需要根据自己的需求调整这个列表
apt-get --reinstall install --download-only \build-essential \gcc \g++ \g++-7 \make \dpkg-dev \libdpkg-perl=1.19.0.5ubuntu2.4 \binutils=2.30-21ubuntu1~18.04.9 \binutils-common=2.30-21ubuntu1~18.04.9 \libbinutils=2.30-21ubuntu1~18.04.9 \binutils-x86-64-linux-gnu=2.30-21ubuntu1~18.04.9 \gcc-7 \libgcc-7-dev=7.5.0-3ubuntu1~18.04 \cpp-7 \libstdc++-7-dev=7.5.0-3ubuntu1~18.04 \libitm1 \libatomic1 \libasan4 \liblsan0 \libtsan0 \libubsan0 \libcilkrts5 \libmpx2 \libquadmath0 \libc6-dev=2.27-3ubuntu1.6 \libc6=2.27-3ubuntu1.6 \libc-dev-bin=2.27-3ubuntu1.6 \linux-libc-dev \linux-headers-5.4.0-150-generic \linux-hwe-5.4-headers-5.4.0-150 \perl=5.26.1-6ubuntu0.7 \perl-base=5.26.1-6ubuntu0.7 \libperl5.26=5.26.1-6ubuntu0.7 \perl-modules-5.26# 将下载的 .deb 文件从apt缓存复制到我们挂载的目录
cp /var/cache/apt/archives/*.deb /downloaded_debs/# 退出容器
exit
执行完毕后,所有必需的 .deb 包都已保存在宿主机的 /path/on/host/for_debs 目录中。
注意:linux-headers-5.4.0-150-generic 和 linux-hwe-5.4-headers-5.4.0-150 是特定内核版本的头文件。你需要根据你离线服务器的内核版本 (uname -r) 下载对应的头文件。如果在线服务器的内核版本与离线服务器不同,你可能需要临时下载对应版本的头文件包,或者在Docker容器内通过修改源的方式尝试获取特定版本的内核头文件包。最稳妥的方式是确保在线下载环境的内核或可获取的包版本与离线目标一致。
1.2 下载 NVIDIA 显卡驱动 📦
访问 NVIDIA官方驱动下载页面,根据你服务器的显卡型号和操作系统(Linux 64-bit)选择合适的驱动版本,并下载 .run
文件。例如 NVIDIA-Linux-x86_64-xxx.xx.xx.run
。将其保存在之前准备的 /path/on/host/for_debs
目录(或者一个专门存放驱动的目录)中。
1.3 下载 NVIDIA-Docker 相关包 🐳
NVIDIA-Docker 允许 Docker 容器直接访问宿主机的 GPU。现在推荐使用 nvidia-container-toolkit
。
在有网络的Ubuntu 18.04服务器上执行以下步骤来下载 nvidia-docker2
(或 nvidia-container-toolkit
) 及其依赖:
# 添加 NVIDIA Docker 的软件源 (在有网络的机器上)
curl -s -L [https://nvidia.github.io/nvidia-docker/gpgkey](https://nvidia.github.io/nvidia-docker/gpgkey) | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L [https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list](https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list) | sudo tee /etc/apt/sources.list.d/nvidia-docker.listsudo apt-get update# 仅下载 nvidia-docker2 及其依赖 (旧版,但有些环境可能仍需)
# sudo apt-get install --download-only -y nvidia-docker2# 推荐下载 nvidia-container-toolkit (新版)
sudo apt-get install --download-only -y nvidia-container-toolkit
下载完成后,相关的 .deb 文件会存放在 /var/cache/apt/archives/ 目录下。将这些 nvidia-docker2 或 nvidia-container-toolkit 相关的 .deb 包也复制到你的 /path/on/host/for_debs 目录中。
至此,所有需要的离线安装包都已准备就绪。
阶段二:离线服务器安装
现在,将在线服务器上 /path/on/host/for_debs
目录(或其他你存放所有下载文件的目录)中的所有内容(包括基础依赖的 .deb
文件夹、NVIDIA驱动 .run
文件、nvidia-docker
的 .deb
包)通过U盘、移动硬盘或其他方式传输到目标离线服务器上。假设我们把所有文件都放在了离线服务器的 /opt/offline_packages
目录下。
2.1 安装基础编译环境和依赖库
进入存放 .deb
包的目录,并使用 dpkg
进行安装:
cd /opt/offline_packages/debs_from_ubuntu_container # 这是之前下载的基础依赖
sudo dpkg -i *.deb
如果在执行 dpkg -i 时遇到依赖问题,可以尝试执行以下命令,它会尝试使用当前目录下已有的包来解决这些依赖关系:
sudo apt-get -f install
由于是离线环境,apt-get -f install 只有在所有必需的依赖包都已经被 dpkg -i “知晓”(即尝试安装过或已解包)并且这些包确实存在于本地时才可能成功解决问题。如果依然报错,说明你下载的包不全,需要回到阶段一补充下载缺失的依赖。
2.2 安装 NVIDIA 显卡驱动
-
禁用 Nouveau 驱动:Nouveau 是开源的 NVIDIA 驱动,与官方驱动冲突。
创建一个文件/etc/modprobe.d/blacklist-nouveau.conf
:sudo nano /etc/modprobe.d/blacklist-nouveau.conf
添加以下内容:
blacklist nouveau options nouveau modeset=0
更新 initramfs 并重启:
sudo update-initramfs -u sudo reboot
重启后,验证 Nouveau 是否已禁用:
lsmod | grep nouveau
如果没有任何输出,则表示禁用成功。
-
安装驱动:
给驱动文件执行权限,并运行安装程序。cd /opt/offline_packages # 假设 .run 文件在此 sudo chmod +x NVIDIA-Linux-x86_64-xxx.xx.xx.run sudo ./NVIDIA-Linux-x86_64-xxx.xx.xx.run --no-x-check --no-nouveau-check --no-opengl-files
--no-x-check
: 不检查X服务状态(服务器通常没有X)。--no-nouveau-check
: 再次确认不检查nouveau(我们已经禁用了)。--no-opengl-files
: 仅安装驱动,不安装OpenGL库(服务器通常不需要,且可能与现有mesa库冲突)。
按照提示完成安装。通常需要接受许可协议,可能会询问是否注册DKMS(推荐选择是,这样内核更新后驱动会自动重新编译)。
-
验证驱动安装:
nvidia-smi
如果成功安装,此命令会显示显卡信息和驱动版本。
2.3 安装和配置 NVIDIA-Docker
-
安装
nvidia-docker2
/nvidia-container-toolkit
包:
进入存放nvidia-docker
相关.deb
包的目录:cd /opt/offline_packages/nvidia_docker_debs # 假设你把nvidia-docker的deb包放在这里 sudo dpkg -i *.deb
同样,如果遇到依赖问题,可以尝试
sudo apt-get -f install
,前提是相关依赖也已拷贝过来。 -
重启 Docker 服务:
为了让 Docker 识别新的 NVIDIA runtime,需要重启 Docker 服务。sudo systemctl restart docker
或者在没有
systemctl
的旧系统上:sudo service docker restart
-
测试 NVIDIA-Docker:
运行一个基于 CUDA 的 Docker 镜像来测试 GPU 是否能在容器内被访问:docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu18.04 nvidia-smi
(请根据你安装的驱动版本,选择一个兼容的
nvidia/cuda
镜像标签。例如,如果你的驱动是 470.xx,CUDA 11.4 可能是一个好选择,对应的镜像是nvidia/cuda:11.4.0-base-ubuntu18.04
等。)如果此命令在容器内成功输出了
nvidia-smi
的信息,那么恭喜你,NVIDIA-Docker 配置成功!
总结 🏁
通过以上步骤,我们成功地在一台无网络服务器上配置了基础编译环境、安装了 NVIDIA 显卡驱动,并配置好了 NVIDIA-Docker。现在,这台服务器已经准备就绪,可以开始部署和运行需要 GPU 加速的算法应用了。虽然离线环境的配置过程相对繁琐,但只要细心准备,按部就班地操作,就能顺利完成。希望这篇记录能为有类似需求的人提供一些参考。