In diesem Leitfaden erfahren Sie, wie Sie das NVIDIA NeMo-Ökosystem in einem Managed Training-Cluster für die End-to-End-Entwicklung generativer KI-Modelle verwenden. Er enthält eine Schritt-für-Schritt-Anleitung für die folgenden unterschiedlichen, aber verwandten Workflows, die jeweils in einem eigenen Abschnitt behandelt werden:
- NVIDIA NeMo: Für die Entwicklung von Foundation Models folgen Sie dieser Anleitung um ein groß angelegtes Vortraining, ein kontinuierliches Vortraining (Continuous Pre-Training, CPT) und eine beaufsichtigte Feinabstimmung (Supervised Fine-Tuning, SFT) durchzuführen.
- NVIDIA NeMo-RL: Für die Modellausrichtung und die Abstimmung von Präferenzen können Sie in diesem Abschnitt erweiterte Techniken wie bestärkendes Lernen (Reinforcement Learning, RL) anwenden, um Ihr Modell an menschliche Anweisungen und Präferenzen anzupassen.
Egal, ob Sie ein Modell von Grund auf neu entwickeln oder ein vorhandenes Modell verfeinern, in diesem Dokument erfahren Sie, wie Sie Ihre Umgebung einrichten, containerisierte Jobs verwalten und Trainingsskripts im Cluster starten.
NVIDIA NeMo
Das NVIDIA NeMo-Framework ist eine End-to-End-Plattform zum Erstellen, Anpassen und Bereitstellen generativer KI-Modelle. Dieser Abschnitt des Leitfadens richtet sich speziell an Entwickler und Forscher, die sich auf die grundlegenden Phasen der Modellentwicklung konzentrieren. Er enthält eine Schritt-für-Schritt-Anleitung zur Verwendung von NeMo für ein groß angelegtes Vortraining, ein kontinuierliches Vortraining (CPT) und eine beaufsichtigte Feinabstimmung (SFT) in einem Managed Training-Cluster.
Dieser Leitfaden zu Trainingsclustern enthält den vollständigen Workflow für die Ausführung eines Trainingsjobs mit dem NeMo-Framework. Der Prozess ist in zwei Hauptteile unterteilt: die einmalige Ersteinrichtung Ihrer Umgebung und die wiederkehrenden Schritte zum Starten eines Jobs.
Umgebung einrichten
Bevor Sie einen Job starten, müssen Sie Ihre Umgebung vorbereiten. Dazu benötigen Sie ein Container-Image und die erforderlichen Trainingsskripts.
NeMo-Run installieren
pip install git+https://github.com/NVIDIA/NeMo-Run.git
Container-Image vorbereiten
Für das Container-Image haben Sie zwei Möglichkeiten: Sie können ein vordefiniertes Image verwenden (empfohlen) oder ein benutzerdefiniertes Image erstellen.
Vordefiniertes Image verwenden (empfohlen)
Vordefinierte Container-Images werden im Format .squashfs bereitgestellt. Kopieren Sie das entsprechende Image für Ihre Region in Ihr Arbeitsverzeichnis.
# Example for the US region
gcloud storage cp gs://vmds-containers-us/vmds_nemo_squashfs/nemo-20250721.sqsh .
Benutzerdefinierten Container erstellen (erweitert)
Führen Sie diese Schritte nur aus, wenn die vordefinierten Container Ihren Anforderungen nicht entsprechen.
In dieser Anleitung wird beschrieben, wie Sie mit enroot ein benutzerdefiniertes Container-Image in das Format .squashfs konvertieren.
Schritt 1: Authentifizieren Sie sich bei Google Cloud.
Verwenden Sie die folgenden Befehle, um sicherzustellen, dass sowohl Ihr Google Cloud Nutzerkonto als auch die Docker-Registry, in der Ihr Image gehostet wird, authentifiziert sind:
gcloud auth login
gcloud auth configure-docker us-docker.pkg.dev
Schritt 2: Konvertierungsskript erstellen.
Erstellen Sie eine Datei mit dem Namen enroot-convert.sh und fügen Sie den folgenden Skriptinhalt hinzu. Bevor Sie dieses Skript ausführen, müssen Sie die Variablen REMOTE_IMG und LOCAL_IMG so aktualisieren, dass sie auf Ihr Container-Image und den von Ihnen ausgewählten Ausgabepfad verweisen.
#!/bin/bash
#SBATCH --gpus-per-node=8
#SBATCH --exclusive
#SBATCH --mem=0
#SBATCH --ntasks-per-node=1
# Run this script on the slurm login node:
# sbatch -N 1 enroot-convert.sh
set -x
set -e
# The remote docker image URI.
REMOTE_IMG="docker://us-docker.pkg.dev/{YOUR_CONTAINER_IMG_URI}:{YOUR_CONTAINER_IMAGE_TAG}"
# The local path to the to be imported enroot squash file.
LOCAL_IMG="${HOME}/my_nemo.sqsh"
# The path to the enroot config file.
TMP_ENROOT_CONFIG_PATH="/tmp/\$(id -u --name)/config/enroot"
# Download the docker image to each node.
srun -l -N "${SLURM_NNODES}" \
bash -c "
mkdir -p ${TMP_ENROOT_CONFIG_PATH};
echo 'machine us-docker.pkg.dev login oauth2accesstoken password $(gcloud auth print-access-token)' > ${TMP_ENROOT_CONFIG_PATH}/.credentials;
rm -f ${LOCAL_IMG};
ENROOT_CONFIG_PATH=${TMP_ENROOT_CONFIG_PATH} ENROOT_MAX_PROCESSORS=$(( $(nproc) / 2 )) enroot import -o ${LOCAL_IMG} ${REMOTE_IMG};
"
Schritt 3: Skript ausführen und Ausgabe überprüfen.
Führen Sie das Skript auf dem Slurm-Anmeldeknoten aus.
sbatch -N 1 enroot-convert.sh
Nach Abschluss des Jobs finden Sie die Konvertierungsprotokolle in einer Datei mit dem Namen
slurm-<JOB_ID>.out und das endgültige Container-Image unter dem Pfad, den Sie angegeben haben
für LOCAL_IMG.
Trainingsrezepte herunterladen
Die Trainingsrezepte werden in einem privaten googlesource.com-Repository gespeichert.
Wenn Sie mit der Git-Befehlszeile darauf zugreifen möchten, müssen Sie zuerst Anmeldedaten generieren.
Anmeldedaten generieren
Rufen Sie die folgende URL auf und folgen Sie der Anleitung auf dem Bildschirm. Dadurch wird Ihre lokale Umgebung für die Authentifizierung beim Repository konfiguriert. https://www.googlesource.com/new-password
Repository klonen
Nachdem die Anmeldedaten authentifiziert wurden, führen Sie den folgenden Befehl aus, um die Rezepte herunterzuladen.
git clone -b release-allowlist-ga https://vertex-model-garden.googlesource.com/vertex-oss-training
Trainingsjob starten
Sobald Ihre Umgebung eingerichtet ist, können Sie einen Trainingsjob starten.
Schritt 1: Umgebungsvariablen festlegen
Für Ihren Job sind möglicherweise die folgenden Umgebungsvariablen erforderlich:
HF_TOKENist erforderlich, um Modelle und Datasets von Hugging Face herunterzuladen.- Der
WANDB_API_KEYist erforderlich, um Weights & Biases für die Testanalyse zu verwenden.
export HF_TOKEN=YOUR_HF_TOKEN
export WANDB_API_KEY=YOUR_WANDB_API_KEY
Schritt 2: Startskript ausführen
Wechseln Sie zu Ihrem Arbeitsverzeichnis und führen Sie das Skript run.py aus, um einen Job zu starten. In diesem Beispiel wird ein Demo-Trainingsjob mit Llama 3.1-2b gestartet.
# Set the working directory
export WORK_DIR=$HOME/vertex-oss-training/nemo
cd $WORK_DIR
gcloud storage cp
gs://vmds-containers-<region>/vmds_nemo_squashfs/nemo-20250721.sqsh nemo-demo.sqsh
# Launch the training job
export NEMORUN_HOME=$WORK_DIR && \
python3 run.py -e slurm --slurm-type hcc-a3m --partition a3m \
-d $WORK_DIR -i $WORK_DIR/nemo-demo.sqsh \
-s pretrain/llama3p1_2b_pt.py -n 2 \
--experiment-name nemo-demo-run
Startparameter
--slurm-typewird basierend auf dem Clustertyp festgelegt (z. B.hcc-a3m,hcc-a3u,hcc-a4).--partitionmuss auf eine verfügbare Partition festgelegt werden. Sie können die Namen der Partitionen mit dem Befehlsinfoprüfen.- Das Skript
run.pystellt automatisch mehrere Verzeichnisse für den Docker-Container bereit, darunter--log-dir,--cache-dirund--data-dir, sofern sie festgelegt sind.
Jobstatus und -logs beobachten
Nachdem Sie den Job gestartet haben, wird ein Statusblock angezeigt:
Experiment Status for nemo-demo-run_1753123402
Task 0: nemo-demo-run
- Status: RUNNING
- Executor: SlurmExecutor on @localhost
- Job id: 75
- Local Directory: $NEMORUN_HOME/experiments/nemo-demo-run/nemo-demo-run_1753123402/nemo-demo-run
Die Ausführungsprotokolle werden in den Pfad geschrieben, der im Feld Local Directory der Statusausgabe angezeigt wird. Die Protokolldateien finden Sie beispielsweise unter einem ähnlichen Pfad:
$NEMORUN_HOME/experiments/nemo-demo-run/nemo-demo-run_1753123402/nemo-demo-run/<JOB_ID>.log
Häufige Fehler und Lösungen
In diesem Abschnitt werden häufige Probleme beschrieben, die bei der Jobausführung auftreten können, und empfohlene Schritte zur Behebung dieser Probleme.
Fehler „Ungültige Partition“
Standardmäßig wird versucht, Jobs in der allgemeinen Partition zu starten. Wenn die allgemeine Partition nicht vorhanden oder nicht verfügbar ist, schlägt der Job mit dem folgenden Fehler fehl:
sbatch: error: invalid partition specified: general
sbatch: error: Batch job submission failed: Invalid partition name specified
Lösung:
Geben Sie im Startbefehl mit dem --partition oder -p Argument eine verfügbare Partition an.
Eine Liste der verfügbaren Partitionen finden Sie, indem Sie den Befehl sinfo auf dem Slurm-Anmeldeknoten ausführen.
sinfo
Die Ausgabe zeigt die Namen der verfügbaren Partitionen, z. B. a3u in diesem Beispiel:
| PARTITION | AVAIL | TIMELIMIT | NODES | STATUS | NODELIST |
|---|---|---|---|---|---|
| a3u* | Nach-oben | unendlich | 2 | inaktiv~ | alice-a3u-[2-3] |
| a3u* | Nach-oben | unendlich | 2 | inaktiv | alice-a3u-[0-1] |
Fehler beim Herunterladen des Tokenizers
Möglicherweise tritt ein OSError im Zusammenhang mit einem geräteübergreifenden Link auf, wenn das Skript versucht, den GPT2-Tokenizer herunterzuladen:
OSError: [Errno 18] Invalid cross-device link: 'gpt2-vocab.json' -> '/root/.cache/torch/megatron/megatron-gpt-345m_vocab'
Lösungen:
Sie haben zwei Möglichkeiten, dieses Problem zu beheben:
- Option 1: Führen Sie den Job noch einmal aus. Dieser Fehler ist oft vorübergehend. Wenn Sie den Job mit demselben
--cache-dirnoch einmal ausführen, kann das Problem möglicherweise behoben werden. - Option 2: Laden Sie die Tokenizer-Dateien manuell herunter. Wenn das erneute Ausführen des Jobs fehlschlägt, führen Sie die folgenden Schritte aus:
- Laden Sie die folgenden beiden Dateien herunter:
gpt2-vocab.jsongpt2-merges.txt
- Verschieben Sie die heruntergeladenen Dateien in das
torch/megatron/Unterverzeichnis in Ihrem Cache-Verzeichnis (z. B.<var>YOUR_CACHE_DIR</var>/torch/megatron/). - Benennen Sie die Dateien folgendermaßen um:
- Benennen Sie
gpt2-vocab.jsoninmegatron-gpt-345m_vocabum. - Benennen Sie
gpt2-merges.txtinmegatron-gpt-345m_mergesum.
- Benennen Sie
- Laden Sie die folgenden beiden Dateien herunter:
NVIDIA NeMo-RL
Das NVIDIA NeMo-RL Framework wurde entwickelt, um große Sprachmodelle an menschliche Präferenzen und Anweisungen anzupassen. In diesem Abschnitt erfahren Sie, wie Sie NeMo-RL in einem Cluster verwenden, um erweiterte Anpassungsaufgaben auszuführen, darunter beaufsichtigte Feinabstimmung (SFT), Abstimmung von Präferenzen (z. B. Direct Preference Optimization, DPO) und bestärkendes Lernen (RL).
In diesem Leitfaden werden zwei Hauptworkflows behandelt: die Ausführung eines Standard-Batch-Trainingsjobs und die Verwendung der interaktiven Entwicklungsumgebung für das Debugging.
Vorbereitung
Bevor Sie beginnen, erstellen Sie einen Cluster. Folgen Sie dazu der Anleitung auf der Seite Cluster erstellen. Alternativ können Sie einen vorhandenen Managed Training-Cluster verwenden.
Verbindung zum Anmeldeknoten des Clusters herstellen
Um eine Verbindung zum Anmeldeknoten des Clusters herzustellen, rufen Sie in der Google Cloud Console die Seite „Google Compute Engine-VM“ auf und klicken Sie auf „SSH“ > „Google Cloud CLI-Befehl ansehen“. Dort finden Sie den richtigen Google Cloud CLI Befehl. Google Cloud Die Ausgabe sieht etwa so aus:
ssh $USER_NAME@machine-addr
Beispiel:
ssh $USER_NAME@nic0.sliua3m1-login-001.europe-north1-c.c.infinipod-shared-dev.internal.gcpnode.com
Vordefiniertes Docker-Image verwenden
Für vordefinierte Container-Images werden konvertierte .sqsh-Dateien bereitgestellt. Sie können einen Container für Ihre Region auswählen und ihn entweder direkt als Parameter für das Container-Image festlegen oder in das Dateisystem des Clusters herunterladen.
Verwenden Sie einen der folgenden Pfade, um ihn direkt als Parameter für das Container-Image festzulegen.
Beachten Sie, dass Sie <region> durch Ihre spezifische Region ersetzen sollten
(z. B. europe, asia, us):
/gcs/vmds-containers-<region>/vmds_nemo_rl_squashfs/nemo_rl-h20260302.sqsh
Verwenden Sie den folgenden Befehl, um das Image in den Lustre-Speicher des Clusters herunterzuladen:
gs://vmds-containers-<region>/vmds_nemo_rl_squashfs/nemo_rl-h20260302.sqsh DESTINATION
Code herunterladen
Um mit der Git-Befehlszeile auf das Trainingsrezept zuzugreifen, rufen Sie https://www.googlesource.com/new-password auf. Das Rezept kann mit dem folgenden Befehl heruntergeladen werden:
cd $HOME
git clone -b release-allowlist-ga https://vertex-model-garden.googlesource.com/vertex-oss-training
Jobs starten
Schritt 1: Umgebungsvariablen festlegen.
Um Modelle und Daten von Hugging Face abzurufen, muss möglicherweise HF_TOKEN festgelegt werden.
Um Weights &Biases für die Testanalyse zu verwenden, muss WANDB_API_KEY festgelegt werden. Aktualisieren Sie diese Variablen in der folgenden Datei:
Zu aktualisierende Datei: $HOME/vertex-oss-training/nemo_rl/configs/auth.sh
Wenn Sie Weights & Biases nicht verwenden möchten, legen Sie logger.wandb_enabled in Ihrem Startskript auf False fest.
Schritt 2: Containerdatei in Ihren Startordner herunterladen oder kopieren.
Hier einige Beispiele:
gcloud storage cp \
gs://vmds-containers-<region>/vmds_nemo_rl_squashfs/nemo_rl-h20260302.sqsh \
$HOME/vertex-oss-training/nemo_rl/nemo_rl-h20260302.sqsh
# OR
/gcs/vmds-containers-<region>/vmds_nemo_rl_squashfs/nemo_rl-h20260302.sqsh \
$HOME/vertex-oss-training/nemo_rl/nemo_rl-h20260302.sqsh
cd $HOME/vertex-oss-training/nemo_rl/
# Where region is either `us`, `asia`, or `europe`
Schritt 3: NeMo-RL-Repository vorbereiten oder klonen.
Erstellen Sie einen Klon des NeMo-RL-Codes, falls er noch nicht vorhanden ist. Möglicherweise müssen Sie
verwenden, wenn Sie das Repository bereits ohne das --recursive Flag geklont haben.git submodule update --init --recursive
git clone https://github.com/NVIDIA-NeMo/RL --recursive
Schritt 4: Trainingsjob starten.
sbatch -N <num_nodes> launch.sh --cluster_type hcc-a3m --job_script algorithms/dpo.sh
Wobei:
--cluster-typewird basierend auf dem Clustertyp festgelegt:- A3-Mega:
hcc-a3m - A3-Ultra:
hcc-a3u - A4:
hcc-a4 - A3H:
hcc-a3h
- A3-Mega:
--partitionsollte entsprechend festgelegt werden. Mitsinfokönnen Sie die Slurm-Partitionen prüfen.
Nachdem Ihr Job gestartet wurde, wird am aktuellen Speicherort ein neues Verzeichnis mit dem Namen der SLURM-Job-ID erstellt. Darin finden Sie alle Protokolle und Checkpoints, die zu diesem Job gehören. Genauer gesagt finden Sie darin die folgenden Verzeichnisse und Dateien:
checkpoints/→ Dieses Verzeichnis wird im NeMo-RL-Container bereitgestellt und enthält alle Checkpoints aus dem Training.ray-logs/→ Dieses Verzeichnis enthält die Protokolle von Ray-Head und Ray-Workern.nemo_rl_output.log→ Diese Datei enthält die Slurm-Protokolle aus Ihrem gesendeten Job.attach.sh(nur interaktive Jobs) → Dies ist ein Bash-Skript, mit dem Sie eine Verbindung zu einem interaktiven Job herstellen können. Wenn Ihr Job erfolgreich gestartet wurde, kann es einige Minuten dauern, bis diese Datei erstellt wird.
Entwicklung mit NeMo-RL
Interaktive Einrichtung
Für die schnelle interaktive Entwicklung mit NeMo-RL stehen zwei Optionen zur Verfügung.
nemorlinteractive
Dies ist ein einfacher Hilfsbefehl, mit dem Sie einen GPU-Knoten aus dem Cluster auswählen können (z. B. Knoten Nummer 5). Anschließend werden Sie zu einem laufenden Container für NeMo-RL in Ihrem ausgewählten Knoten weitergeleitet. Dieser Befehl ist hilfreich für Workflows mit einem einzelnen Knoten.
Um nemorlinteractive zu verwenden, müssen Sie die folgenden Schritte ausführen:
- Geben Sie alle gewünschten Authentifizierungstokens (z. B. HF und WandB) an, die in der Datei
configs/auth.shin den Job geladen werden sollen. Legen Sie die Umgebungsvariable
CLUSTER_TYPEgemäß der folgenden Richtlinie fest:export CLUSTER_TYPE="hcc-a3m" # --> if you have A3-Mega cluster export CLUSTER_TYPE="hcc-a3u" # --> if you have A3-Ultra cluster export CLUSTER_TYPE="hcc-a4" # --> If you have A4 cluster export CLUSTER_TYPE="hcc-a3h" # --> If you have A3H clusterImportieren Sie
nemorlinteractivein Ihrem Bash-Terminal, indem Siebash_utils.shausführen:source bash_utils.shFühren Sie den Befehl
nemorlinteractiveaus. Beispiel:# Assuming you want to take the compute node number 5. nemorlinteractive 5
Interaktiver Start
Mit dieser Option können Sie Arbeitslasten interaktiv auf mehreren Rechenknoten ausführen. Interaktive Jobs eignen sich am besten für Debugging- und Überprüfungsanwendungsfälle. Bei diesen Arbeitslasten wird der Knoten unbegrenzt reserviert, bis der Entwickler entscheidet, dass das Debugging abgeschlossen ist und die Ressourcen freigegeben werden sollen.
Für diese Option müssen die folgenden Schritte ausgeführt werden:
Geben Sie alle gewünschten Authentifizierungstokens (z. B. HF und WandB) an, die in der Datei configs/auth.sh in den Job geladen werden sollen.
sbatch -N <num_nodes> launch.sh --cluster_type hcc-a3m --interactive
Warten Sie 2 bis 5 Minuten. Dann sollte
<job_id>/attach.sherstellt worden sein.Um den Fortschritt des Starts zu beobachten, prüfen Sie
<job_id>/nemo_rl_output.log. Dort sehen Sie den Fortschritt des Startskripts. Unter<job_id>/ray_logs/können Sie den Fortschritt des Starts von Ray-Head und Ray-Workern beobachten.Stellen Sie eine Verbindung zum interaktiven Job her. Mit diesem Skript können Sie die Verbindung auch dann wiederherstellen, wenn sie unterbrochen wurde:
bash <job_id>/attach.sh
Nächste Schritte
Durch Ausführen einer vordefinierten Arbeitslast wird der Betriebsstatus des Clusters überprüft. Im nächsten Schritt führen Sie Ihre eigene benutzerdefinierte Trainingsanwendung aus.
- Eigene benutzerdefinierte Arbeitslast ausführen: Packen Sie Ihren Trainingscode in einen Container und senden Sie den Container als
CustomJoban Ihren Trainingscluster. Dieser Prozess umfasst die Konfiguration des Jobs für eine verteilte Umgebung. - Trainingsjobs beobachten: Mit der Console oder Cloud Logging können Sie den Fortschritt, die Ressourcennutzung und die Protokolle für die Jobs, die in Ihrem Cluster ausgeführt werden, effektiv verfolgen. Google Cloud
- Cluster verwalten: Nachdem Sie Ihre Tests ausgeführt haben, prüfen Sie den Status Ihres Clusters oder löschen Sie ihn, um Kosten zu verwalten.
- Jobs mit Gemini Enterprise Agent Platform-Pipelines orchestrieren: Nachdem Sie Jobs manuell ausgeführt haben, automatisieren Sie den Prozess, indem Sie eine Pipeline erstellen, um Ihre Trainingsworkflows zu orchestrieren.