Tutorial di preaddestramento sul cluster Kubernetes (GPU)
Esistono due modi per avviare un job di addestramento in un cluster GPU Kubernetes:
-
(Consigliato) Lo strumento a riga di comando HyperPod
-
L’utilità di avvio in stile NeMo
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
-
-
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 podname_of_pod
Quando lo STATUS del processo diventa Running, puoi esaminare il log utilizzando il comando seguente.
kubectl logsname_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, aggiornapersistent_volume_claims. Monta la richiesta Amazon FSx nella directory/datadi ogni pod di calcolo.persistent_volume_claims: - claimName: fsx-claim mountPath: data -
In
config.yaml, aggiornarepo_url_or_pathsottogit.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 logsname_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.