阿里云容器服务ACK支持GPU的调度与运维管理。以运行GPU的TensorFlow为例,本文介绍如何快速部署一个Jupyter应用。

索引

注意事项

针对纳入K8s集群管理的GPU节点,不建议您使用如下方式为业务应用申请和使用GPU资源。

  • 直接在节点上运行GPU应用程序。
  • 通过Docker、Podman、nerdctl等工具创建容器并为容器申请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. 选择所需命名空间,选择样例模板或自定义,然后单击创建
    创建应用

    本示例模板提供一个Jupyter应用,包括一个Deployment和Service。

    展开查看完整代码示例
    ---
    # Define the tensorflow deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tf-notebook
      labels:
        app: tf-notebook
    spec:
      replicas: 1
      selector: # define how the deployment finds the pods it mangages
        matchLabels:
          app: tf-notebook
      template: # define the pods specifications
        metadata:
          labels:
            app: tf-notebook
        spec:
          containers:
          - name: tf-notebook
            image: tensorflow/tensorflow:1.4.1-gpu-py3
            resources:
              limits:
                nvidia.com/gpu: 1          # 指定调用NVIDIA GPU的数量。
            ports:
            - containerPort: 8888
              hostPort: 8888
            env:
              - name: PASSWORD                # 指定访问Jupyter服务的密码,您可以根据业务需要修改。
                value: mypassword
    
    # Define the tensorflow service
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: tf-notebook
    spec:
      ports:
      - port: 80
        targetPort: 8888
        name: jupyter
      selector:
        app: tf-notebook
      type: LoadBalancer                           # 阿里云的负载均衡访问内部服务和负载均衡。                       

    如使用旧的GPU部署方案,请定义以下的NIVDIA驱动所在的数据卷。

    volumes:
        - hostPath:
            path: /usr/lib/nvidia-375/bin
            name: bin
        - hostPath:
            path: /usr/lib/nvidia-375
            name: lib

    您在编写部署文件时,强依赖于所在的集群,导致缺乏可移植性。但在Kubernetes 1.9.3及之后的版本中,您无需指定hostPath,NVIDIA的插件会自发现驱动所需的库链接和执行文件。

  5. 在左侧导航栏选择网络 > 服务,选择所需命名空间,选择tf-notebook服务,查看外部端点。
    查看服务
  6. 在浏览器中访问Jupyter实例,访问地址为http://外部端点,输入模板中配置的密码。
  7. 通过如下的程序,验证这个Jupyter实例可以使用GPU。
    from tensorflow.python.client import device_lib
    
    def get_available_devices():
        local_device_protos = device_lib.list_local_devices()
        return [x.name for x in local_device_protos]
    
    print(get_available_devices())

    部署成功后,返回结果将列出Tensorflow可用的所有设备。

    查看结果