Didacticiel de pré-entraînement sur des clusters Kubernetes (GPU)
Il existe deux manières de lancer une tâche d’entraînement dans un cluster Kubernetes de GPU :
-
(Recommandé) Outil de ligne de commande HyperPod
-
Le lanceur de style NeMo
Prérequis
Avant de commencer à configurer votre environnement, assurez-vous d’avoir :
-
Un cluster Kubernetes de GPU HyperPod correctement configuré.
-
Un emplacement de stockage partagé. Il peut s’agir d’un système de fichiers Amazon FSx ou d’un système NFS accessible depuis les nœuds du cluster.
-
Des données dans l’un des formats suivants :
-
JSON
-
JSONGZ (JSON compressé)
-
ARROW
-
-
(Facultatif) Vous devez obtenir un jeton HuggingFace si vous utilisez les poids du modèle de HuggingFace pour le pré-entraînement ou le peaufinage. Pour plus d’informations sur l’obtention du jeton, consultez User access tokens
.
Configuration de l’environnement Kubernetes de GPU
Pour configurer un environnement Kubernetes de GPU, procédez comme suit :
-
Configurez l’environnement virtuel. Assurez-vous d’utiliser Python 3.9 ou version supérieure.
python3 -m venv ${PWD}/venv source venv/bin/activate -
Installez les dépendances en utilisant l’une des méthodes suivantes :
-
(Recommandé) : méthode avec outil de ligne de commande HyperPod
: # install HyperPod command line tools git clone https://github.com/aws/sagemaker-hyperpod-cli cd sagemaker-hyperpod-cli pip3 install . -
Méthode avec formules 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
-
-
Connectez-vous à votre cluster Kubernetes.
aws eks update-kubeconfig --region "CLUSTER_REGION" --name "CLUSTER_NAME" hyperpod connect-cluster --cluster-name "CLUSTER_NAME" [--region "CLUSTER_REGION"] [--namespace <namespace>]
Lancement de la tâche d’entraînement avec la CLI de SageMaker HyperPod
Nous vous recommandons d’utiliser l’outil d’interface de ligne de commande (CLI) de SageMaker HyperPod pour soumettre votre tâche d’entraînement avec vos configurations. L’exemple suivant soumet une tâche d’entraînement pour le modèle hf_llama3_8b_seq16k_gpu_p5x16_pretrain.
-
your_training_container: conteneur Deep Learning. Pour trouver la dernière version du conteneur SMP, consultez Notes de mise à jour de la bibliothèque SageMaker de parallélisme des modèles. -
(Facultatif) Vous pouvez fournir le jeton HuggingFace si vous avez besoin de poids pré-entraînés de HuggingFace en définissant la paire clé-valeur suivante :
"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" }'
Après avoir soumis une tâche d’entraînement, vous pouvez utiliser la commande suivante pour vérifier si vous l’avez soumise avec succès.
kubectl get pods NAME READY STATUS RESTARTS AGE hf-llama3-<your-alias>-worker-0 0/1 running 0 36s
Si STATUS a pour valeur PENDING ou ContainerCreating, exécutez la commande suivante pour obtenir plus de détails.
kubectl describe podname_of_pod
Une fois que l’élément STATUS de la tâche a pris la valeur Running, vous pouvez examiner le journal à l’aide de la commande suivante.
kubectl logsname_of_pod
STATUS prend la valeur Completed lorsque vous exécutez kubectl
get pods.
Lancement de la tâche d’entraînement avec le lanceur de recettes
Vous pouvez également utiliser les formules SageMaker HyperPod pour soumettre votre tâche d’entraînement. L’utilisation des recettes implique la mise à jour de k8s.yaml et de config.yaml, et l’exécution du script de lancement.
-
Dans
k8s.yaml, mettez à jourpersistent_volume_claims. Il monte la demande Amazon FSx dans le répertoire/datade chaque pod informatiquepersistent_volume_claims: - claimName: fsx-claim mountPath: data -
Dans
config.yaml, mettez à jourrepo_url_or_pathsousgit.git: repo_url_or_path:<training_adapter_repo>branch: null commit: null entry_script: null token: null -
Mettre à jour
launcher_scripts/llama/run_hf_llama3_8b_seq16k_gpu_p5x16_pretrain.sh-
your_contrainer: conteneur Deep Learning. Pour trouver la dernière version du conteneur SMP, consultez Notes de mise à jour de la bibliothèque SageMaker de parallélisme des modèles. -
(Facultatif) Vous pouvez fournir le jeton HuggingFace si vous avez besoin de poids pré-entraînés de HuggingFace en définissant la paire clé-valeur suivante :
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 -
-
Lancement de la tâche d’entraînement
bash launcher_scripts/llama/run_hf_llama3_8b_seq16k_gpu_p5x16_pretrain.sh
Une fois que vous avez soumis la tâche d’entraînement, vous pouvez utiliser la commande suivante pour vérifier si vous l’avez soumise avec succès.
kubectl get pods
NAME READY STATUS RESTARTS AGE hf-llama3-<your-alias>-worker-0 0/1 running 0 36s
Si STATUS a pour valeur PENDING ou ContainerCreating, exécutez la commande suivante pour obtenir plus de détails.
kubectl describe pod<name-of-pod>
Une fois que l’élément STATUS de la tâche a pris la valeur Running, vous pouvez examiner le journal à l’aide de la commande suivante.
kubectl logsname_of_pod
STATUS devient Completed lorsque vous exécutez kubectl get pods.
Pour plus d’informations sur la configuration du cluster k8s, consultez Exécution d’une tâche d’entraînement sur HyperPod k8s.