在云游戏、AI 模型推理、Deep Learning 教学等场景下,单个任务并不能完全使用整块 GPU 设备的计算和存储资源。为了使这类“小规模”任务仍能高效地使用 GPU,阿里云基于 Nvidia GPU 虚拟化方案提供了轻量级 GPU 计算实例。本文主要为您介绍 Kubernetes 集群如何支持轻量级 GPU 的管理和调度。

前提条件

您需要开通容器服务、资源编排(ROS)服务和访问控制(RAM)服务。

说明 容器服务 Kubernetes 集群部署依赖阿里云资源编排 ROS 的应用部署能力,所以创建 Kubernetes 集群前,您需要开通 ROS。

背景信息

轻量级 GPU 实例是在一台阿里云 ECS 虚拟机中装载了一块“小规格”的 GPU 卡。这块“小规格” GPU 卡提供的显存大小只有普通卡的几分之一,按不同实例规格区分。请参见GPU计算型实例概述

用户在创建或者扩容 Kubernetes 集群时,只需为 Worker 节点选择合适的轻量级GPU实例规格(如 ecs.vgn* 系列)。或者将已存在的轻量级GPU 实例,通过自动/手动添加到 Kubernetes 集群中,此时在 Kubernetes 集群中使用轻量级 GPU 实例运行作业的过程与正常 GPU 实例一致。

本文将以创建 Kubernetes 集群时,添加 ecs.vgn5i 实例为例说明如何使用轻量级 GPU。

创建集群过程中,容器服务会进行如下操作:
  • 创建 ECS,配置管理节点到其他节点的 SSH 的公钥登录,通过 CloudInit 安装配置 Kubernetes 集群。
  • 创建安全组,该安全组允许 VPC 入方向全部 ICMP 端口的访问。
  • 如果您不使用已有的 VPC 网络,会为您创建一个新的 VPC 及 VSwitch,同时为该 VSwitch 创建 SNAT。
  • 创建 VPC 路由规则。
  • 创建 NAT 网关及 EIP。
  • 创建 RAM 子账号和 AccessKey,该子账号拥有 ECS 的查询、实例创建和删除的权限,添加和删除云盘的权限,SLB 的全部权限,云监控的全部权限,VPC 的全部权限,日志服务的全部权限,NAS 的全部权限。Kubernetes 集群会根据用户部署的配置相应的动态创建 SLB,云盘,VPC路由规则。
  • 创建内网 SLB,暴露 6443 端口。
  • 创建公网 SLB,暴露 6443、8443和 22 端口(如果您在创建集群的时候选择开放公网 SSH 登录,则会暴露 22 端口;如果您选择不开放公网 SSH 访问,则不会暴露 22 端口)。

使用限制

  • 随集群一同创建的负载均衡实例只支持按量付费的方式。
  • Kubernetes 集群仅支持专有网络 VPC。
  • 每个账号默认可以创建的云资源有一定的配额,如果超过配额创建集群会失败。请在创建集群前确认您的配额。

    如果您需要提高配额,请提交工单申请。

    • 每个账号默认最多可以创建 5 个集群(所有地域下),每个集群中最多可以添加 40 个节点。如果您需要创建更多的集群或者节点,请提交工单申请。
      说明 Kubernetes 集群中,VPC 默认路由条目不超过48条,意味着 Kubernetes 集群使用 VPC 时,默认节点上限是 48 个,如果需要更大的节点数,需要您先对目标 VPC 开工单,提高 VPC 路由条目,再对容器服务提交工单。
    • 每个账号默认最多可以创建 100 个安全组。
    • 每个账号默认最多可以创建 60 个按量付费的负载均衡实例。
    • 每个账号默认最多可以创建 20 个EIP。
  • ECS 实例使用限制:
    • 仅支持 CentOS 操作系统。
    • 支持创建按量付费和包年包月的 ECS 实例。
    说明 实例创建后,您可以通过 ECS 管理控制台将按量付费转预付费,请参见按量付费转包年包月

创建 VGN5I 型 Kubernetes 集群

此处创建的 VGN5I 型集群支持专有版 Kubernetes 和托管版 Kubernetes。下文示例中以创建托管版 Kubernetes为例为您介绍。

  1. 登录容器服务管理控制台
  2. 在 Kubernetes 菜单下,单击左侧导航栏的集群 > 集群,单击页面右上角的创建 Kubernetes 集群
  3. 选择集群模板页面,选择标准托管版集群页面,并单击创建,进入Kubernetes 托管版页面。
    创建集群
    说明 为了创建 GPU 集群,通常情况下,Worker 节点使用 GPU 类型的 ECS。集群其他参数配置,请参见创建Kubernetes 托管版集群
  4. 设置 Worker 节点的配置信息。本例中将 Worker 节点作为 GPU 工作节点,选择 GPU 计算型实例规格 vgn5i。
    • 若您选择新增实例,则需要选择 Worker 节点的系列和规格,以及需要创建的 Worker 节点的数量(本示例创建 2 个 GPU 节点,实例类型为 ecs.vgn5i-m2.xlarge)。
      设置work节点
    • 若您选择添加已有实例,则需要预先在此地域下创建轻量级 GPU 云服务器。
  5. 完成其他配置后,单击创建集群,启动部署。
    集群创建成功后,单击左侧导航栏中的集群 > 节点,进入节点列表页面。

    选择所需的集群,选择创建集群时配置的 Worker 节点,单击操作列的更多 > 详情,查看该节点挂载的 GPU 设备。

    在节点 详情 页面可以看到集群为该轻量级 GPU 实例添加了专门的标签,显示 GPU 设备数量,显存量和虚拟化 GPU 设备名,包括 aliyun.accelerator/nvidia_count: 1aliyun.accelerator/nvidia_mem: 2048MiBaliyun.accelerator/nvidia_name: GRID-P4-2Q标签详情

