Exécuter des charges de travail TPU dans un conteneur Docker
Les conteneurs Docker facilitent la configuration des applications en combinant votre code et toutes les dépendances nécessaires dans un package unique distribuable. Vous pouvez exécuter des conteneurs Docker dans des VM TPU pour simplifier la configuration et le partage de vos applications Cloud TPU. Ce document explique comment configurer un conteneur Docker pour chaque framework de ML compatible avec Cloud TPU.
Entraîner un modèle PyTorch dans un conteneur Docker
Appareil TPU
Créez une VM Cloud TPU.
gcloud compute tpus tpu-vm create your-tpu-name \ --zone=europe-west4-a \ --accelerator-type=v2-8 \ --version=tpu-ubuntu2204-base
Connectez-vous à la VM TPU à l'aide de SSH :
gcloud compute tpus tpu-vm ssh your-tpu-name \ --zone=europe-west4-a
Assurez-vous que le rôle Lecteur Artifact Registry a été attribué à votre utilisateur Google Cloud . Pour en savoir plus, consultez Attribuer des rôles Artifact Registry.
Démarrez un conteneur dans la VM TPU à l'aide de l'image PyTorch/XLA nightly.
sudo docker run --net=host -ti --rm --name your-container-name --privileged us-central1-docker.pkg.dev/tpu-pytorch-releases/docker/xla:r2.6.0_3.10_tpuvm_cxx11 \ bash
Configurez l'environnement d'exécution TPU.
Il existe deux options d'environnement d'exécution PyTorch/XLA : PJRT et XRT. Nous vous recommandons d'utiliser PJRT, sauf si vous avez une raison spécifique d'utiliser XRT. Pour en savoir plus sur les différentes configurations d'environnement d'exécution, consultez la documentation sur l'environnement d'exécution PJRT.
PJRT
export PJRT_DEVICE=TPU
XRT
export XRT_TPU_CONFIG="localservice;0;localhost:51011"
Clonez le dépôt PyTorch XLA.
git clone --recursive https://github.com/pytorch/xla.git
Entraînez ResNet50.
python3 xla/test/test_train_mp_imagenet.py --fake_data --model=resnet50 --num_epochs=1
Une fois le script d'entraînement terminé, veillez à nettoyer les ressources.
- Saisissez
exit
pour quitter le conteneur Docker. - Saisissez
exit
pour quitter la VM TPU. Supprimez la VM TPU.
gcloud compute tpus tpu-vm delete your-tpu-name --zone=europe-west4-a
Tranche TPU
Lorsque vous exécutez du code PyTorch sur une tranche de TPU, vous devez exécuter votre code sur tous les nœuds de calcul TPU en même temps. Pour cela, vous pouvez utiliser la commande gcloud compute tpus tpu-vm ssh
avec les options --worker=all
et --command
. La procédure suivante vous explique comment créer une image Docker pour faciliter la configuration de chaque nœud de calcul TPU.
Créez une VM TPU.
gcloud compute tpus tpu-vm create your-tpu-name \ --zone=us-central2-b \ --accelerator-type=v4-32 \ --version=tpu-ubuntu2204-base
Ajoutez l'utilisateur actuel au groupe Docker.
gcloud compute tpus tpu-vm ssh your-tpu-name \ --zone=us-central2-b \ --worker=all \ --command='sudo usermod -a -G docker $USER'
Clonez le dépôt PyTorch XLA.
gcloud compute tpus tpu-vm ssh your-tpu-name --worker=all \ --zone=us-central2-b \ --command="git clone --recursive https://github.com/pytorch/xla.git"
Exécutez le script d'entraînement dans un conteneur sur tous les nœuds de calcul TPU.
gcloud compute tpus tpu-vm ssh your-tpu-name --worker=all \ --zone=us-central2-b \ --command="docker run --rm --privileged --net=host -v ~/xla:/xla -e PJRT_DEVICE=TPU us-central1-docker.pkg.dev/tpu-pytorch-releases/docker/xla:r2.6.0_3.10_tpuvm_cxx11 python /xla/test/test_train_mp_imagenet.py --fake_data --model=resnet50 --num_epochs=1"
Options de la commande Docker :
--rm
supprime le conteneur une fois le processus terminé.--privileged
expose l'appareil TPU au conteneur.--net=host
lie tous les ports du conteneur à la VM TPU pour permettre la communication entre les hôtes du pod.-e
définit les variables d'environnement.
Une fois le script d'entraînement terminé, veillez à nettoyer les ressources.
Supprimez la VM TPU à l'aide de la commande suivante :
gcloud compute tpus tpu-vm delete your-tpu-name \ --zone=us-central2-b
Entraîner un modèle JAX dans un conteneur Docker
Appareil TPU
Créez la VM TPU.
gcloud compute tpus tpu-vm create your-tpu-name \ --zone=europe-west4-a \ --accelerator-type=v2-8 \ --version=tpu-ubuntu2204-base
Connectez-vous à la VM TPU à l'aide de SSH :
gcloud compute tpus tpu-vm ssh your-tpu-name --zone=europe-west4-a
Démarrez le daemon Docker dans la VM TPU.
sudo systemctl start docker
Démarrez le conteneur Docker.
sudo docker run --net=host -ti --rm --name your-container-name \ --privileged us-central1-docker.pkg.dev/tpu-pytorch-releases/docker/xla:r2.6.0_3.10_tpuvm_cxx11 \ bash
Installez JAX.
pip install jax[tpu]
Installez FLAX.
pip install --upgrade clu git clone https://github.com/google/flax.git pip install --user -e flax
Installez les packages
tensorflow
ettensorflow-dataset
.pip install tensorflow pip install tensorflow-datasets
Exécutez le script d'entraînement FLAX MNIST.
cd flax/examples/mnist python3 main.py --workdir=/tmp/mnist \ --config=configs/default.py \ --config.learning_rate=0.05 \ --config.num_epochs=5
Une fois le script d'entraînement terminé, veillez à nettoyer les ressources.
- Saisissez
exit
pour quitter le conteneur Docker. - Saisissez
exit
pour quitter la VM TPU. Supprimez la VM TPU.
gcloud compute tpus tpu-vm delete your-tpu-name --zone=europe-west4-a
Tranche TPU
Lorsque vous exécutez du code JAX sur une tranche de TPU, vous devez exécuter votre code JAX sur tous les nœuds de calcul TPU en même temps. Pour cela, vous pouvez utiliser la commande gcloud compute tpus tpu-vm ssh
avec les options --worker=all
et --command
. La procédure suivante vous explique comment créer une image Docker pour faciliter la configuration de chaque nœud de calcul TPU.
Créez un fichier nommé
Dockerfile
dans votre répertoire actuel et collez le texte suivant dans ce fichier.FROM python:3.10 RUN pip install jax[tpu] RUN pip install --upgrade clu RUN git clone https://github.com/google/flax.git RUN pip install --user -e flax RUN pip install tensorflow RUN pip install tensorflow-datasets WORKDIR ./flax/examples/mnist
Préparez un dépôt Artifact Registry.
gcloud artifacts repositories create your-repo \ --repository-format=docker \ --location=europe-west4 --description="Docker repository" \ --project=your-project gcloud artifacts repositories list \ --project=your-project gcloud auth configure-docker europe-west4-docker.pkg.dev
Compilez l'image Docker.
docker build -t your-image-name .
Ajoutez un tag à votre image Docker avant de la transférer vers Artifact Registry. Pour en savoir plus sur l'utilisation d'Artifact Registry, consultez Utiliser des images de conteneurs.
docker tag your-image-name europe-west4-docker.pkg.dev/your-project/your-repo/your-image-name:your-tag
Transférez l'image Docker dans Artifact Registry.
docker push europe-west4-docker.pkg.dev/your-project/your-repo/your-image-name:your-tag
Créez une VM TPU.
gcloud compute tpus tpu-vm create your-tpu-name \ --zone=europe-west4-a \ --accelerator-type=v2-8 \ --version=tpu-ubuntu2204-base
Extrayez l'image Docker depuis Artifact Registry vers tous les nœuds de calcul TPU.
gcloud compute tpus tpu-vm ssh your-tpu-name --worker=all \ --zone=europe-west4-a \ --command='sudo usermod -a -G docker ${USER}'
gcloud compute tpus tpu-vm ssh your-tpu-name --worker=all \ --zone=europe-west4-a \ --command="gcloud auth configure-docker europe-west4-docker.pkg.dev --quiet"
gcloud compute tpus tpu-vm ssh your-tpu-name --worker=all \ --zone=europe-west4-a \ --command="docker pull europe-west4-docker.pkg.dev/your-project/your-repo/your-image-name:your-tag"
Exécutez le conteneur sur tous les nœuds de calcul TPU.
gcloud compute tpus tpu-vm ssh your-tpu-name --worker=all \ --zone=europe-west4-a \ --command="docker run -ti -d --privileged --net=host --name your-container-name europe-west4-docker.pkg.dev/your-project/your-repo/your-image-name:your-tag bash"
Exécutez le script d'entraînement sur tous les nœuds de calcul TPU.
gcloud compute tpus tpu-vm ssh your-tpu-name --worker=all \ --zone=europe-west4-a \ --command="docker exec --privileged your-container-name python3 main.py --workdir=/tmp/mnist \ --config=configs/default.py \ --config.learning_rate=0.05 \ --config.num_epochs=5"
Une fois le script d'entraînement terminé, veillez à nettoyer les ressources.
Arrêtez le conteneur sur tous les nœuds de calcul.
gcloud compute tpus tpu-vm ssh your-tpu-name --worker=all \ --zone=europe-west4-a \ --command="docker kill your-container-name"
Supprimer la VM TPU
gcloud compute tpus tpu-vm delete your-tpu-name \ --zone=europe-west4-a