GKE (Google Kubernetes Engine)#
概述#
版本 3.1 中新增。
Google Kubernetes Engine (GKE) 提供了一个托管环境,用于使用 Google 基础设施部署、管理和扩展容器化应用程序。NVIDIA AI Enterprise 是 NVIDIA AI 平台的端到端软件,支持在 GKE 上运行。GKE 环境由多台机器(特别是 Compute Engine 实例)组合在一起,形成一个集群。本指南详细介绍了如何在具有 NVIDIA GPU 加速节点的 GKE 集群上部署和运行 NVIDIA AI Enterprise。
注意
NVIDIA Terraform 模块提供了一种简便的方法来部署托管 Kubernetes 集群,当与受支持的操作系统和 GPU Operator 版本一起使用时,这些集群可以由 NVIDIA AI Enterprise 支持。
先决条件#
通过 BYOL 或私有报价获得的 NVIDIA AI Enterprise 许可证
-
注意
NVIDIA 建议通过下载 linux google-cloud-cli-xxx.x.x-linux-x86_64.tar.gz 文件来安装 Google Cloud CLI。如果使用不同的操作系统发行版,请继续按照 Google 的说明操作以获取所需的操作系统。
具有 Google Kubernetes Engine 管理员角色和 Kubernetes Engine 集群管理员角色的 Google Cloud 帐户,有关更多信息,请参阅 Google 的 IAM 策略
Ubuntu 节点
创建 GKE 集群#
运行以下命令以安装 GKE 组件。
1./google-cloud-sdk/bin/gcloud components install beta
2./google-cloud-sdk/bin/gcloud components install kubectl
3./google-cloud-sdk/bin/gcloud components update
运行以下命令以创建 GKE 集群。
1./google-cloud-sdk/bin/gcloud beta container --project <Google-Project-ID> clusters create <GKE-Cluster-Name> --zone us-west1-a --release-channel "regular" --machine-type "n1-standard-4" --accelerator "type=nvidia-tesla-t4,count=1" --image-type "UBUNTU_CONTAINERD" --disk-type "pd-standard" --disk-size "1000" --no-enable-intra-node-visibility --metadata disable-legacy-endpoints=true --max-pods-per-node "110" --num-nodes "1" --logging=SYSTEM,WORKLOAD --monitoring=SYSTEM --enable-ip-alias --no-enable-intra-node-visibility --default-max-pods-per-node "110" --no-enable-master-authorized-networks --tags=nvidia-ingress-all
注意
<Google-Project-ID>
:您将在 Google 控制台仪表板“设置”中找到项目 ID,并进行相应的更新。如果网络名称不是“default”,则从控制台获取网络信息,并将以下值附加到相应的网络和子网名称。
1--network "<Google Kubernetes Network Name>" --subnetwork "<Google Kubernetes SubNetwork Name>"
2
3Example:
4
5--network "projects/<GKE-Project-ID>/global/networks/<GKE-Network-Name>" --subnetwork "projects/<GKE-Project-ID>/regions/us-west1/subnetworks/<GKE-Network-Name>"
运行以下命令以获取 kubeconfig 凭据到本地系统。
1$ export USE_GKE_GCLOUD_AUTH_PLUGIN=True
2
3./google-cloud-sdk/bin/gcloud container clusters get-credentials <GKE-Cluster-Name> --zone us-west1-a
运行以下命令以验证节点信息
kubectl get nodes -o wide
示例输出结果
1NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
2gke-<GKE-Cluster-Name>-default-pool-db9e3df9-r0jf Ready <none> 5m15s v1.25.6 192.168.50.108 13.57.187.63 Ubuntu 20.04.6 LTS 5.15.0-1033-gke containerd://1.6.12
创建资源以在 GKE 上安装 GPU Operator#
使用以下命令创建资源配额文件。
1cat <<EOF | tee resourcequota.yaml
2apiVersion: v1
3kind: ResourceQuota
4metadata:
5name: gpu-operator-quota
6namespace: gpu-operator
7spec:
8hard:
9 pods: 100
10scopeSelector:
11 matchExpressions:
12 - operator: In
13 scopeName: PriorityClass
14 values:
15 - system-node-critical
16 - system-cluster-critical
17EOF
运行以下命令以在 GKE 集群上创建命名空间和资源配额到命名空间。
1./google-cloud-sdk/bin/kubectl create ns gpu-operator
2
3./google-cloud-sdk/bin/kubectl apply -f resourcequota.yaml
4
5./google-cloud-sdk/bin/kubectl get ResourceQuota -n gpu-operator
示例输出结果
1NAME AGE REQUEST LIMIT
2gke-resource-quotas 24s count/ingresses.extensions: 0/100, count/ingresses.networking.k8s.io: 0/100, count/jobs.batch: 0/5k, pods: 0/1500, services: 0/500
3gpu-operator-quota 21s pods: 0/100
有关更多信息,请参阅 GKE 的配额和限制概述
使用以下命令验证 GKE 上的默认 Pod 安全策略。
./google-cloud-sdk/bin/kubectl get psp
示例输出结果
1Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
2NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS VOLUMES
3gce.gke-metrics-agent false RunAsAny RunAsAny RunAsAny RunAsAny false hostPath,secret,configMap
部署 GPU Operator#
现在集群和适当的资源已创建,可以安装 NVIDIA GPU Operator
首先,我们将访问我们的 NGC API 密钥。
登录您的 NGC 帐户 并生成新的 API 密钥或找到您现有的 API 密钥。请参阅附录的访问 NGC部分。
生成用于访问目录的 API 密钥
接下来,您必须生成一个 API 密钥,该密钥将允许您访问 NGC 目录。
导航到右上角的用户帐户图标,然后选择 设置。
![]()
![]()
选择 获取 API 密钥 以打开“设置”>“API 密钥”页面。
选择 生成 API 密钥 以生成您的 API 密钥。
选择 确认 以生成密钥,并从页面底部复制它。NGC 不会保存您的密钥,因此请将其存储在安全的地方。
![]()
注意
生成新的 API 密钥会使先前生成的密钥失效。
添加 Helm 仓库并使用以下命令更新。
1helm repo add nvidia https://helm.ngc.nvidia.com/nvaie --username='$oauthtoken' --password=<YOUR API KEY>
2helm repo update
在“gpu-operator”命名空间上使用您的 NGC API 密钥创建一个 NGC Secret,如下所示。
1./google-cloud-sdk/bin/kubectl create secret docker-registry ngc-secret \
2--docker-server=nvcr.io/nvaie --docker-username=\$oauthtoken \
3--docker-password=<NGC-API-KEY> \
4--docker-email=<NGC-email> -n gpu-operator
创建一个空的 gridd.conf 文件,然后使用 NVIDIA vGPU 许可证令牌文件创建一个 configmap,如下所示
./google-cloud-sdk/bin/kubectl create configmap licensing-config -n gpu-operator --from-file=./client_configuration_token.tok --from-file=./gridd.conf
注意
configmap 将查找文件 client_configuration_token.tok,如果您的令牌采用不同的形式,例如 client_configuration_token_date_xx_xx.tok
,请运行以下命令
mv client_configuration_token_date_xx_xx.tok client_configuration_token.tok
从 NGC 目录安装带有许可证令牌和驱动程序仓库的 GPU Operator。
helm install gpu-operator nvidia/gpu-operator-3-0 --version 22.9.1 --set driver.repository=nvcr.io/nvaie,driver.licensingConfig.configMapName=licensing-config,psp.enabled=true --namespace gpu-operator
重要提示
确保您具有 Kubernetes Engine 管理员或 Kubernetes Engine 集群管理员的正确角色,以便安装 GPU Operator。如果您缺少所需的权限,请参阅创建 IAM 策略。
安装完成后,请至少等待 5 分钟,并验证所有 Pod 是否都正在运行或已完成,如下所示。
1./google-cloud-sdk/bin/kubectl get pods -n gpu-operator
2NAME READY STATUS RESTARTS AGE
3gpu-feature-discovery-fzgv9 1/1 Running 0 6m1s
4gpu-operator-69f476f875-w4hwr 1/1 Running 0 6m29s
5gpu-operator-node-feature-discovery-master-84c7c7c6cf-hxlk4 1/1 Running 0 6m29s
6gpu-operator-node-feature-discovery-worker-86bbx 1/1 Running 0 6m29s
7nvidia-container-toolkit-daemonset-c7k5p 1/1 Running 0 6m
8nvidia-cuda-validator-qjcsf 0/1 Completed 0 59s
9nvidia-dcgm-exporter-9tggn 1/1 Running 0 6m
10nvidia-device-plugin-daemonset-tpx9z 1/1 Running 0 6m
11nvidia-device-plugin-validator-gz85d 0/1 Completed 0 44s
12nvidia-driver-daemonset-jwzx8 1/1 Running 0 6m9s
13nvidia-operator-validator-qj57n 1/1 Running 0 6m
验证 GPU Operator 安装#
使用以下命令验证 NVIDIA GPU 驱动程序是否已加载。
./google-cloud-sdk/bin/kubectl exec -it nvidia-driver-daemonset-jwzx8 -n gpu-operator -- nvidia-smi
1Defaulted container "nvidia-driver-ctr" out of: nvidia-driver-ctr, k8s-driver-manager (init)
2Tue Feb 14 22:24:31 2023
3+-----------------------------------------------------------------------------+
4| NVIDIA-SMI 520.60.13 Driver Version: 520.60.13 CUDA Version: 12.0 |
5|-------------------------------+----------------------+----------------------+
6| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
7| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
8| | | MIG M. |
9|===============================+======================+======================|
10| 0 Tesla T4 On | 00000000:00:04.0 Off | 0 |
11| N/A 51C P8 17W / 70W | 0MiB / 15360MiB | 0% Default |
12| | | N/A |
13+-------------------------------+----------------------+----------------------+
14
15+-----------------------------------------------------------------------------+
16| Processes: |
17| GPU GI CI PID Type Process name GPU Memory |
18| ID ID Usage |
19|=============================================================================|
20| No running processes found |
21+-----------------------------------------------------------------------------+
注意
nvidia-driver-daemonset-xxxxx
在您自己的环境中会有所不同,以上命令用于验证 NVIDIA vGPU 驱动程序。
使用以下命令验证 NVIDIA vGPU 许可证信息
./google-cloud-sdk/bin/kubectl exec -it nvidia-driver-daemonset-jwzx8 -n gpu-operator-resources -- nvidia-smi -q
运行示例 NVIDIA AI Enterprise 容器#
创建一个 docker-regirty Secret。这将用于自定义 yaml 文件中,以从 NGC 目录拉取容器。
1./google-cloud-sdk/bin/kubectl create secret docker-registry regcred --docker-server=nvcr.io/nvaie --docker-username=\$oauthtoken --docker-password=<YOUR_NGC_KEY> --docker-email=<your_email_id> -n default
创建一个自定义 yaml 文件以部署 NVIDIA AI Enterprise 容器并运行示例训练代码。
nano pytoch-mnist.yaml
将以下内容粘贴到文件中并保存
1---
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5 name: pytorch-mnist
6 labels:
7 app: pytorch-mnist
8spec:
9 replicas: 1
10 selector:
11 matchLabels:
12 app: pytorch-mnist
13template:
14 metadata:
15 labels:
16 app: pytorch-mnist
17 spec:
18 containers:
19 - name: pytorch-container
20 image: nvcr.io/nvaie/pytorch-2-0:22.02-nvaie-2.0-py3
21 command:
22 - python
23 args:
24 - /workspace/examples/upstream/mnist/main.py
25 resources:
26 requests:
27 nvidia.com/gpu: 1
28 limits:
29 nvidia.com/gpu: 1
30 imagePullSecrets:
31 - name: regcred
检查 Pod 的状态。
1./google-cloud-sdk/bin/kubectl get pods
查看示例 mnist 训练作业的输出。
1./google-cloud-sdk/bin/kubectl logs -l app=pytorch-mnist
输出将类似于这样。
1~$ ./google-cloud-sdk/bin/kubectl logs -l app=pytorch-mnist
2Train Epoch: 7 [55680/60000 (93%)] Loss: 0.040756
3Train Epoch: 7 [56320/60000 (94%)] Loss: 0.028230
4Train Epoch: 7 [56960/60000 (95%)] Loss: 0.019917
5Train Epoch: 7 [57600/60000 (96%)] Loss: 0.005957
6Train Epoch: 7 [58240/60000 (97%)] Loss: 0.003768
7Train Epoch: 7 [58880/60000 (98%)] Loss: 0.277371
8Train Epoch: 7 [59520/60000 (99%)] Loss: 0.115487
9
10
11Test set: Average loss: 0.0270, Accuracy: 9913/10000 (99%)
删除 GKE 集群#
运行以下命令以删除 GKE 集群
./google-cloud-sdk/bin/gcloud beta container clusters delete <cluster-name> --zone <zone-name>