2023年8月16日更新,经历环境配置、维护的痛苦才知道docker有多香,建议测试开发使用docker完成,在深度学习这一块,docker可以打包任意版本的cuda和cudnn镜像,各种包版本都可以在容器中操作。宿主机上只需要安装nvidia驱动和nvidia-container-toolkit。
图形界面安装
内网PC工作站用于跑模型
图形界面安装一般不需要额外安装网卡等驱动,gcc版本默认9.4,网络可使用图形界面配置。
安装系统
本人使用的UltraSO制作系统盘,网上教程很多。
配置root用户登录
配置root用户方便操作,但是最高权限也可能导致一些问题,按需配置。
- 最小化安装下,创建系统时的用户登录后,直接为root设置密码后root可正常登录。
- 图形界面下,需要以下几步
-
为root设置密码
sudo passwd root
-
修改/etc/gdm3/custom.conf,在[daemon]配置项下添加
AllowRoot=true
-
修改/etc/pam.d/gdm-password,注释掉该行
auth required pam_succeed_if.so user != root quiet_success
-
重启
-
更换apt源
相比以前,最近安装ubuntu默认的源已经不慢了,按需替换apt源,如果是在内网,则必做此步。
cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 按照sources.list内容和目标源更改即可
sed -i 's/cn.archive.ubuntu.com\/ubuntu/10.160.8.81:8081\/repository\/ubuntu-aliyun/g' /etc/apt/sources.list
更新软件
默认情况下,ubuntu20.04 Linux内核是5.15.0-76,截至2023年8月15日,更新后内核为5.15.0-79
apt-get update
apt-get upgrade
安装Nvidia-driver、CUDA、CUDNN
本人首次配置踩了各种坑,包括系统、驱动等,个人踩过太多的坑,网上许多博客只能参考,每个人的情况都不一样,最靠谱的还是官方文档,这里贴出官方的安装教程。
Nvidia-driver和CUDA官方安装教程
cuDNN官方安装教程
有两种两种方式,特定发行的软件包(deb和rpm)和独立的软件包(runfile),前者自带了所有依赖,但容易与ubuntu软件源的包版本发生冲突,因为不会同步更新,后者的各种依赖包与ubuntu软件源同步,官方建议按后者方式安装。
注意,安装driver和安装驱动最好使用同一种方式,即都用deb包或者都是用runfile方式!
安装前准备
lspci | grep -i nvidia
查看显卡设备,查看是否支持cuda- gcc、linux内核版本等,ubuntu20.04不存在此问题
- 如果之前安装过,请卸载干净并重启,如何卸载请看下文。
deb包安装方式
下载自己需要的 CUDAdeb包,local或者network(内网的话下载local),然后参考下载页面的安装指示完成安装,更详细的步骤可以参考官网的安装指示
安装驱动
# sudo apt-get install cuda-drivers-<branch>
# 安装418版本的驱动
sudo apt-get install cuda-drivers-418
这种安装驱动的方式本人没有尝试过,网上也几乎没有见到过,不确定能否成功,更详细的指示可以参考官网,安装完记得重启。
runfile安装方式
首先贴上官网链接,本人安装过程中碰到的很多问题多源于自己没有认真看官网文档,或者说懒得看英文,碰到问题没法解决了才去认真读官方文档。官网runfile安装方式,前几段话就说明了RunFile安装是通过基于交互式NCURSES的接口安装NVIDIA驱动程序和CUDA工具包,安装步骤指引、禁用Nouveau驱动、安装后的附加操作、如何卸载以及CUDA跨平台等内容,直接看官网文档可以少走很多弯路。
安装前准备
准备工作同上
禁用Nouveau驱动
创建/etc/modprobe.d/blacklist-nouveau.conf
并再末尾加入以下内容
blacklist nouveau
options nouveau modeset=0
执行命令
sudo update-initramfs -u
这样就禁用ubuntu默认的开源驱动程序了。
重启
禁用驱动需要重启才能生效,本人在没看文档之前,是直接重启的,也没碰到问题。
但是按照官网的指示,禁用开源驱动Nouvea后,修改linux内核启动参数,设置runlevel为3(多用户字符界面),不加载任何图形驱动重启系统,修改/etc/default/grub
,找到下面这行,末尾添加nomodeset(不加载任何图像驱动)和3(runlevel为3)。
GRUB_CMDLINE_LINUX_DEFAULT=“quiet nomodeset 3”
执行
update-grub
reboot
在安装驱动的过程中如果碰到图形界面无法正常显示,开机一直黑屏的情况下,可以进入ubuntu的安全恢复模式(重启ubuntu,电脑品牌logo出现后随即长按shirft菜单,选择第二个选项 Advanced options for Ubuntu,然后进入下一个界面,选recovery mode),修改这个文件如上所示,然后update-grub并重启,即可正常开机进入字符界面,重新安装驱动。
安装cuda
执行
sudo sh cuda_<version>_linux.run
然后弹出几个选项,可选择连带driver一起安装,也可以单独安装driver,如果在这里不选择安装驱动,请确保在这之前驱动已经安装。安装完驱动和cuda之后,还原/etc/default/grub
文件,然后重启。
英伟达显卡驱动下载 ,安装驱动时会有警告和几个选项
- 如果之前安装过,会确认是否继续安装,确认
- 是否向 kernel 注册 dkms 模块,是,防止内核更新导致驱动的重新安装
- 是否安装32位兼容库,一般选否
- 是否安装opengl文件,一般选否
- xconfig,本人选的是
添加环境变量
vim ~/.bashrc
export PATH=$PATH:/usr/local/cuda-X.Y/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-X.Y/lib
export CUDA_HOME=/usr/local/cuda-X.Y
执行source ~/.bashrc
cudnn安装
apt-get install zlib1g
apt-get install ./下载的cudnn.deb文件
cp /var/cudnn-local-repo-*/cudnn-local-*-keyring.gpg /usr/share/keyrings/
apt-get update
apt search
会看到libcudnn,libcudnn-dev,libcudnn-samples三个包,分别是运行时库,开发库,示例和测试代码,正常情况下安装libcudnn即可。
sudo apt-get install libcudnn8=${cudnn_version}-1+${cuda_version}
sudo apt-get install libcudnn8-dev=${cudnn_version}-1+${cuda_version}
sudo apt-get install libcudnn8-samples=${cudnn_version}-1+${cuda_version}
测试安装是否成功
- nvidia-smi查看驱动是否安装成功,显示的cuda版本表示最高支持的cuda。
- nvcc -V查看cuda版本,下载适配版本的pytorch验证是否可调用cuda库。
- 安装libcudnn-samples测试cudnn是否成功,如何测试请参考文档。
驱动和CUDA卸载
- runfile安装方式
sudo /usr/local/cuda-X.Y/bin/cuda-uninstaller
sudo /usr/bin/nvidia-uninstall
- deb包安装方式
sudo apt-get --purge remove "*cuda*" "*cublas*" "*cufft*" "*cufile*" "*curand*" \
"*cusolver*" "*cusparse*" "*gds-tools*" "*npp*" "*nvjpeg*" "nsight*" "*nvvm*"
sudo apt-get --purge remove "*nvidia*" "libxnvctrl*"
sudo apt-get autoremove
其他
非必要,本人在此一起记录下
SSH服务,远程需要
- 安装ssh
apt-get install ssh
- 配置root允许登录
vim /etc/ssh/sshd_config # PermitRootLogin yes # 修改后重启sshd服务
- 设置开机自启
systemctl enable ssh
- 启动ssh服务
systemctl start ssh
cuda容器运行环境,docker需要
官方安装教程
nvidia-container-toolkit用于在容器中使用NVIDIA GPU,包括一个容器运行时库和实用程序。
容器中有应用程序和cuda,通过docker和nvidia-container-toolkit与宿主机的nvidia driver联系,然后使用显卡。
这里以docker运行环境为例,安装nvidia-container-toolkit。
- 安装docker
- 安装软件源和CPG Key
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
- 更新并安装
apt-get update
apt-get install -y nvidia-container-toolkit
如果是内网环境下,需要下载nvidia-container-toolkit的所有依赖拷贝到内网并apt-get install *.deb
,下面是下载某包及其依赖的命令。
apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends nvidia-container-toolkit | grep -v i386 | grep "^\w")
- 设置docker nvidia运行时环境
- 命令行配置
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
- 配置文件
vim /etc/docker/daemon.json
,添加如下内容
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
重新加载配置,重启docker
systemctl daemon-reload
systemctl restart docker
- 测试
# --gpus all 所有显卡可用
# --gpus device=1 第二块显卡可用
# --gpus device=0,1 第一块和第二块显卡可用
docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.8.0-runtime-ubuntu20.04 nvidia-smi
出现nvidia-smi命令的执行结果表示安装成功
- nvidia/cuda docker仓库
nvidia/cuda仓库地址
里面有各版本的已经打好的cuda和cudnn镜像,每个cuda版本对应有三种镜像
- base
cuda运行时环境 - runtime
从base打包而来,包括cuda数学库、NCCL和cudnn。一般我们拉runtime镜像即可。 - devel
从runtime打包而来,包括一些头文件和cuda开发工具,需要依赖做额外的开发,可以拉取这个镜像。
- 自己打包nvidia/cuda镜像
克隆官方的git仓库
到docker hub创建账户,并新建一个存储库
# 登录docker
docker login -u windcf
cd cuda
# 打包windcf/cuda:11.8.0-ubuntu20.04镜像,x86_64
# --push推送到docker hub
# --load保存为本地镜像
./build.sh -d --image-name windcf/cuda --cuda-version 11.8.0 --os ubuntu --os-version 20.04 --arch x86_64 --push
docker hub结果
编译安装指定Python版本
ubuntu20.04默认安装的python是3.8.10,如需安装其他版本,可自行下载源码编译。
以安装python3.10.12为例
# 安装依赖
apt update
apt install wget build-essential libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev
# python源码
wget https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tgz
# 解压
tar -xzvf Python3.10.12.tgz
# 编译
cd Python-3.10.12/
./configure --prefix=/usr/local/python310 --enable-optimizations
make -j4
# 安装
make altinstall
安装完之后python、pip等可执行程序在/usr/local/python310/bin
目录下,本人没有覆盖默认的python,使用时注意路径即可。
如果需要设置为默认的python,执行
sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/python310/bin/python3.10 110
sudo update-alternatives --config python3
卸载新安装的python
# 卸载
# 如果没有删除源代码目录
sudo make uninstall
# 已删除源代码目录
cd /usr/local/python310/bin && rm -f sudo rm -f 2to3 2to3-3.11 idle3 idle3.11 pip pip3 pip3.10 pip3.11 pydoc3 pydoc3.11 python3 python3.11 python3.11-config python3-config
配置中文输入法
防火墙配置
ubuntu下iptables配置的规则重启后失效,系统自带了ufw命令配置防火墙,配置命令简单易懂。
使用ufw配置后都会在iptables上体现,重启后有效。
一些心得总结
安装驱动和cuda其实挺简单的,内网可能稍微麻烦点,但本人还是碰到了各种各样的问题,安装完后PC工作站使用一段时间又会卡死,工作站又放在机房,每次重启很麻烦。找不到卡死的原因,推测是驱动的问题,又卸载重装,来来回回遇到很多问题,在这里统一记录下。
- 关闭系统休眠
- 关闭自动更新
- 包冲突错误解决
在安装各种包的过程中多次遇到版本冲突,apt install --fix-broken
无法解决,所有的apt install
都不执行,解决办法是使用apt下载需要的包,使用dpkg -i --force-overwrite deb_name
强制覆盖安装。 - 内网安装外网包
有些包不在ubuntu软件源中,必须要联网下载,本人在外网电脑创建一个和内网软件环境一样的虚拟机,需要连接外网下载的包现在虚拟机中下载后拷贝到内网,主要有两种包。- deb包,使用上面提到的下载包及其依赖的命令在外网虚拟机下载后拷贝到内网,
apt-get install *.deb
- python包,有些包也不再pypi源,比如pytorch某些版本,某些包必须从源码编译等,外网使用
pip download
,拷贝到内网pip install *.whl
,也可以将文件上传到内网Nexus Pypi源。
- deb包,使用上面提到的下载包及其依赖的命令在外网虚拟机下载后拷贝到内网,
- 官方文档
最小化安装
ubuntu server识别不到网卡
安装系统后,使用ip a命令发现只有lo本地回环,识别不到网卡,网上搜了挺久并不能解决问题。
猜测应该是缺了网卡驱动,毕竟网卡较新而操作系统较老且是最小化安装,可能并没有带驱动,需要自己下载安装。
lspci查看自己的网卡,结合主板等信息去外网下载对应驱动,拷贝到内网中。本人下载的是RTL8125,安装驱动需要gcc、make等依赖,最小化安装这些都是没有的,需要手动离线安装。
ubuntu server离线安装gcc等依赖
手动下载了ubuntu server离线gcc、make等及其依赖,链接如下
链接:https://pan.baidu.com/s/1sK73grxfqokv0hADUS0DWg?pwd=dqz8
提取码:dqz8
解压后直接dpkg -i *.deb即可,默认ubuntu上好像没unzip命令。
记录一下直接下载某包及其依赖的命令
apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends libasan5:amd64 | grep -v i386 | grep "^\w")
ubuntu server配置网络
如果安装的是桌面版,可以选择图形化界面配置。
20.04最小化版本配置网络已不再/etc/network/interface中,而在/etc/netplan/xxxx.yaml中,以下是一个配置示例,ipv6相关配置改4为6即可。
# This is the network config written by 'subiquity'
network:
ethernets:
ens32:
dhcp4: no
addresses: [192.168.8.6/24]
optional: true
gateway4: 192.168.8.2
nameservers:
addresses: [192.168.8.2]
version: 2
renderer: networkd
参考
Ubuntu20.04下CUDA、cuDNN的详细安装与配置过程
Q.E.D.