Tutorial de entrenamiento previo con clústeres de Kubernetes (GPU)
Hay dos formas de iniciar un trabajo de entrenamiento de GPU en un clúster de Kubernetes:
-
(Recomendado) Herramienta de línea de comandos de HyperPod
-
Lanzador de estilo NeMo
Requisitos previos
Antes de configurar el entorno, asegúrese de disponer de:
-
Un clúster de HyperPod GPU Kubernetes configurado correctamente.
-
Una ubicación de almacenamiento compartida. Puede ser un sistema de archivos de Amazon FSx o un sistema NFS al que se pueda acceder desde los nodos del clúster.
-
Datos en uno de los siguientes formatos:
-
JSON
-
JSONGZ (JSON comprimido)
-
ARROW
-
-
(Opcional) Debe obtener un token de HuggingFace si utiliza las ponderaciones de modelos de HuggingFace para el entrenamiento previo o el refinamiento. Para obtener más información sobre cómo obtener el token, consulte User access tokens
.
Configuración del entorno de GPU Kubernetes
Para configurar un entorno de GPU Kubernetes, haga lo siguiente:
-
Configure el entorno virtual. Asegúrese de utilizar Python 3.9 o posterior.
python3 -m venv ${PWD}/venv source venv/bin/activate -
Instale las dependencias siguiendo uno de estos métodos:
-
(Recomendado) Método con la Herramienta de línea de comandos de HyperPod
: # install HyperPod command line tools git clone https://github.com/aws/sagemaker-hyperpod-cli cd sagemaker-hyperpod-cli pip3 install . -
Método con fórmulas de 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
-
-
Conéctese con su clúster de Kubernetes.
aws eks update-kubeconfig --region "CLUSTER_REGION" --name "CLUSTER_NAME" hyperpod connect-cluster --cluster-name "CLUSTER_NAME" [--region "CLUSTER_REGION"] [--namespace <namespace>]
Inicie el trabajo de entrenamiento con la CLI de SageMaker HyperPod
Recomendamos utilizar la herramienta de interfaz de la línea de comandos (CLI) de SageMaker HyperPod para enviar el trabajo de entrenamiento con sus configuraciones. En el siguiente ejemplo, se envía un trabajo de entrenamiento para el modelo hf_llama3_8b_seq16k_gpu_p5x16_pretrain.
-
your_training_container: es un contenedor de aprendizaje profundo. Para buscar la versión más reciente del contenedor de SMP, consulte Notas de la versión de la biblioteca de paralelismo de modelos de SageMaker. -
(Opcional) Puede proporcionar el token de HuggingFace si necesita ponderaciones entrenadas previamente de HuggingFace al configurar el siguiente par clave-valor:
"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" }'
Después de enviar un trabajo de entrenamiento, puede usar el siguiente comando para comprobar si lo ha enviado correctamente.
kubectl get pods NAME READY STATUS RESTARTS AGE hf-llama3-<your-alias>-worker-0 0/1 running 0 36s
Si el STATUS es PENDING o ContainerCreating, ejecute el siguiente comando para obtener más información.
kubectl describe podname_of_pod
Cuando el STATUS del trabajo cambie a Running, podrá examinar el registro con el siguiente comando.
kubectl logsname_of_pod
El STATUS cambia a Completed si ejecuta kubectl
get pods.
Lanzamiento del trabajo de entrenamiento con el lanzador de fórmulas
Como alternativa, puede utilizar las fórmulas de SageMaker HyperPod para enviar su trabajo de entrenamiento. Usar fórmulas implica actualizar k8s.yaml, config.yaml y ejecutar el script de lanzamiento.
-
En
k8s.yaml, actualicepersistent_volume_claims. Monta la reclamación de Amazon FSx en el directorio/datade cada pod de computación.persistent_volume_claims: - claimName: fsx-claim mountPath: data -
En
config.yaml, actualicerepo_url_or_pathengit.git: repo_url_or_path:<training_adapter_repo>branch: null commit: null entry_script: null token: null -
Actualice
launcher_scripts/llama/run_hf_llama3_8b_seq16k_gpu_p5x16_pretrain.sh.-
your_contrainer: es un contenedor de aprendizaje profundo. Para buscar la versión más reciente del contenedor de SMP, consulte Notas de la versión de la biblioteca de paralelismo de modelos de SageMaker. -
(Opcional) Puede proporcionar el token de HuggingFace si necesita ponderaciones entrenadas previamente de HuggingFace al configurar el siguiente par clave-valor:
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 -
-
Lanzamiento del trabajo de entrenamiento
bash launcher_scripts/llama/run_hf_llama3_8b_seq16k_gpu_p5x16_pretrain.sh
Después de enviar el trabajo de entrenamiento, puede usar el siguiente comando para comprobar si lo ha enviado correctamente.
kubectl get pods
NAME READY STATUS RESTARTS AGE hf-llama3-<your-alias>-worker-0 0/1 running 0 36s
Si el STATUS es PENDING o ContainerCreating, ejecute el siguiente comando para obtener más información.
kubectl describe pod<name-of-pod>
Cuando el STATUS del trabajo cambie a Running, podrá examinar el registro con el siguiente comando.
kubectl logsname_of_pod
El STATUS pasará a Completed cuando ejecute kubectl get pods.
Para obtener más información acerca de la configuración del clúster k8s, consulte Ejecución de un trabajo de entrenamiento en HyperPod k8s.