在容器调度领域,对于 nvidia GPU 的调度一直是以 GPU 卡独占为前提的。原因是 nvidia GPU 仅仅支持应用层面的显存上限设置,并不支持硬件层面,或者说平台层面的设备隔离。这种方案虽然安全,但是却阻止了客户在模型预测领域共享 GPU 卡的强烈需求。很多客户愿意接受平台层负责调度和监控,应用层负责保证共用应用在运行时的 GPU 卡显存使用上限。这是技术上的一种折中方案,但确实可以解决在模型预测上 GPU 卡浪费的问题。

基于此,阿里云容器服务提供了 GPU 指定卡调度的策略,即用户指定调用 GPU 卡列表,swarm 调度系统根据列表定位满足需求的 GPU 节点,将容器部署到该节点。

使用限制

实际上在指定 GPU 卡调度过程中,仅仅检查 GPU 节点是否满足包含指定 GPU 卡这个条件,并不会检查该 GPU 卡是否正在被其他容器使用。建议客户结合指定多节点调度一起使用,这样可以降低系统调度时共享卡压力过大的风险。具体可以参考指定多节点调度

Note 不建议与 GPU 独占标签 aliyun.gpu 在同一个集群混合使用,由于指定 GPU 卡调度不受节点调度限制,会运行在任何满足指定条件的 GPU 卡上,这会导致 aliyun.gpu 失效。如果必须要和 aliyun.gpu 混合使用,建议通过使用给节点打 label 的方式分开需要共享和独享 GPU 的节点,并且在调度时刻指定 GPU。

使用方法

您可以通过阿里云扩展标签 aliyun.gpu.devices,指定要使用的 GPU 节点上卡的编号。

您可以登录到 GPU 机器上运行如下命令查询卡编号。

下面的示例表示该机器上包含两块 GPU 卡,卡的编号为 0 和 1。

nvidia-smi -L | awk -F: '{print $1}'
GPU 0
GPU 1

在下面的编排示例中, aliyun.gpu.devices=0,1 代表指定使用 GPU 0 和 1,调度系统会在集群中搜索满足设备序列号的 GPU 设备,并部署到对应的 ECS 实例上。

version: '2'
services:
  cuda:
    image: registry.cn-hangzhou.aliyuncs.com/1hpc/cuda
    command:
      - tail
      - -f
      - /dev/null
    labels: 
      - aliyun.gpu.devices=0,1