Bonnes pratiques pour l'utilisation des GPU Dataflow

Cette page décrit les bonnes pratiques à adopter pour créer des pipelines à l'aide de GPU.

Pour obtenir des informations et des exemples sur la façon d'activer les GPU dans vos tâches Dataflow, consultez les pages Exécuter un pipeline avec des GPU et Traiter les images satellite Landsat avec des GPU.

Conditions préalables à l'utilisation de GPU dans Dataflow

  • Pour utiliser des GPU avec votre tâche Dataflow, vous devez utiliser l'exécuteur v2.
  • Dataflow exécute le code utilisateur dans des VM de nœud de calcul dans un conteneur Docker. Ces VM de nœud de calcul exécutent Container-Optimized OS. Pour que les tâches Dataflow puissent utiliser des GPU, vous devez remplir les conditions préalables suivantes :
  • Les conteneurs de GPU étant généralement volumineux, pour éviter de manquer d'espace disque, augmentez la taille du disque de démarrage par défaut à 50 gigaoctets ou plus.

Remarques

Lorsque vous concevez des environnements de test et de production, tenez compte des facteurs suivants.

Développement local

L'utilisation d'Apache Beam avec des GPU NVIDIA vous permet de créer des pipelines de traitement de données à grande échelle pour gérer le prétraitement et l'inférence. Lorsque vous utilisez des GPU pour le développement local, tenez compte des informations suivantes :

  • Souvent, les workflows de traitement des données utilisent des bibliothèques supplémentaires que vous devez installer dans l'environnement de lancement et dans l'environnement d'exécution sur les nœuds de calcul Dataflow. Cette configuration ajoute des étapes au workflow de développement pour configurer les exigences de pipeline ou pour utiliser des conteneurs personnalisés dans Dataflow. Il est avantageux de disposer d'un environnement de développement local qui imite l'environnement de production le plus près possible.

  • Si votre workflow répond aux deux critères suivants, vous n'avez pas besoin de créer des conteneurs personnalisés ou de modifier votre workflow de développement pour configurer les exigences du pipeline :

    • Vous utilisez une bibliothèque qui utilise implicitement des GPU NVIDIA.
    • Votre code ne nécessite aucune modification pour assurer la compatibilité avec les GPU.
  • Certaines bibliothèques ne changent pas de manière transparente entre l'utilisation du processeur et du GPU. Par conséquent, elles nécessitent des compilations spécifiques et des chemins de code différents. Pour répliquer le cycle de vie du développement d'exécution du code pour ce scénario, des étapes supplémentaires sont nécessaires.

  • Lors de l'exécution de tests locaux, répliquez l'environnement du nœud de calcul Dataflow aussi fidèlement que possible. En fonction de la bibliothèque, vous aurez peut-être besoin d'une machine dotée d'un GPU et des bibliothèques de GPU requises. Ce type de machine peut ne pas être disponible dans votre environnement local. Vous pouvez émuler l'environnement d'exécution Dataflow à l'aide d'un conteneur s'exécutant sur une machine virtuelle Google Cloud équipée de GPU.

Spécifications de types de machines

Pour en savoir plus sur la compatibilité des types de machines avec chaque modèle de GPU, consultez la page Plates-formes de GPU. Les GPU compatibles avec les types de machines N1 sont également compatibles avec les types de machines N1 personnalisés.

Le type et le nombre de GPU définissent les restrictions de limites supérieures applicables au nombre de processeurs virtuels et à la quantité de mémoire disponibles sur les nœuds de calcul. Pour connaître les restrictions correspondantes, consultez la section Disponibilité.

Si vous spécifiez un nombre plus élevé de processeurs ou une plus grande quantité de mémoire, vous devrez spécifier un nombre de GPU plus élevé.

Pour en savoir plus, consultez la page GPU sur Compute Engine.

Optimiser l'utilisation des ressources

La plupart des pipelines ne sont pas entièrement composés de transformations nécessitant un GPU. Un pipeline type comporte une étape d'ingestion qui utilise l'une des nombreuses sources fournies par Apache Beam. Cette étape est suivie de manipulation de données ou de transformations de format, qui alimentent ensuite une transformation GPU.

L'adaptation des ressources utilise des optimisations de ressources Apache Beam afin de personnaliser les ressources de nœuds de calcul pour vos pipelines de traitement par lot. Lorsque l'adaptation des ressources est activée, Dataflow n'utilise les GPU que pour les étapes du pipeline qui en ont besoin. Par conséquent, cette fonctionnalité améliore la flexibilité et la capacité du pipeline tout en réduisant potentiellement les coûts.

Pour en savoir plus, consultez la section Adaptation des ressources.

GPU et parallélisme des nœuds de calcul

Pour les pipelines Python utilisant l'architecture Dataflow Runner v2, Dataflow lance un processus du SDK Apache Beam par cœur de VM. Chaque processus du SDK s'exécute dans son propre conteneur Docker et, à son tour, génère de nombreux threads, chacun traitant les données entrantes.

Les GPU utilisent plusieurs architectures de processus, et les GPU des nœuds de calcul Dataflow sont visibles par tous les processus et threads.

