详情页标题前

阿里云容器服务ACKGPU FAQ-云淘科技

详情页1

本文介绍GPU常见问题。

  • GPU问题诊断

  • 如何在GPU节点中升级Kernel?

  • 如何修复GPU节点的容器启动异常?

  • 排查GPU监控常见问题

  • 可用的GPU数目少于实际GPU数目

  • GPU节点中重启Kubelet和Docker服务异常

  • 修复GPU实例重启或被置换后设备ID变更问题

  • 阿里云容器服务是否支持GPU虚拟化型(vGPU)实例?

  • 如何在已有集群的GPU节点上手动升级Kernel?

  • 修复GPU节点容器启动问题

  • 裸金属实例ecs.ebmgn7节点添加失败怎么办?

  • Alibaba Cloud Linux 3运行GPU容器出现Failed to initialize NVML: Unknown Error的问题怎么办?

阿里云容器服务是否支持GPU虚拟化型(vGPU)实例?

vGPU实例需要购买NVIDIA官方提供的GRID License才能正常工作,而阿里云并不提供License服务器。因此即使您创建了GPU虚拟化集群,vGPU实例也无法使用。因此,阿里云容器服务已不再支持在控制台选择vGPU实例作为集群节点。

不支持的虚拟化GPU实例包括以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集群

  1. 请前往权益配额,申请开放自定义系统镜像功能。

  2. 基于CentOS 7.X和Alibaba Cloud Linux 2制作自定义系统镜像,镜像中需要安装NVIDIA GRID驱动并且正确配置GRID License。具体操作,请参见使用实例创建自定义镜像和在GPU虚拟化型实例中安装GRID驱动(Linux)。

  3. 创建节点池。具体操作,请参见创建节点池。

  4. 将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驱动升级。

  1. 获取集群KubeConfig并通过kubectl工具连接集群。

  2. 将GPU节点设置为不可调度(本例以节点 cn-beijing.i-2ze19qyi8votgjz12345为例)。

    kubectl cordon cn-beijing.i-2ze19qyi8votgjz12345
    
    node/cn-beijing.i-2ze19qyi8votgjz12345 already cordoned
  3. 将要升级驱动的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
  4. 卸载当前的nvidia-driver。

    说明

    本步骤中卸载的是版本为384.111的驱动包,如果您的驱动版本不是384.111,则需要在Nvidia官网下载对应的驱动安装包,并将本步骤中的384.111替换成您实际的版本。

    1. 登录到该GPU节点,通过nvidia-smi查看驱动版本。

      sudo nvidia-smi -a | grep 'Driver Version'
      Driver Version                      : 384.111
    2. 下载Nvidia驱动安装包。

      sudo cd /tmp/
      sudo curl -O https://cn.download.nvidia.cn/tesla/384.111/NVIDIA-Linux-x86_64-384.111.run

      说明

      需要在安装包中卸载Nvidia。

    3. 卸载当前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
  5. 升级Kernel。

  6. 重启GPU机器。

    sudo reboot
  7. 重新登录GPU节点,安装对应的kernel devel。

    sudo yum install -y kernel-devel-$(uname -r)
  8. 请到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
  9. 查看 /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
  10. 重启kubelet和docker。

    sudo service kubelet stop
    sudo service docker restart
    sudo service kubelet start
  11. 将这个GPU节点重新设置为可调度。

    kubectl uncordon cn-beijing.i-2ze19qyi8votgjz12345
    
    node/cn-beijing.i-2ze19qyi8votgjz12345 already uncordoned
  12. 在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。

您可以按照以下操作,修复该问题。

  1. 备份/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
  2. 执行以下命令,重启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
  3. 执行以下命令,确认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的问题怎么办?

问题现象

在Alibaba Cloud Linux 3上执行systemctl daemon-reloadsystemctl daemon-reexec等操作后,在GPU容器内部无法正常使用GPU设备,具体表现为在GPU容器内部执行nvidia-smi会出现如下报错。

sudo nvidia-smi

Failed to initialize NVML: Unknown Error

问题原因

在Alibaba Cloud Linux 3上使用systemd时会有如下行为:在执行systemctl daemon-reloadsystemctl 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。

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家

阿里云企业补贴进行中: 马上申请

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心。

购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠

转转请注明出处:https://www.yunxiaoer.com/171599.html

(0)
上一篇 2023年12月10日
下一篇 2023年12月10日
详情页2

相关推荐

  • 阿里云容器服务ACK块存储限速最佳实践-云淘科技

    Kubernetes本身不支持对存储介质进行限速,您可以通过容器服务ACK实现对某个Pod进行某个块设备(云盘或LVM本地盘)的限速。本文以云盘为例介绍如何对块存储进行限速。 使用限制 宿主机操作系统必须为Alibaba Cloud Linux 2及以上版本。 ACK集群版本不低于1.20。 CSI存储组件版本不低于1.22。版本信息,请参见csi-prov…

    阿里云容器服务 2023年12月10日
  • 阿里云容器服务ACK公共请求和返回结果-云淘科技

    本文列举了容器服务Kubernetes版的API的公共请求参数和公共返回参数信息。 公共请求参数 公共请求参数是用于标识目标API、用户身份、签名等通用信息的参数,每次发起API请求时均需要携带这些参数。 公共请求参数应作为HTTP请求的消息头(header)携带在请求中,具体取值如下: 名称 是否必须 描述 x-acs-action 是 API的名称。关于…

    阿里云容器服务 2023年12月10日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 阿里云容器服务ACKAPI概览-云淘科技

    容器服务Kubernetes版提供以下API接口。 重要 在使用API管理Kubernetes集群前,请确保您已阅读和同意阿里云容器服务Kubernetes版服务条款和使用须知及高危风险操作说明。 集群 API 描述 创建Kubernetes专有版集群 调用CreateCluster创建一个标准Kubernetes专有版集群。 创建Kubernetes托管版…

    阿里云容器服务 2023年12月10日
  • 阿里云容器服务ACKGitOps概述-云淘科技

    GitOps是使用Git仓库来管理应用的部署模板,将Git仓库作为Kubernetes集群中部署应用的唯一来源,实现应用的持续部署。ACK One舰队的Fleet实例托管了ArgoCD,同时集成ACK One多集群能力,实现多集群的GitOps持续交付,满足应用的高可用部署、系统组件多集群分发等需求。本文介绍GitOps和ACK One GitOps。 索引…

    2023年12月10日
  • 阿里云容器服务ACK扩缩容节点池-云淘科技

    容器服务ACK通过调整节点池的期望节点数实现节点池扩缩容,将节点数目维持在期望数量。扩容节点池保证节点数量足够支撑业务运行,缩容节省成本。扩缩容节点池均可自动化执行,提升了运维效率。本文介绍如何扩缩容节点池。 前提条件 已创建Kubernetes集群。 已确保Kubernetes集群连通性正常。具体操作,请参见获取集群KubeConfig并通过kubectl…

    阿里云容器服务 2023年12月10日

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。