记NVIDIA显卡A100在K8S POD中“Failed to initialize NVML: Unknown Error“问题解决

这篇具有很好参考价值的文章主要介绍了记NVIDIA显卡A100在K8S POD中“Failed to initialize NVML: Unknown Error“问题解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

记NVIDIA显卡A100在K8S POD中"Failed to initialize NVML: Unknown Error"问题解决

问题描述

因项目原因需要在k8s上跑GPU相关的代码,优选使用NVIDIA A100显卡,但在根据官方文档简单并部署GitHub - NVIDIA/k8s-device-plugin:适用于 Kubernetes 的 NVIDIA 设备插件后,出现了pod中GPU运行一段时间后丢失的问题,进入容器后发现nvidia-smi命令报错"Failed to initialize NVML: Unknown Error"。尝试删除并且重建容器后,刚开始nvidia-smi命令正常,但是在大约10秒过后,重复出现以上异常。

问题分析

对于出现的问题,github中有多人提到,如:

nvidia-smi command in container returns “Failed to initialize NVML: Unknown Error” after couple of times · Issue #1678 · NVIDIA/nvidia-docker · GitHub

“Failed to initialize NVML: Unknown Error” after random amount of time · Issue #1671 · NVIDIA/nvidia-docker · GitHub

通过讨论可以发现,我们的现象与其他人是相同的,该命令失效的原因为一段时间后,devices.list中丢失了GPU的设备(路径:/sys/fs/cgroup/devices/devices.list)

导致问题的原因为k8s的cpu管理策略为static,并且修改cpu的管理策略为none,该问题确实可以解决,建议对CPU管理策略研究没有那么严格时,操作到此即可。但是我们对于CPU的管理策略要求为static,所以我们继续追溯到github上以下issue。

Updating cpu-manager-policy=static causes NVML unknown error · Issue #966 · NVIDIA/nvidia-docker · GitHub

问题原因可以参考https://zhuanlan.zhihu.com/p/344561710

在https://github.com/NVIDIA/nvidia-docker/issues/966#issuecomment-610928514作者提到了解决方式,并且官方在几个版本之前提供了相关的解决方案,在部署官方插件的时候添加参数**–pass-device-specs=ture**,至此重新阅读官方部署文档,确实发现了相关参数的说明。但是在部署之后发现问题还是没有解决,再次阅读相关讨论,发现runc版本有限制(https://github.com/NVIDIA/nvidia-docker/issues/1671#issuecomment-1330466432),我们的版本为1.14,再次对runc降级后,该问题解决。

解决步骤

  1. 检查runc版本,如果版本小于1.1.3可以直接跳到第3步操作

    # runc -v
    runc version 1.1.4
    commit: v1.1.4-0-xxxxx
    spec: 1.0.2-dev
    go: go1.17.10
    libseccomp: 2.5.3
    
  2. 更新runc版本:

    • 下载指定版本的runc版本,本文下载的为1.1.2版本(https://github.com/opencontainers/runc/releases/tag/v1.1.2)

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yW8c0HGZ-1675244222972)(C:\Users\jia\AppData\Roaming\Typora\typora-user-images\image-20230201155651434.png)]

    • 将下载好的runc.amd64文件上传到服务器、修改文件名并赋权

      mv runc.amd64 runc && chmod +x runc
      
    • 备份原有的runc

    mv /usr/bin/runc /home/runcbak
    
    • 停止docker

      systemctl stop docker
      
    • 替换新版本runc

      cp runc /usr/bin/runc
      
    • 启动docker

      systemctl start docker
      
    • 检查runc是否升级成功

      # runc -v
      runc version 1.1.2
      commit: v1.1.2-0-ga916309f
      spec: 1.0.2-dev
      go: go1.17.10
      libseccomp: 2.5.3
      
  3. 安装NVIDIA GPU插件

    • 创建plugin.yml,该yaml文件中跟普通部署的区别主要为PASS_DEVICE_SPECS

      # 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
              name: nvidia-device-plugin-ctr
              env:
                - name: FAIL_ON_INIT_ERROR
                  value: "false"
                - name: PASS_DEVICE_SPECS
                  value: "true"
              securityContext:
                privileged: true
              volumeMounts:
              - name: device-plugin
                mountPath: /var/lib/kubelet/device-plugins
            volumes:
            - name: device-plugin
              hostPath:
                path: /var/lib/kubelet/device-plugins
      
    • 创建插件

      $ kubectl create -f plugin.yml
      
  4. 创建GPU POD并且验证

