离线环境下Ubuntu+cuda+Pytorch配置

因工作需要,需要在完全离线的环境下搭建GPU服务器,并配置cuda+PyTorch环境,记录一下基本的步骤以及踩过的坑。

Ubuntu安装

因离线及特殊原因,无法使用启动u盘,在ubuntu网站下载iso镜像后进行刻盘,使用光盘引导启动。ubuntu正常安装即可,但是iso镜像需用加密u盘单独拷贝至硬盘里备用。

Nvidia驱动安装

Nvidia驱动在Nvidia网站即可下载,对应处理器版本下载即可。

安装GCC

作为Linux开发版,Ubuntu出厂不带CC等编译器让人感到匪夷所思,离线状态下不能使用包管理器,使用dpkg安装各个pkg包时递归查看依赖太折磨人,尝试使用上文提到的iso镜像作为apt本地源。

首先将iso镜像复制到文件系统中,便于说明假设是~/Downloads/ubuntu-xxxx.iso

备份sources.list

1
sudo mv /etc/apt/sources.list /etc/apt/sources.list.backup

/mnt创建挂载点,即创建文件夹,文件夹名字随意,避免出现中文。

1
sudo mkdir /mnt/ubuntu

在挂载点挂载iso镜像。

1
sudo mount -o loop ~/Downloads/ubuntu-xxxx.iso /mnt/ubuntu

编辑sources.list,其中文件夹后为发行版代号,如果不明确的话也可以用stable代替。

1
sudo gedit /etc/apt/sources.list
1
2
# sources.list 本地源
deb file:///mnt/ubuntu focal main restricted

更新apt索引。

1
2
sudo apt clean all
sudo apt-get update

安装cc等编译器,这里推荐build-essential

1
sudo apt-get install build-essential

测试gcc g++等命令是否可用。

卸载旧版Nvidia驱动

使用apt卸载安装系统时自动安装的Nvidia驱动。

1
2
sudo apt-get --purge remove nvidia*
sudo apt autoremove

禁用nouveau

接下来需要禁用nouveau驱动,否则会引起冲突。首先使用以下命令查看是否有关于nouveau的输出,若有则说明nouveau驱动已被系统挂载。

1
lsmod | grep nouveau

编辑配置文件,将nouveau添加至黑名单。

1
sudo gedit /etc/modprobe.d/blacklist.conf
1
2
3
#在文件末尾添加以下两条语句
blacklist nouveau
options nouveau modeset=0

重新生成Kernel initramfs。

1
sudo update-initramfs -u

重启。

1
sudo reboot

安装Nvidia驱动

重启后,按 Ctrl+Alt+F3 进入 TTY 模式。

测试nouveau是否被禁用,若无输出信息则可进行下一步。

1
lsmod | grep nouveau

赋予驱动文件可执行权限,并执行安装。--no-opengl-files只安装驱动文件,不安装OpenGL文件。

1
2
sudo chmod 777 NVIDIA-Linux-x86_64-xxx.xx.run
sudo sh NVIDIA-Linux-x86_64-xxx.xx.run --no-opengl-files

其余选项结合自身来选,安装结束后重启。

1
sudo reboot

重启后使用 nvidia-smi 查看驱动是否安装完成。

cuda安装

对于安装位置,若不同用户需要安装不同版本cuda,则安装在各自用户文件夹内,单用户情景下可直接使用 sudo 安装。

赋予cuda文件可执行权限并安装,由于已安装过驱动,所以在安装选项中取消驱动的勾选。

1
2
sudo chmod a+x cuda_xxxxxxxx.run
sudo sh cuda_xxxxxxxx.run

PyTorch安装

考虑到将来可能还会配置其余如 tensorflow 等环境,故使用 conda 组织包环境,但是由于考虑上的疏忽,第一次安装时使用了 miniconda ,在后续安装 python 库包 以及 python IDE 时,对依赖的安装产生了巨大的影响,以至于在安装IDE时不得已删除了整个conda环境。

假如是在完全离线的服务器上安装conda环境,建议使用 Anaconda ,其自带 Spyder 等IDE与诸多Python类库,方便后续安装。

赋予 Anaconda 安装文件执行权限并进行安装,推荐分用户安装,安装完成后允许 conda initializer 进行初始化。

