Executar cargas de trabalho de TPU em um contêiner do Docker

Os contêineres do Docker facilitam a configuração de aplicativos ao combinar seu código e todas as dependências necessárias em um pacote distribuível. É possível executar contêineres do Docker em VMs do TPU para simplificar a configuração e o compartilhamento dos seus aplicativos do Cloud TPU. Este document descreve como configurar um contêiner do Docker para cada framework de ML com suporte ao Cloud TPU.

Treinar um modelo PyTorch em um contêiner do Docker

Dispositivo TPU

  1. Criar 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
  2. Conectar-se à VM de TPU usando SSH

    gcloud compute tpus tpu-vm ssh your-tpu-name \
    --zone=europe-west4-a
  3. Verifique se o usuário Google Cloud recebeu a função de leitor do registro de artefatos. Para mais informações, consulte Conceder papéis do Artifact Registry.

  4. Inicie um contêiner na VM de TPU usando a imagem noturna do PyTorch/XLA.

    sudo docker run -ti --rm --name your-container-name --privileged gcr.io/tpu-pytorch/xla:r2.0_3.8_tpuvm bash
  5. Configurar o ambiente de execução da TPU

    Há duas opções de execução do PyTorch/XLA: PJRT e XRT. Recomendamos usar PJRT, a menos que você tenha um motivo para usar XRT. Para saber mais sobre as diferentes configurações de execução, consulte "Você tem um motivo para usar o XRT". Para saber mais sobre as diferentes configurações 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"
  6. Clone o repositório PyTorch XLA

    git clone --recursive https://github.com/pytorch/xla.git
  7. Treinar 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.

  1. Digite exit para sair do contêiner do Docker.
  2. Digite exit para sair da VM da TPU.
  3. Excluir a VM da TPU
     $ gcloud compute tpus tpu-vm delete your-tpu-name --zone=europe-west4-a

Fração de TPU

Ao executar o código do PyTorch em uma fatia de TPU, é necessário executar o código em todos os workers da TPU ao mesmo tempo. Uma maneira 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 do Docker para facilitar a configuração de cada worker de TPU.

  1. Criar 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
  2. Adicionar 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"
  3. Clone o repositório 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"
  4. 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:

    • --rm remove o contêiner após o encerramento do processo.
    • --privileged expõe o dispositivo TPU ao contêiner.
    • --net=host vincula todas as portas do contêiner à VM da TPU para permitir a comunicação entre os hosts no pod.
    • -e define variáveis de ambiente.

Quando o script de treinamento for concluído, limpe os recursos.

Exclua a VM da TPU usando o seguinte 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 TPU

  1. Criar 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
  2. Conectar-se à VM de TPU usando SSH

    gcloud compute tpus tpu-vm ssh your-tpu-name  --zone=europe-west4-a
  3. Iniciar o daemon do Docker na VM de TPU

    sudo systemctl start docker
  4. Iniciar 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 \
     python:3.10 bash
  5. Instalar o JAX

    pip install jax[tpu]
  6. Instalar o FLAX

    pip install --upgrade clu
    git clone https://github.com/google/flax.git
    pip install --user -e flax
  7. Instalar os pacotes tensorflow e tensorflow-dataset

    pip install tensorflow
    pip install tensorflow-datasets
  8. 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.

  1. Digite exit para sair do contêiner do Docker.
  2. Digite exit para sair da VM da TPU.
  3. Excluir a VM da 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 fatia de TPU, é necessário executar o código JAX em todos os workers de TPU ao mesmo tempo. Uma maneira 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 do Docker para facilitar a configuração de cada worker de TPU.

  1. Crie um arquivo chamado Dockerfile no diretório atual e cole o seguinte texto.

    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
    WORKDIR ./flax/examples/mnist
  2. Preparar 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
  3. Compilar a imagem Docker

    docker build -t your-image-name .
  4. Adicione uma tag à imagem do Docker antes de enviar para o Artifact Registry. Para mais informações sobre 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
  5. Envie sua imagem do Docker para o Artifact Registry

    docker push europe-west4-docker.pkg.dev/your-project/your-repo/your-image-name:your-tag
  6. Criar 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
  7. Extraia a imagem do 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"
  8. Execute o contêiner em todos os workers da 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"
  9. Execute o script de treinamento em todos os workers da 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.

  1. Desligue 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"
  2. Exclua a VM da TPU usando o seguinte comando:

    $ gcloud compute tpus tpu-vm delete your-tpu-name \
    --zone=europe-west4-a

Treinar um modelo JAX em um contêiner do Docker usando a pilha estável do JAX

É possível criar as imagens do Docker MaxText e MaxDiffusion usando a imagem base do JAX Stable Stack.

A pilha estável do JAX oferece um ambiente consistente para MaxText e MaxDiffusion ao agrupar o JAX com pacotes principais, como orbax, flax, optax e libtpu.so. Essas bibliotecas são testadas para garantir a compatibilidade e fornecer uma base estável para criar e executar o MaxText e o MaxDiffusion. Isso elimina possíveis conflitos devido a versões de pacotes incompatíveis.

A pilha estável do JAX inclui uma libtpu.so totalmente lançada e qualificada, a biblioteca principal que orienta a compilação, a execução e a configuração de rede ICI do programa TPU. A versão do libtpu substitui o build noturno usado anteriormente pelo JAX e garante a funcionalidade consistente das computações XLA na TPU com testes de qualificação no nível do PJRT em HLO/StableHLO IRs.

Para criar a imagem do Docker MaxText e MaxDiffusion com a pilha estável do JAX, ao executar o script docker_build_dependency_image.sh, defina a variável MODE como stable_stack e a variável BASEIMAGE como a imagem de base que você quer usar.

docker_build_dependency_image.sh está localizado no repositório do GitHub da MaxDiffusion e no repositório do GitHub da MaxText. Clone o repositório que você quer usar e use o script docker_build_dependency_image.sh desse repositório para criar a imagem do Docker.

git clone https://github.com/AI-Hypercomputer/maxdiffusion.git
git clone https://github.com/AI-Hypercomputer/maxtext.git

O comando a seguir gera uma imagem Docker para uso com MaxText e MaxDiffusion usando us-docker.pkg.dev/cloud-tpu-images/jax-stable-stack/tpu:jax0.4.35-rev1 como a imagem de base. O script bash docker_build_dependency_image.sh pode ser encontrado no repositório MaxDiffusion.

sudo bash docker_build_dependency_image.sh MODE=stable_stack BASEIMAGE=us-docker.pkg.dev/cloud-tpu-images/jax-stable-stack/tpu:jax0.4.35-rev1

Para uma lista de imagens de base do JAX Stable Stack disponíveis, consulte Imagens do JAX Stable Stack no Artifact Registry.

A seguir