要使开发人员能够在 TKGS 集群上部署 AI/ML 工作负载,作为集群运维人员,您可以将 Kubernetes 环境配置为支持 NVIDIA vGPU 操作。

在 TKGS 集群上部署 AI/ML 工作负载的集群运维人员工作流

下面概述了在 TKGS 集群上部署 AI/ML 工作负载的步骤:
步骤 操作 链接
0

查看系统要求。

请参见运维人员步骤 0:查看系统要求
1 将 kubectl 和适用于 Kubectl 的 vSphere 插件下载到本地 Workstation。 请参见运维人员步骤 1:在 Workstation 上安装适用于 vSphere 的 Kubernetes CLI 工具
2 使用 kubectl 登录到主管集群,该集群使用新主管集群的上下文填充 .kube/config。 请参见运维人员步骤 2:登录到主管集群
3 使用 kubectl 将上下文切换到 vSphere 命名空间。 请参见运维人员步骤 3:将上下文切换到 vSphere 命名空间
4 使用 kubectl 列出虚拟机类,并验证是否存在启用了 NVIDIA vGPU 的类。 请参见运维人员步骤 4:获取用于 vGPU 工作负载的自定义虚拟机类
5 使用 kubectl 列出可用的 Tanzu Kubernetes 版本,并验证是否存在 Ubuntu 映像。 请参见运维人员步骤 5:获取适用于 GPU 节点的 Ubuntu Tanzu Kubernetes 版本
6 编写用于置备启用了 GPU 的 TKGS 集群的 YAML 规范;指定 TKR 版本和虚拟机类。 请参见运维人员步骤 6:编写用于置备启用了 vGPU 的 TKGS 集群的 YAML
7 置备 TKGS 集群。 请参见运维人员步骤 7:置备 TKGS 集群
8 登录到集群并验证置备。 请参见运维人员步骤 8:登录到 TKGS 集群并验证置备
9 在 TKGS 集群中创建一些必备对象(包括命名空间、角色绑定、映像密钥和许可证配置),为安装 NVAIE GPU Operator 做准备。 请参见运维人员步骤 9:准备安装 NVAIE GPU Operator
10 在集群中安装 NVAIE GPU Operator。 请参见运维人员步骤 10:在集群中安装 NVIDIA GPU Operator
11 将 AI/ML 工作负载部署到启用了 vGPU 的 TKGS 集群。 请参见运维人员步骤 11:部署 AI/ML 工作负载

运维人员步骤 0:查看系统要求

根据以下系统要求设置环境,以便能够在 TKGS 集群上部署 AI/ML 工作负载。
要求 描述

vSphere 管理员已设置适合 NVIDIA vGPU 的环境

请参见在 TKGS 集群 (vGPU) 上部署 AI/ML 工作负载的 vSphere 管理员工作流

TKR Ubuntu OVA

Ubuntu Tanzu Kubernetes 版本

ob-18691651-tkgs-ova-ubuntu-2004-v1.20.8---vmware.1-tkg.2

TKG 集群置备程序

Tanzu Kubernetes Grid 服务

API 版本:run.tanzu.vmware.com/v1alpha2

NVIDIA GPU Operator

GPU Operator v1.8.0

NVIDIA GPU 驱动程序容器

nvcr.io/nvstating/cnt-ea/driver:470.51-ubuntu20.04

运维人员步骤 1:在 Workstation 上安装适用于 vSphere 的 Kubernetes CLI 工具

下载并安装适用于 vSphere 的 Kubernetes CLI 工具

如果使用的是 Linux,则可以运行以下命令以下载工具。

