Le partage de GPU permet à plusieurs pods de s'exécuter sur la même carte GPU au sein d'un cluster managé ACK Lingjun. Selon que vos charges de travail nécessitent des limites de mémoire strictes, choisissez l'un des deux modes suivants :
| Mode | Fonctionnement | Mémoire GPU isolée ? | À utiliser lorsque |
|---|---|---|---|
| Partage sans isolation | Les pods partagent le GPU ; la mémoire n'est pas partitionnée entre eux | Non | Les charges de travail qui gèrent elles-mêmes leurs limites de mémoire (par exemple, les applications Java avec -Xmx) |
| Partage avec isolation (eGPU) | Les pods partagent le GPU ; chaque pod bénéficie d'une limite de mémoire stricte appliquée par le module eGPU | Oui | Plusieurs conteneurs s'exécutent sur un même GPU et l'un d'eux ne doit pas priver les autres de ressources |
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un cluster managé ACK Lingjun comportant au moins un nœud Lingjun accéléré par GPU. Consultez la rubrique Créer un cluster Lingjun avec ACK activé
Le composant de partage de GPU, installé par défaut dans les clusters managés ACK Lingjun
Activer le partage de GPU sans isolation
Utilisez ce mode lorsque vos charges de travail gèrent les limites de mémoire GPU au niveau de la couche applicative.
Étape 1 : Ajouter un libellé au nœud
Vérifiez que le nœud est bien un nœud Lingjun en contrôlant l'existence du fichier
/etc/lingjun_metadatasur le nœud. Si le fichier existe, exécutez la commandenvidia-smipour vérifier l'accessibilité du GPU. Si le fichier n'existe pas, le nœud n'est pas un nœud Lingjun et vous ne pouvez pas y activer le partage de GPU. Créez d'abord un pool de nœuds Lingjun. Consultez la rubrique Présentation des pools de nœuds Lingjun.-
Ajoutez le libellé de partage de GPU au nœud :
kubectl label node <NODE_NAME> ack.node.gpu.schedule=share
Étape 2 : Soumettre une tâche de partage de GPU
-
Créez un fichier nommé
tensorflow.yamlcontenant les informations suivantes :apiVersion: batch/v1 kind: Job metadata: name: tensorflow-mnist-share spec: parallelism: 1 template: metadata: labels: app: tensorflow-mnist-share spec: containers: - name: tensorflow-mnist-share image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5 command: - python - tensorflow-sample-code/tfjob/docker/mnist/main.py - --max_steps=100000 - --data_dir=tensorflow-sample-code/data resources: limits: aliyun.com/gpu-mem: 4 # Request 4 GiB of GPU memory workingDir: /root restartPolicy: NeverLe champ clé est
aliyun.com/gpu-mem: 4sousresources.limits, qui demande 4 Go de mémoire GPU pour le pod. -
Soumettez la tâche :
kubectl apply -f tensorflow.yaml
Étape 3 : Vérifier le partage de GPU sans isolation
-
Récupérez le nom du pod :
kubectl get pod | grep tensorflow -
Exécutez la commande
nvidia-smià l'intérieur du pod :kubectl exec -ti tensorflow-mnist-share-xxxxx -- nvidia-smiRésultat attendu :
Wed Jun 14 06:45:56 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 515.105.01 Driver Version: 515.105.01 CUDA Version: 11.7 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... On | 00000000:00:09.0 Off | 0 | | N/A 35C P0 59W / 300W | 334MiB / 16384MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| +-----------------------------------------------------------------------------+Points clés à vérifier :
Le champ Memory-Usage affiche
334MiB / 16384MiB: le pod voit la totalité des 16 384 MiB de mémoire GPU, et non pas seulement les 4 Go qu'il a demandés. Cela confirme que l'isolation n'est pas active.Si le module d'isolation GPU était installé, le champ de mémoire n'afficherait que les 4 Go demandés.
Dans ce mode, le pod n'applique pas de limites de mémoire au niveau du pilote GPU. Le planificateur suit les allocations de mémoire à l'aide de deux variables d'environnement injectées dans le conteneur. Les applications qui doivent respecter l'allocation peuvent calculer la fraction autorisée : 4 / 16 = 0.25 (25 % de la mémoire totale du GPU).
ALIYUN_COM_GPU_MEM_CONTAINER=4 # GPU memory allocated to this pod (GiB)
ALIYUN_COM_GPU_MEM_DEV=16 # Total GPU memory per card (GiB)
Activer le partage de GPU avec isolation (eGPU)
Utilisez ce mode pour appliquer des limites strictes de mémoire GPU entre les pods s'exécutant sur la même carte GPU.
Étape 1 : Ajouter un libellé au nœud
Vérifiez que le nœud est bien un nœud Lingjun en contrôlant l'existence du fichier
/etc/lingjun_metadatasur le nœud. Si le fichier existe, exécutez la commandenvidia-smipour vérifier l'accessibilité du GPU. Si le fichier n'existe pas, le nœud n'est pas un nœud Lingjun et vous ne pouvez pas y activer le partage de GPU. Créez d'abord un pool de nœuds Lingjun. Consultez la rubrique Présentation des pools de nœuds Lingjun.-
Ajoutez le libellé de partage de GPU au nœud. Choisissez la valeur du libellé en fonction du type d'isolation requis :
Valeur du libellé Ce qu'elle active egpu_memIsolation de la mémoire GPU uniquement egpu_core_memIsolation de la mémoire GPU et isolation de la puissance de calcul Pour activer l'isolation de la mémoire :
kubectl label node <NODE_NAME> ack.node.gpu.schedule=egpu_memLa puissance de calcul GPU doit toujours être demandée conjointement avec la mémoire GPU. La demande de puissance de calcul seule n'est pas prise en charge.
Étape 2 : Vérifier que les ressources du nœud sont prêtes
Après avoir ajouté le libellé au nœud, attendez que celui-ci signale ses ressources GPU, puis effectuez la vérification suivante :
kubectl get node <NODE_NAME> -oyaml
Recherchez les champs aliyun.com/gpu-mem et aliyun.com/gpu-count dans les sections allocatable et capacity :
allocatable:
aliyun.com/gpu-count: "1"
aliyun.com/gpu-mem: "80"
...
nvidia.com/gpu: "0"
...
capacity:
aliyun.com/gpu-count: "1"
aliyun.com/gpu-mem: "80"
...
nvidia.com/gpu: "0"
...
Points clés à vérifier :
aliyun.com/gpu-count: "1": le nœud dispose d'une carte GPU.aliyun.com/gpu-mem: "80": le nœud dispose de 80 Go de mémoire GPU totale.nvidia.com/gpu: "0": le GPU entier n'est pas exposé en tant que ressource planifiable indépendante ; la mémoire est allouée viaaliyun.com/gpu-mem.
Pour planifier un pod sur un périphérique GPU entier, ajoutez le libelléack.gpushare.placement=require-whole-deviceau pod et spécifiez la quantité de mémoire GPU à l'aide dealiyun.com/gpu-mem.
Étape 3 : Exécuter une tâche de référence pour vérifier l'isolation
-
Créez un fichier nommé
benchmark.yamlcontenant les informations suivantes :apiVersion: batch/v1 kind: Job metadata: name: benchmark-job spec: parallelism: 1 template: spec: containers: - name: benchmark-job image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3 command: - bash - run.sh - --num_batches=500000000 - --batch_size=8 resources: limits: aliyun.com/gpu-mem: 10 # Request 10 GB of GPU memory workingDir: /root restartPolicy: Never hostNetwork: true tolerations: - operator: Exists -
Soumettez la tâche :
kubectl apply -f benchmark.yaml -
Une fois le pod démarré, ouvrez un shell dans le pod :
kubectl exec -ti benchmark-job-xxxx bash -
Exécutez la commande
vgpu-smipour vérifier l'état de l'isolation GPU :Le champ Memory-Usage affiche
8307MiB / 10782MiB: le pod est limité à environ 10 Go, ce qui confirme que l'isolation de la mémoire GPU est active.Contrairement à la commande
nvidia-smiutilisée en mode non isolé, la commandevgpu-smin'affiche que la mémoire allouée à ce pod, et non la mémoire totale du GPU.
vgpu-smiRésultat attendu :
+------------------------------------------------------------------------------+ | VGPU_SMI 460.91.03 DRIVER_VERSION: 460.91.03 CUDA Version: 11.2 | +-------------------------------------------+----------------------------------+ | GPU Name Bus-Id | Memory-Usage GPU-Util | |===========================================+==================================| | 0 xxxxxxxx 00000000:00:07.0 | 8307MiB / 10782MiB 100% / 100% | +-------------------------------------------+----------------------------------+Points clés à vérifier :
FAQ
Comment vérifier si le composant de partage de GPU est installé ?
Exécutez la commande suivante :
kubectl get ds -nkube-system | grep gpushare
Si le composant est installé, la sortie liste les DaemonSets suivants :
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
gpushare-egpu-device-plugin-ds 0 0 0 0 0 <none>
gpushare-egpucore-device-plugin-ds 0 0 0 0 0 <none>
Étapes suivantes
Libellés pour activer les politiques de planification GPU : découvrez tous les libellés de nœud disponibles pour la planification GPU.
Présentation des pools de nœuds Lingjun : ajoutez des nœuds Lingjun à votre cluster.