使用Kubernetes默认GPU调度

阿里云容器服务ACK支持GPU的调度与运维管理。默认的GPU使用模式与Kubernetes社区GPU的使用方式一致。本文以运行GPU的TensorFlow任务为例,介绍如何快速部署一个GPU应用。

注意事项

针对纳入K8s集群管理的GPU节点,建议您按照本文示例中标准的K8s扩展资源申请方式为应用申请GPU资源。为业务应用申请和使用GPU资源时,请关注以下注意事项。

  • 请勿直接在节点上运行GPU应用程序。

  • 请勿通过dockerpodmannerdctl等工具命令创建容器并为容器申请GPU资源。例如,执行docker run --gpus alldocker run -e NVIDIA_VISIBLE_DEVICES=all并运行GPU程序。

  • 请勿在Pod YAML的env中直接添加环境变量NVIDIA_VISIBLE_DEVICES=allNVIDIA_VISIBLE_DEVICES=<GPU ID>等,通过容器的环境变量NVIDIA_VISIBLE_DEVICES直接为Pod申请GPU资源,并运行GPU程序。

  • 在Pod YAML中未设置环境变量NVIDIA_VISIBLE_DEVICES,制作Pod所使用的镜像时,请勿将环境变量默认配置为NVIDIA_VISIBLE_DEVICES=all,并运行GPU程序。

  • 请勿在Pod的securityContext中配置privileged: true,并运行GPU程序。

使用以上非标准方式为业务应用申请的GPU资源,将存在如下安全隐患。

  • 通过以上方式为业务应用申请的GPU资源,并未在调度器的设备资源账本中统计,有可能造成节点GPU资源的分配情况与调度器设备资源账本中记录的值不一致。调度器仍然会调度某些申请GPU资源的Pod到这个节点上,导致用户业务因为在同一张GPU卡上出现资源争抢(例如GPU显存申请)而运行失败的情况。

  • 非标操作可能引发其他未知问题,例如NVIDIA社区的已知报错

操作步骤

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 无状态页面右上角,单击使用YAML创建资源

  4. 在创建无状态工作负载页面,选择所需命名空间,示例模板选择已有模板或自定义。在模板代码输入框输入以下示例代码,然后单击创建

    apiVersion: v1
    kind: Pod
    metadata:
      name: tensorflow-mnist
      namespace: default
    spec:
      containers:
      - image: registry.cn-beijing.aliyuncs.com/acs/tensorflow-mnist-sample:v1.5
        name: tensorflow-mnist
        command:
        - python
        - tensorflow-sample-code/tfjob/docker/mnist/main.py
        - --max_steps=100000
        - --data_dir=tensorflow-sample-code/data
        resources:
          limits:
            nvidia.com/gpu: 1  # 为该容器申请1张GPU卡。
        workingDir: /root
      restartPolicy: Always
  5. 在集群管理页左侧导航栏,选择工作负载 > 容器组,找到刚才创建的Pod,单击Pod名称查看相关信息。

    单击日志页签,查看该TensorFlow任务的日志信息,以下输出日志表示该任务已正常使用GPU。

    image.png