离线环境下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 | # sources.list 本地源 |
更新apt索引。
1 | sudo apt clean all |
安装cc等编译器,这里推荐build-essential。
1 | sudo apt-get install build-essential |
测试gcc g++等命令是否可用。
卸载旧版Nvidia驱动
使用apt卸载安装系统时自动安装的Nvidia驱动。
1 | sudo apt-get --purge remove nvidia* |
禁用nouveau
接下来需要禁用nouveau驱动,否则会引起冲突。首先使用以下命令查看是否有关于nouveau的输出,若有则说明nouveau驱动已被系统挂载。
1 | lsmod | grep nouveau |
编辑配置文件,将nouveau添加至黑名单。
1 | sudo gedit /etc/modprobe.d/blacklist.conf |
1 | #在文件末尾添加以下两条语句 |
重新生成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 | sudo chmod 777 NVIDIA-Linux-x86_64-xxx.xx.run |
其余选项结合自身来选,安装结束后重启。
1 | sudo reboot |
重启后使用 nvidia-smi
查看驱动是否安装完成。
cuda安装
对于安装位置,若不同用户需要安装不同版本cuda,则安装在各自用户文件夹内,单用户情景下可直接使用 sudo 安装。
赋予cuda文件可执行权限并安装,由于已安装过驱动,所以在安装选项中取消驱动的勾选。
1 | sudo chmod a+x cuda_xxxxxxxx.run |
PyTorch安装
考虑到将来可能还会配置其余如 tensorflow 等环境,故使用 conda 组织包环境,但是由于考虑上的疏忽,第一次安装时使用了 miniconda ,在后续安装 python 库包 以及 python IDE 时,对依赖的安装产生了巨大的影响,以至于在安装IDE时不得已删除了整个conda环境。
假如是在完全离线的服务器上安装conda环境,建议使用 Anaconda ,其自带 Spyder 等IDE与诸多Python类库,方便后续安装。
赋予 Anaconda 安装文件执行权限并进行安装,推荐分用户安装,安装完成后允许 conda initializer 进行初始化。
1 | chmod a+x Anaconda3-xxxxxxxxx.sh |
创建 pytorch 虚拟环境,便于组织库包。
1 | conda create -n pytorch python pip |
PyTorch 依赖 Numpy 库,而后续安装的 pandas 等库包中一部分也依赖 Numpy,但其依赖的版本不一样,第一次安装时出现了冲突,且离线情况下会出现安装一个库提示依赖另一个库包,无限套娃。思考参考 apt 本地源,创建 pip 本地源。
由于第一次安装时尝试用 pip 安装依赖,然后用 conda 安装库包,处理依赖本地源时不需要把 pytorch/torchvision等包放进去,但后续实践表明完全可以一次性封装好,将pytorch与依赖库包放在一起用 pip 安装,没必要执着于 conda 安装,conda 自身离线源创建比较麻烦。
为了便于制作离线源,首先需要 requirements.txt 。
1 | charset-normalizer==2.1.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 | import torch |
若出现 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 | cd /usr/share/applications |
编辑 spyder3.desktop 文件。
1 | [Desktop Entry] |
赋予可执行权限。
1 | sudo chmod 777 spyder3.desktop |
此时,即可在桌面上直接点击使用 Spyder ,并可在 Spyder 中选择 PyTorch 环境作为 Python 环境。