Tutorial di preaddestramento sul cluster Kubernetes (GPU) - Amazon SageMaker AI

Tutorial di preaddestramento sul cluster Kubernetes (GPU)

Esistono due modi per avviare un job di addestramento in un cluster GPU Kubernetes:

Prerequisiti

Prima di iniziare a configurare l’ambiente, assicurati di avere:

  • Un cluster HyperPod GPU Kubernetes configurato correttamente.

  • Una posizione di archiviazione condivisa. Può essere un file system Amazon FSx o un sistema NFS accessibile dai nodi del cluster.

  • I dati in uno dei seguenti formati:

    • JSON

    • JSONGZ (JSON compresso)

    • ARROW

  • (Facoltativo) È necessario ottenere un token HuggingFace se utilizzi i pesi del modello di HuggingFace per il preaddestramento o il fine-tuning. Per ulteriori informazioni su come ottenere il token, consulta User access tokens.

Configurazione dell’ambiente GPU Kubernetes

Per configurare un ambiente GPU Kubernetes, procedi come descritto di seguito:

  • Configura l’ambiente virtuale. Assicurati di utilizzare Python 3.9 o versioni successive.

    python3 -m venv ${PWD}/venv source venv/bin/activate
  • Installa le dipendenze utilizzando uno dei metodi seguenti:

    • (Consigliato) Il metodo dello strumento a riga di comando HyperPod:

      # install HyperPod command line tools git clone https://github.com/aws/sagemaker-hyperpod-cli cd sagemaker-hyperpod-cli pip3 install .
    • Metodo delle ricette SageMaker HyperPod:

      # install SageMaker HyperPod Recipes. git clone --recursive git@github.com:aws/sagemaker-hyperpod-recipes.git cd sagemaker-hyperpod-recipes pip3 install -r requirements.txt
  • Configura kubectl ed eksctl.

  • Installa Helm.

  • Connettiti al cluster Kubernetes.

    aws eks update-kubeconfig --region "CLUSTER_REGION" --name "CLUSTER_NAME" hyperpod connect-cluster --cluster-name "CLUSTER_NAME" [--region "CLUSTER_REGION"] [--namespace <namespace>]

Avvio del job di addestramento con la CLI di SageMaker HyperPod

Ti consigliamo di utilizzare lo strumento dell’interfaccia a riga di comando (CLI) di SageMaker HyperPod per inviare il job di addestramento con le tue configurazioni. L’esempio seguente invia un job di addestramento per il modello hf_llama3_8b_seq16k_gpu_p5x16_pretrain.

  • your_training_container: un container per il Deep Learning. Per trovare il rilascio più recente del container SMP, consulta Note di rilascio della libreria SageMaker Model Parallelism..

  • (Facoltativo) Se hai bisogno di pesi preaddestrati da HuggingFace, puoi fornire il token HuggingFace impostando la coppia chiave-valore seguente:

    "recipes.model.hf_access_token": "<your_hf_token>"
hyperpod start-job --recipe training/llama/hf_llama3_8b_seq16k_gpu_p5x16_pretrain \ --persistent-volume-claims fsx-claim:data \ --override-parameters \ '{ "recipes.run.name": "hf-llama3-8b", "recipes.exp_manager.exp_dir": "/data/<your_exp_dir>", "container": "658645717510.dkr.ecr.<region>.amazonaws.com/smdistributed-modelparallel:2.4.1-gpu-py311-cu121", "recipes.model.data.train_dir": "<your_train_data_dir>", "recipes.model.data.val_dir": "<your_val_data_dir>", "cluster": "k8s", "cluster_type": "k8s" }'

Dopo aver inviato un job di addestramento, puoi utilizzare il comando seguente per verificare se l’invio è riuscito.

kubectl get pods NAME READY STATUS RESTARTS AGE hf-llama3-<your-alias>-worker-0 0/1 running 0 36s

Se STATUS è PENDING o ContainerCreating, utilizza il comando seguente per ottenere maggiori dettagli.

kubectl describe pod name_of_pod

Quando lo STATUS del processo diventa Running, puoi esaminare il log utilizzando il comando seguente.

kubectl logs name_of_pod

STATUS diventa Completed quando esegui kubectl get pods.

Avvio del job di addestramento con l’utilità di avvio delle ricette

In alternativa, puoi utilizzare le ricette SageMaker HyperPod per inviare il job di addestramento. Per utilizzare le ricette, devi aggiornare k8s.yaml e config.yaml ed eseguire lo script di avvio.

  • In k8s.yaml, aggiorna persistent_volume_claims. Monta la richiesta Amazon FSx nella directory /data di ogni pod di calcolo.

    persistent_volume_claims: - claimName: fsx-claim mountPath: data
  • In config.yaml, aggiorna repo_url_or_path sotto git.

    git: repo_url_or_path: <training_adapter_repo> branch: null commit: null entry_script: null token: null
  • Aggiornamento di launcher_scripts/llama/run_hf_llama3_8b_seq16k_gpu_p5x16_pretrain.sh

    • your_contrainer: un container per il Deep Learning. Per trovare il rilascio più recente del container SMP, consulta Note di rilascio della libreria SageMaker Model Parallelism..

    • (Facoltativo) Se hai bisogno di pesi preaddestrati da HuggingFace, puoi fornire il token HuggingFace impostando la coppia chiave-valore seguente:

      recipes.model.hf_access_token=<your_hf_token>
    #!/bin/bash #Users should setup their cluster type in /recipes_collection/config.yaml REGION="<region>" IMAGE="658645717510.dkr.ecr.${REGION}.amazonaws.com/smdistributed-modelparallel:2.4.1-gpu-py311-cu121" SAGEMAKER_TRAINING_LAUNCHER_DIR=${SAGEMAKER_TRAINING_LAUNCHER_DIR:-"$(pwd)"} EXP_DIR="<your_exp_dir>" # Location to save experiment info including logging, checkpoints, ect TRAIN_DIR="<your_training_data_dir>" # Location of training dataset VAL_DIR="<your_val_data_dir>" # Location of talidation dataset HYDRA_FULL_ERROR=1 python3 "${SAGEMAKER_TRAINING_LAUNCHER_DIR}/main.py" \ recipes=training/llama/hf_llama3_8b_seq8k_gpu_p5x16_pretrain \ base_results_dir="${SAGEMAKER_TRAINING_LAUNCHER_DIR}/results" \ recipes.run.name="hf-llama3" \ recipes.exp_manager.exp_dir="$EXP_DIR" \ cluster=k8s \ cluster_type=k8s \ container="${IMAGE}" \ recipes.model.data.train_dir=$TRAIN_DIR \ recipes.model.data.val_dir=$VAL_DIR
  • Avvio del job di addestramento

    bash launcher_scripts/llama/run_hf_llama3_8b_seq16k_gpu_p5x16_pretrain.sh

Dopo aver inviato il job di addestramento, puoi utilizzare il comando seguente per verificare se l’invio è riuscito.

kubectl get pods
NAME READY STATUS RESTARTS AGE hf-llama3-<your-alias>-worker-0 0/1 running 0 36s

Se STATUS è PENDING o ContainerCreating, utilizza il comando seguente per ottenere maggiori dettagli.

kubectl describe pod <name-of-pod>

Quando lo STATUS del processo diventa Running, puoi esaminare il log utilizzando il comando seguente.

kubectl logs name_of_pod

STATUS diventa Completed quando esegui kubectl get pods.

Per ulteriori informazioni sulla connessione al cluster k8s, consulta Esecuzione di un job di addestramento su HyperPod k8s.