Distribuire le istanze di contenitore che usano risorse della GPU

Per eseguire determinati carichi di lavoro a elevato utilizzo di calcolo in istanze di Azure Container, distribuire i gruppi di contenitori con le risorse della GPU. Le istanze di contenitore nel gruppo possono accedere a una o più GPU NVIDIA Tesla durante l'esecuzione dei carichi di lavoro dei contenitori, ad esempio CUDA e applicazioni di Deep Learning.

Questo articolo illustra come aggiungere risorse GPU quando si distribuisce un gruppo di contenitori usando un file YAML o un modello di Resource Manager. È anche possibile specificare le risorse GPU quando si distribuisce un'istanza del contenitore usando il portale di Azure.

Importante

Gli SKU GPU K80 e P100 vengono ritirati entro il 31 agosto 2023. Ciò è dovuto al ritiro delle macchine virtuali sottostanti usate: serie NC e serie NCv2 anche se saranno disponibili SKU V100, è consigliabile usare servizio Azure Kubernetes. Le risorse GPU non sono completamente supportate e non devono essere usate per i carichi di lavoro di produzione. Usare le risorse seguenti per eseguire la migrazione al servizio Azure Kubernetes: Come eseguire la migrazione al servizio Azure Kubernetes.

Importante

Questa funzionalità è attualmente in anteprima e si applicano alcune limitazioni. Le anteprime vengono rese disponibili a condizione che l'utente accetti le condizioni supplementari per l'utilizzo. Alcuni aspetti di questa funzionalità potrebbero subire modifiche prima della disponibilità a livello generale.

Prerequisiti

Nota

A causa di alcune limitazioni correnti, non tutte le richieste di aumento del limite sono garantite per l'approvazione.

  • Se si vuole usare questo SKU per le distribuzioni di contenitori di produzione, creare una richiesta di supporto tecnico di Azure per aumentare il limite.

Limiti dell'anteprima

In fase di anteprima, durante l'uso di risorse della GPU in gruppi di contenitori si applicano le limitazioni seguenti.

Aree di disponibilità

Aree Sistema operativo SKU GPU disponibili
Stati Uniti orientali, Europa occidentale, Stati Uniti occidentali 2, Asia sud-orientale, India centrale Linux V100

In futuro verrà aggiunto il supporto di ulteriori aree.

Tipi di sistema operativo supportati: solo Linux

Limitazioni aggiuntive: le risorse GPU non possono essere usate durante la distribuzione di un gruppo di contenitori in una rete virtuale.

Informazioni sulle risorse GPU

Conteggio e SKU

Per usare le GPU in un'istanza di contenitore, specificare una risorsa GPU con le informazioni seguenti:

  • Count : numero di GPU: 1, 2 o 4.

  • SKU : SKU GPU: V100. Ogni SKU esegue il mapping alla GPU NVIDIA Tesla in una delle famiglie di macchine virtuali di Azure abilitate per la GPU seguenti:

    SKU Famiglia di macchine virtuali
    V100 NCv3

Numero massimo di risorse per SKU

Sistema operativo SKU GPU Conteggio GPU Max CPU (CPU max) Memoria massima (GB) Archiviazione (GB)
Linux V100 1 6 112 50
Linux V100 2 12 224 50
Linux V100 4 24 448 50

Quando si distribuiscono risorse GPU, impostare le risorse di CPU e memoria appropriate per il carico di lavoro, fino ai valori massimi visualizzati nella tabella precedente. Questi valori sono attualmente maggiori delle risorse di CPU e memoria disponibili nei gruppi di contenitori senza risorse GPU.

Importante

I limiti di sottoscrizione predefiniti (quote) per le risorse GPU differiscono per SKU. I limiti predefiniti della CPU per gli SKU V100 sono inizialmente impostati su 0. Per richiedere un aumento in un'area disponibile, inviare una richiesta di supporto tecnico di Azure.

Informazioni utili

  • Tempo di distribuzione: la creazione di un gruppo di contenitori con le risorse della GPU richiede fino a 8-10 minuti. Ciò è dovuto al tempo aggiuntivo necessario per il provisioning e la configurazione di una macchina virtuale della GPU in Azure.

  • Prezzi: simili ai gruppi di contenitori senza risorse della GPU, le fatture di Azure per le risorse usate per la durata di un gruppo di contenitori con risorse della GPU. La durata viene calcolata a partire dal pull dell'immagine del primo contenitore fino al termine del gruppo di contenitori. Non include il tempo necessario per distribuire il gruppo di contenitori.

    Vedi i dettagli sui prezzi.

  • Driver CUDA: poiché viene effettuato il pre-provisioning delle istanze di contenitore con risorse della GPU con i driver NVIDIA CUDA e i runtime dei contenitori, è possibile usare le immagini dei contenitori sviluppati per carichi di lavoro CUDA.

    In questa fase è supportato il supporto per CUDA 11. Ad esempio, è possibile usare le immagini di base seguenti per il Dockerfile:

    Nota

    Per migliorare l'affidabilità quando si usa un'immagine del contenitore pubblica dall'hub Docker, importare e gestire l'immagine in un registro contenitori di Azure privato e aggiornare il Dockerfile per usare l'immagine di base gestita privatamente. Altre informazioni sull'uso delle immagini pubbliche.

Esempio YAML

