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进行配置;set-as-default为可选参数,适用于某些场景(比方说K8S集成时,不希望集成nvidia-device-plugin)
nvidia-ctk runtime configure --runtime=docker --set-as-default
#配置完毕后重启docker
systemctl restart docker

3.1 使用docker-compose启动时的配置方法

修改docker-compose.yml

server:
    container_name: mmdetection
    build: .
    #主要增加这下面这段
    deploy:
      resources:
        reservations:
          devices:
             - driver: nvidia
               count: 1
               capabilities: [gpu]
    #按需追加,在某些环境下可能需要
    privileged: true

3.2 使用K8S的启动配置

从规范来说,应当设置nvidia.com/gpu,-1的话就是不限制,0就是不要,1就是要一块。

spec:
  containers:
  - name: container
    image: yourpod
    resources:
      limits:
        nvidia.com/gpu: 1
      requests:
        nvidia.com/gpu: 1

同时,安装官方的nvidia-device-plugin (导入一个daemonset的yaml)。

3.3 使用K8S的变种方案

从实际操作来看,因为我们整套使用了rancher,他的k8s本身是在容器中部署的,导致官方的device-plugin也无法找到gpu,这个陷入到了鸡和蛋的问题。此时,必须在前面的nvidia-ctk步骤中,启用set-as-default,即默认不是用runc 而是使用nvidia-container-runtime,那么上面3.2中提到的这些配置都不需要了,因为容器已经能调度到GPU资源了。

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上运行了

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