Esta página mostra-lhe como usar a criação de pontos de verificação de vários níveis para armazenar e gerir de forma fiável os pontos de verificação durante a preparação do modelo de aprendizagem automática no GKE. O armazenamento e a gestão de pontos de verificação são cruciais para tarefas de preparação em grande escala, definidas como as que usam mais de milhares de nós. As interrupções destas tarefas de grande escala são frequentes (potencialmente de hora a hora) e a recuperação das mesmas pode ser lenta.
Vantagens
A utilização da funcionalidade de pontos de verificação de vários níveis oferece as seguintes vantagens:
- Gestão de dados de pontos de verificação totalmente orquestrada, incluindo cópias de segurança, replicação e restauro automático para as seguintes cargas de trabalho:
- Execuções de preparação do JAX que usam o Orbax para a gestão de estados em TPUs.
- Cargas de trabalho do PyTorch em GPUs.
- Recuperação rápida de tarefas de preparação a partir de um ponto de verificação armazenado no nó local. Também pode fazer a recuperação através de pontos de verificação armazenados noutro nó no cluster de preparação.
- Restauro rápido de tarefas de preparação a partir de um ponto de verificação armazenado numa cópia de segurança do Cloud Storage em cenários de pior caso, em que não existem pontos de verificação no cluster.
Antes de começar
Antes de começar, certifique-se de que realizou as seguintes tarefas:
- Ative a API Google Kubernetes Engine. Ative a API Google Kubernetes Engine
- Se quiser usar a CLI gcloud para esta tarefa,
instale-a e, em seguida,
inicialize-a. Se instalou anteriormente a CLI gcloud, execute
gcloud components update
para obter a versão mais recente.
- Crie um contentor do Cloud Storage, se não tiver um para o seu projeto. Certifique-se de que ativa o espaço de nomes hierárquico. Caso contrário, as cópias de segurança vão falhar.
Requisitos
A funcionalidade de criação de pontos de verificação de vários níveis requer a versão 1.32.4-gke.1415000 ou posterior do cluster do GKE.
Limitações
- Os clusters do Autopilot não são suportados.
Configure nós do GKE para usar a criação de pontos de verificação de vários níveis
Estas secções abordam a configuração de nós do GKE em clusters novos e existentes.
Configure nós num novo cluster
Crie um cluster com a funcionalidade Multi-Tier Checkpointing, o controlador CSI do FUSE do Cloud Storage e a Federação de identidades de cargas de trabalho para o GKE ativados. Se usar fatias de TPU para a sua carga de trabalho de aprendizagem automática, tem de ajustar o comando de criação do cluster para incluir a configuração de um conjunto de nós de fatias de TPU.
gcloud container clusters create CLUSTER_NAME \ --addons=HighScaleCheckpointing,GcsFuseCsiDriver \ --node-locations=NODE_LOCATION \ --workload-pool=PROJECT_ID.svc.id.goog \ --cluster-version=CLUSTER_VERSION --location=CLUSTER_LOCATION \ --machine-type=MACHINE_TYPE \ --num-nodes=NUM_NODES
Substitua os seguintes valores:
CLUSTER_NAME
: o nome do cluster.NODE_LOCATION
: a zona dos nós do cluster. É aqui que se encontra a sua capacidade de TPU.PROJECT_ID
: o seu Google Cloud ID do projeto.CLUSTER_VERSION
: a versão do seu cluster. 1.32.4-gke.1415000 é a versão mínima suportada.CLUSTER_LOCATION
: a região na qual quer criar o cluster.MACHINE_TYPE
: o tipo de máquina usado para nós que executam componentes como o controlador JobSet e o controlador de pontos de verificação de vários níveis. Para a preparação em grande escala, recomendamos a utilização de, pelo menos,e2-standard-4
máquinas. Não vai usar este tipo de máquina para o preparação de modelos. Em alternativa, vai criar pools de nós separados para esse fim, usando frequentemente famílias de VMs otimizadas para aceleradores.NUM_NODES
: o número de nós a criar em cada uma das zonas do cluster.
Configure nós num cluster existente
Para usar a criação de pontos de verificação de vários níveis com um cluster existente, ative-a juntamente com o controlador CSI do FUSE do Cloud Storage e a federação de identidades de cargas de trabalho para o GKE com os seguintes comandos. A versão do cluster existente tem de ser posterior a 1.32.3-gke.1170000.
Ative a federação de identidades de cargas de trabalho para o GKE:
gcloud container clusters update CLUSTER_NAME \ --workload-pool=PROJECT_ID.svc.id.goog \ --location=CLUSTER_LOCATION
Substitua os seguintes valores:
CLUSTER_NAME
: o nome do cluster.PROJECT_ID
: o seu Google Cloud ID do projeto.CLUSTER_LOCATION
: a região do cluster.
Ative a criação de pontos de verificação de vários níveis e o controlador CSI FUSE do Cloud Storage:
gcloud container clusters update CLUSTER_NAME \ --update-addons=HighScaleCheckpointing=ENABLED,GcsFuseCsiDriver=ENABLED \ --location=CLUSTER_LOCATION
Configure autorizações para usar a verificação de pontos de controlo de vários níveis
Esta secção aborda a forma de configurar autorizações para usar a funcionalidade de validação de vários níveis.
Conceda acesso a contentores do Cloud Storage
Os volumes efémeros usados pelo controlador CSI de verificação de pontos de controlo de vários níveis têm de usar contentores do Cloud Storage existentes.
Para armazenar pontos de verificação num contentor do Cloud Storage, a funcionalidade de pontos de verificação de vários níveis precisa de
acesso ao contentor. Conceda a função de IAM de utilizador de objetos de armazenamento (roles/storage.objectUser
) no contentor à conta de serviço do Kubernetes para a criação de pontos de verificação de vários níveis.
gcloud storage buckets add-iam-policy-binding gs://GCS_BUCKET \
--member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/gke-managed-checkpointing/sa/gke-checkpointing-multitier-node" \
--role "roles/storage.objectUser"
Substitua os seguintes valores:
GCS_BUCKET
: o nome do contentor do Cloud Storage a partir do qual vai transferir dados.PROJECT_ID
: o seu Google Cloud ID do projeto.PROJECT_NUMBER
: um identificador exclusivo gerado automaticamente para o seu projeto. Para encontrar este valor, consulte o artigo Criar e gerir projetos.
(Opcional) Conceda acesso à conta de serviço predefinida do Compute Engine
Se as suas instâncias do Compute Engine precisarem de acesso de leitura ao contentor do Cloud Storage, conceda a função do IAM Storage Object Viewer (roles/storage.objectViewer
) à conta de serviço predefinida do Compute Engine.
gcloud storage buckets add-iam-policy-binding gs://GCS_BUCKET \
--member serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
--role roles/storage.objectViewer
Implemente o controlador JobSet
O controlador JobSet é responsável por gerir as tarefas em lote que executam a preparação do seu modelo no GKE, e a respetiva atribuição de recursos é ajustada para processar a carga de trabalho de forma eficiente. Certifique-se de que o iniciador de tarefas de preparação é implementado e usa o JobSet.
Para aumentar o pedido de memória para 1 Gi, o limite de memória para 2 Gi e o pedido de CPU para 1 para o contentor do gestor na sua implementação do JobSet, execute o seguinte comando de patch:
kubectl patch -n jobset-system deploy jobset-controller-manager --type json \
--patch '[{"op": "add", "path": "/spec/template/spec/containers/0/resources", "value": {"limits": {"memory": "2Gi"}, "requests": {"cpu": "1", "memory": "1Gi"}}}]'
Inicialize o controlador CSI de pontos de verificação de vários níveis
Esta secção descreve como inicializar o controlador CSI de pontos de verificação de vários níveis em nós onde as suas cargas de trabalho vão ser executadas. O controlador CSI é responsável pelo processamento do armazenamento e da gestão dos pontos de verificação durante o processo de preparação do modelo.
Crie uma CheckpointConfiguration
Um CheckpointConfiguration é um recurso personalizado do Kubernetes que especifica propriedades para implementar o controlador CSI de pontos de verificação de vários níveis. Este recurso tem âmbito de cluster.
Crie o seguinte manifesto
checkpoint.yaml
.apiVersion: checkpointing.gke.io/v1 kind: CheckpointConfiguration metadata: name: MTC_CONFIG_NAME-configuration spec: cloudStorageBucketName: GCS_BUCKET nodeSelector: node.kubernetes.io/instance-type: MACHINE_TYPE tolerations: - key: TOLERATION_KEY operator: Exists effect: NoSchedule inMemoryVolumeSize: IN_MEMORY_VOLUME_SIZE gcsFuseMountOptions: - implicit-dirs - metadata-cache:negative-ttl-secs:0 - metadata-cache:ttl-secs:-1 - metadata-cache:stat-cache-max-size-mb:-1 - metadata-cache:type-cache-max-size-mb:-1 - file-system:kernel-list-cache-ttl-secs:0 - read_ahead_kb=1024 - write:enable-streaming-writes:true
Substitua o seguinte:
- MTC_CONFIG_NAME: o nome da sua CheckpointConfiguration. Este nome é global para o cluster e não é específico da tarefa.
- GCS_BUCKET: o nome do contentor do Cloud Storage onde vai armazenar os dados de pontos de verificação. Use o contentor que configurou no passo Configure um contentor do Cloud Storage com autorizações.
MACHINE_TYPE: o tipo de máquina dos aceleradores correspondentes. O valor pode ser um dos seguintes:
- TPU v5p:
ct5p-hightpu-4t
- TPU v5e:
ct5e-hightpu-4t
- TPU v6e:
ct6e-standard-4t
- GPUs NVIDIA H100 de 80 GB (série A3):
Para mais informações sobre a execução de cargas de trabalho distribuídas em GPUs com o GKE, consulte o artigo Executar GPUs de várias instâncias. Para TPUs, consulte o artigo Crie o node pool de fatia da TPU.
- TPU v5p:
TOLERATION_KEY: este campo permite que o controlador CSI seja agendado em nós com manchas correspondentes. Para mais informações sobre como as falhas funcionam em diferentes tipos de aceleradores, consulte estas páginas:
IN_MEMORY_VOLUME_SIZE: o tamanho da cache de verificação de pontos na memória. Especifique a quantidade e a unidade (por exemplo, 200 Gi).Este valor deve:
- O tamanho do ponto de restauro local para as TPUs multiplicado por 2,2
- O tamanho do ponto de verificação local para GPUs com um único par multiplicado por 6,6.
Aplique o manifesto:
kubectl apply -f checkpoint.yaml
Verifique se o controlador CSI está em execução:
kubectl get pod -n gke-managed-checkpointing
O resultado deve ser semelhante ao seguinte. Existem várias entradas, uma por nó acelerado.
NAME READY STATUS RESTARTS AGE multitier-driver-e2b033a7-a4e7-496a-87a3-ffd7fcc2e57b-2d4fz 5/5 Running 0 114s
Desinstale o controlador CSI de pontos de verificação de vários níveis
Se quiser anular a implementação do controlador CSI de pontos de verificação de vários níveis, elimine o recurso CheckpointConfiguration
. O controlador de pontos de verificação de vários níveis remove o controlador CSI dos nós. Esta ação remove os discos RAM e liberta memória para outras cargas de trabalho. Por exemplo:
kubectl delete -f checkpoint.yaml
Faça a gestão da retenção de dados e da recolha de lixo para as cópias de segurança do Cloud Storage
É responsável pela implementação de políticas de retenção para as cópias de segurança dos pontos de verificação do Cloud Storage. A criação de pontos de verificação de vários níveis apenas escreve cópias de segurança de pontos de verificação no Cloud Storage e nunca as modifica nem elimina.
Muitas ferramentas de código aberto podem processar a retenção e a recolha de lixo, incluindo as seguintes:
O exemplo seguinte usa backup-warden
, em que o diretório backup
está
montado numa localização de cópia de segurança que usa o FUSE do Cloud Storage:
# Add --delete option to actually delete the backups, as is it only shows what would be deleted (dry-run)
backup-warden -p backup \
--hourly 24 \
--daily 7 \
--weekly 5 \
--monthly always \
--yearly always \
--prefer-recent
Atualize o manifesto do JobSet da carga de trabalho
Atualize o manifesto JobSet do seu trabalho para incluir o volume de pontos de verificação em grande escala. Os detalhes dependem da sua carga de trabalho.
Por exemplo, para estender o JobSet de exemplo de Implemente multislices de TPU no GKE, siga estes passos:
Adicione as seguintes linhas ao contentor
jax-tpu
.volumeMounts: - name: checkpoint mountPath: CHECKPOINT_DIR
Substitua CHECKPOINT_DIR pelo caminho para o diretório do ponto de verificação. Esta é a localização onde o
replicator.yaml
é gerado e a funcionalidade de pontos de controlo de vários níveis executa a operação de guardar pontos de controlo. Para mais informações, consulte o artigo Integre a verificação de vários níveis na sua aplicação.Adicione as seguintes linhas ao campo
spec.template.spec
da especificação do trabalho.volumes: - name: checkpoint csi: driver: multitier-checkpoint.csi.storage.gke.io
Integre a verificação de pontos de controlo de vários níveis na sua aplicação
Para partilhar informações sobre localizações de pontos de verificação e disponibilidade de replicação, modifique a sua aplicação para usar o seguinte protocolo para comunicar com a verificação de pontos de vários níveis.
Arranque
Esta secção descreve os passos iniciais que a aplicação tem de seguir para interagir com a validação de pontos de verificação de vários níveis.
O Replicator é um componente essencial da criação de pontos de verificação de vários níveis, executado em todos os nós como parte do controlador CSI. O replicador gere a replicação de pontos de verificação em todos os níveis de armazenamento, desde o disco RAM local aos nós de pares e ao armazenamento externo, como o Cloud Storage.
O ficheiro replicator.yaml
funciona como um plano de controlo dinâmico entre a tarefa de preparação de ML (código da framework) e o componente Replicator. A sua aplicação de ML gera este ficheiro programaticamente no volume local (RAMDisk), que é acessível tanto pela tarefa de preparação como pelo serviço Replicator. Este manifesto permite que a framework de ML forneça instruções de configuração de tempo de execução e gestão do ciclo de vida ao replicador, distintas dos parâmetros de infraestrutura estáticos (por exemplo, frequência de carregamento do Cloud Storage) definidos durante a configuração do back-end.
Para ver um exemplo concreto desta interação, consulte:
- O projeto MaxText, que usa esta arquitetura para o JAX na Cloud TPU.
- O exemplo de referência do PyTorch, que usa esta arquitetura com o PyTorch e o NVIDIA NeMO em GPUs.
A sua aplicação deve seguir os seguintes passos durante o arranque:
Aguarde até que o ficheiro
replicator.yaml
esteja ausente, o que indica que o replicador está pronto para ser configurado pela sua aplicação. O ficheiroreplicator.yaml
é gerado na localização CHECKPOINT_DIR que configurou na secção Atualize o manifesto do JobSet da carga de trabalho.Quando a tarefa de preparação de modelo é criada pela primeira vez, o ficheiro
replicator.yaml
não existe e a sua aplicação pode prosseguir imediatamente. No entanto, se o trabalho tiver sido reiniciado (por exemplo, devido a uma falha ou intervenção manual), o sistema ainda pode estar a processar a instância do trabalho anterior, e oreplicator.yaml
dessa instância ainda pode estar presente no volume local.A sua aplicação ou tarefa de ML cria o ficheiro
replicator.yaml
com a configuração semelhante à seguinte.Orbax
job-name: orbax framework: orbax assume-data-parallelism: 3 node-rank: 0 nodes: 32 peer-ranks: [1, 16] or peers-per-node: 2 backup-interval-minutes: 30
PyTorch
job-name: nemo framework: pytorch.distributed node-rank: 0 nodes: 32 peer-ranks: [1, 16] or peers-per-node: 2 backup-interval-minutes: 30
Esta configuração de exemplo tem os seguintes campos:
name
: o nome da tarefa de preparação.framework
: a framework de AA usada pela tarefa de preparação.node-rank
: o identificador exclusivo do nó atual na tarefa de preparação distribuída. Representa a classificação do nó do nó que está a criar este ficheiro. Cada nó que participa na execução tem a sua própria classificação.nodes
: o número total de nós que participam na tarefa de preparação distribuída. Este valor é proveniente dos metadados do podcast. A tarefa de preparação de ML também pode ver este valor.peer-ranks
oupeers-per-node
: duas formas alternativas de especificar a topologia de replicação. Apenas um destes dois parâmetros deve estar presente.peer-ranks
: classificações explícitas dos nós de pares para os quais os dados de pontos de verificação do nó atual devem ser replicados. Isto dá um controlo detalhado sobre os nós específicos que funcionam como parceiros de replicação.peers-per-node
: o número de nós pares por nó que o replicador deve selecionar automaticamente para replicação.
backup-interval-minutes
: a frequência, em minutos, com que é feita uma cópia de segurança dos pontos de verificação no Cloud Storage. Recomendamos que defina este valor para 30 minutos ou mais.
Aguarde até que o novo ficheiro
replicator.yaml
seja eliminado pelo sistema. Isto indica que o replicador foi reiniciado e efetuou a limpeza. Este passo permite-lhe evitar ficheiros desatualizados ou temporários no volume local quando a sua aplicação executa os passos na secção seguinte.
Restaurar a partir do último posto de controlo conhecido (LKG)
Após a inicialização do replicador, a funcionalidade Multi-Tier Checkpointing cria um link simbólico por trabalhador de TPU ou GPU. Estes links simbólicos são criados no mesmo volume local montado que o ficheiro
replicator.yaml
, onde a tarefa guarda os pontos de verificação.Os links simbólicos têm o formato
<job-name>-s{step}-n<node-rank>-w<worker-index>.restore
.Restaure cada trabalhador a partir do ficheiro
.restore
correspondente. Para ver um exemplo, consulte o exemplo do gestor de pontos de verificação replicados do Orbax na secção seguinte.
Guarde o ponto de controlo
A sua aplicação executa estes passos várias vezes enquanto a tarefa de preparação progride. As operações de guardar ocorrem na localização CHECKPOINT_DIR que configurou em Atualize o manifesto JobSet da carga de trabalho.
Orbax
Crie pontos de verificação Orbax. O diretório tem o nome do número do passo. O replicador deteta o diretório de pontos de verificação recém-criado, faz a replicação ou a cópia de segurança conforme necessário e faz a limpeza automaticamente.
Para mais informações sobre como usar o gestor de pontos de verificação do replicador Orbax, consulte o ficheiro
MaxtTest checkpointing
.
Para ver um exemplo de interação do serviço de replicador, consulte o ficheiro MaxText max_utils
.
PyTorch
Use InClusterLocalCheckpointIO
como um pytorch_lightning.CheckpointIO
personalizado
para ativar a criação de pontos de verificação distribuídos corretos com o armazenamento local. O seguinte comando de exemplo ativa a criação de pontos de verificação de vários níveis através de uma implementação de referência criada na framework NVIDIA NeMo:
torchrun train.py <other_train_flags> \
--local-ckpt-dir=CHECKPOINT_DIR \
--local-ckpt-interval=20 \
--job-name=JOB_NAME \
--enable-high-scale-ckpt
Substitua o seguinte:
CHECKPOINT_DIR
: o caminho para o diretório do ponto de verificação.JOB_NAME
: o nome da carga de trabalho da tarefa de preparação.
Atualizações de clusters
Para atualizações de clusters, pode eliminar e recriar o objeto CheckpointConfiguration
antes ou depois da atualização. Esta ação é necessária porque o conjunto de daemon do controlador de criação de pontos de verificação de nós, implementado dinamicamente por este objeto, não é atualizado automaticamente.
Se quiser especificamente manter a especificação do daemonset, não tem de fazer nada.
Resolver problemas
Esta secção fornece orientações de resolução de problemas para resolver problemas com a validação de pontos de controlo de vários níveis. Para a resolução de problemas gerais de armazenamento, consulte o artigo Resolução de problemas do Cloud Storage no GKE.
A verificação de pontos de vários níveis não está ativada
O seguinte erro indica que a verificação de pontos de controlo de vários níveis não está ativada no seu cluster:
error: unable to recognize "checkpoint.yaml": no matches for kind "CheckpointConfiguration" in version "checkpointing.gke.io/v1"
Pode encontrar este erro depois de executar kubectl apply -f checkpoint.yaml
no passo Crie uma CheckpointConfiguration.
Para resolver este problema, verifique se ativou a funcionalidade Multi-Tier Checkpointing no seu cluster com o seguinte comando:
gcloud container clusters describe CLUSTER_NAME \
--project PROJECT_ID
--location CLUSTER_LOCATION
Se a funcionalidade de pontos de verificação de vários níveis estiver ativada, o resultado deve ser semelhante ao seguinte:
addonsConfig:
gcePersistentDiskCsiDriverConfig:
enabled: true
gcsFuseCsiDriverConfig:
enabled: true
highScaleCheckpointingConfig:
enabled: true
kubernetesDashboard:
disabled: true
networkPolicyConfig:
disabled: true
Se a funcionalidade Multi-Tier Checkpointing não estiver ativada, atualize o cluster para a ativar.
O controlador CSI de pontos de verificação de vários níveis não consegue montar volumes
Pode encontrar este problema se o controlador CSI não conseguir montar o volume do Cloud Storage. Podem existir várias linhas semelhantes a esta.
kubectl get pod -n gke-managed-checkpointing
NAME READY STATUS RESTARTS AGE
multitier-driver-14694e4d-774f-4104-8bba-f0bd82fd7557-5vxr9 0/5 Init:0/1 0 6m32s
Para resolver este problema, verifique os eventos do pod do controlador CSI, conforme mostrado no seguinte exemplo:
kubectl describe pod multitier-driver-14694e4d-774f-4104-8bba-f0bd82fd7557-5vxr9 -n gke-managed-checkpointing
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 17m default-scheduler Successfully assigned gke-managed-checkpointing/multitier-driver-14694e4d-774f-4104-8bba-f0bd82fd7557-5vxr9 to gke-my-cluster-default-pool-353c773f-6d8q
Warning FailedMount 82s (x16 over 17m) kubelet MountVolume.SetUp failed for volume "gcs" : rpc error: code = PermissionDenied desc = failed to get GCS bucket "checkpointing-test-bucket": googleapi: Error 403: Caller does not have storage.objects.list access to the Google Cloud Storage bucket. Permission 'storage.objects.list' denied on resource (or it may not exist)., forbidden
Se o problema ocorrer devido a um erro PermissionDenied
do contentor do Cloud Storage, conforme
mostrado no exemplo, pode resolver o problema configurando corretamente as autorizações.
O que se segue?
- Saiba mais sobre a implementação do TPU Multislice no Google Kubernetes Engine.
- Saiba como otimizar o controlador CSI FUSE do Cloud Storage para o Google Kubernetes Engine para melhorar o desempenho.
- Explore as opções de criação de pontos de verificação do Orbax.