1
2
3
4
chmod a+x Anaconda3-xxxxxxxxx.sh
./Anaconda3-xxxxxxxxx.sh
#conda initializer
yes

创建 pytorch 虚拟环境,便于组织库包。

1
2
conda create -n pytorch python pip
conda activate pytorch

PyTorch 依赖 Numpy 库,而后续安装的 pandas 等库包中一部分也依赖 Numpy,但其依赖的版本不一样,第一次安装时出现了冲突,且离线情况下会出现安装一个库提示依赖另一个库包,无限套娃。思考参考 apt 本地源,创建 pip 本地源。

由于第一次安装时尝试用 pip 安装依赖,然后用 conda 安装库包,处理依赖本地源时不需要把 pytorch/torchvision等包放进去,但后续实践表明完全可以一次性封装好,将pytorch与依赖库包放在一起用 pip 安装,没必要执着于 conda 安装,conda 自身离线源创建比较麻烦。

为了便于制作离线源,首先需要 requirements.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
charset-normalizer==2.1.0
cycler==0.11.0
dpcpp-cpp-rt==2022.1.0
fonttools==4.34.4
idna==3.3
intel-cmplr-lib-rt==2022.1.0
intel-cmplr-lic-rt==2022.1.0
intel-opencl-rt==2022.1.0
intel-openmp==2022.1.0
kiwisolver==1.4.4
matplotlib==3.5.2
mkl==2022.1.0
mkl-fft==1.3.1
mkl-random==1.2.2
numpy==1.22.4
opencv-python==4.6.0.66
packaging==21.3
pandas==1.4.3
Pillow==9.2.0
pyparsing==3.0.9
python-dateutil==2.8.2
pytz==2022.1
requests==2.28.1
scipy==1.8.1
six==1.16.0

根据 requirements.txt 下载wheel包至指定文件夹中,方便打包。

1
pip download -d packages/ -r requirements.txt

将上述指定文件夹requirements.txt 打包压缩,一起拷贝至离线服务器。在离线服务器解压后,开始安装。使用pytorch虚拟环境中的 pip 命令,命令中的 find-link 需替换为 wheel 文件夹相对路径,requirements.txt 需要相对路径。

1
pip install --no-index --find-links=packages/ -r requirements.txt

至此 PyTorch 安装告一段落,可在 Python解释器 中通过以下语句测试。

1
2
import torch
torch.cuda.is_available()

若出现 libxxx.so 缺失,首先确定缺失的动态链接库对应的库包有没有安装,若已安装仍报错,则需要建立软连接,首先到~/anaconda3/envs/pytorch/lib文件夹中,查看有无与相应动态链接库名字相似的动态链接库,如果存在,直接通过下述命令添加软链接即可。

1
sudo ln -s libxxx.xxxxx.so libxxx.so

第一个参数是文件夹中存在的动态链接库名,第二个链接是Python报错的动态链接库名。添加完成后回到 Python 解释器重新导入,若有其他动态链接库缺失则通过相同方法添加软链接。若缺失动态链接库为 libcuxxx.so 则为cuda库,需要去cuda安装目录寻找动态链接库。

Spyder IDE

使用 Anaconda 可以很方便的使用 Spyder 作为 Python IDE,以下介绍将 Spyder 添加至桌面快捷方式的方法,方便直接使用。

/usr/share/applications下创建 Spyder 快捷方式文件。

1
2
cd /usr/share/applications
sudo gedit spyder3.desktop

编辑 spyder3.desktop 文件。

1
2
3
4
5
6
7
8
9
10
11
12
[Desktop Entry]
Encoding=UTF-8
Name=Spyder3
Comment=Python IDE
Exec=/home/<username>/anacondas/bin/spyder
Icon=/home/<username>/anacondas/share/icons/spyder3.png
StartupNotify=True
Terminal=False
Categories=Development;Science;IDE;Qt;
Type=Application
MimeType=text/x-python;
X-AppStream-Ignore=True

赋予可执行权限。

1
sudo chmod 777 spyder3.desktop

此时,即可在桌面上直接点击使用 Spyder ,并可在 Spyder 中选择 PyTorch 环境作为 Python 环境。