记一次“nvidia-smi”在容器中映射GPU资源时的排错

这篇具有很好参考价值的文章主要介绍了记一次“nvidia-smi”在容器中映射GPU资源时的排错。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.背景

在云渲染容器组pod中,有xx,xx,xx,unity四个container容器组成,然后因为unity容器镜像的构成是基于vlukan(cudagl相关)和cuda-base打包的,这里的cuda是nvidia的一个驱动版本,类似显卡驱动。现象是启动unity容器后无法运行nvidia-smi和vlukaninfo
初步排查:
因为容器化运行需要依赖宿主机的GPU机器资源,需要宿主机有nvidia驱动且容器能正常映射到宿主机资源。
最后定位到容器中nvidia-smi未输出任何信息,是由于nvidia-container-toolkit组件未将GPU设备挂载到容器中,组件中的nvidia-container-runtime无法被containerd管理和使用。

2.部署

2.1.宿主机上部署nvidia驱动

  • 选择操作系统和安装包,单机下载驱动版本,访问官网下载
    记一次“nvidia-smi”在容器中映射GPU资源时的排错
  • 在宿主机上执行安装
chmod a+x NVIDIA-Linux-x86_64-460.73.01.run && ./NVIDIA-Linux-x86_64-460.73.01.run --ui=none --no-questions
  • 宿主机验证是否安装成功,执行nvidia-smi,输出下图则安装成功
    记一次“nvidia-smi”在容器中映射GPU资源时的排错
  • cuda驱动安装
    • 备注:此操作已经在打包的容器镜像中安装,可以跳过执行
    • 可以在官网下载驱动版本
      记一次“nvidia-smi”在容器中映射GPU资源时的排错
  • 添加nvidia-docker仓库且安装工具包nvidia-container-toolkit
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) 
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo 
yum install -y nvidia-container-toolkit
  • 安装x,可视化桌面
    • 修改/etc/X11/xorg.conf中的pci序列号和nvidia-smi中的序列号一样
    • 运行gdm服务

2.2.k8s容器中部署驱动

  • 集群中部署nvidia gpu设备插件
kubectl apply -f https://github.com/NVIDIA/k8s-device-plugin/blob/main/nvidia-device-plugin.yml
# Copyright (c) 2019, NVIDIA CORPORATION.  All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nvidia-device-plugin-daemonset
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: nvidia-device-plugin-ds
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        name: nvidia-device-plugin-ds
    spec:
      tolerations:
      - key: nvidia.com/gpu
        operator: Exists
        effect: NoSchedule
      # Mark this pod as a critical add-on; when enabled, the critical add-on
      # scheduler reserves resources for critical add-on pods so that they can
      # be rescheduled after a failure.
      # See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/
      priorityClassName: "system-node-critical"
      containers:
      - image: nvcr.io/nvidia/k8s-device-plugin:v0.13.0-rc.1
        name: nvidia-device-plugin-ctr
        env:
          - name: FAIL_ON_INIT_ERROR
            value: "false"
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop: ["ALL"]
        volumeMounts:
        - name: device-plugin
          mountPath: /var/lib/kubelet/device-plugins
      volumes:
      - name: device-plugin
        hostPath:
          path: /var/lib/kubelet/device-plugins
  • 进入容器untiy测试执行,nvidia-smi
  • 或者直接用containerd命令行ctr测试
ctr images pull docker.io/nvidia/cuda:9.0-base

ctr run --rm -t --gpus 0 docker.io/nvidia/cuda:9.0-base nvidia-smi
nvidia-smi

3.问题排查

3.1.方向一sealos节点加入集群后,提示错误

  • 在宿主机配置完后,sealos加入集群
[root@iZbp1329l07uu7gp2xxijhZ ~]# sealos join --node xx.xx.xx.xx
15:26:33 [EROR] [check.go:91] docker exist error when kubernetes version >= 1.20.
sealos install kubernetes version >= 1.20 use containerd cri instead. 
please uninstall docker on [[10.0.1.88:22]]. For example run on centos7: "yum remove docker-ce containerd-io -y",  
see details:  https://github.com/fanux/sealos/issues/582
  • 因为之前在加入集群之前,安装了docker-ce进行测试,和kubernetes下载的运行时containerd相冲突,根据提示需要将这些删除
  • 根据官网安装步骤
    • 更新yum源并添加源
    • 安装docker-ce
    • 安装nvidia container tookit,参见宿主机安装过程
    • 安装nvidia-docker2
    • 验证,容器内是否能映射到gpu资源
yum update -y
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce -y
systemctl --now enable docker
yum clean expire-cache
yum install -y nvidia-docker2
systemctl restart docker
docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi

