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

前提条件

您需要开通容器服务和访问控制(RAM)服务。

Kubernetes集群版本不低于1.14.8。

背景信息

轻量级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端口的访问。
  • 如果您不使用已有的VP 网络,会为您创建一个新的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 端口)。

使用限制

  • 用户账户需有100元的余额并通过实名认证,否则无法创建按量付费的ECS实例和负载均衡。
  • 随集群一同创建的负载均衡实例只支持按量付费的方式。
  • Kubernetes集群仅支持专有网络VPC。
  • 每个账号默认可以创建的云资源有一定的配额,如果超过配额创建集群会失败。请在创建集群前确认您的配额。

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

    • 每个账号默认最多可以创建50个集群(所有地域下),每个集群中最多可以添加100个节点。如果您需要创建更多的集群或者节点,请提交工单申请。
      注意 Kubernetes集群中,VPC默认路由条目不超过48条,意味着Kubernetes集群使用VPC时,默认路由条目上限是48个。如果需要更大的路由条目数,需要您先对目标VPC提交工单,申请提高配额。
    • 每个账号默认最多可以创建100个安全组。
    • 每个账号默认最多可以创建60个按量付费的负载均衡实例。
    • 每个账号默认最多可以创建20个EIP。
  • ECS实例使用限制:

    支持创建按量付费和包年包月的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