Tutorial zum Vortraining des Kubernetes-Cluster (GPU) - Amazon SageMaker AI

Tutorial zum Vortraining des Kubernetes-Cluster (GPU)

Es gibt zwei Möglichkeiten, einen Trainingsjob in einem GPU-Kubernetes-Cluster zu starten:

Voraussetzungen

Bevor Sie mit der Einrichtung Ihrer Umgebung beginnen, stellen Sie sicher, dass Sie über Folgendes verfügen:

  • Ein GPU-Kubernetes-Cluster von HyperPod ist ordnungsgemäß eingerichtet.

  • Ein gemeinsam genutzter Speicherort. Es kann sich um ein Amazon-FSx-Dateisystem oder NFS-System handeln, auf das von den Clusterknoten aus zugegriffen werden kann.

  • Daten in einem der folgenden Formate:

    • JSON

    • JSONGZ (komprimiertes JSON)

    • ARROW

  • (Optional) Sie benötigen ein HuggingFace-Token, wenn Sie die Modellgewichte von HuggingFace für das Training oder die Feinabstimmung verwenden. Weitere Informationen zum Abrufen des Tokens finden Sie unter Benutzerzugriffstoken.

Einrichten der GPU-Kubernetes-Umgebung

Gehen Sie zum Einrichten einer GPU-Kubernetes-Umgebung wie folgt vor:

  • Richten Sie die virtuelle Umgebung ein. Vergewissern Sie sich, dass Sie Python 3.9 oder höher verwenden.

    python3 -m venv ${PWD}/venv source venv/bin/activate
  • Installieren Sie Abhängigkeiten mit einer der folgenden Methoden:

    • (Empfohlen) Methode HyperPod-Befehlszeilentool:

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

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

  • Helm installieren

  • Verbinden mit Ihrem Kubernetes-Cluster

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

Starten des Trainingsjobs mit der SageMaker-HyperPod-CLI

Wir empfehlen, das Befehlszeilenschnittstellentool (CLI) von SageMaker HyperPod zu verwenden, um Ihren Trainingsjob mit Ihren Konfigurationen einzureichen. Im folgenden Beispiel wird ein Trainingsjob für das Modell hf_llama3_8b_seq16k_gpu_p5x16_pretrain eingereicht.

  • your_training_container: Ein Deep-Learning-Container. Die aktuelle Version des SMP-Containers finden Sie unter Versionshinweise zur Modell-Parallelitätsbibliothek von SageMaker AI.

  • (Optional) Sie können das HuggingFace-Token bereitstellen, wenn Sie vortrainierte Gewichte von HuggingFace benötigen, indem Sie das folgende Schlüssel-Wert-Paar festlegen:

    "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" }'

Nachdem Sie einen Trainingsjob eingereicht haben, können Sie mit dem folgenden Befehl überprüfen, ob die Übermittlung erfolgreich war.

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

Wenn der STATUS PENDING oder ContainerCreating lautet, führen Sie den folgenden Befehl aus, um weitere Informationen zu erhalten.

kubectl describe pod name_of_pod

Nachdem der Job-STATUS zu Running geändert wurde, können Sie das Protokoll mit dem folgenden Befehl überprüfen.

kubectl logs name_of_pod

Der STATUS wird zu Completed, wenn Sie kubectl get pods ausführen.

Starten des Trainingsjobs mit dem Launcher für Rezepte

Alternativ können Sie die SageMaker-HyperPod-Rezepte verwenden, um Ihren Trainingsjob einzureichen. Die Verwendung der Rezepte beinhaltet die Aktualisierung von k8s.yaml, config.yaml und Ausführung des Startskripts.

  • Aktualisieren Sie in k8s.yaml den Code persistent_volume_claims. Es fügt den Amazon-FSx-Anspruch dem /data-Verzeichnis jedes Computing-Pods hinzu.

    persistent_volume_claims: - claimName: fsx-claim mountPath: data
  • In config.yaml aktualisieren Sie repo_url_or_path unter git.

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

    • your_contrainer: Ein Deep-Learning-Container. Die aktuelle Version des SMP-Containers finden Sie unter Versionshinweise zur Modell-Parallelitätsbibliothek von SageMaker AI.

    • (Optional) Sie können das HuggingFace-Token bereitstellen, wenn Sie vortrainierte Gewichte von HuggingFace benötigen, indem Sie das folgende Schlüssel-Wert-Paar festlegen:

      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
  • Starten eines Trainingsjobs

    bash launcher_scripts/llama/run_hf_llama3_8b_seq16k_gpu_p5x16_pretrain.sh

Nachdem Sie den Trainingsjob eingereicht haben, können Sie mit dem folgenden Befehl überprüfen, ob die Übermittlung erfolgreich war.

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

Wenn der STATUS PENDING oder ContainerCreating lautet, führen Sie den folgenden Befehl aus, um weitere Informationen zu erhalten.

kubectl describe pod <name-of-pod>

Nachdem der Job-STATUS zu Running geändert wurde, können Sie das Protokoll mit dem folgenden Befehl überprüfen.

kubectl logs name_of_pod

Der STATUS wechselt zu Completed, wenn Sie kubectl get pods ausführen.

Weitere Informationen zur Konfiguration des k8s-Clusters finden Sie unter Ausführen eines Trainingsjobs auf HyperPod k8s.