Disponibilizar modelos abertos Llama 3 usando Cloud TPUs de vários hosts na Vertex AI com o Saxml

Llama 3 é uma biblioteca de código aberto de linguagem grande (LLM) da Meta. Este guia mostra como disponibilizar um LLM Llama 3 usando vários hosts Unidades de Processamento de Tensor (TPUs) na Vertex AI com Saxml.

Neste guia, você vai fazer o download dos pesos e tokenizadores do modelo Llama 3 70B e implantá-los na Vertex AI que executa Saxml em TPUs.

Antes de começar

Recomendamos que você use VM com otimização de memória M2 para fazer o download do modelo e convertê-lo em Saxml. Isso acontece porque o modelo o processo de conversão requer memória significativa e pode falhar se você escolher um sem memória suficiente.

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Vertex AI and Artifact Registry APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Vertex AI and Artifact Registry APIs.

    Enable the APIs

  8. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  9. Siga a documentação do Artifact Registry para instalar o Docker.
  10. Verifique se você tem cotas suficientes para 16 chips TPU v5e para a Vertex AI.
  11. Neste tutorial, presumimos que você esteja usando o Cloud Shell para interagir com Google Cloud. Se você quiser usar um shell diferente em vez do Cloud Shell, execute a seguinte configuração extra:

    1. Install the Google Cloud CLI.

    2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    3. To initialize the gcloud CLI, run the following command:

      gcloud init

    Se você estiver usando um shell diferente em vez do Cloud Shell para o modelo verifique se a versão da CLI do Google Cloud é depois de 475.0.0. Para atualizar a CLI do Google Cloud, execute o Atualização de componentes da gcloud comando.

    Se você estiver implantando seu modelo usando o SDK da Vertex AI, verifique se você tem a versão 1.50.0 ou mais recente.

    Acessar o modelo e fazer o download dos respectivos pesos

    As etapas a seguir são para uma instância do Vertex AI Workbench que tem um VM com otimização de memória M2. Para informações sobre como alterar o tipo de máquina de um Vertex AI Workbench exemplo, consulte Altere o tipo de máquina de uma instância do Vertex AI Workbench.

    1. Acesse a Página de consentimento do modelo Llama.

    2. Selecione Llama 3, preencha o formulário de consentimento e aceite os termos. as condições.

    3. Verifique na sua caixa de entrada se há um e-mail com um URL assinado.

    4. Faça o download do Script download.sh do GitHub executando o seguinte comando:

      wget https://raw.githubusercontent.com/meta-llama/llama3/main/download.sh
      chmod +x download.sh
      
    5. Para fazer o download dos pesos do modelo, execute o script download.sh que você baixados do GitHub.

    6. Quando solicitado, insira o URL assinado do e-mail recebido no na seção anterior.

    7. Quando solicitado o download dos modelos, insira 70B.

    Converter os pesos do modelo para o formato Saxml

    1. Execute este comando para fazer o download do Saxml:

      git clone https://github.com/google/saxml.git
      
    2. Execute os seguintes comandos para configurar um ambiente virtual do Python:

      python -m venv .
      source bin/activate
      
    3. Execute os seguintes comandos para instalar dependências:

      pip install --upgrade pip
      
      pip install paxml
      
      pip install praxis
      
      pip install torch
      
    4. Para converter os pesos do modelo para o formato Saxml, execute o seguinte comando:

      python3 saxml/saxml/tools/convert_llama_ckpt.py \
          --base PATH_TO_META_LLAMA3 \
          --pax PATH_TO_PAX_LLAMA3 \
          --model-size llama3_70b
      

      Substitua:

      • PATH_TO_META_LLAMA3: o caminho para o diretório que contém os pesos do modelo baixado
      • PATH_TO_PAX_LLAMA3: o caminho para o diretório em que será armazenar os pesos do modelo convertido
      .

      Os modelos convertidos serão colocados no Pasta $PATH_TO_PAX_LLAMA3/checkpoint_00000000.

    5. Copie o arquivo do tokenizador do diretório original em uma subpasta chamada vocabs. da seguinte forma:

      cp $PATH_TO_META_LLAMA3/tokenizer.model $PATH_TO_PAX_LLAMA3/vocabs/tokenizer.model
      
    6. Adicione um arquivo commit_success.txt vazio à pasta $PATH_TO_PAX_LLAMA3 e as subpastas metadata e state nessa pasta da seguinte maneira:

      touch $PATH_TO_PAX_LLAMA3/checkpoint_00000000/commit_success.txt
      touch $PATH_TO_PAX_LLAMA3/checkpoint_00000000/metadata/commit_success.txt
      touch $PATH_TO_PAX_LLAMA3/checkpoint_00000000/state/commit_success.txt
      

      A pasta $PATH_TO_PAX_LLAMA3 agora contém as seguintes pastas e :

      $PATH_TO_PAX_LLAMA3/checkpoint_00000000/commit_success.txt
      $PATH_TO_PAX_LLAMA3/checkpoint_00000000/metadata/
      $PATH_TO_PAX_LLAMA3/checkpoint_00000000/metadata/commit_success.txt
      $PATH_TO_PAX_LLAMA3/checkpoint_00000000/state/
      $PATH_TO_PAX_LLAMA3/checkpoint_00000000/state/commit_success.txt
      $PATH_TO_PAX_LLAMA3/vocabs/tokenizer.model
      

    Produzir um bucket do Cloud Storage

    Criar um bucket do Cloud Storage para armazenar os pesos do modelo convertidos.

    1. No Cloud Shell, execute os seguintes comandos, substituindo PROJECT_ID pelo ID do projeto:

      projectid=PROJECT_ID
      gcloud config set project ${projectid}
      
    2. Para criar o bucket, execute o comando a seguir:

      gcloud storage buckets create gs://WEIGHTS_BUCKET_NAME
      

      Substitua WEIGHTS_BUCKET_NAME pelo nome que você quer. que serão usados no bucket.

    Copie os pesos do modelo para o bucket do Cloud Storage

    Para copiar os pesos do modelo para o bucket, execute o seguinte comando:

    gcloud storage cp PATH_TO_PAX_LLAMA3/* gs://WEIGHTS_BUCKET_NAME/llama3/pax_70b/ --recursive
    

    Faça o upload do modelo

    O contêiner Saxml pré-criado está disponível em us-docker.pkg.dev/vertex-ai/prediction/sax-tpu:latest.

    Para fazer upload de um recurso Model na Vertex AI usando o método Saxml, execute o comando gcloud ai models upload da seguinte forma:

    gcloud ai models upload \
        --region=LOCATION \
        --display-name=MODEL_DISPLAY_NAME \
        --container-image-uri=us-docker.pkg.dev/vertex-ai/prediction/sax-tpu:latest \
        --artifact-uri='gs://WEIGHTS_BUCKET_NAME/llama3/pax_70b' \
        --container-args='--model_path=saxml.server.pax.lm.params.lm_cloud.LLaMA3_70BFP16x16' \
        --container-args='--platform_chip=tpuv5e' \
        --container-args='--platform_topology=4x4' \
        --container-args='--ckpt_path_suffix=checkpoint_00000000' \
        --container-deployment-timeout-seconds=2700 \
        --container-ports=8502 \
        --project=PROJECT_ID
    

    Faça as seguintes substituições:

    • LOCATION: a região em que você está usando a Vertex AI. As TPUs só estão disponíveis em us-west1.
    • MODEL_DISPLAY_NAME: o nome de exibição que você quer para o modelo
    • PROJECT_ID: o ID do seu Google Cloud projeto

    Criar um endpoint de inferência on-line

    Para criar o endpoint, execute o comando a seguir:

    gcloud ai endpoints create \
        --region=LOCATION \
        --display-name=ENDPOINT_DISPLAY_NAME \
        --project=PROJECT_ID
    

    Substitua ENDPOINT_DISPLAY_NAME pelo nome de exibição que você quer. seu endpoint.

    Implante o modelo no endpoint

    Quando o endpoint estiver pronto, implante o modelo nele.

    Neste tutorial, você vai implantar um modelo Llama 3 70B fragmentado por 16 Chips do Cloud TPU v5e usando topologia 4x4. Porém, é possível especificar a seguir as topologias compatíveis com vários hosts do Cloud TPU:

    Tipo de máquina Topologia Número de chips do TPU Número de hosts
    ct5lp-hightpu-4t 4x4 16 2
    ct5lp-hightpu-4t 4x8 32 4
    ct5lp-hightpu-4t 8x8 64 8
    ct5lp-hightpu-4t 8x16 128 16
    ct5lp-hightpu-4t 16x16 256 32

    Se você estiver implantando um modelo Llama diferente definido no Repositório GitHub do Saxml (em inglês), confira se ele está particionado para corresponder ao número de dispositivos e se o Cloud TPU tem memória suficiente para carregar o modelo.

    Para informações sobre como implantar um modelo em Cloud TPUs de host único, consulte Implantar um modelo.

    Para mais informações sobre os tipos de Cloud TPU v5e, consulte TPU v5e.

    1. Consiga o ID do endpoint de inferência on-line:

      ENDPOINT_ID=$(gcloud ai endpoints list \
          --region=LOCATION \
          --filter=display_name=ENDPOINT_NAME \
          --format="value(name)")
      
    2. Acesse o ID do seu modelo:

      MODEL_ID=$(gcloud ai models list \
          --region=LOCATION \
          --filter=display_name=DEPLOYED_MODEL_NAME \
          --format="value(name)")
      
    3. Implante o modelo no endpoint:

      gcloud ai endpoints deploy-model $ENDPOINT_ID \
          --region=LOCATION \
          --model=$MODEL_ID \
          --display-name=DEPLOYED_MODEL_NAME \
          --machine-type=ct5lp-hightpu-4t \
          --tpu-topology=4x4 \
          --traffic-split=0=100
      

      Substitua DEPLOYED_MODEL_NAME por um nome para a implantação. Pode ser igual ao nome de exibição do modelo (MODEL_DISPLAY_NAME).

      A operação de implantação pode expirar.

      O comando deploy-model retorna um ID de operação que pode ser usado para verificar quando a operação for concluída. Pesquise o status da operação até que a resposta inclua "done": true. Use o seguinte comando para consultar o status:

      gcloud ai operations describe \
      --region=LOCATION \
      OPERATION_ID
      

      Substitua OPERATION_ID pelo ID da operação retornado. pelo comando anterior.

    Receber inferências on-line do modelo implantado

    Para receber inferências on-line do endpoint da Vertex AI, execute o comando gcloud ai endpoints predict comando.

    1. Execute o seguinte comando para criar um arquivo request.json contendo um pedido de inferência de amostra:

      cat << EOF > request.json
      {"instances": [{"text_batch": "the distance between Earth and Moon is "}]}
      EOF
      
    2. Para enviar a solicitação de inferência on-line ao endpoint, execute este comando: comando:

      gcloud ai endpoints predict $ENDPOINT_ID \
          --project=PROJECT_ID \
          --region=LOCATION \
          --json-request=request.json
      

    Limpar

    Para evitar outras cobranças da Vertex AI, exclua os recursos do Google Cloud que você criou durante este tutorial:

    1. Para desfazer a implantação do modelo e excluir o endpoint, execute os seguintes comandos:

      ENDPOINT_ID=$(gcloud ai endpoints list \
         --region=LOCATION \
         --filter=display_name=ENDPOINT_NAME \
         --format="value(name)")
      
      DEPLOYED_MODEL_ID=$(gcloud ai endpoints describe $ENDPOINT_ID \
         --region=LOCATION \
         --format="value(deployedModels.id)")
      
      gcloud ai endpoints undeploy-model $ENDPOINT_ID \
        --region=LOCATION \
        --deployed-model-id=$DEPLOYED_MODEL_ID
      
      gcloud ai endpoints delete $ENDPOINT_ID \
         --region=LOCATION \
         --quiet
      
    2. Para excluir o modelo, execute os seguintes comandos:

      MODEL_ID=$(gcloud ai models list \
         --region=LOCATION \
         --filter=display_name=DEPLOYED_MODEL_NAME \
         --format="value(name)")
      
      gcloud ai models delete $MODEL_ID \
         --region=LOCATION \
         --quiet