Un modo per aggiungere risorse GPU consiste nel distribuire un gruppo di contenitori tramite un file YAML. Copiare il file YAML seguente in un nuovo file denominato gpu-deploy-aci.yaml, quindi salvare il file. Questo YAML crea un gruppo di contenitori denominato gpucontainergroup che specifica un'istanza del contenitore con una GPU V100. L'istanza esegue un'applicazione di aggiunta vettore CUDA di esempio. Le richieste di risorse sono sufficienti per eseguire il carico di lavoro.

Nota

Nell'esempio seguente viene usata un'immagine del contenitore pubblica. Per migliorare l'affidabilità, importare e gestire l'immagine in un registro azure container privato e aggiornare il file YAML per usare l'immagine di base gestita privatamente. Altre informazioni sull'uso delle immagini pubbliche.

additional_properties: {}
apiVersion: '2021-09-01'
name: gpucontainergroup
properties:
  containers:
  - name: gpucontainer
    properties:
      image: k8s-gcrio.azureedge.net/cuda-vector-add:v0.1
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
          gpu:
            count: 1
            sku: V100
  osType: Linux
  restartPolicy: OnFailure

Distribuire il gruppo di contenitori con il comando az container create, specificando il nome di file YAML per il parametro --file. È necessario specificare il nome di un gruppo di risorse e un percorso per il gruppo di contenitori come eastus che supporta le risorse della GPU.

az container create --resource-group myResourceGroup --file gpu-deploy-aci.yaml --location eastus

La distribuzione richiede alcuni minuti. Viene quindi avviato il contenitore che esegue un'operazione di aggiunta vettore CUDA. Eseguire il comando az container logs per visualizzare l'output del log:

az container logs --resource-group myResourceGroup --name gpucontainergroup --container-name gpucontainer

Output:

[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

Esempio di modello di Resource Manager

Un altro modo per distribuire un gruppo di contenitori con le risorse GPU consiste nell'usare un modello di Resource Manager. Per iniziare, creare un file denominato gpudeploy.json e quindi copiarvi il codice JSON seguente. Questo esempio distribuisce un'istanza del contenitore con una GPU V100 che esegue un processo di training TensorFlow sul set di dati MNIST. Le richieste di risorse sono sufficienti per eseguire il carico di lavoro.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      "containerGroupName": {
        "type": "string",
        "defaultValue": "gpucontainergrouprm",
        "metadata": {
          "description": "Container Group name."
        }
      }
    },
    "variables": {
      "containername": "gpucontainer",
      "containerimage": "mcr.microsoft.com/azuredocs/samples-tf-mnist-demo:gpu"
    },
    "resources": [
      {
        "name": "[parameters('containerGroupName')]",
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2021-09-01",
        "location": "[resourceGroup().location]",
        "properties": {
            "containers": [
            {
              "name": "[variables('containername')]",
              "properties": {
                "image": "[variables('containerimage')]",
                "resources": {
                  "requests": {
                    "cpu": 4.0,
                    "memoryInGb": 12.0,
                    "gpu": {
                        "count": 1,
                        "sku": "V100"
                  }
                }
              }
            }
          }
        ],
        "osType": "Linux",
        "restartPolicy": "OnFailure"
        }
      }
    ]
}

Distribuire il modello con il comando az deployment group create . È necessario specificare il nome di un gruppo di risorse creato in un'area come eastus che supporta le risorse della GPU.

az deployment group create --resource-group myResourceGroup --template-file gpudeploy.json

La distribuzione richiede alcuni minuti. Viene quindi avviato il contenitore che esegue il processo TensorFlow. Eseguire il comando az container logs per visualizzare l'output del log:

az container logs --resource-group myResourceGroup --name gpucontainergrouprm --container-name gpucontainer

Output:

2018-10-25 18:31:10.155010: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2018-10-25 18:31:10.305937: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties:
name: Tesla V100 major: 3 minor: 7 memoryClockRate(GHz): 0.8235
pciBusID: ccb6:00:00.0
totalMemory: 11.92GiB freeMemory: 11.85GiB
2018-10-25 18:31:10.305981: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: Tesla V100, pci bus id: ccb6:00:00.0, compute capability: 3.7)
2018-10-25 18:31:14.941723: I tensorflow/stream_executor/dso_loader.cc:139] successfully opened CUDA library libcupti.so.8.0 locally
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Extracting /tmp/tensorflow/input_data/train-images-idx3-ubyte.gz
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Extracting /tmp/tensorflow/input_data/train-labels-idx1-ubyte.gz
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Extracting /tmp/tensorflow/input_data/t10k-images-idx3-ubyte.gz
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting /tmp/tensorflow/input_data/t10k-labels-idx1-ubyte.gz
Accuracy at step 0: 0.097
Accuracy at step 10: 0.6993
Accuracy at step 20: 0.8208
Accuracy at step 30: 0.8594
...
Accuracy at step 990: 0.969
Adding run metadata for 999

Pulire le risorse

Poiché l'utilizzo delle risorse GPU può risultare costoso, assicurarsi che i contenitori non vengono eseguiti in modo imprevisto per lunghi periodi di tempo. Monitorare i contenitori nel portale di Azure o controllare lo stato di un gruppo di contenitori con il comando az container show. Ad esempio:

az container show --resource-group myResourceGroup --name gpucontainergroup --output table

Dopo aver usato le istanze di contenitore create, eliminarle con i comandi seguenti:

az container delete --resource-group myResourceGroup --name gpucontainergroup -y
az container delete --resource-group myResourceGroup --name gpucontainergrouprm -y

Passaggi successivi