结论:
这里是在加入集群k8s之前的操作,安装了docker-ce和container-io,需要先卸载,然后在sealos加入集群后,在去安装nvidia-docker2

3.2.方向二集群k8s容器守护进程containerd未加载插件和docker启动错误

  • 在加入容器后,修改daemon.json后docker容器报错
[root@al-media-other-03 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: failed (Result: start-limit) since Tue 2022-11-15 17:29:31 CST; 7s ago
     Docs: https://docs.docker.com
  Process: 17379 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE)
 Main PID: 17379 (code=exited, status=1/FAILURE)

Nov 15 17:29:28 al-media-other-03 systemd[1]: Failed to start Docker Application Container Engine.
Nov 15 17:29:28 al-media-other-03 systemd[1]: Unit docker.service entered failed state.
Nov 15 17:29:28 al-media-other-03 systemd[1]: docker.service failed.
Nov 15 17:29:31 al-media-other-03 systemd[1]: docker.service holdoff time over, scheduling restart.
Nov 15 17:29:31 al-media-other-03 systemd[1]: Stopped Docker Application Container Engine.
Nov 15 17:29:31 al-media-other-03 systemd[1]: start request repeated too quickly for docker.service
Nov 15 17:29:31 al-media-other-03 systemd[1]: Failed to start Docker Application Container Engine.
Nov 15 17:29:31 al-media-other-03 systemd[1]: Unit docker.service entered failed state.
Nov 15 17:29:31 al-media-other-03 systemd[1]: docker.service failed.
  • 参考官网,修改daemon.json,然后重新启动docker
{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
  • 在节点加入集群后的,containerd的配置文件不能加载nvidia-container-runtime
  • 参考如上官网地址,先执行containerd config default >
    /etc/containerd/config.toml初始化containerd配置项,然后修改添加/etc/containerd/config.toml如下,runc修改成nvidia,同时添加plugin加载信息,然后在重启containerd
version = 2
[plugins]
  [plugins."io.containerd.grpc.v1.cri"]
    [plugins."io.containerd.grpc.v1.cri".containerd]
      default_runtime_name = "nvidia"

      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
          privileged_without_host_devices = false
          runtime_engine = ""
          runtime_root = ""
          runtime_type = "io.containerd.runc.v2"
          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
            BinaryName = "/usr/bin/nvidia-container-runtime"

结论:
需要修改docker和containerd的配置文件,让nvidia-container-runtime可以运行时加载

3.3.方向三nvidia-plugin容器log日志报错

  • 前面容器部署驱动yaml的时候,查看pod日志有报错
[root@al-master-01 ~]# kubectl logs nvidia-device-plugin-daemonset-4qdqw -n kube-system
2022/11/15 03:43:58 Loading NVML
2022/11/15 03:43:58 Failed to initialize NVML: could not load NVML library.
2022/11/15 03:43:58 If this is a GPU node, did you set the docker default runtime to `nvidia`?
2022/11/15 03:43:58 You can check the prerequisites at: https://github.com/NVIDIA/k8s-device-plugin#prerequisites
2022/11/15 03:43:58 You can learn how to set the runtime at: https://github.com/NVIDIA/k8s-device-plugin#quick-start
2022/11/15 03:43:58 If this is not a GPU node, you should set up a toleration or nodeSelector to only deploy this plugin on GPU nodes
  • 这里根据官网搜索是因为未加载nvidia-container-runtime,暂未解决
  • 在deployment.yaml中设置了pod选择nodeSelector独占式使用GPU节点,已经可以在容器内运行nvidia-smi和vlukaninfo
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cuda-vector-add
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cuda-vector-add
  template:
    metadata:
      labels:
        app: cuda-vector-add
    spec:
      nodeSelector:
        node-scope: gpu-node
      imagePullSecrets:
        - name: xxx
      containers:
      	- name: cuda-vector-add
      		image: "k8s.gcr.io/cuda-vector-add:v0.1"
        	imagePullPolicy: IfNotPresent

关注微信公众号
搜索:布鲁斯手记文章来源地址https://www.toymoban.com/news/detail-435214.html

到了这里,关于记一次“nvidia-smi”在容器中映射GPU资源时的排错的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【已解决】nvidia-smi报错:NVIDIA-SMI has failed because it couldn’t communicate with the ... 阿里云GPU服务器

    如题,起因是在阿里云GPU服务器上,使用原先正常运行的镜像生成了容器,但容器的显卡驱动出问题了,使用nvidia-smi命令会报错 NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver. 尝试使用官网.run文件重新安装显卡驱动会报错ERROR: Unable to load the kernel module ‘nvidia

    2024年02月11日
    浏览(39)
  • nvidia/cuda doker容器使用nvidia-smi不能找到命令

    参考资料 NVIDIA官方安装文档 CSDN博客 运行环境 wsl子系统Ubuntu 20.04 docker19.03以上 问题:使用docker pull nvidia/cuda:11.4.2-cudnn8-runtime-rockylinux8 在容器中使用nVidia-smi 出现命令无法找到的问题 百度好久,看了几篇文章,最后发现运行cuda的容器不支持调用主机的显卡,需要下载nvidia-

    2023年04月08日
    浏览(47)
  • NVIDIA-SMI报错:Unable to determine the device handle for GPU 0000:XX:00.0: Unknown Error

    1、首先使用nvidia-smi监管显卡信息:  具体关于nvidia-smi的介绍和使用请参照: nvidia-smi 命令详解_蒙娜丽莎的Java的博客-CSDN博客 nvidia-smi - NVIDIA System Management Interface programnvidia smi(也称为NVSMI)为来自 Fermi 和更高体系结构系列的 nvidia Tesla、Quadro、GRID 和 GeForce 设备提供监控和管

    2024年02月01日
    浏览(48)
  • 在docker里使用gpu的解决方案(镜像内安装驱动使用nvidia-smi后显示Failed to initialize NVML: Driver/library version mismatch)

    要么在docker环境内安装nvidia-driver 但容易和外面的版本不一致导致各种报错version mismatch之类的 不如使用nvidia-docker,这是一个nVidia官方为了方便在docker镜像容器内使用gpu做的包: 1. 保证docker环境内没有nvidia驱动程序,防止后续配置出现驱动版本不一致的情况         找到你要

    2024年01月21日
    浏览(47)
  • Linux | nvidia-smi 命令使用记录

    参考文章链接:https://blog.csdn.net/weixin_44966641/article/details/121228579 nvidia smi(也称为NVSMI)为来自 Fermi 和更高体系结构系列的 nvidia Tesla、Quadro、GRID 和 GeForce 设备提供监控和管理功能。GeForce Titan系列设备支持大多数功能,为GeForce品牌的其余部分提供的信息非常有限。NVSMI是一种

    2024年02月02日
    浏览(47)
  • nvidia-smi报错(已解决):NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver 原因分析

    基本是follow下面教程修复的 nvidia-smi报错:NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver 原因及避坑解决方案_打拳的土豆的博客-CSDN博客 1 背景分析: 可能是由于断电重启造成的 当再次跑实验时,发现cuda不可用,于是输入“nvidia-smi”才发现了一个错误,如下:

    2024年02月09日
    浏览(84)
  • 矩池云上使用nvidia-smi命令教程

    nvidia-smi全称是NVIDIA System Management Interface ,它是一个基于NVIDIA Management Library(NVML)构建的命令行实用工具,旨在帮助管理和监控NVIDIA GPU设备。 接下来我介绍一下,用nvidia-smi命令来查询机器GPU使用情况的相关内容。​ 我以上图的查询内容为例,已经复制出来了,如下, 我们来

    2024年02月16日
    浏览(44)
  • 深度学习烦人的基础知识(2)---Nvidia-smi功率低,util高---nvidia_smi参数详解

    如下图所示,GPU功率很低,Util占用率高。 这个训练时不正常的! Pwr是指GPU运行时耗电情况,如图中GPU满载是300W,目前是86W与GPU2的空载情况功率相等。说明GPU没有在真正运行。 GPU-Util高说明它的核心被占用了,占用率为100%。 打个比方,把GPU看做是人。三个人,一个在举重,

    2024年01月16日
    浏览(38)
  • Ubuntu下nvidia-smi失败,使用dkms解决

    nvidia-smi显示无法与驱动通讯 一般来说是因为机器重启linux内核自动更新导致,可以尝试回退内核版本,或者使用dkms安装该内核下驱动配套的包,这里主要介绍使用dkms如何处理 查看已安装的nvidia驱动版本 显示 说明我电脑上nvidia驱动的版本是nvidia-525.116.04 安装dkms和相关包 安

    2024年02月13日
    浏览(36)
  • nvidia-smi no devices were found

    报错:找不到设备 输入 发现显卡其实还在 用NVIDIA-Linux-x86_64-xxx.xxx.run重装了一下显卡驱动,发现还是不行 最后用了另一种安装方式 选择一个 比如选择了525,那就是 安装完了其实还是找不到设备,所以需要重启 然后就好了 参考 https://blog.csdn.net/dujianghai/article/details/125760522

    2024年02月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包