Neste tutorial, você vai aprender a ajustar um modelo mistralai/Mixtral-8x7B-v0.1
em um cluster Slurm de vários nós e várias GPUs no Google Cloud. O cluster usa duas instâncias de máquina virtual (VM) a4-highgpu-8g, cada uma com 8 GPUs NVIDIA B200.
Os dois processos principais descritos neste tutorial são os seguintes:
- Implante um cluster Slurm de alta performance e nível de produção usando o Google Cloud Cluster Toolkit. Como parte dessa implantação, você cria uma imagem de VM personalizada com o software necessário pré-instalado. Você também configura um sistema de arquivos Lustre compartilhado e uma rede de alta velocidade.
- Depois que o cluster for implantado, execute um job de ajuste refinado distribuído usando o conjunto de scripts que acompanham este tutorial. O job usa o paralelismo de dados totalmente fragmentados (FSDP, na sigla em inglês) do PyTorch, que você acessa pela biblioteca Transformer Reinforcement Learning (TRL) do Hugging Face.
Este tutorial é destinado a engenheiros de machine learning (ML), pesquisadores, administradores e operadores de plataforma e especialistas em dados e IA que têm interesse em distribuir uma carga de trabalho de IA em vários nós e GPUs.
Objetivos
- Acessar o Mixtral usando o Hugging Face
- Instalar o Cluster Toolkit
- Preparar o ambiente
- Crie e implante um cluster Slurm A4 High-GPU de nível de produção.
- Configure um ambiente de vários nós para treinamento distribuído com FSDP.
- Ajuste o modelo Mixtral usando a classe
trl.SFTTrainerdo Hugging Face. - Faça o stage dos dados para SSDs locais.
- Monitorar o job.
- Fazer a limpeza.
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.
Antes de começar
- 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 CLI gcloud com sua identidade federada.
-
Para inicializar a CLI gcloud, 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 a API necessária:
Funções necessárias para ativar APIs
Para ativar APIs, você precisa da permissão
serviceusage.services.enable. Se você criou o projeto, provavelmente já tem essa permissão com o papel de Proprietário (roles/owner). Caso contrário, é possível receber essa permissão com o papel de Administrador do Service Usage (roles/serviceusage.serviceUsageAdmin). Saiba como conceder papéis.gcloud services enable compute.googleapis.com file.googleapis.com logging.googleapis.com cloudresourcemanager.googleapis.com servicenetworking.googleapis.com lustre.googleapis.com
-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.
-
Para inicializar a CLI gcloud, 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 a API necessária:
Funções necessárias para ativar APIs
Para ativar APIs, você precisa da permissão
serviceusage.services.enable. Se você criou o projeto, provavelmente já tem essa permissão com o papel de Proprietário (roles/owner). Caso contrário, é possível receber essa permissão com o papel de Administrador do Service Usage (roles/serviceusage.serviceUsageAdmin). Saiba como conceder papéis.gcloud services enable compute.googleapis.com file.googleapis.com logging.googleapis.com cloudresourcemanager.googleapis.com servicenetworking.googleapis.com lustre.googleapis.com
-
Atribua papéis à sua conta de usuário. Execute uma vez o seguinte comando para cada um dos seguintes papéis do IAM:
roles/compute.admin, roles/iam.serviceAccountUser, roles/file.editor, roles/storage.admin, roles/serviceusage.serviceUsageAdmingcloud 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.
- Ative a conta de serviço padrão para seu projeto do Google Cloud :
gcloud iam service-accounts enable PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --project=PROJECT_ID
Substitua PROJECT_NUMBER pelo número do projeto. Para revisar o número do projeto, consulte Receber um projeto atual.
- Conceda o papel de editor (
roles/editor) à conta de serviço padrão:gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role=roles/editor
- Crie as credenciais de autenticação local para sua conta de usuário:
gcloud auth application-default login
- Ative o Login do SO no seu projeto:
gcloud compute project-info add-metadata --metadata=enable-oslogin=TRUE
- Faça login ou crie uma conta do Hugging Face.
- Instale as dependências necessárias para usar o Cluster Toolkit.
Acessar o Mixtral usando o Hugging Face
Para usar o Hugging Face e acessar o Mixtral, faça o seguinte:
- Faça login no Hugging Face e conheça o modelo Mixtral.
- Crie um token de acesso
readdo Hugging Face. - Copie e salve o valor do token. Você vai usá-lo mais tarde neste tutorial.
Instalar o Cluster Toolkit
O Cluster Toolkit é uma ferramenta de código aberto que simplifica a implantação de cargas de trabalho de computação de alto desempenho (HPC), inteligência artificial (IA) e machine learning (ML) no Google Cloud. Para mais informações sobre como usar gcluster e
gerenciar clusters, consulte a
visão geral do Cluster Toolkit.
Prepare a versão do Cluster Toolkit:
Faça o download da versão:
Defina o caminho
gcluster:
Preparar o ambiente
Para preparar o ambiente, siga estas etapas:
Defina as variáveis de ambiente padrão:
Substitua:
YOUR_PROJECT_ID: o nome do projeto Google Cloud em que você quer criar o cluster do Slurm.YOUR_ZONE: a zona em que a reserva existe.YOUR_REGION: a região em que sua reserva existe.YOUR_RESERVATION_NAME: o URL ou o nome da reserva que você quer usar para criar o cluster do Slurm.YOUR_CLUSTER_NAME: o nome da sua implantação. Use um nome curto que contenha apenas letras e números (por exemplo,a4high). Esse nome também é atribuído ao cluster do Slurm criado pela implantação.YOUR_GCS_BUCKET: o nome do bucket em que você armazena os resultados do checkpoint de treinamento. Especifique um bucket atual ou crie um novo. Antes de criar, familiarize-se com os requisitos de nomenclatura de bucket.YOUR_HF_TOKEN: o token do Hugging Face que você criou em uma etapa anterior.
Crie um bucket do Cloud Storage:
Criar um cluster Slurm A4
Para criar um cluster do Slurm A4, faça o seguinte:
Substitua o arquivo
a4high-slurm-deployment.yamlno diretórioexamples/machine-learning/a4-highgpu-8gpelas variáveis de ambiente executando o seguinte comando:Abra o arquivo
a4high-slurm-blueprint.yamlno diretórioexamples/machine-learning/a4-highgpu-8ge edite-o para usar o Managed Lustre no diretório compartilhado/homeda seguinte maneira:- Remova o bloco de módulo
homefspadrão comsource: modules/file-system/filestore. - Ative os módulos
lustrefs(blocohomefscomremote_mount: lustrefs) eprivate-service-access. - No bloco
vars, configure o seguinte:- Mude o valor de
install_managed_lustreem/var/tmp/slurm_vars.jsonparatrue. - Defina o parâmetro
per_unit_storage_throughputcomo500. - Defina o parâmetro
lustre_size_gibcomo36000. - Remova o comentário de
lustre_instance_id: lustre-instance. - Comente ou remova
filestore_ip_rangenão utilizado.
- Mude o valor de
- Remova o bloco de módulo
Implante o cluster:
O comando
./gcluster deployinicia um processo de duas fases, que é o seguinte:- A primeira fase cria uma imagem personalizada com todo o software pré-instalado, o que pode levar até 35 minutos.
- A segunda fase implanta o cluster usando essa imagem personalizada. Esse processo deve ser concluído mais rapidamente do que a primeira fase.
Preparar sua carga de trabalho
Para preparar sua carga de trabalho, siga estas etapas:
Criar scripts de carga de trabalho
Para criar os scripts que sua carga de trabalho de ajuste refinado vai usar, siga estas etapas:
Para configurar o ambiente virtual Python, crie o arquivo
install_environment.shcom o seguinte conteúdo:Para especificar as dependências do Python para o script de treinamento, crie um arquivo
requirements-fsdp.txtcom o seguinte conteúdo:Especifique
train-mixtral.pycomo o script de treinamento principal:Para especificar as tarefas que os jobs vão executar no cluster Slurm, crie o arquivo
train-mixtral.shcom o seguinte conteúdo:
Fazer upload dos scripts para o cluster do Slurm
Para fazer upload dos scripts criados na seção anterior para o cluster do Slurm, siga estas etapas:
Defina a variável
LOGIN_NODErecuperando o nome do nó de login do cluster:A variável
LOGIN_NODEarmazena um valor semelhante a${DEPLOYMENT_NAME}-login-001.Crie uma regra de firewall:
Faça upload dos scripts para o diretório principal do nó de login:
Conectar-se ao cluster do Slurm
Conecte-se ao cluster do Slurm conectando-se ao nó de login por SSH:
Instalar frameworks e ferramentas
Depois de se conectar ao nó de login, instale as ferramentas e os frameworks necessários executando o script de instalação em um nó de computação:
Esse comando configura o ambiente virtual, instala todas as dependências e
baixa as ponderações do modelo Mixtral em ~/Mixtral-8x7B-v0.1. Esse processo pode levar mais de 30 minutos.
Executar esta etapa via srun delega o script de instalação do nó de login para um nó de computação alocado, permitindo que o script acesse os drivers de GPU durante a compilação.
Iniciar a carga de trabalho de ajuste refinado
Para iniciar a carga de trabalho de treinamento, faça o seguinte:
Envie o job para o programador do Slurm:
Monitore sua carga de trabalho
Para monitorar o progresso do seu job de ajuste refinado, use os seguintes métodos:
No nó de login do cluster do Slurm, é possível monitorar o progresso do job verificando os arquivos de saída criados no diretório
home:Se o job for iniciado com sucesso, o arquivo
.errvai mostrar uma barra de progresso que é atualizada conforme o job avança.O trabalho tem duas fases principais:
- Copiar o modelo de base grande para o SSD local de cada nó de computação.
- O job de treinamento, que começa quando a cópia do modelo é concluída.
O job inteiro leva cerca de 60 minutos para ser executado.
Também é possível monitorar o uso das GPUs no cluster do Slurm para verificar se o job de ajuste refinado está sendo executado de maneira eficiente. Para fazer isso, abra o seguinte link no navegador:
https://console.cloud.google.com/monitoring/metrics-explorer?project=YOUR_PROJECT_ID&pageState=%7B%22xyChart%22%3A%7B%22dataSets%22%3A%5B%7B%22timeSeriesFilter%22%3A%7B%22filter%22%3A%22metric.type%3D%5C%22agent.googleapis.com%2Fgpu%2Futilization%5C%22%20resource.type%3D%5C%22gce_instance%5C%22%22%2C%22perSeriesAligner%22%3A%22ALIGN_MEAN%22%7D%2C%22plotType%22%3A%22LINE%22%7D%5D%7D%7DComo alternativa, insira o comando diretamente no terminal:
Ao monitorar sua carga de trabalho, você pode ver o seguinte:
Uso da GPU: para um job de ajuste refinado saudável, é esperado que o uso de todas as 16 GPUs (oito GPUs para cada VM no cluster) aumente e se estabilize em um nível específico durante todo o treinamento.
Duração do job: o job leva aproximadamente uma hora para ser concluído.
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 os recursos
Execute os comandos a seguir para excluir os recursos criados neste tutorial:
Para excluir o cluster Slurm, acesse o diretório
cluster-toolkite execute o seguinte comando:Exclua o bucket:
Para excluir uma imagem do Packer, abra o navegador da Web, acesse a página a seguir, pesquise sua imagem específica e clique em "Excluir".
Excluir o projeto
Excluir um projeto do Google Cloud :
gcloud projects delete PROJECT_ID
A seguir
- Reimplantar um cluster do Slurm
- Testar o desempenho da rede em um cluster do Slurm
- Monitorar VMs em um cluster do Slurm
- Criar um endpoint de serviço: depois de ter o modelo refinado, implante-o em um endpoint de serviço usando o Google Kubernetes Engine (GKE) ou a Vertex AI para torná-lo acessível para inferência.
- Saiba mais sobre os serviços de armazenamento recomendados para cargas de trabalho de IA e ML