本文將詳細記錄我如何為一臺全新的離線服務器配置必要的運行環境,包括基礎編譯工具、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 加速的算法應用了。雖然離線環境的配置過程相對繁瑣,但只要細心準備,按部就班地操作,就能順利完成。希望這篇記錄能為有類似需求的人提供一些參考。