GPU paylaşımı, birden çok pod'un tek bir GPU'nun hesaplama kaynaklarını paylaşmasına olanak tanıyarak GPU kullanımını artırır ve maliyetleri azaltır. Aynı GPU üzerindeki konteynerler birbirinden yalıtılmış şekilde çalışır; bu sayede bir konteyner ayrılan kaynakları aşamaz ve diğer konteynerleri etkilemez.
Bu konuda, bir ACK Edge kümesinde GPU paylaşımının nasıl etkinleştirileceği açıklanmaktadır.
Düğüm türüne göre özellik desteği
Cloud düğümleri ve edge düğüm havuzları farklı GPU paylaşım yeteneklerini destekler. Yapılandırma yolunu düğüm türünüz ve yalıtım gereksinimlerinize göre seçin.
| Özellik | Cloud düğümleri | Edge düğüm havuzları |
|---|---|---|
| GPU paylaşımı | Desteklenir | Desteklenir |
| GPU bellek yalıtımı | Desteklenir | Desteklenmez |
| Hesaplama gücü yalıtımı | Desteklenir | Desteklenmez |
Edge düğüm havuzları yalnızca GPU paylaşımını destekler. Bellek ve hesaplama gücü yalıtımı edge düğümler için kullanılamaz. İş yükleriniz bellek veya hesaplama gücü yalıtımı gerektiriyorsa cloud düğümlerini kullanın.
Ön koşullar
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
Kubernetes 1.18 veya sonraki bir sürümü çalışan bir ACK Edge kümesi. Daha fazla bilgi için bkz. ACK Edge kümesi oluşturma
Cloud-native AI suite etkinleştirilmiş durumda. Daha fazla bilgi için bkz. Cloud-native AI suite'a genel bakış ve Cloud-native AI suite faturalandırması
ACK Edge kümesinin kubeconfig dosyası alınmış ve kubectl kümeye bağlanmış durumda. Daha fazla bilgi için bkz. kubeconfig dosyasını alma ve kümeye bağlanma
Kullanım notları
ACK kümelerinde yönetilen GPU düğümleri için GPU kaynaklarını talep ederken ve kullanırken aşağıdaki kurallara uyun.
GPU kaynaklarını talep etmek için aşağıdaki yöntemlerden hiçbirini kullanmayın:
GPU ağırlıklı uygulamaları doğrudan düğümlerde çalıştırmak
Docker, Podman veya nerdctl kullanarak GPU talepleriyle konteynerler oluşturmak — örneğin,
docker run --gpus allveyadocker run -e NVIDIA_VISIBLE_DEVICES=allBir pod YAML dosyasının
envbölümüneNVIDIA_VISIBLE_DEVICES=allveyaNVIDIA_VISIBLE_DEVICES=<GPU ID>eklemekPod YAML'sinde
NVIDIA_VISIBLE_DEVICESbelirtilmediğinde, konteyner görüntüsü oluşturma sırasındaNVIDIA_VISIBLE_DEVICES=allayarlamakBir pod YAML dosyasının
securityContextbölümüneprivileged: trueeklemek
Bu yöntemler, zamanlayıcının cihaz kaynak defterini atlar. Sonuç olarak, gerçek GPU kaynak tahsisi zamanlayıcının izlediği değerlerden sapar ve zamanlayıcı aynı düğüme ek pod'lar zamanlar. Uygulamalar daha sonra aynı GPU için rekabet eder ve bazıları yetersiz GPU kaynağı nedeniyle başlatılamayabilir. Bu yöntemler ayrıca NVIDIA topluluğu tarafından bildirilenler gibi başka bilinmeyen sorunları da tetikleyebilir.
Adım 1: GPU paylaşım bileşenini yükleyin
GPU paylaşım bileşeni (ack-ai-installer), cloud-native AI suite'in bir parçasıdır. Mevcut dağıtım durumunuz için aşağıdaki adımları izleyin.
Cloud-native AI suite dağıtılmamışsa
ACK konsolu üzerinde oturum açın. Sol gezinme bölmesinde Clusters öğesine tıklayın.
Clusters sayfasında ilgili kümeyi bulun ve adına tıklayın. Sol gezinme bölmesinde Applications > Cloud-native AI Suite seçeneklerini belirleyin.
Cloud-native AI Suite sayfasında Deploy öğesine tıklayın.
Deploy Cloud-native AI Suite sayfasında Scheduling Policy Extension (Batch Task Scheduling, GPU Sharing, Topology-aware GPU Scheduling) seçeneğini belirleyin.
(İsteğe bağlı) Bileşenin yanındaki Advanced seçeneğine tıklayın. Parameters panelinde cGPU'nun
policyparametresini değiştirin ve OK öğesine tıklayın. Hesaplama gücü paylaşımı için özel bir gereksiniminiz yoksa varsayılanpolicy: 5değerini kullanın. Desteklenen ilkeler hakkında ayrıntılı bilgi için bkz. Install and use cGPU on a Docker container.
Sayfanın alt kısmında Deploy Cloud-native AI Suite öğesine tıklayın.
Dağıtım tamamlandıktan sonra ack-ai-installer, Cloud-native AI Suite sayfasında Deployed durumunda görünür.
Cloud-native AI suite zaten dağıtılmışsa
ACK konsolu üzerinde oturum açın. Sol gezinme bölmesinde Clusters öğesine tıklayın.
Clusters sayfasında ilgili kümeyi bulun ve adına tıklayın. Sol gezinme bölmesinde Applications > Cloud-native AI Suite seçeneklerini belirleyin.
ack-ai-installer öğesini bulun ve Actions sütunundaki Deploy öğesine tıklayın.
(İsteğe bağlı) Parameters panelinde cGPU'nun
policyparametresini değiştirin. Hesaplama gücü paylaşımı için özel bir gereksiniminiz yoksa varsayılanpolicy: 5değerini kullanın. Desteklenen ilkeler hakkında ayrıntılı bilgi için bkz. Install and use cGPU on a Docker container.
OK öğesine tıklayın.
ack-ai-installer yüklendikten sonra durumu Deployed olarak değişir.
Adım 2: Bir GPU düğüm havuzu oluşturun
Cloud düğüm havuzları
Clusters sayfasında ilgili kümeyi bulun ve adına tıklayın. Sol gezinme bölmesinde Nodes > Node Pools seçeneklerini belirleyin.
Node Pools sayfasının sağ üst köşesinde Create Node Pool öğesine tıklayın.
-
Create Node Pool iletişim kutusunda parametreleri yapılandırın ve Confirm Order öğesine tıklayın. Aşağıdaki tabloda anahtar parametreler açıklanmaktadır. Diğer parametreler için bkz. Create and manage a node pool.
ÖnemliBir düğüme GPU paylaşım etiketini ekledikten sonra, etiket değerini değiştirmek için
kubectl label nodesveya ACK konsolundaki etiket yönetimi özelliğini kullanmayın. Bu işlem zamanlama sorunlarına neden olabilir. GPU paylaşımını düğüm havuzu düzeyinde yapılandırın. Ayrıntılar için bkz. Configure GPU scheduling policies for node pools ve Issues that may occur if you change label values.Parametre Açıklama Expected nodes Başlangıçtaki düğüm sayısı. Boş bir düğüm havuzu oluşturmak için 0olarak ayarlayın.Node label
simgesine tıklayın, Key değerini ack.node.gpu.scheduleolarak ve Value değerinicgpuolarak ayarlayın. Bu etiket, GPU bellek yalıtımı ve hesaplama gücü paylaşımı ile GPU paylaşımını etkinleştirir; düğümdeki pod'lar yalnızca GPU belleği talep eder ve birden çok pod aynı GPU'yu paylaşabilir. Daha fazla bilgi için bkz. Labels for enabling GPU scheduling policies.
Edge düğüm havuzları
Clusters sayfasında ilgili kümeyi bulun ve adına tıklayın. Sol gezinme bölmesinde Nodes > Node Pools seçeneklerini belirleyin.
Node Pools sayfasında Create Node Pool öğesine tıklayın.
Create Node Pool iletişim kutusunda parametreleri yapılandırın ve Confirm Order öğesine tıklayın. Node Labels bölümünde
simgesine tıklayın, Key değerini ack.node.gpu.scheduleolarak ve Value değerinishareolarak ayarlayın. Bu etiket GPU paylaşımını etkinleştirir. Diğer parametreler için bkz. Edge node pool management. Düğüm etiketleri hakkında daha fazla bilgi için bkz. Labels for enabling GPU scheduling policies.
Adım 3: GPU hızlandırmalı düğümler ekleyin
Cloud düğümleri
Düğüm havuzunu oluştururken zaten GPU hızlandırmalı düğümler eklediyseniz bu adımı atlayın.
Cloud düğüm havuzuna GPU-accelerated mimarisine sahip ECS örnekleri ekleyin. Daha fazla bilgi için bkz. Add existing ECS instances veya Create and manage a node pool.
Edge düğümleri
Daha fazla bilgi için bkz. GPU hızlandırmalı bir düğüm ekleme.
Adım 4: GPU denetim aracını yükleyin (yalnızca cloud düğümleri)
Küme genelinde GPU bellek tahsisini denetlemek için kubectl-inspect-cgpu kullanın. Bu adım yalnızca cloud düğümleri için geçerlidir.
-
kubectl-inspect-cgpu uygulamasını PATH'inizde bulunan bir dizine indirin. Bu örnekte
/usr/local/bin/kullanılmaktadır.Linux: ``
bash wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-linux -O /usr/local/bin/kubectl-inspect-cgpu``macOS: ``
bash wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-darwin -O /usr/local/bin/kubectl-inspect-cgpu``
-
Çalıştırma izinlerini verin:
chmod +x /usr/local/bin/kubectl-inspect-cgpu -
Küme genelinde GPU kullanımını sorgulayın:
kubectl inspect cgpuBeklenen çıktı:
NAME IPADDRESS GPU0(Allocated/Total) GPU Memory(GiB) cn-shanghai.192.168.6.104 192.168.6.104 0/15 0/15 ---------------------------------------------------------------------- Allocated/Total GPU Memory In Cluster: 0/15 (0%)Pod başına GPU tahsis ayrıntılarını görüntülemek için
kubectl inspect cgpu -dkomutunu çalıştırın.
Adım 5: Örnek bir iş yükü dağıtın
Cloud düğüm havuzları
-
Mevcut GPU bellek tahsisini kontrol edin:
kubectl inspect cgpuBeklenen çıktı:
NAME IPADDRESS GPU0(Allocated/Total) GPU1(Allocated/Total) GPU Memory(GiB) cn-shanghai.192.168.0.4 192.168.0.4 0/7 0/7 0/14 --------------------------------------------------------------------- Allocated/Total GPU Memory In Cluster: 0/14 (0%) -
3 GiB GPU belleği talep eden örnek bir Job dağıtın.
npxxxxxxxxxxxxxxyerine kendi düğüm havuzu ID'nizi yazın.apiVersion: batch/v1 kind: Job metadata: name: gpu-share-sample spec: parallelism: 1 template: metadata: labels: app: gpu-share-sample spec: nodeSelector: alibabacloud.com/nodepool-id: npxxxxxxxxxxxxxx # Replace with your node pool ID containers: - name: gpu-share-sample image: registry.cn-hangzhou.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: 3 # GPU memory to request, in GiB workingDir: /root restartPolicy: Neveraliyun.com/gpu-memalanı, GiB cinsinden GPU belleği miktarını belirtir. Örneğin,3değeri paylaşılan GPU'dan 3 GiB GPU belleği talep eder.
Edge düğüm havuzları
4 GiB GPU belleği talep eden örnek bir Job dağıtın. npxxxxxxxxxxxxxx yerine kendi edge düğüm havuzu ID'nizi yazın.
apiVersion: batch/v1
kind: Job
metadata:
name: tensorflow-mnist-share
spec:
parallelism: 1
template:
metadata:
labels:
app: tensorflow-mnist-share
spec:
nodeSelector:
alibabacloud.com/nodepool-id: npxxxxxxxxxxxxxx # Replace with your edge node pool ID
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 # GPU memory to request, in GiB
workingDir: /root
restartPolicy: Never
Adım 6: Sonuçları doğrulayın
Cloud düğüm havuzları
Denetim düzlemine oturum açın.
-
GPU bellek yalıtımının aktif olduğunu onaylamak için pod'un son günlük satırını yazdırın:
kubectl logs gpu-share-sample --tail=1Beklenen çıktı:
2023-08-07 09:08:13.931003: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1326] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 2832 MB memory) -> physical GPU (device: 0, name: Tesla T4, pci bus id: 0000:00:07.0, compute capability: 7.5)Çıktı, konteyner tarafından 2.832 MiB GPU belleği talep edildiğini gösterir.
-
Konteynerin gördüğü belleği görüntülemek için konteyner içinde nvidia-smi çalıştırın:
3043MiB / 3231MiB— Konteyner yalnızca 3.231 MiB (yaklaşık 3 GiB) bellek görür, tüm GPU belleğini değil. Bu, GPU bellek yalıtımının çalıştığını doğrular.
kubectl exec -it gpu-share-sample nvidia-smiBeklenen çıktı:
Mon Aug 7 08:52:18 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.87.01 Driver Version: 418.87.01 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 Tesla T4 On | 00000000:00:07.0 Off | 0 | | N/A 41C P0 26W / 70W | 3043MiB / 3231MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| +-----------------------------------------------------------------------------+Anahtar hususlar:
-
Toplam GPU belleğini görüntülemek için düğümde nvidia-smi çalıştırın:
15079MiB— Düğümdeki toplam GPU belleği (tam Tesla T4)3053MiB / 15079MiB— Konteyner, 15.079 MiB toplam belleğin 3.053 MiB'ini kullanır ve geri kalan belleği aynı GPU'yu paylaşacak diğer pod'lar için kullanılabilir bırakır.
nvidia-smiBeklenen çıktı:
Mon Aug 7 09:18:26 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.87.01 Driver Version: 418.87.01 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 Tesla T4 On | 00000000:00:07.0 Off | 0 | | N/A 40C P0 26W / 70W | 3053MiB / 15079MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | 0 8796 C python3 3043MiB | +-----------------------------------------------------------------------------+Anahtar hususlar:
Edge düğüm havuzları
Clusters sayfasında ilgili kümeyi bulun ve adına tıklayın. Sol gezinme bölmesinde Workloads > Pods seçeneklerini belirleyin.
-
Pod'unuzun (örneğin,
tensorflow-mnist-multigpu-***) Actions sütununda Terminal öğesine tıklayın ve şunu çalıştırın:16384MiB— Pod, tam GPU belleğini (V100 SXM2, 16 GiB) görür. Edge düğüm havuzları GPU paylaşımını destekler ancak GPU bellek yalıtımını desteklemez; bu nedenle pod'un görünümü talep ettiği 4 GiB ile sınırlı değildir.Pod'un gerçek GPU belleği kullanımı, GPU paylaşım bileşeni tarafından otomatik olarak ayarlanan ortam değişkenleri tarafından yönetilir: ``
ALIYUN_COM_GPU_MEM_CONTAINER=4 # GPU memory the pod is allocated (GiB) ALIYUN_COM_GPU_MEM_DEV=16 # Total memory of the physical GPU (GiB)``Tahsis edilen toplam GPU belleğinin oranı:
4 / 16 = 0.25(%25)
nvidia-smiBeklenen çıktı:
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 | |=============================================================================| +-----------------------------------------------------------------------------+Anahtar hususlar:
Sonraki adımlar
GPU sharing overview — temel cGPU mekanizması hakkında bilgi edinin
GPU sharing component installation — ack-ai-installer'ı güncelleyin
Disable the memory isolation feature of cGPU — cloud düğümlerinde GPU bellek yalıtımı olmadan bir iş yükü çalıştırın
Advanced capabilities — topolojiye duyarlı zamanlama ve diğer gelişmiş GPU paylaşım özellikleri