Déployer des instances de conteneur qui utilisent des ressources GPU

Pour exécuter certaines charges de travail nécessitant beaucoup de ressources système sur Azure Container Instances, déployez vos groupes de conteneurs avec des ressources GPU. Les instances de conteneur dans le groupe peuvent accéder à un ou plusieurs GPU NVIDIA Tesla pendant l’exécution de charges de travail de conteneur comme CUDA et les applications de Deep Learning.

Cet article indique comment ajouter des ressources GPU lorsque vous déployez un groupe de conteneurs avec un fichier YAML ou un modèle Resource Manager. Vous pouvez également spécifier des ressources GPU lorsque vous déployez une instance de conteneur à l’aide du portail Azure.

Important

Les références SKU K80 et P100 du GPU seront retirées du marché d'ici le 31 août 2023. Cela est dû à la mise hors service des machines virtuelles sous-jacentes utilisées : série NC et série NCv2. Bien que les références SKU V100 soient disponibles, il est recommandé d’utiliser plutôt Azure Kubernetes Service. Les ressources du GPU ne sont pas entièrement prises en charge et ne doivent pas servir pour les charges de travail de production. Utilisez les ressources suivantes pour effectuer une migration vers AKS aujourd’hui : Guide pratique pour migrer vers AKS.

Important

Cette fonctionnalité est actuellement en préversion et certaines limitations s’appliquent. Les préversions sont à votre disposition, à condition que vous acceptiez les conditions d’utilisation supplémentaires. Certains aspects de cette fonctionnalité sont susceptibles d’être modifiés avant la mise à disposition générale.

Prérequis

Notes

En raison de certaines limitations actuelles, il n’y a pas de garantie que toutes les demandes d’augmentation de la limite soient approuvées.

  • Si vous souhaitez utiliser cette référence SKU pour vos déploiements de conteneur de production, créez une demande de support Azure afin d'augmenter la limite.

Limitations de la version préliminaire

Dans la préversion, les limites suivantes s’appliquent lors de l’utilisation de ressources GPU dans les groupes de conteneurs.

Disponibilité des régions

Régions Système d''exploitation Références SKU GPU disponibles
USA Est, Europe Ouest, USA Ouest 2, Asie Sud-Est, Inde Centre Linux V100

D’autres régions seront également prises en charge au fil du temps.

Types de systèmes d’exploitation pris en charge : Linux uniquement

Limites supplémentaires : Les ressources GPU ne peuvent pas être utilisées lors du déploiement d’un groupe de conteneurs dans un réseau virtuel.

À propos des ressources GPU

Nombre et référence SKU

Pour utiliser des GPU dans une instance de conteneur, vous devez spécifier une ressource GPU avec les informations suivantes :

  • Nombre : nombre de GPU : 1, 2 ou 4.

  • Référence SKU : référence SKU du GPU : V100. Chaque référence SKU est mappée au GPU NVIDIA Tesla dans l’une des familles de machines virtuelles Azure compatibles GPU suivantes :

    SKU Famille de machines virtuelles
    V100 NCv3

Quantité de ressources maximale par référence SKU

Système d''exploitation RÉFÉRENCE SKU DE GPU Nombre de GPU Utilisation maximale du processeur Mémoire max. (GB) Stockage (Go)
Linux V100 1 6 112 50
Linux V100 2 12 224 50
Linux V100 4 24 448 50

Lors du déploiement des ressources GPU, définissez des ressources UC et mémoire appropriées pour la charge de travail, jusqu’aux valeurs maximales indiquées dans le tableau précédent. Ces valeurs sont actuellement supérieures aux ressources disponibles pour l’UC et la mémoire dans les groupes de conteneurs sans ressources GPU.

Important

Les limites d’abonnement par défaut (quotas) pour les ressources GPU diffèrent par référence (SKU). Les limites d’UC par défaut pour les références SKU V100 sont initialement définies sur 0. Pour demander une augmentation dans une région disponible, veuillez envoyer une demande de support Azure.