SEO切换cpu管理策略

  1. 关闭kubelet

    systemctl stop kubelet
    
  2. 删除cpu_manager_state

    rm /var/lib/kubelet/cpu_manager_state
    
  3. 修改config.yaml

    vi /var/lib/kubelet/config.yaml
    
    apiVersion: kubelet.config.k8s.io/v1beta1
    authentication:
      anonymous:
        enabled: false
      webhook:
        cacheTTL: 0s
        enabled: true
      x509:
        clientCAFile: /etc/kubernetes/pki/ca.crt
    authorization:
      mode: Webhook
      webhook:
        cacheAuthorizedTTL: 0s
        cacheUnauthorizedTTL: 0s
    cgroupDriver: systemd
    clusterDNS:
    - 10.96.0.10
    clusterDomain: cluster.local
    
    # 修改cpu管理策略,none或者static
    cpuManagerPolicy: static
    
    cpuManagerReconcilePeriod: 0s
    evictionPressureTransitionPeriod: 0s
    featureGates:
      TopologyManager: true
    fileCheckFrequency: 0s
    healthzBindAddress: 127.0.0.1
    healthzPort: 10248
    httpCheckFrequency: 0s
    imageMinimumGCAge: 0s
    kind: KubeletConfiguration
    logging: {}
    memorySwap: {}
    nodeStatusReportFrequency: 0s
    nodeStatusUpdateFrequency: 0s
    podPidsLimit: 4096
    reservedSystemCPUs: 0,1
    resolvConf: /run/systemd/resolve/resolv.conf
    rotateCertificates: true
    runtimeRequestTimeout: 0s
    shutdownGracePeriod: 0s
    shutdownGracePeriodCriticalPods: 0s
    staticPodPath: /etc/kubernetes/manifests
    streamingConnectionIdleTimeout: 0s
    syncFrequency: 0s
    tlsCipherSuites:
    - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
    - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
    - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
    tlsMinVersion: VersionTLS12
    topologyManagerPolicy: best-effort
    volumeStatsAggPeriod: 0s
    
  4. 启动kubelet

    systemctl start kubelet
    

变更containerd版本

https://github.com/NVIDIA/nvidia-docker/issues/1671#issuecomment-1238644201

