阿里云容器服务ACK支持GPU的调度与运维管理。以运行GPU的TensorFlow为例,本文介绍如何快速部署一个Jupyter应用。
索引
注意事项
针对纳入K8s集群管理的GPU节点,不建议您使用如下方式为业务应用申请和使用GPU资源。
- 直接在节点上运行GPU应用程序。
- 通过Docker、Podman、nerdctl等工具创建容器并为容器申请GPU资源。例如,执行
docker run --gpus all
或docker run -e NVIDIA_VISIBLE_DEVICES=all
并运行GPU程序。 - 在Pod YAML的
env
中直接添加环境变量NVIDIA_VISIBLE_DEVICES=all
或NVIDIA_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社区的已知报错。
操作步骤
- 登录容器服务管理控制台,在左侧导航栏选择集群。
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
- 在无状态页面右上角,单击使用YAML创建资源。
- 选择所需命名空间,选择样例模板或自定义,然后单击创建。
本示例模板提供一个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的插件会自发现驱动所需的库链接和执行文件。
- 在左侧导航栏选择 ,选择所需命名空间,选择tf-notebook服务,查看外部端点。
- 在浏览器中访问Jupyter实例,访问地址为
http://外部端点
,输入模板中配置的密码。 - 通过如下的程序,验证这个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可用的所有设备。