À savoir

  • Durée de déploiement : la création d’un groupe de conteneurs comportant des ressources GPU peut prendre jusqu’à 8 à 10 minutes. Ce délai est dû au temps supplémentaire nécessaire pour la gestion et la configuration d’une machine virtuelle GPU dans Azure.

  • Tarification : semblable aux groupes de conteneurs sans ressources GPU ; factures Azure pour les ressources consommées sur la durée d’un groupe de conteneurs avec ressources GPU. La durée est calculée à partir du début de l’extraction de l’image de votre premier conteneur jusqu’à la fin de l’exécution du groupe de conteneurs. Elle n’inclut pas le temps de déploiement du groupe de conteneurs.

    Consultez les détails de la tarification.

  • Pilotes CUDA : les instances de conteneur avec ressources GPU sont préconfigurées avec des pilotes NVIDIA CUDA et des runtimes de conteneur. Vous pouvez donc utiliser des images de conteneur développées pour les charges de travail CUDA.

    Nous prenons en charge les versions allant jusqu’à CUDA 11 à ce stade. Par exemple, vous pouvez utiliser les images de base suivantes pour votre fichier Docker :

    Notes

    Pour améliorer la fiabilité lors de l’utilisation d’une image de conteneur publique depuis Docker Hub, importez et gérez l’image dans un registre de conteneurs Azure privé et mettez à jour votre fichier Dockerfile pour qu’il utilise votre image de base gérée en privé. En savoir plus sur l’utilisation des images publiques.

Exemple YAML

Une façon d’ajouter des ressources GPU est de déployer un groupe de conteneurs en utilisant un fichier YAML. Copiez le YAML suivant dans un nouveau fichier nommé gpu-deploy-aci.yaml, puis enregistrez le fichier. Ce YAML crée un groupe de conteneurs nommé gpucontainergroup et spécifie une instance de conteneur avec un GPU V100. L’instance exécute un exemple d’application d’ajout de vecteur CUDA. Les requêtes de ressources sont suffisantes pour exécuter la charge de travail.

Notes

L’exemple suivant utilise une image conteneur publique. Pour améliorer la fiabilité, importez et gérez l’image dans un registre de conteneurs Azure privé et mettez à jour votre fichier YAML pour qu’il utilise votre image de base gérée en privé. En savoir plus sur l’utilisation des images publiques.

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

Déployez le groupe de conteneurs avec la commande az container create, en spécifiant le nom du fichier YAML dans le paramètre --file. Vous devez fournir le nom d’un groupe de ressources et un emplacement pour le groupe de conteneurs tel que eastus, qui prend en charge les ressources GPU.

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

Le déploiement prend plusieurs minutes. Ensuite, le conteneur démarre et exécute une opération d’ajout de vecteur CUDA. Exécutez la commande az container logs pour afficher la sortie du journal d’activité :

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

Sortie :

[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

Exemple de modèle Resource Manager

Une autre façon de déployer un groupe de conteneurs avec des ressources GPU est d’utiliser un modèle Resource Manager. Commencez par créer un fichier nommé gpudeploy.json, puis copiez-y le code JSON suivant. Cet exemple déploie une instance de conteneur avec un GPU V100 qui exécute un travail de formation TensorFlow pour le jeu de données MNIST. Les requêtes de ressources sont suffisantes pour exécuter la charge de travail.

{
    "$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"
        }
      }
    ]
}

Déployez ensuite le modèle avec la commande az deployment group create. Vous devez fournir le nom d’un groupe de ressources qui a été créé dans une région telle que eastus et qui prend en charge les ressources GPU.

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

Le déploiement prend plusieurs minutes. Ensuite, le conteneur démarre et exécute le travail TensorFlow. Exécutez la commande az container logs pour afficher la sortie du journal d’activité :

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

Sortie :

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

Nettoyer les ressources

Étant donné que l’utilisation des ressources GPU peut être onéreuse, assurez-vous que vos conteneurs ne s’exécutent pas de manière inattendue pendant de longues périodes. Surveillez vos conteneurs sur le Portail Azure ou vérifiez l’état d’un groupe de conteneurs avec la commande az container show. Par exemple :

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

Lorsque vous avez fini d’utiliser les instances de conteneur que vous avez créées, supprimez-les avec les commandes suivantes :

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

Étapes suivantes