Neste tutorial, mostramos como executar um modelo de linguagem grande (LLM) em um pipeline de streaming do Dataflow usando a API RunInference do Apache Beam.
Para mais informações sobre a API RunInference, consulte Sobre a ML do Beam (em inglês) na documentação do Apache Beam.
O código está disponível no GitHub.
Objetivos
- Criar tópicos e assinaturas do Pub/Sub para a entrada e as respostas do modelo.
- Carregue o modelo no Cloud Storage usando um job personalizado da Vertex AI.
- Executar o pipeline.
- Faça uma pergunta ao modelo e receba uma resposta.
Custos
Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Para mais informações, consulte Limpeza.
Antes de começar
Execute este tutorial em uma máquina que tenha pelo menos 5 GB de espaço livre em disco para instalar as dependências.
- Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloud, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Para inicializar a gcloud CLI, execute o seguinte comando:
gcloud init -
Crie ou selecione um Google Cloud projeto.
Funções necessárias para selecionar ou criar um projeto
- Selecionar um projeto: não é necessário um papel específico do IAM para selecionar um projeto. Você pode escolher qualquer projeto em que tenha recebido um papel.
-
Criar um projeto: para criar um projeto, é necessário ter o papel de Criador de projetos
(
roles/resourcemanager.projectCreator), que contém a permissãoresourcemanager.projects.create. Saiba como conceder papéis.
-
Crie um projeto do Google Cloud :
gcloud projects create PROJECT_ID
Substitua
PROJECT_IDpor um nome para o projeto Google Cloud que você está criando. -
Selecione o projeto Google Cloud que você criou:
gcloud config set project PROJECT_ID
Substitua
PROJECT_IDpelo nome do projeto do Google Cloud .
-
Verifique se o faturamento está ativado para o projeto do Google Cloud .
Ative as APIs Dataflow, Compute Engine, Cloud Storage, Pub/Sub e Vertex AI:
Funções necessárias para ativar APIs
Para ativar as APIs, é necessário ter o papel do IAM de administrador do Service Usage (
roles/serviceusage.serviceUsageAdmin), que contém a permissãoserviceusage.services.enable. Saiba como conceder papéis.gcloud services enable dataflow.googleapis.com
compute.googleapis.com storage.googleapis.com pubsub.googleapis.com aiplatform.googleapis.com -
Se você estiver usando um shell local, crie credenciais de autenticação local para sua conta de usuário:
gcloud auth application-default login
Não é necessário fazer isso se você estiver usando o Cloud Shell.
Se um erro de autenticação for retornado e você estiver usando um provedor de identidade (IdP) externo, confirme se você fez login na CLI gcloud com sua identidade federada.
-
Atribua papéis à sua conta de usuário. Execute o seguinte comando uma vez para cada um dos seguintes papéis do IAM:
roles/iam.serviceAccountUsergcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Substitua:
PROJECT_ID: o ID do projeto.USER_IDENTIFIER: o identificador da sua conta de usuário . Por exemplo,myemail@example.com.ROLE: o papel do IAM concedido à sua conta de usuário.
-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Para inicializar a gcloud CLI, execute o seguinte comando:
gcloud init -
Crie ou selecione um Google Cloud projeto.
Funções necessárias para selecionar ou criar um projeto
- Selecionar um projeto: não é necessário um papel específico do IAM para selecionar um projeto. Você pode escolher qualquer projeto em que tenha recebido um papel.
-
Criar um projeto: para criar um projeto, é necessário ter o papel de Criador de projetos
(
roles/resourcemanager.projectCreator), que contém a permissãoresourcemanager.projects.create. Saiba como conceder papéis.
-
Crie um projeto do Google Cloud :
gcloud projects create PROJECT_ID
Substitua
PROJECT_IDpor um nome para o projeto Google Cloud que você está criando. -
Selecione o projeto Google Cloud que você criou:
gcloud config set project PROJECT_ID
Substitua
PROJECT_IDpelo nome do projeto do Google Cloud .
-
Verifique se o faturamento está ativado para o projeto do Google Cloud .
Ative as APIs Dataflow, Compute Engine, Cloud Storage, Pub/Sub e Vertex AI:
Funções necessárias para ativar APIs
Para ativar as APIs, é necessário ter o papel do IAM de administrador do Service Usage (
roles/serviceusage.serviceUsageAdmin), que contém a permissãoserviceusage.services.enable. Saiba como conceder papéis.gcloud services enable dataflow.googleapis.com
compute.googleapis.com storage.googleapis.com pubsub.googleapis.com aiplatform.googleapis.com -
Se você estiver usando um shell local, crie credenciais de autenticação local para sua conta de usuário:
gcloud auth application-default login
Não é necessário fazer isso se você estiver usando o Cloud Shell.
Se um erro de autenticação for retornado e você estiver usando um provedor de identidade (IdP) externo, confirme se você fez login na CLI gcloud com sua identidade federada.
-
Atribua papéis à sua conta de usuário. Execute o seguinte comando uma vez para cada um dos seguintes papéis do IAM:
roles/iam.serviceAccountUsergcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Substitua:
PROJECT_ID: o ID do projeto.USER_IDENTIFIER: o identificador da sua conta de usuário . Por exemplo,myemail@example.com.ROLE: o papel do IAM concedido à sua conta de usuário.
-
Conceda papéis à conta de serviço padrão do Compute Engine. Execute uma vez o comando a seguir para cada um dos seguintes papéis do IAM:
roles/dataflow.adminroles/dataflow.workerroles/storage.adminroles/pubsub.editorroles/aiplatform.user
gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" --role=SERVICE_ACCOUNT_ROLE
Substitua:
PROJECT_ID: o ID do projeto.PROJECT_NUMBER: o número do projeto. Para encontrar o número do projeto, use o comandogcloud projects describe.SERVICE_ACCOUNT_ROLE: cada papel individual.
- Copie o ID do projeto Google Cloud . Você vai precisar desse valor mais adiante neste tutorial.
Criar os recursos Google Cloud
Esta seção explica como criar os seguintes recursos:
- Um bucket do Cloud Storage para usar como local de armazenamento temporário
- Um tópico do Pub/Sub para os prompts do modelo
- Um tópico e uma assinatura do Pub/Sub para as respostas do modelo
Crie um bucket do Cloud Storage
Crie um bucket do Cloud Storage usando a gcloud CLI. Esse bucket é usado como um local de armazenamento temporário pelo pipeline do Dataflow.
Para criar o bucket, use o comando gcloud storage buckets create:
gcloud storage buckets create gs://BUCKET_NAME --location=LOCATION
Substitua:
- BUCKET_NAME: um nome para o bucket do Cloud Storage que atende aos requisitos de nomenclatura de bucket. Os nomes dos intervalos do Cloud Storage precisam ser globalmente exclusivos.
- LOCATION: o local do bucket.
Copie o nome do bucket. Você vai precisar desse valor mais adiante neste tutorial.
Criar tópicos e assinaturas do Pub/Sub
Criar dois tópicos Pub/Sub e uma assinatura. Um deles é para os comandos de entrada que você envia ao modelo. O outro tópico e a assinatura anexada são para as respostas do modelo.
Para criar os tópicos, execute o comando
gcloud pubsub topics createduas vezes, uma para cada tópico:gcloud pubsub topics create PROMPTS_TOPIC_ID gcloud pubsub topics create RESPONSES_TOPIC_IDSubstitua:
- PROMPTS_TOPIC_ID: o ID do tópico dos comandos de entrada
para enviar ao modelo, como
prompts - RESPONSES_TOPIC_ID: o ID do tópico para as respostas do
modelo, como
responses
- PROMPTS_TOPIC_ID: o ID do tópico dos comandos de entrada
para enviar ao modelo, como
Para criar a assinatura e anexá-la ao tópico de respostas, use o comando
gcloud pubsub subscriptions create:gcloud pubsub subscriptions create RESPONSES_SUBSCRIPTION_ID --topic=RESPONSES_TOPIC_IDSubstitua RESPONSES_SUBSCRIPTION_ID pelo ID da assinatura das respostas do modelo, como
responses-subscription.
Copie os IDs dos tópicos e da assinatura. Você precisará desses valores posteriormente neste tutorial.
Prepare o ambiente
Faça o download dos exemplos de código e configure o ambiente para executar o tutorial.
Os exemplos de código no repositório python-docs-samples do GitHub (em inglês) fornecem o código necessário para executar esse pipeline. Quando você estiver pronto para criar seu próprio pipeline, poderá usar esse exemplo de código como modelo.
Você cria um ambiente virtual isolado do Python para executar seu projeto de pipeline usando o venv. Um ambiente virtual permite isolar as dependências de um projeto das dependências de outros projetos. Para mais informações sobre como instalar o Python e criar um ambiente virtual, consulte Como configurar um ambiente de desenvolvimento em Python.
Use o comando
git clonepara clonar o repositório do GitHub:git clone https://github.com/GoogleCloudPlatform/python-docs-samples.gitAcesse o diretório
run-inference:cd python-docs-samples/dataflow/run-inferenceSe você estiver usando um prompt de comando, verifique se tem o Python 3 e o
pipem execução no sistema:python --version python -m pip --versionSe necessário, instale o Python 3.
Se você estiver usando o Cloud Shell, poderá pular esta etapa porque ele já tem o Python instalado.
Crie um ambiente virtual em Python:
python -m venv /tmp/env source /tmp/env/bin/activateInstale as dependências:
pip install -r requirements.txt --no-cache-dir
Exemplo de código de carregamento do modelo
O código de carregamento de modelo neste tutorial inicia um job personalizado
da Vertex AI que carrega o objeto state_dict do modelo no
Cloud Storage.
O arquivo inicial tem a seguinte aparência:
Exemplo de código de pipeline
O código do pipeline neste tutorial implanta um pipeline do Dataflow que faz o seguinte:
- Lê um prompt do Pub/Sub e codifica o texto em tensores de token.
- Executa a transformação
RunInference. - Decodifica os tensores de token de saída em texto e grava a resposta no Pub/Sub.
O arquivo inicial tem a seguinte aparência:
Carregar o modelo
Os LLMs podem ser modelos muito grandes. Modelos maiores treinados com mais parâmetros geralmente oferecem melhores resultados. No entanto, modelos maiores exigem uma máquina maior e mais memória para serem executados. Modelos maiores também podem ser mais lentos para serem executados em CPUs.
Antes de executar um modelo PyTorch no Dataflow, você precisa carregar o
objeto state_dict do modelo. O
objeto state_dict
de um modelo armazena os pesos para o modelo.
Em um pipeline do Dataflow que usa a transformação RunInference do Apache Beam, o objeto state_dict do modelo precisa ser carregado no Cloud Storage. A máquina usada para carregar o objeto state_dict
no Cloud Storage precisa ter memória suficiente para carregar o modelo. A
máquina também precisa de uma conexão de Internet rápida para fazer o download dos pesos e
fazer o upload deles no Cloud Storage.
A tabela a seguir mostra o número de parâmetros para cada modelo e a memória mínima necessária para carregar cada modelo.
| Modelo | Parâmetros | Memória necessária |
|---|---|---|
google/flan-t5-small |
80 milhões | Mais de 320 MB |
google/flan-t5-base |
250 milhões | >1 GB |
google/flan-t5-large |
780 milhões | >3,2 GB |
google/flan-t5-xl |
3 bilhões | >12 GB |
google/flan-t5-xxl |
11 bilhões | >44 GB |
google/flan-ul2 |
20 bilhões | >80 GB |
Embora seja possível carregar um modelo menor localmente, este tutorial mostra como iniciar um job personalizado da Vertex AI que carrega o modelo com uma VM de tamanho adequado.
Como os LLMs podem ser muito grandes, o exemplo deste tutorial salva o objeto
state_dict no formato float16 em vez do formato float32 padrão.
Com essa configuração, cada parâmetro usa 16 bits em vez de 32 bits, tornando
o objeto state_dict metade do tamanho. Um tamanho menor minimiza o tempo
necessário para carregar o modelo. No entanto, converter o formato significa que a VM precisa
ajustar o modelo e o objeto state_dict na memória.
A tabela a seguir mostra os requisitos mínimos para carregar um modelo depois que o objeto
state_dict for salvo no formato float16. A tabela também mostra os
tipos de máquina sugeridos para carregar um modelo usando a Vertex AI. O
tamanho mínimo (e padrão) do disco para a Vertex AI é de 100 GB, mas alguns
modelos podem exigir um disco maior.
| Nome do modelo | Memória necessária | Tipo de máquina | Memória da VM | Disco da VM |
|---|---|---|---|---|
google/flan-t5-small |
Mais de 480 MB | e2-standard-4 |
16 GB | 100 GB |
google/flan-t5-base |
>1,5 GB | e2-standard-4 |
16 GB | 100 GB |
google/flan-t5-large |
>4,8 GB | e2-standard-4 |
16 GB | 100 GB |
google/flan-t5-xl |
>18 GB | e2-highmem-4 |
32 GB | 100 GB |
google/flan-t5-xxl |
>66 GB | e2-highmem-16 |
128 GB | 100 GB |
google/flan-ul2 |
>120 GB | e2-highmem-16 |
128 GB | 150 GB |
Carregue o objeto state_dict do modelo no Cloud Storage usando um
job personalizado da Vertex AI:
python download_model.py vertex \
--model-name="MODEL_NAME" \
--state-dict-path="gs://BUCKET_NAME/run-inference/MODEL_NAME.pt" \
--job-name="Load MODEL_NAME" \
--project="PROJECT_ID" \
--bucket="BUCKET_NAME" \
--location="LOCATION" \
--machine-type="VERTEX_AI_MACHINE_TYPE" \
--disk-size-gb="DISK_SIZE_GB"
Substitua:
- MODEL_NAME: o nome do modelo, como
google/flan-t5-xl. - VERTEX_AI_MACHINE_TYPE: o tipo de máquina em que
o job personalizado da Vertex AI será executado, como
e2-highmem-4. - DISK_SIZE_GB: o tamanho do disco da VM em GB. O tamanho mínimo é 100 GB.
Dependendo do tamanho do modelo, pode levar alguns minutos para carregá-lo. Para conferir o status, acesse a página Jobs personalizados da Vertex AI.
execute o pipeline
Depois de carregar o modelo, você executa o pipeline do Dataflow. Para executar o pipeline, o modelo e a memória usada por cada worker precisam caber na memória.
A tabela a seguir mostra os tipos de máquina recomendados para executar um pipeline de inferência.
| Nome do modelo | Tipo de máquina | Memória da VM |
|---|---|---|
google/flan-t5-small |
n2-highmem-2 |
16 GB |
google/flan-t5-base |
n2-highmem-2 |
16 GB |
google/flan-t5-large |
n2-highmem-4 |
32 GB |
google/flan-t5-xl |
n2-highmem-4 |
32 GB |
google/flan-t5-xxl |
n2-highmem-8 |
64 GB |
google/flan-ul2 |
n2-highmem-16 |
128 GB |
Execute o canal:
python main.py \
--messages-topic="projects/PROJECT_ID/topics/PROMPTS_TOPIC_ID" \
--responses-topic="projects/PROJECT_ID/topics/RESPONSES_TOPIC_ID" \
--model-name="MODEL_NAME" \
--state-dict-path="gs://BUCKET_NAME/run-inference/MODEL_NAME.pt" \
--runner="DataflowRunner" \
--project="PROJECT_ID" \
--temp_location="gs://BUCKET_NAME/temp" \
--region="REGION" \
--machine_type="DATAFLOW_MACHINE_TYPE" \
--requirements_file="requirements.txt" \
--requirements_cache="skip" \
--experiments="use_sibling_sdk_workers" \
--experiments="no_use_multiple_sdk_containers"
Substitua:
- PROJECT_ID: o ID do projeto;
- PROMPTS_TOPIC_ID: o ID do tópico dos comandos de entrada para enviar ao modelo
- RESPONSES_TOPIC_ID: o ID do tópico para as respostas do modelo
- MODEL_NAME: o nome do modelo, como
google/flan-t5-xl - BUCKET_NAME: o nome do bucket
- REGION: a região em que o
job será implantado, como
us-central1. - DATAFLOW_MACHINE_TYPE: a VM em que o pipeline será executado, como
n2-highmem-4.
Para garantir que o modelo seja carregado apenas uma vez por worker e não fique sem memória, configure os workers para usar um único processo definindo a opção --experiments=no_use_multiple_sdk_containers do pipeline. Não é necessário limitar
o número de linhas de execução, porque a transformação RunInference compartilha o mesmo modelo
com várias linhas de execução.
Neste exemplo, o pipeline é executado com CPUs. Para um modelo maior, é necessário mais tempo para processar cada solicitação. Ative as GPUs se precisar de respostas mais rápidas.
Para visualizar o status do pipeline, acesse a página Jobs do Dataflow.
Fazer uma pergunta ao modelo
Depois que a execução do pipeline começar, forneça um prompt ao modelo e receba uma resposta.
Envie seu prompt publicando uma mensagem no Pub/Sub. Use o comando
gcloud pubsub topics publish(em inglês).gcloud pubsub topics publish PROMPTS_TOPIC_ID \ --message="PROMPT_TEXT"Substitua
PROMPT_TEXTpor uma string que contenha o comando que você quer fornecer. Coloque o comando entre aspas.Use seu próprio comando ou teste um dos exemplos a seguir:
Translate to Spanish: My name is LukaComplete this sentence: Once upon a time, there was aSummarize the following text: Dataflow is a Google Cloud service that provides unified stream and batch data processing at scale. Use Dataflow to create data pipelines that read from one or more sources, transform the data, and write the data to a destination.
Para obter a resposta, use o comando
gcloud pubsub subscriptions pull.Dependendo do tamanho do modelo, pode levar alguns minutos para ele gerar uma resposta. Modelos maiores levam mais tempo para implantar e gerar uma resposta.
gcloud pubsub subscriptions pull RESPONSES_SUBSCRIPTION_ID --auto-ackSubstitua
RESPONSES_SUBSCRIPTION_IDpelo ID da assinatura das respostas do modelo.
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.
Excluir o projeto
Excluir um projeto do Google Cloud :
gcloud projects delete PROJECT_ID
Excluir recursos individuais
-
Saia do ambiente virtual do Python:
deactivate
-
Pare o pipeline:
-
Liste os IDs dos jobs do Dataflow em execução e anote o ID do job do tutorial:
gcloud dataflow jobs list --region=REGION --status=active
-
Cancele o job:
gcloud dataflow jobs cancel JOB_ID --region=REGION
-
-
Exclua o bucket e qualquer item dentro dele:
gcloud storage rm gs://BUCKET_NAME --recursive
-
Exclua os tópicos e a assinatura:
gcloud pubsub topics delete PROMPTS_TOPIC_ID gcloud pubsub topics delete RESPONSES_TOPIC_ID gcloud pubsub subscriptions delete RESPONSES_SUBSCRIPTION_ID
-
Revogue os papéis concedidos à conta de serviço padrão do Compute Engine. Execute uma vez o comando a seguir para cada um dos seguintes papéis do IAM:
roles/dataflow.adminroles/dataflow.workerroles/storage.adminroles/pubsub.editorroles/aiplatform.user
gcloud projects remove-iam-policy-binding PROJECT_ID --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com --role=SERVICE_ACCOUNT_ROLE
Opcional: revogue papéis da sua Conta do Google.
gcloud projects remove-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=roles/iam.serviceAccountUser
-
Opcional: revogue as credenciais de autenticação que você criou e exclua o arquivo de credenciais local:
gcloud auth application-default revoke
-
Opcional: revogar credenciais da CLI gcloud.
gcloud auth revoke
A seguir
- Conheça o Dataflow ML.
- Saiba mais sobre a API RunInference.
- Consulte informações detalhadas sobre como usar o ML com o Apache Beam na documentação de pipelines de IA/ML do Apache Beam.
- Siga as etapas indicadas no notebook Use RunInference for Generative AI.
- Confira arquiteturas de referência, diagramas, tutoriais e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.