Executar cargas de trabalho de TPU em um contêiner do Docker
Os contêineres do Docker facilitam a configuração de aplicativos com a combinação do seu código e de todas as dependências necessárias em um pacote distribuível. É possível executar contêineres do Docker em VMs de TPU para simplificar a configuração e o compartilhamento de aplicativos do Cloud TPU. Este documento descreve como configurar um contêiner do Docker para cada framework de ML aceito pelo Cloud TPU.
Treinar um modelo do PyTorch em um contêiner do Docker
Dispositivo de TPU
Crie uma VM do Cloud TPU.
gcloud compute tpus tpu-vm create your-tpu-name \ --zone=europe-west4-a \ --accelerator-type=v2-8 \ --version=tpu-ubuntu2204-base
Conecte-se à VM usando SSH.
gcloud compute tpus tpu-vm ssh your-tpu-name \ --zone=europe-west4-a
Verifique se o usuário do Google Cloud recebeu o papel de Leitor do Artifact Registry. Para mais informações, consulte Como conceder papéis do Artifact Registry.
Inicie um contêiner na VM de TPU usando a imagem do PyTorch/XLA criada durante a noite.
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
Configure o ambiente de execução da TPU.
Há duas opções de ambiente de execução do PyTorch/XLA: PJRT e XRT. Recomendamos usar o PJRT, a menos que você tenha um motivo para usar o XRT. Para saber mais sobre as diferentes configurações de ambiente de execução, consulte a documentação do ambiente de execução do PJRT.
PJRT
export PJRT_DEVICE=TPU
XRT
export XRT_TPU_CONFIG="localservice;0;localhost:51011"
Clone o repositório do PyTorch/XLA.
git clone --recursive https://github.com/pytorch/xla.git
Treine o ResNet50.
python3 xla/test/test_train_mp_imagenet.py --fake_data --model=resnet50 --num_epochs=1
Quando o script de treinamento for concluído, limpe os recursos.
- Digite
exitpara sair do contêiner do Docker. - Digite
exitpara sair da VM de TPU. Exclua a VM de TPU.
gcloud compute tpus tpu-vm delete your-tpu-name --zone=europe-west4-a
Fração de TPU
Ao executar o código PyTorch em uma fração de TPU, isso deve ser feito em todos os workers
de TPU ao mesmo tempo. Uma forma de fazer isso é usar o
comando gcloud compute tpus tpu-vm ssh com as flags --worker=all e
--command. O procedimento a seguir mostra como criar uma imagem Docker
para facilitar a configuração de cada worker de TPU.
Crie uma VM de TPU.
gcloud compute tpus tpu-vm create your-tpu-name \ --zone=us-central2-b \ --accelerator-type=v4-32 \ --version=tpu-ubuntu2204-base
Adicione o usuário atual ao grupo do Docker.
gcloud compute tpus tpu-vm ssh your-tpu-name \ --zone=us-central2-b \ --worker=all \ --command='sudo usermod -a -G docker $USER'
Clone o repositório do 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"
Execute o script de treinamento em um contêiner em todos os workers de 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"
Flags de comando do Docker:
--rmremove o contêiner após o término do processo.--privilegedexpõe o dispositivo de TPU ao contêiner.--net=hostvincula todas as portas do contêiner à VM de TPU para permitir a comunicação entre os hosts no pod.-edefine variáveis de ambiente.
Quando o script de treinamento for concluído, limpe os recursos.
Exclua a VM de TPU executando este comando:
gcloud compute tpus tpu-vm delete your-tpu-name \ --zone=us-central2-b
Treinar um modelo JAX em um contêiner do Docker
Dispositivo de TPU
Crie a VM de TPU.
gcloud compute tpus tpu-vm create your-tpu-name \ --zone=europe-west4-a \ --accelerator-type=v2-8 \ --version=tpu-ubuntu2204-base
Conecte-se à VM usando SSH.
gcloud compute tpus tpu-vm ssh your-tpu-name --zone=europe-west4-a
Inicie o daemon do Docker na VM de TPU.
sudo systemctl start docker
Inicie o contêiner do 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
Instale o JAX.
pip install jax[tpu]
Instale o FLAX.
pip install --upgrade clu git clone https://github.com/google/flax.git pip install --user -e flax
Instale os pacotes
tensorflowetensorflow-dataset.pip install tensorflow pip install tensorflow-datasets
Execute o script de treinamento MNIST do FLAX.
cd flax/examples/mnist python3 main.py --workdir=/tmp/mnist \ --config=configs/default.py \ --config.learning_rate=0.05 \ --config.num_epochs=5
Quando o script de treinamento for concluído, limpe os recursos.
- Digite
exitpara sair do contêiner do Docker. - Digite
exitpara sair da VM de TPU. Exclua a VM de TPU.
gcloud compute tpus tpu-vm delete your-tpu-name --zone=europe-west4-a
Fração de TPU
Ao executar o código JAX em uma fração de TPU, isso deve ser feito em todos os workers
de TPU ao mesmo tempo. Uma forma de fazer isso é usar o
comando gcloud compute tpus tpu-vm ssh com as flags --worker=all e --command. O procedimento
a seguir mostra como criar uma imagem Docker para facilitar a configuração de cada
worker de TPU.
Crie um arquivo
Dockerfileno diretório atual e cole o texto a seguir.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
Prepare um 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
Compile a imagem Docker.
docker build -t your-image-name .
Adicione uma tag à imagem Docker antes de enviá-la ao Artifact Registry. Para saber como trabalhar com o Artifact Registry, consulte Trabalhar com imagens de contêiner.
docker tag your-image-name europe-west4-docker.pkg.dev/your-project/your-repo/your-image-name:your-tag
Envie a imagem Docker para o Artifact Registry.
docker push europe-west4-docker.pkg.dev/your-project/your-repo/your-image-name:your-tag
Crie uma VM de TPU.
gcloud compute tpus tpu-vm create your-tpu-name \ --zone=europe-west4-a \ --accelerator-type=v2-8 \ --version=tpu-ubuntu2204-base
Extraia a imagem Docker do Artifact Registry em todos os workers de 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"
Execute o contêiner em todos os workers de 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"
Execute o script de treinamento em todos os workers de 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"
Quando o script de treinamento for concluído, limpe os recursos.
Desative o contêiner em todos os workers.
gcloud compute tpus tpu-vm ssh your-tpu-name --worker=all \ --zone=europe-west4-a \ --command="docker kill your-container-name"
Exclua a VM de TPU.
gcloud compute tpus tpu-vm delete your-tpu-name \ --zone=europe-west4-a
A seguir
- Tutoriais do Cloud TPU
- Gerenciar TPUs
- Arquitetura do Cloud TPU
- Executar o código JAX em frações de TPU