运行 CUDA 容器验证轻量级 GPU 环境

轻量级 GPU 在容器服务 Kubernetes 集群中的使用方式和普通 GPU 类似,都是通过在 Pod 描述中指定该作业需要 nvidia.com/gpu 资源。由于一个实例中只有一块轻量级 GPU 设备,用户需要指定 nvidia.com/gpu1
说明 如果集群中既有轻量级 GPU 实例,又有普通 GPU 实例,则需要在 Pod 描述中通过配置 nodeSelector 和节点标签指定调度到不同类型节点上。

这里可以用一个例子向您展示如何在 CUDA 容器中使用 CUDA 官方示例测试 GPU 设备。

  1. 在 Kubernetes 菜单下,单击左侧导航栏的应用 > 无状态,进入无状态(Deployment)页面。
  2. 单击页面右上角的创建使用模板创建
  3. 选择所需的集群,命名空间,选择样例模板或自定义,然后单击创建
    应用

    本例中,示例模板是一个运行 CUDA 容器的 Deployment。

    这里通过节点标签aliyun.accelerator/nvidia_mem: 2048MiB,将该 Pod 部署到创建 VGN5I 型 Kubernetes 集群中创建的轻量级 GPU 节点上。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cuda-sample
      labels:
        app: cuda-sample
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: cuda-sample
      template:
        metadata:
          labels:
            app: cuda-sample
        spec:
          nodeSelector:
            aliyun.accelerator/nvidia_mem: 2048MiB
          containers:
          - name: cuda-sample
            image: nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04
            command: ["tail", "-f", "/dev/null"]
            resources:
              limits:
                nvidia.com/gpu: "1"
  4. 待 cuda-sample 启动后,通过 kubectl exec 命令进入该容器内部查看 GPU 设备情况和测试 CUDA 代码。
    1. 通过 kubectl 连接 Kubernetes 集群
    2. 执行如下命令,获取 Pod 名称。
      $kubectl get pod
      NAME                           READY   STATUS    RESTARTS   AGE
      cuda-sample-79f9fc9cc5-hlpp5   1/1     Running   0          4h27m
    3. 执行如下命令,查看 GPU 设备情况。
      可以看到该 Pod 容器中有一块 GRID P4-2Q 设备,提供 2048 MiB 显存。
      $kubectl exec -it cuda-sample-79f9fc9cc5-hlpp5 bash
      root@cuda-sample-79f9fc9cc5-hlpp5:/# nvidia-smi
      Thu Nov 21 14:45:45 2019
      +-----------------------------------------------------------------------------+
      | NVIDIA-SMI 418.70       Driver Version: 418.70       CUDA Version: 10.1     |
      |-------------------------------+----------------------+----------------------+
      | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
      | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
      |===============================+======================+======================|
      |   0  GRID P4-2Q          On   | 00000000:00:07.0 Off |                  N/A |
      | N/A   N/A    P8    N/A /  N/A |    144MiB /  2048MiB |      0%      Default |
      +-------------------------------+----------------------+----------------------+
      
      +-----------------------------------------------------------------------------+
      | Processes:                                                       GPU Memory |
      |  GPU       PID   Type   Process name                             Usage      |
      |=============================================================================|
      |  No running processes found                                                 |
      +-----------------------------------------------------------------------------+
    4. 执行如下命令,查看 CUDA 版本,安装 CUDA Sample 示例,并测试示例代码。
      root@cuda-sample-79f9fc9cc5-hlpp5:/# nvcc -V
      nvcc: NVIDIA (R) Cuda compiler driver
      Copyright (c) 2005-2017 NVIDIA Corporation
      Built on Fri_Sep__1_21:08:03_CDT_2017
      Cuda compilation tools, release 9.0, V9.0.176
      root@cuda-sample-79f9fc9cc5-hlpp5:/# apt-get update && apt-get install -y cuda-samples-9-0
      ...
      
      root@cuda-sample-79f9fc9cc5-hlpp5:/# cd /usr/local/cuda-9.0/samples/0_Simple/simpleTexture
      root@cuda-sample-79f9fc9cc5-hlpp5:/usr/local/cuda-9.0/samples/0_Simple/simpleTexture# make
      ...
      
      root@cuda-sample-79f9fc9cc5-hlpp5:/usr/local/cuda-9.0/samples/0_Simple/simpleTexture# ./simpleTexture
      simpleTexture starting...
      GPU Device 0: "GRID P4-2Q" with compute capability 6.1
      
      Loaded 'lena_bw.pgm', 512 x 512 pixels
      Processing time: 0.038000 (ms)
      6898.53 Mpixels/sec
      Wrote './data/lena_bw_out.pgm'
      Comparing files
          output:    <./data/lena_bw_out.pgm>
          reference: <./data/ref_rotated.pgm>
      simpleTexture completed, returned OK