本文介绍了GPU常见问题,包括性能优化、驱动安装和故障排除等方面的详细解答。
阿里云容器服务是否支持GPU虚拟化型(vGPU)实例?
vGPU实例需要购买NVIDIA官方提供的GRID License才能正常工作,而阿里云并不提供License服务器。因此即使您创建了GPU虚拟化集群,vGPU实例也无法使用。因此,阿里云容器服务已不再支持在控制台选择vGPU实例作为集群节点。
不支持的vGPU实例包括以ecs.vgn5i、ecs.vgn6i、ecs.vgn7i、ecs.sgn7i为前缀的ECS实例。如果需要使用vGPU实例,请向NVIDIA购买GRID License并自建License服务器。
更新ACK集群中vGPU实例的NVIDIA驱动License时,需要使用License服务器。
购买ECS实例并参考NVIDIA官网教程搭建License服务器。更多信息,请参见NVIDIA。
如果您的License服务器已经搭建完成,请参考以下步骤将vGPU实例加入ACK集群。
将vGPU实例加入ACK集群
请前往权益配额,申请开放自定义系统镜像功能。
基于CentOS 7.X和Alibaba Cloud Linux 2制作自定义系统镜像,镜像中需要安装NVIDIA GRID驱动并且正确配置GRID License。具体操作,请参见使用实例创建自定义镜像和在GPU虚拟化型实例中安装GRID驱动(Linux)。
创建节点池。具体操作,请参见创建和管理节点池。
将vGPU实例加入到步骤3创建的节点池中,具体操作,请参见添加已有节点。
后续相关步骤:更新ACK集群中vGPU实例的NVIDIA驱动License
更新ACK集群中vGPU实例的NVIDIA驱动License,具体操作,请参见更新ACK集群中GPU虚拟化型(vGPU)实例的NVIDIA驱动License。
如何在已有集群的GPU节点上手动升级Kernel?
下面为您介绍如何在已有集群的GPU节点上手动升级Kernel。
当前kernel版本低于
3.10.0-957.21.3
。请确认需要升级的目标kernel版本,并谨慎操作。
本文提供方案并不涉及kernel升级,仅针对在kernel升级的前提下对应的NVIDIA驱动升级。
将GPU节点设置为不可调度(本例以节点 cn-beijing.i-2ze19qyi8votgjz12345为例)。
kubectl cordon cn-beijing.i-2ze19qyi8votgjz12345 node/cn-beijing.i-2ze19qyi8votgjz12345 already cordoned
将要升级驱动的GPU节点进行排水。
kubectl drain cn-beijing.i-2ze19qyi8votgjz12345 --grace-period=120 --ignore-daemonsets=true node/cn-beijing.i-2ze19qyi8votgjz12345 cordoned WARNING: Ignoring DaemonSet-managed pods: flexvolume-9scb4, kube-flannel-ds-r2qmh, kube-proxy-worker-l62sf, logtail-ds-f9vbg pod/nginx-ingress-controller-78d847fb96-5fkkw evicted
卸载当前的NVIDIA驱动。
本步骤中卸载的是版本为384.111的驱动包,如果您的驱动版本不是384.111,请在NVIDIA官网下载对应版本的驱动安装包,并替换相应的版本号。
登录到该GPU节点,通过
nvidia-smi
查看驱动版本。sudo nvidia-smi -a | grep 'Driver Version' Driver Version : 384.111
下载NVIDIA驱动安装包。
sudo cd /tmp/ sudo curl -O https://cn.download.nvidia.cn/tesla/384.111/NVIDIA-Linux-x86_64-384.111.run
需要在安装包中卸载NVIDIA。
卸载当前NVIDIA驱动。
sudo chmod u+x NVIDIA-Linux-x86_64-384.111.run sudo sh ./NVIDIA-Linux-x86_64-384.111.run --uninstall -a -s -q
升级Kernel。
重启GPU机器。
sudo reboot
重新登录GPU节点,安装对应的Kernel Devel。
sudo yum install -y kernel-devel-$(uname -r)
请到NVIDIA官网下载和安装您需要的NVIDIA驱动。本文以410.79为例。
sudo cd /tmp/ sudo curl -O https://cn.download.nvidia.cn/tesla/410.79/NVIDIA-Linux-x86_64-410.79.run sudo chmod u+x NVIDIA-Linux-x86_64-410.79.run sudo sh ./NVIDIA-Linux-x86_64-410.79.run -a -s -q # warm up GPU sudo nvidia-smi -pm 1 || true sudo nvidia-smi -acp 0 || true sudo nvidia-smi --auto-boost-default=0 || true sudo nvidia-smi --auto-boost-permission=0 || true sudo nvidia-modprobe -u -c=0 -m || true
查看 /etc/rc.d/rc.local,确认其中是否包含以下配置,如果没有请手动添加。
sudo nvidia-smi -pm 1 || true sudo nvidia-smi -acp 0 || true sudo nvidia-smi --auto-boost-default=0 || true sudo nvidia-smi --auto-boost-permission=0 || true sudo nvidia-modprobe -u -c=0 -m || true
重启kubelet和Docker。
sudo service kubelet stop sudo service docker restart sudo service kubelet start
将这个GPU节点重新设置为可调度。
kubectl uncordon cn-beijing.i-2ze19qyi8votgjz12345 node/cn-beijing.i-2ze19qyi8votgjz12345 already uncordoned
在GPU节点上的Device Plugin Pod验证版本。
kubectl exec -n kube-system -t nvidia-device-plugin-cn-beijing.i-2ze19qyi8votgjz12345 nvidia-smi Thu Jan 17 00:33:27 2019 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 410.79 Driver Version: 410.79 CUDA Version: N/A | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla P100-PCIE... On | 00000000:00:09.0 Off | 0 | | N/A 27C P0 28W / 250W | 0MiB / 16280MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
如果通过
docker ps
命令,发现GPU节点没有容器被启动,请参见修复GPU节点容器启动问题。
修复GPU节点容器启动问题
在某些特定Kubernetes版本中的GPU节点上,重启Kubelet和Docker时,发现没有容器被启动。
sudo service kubelet stop
Redirecting to /bin/systemctl stop kubelet.service
sudo service docker stop
Redirecting to /bin/systemctl stop docker.service
sudo service docker start
Redirecting to /bin/systemctl start docker.service
sudo service kubelet start
Redirecting to /bin/systemctl start kubelet.service
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
执行以下命令,查看Docker的Cgroup Driver。
sudo docker info | grep -i cgroup
Cgroup Driver: cgroupfs
此时发现的Cgroup Driver类型是cgroupfs。
您可以按照以下操作,修复该问题。
备份/etc/docker/daemon.json,完成后,执行以下命令更新/etc/docker/daemon.json。
sudo cat >/etc/docker/daemon.json <<-EOF { "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } }, "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "10" }, "oom-score-adjust": -1000, "storage-driver": "overlay2", "storage-opts":["overlay2.override_kernel_check=true"], "live-restore": true } EOF
重启Docker和kubelet。
sudo service kubelet stop Redirecting to /bin/systemctl stop kubelet.service sudo service docker restart Redirecting to /bin/systemctl restart docker.service sudo service kubelet start Redirecting to /bin/systemctl start kubelet.service
确认Docker的Cgroup Driver的类型为systemd。
sudo docker info | grep -i cgroup Cgroup Driver: systemd
裸金属实例节点添加失败怎么办?
由于裸金属实例(ecs.ebmgn7)支持开启MIG。为避免已有MIG设置对节点部署造成影响,系统会在该类型节点每一次添加进集群时对已有的MIG设置进行重置。由于该类型实例的重置时间不定,可能会出现重置时间过长的情况,从而导致添加节点脚本运行超时添加节点失败。
如果该系列节点添加失败,请在节点宿主机上执行以下命令:
sudo cat /var/log/ack-deploy.log
查看输出结果中是否有以下报错:
command timeout: timeout 300 nvidia-smi --gpu-reset
如果存在该报错,说明添加节点失败是由MIG的reset引起的。请重新添加该节点,详细信息,请参见添加已有节点。
Alibaba Cloud Linux 3运行GPU容器出现Failed to initialize NVML: Unknown Error的问题怎么办?
问题现象
在GPU容器内部执行nvidia-smi
会出现如下报错。
sudo nvidia-smi
Failed to initialize NVML: Unknown Error
问题原因
在Alibaba Cloud Linux 3上使用systemd时会有如下行为:在执行systemctl daemon-reload
、systemctl daemon-reexec
等操作时,会更新cgroup相关配置,进而影响NVIDIA GPU设备在容器中的正常使用。更详细的信息,请参见社区相关的issue1671、48。
解决方案
如果出现上述问题,您可以参考如下情况描述和对应方法,结合自身业务要求,尝试解决。
情况一:如果您的应用Pod申请GPU资源的方式是通过为容器设置环境变量NVIDIA_VISIBLE_DEVICES=all实现,您可以评估能否给该应用容器添加一个privileged权限,privileged权限的添加可以参考以下示例。
apiVersion: v1 kind: Pod metadata: name: test-gpu-pod spec: containers: - name: test-gpu-pod image: centos:7 command: - sh - -c - sleep 1d securityContext: # 为容器添加privilege权限 privileged: true
情况二:对于使用共享GPU调度的应用,目前建议使用Alibaba Cloud Linux 2或CentOS 7。
情况三:重建该应用Pod。但在执行该操作前,您需要评估重建该应用Pod是否会对您的业务造成影响,并且该方案并不能保证重建后的Pod不会再出现该问题。
情况四:如果以上情况都不适用,可以评估您的业务能否使用其他操作系统,例如:Alibaba Cloud Linux 2或者CentOS 7。
使用GPU时出现XID 119/XID 120错误导致GPU掉卡怎么办?
问题现象
使用GPU时出现GPU掉卡现象,例如在Linux系统上使用GPU时,出现GPU卡初始化失败的错误提示。执行sh nvidia-bug-report.sh nvidia-bug-report.sh
命令后,在生成的日志中,可以看到XID 119或XID 120错误信息。以XID 119报错页面为例,显示如下:
关于其他XID Errors的更多信息,请参见NVIDIA Common XID Errors。
问题原因
引起上述问题的原因可能是GPU的GSP(GPU System Processor)组件运行状态异常,升级NVIDIA最新版本驱动后,如果GPU掉卡问题仍然会复现,则建议您关闭GSP功能。
如果您想了解更多关于GSP功能的影响详情,请参见开启或关闭GSP功能的影响。
解决方案
以下根据不同场景说明如何关闭GSP。
您可以新建节点池或编辑已有节点池的配置,在高级配置中为节点池配置标签ack.aliyun.com/disable-nvidia-gsp=true
。后续扩容新节点时,ACK会自动在该节点上设置关闭GSP所需的配置。
操作入口和节点池配置项说明,请参见创建和管理节点池。
关闭GSP相关步骤可能会造成扩容节点的时延增加。
您可以通过以下方式在已有节点中关闭GSP。
通过节点池标签方式关闭GSP
登录节点手动执行关闭GSP
如果您的节点无法通过移除集群再添加到集群方式来关闭GSP,那么您可以登录节点,手动执行关闭GSP的步骤。具体操作,请参见常见问题。
NVIDIA驱动在510版本引入了GSP。例如,如果您需要登录节点,手动将驱动由470升级至525版本,那么您在470版本时无需关闭GSP,但升级至525版本后,有可能会触发GSP缺陷。请在升级驱动完成后,参见常见问题手动执行关闭GSP的步骤。
如何手动隔离集群中的故障卡?
在使用共享GPU调度时,集群中可能会出现坏卡导致任务运行失败的情况。为防止重启后的任务再次调度到坏卡上导致重复失败,您可以手动标记坏卡,调度器将不再使用该卡,从而实现故障隔离。
使用该功能之前,请确认您的调度器版本以及集群版本满足以下要求。
1.24及以上版本集群,调度器版本不低于1.xx.x-aliyun-6.4.3.xxx。
1.22版本集群,调度器版本不低于1.22.15-aliyun-6.2.4.xxx。
集群已使用共享GPU调度。
您可以通过向集群中提交一个特殊的ConfigMap的方式来标记故障GPU,参考以下示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: <node-name>-device-status # 替换 <node-name>为实际的节点名。
namespace: kube-system
data:
devices: |
- deviceId: 0 #执行nvidia-smi获取GPU序号
deviceType: gpu
healthy: false
ConfigMap应在kube-system
命名空间中,且命名应当为故障卡所在的节点名加上-device-status
后缀。data
中deviceId
为通过nvidia-smi
获取的GPU序号,deviceType
为gpu
,healthy
为false
。提交配置后,调度器将隔离对应GPU卡。
运行GPU容器出现Failed to initialize NVML: Unknown Error的问题怎么办?
问题现象
若您节点操作系统为Ubuntu 22.04或Red Hat Enterprise Linux(RHEL) 9.3 64位时,在GPU容器内部执行nvidia-smi
可能会出现如下报错。
sudo nvidia-smi
Failed to initialize NVML: Unknown Error
问题原因
在节点上执行systemctl daemon-reload
、systemctl daemon-reexec
等操作后,会更新cgroup相关配置,进而影响NVIDIA GPU设备在容器中的正常使用。
通过以下几种方式为Pod申请GPU资源将会受影响:
在Pod的
resources.limits
中指定aliyun.com/gpu-mem
资源。在Pod中为容器设置环境变量
NVIDIA_VISIBLE_DEVICES
,以便pod能够访问节点上的GPU资源。Pod所使用的容器镜像在制作时默认设置
NVIDIA_VISIBLE_DEVICES
的环境变量,且Pod希望访问节点GPU资源。
在Pod的
resources.limits
中指定资源nvidia.com/gpu
申请GPU资源不会受影响。NVIDIA Device Plugin组件及ack-gpu-exporter组件会为Pod默认配置环境变量
NVIDIA_VISIBLE_DEVICES=all
。
解决方案
您可以通过重建该应用Pod的方式来临时修复此问题。在执行该操作前,请评估重建该应用Pod是否会对您的业务造成影响。若问题重复出现,则需要您再次重建Pod。
如果您的应用Pod通过将环境变量
NVIDIA_VISIBLE_DEVICES=all
的方式来申请GPU资源时。您可以为该应用容器添加privileged
权限,示例配置如下:privileged
权限本身存在一定安全风险,也可重建该应用Pod,重建Pod仅为临时修复,无法避免问题复发。apiVersion: v1 kind: Pod metadata: name: test-gpu-pod spec: containers: - name: test-gpu-pod image: centos:7 command: - sh - -c - sleep 1d securityContext: # 为容器添加privilege权限 privileged: true
- 本页导读 (1)
- 阿里云容器服务是否支持GPU虚拟化型(vGPU)实例?
- 如何在已有集群的GPU节点上手动升级Kernel?
- 修复GPU节点容器启动问题
- 裸金属实例节点添加失败怎么办?
- Alibaba Cloud Linux 3运行GPU容器出现Failed to initialize NVML: Unknown Error的问题怎么办?
- 使用GPU时出现XID 119/XID 120错误导致GPU掉卡怎么办?
- 如何手动隔离集群中的故障卡?
- 运行GPU容器出现Failed to initialize NVML: Unknown Error的问题怎么办?