curl -LOk https://${SC_IP}/wcp/plugin/linux-amd64/vsphere-plugin.zip
unzip vsphere-plugin.zip
mv -v bin/* /usr/local/bin/

有关其他指导,请参见下载并安装 适用于 vSphere 的 Kubernetes CLI 工具

运维人员步骤 2:登录到主管集群

使用 kubectl 的 vSphere 插件主管集群进行身份验证。
kubectl vsphere login --server=IP-ADDRESS --vsphere-username USERNAME

运维人员步骤 3:将上下文切换到 vSphere 命名空间

使用 kubectl,将上下文切换到 vSphere 管理员为 TKGS GPU 集群创建的 vSphere 命名空间
kubectl config get-contexts
kubectl config use-context TKGS-GPU-CLUSTER-NAMESPACE

运维人员步骤 4:获取用于 vGPU 工作负载的自定义虚拟机类

确认 vSphere 管理员创建的包含 vGPU 配置文件的自定义虚拟机类在目标 vSphere 命名空间中可用。
kubectl get virtualmachineclassbindings
注: 虚拟机类必须绑定到目标 vSphere 命名空间。如果没有看到用于 vGPU 工作负载的自定义虚拟机类,请联系 vSphere 管理员。

运维人员步骤 5:获取适用于 GPU 节点的 Ubuntu Tanzu Kubernetes 版本

确认 vSphere 命名空间中提供了 vSphere 管理员从内容库同步的所需的 Ubuntu Tanzu Kubernetes 版本
kubectl get tanzukubernetesreleases
或者,使用快捷方式:
kubectl get tkr

运维人员步骤 6:编写用于置备启用了 vGPU 的 TKGS 集群的 YAML

构建用于置备 Tanzu Kubernetes 集群的 YAML 文件。

从以下示例之一开始。使用从前面命令的输出中收集的信息自定义集群规范。请参阅配置参数的完整列表:用于置备 Tanzu Kubernetes 集群的 TKGS v1alpha2 API

示例 1 指定了两个工作节点池。
apiVersion: run.tanzu.vmware.com/v1alpha2
kind: TanzuKubernetesCluster
metadata:
   #cluster name
   name: tkgs-cluster-gpu-a100
   #target vsphere namespace
   namespace: tkgs-gpu-operator
spec:
   topology:
     controlPlane:
       replicas: 3
       #storage class for control plane nodes
       #use `kubectl describe storageclasses`
       #to get available pvcs
       storageClass: vwt-storage-policy
       vmClass: guaranteed-medium
       #TKR NAME for Ubuntu ova supporting GPU
       tkr:
         reference:
           name: 1.20.8---vmware.1-tkg.1
     nodePools:
     - name: nodepool-a100-primary
       replicas: 3
       storageClass: vwt-storage-policy
       #custom VM class for vGPU
       vmClass: class-vgpu-a100
       #TKR NAME for Ubuntu ova supporting GPU 
       tkr:
         reference:
           name: 1.20.8---vmware.1-tkg.1
     - name: nodepool-a100-secondary
       replicas: 3
       vmClass: class-vgpu-a100
       storageClass: vwt-storage-policy
       #TKR NAME for Ubuntu ova supporting GPU
       tkr:
         reference:
           name: 1.20.8---vmware.1-tkg.1
   settings:
     storage:
       defaultClass: vwt-storage-policy
     network:
       cni:
        name: antrea
       services:
        cidrBlocks: ["198.51.100.0/12"]
       pods:
        cidrBlocks: ["192.0.2.0/16"]
       serviceDomain: managedcluster.local
示例 2 在工作节点上为容器运行时指定了一个容量为 50 GiB 的单独卷。此设置是可配置的。建议为基于容器的 AI/ML 工作负载提供大小合适的单独卷。
apiVersion: run.tanzu.vmware.com/v1alpha2
kind: TanzuKubernetesCluster
metadata:
  name: tkc
  namespace: tkg-ns-auto
spec:
  distribution:
    fullVersion: v1.20.8+vmware.1-tkg.1
  topology:
    controlPlane:
      replicas: 3
      storageClass: vwt-storage-policy
      tkr:
        reference:
          name: v1.20.8---vmware.1-tkg.1
      vmClass: best-effort-medium
    nodePools:
    - name: workers
      replicas: 3
      storageClass: k8s-storage-policy
      tkr:
        reference:
          name: v1.20.8---vmware.1-tkg.1
      vmClass: vmclass-vgpu
      volumes:
      - capacity:
          storage: 50Gi
        mountPath: /var/lib/containerd
        name: containerd
      - capacity:
          storage: 50Gi
        mountPath: /var/lib/kubelet
        name: kubelet
    - name: nodepool-1
      replicas: 1
      storageClass: vwt-storage-policy
      vmClass: best-effort-medium
示例 3 包括集群附加元数据,如标签。
apiVersion: run.tanzu.vmware.com/v1alpha2
kind: TanzuKubernetesCluster
metadata:
  annotations:
  labels:
    run.tanzu.vmware.com/tkr: v1.20.8---vmware.1-tkg.1
  name: tkgs-gpu-direct-rdma
  namespace: tkgs-ns
spec:
  settings:
    network:
      cni:
        name: antrea
      pods:
        cidrBlocks:
        - 192.168.0.0/16
      serviceDomain: cluster.local
      services:
        cidrBlocks:
        - 10.96.0.0/12
  topology:
    controlPlane:
      replicas: 3
      storageClass: tkgs-storage-policy
      vmClass: guaranteed-medium
      tkr:
        reference:
          name: v1.20.8---vmware.1-tkg.1
    nodePools:
    - name: workers
      replicas: 5
      storageClass: tkgs-storage-policy
      vmClass: claire-gpu-direct-rdma
      volumes:
      - capacity:
          storage: 50Gi
        mountPath: /var/lib/containerd
        name: containerd
      - capacity:
          storage: 50Gi
        mountPath: /var/lib/kubelet
        name: kubelet
      tkr:
        reference:
          name: v1.20.8---vmware.1-tkg.1

运维人员步骤 7:置备 TKGS 集群

通过运行以下 kubectl 命令置备集群。
kubectl apply -f CLUSTER-NAME.yaml
例如:
kubectl apply -f tkgs-gpu-cluster-1.yaml
使用 kubectl 监控集群节点的部署。
kubectl get tanzukubernetesclusters -n NAMESPACE

运维人员步骤 8:登录到 TKGS 集群并验证置备

使用 kubectl 的 vSphere 插件,登录到 TKGS 集群。
kubectl vsphere login --server=IP-ADDRESS --vsphere-username USERNAME \
--tanzu-kubernetes-cluster-name CLUSTER-NAME --tanzu-kubernetes-cluster-namespace NAMESPACE-NAME
使用以下命令验证集群:
kubectl cluster-info
kubectl get nodes
kubectl get namespaces
kubectl api-resources

运维人员步骤 9:准备安装 NVAIE GPU Operator

在使用 NVIDIA AI Enterprise 安装 GPU Operator 之前,请针对您置备的 TKGS 集群完成以下任务。有关其他指导,请参见 NVAIE 文档中的 必备条件任务
注: 如果要使用 NVIDIA 委派许可服务器 (DLS),请参阅以下主题中的说明: 在 TKGS 集群上部署 AI/ML 工作负载的集群运维人员附录 (DLS)
  1. 创建 Kubernetes 命名空间 gpu-operator-resources。最佳做法是始终将所有内容部署到此命名空间中。
    kubectl create ns gpu-operator-resources
  2. 创建角色绑定。

    Tanzu Kubernetes 集群已启用 Pod 安全策略。

    创建 rolebidings.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: psp:vmware-system-privileged:default
      namespace: default
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: psp:vmware-system-privileged
    subjects:
    - apiGroup: rbac.authorization.k8s.io
      kind: Group
      name: system:nodes
    - apiGroup: rbac.authorization.k8s.io
      kind: Group
      name: system:serviceaccounts
    应用角色绑定。
    kubectl apply -f rolebindings.yaml
    创建 post-rolebindings.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: psp:vmware-system-privileged:gpu-operator-resources
      namespace: gpu-operator-resources
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: psp:vmware-system-privileged
    subjects:
    - kind: Group
      apiGroup: rbac.authorization.k8s.io
      name: system:serviceaccounts
    应用角色绑定:
    kubectl apply -f post-rolebindings.yaml
  3. 使用 NGC 凭据创建可供 Docker 用于从 NVIDIA GPU Cloud 目录中提取容器映像的映像密钥。
    kubectl create secret docker-registry registry-secret \
         --docker-server=server-name --docker-username='$oauthtoken' \
         --docker-password=<place_holder> \
         --docker-email=email-name -n gpu-operator-resources
  4. 为 NVIDIA 许可证服务器创建 configmap。
    kubectl create configmap licensing-config -n gpu-operator-resources --from-file=gridd.conf

    gridd.conf 将引用 NVIDIA 许可证服务器地址,例如:

    # Description: Set License Server Address
    # Data type: string
    # Format:  "<address>"
    ServerAddress=<place_holder>
    

运维人员步骤 10:在集群中安装 NVIDIA GPU Operator

在 TKGS 集群中安装 NVAIE GPU Operator 版本 1.8.0。有关其他指导,请参阅 GPU Operator 文档
注: 如果要使用 NVIDIA 委派许可服务器 (DLS),请参阅以下主题中的说明: 在 TKGS 集群上部署 AI/ML 工作负载的集群运维人员附录 (DLS)
  1. 按照 Helm 文档安装 Helm。
  2. 添加 gpu-operator Helm 存储库。
    helm repo add nvidia https://nvidia.github.io/gpu-operator
  3. 通过运行以下命令,安装 NVAIE GPU Operator。

    如有必要,请将环境变量值替换为与环境匹配的值。

    export PRIVATE_REGISTRY="private/registry/path"
    export OS_TAG=ubuntu20.04
    export VERSION=460.73.01
    export VGPU_DRIVER_VERSION=460.73.01-grid
    export NGC_API_KEY=ZmJjMHZya...LWExNTRi
    export REGISTRY_SECRET_NAME=registry-secret
    
    helm install nvidia/gpu-operator \
       --set driver.repository=$PRIVATE_REGISTRY \
       --set driver.version=$VERSION \
       --set driver.imagePullSecrets={$REGISTRY_SECRET_NAME} \
       --set operator.defaultRuntime=containerd \
       --set driver.licensingConfig.configMapName=licensing-config

运维人员步骤 11:部署 AI/ML 工作负载

NVIDIA GPU Cloud 目录提供了几个现成的容器映像,可用于在启用了 vGPU 的 Tanzu Kubernetes 集群上运行 AI/ML 工作负载。有关可用映像的详细信息,请参见 NGC 文档