1 前言
最近在研究AI,希望在容器内使用pytorch, 同时能够利用用到宿主机的GPU资源。
发现宿主机的cuda版本(11.4)和容器需要的(11.6)不一致,导致pytorch无法正常运行,因此决定升级。
*所有操作默认在root用户下进行
*本次操作基于龙蜥(Anolis OS) 8.2,和CentOS 8.X应该是一致的
2 升级cuda和Nvidia驱动
2.1 准备升级包
去Nvidia官网下载安装包。以11.6为例,官网网页。
建议选择runfile进行安装。
2.2 卸载旧版本
如果有安装旧版本,必选卸载nvidia,cuda可以不卸载(但是留着也没啥用了,所以建议一并卸载)
可以用lsmod确认本机是否已安装nvidia驱动。
$ lsmod | grep nvidia
nvidia_uvm 1171456 2
nvidia_drm 65536 0
nvidia_modeset 1155072 1 nvidia_drm
nvidia 39051264 159 nvidia_uvm,nvidia_modeset
drm_kms_helper 204800 2 nvidia_drm,i915
drm 540672 6 drm_kms_helper,nvidia,nvidia_drm,i915,ttm
i2c_core 77824 7 drm_kms_helper,i2c_algo_bit,igb,nvidia,i2c_i801,i915,drm
按下述方法进行卸载。
#卸载驱动
nvidia-uninstall
#卸载cuda
/usr/local/cuda/cuda-uninstaller
#重启机器,保证驱动从内核中剥离,当然理论上也可以用modprobe去卸载
reboot
2.3 安装新版本
这个时候就直接执行前面下载好的安装包,下一步到底即可
./cuda_11.6.0_510.39.01_linux.run
2.4 检查版本情况
$ nvidia-smi
Thu Mar 7 08:51:56 2024
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.39.01 Driver Version: 510.39.01 CUDA Version: 11.6 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Tesla T4 On | 00000000:01:00.0 Off | 0 |
| N/A 47C P8 17W / 70W | 2MiB / 15360MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------++-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
$ /usr/local/cuda/bin/nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Fri_Dec_17_18:16:03_PST_2021
Cuda compilation tools, release 11.6, V11.6.55
Build cuda_11.6.r11.6/compiler.30794723_0
3 安装NVIDIA Container Toolkit
正常情况下,前面步骤完成后,docker run时直接加上--gpus=all
启用GPU进入容器即可跳过此步骤。
但是如果该环境之前没在容器中跑过gpu,有可能会收到抛错:
$ docker run --rm --gpus=all -it pytorch/pytorch:1.13.0-cuda11.6-cudnn8-devel /bin/bash
could not select device driver "" with capabilities: [[gpu]]”
这是因为没有安装NVIDIA Container Toolkit导致的。需要安装才能在容器内支持GPU。
参考官方网页进行安装。
cd /etc/yum.repos.d/
wget --no-check-certificate https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo
#移除HTTPS安全检查避免证书问题
sed -i 's/sslverify=1/sslverify=0/g' nvidia-container-toolkit.repo
yum install -y nvidia-container-toolkit
#安装完成后按照要求,使用命令对docker的daemon.json进行配置
nvidia-ctk runtime configure --runtime=docker
#配置完毕后重启docker
systemctl restart docker
3.1 使用docker-compose启动时的配置方法
修改docker-compose.yml
server:container_name: mmdetectionbuild: .#主要增加这下面这段deploy:resources:reservations:devices:- driver: nvidiacount: 1capabilities: [gpu]#按需追加,在某些环境下可能需要privileged: true
4 进入容器检查情况
此时再次启动容器,能够正常启动
$ python3
Python 3.9.12 (main, Apr 5 2022, 06:56:58)
[GCC 7.5.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.cuda.is_available())
True
>>> print(torch.version.cuda)
11.6
>>> print(torch.cuda.device_count())
1
主要的测试均通过,此时device可以切换到cuda:0上运行了