Si vous exécutez plusieurs processus du SDK sur un GPU partagé, vous pouvez améliorer l'efficacité et l'utilisation du GPU en activant le service multi-processus (MPS) NVIDIA. Le service multi-processus améliore le parallélisme des nœuds de calcul et le débit global pour les pipelines de GPU, en particulier pour les charges de travail avec une faible utilisation des ressources GPU. Pour en savoir plus, consultez la section Améliorer les performances sur un GPU partagé à l'aide de NVIDIA MPS.

Pour éviter toute surutilisation du GPU, vous devrez peut-être gérer l'accès aux GPU. Si vous utilisez TensorFlow, l'une des suggestions suivantes peut vous aider à éviter la surutilisation de la mémoire de GPU :

  • Configurez les nœuds de calcul Cloud Dataflow pour démarrer un seul processus Python conteneurisé, quel que soit le nombre de processeurs virtuels. Pour effectuer cette configuration, lorsque vous lancez votre tâche, utilisez les options de pipeline suivantes :

    • --experiments=no_use_multiple_sdk_containers
    • --number_of_worker_harness_threads

    Pour en savoir plus sur le nombre de threads à utiliser, consultez la page Réduire le nombre de threads.

  • Activez le service MPS.

Charges de travail d'inférence

Lorsque vous utilisez des modèles de machine learning (ML) pour effectuer des inférences locales et à distance, utilisez la transformation RunInference intégrée d'Apache Beam. L'API RunInference est une PTransform optimisée pour les inférences de machine learning. L'utilisation de la transformation RunInference peut améliorer l'efficacité lorsque vous utilisez des modèles de ML dans vos pipelines.

Workflow

Le workflow en deux étapes suivant montre comment créer un pipeline à l'aide de GPU. Ce flux se charge des problèmes liés aux GPU et non GPU séparément et raccourcit la boucle de rétroaction.

  1. Créer un pipeline

    Créer un pipeline pouvant s'exécuter sur Dataflow Remplacez les transformations nécessitant des GPU par des transformations qui n'utilisent pas de GPU, mais qui sont fonctionnellement identiques :

    1. Créez toutes les transformations qui accompagnent l'utilisation du GPU, telles que l'ingestion et la manipulation des données.

    2. Créez un bouchon pour la transformation GPU avec une transmission ou une modification du schéma.

  2. Tester en local

    Testez la partie GPU du code de pipeline dans l'environnement qui imite l'environnement d'exécution des nœuds de calcul Dataflow. Les étapes suivantes décrivent l'une des méthodes d'exécution de ce test :

    1. Créez une image Docker avec toutes les bibliothèques nécessaires.

    2. Commencez le développement du code GPU.

    3. Commencez le cycle d'exécution du code à l'aide d'une machine virtuelle Google Cloud avec l'image Docker. Pour éliminer les incompatibilités de bibliothèque, exécutez le code GPU dans un processus Python local séparément d'un pipeline Apache Beam. Exécutez ensuite l'intégralité du pipeline sur l'exécuteur direct ou lancez le pipeline sur Dataflow.

Utiliser une VM exécutant un système d'exploitation optimisé pour les conteneurs

Pour un environnement minimal, utilisez une machine virtuelle optimisée pour les conteneurs. Pour en savoir plus, consultez la page Créer une VM avec des GPU associés.

Le flux général est le suivant :

  1. Créez une VM.

  2. Connectez-vous à la VM et exécutez les commandes suivantes :

    sudo cos-extensions install gpu -- -version latest
    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia
    
  3. Vérifiez que les GPU sont disponibles :

    ./nvidia-smi
    
  4. Démarrez un conteneur Docker avec des pilotes de GPU de la VM installée en tant que volumes. Exemple :

    sudo docker run --rm -it --entrypoint /bin/bash
    --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64
    --volume /var/lib/nvidia/bin:/usr/local/nvidia/bin
    --privileged gcr.io/bigdatapivot/image_process_example:latest
    

Pour obtenir un exemple de fichier Dockerfile, consultez la section Créer une image de conteneur personnalisé. Ajoutez toutes les dépendances dont vous avez besoin pour votre pipeline au fichier Dockerfile.

Pour en savoir plus sur l'utilisation d'une image Docker préconfigurée pour l'utilisation du GPU, consultez la page Utiliser une image existante configurée pour l'utilisation du GPU.

Outils pour l'utilisation de systèmes optimisés pour les conteneurs

  • Pour configurer la CLI Docker afin qu'elle utilise docker-credential-gcr comme assistant d'identification pour l'ensemble de registres de conteneurs Google par défaut (GCR), utilisez :

    sudo docker-credential-gcr configure-docker
    

    Pour en savoir plus sur la configuration des identifiants Docker, consultez la page docker-credential-gcr.

  • Pour copier des fichiers, tels que le code du pipeline, vers ou depuis une VM, utilisez toolbox. Cette technique est utile lorsque vous utilisez une image personnalisée. Exemple :

    toolbox /google-cloud-sdk/bin/gsutil cp gs://bucket/gpu/image_process/* /media/root/home/<userid>/opencv/
    

    Pour en savoir plus, consultez la section Résoudre les problèmes de nœud avec la boîte à outils.

Étape suivante