GPU虚拟化

前提条件

运行Volcano设备插件所需的前提条件如下:

  • NVIDIA驱动 > 440
  • nvidia-docker版本 > 2.0 (参见如何安装及其前提条件)
  • 将docker配置为使用nvidia作为默认运行时
  • Kubernetes版本 >= 1.16
  • Volcano版本 >= 1.9

环境设置

安装 Volcano

参考安装指南安装Volcano。

安装后,更新调度器配置:

kubectl edit cm -n volcano-system volcano-scheduler-configmap
kind: ConfigMap
apiVersion: v1
metadata:
  name: volcano-scheduler-configmap
  namespace: volcano-system
data:
  volcano-scheduler.conf: |
    actions: "enqueue, allocate, backfill"
    tiers:
    - plugins:
      - name: priority
      - name: gang
      - name: conformance
    - plugins:
      - name: drf
      - name: deviceshare
        arguments:
          deviceshare.VGPUEnable: true # 启用 vgpu
      - name: predicates
      - name: proportion
      - name: nodeorder
      - name: binpack

安装 Volcano vGPU Device Plugin

参考Enabling GPU Support in Kubernetes

验证环境是否就绪

检查节点状态,如果在可分配资源(allocatable resources)中包含 volcano.sh/vgpu-memoryvolcano.sh/vgpu-number,则表示环境正常。

$ kubectl get node {node name} -oyaml
...
status:
  addresses:
  - address: 172.17.0.3
    type: InternalIP
  - address: volcano-control-plane
    type: Hostname
  allocatable:
    cpu: "4"
    ephemeral-storage: 123722704Ki
    hugepages-1Gi: "0"
    hugepages-2Mi: "0"
    memory: 8174332Ki
    pods: "110"
    volcano.sh/vgpu-memory: "89424"
    volcano.sh/vgpu-number: "8"    # GPU 资源
  capacity:
    cpu: "4"
    ephemeral-storage: 123722704Ki
    hugepages-1Gi: "0"
    hugepages-2Mi: "0"
    memory: 8174332Ki
    pods: "110"
    volcano.sh/vgpu-memory: "89424"
    volcano.sh/vgpu-number: "8"   # GPU 资源

运行 GPU 共享作业

可以通过在resource.limit中设置”volcano.sh/vgpu-number”、”volcano.sh/vgpu-cores”和”volcano.sh/vgpu-memory”来申请vGPU。

$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod1
spec:
  schedulerName: volcano
  containers:
    - name: cuda-container
      image: nvidia/cuda:9.0-devel
      command: ["sleep"]
      args: ["100000"]
      resources:
        limits:
          volcano.sh/vgpu-number: 2 # 申请 2 个 vGPU 卡
          volcano.sh/vgpu-memory: 3000 # (可选) 每个 vGPU 使用 3G 设备显存
          volcano.sh/vgpu-cores: 50 # (可选) 每个 vGPU 使用 50% 的核心
EOF

可以在容器内使用nvidia-smi命令验证设备显存:

image

警告: 如果在使用device plugin和NVIDIA镜像时未申请GPU,节点上的所有GPU都会暴露在容器内。 容器使用的vGPU数量不能超过该节点上的物理GPU总数。

监控

volcano-scheduler-metrics记录了每个GPU的使用情况和限制。访问以下地址获取这些指标:

curl {volcano-scheduler-cluster-ip}:8080/metrics

还可通过访问以下地址,在节点上收集GPU利用率GPU显存使用量Pod的GPU显存限制Pod的GPU显存使用量等指标:

curl {volcano-device-plugin-pod-ip}:9394/metrics
image

问题与贡献