参考https://blog.csdn.net/Ivan_Wz/article/details/111932120

  1. github下载二进制containerd(https://github.com/containerd/containerd/releases/tag/v1.6.16)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J2Du8dbI-1675244222972)(C:\Users\jia\AppData\Roaming\Typora\typora-user-images\image-20230201172032663.png)]

  2. 解压containerd

    tar -zxvf containerd-1.6.16-linux-amd64.tar.gz 
    
  3. 检查当前containerd版本

    docker info 
    containerd -v
    
  4. 暂停docker

    systemctl stop docker
    
  5. 替换containerd二进制文件

    cp containerd /usr/bin/containerd
    cp containerd-shim /usr/bin/containerd-shim
    cp containerd-shim-runc-v1 /usr/bin/containerd-shim-runc-v1
    cp containerd-shim-runc-v2 /usr/bin/containerd-shim-runc-v2
    cp ctr /usr/bin/ctr
    
  6. 重启docker 检查containerd版本是否替换成功文章来源地址https://www.toymoban.com/news/detail-477277.html

到了这里,关于记NVIDIA显卡A100在K8S POD中“Failed to initialize NVML: Unknown Error“问题解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 清理k8s集群Evicted,Failed的Pod!

    简介:不知知道各位是如何清理的,我尝试过用阿里的任何一个面板清理,但是还要换页就很烦,所以自己就写了一个小脚本,更GOOD!的是你还可以把他放到你的定时任务里面去,为啥要这么做,不得不说,咱的集群有点小垃圾,不过那也没办法,集群也不敢动,谁知道啥时

    2024年02月20日
    浏览(39)
  • k8s pod启动报错: no route to host

    查看pod命令 查看报错pod日志 命令: pod报错都一样: no route to host 原因: 找不到这个路由对应的地址,关闭防火墙,重启k8s,执行下面命令即可。 正常线上是不能关闭防火墙,这个属于pod内部之间的host调用失败,有大神知道的这种情况怎么处理的, 可以在评论区告知一下,

    2024年02月13日
    浏览(49)
  • failed to get sandbox image “k8s.gcr.io/pause:3.6“: failed to pull image “k8s.gcr.io/pause:3.6“

    从日志能够看到k8s核心服务的pod创建失败,因为获取pause镜像失败,总是从k8s.gcr.io下载。 经过确认,k8s 1.26中启用了CRI sandbox(pause) image的配置支持。 之前通过kubeadm init –image-repository设置的镜像地址,不再会传递给cri运行时去下载pause镜像 而是需要在cri运行时的配置文件中设

    2024年02月16日
    浏览(50)
  • k8s 启动 elasticsearch 失败: [failed to bind service]

    具体的错误信息 k logs -f elasticsearch-0 -n kube-system 排查最后导致启动失败的原因是,我的 elasticsearch 使用到了 pv、pvc 来做持久化存储,但是 elasticsearch 对我的挂载目录没有执行权限。 chmod 777 elasticsearch 之后重启 pod 即可。

    2024年02月15日
    浏览(62)
  • Kubernetes Pod报错 filed to get sandbox image “k8s.gcr.io/pause:3.6“

            最近工作中在部署Pod后发现无法正常启动,查看Pod详情后看到以下报错信息:         问题的原因是因为调度的这台服务器上没有 k8s.gcr.io/pause:3.6 镜像,所以我们把镜像下载到这台服务器就可以了,执行命令:         到此 Kubernetes Pod报错 filed to get sandbox image

    2024年02月16日
    浏览(48)
  • k8s服务突然中断重启原因排查-eviction manager: must evict pod(s) to reclaim memory

    20230512早上9点半左右,服务突然中断造成产品不可用。 1.时间端内有占用大内存操作,定时任务,造成内存溢出或者探针失败重启 2.时间段内业务高峰,内存溢出或探针失败重启 3.kafka大量失败造成应用重启。那么kafka失败原因排查 首先查看 pod状态: 所有pod都有一次重启记录

    2024年02月15日
    浏览(50)
  • 解决k8s node节点报错: Failed to watch *v1.Secret: unknown

    现象:  这个现象是发生在k8s集群证书过期,重新续签证书以后。 记得master节点的/etc/kubernetes/kubelet.conf文件已经复制到node节点了。 但是为什么还是报这个错,然后运行证书检查命令看一下:   看样子是差/etc/kubernetes/pki/apiserver.crt文件。 但是从master节点scpapiserver.crt文件以

    2024年01月16日
    浏览(49)
  • kubeadm init:failed to pull image registry.k8s.io/pause:3.6

    错误信息: Unfortunately, an error has occurred:         timed out waiting for the condition This error is likely caused by:         - The kubelet is not running         - The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled) If you are on a systemd-powered system, you can try to troubleshoot

    2024年02月14日
    浏览(54)
  • kubeadm init [ERROR ImagePull]: failed to pull image registry.k8s.io 解决方法

    ** https://blog.itwk.cc 由于国内网络原因,kubeadm init部署集群会卡住不动,,报错如下: error execution phase preflight: [preflight] Some fatal errors occurred: [ERROR ImagePull]: failed to pull image registry.k8s.io/kube-apiserver:v1.25.6: output: E0124 00:28:25.369652 3299 remote_image.go:171] “PullImage from image service failed”

    2024年02月11日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包