Llama 3 mit PyTorch auf TPU v5e trainieren
In dieser Anleitung wird beschrieben, wie Sie ein Llama-3-8B-Modell mit PyTorch/XLA auf einer TPU v5e mit dem WikiText-Dataset trainieren. Modelldetails finden Sie unter Meta-Llama-3-8B.
Das Llama-3-8B-Modell wird auf der Hugging Face-Plattform gehostet.
Es gibt zwei Versionen von Meta-Llama-3-8B: eine für die Verwendung mit Transformers und eine für die ursprüngliche Llama 3-Codebasis. In dieser Anleitung wird die Transformers-Version verwendet, da sie:
Nahtlose Integration in das Hugging Face-System: So lässt sich das Modell leichter optimieren, vordefinierte Pipelines verwenden und auf eine umfangreiche Sammlung von Datensätzen und Tools zugreifen.
Ermöglicht Flexibilität und Anpassung: Die Transformers-Version bietet erhebliche Flexibilität und Anpassungsoptionen für die Feinabstimmung und Bereitstellung des Modells.
Community-Support: Die Hugging Face-Community bietet umfangreiche Dokumentationen, Anleitungen und Support für die Verwendung von Transformer-Modellen.
Weitere Informationen zu Transformern finden Sie in der Hugging Face Transformers-Dokumentation.
Um auf das Meta-Llama-3-8B-Modell zuzugreifen und es zu verwenden, einschließlich des Herunterladens der Gewichte und des Tokenizers, benötigen Sie ein Hugging Face-Nutzerzugriffstoken. Das Token bietet Folgendes:
Authentifizierung und Autorisierung: Das Zugriffstoken dient als Anmeldedaten und ermöglicht den Hugging Face-Servern, Ihren Zugriff auf die Ressourcen des Modells zu autorisieren. So wird sichergestellt, dass nur autorisierte Nutzer das Modell herunterladen und verwenden können.
Sicherheit: Hugging Face verwendet Zugriffstokens, um seine Modelle zu schützen und unbefugten Zugriff oder Missbrauch zu verhindern.
Informationen zum Erstellen und Verwenden eines Zugriffstokens für diese Anleitung finden Sie unter Modell ausführen. Ausführlichere Informationen zum Erstellen und Verwenden von Zugriffstokens finden Sie in der Hugging Face-Dokumentation zu Nutzerzugriffstokens.
Außerdem benötigen Sie die Berechtigung, auf das Llama 3 8B-Modell auf Hugging Face zuzugreifen. Wenn Sie diese Berechtigung erhalten möchten, rufen Sie das Meta-Llama-3-8B-Modell auf Hugging Face auf und beantragen Sie Zugriff.
TPU v5litepod-16 vorbereiten
Diese Anleitung wurde mit den folgenden Cloud TPU-Umgebungsvariablen getestet. Sie können auch andere Variablen verwenden, um Ihre TPU zu provisionieren, solange der Beschleunigertyp, die Zone und die Laufzeitversion kompatibel sind.
In dieser Anleitung wird beispielsweise durchweg europe-west4-b
als Zone verwendet. Sie können jede andere Zone verwenden, die die von Ihnen verwendete TPU-Version (Beschleunigertyp) unterstützt (v5litepod-16 in dieser Anleitung).
Legen Sie die folgenden Umgebungsvariablen für die TPU-VM fest.
export TPU_NAME=queued-resources-node-id #The TPU name is the queued resource node-id export PROJECT_ID=your-project-id export ACCELERATOR_TYPE=v5litepod-16 export ZONE=europe-west4-b export RUNTIME_VERSION=v2-alpha-tpuv5-lite export QUEUED_RESOURCE_ID=queued-resource-id export VALID_UNTIL_DURATION=1d
Wenn Sie Zugriff auf das Meta-Llama-3-8B-Modell auf Hugging Face haben, bereiten Sie die TPU-Umgebung für die Ausführung der Anleitung vor.
Folgen Sie der Anleitung Cloud TPU-Umgebung einrichten, um sicherzustellen, dass Sie die erforderlichen Zugriffsrechte für die Verwendung von Cloud TPUs haben.
Erstellen Sie eine Dienstidentität für die TPU-VM.
gcloud alpha compute tpus tpu-vm service-identity create --zone=zone
Erstellen Sie ein TPU-Dienstkonto und gewähren Sie Zugriff auf Google Cloud -Dienste.
Dienstkonten ermöglichen dem Google Cloud TPU-Dienst, auf andere Google Cloud Dienste zuzugreifen. Ein nutzerverwaltetes Dienstkonto wird empfohlen. Sie können ein Dienstkonto in der Google Cloud Console oder über den Befehl
gcloud
erstellen.Erstellen Sie ein Dienstkonto mit dem
gcloud
-Befehlszeilentool:gcloud iam service-accounts create your-service-account-name \ --description="your-sa-description" \ --display-name="your-sa-display-name" export SERVICE_ACCOUNT_NAME=your-service-account-name
So erstellen Sie ein Dienstkonto über die Google Cloud Console:
- Rufen Sie in der Google Cloud Console die Seite „Dienstkonten“ auf.
- Klicken Sie auf Dienstkonto erstellen.
- Geben Sie den Namen des Dienstkontos ein.
- Optional: Geben Sie eine Beschreibung für das Dienstkonto ein.
- Klicken Sie auf Erstellen und fahren Sie fort.
- Wählen Sie die Rollen aus, die Sie dem Dienstkonto zuweisen möchten.
- Klicken Sie auf Weiter.
- Optional: Geben Sie Nutzer oder Gruppen an, die das Dienstkonto verwalten können.
- Klicken Sie auf Fertig, um das Erstellen des Dienstkontos abzuschließen.
Nachdem Sie das Dienstkonto erstellt haben, können Sie ihm Rollen gewähren. Gehen Sie dazu so vor:
Folgende Rollen sind erforderlich:
- TPU-Administrator: Erforderlich zum Erstellen einer TPU
- Storage Admin: Erforderlich für den Zugriff auf Cloud Storage
- Log-Autor
- Monitoring-Messwert-Autor: Erforderlich zum Schreiben von Messwerten in Cloud Monitoring
Ihr Administrator muss Ihnen die Rolle
roles/resourcemanager.projectIamAdmin
zuweisen, damit Sie Nutzern IAM-Rollen zuweisen können. Auch ein Nutzer mit der Rolle „Projekt-IAM-Administrator“roles/resourcemanager.projectIamAdmin
kann diese Rolle gewähren.Verwenden Sie die folgenden
gcloud
-Befehle, um Dienstkontorollen hinzuzufügen:gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com \ --role roles/tpu.admin gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com \ --role roles/storage.admin gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com \ --role roles/logging.logWriter gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com \ --role roles/monitoring.metricWriter
Sie können Rollen auch über die Google Cloud Console zuweisen.
Wählen Sie in der Google Cloud Console die folgenden Rollen aus:
- Wählen Sie Ihr Dienstkonto aus und klicken Sie auf Hauptkonto hinzufügen.
- Geben Sie im Feld Neue Hauptkonten die E-Mail-Adresse Ihres Dienstkontos ein.
- Suchen Sie im Drop-down-Menü Rolle auswählen nach einer Rolle (z. B. Storage-Administrator) und wählen Sie sie aus.
- Klicken Sie auf Speichern.
Authentifizieren Sie sich mit Google Cloud und konfigurieren Sie das Standardprojekt und die Standardzone für die Google Cloud CLI.
gcloud auth login gcloud config set project PROJECT_ID gcloud config set compute/zone ZONE
Sichere Kapazität
Wenn Sie TPU-Kapazitäten sichern möchten, lesen Sie den Hilfeartikel Kontingente. Wenn Sie weitere Fragen zur Kapazitätssicherung haben, wenden Sie sich an Ihr Cloud TPU-Vertriebs- oder Account-Team.
Cloud TPU-Umgebung bereitstellen
Sie können TPU-VMs mit GKE, mit GKE und XPK oder als in der Warteschlange befindliche Ressourcen bereitstellen.
Vorbereitung
- Diese Anleitung wurde mit Python 3.10 oder höher getestet.
- Prüfen Sie, ob Ihr Projekt ein ausreichendes
TPUS_PER_TPU_FAMILY
-Kontingent hat. Dieses gibt die maximale Anzahl von Chips an, auf die Sie in IhremGoogle Cloud -Projekt zugreifen können. - Prüfen Sie, ob Ihr Projekt ein ausreichendes TPU-Kontingent für Folgendes hat:
- TPU-VM-Kontingent
- Kontingent für IP-Adressen
- Hyperdisk Balanced-Kontingent
- Nutzerberechtigungen für Projekte
- Wenn Sie GKE mit XPK verwenden, finden Sie unter Cloud Console-Berechtigungen für das Nutzer- oder Dienstkonto Informationen zu den Berechtigungen, die zum Ausführen von XPK erforderlich sind.
TPU v5litepod-16 bereitstellen
So erstellen Sie eine TPU-VM:
gcloud alpha compute tpus queued-resources create ${QUEUED_RESOURCE_ID} \ --node-id=${TPU_NAME} \ --project=${PROJECT_ID} \ --zone=${ZONE} \ --accelerator-type=${ACCELERATOR_TYPE} \ --runtime-version=${RUNTIME_VERSION} \ --service-account=${SERVICE_ACCOUNT_NAME} \ --spot
Prüfen Sie, ob die TPU den Status
ACTIVE
hat:gcloud compute tpus queued-resources describe ${QUEUED_RESOURCE_ID} \ --project=${PROJECT_ID} \ --zone=${ZONE}
Wenn die TPU aktiv ist (ACTIVE
), sehen Sie eine Ausgabe in etwa so:
createTime: '2025-02-28T21:16:08.053492925Z'
name: projects/my-project/locations/zone/queuedResources/tpu-name-zone
spot: {}
state:
state: ACTIVE
tpu:
nodeSpec:
- node:
acceleratorType: v5litepod-16
networkConfig:
enableExternalIps: true
network: default
queuedResource: projects/19672137403/locations/zone/queuedResources/qr-name
runtimeVersion: v2-alpha-tpuv5-lite
schedulingConfig: {}
my-service-account@your-project-id.iam.gserviceaccount.com
email: 19672137854-compute@developer.iam.gserviceaccount.com
shieldedInstanceConfig: {}
nodeId: tpu-name
parent: projects/19672137403/locations/zone
Installation
Installieren Sie den pytorch-tpu/transformers
-Fork von Hugging Face Transformers und die Abhängigkeiten. Diese Anleitung wurde mit den folgenden Abhängigkeitsversionen getestet:
torch
: kompatibel mit 2.6.0torch_xla[tpu]
: kompatibel mit 2.6.0jax
: 0.4.38jaxlib
: 0.4.38
Framework-Software und Abhängigkeiten installieren
gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} --project=${PROJECT_ID} \ --zone=${ZONE} \ --worker=all \ --command='git clone -b flash_attention https://github.com/pytorch-tpu/transformers.git sudo apt install python3.10-venv python -m venv /home/$USER/venv/ source ~/venv/bin/activate cd transformers pip3 install --user -e . pip3 install datasets pip3 install evaluate pip3 install scikit-learn pip3 install accelerate pip install torch~=2.6.0 torch_xla[tpu]~=2.6.0 -f https://storage.googleapis.com/libtpu-releases/index.html -f https://storage.googleapis.com/libtpu-wheels/index.html pip install jax==0.4.38 jaxlib==0.4.38 -f https://storage.googleapis.com/jax-releases/jax_nightly_releases.html -f https://storage.googleapis.com/jax-releases/jaxlib_nightly_releases.html'
Nach Abschluss der Installation wird eine Ausgabe ähnlich der folgenden angezeigt:
Collecting jax==0.4.38
Downloading jax-0.4.38-py3-none-any.whl (2.1 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 18.0 MB/s eta 0:00:00
Collecting jaxlib==0.4.38
Downloading jaxlib-0.4.38-cp310-cp310-manylinux2014_x86_64.whl (85.0 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 85.0/85.0 MB 10.1 MB/s eta 0:00:00
Successfully installed jax-0.4.38 jaxlib-0.4.38 ml-dtypes-0.5.1 opt-einsum-3.4.0
Collecting opt-einsum
Downloading opt_einsum-3.4.0-py3-none-any.whl (71 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 71.9/71.9 KB 186.4 kB/s eta 0:00:00
Requirement already satisfied: numpy>=1.24 in /home/your-username/.local/lib/python3.10/site-packages (from jax==0.4.38) (2.2.3)
Requirement already satisfied: scipy>=1.10 in /home/your-username/.local/lib/python3.10/site-packages (from jax==0.4.38) (1.15.2)
Successfully installed jax-0.4.38 jaxlib-0.4.38 ml-dtypes-0.5.1 opt-einsum-3.4.0
Successfully installed jax-0.4.38 jaxlib-0.4.38 ml-dtypes-0.5.1 opt-einsum-3.4.0
Collecting ml-dtypes>=0.2.0
Downloading ml_dtypes-0.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.7 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.7/4.7 MB 13.8 MB/s eta 0:00:00
Installing collected packages: opt-einsum, ml-dtypes, jaxlib, jax
Successfully installed jax-0.4.38 jaxlib-0.4.38 ml-dtypes-0.5.1 opt-einsum-3.4.0
Modellkonfigurationen einrichten
Der Trainingsbefehl im nächsten Abschnitt, Modell ausführen, verwendet zwei JSON-Konfigurationsdateien, um Modellparameter und die FSDP-Konfiguration (Fully Sharded Data Parallel) zu definieren. Das FSDP-Sharding wird für die Modellgewichte verwendet, damit sie während des Trainings einer größeren Batchgröße entsprechen. Beim Training mit kleineren Modellen reicht es möglicherweise aus, Datenparallelität zu verwenden und die Gewichte auf jedem Gerät zu replizieren. Weitere Informationen zum Sharding von Tensoren auf Geräten in PyTorch/XLA finden Sie im PyTorch/XLA SPMD-Nutzerhandbuch.
Mit diesem Befehl wird die Konfigurationsdatei für die Modellparameter für Llama3-8B erstellt. Für andere Modelle finden Sie die Konfiguration auf Hugging Face. Siehe beispielsweise die Llama2-7B-Konfiguration.
cat > llama-config.json <<EOF { "architectures": [ "LlamaForCausalLM" ], "attention_bias": false, "attention_dropout": 0.0, "bos_token_id": 128000, "eos_token_id": 128001, "hidden_act": "silu", "hidden_size": 4096, "initializer_range": 0.02, "intermediate_size": 14336, "max_position_embeddings": 8192, "model_type": "llama", "num_attention_heads": 32, "num_hidden_layers": 32, "num_key_value_heads": 8, "pretraining_tp": 1, "rms_norm_eps": 1e-05, "rope_scaling": null, "rope_theta": 500000.0, "tie_word_embeddings": false, "torch_dtype": "bfloat16", "transformers_version": "4.40.0.dev0", "use_cache": false, "vocab_size": 128256 } EOF
Erstellen Sie die FSDP-Konfigurationsdatei:
cat > fsdp-config.json <<EOF { "fsdp_transformer_layer_cls_to_wrap": [ "LlamaDecoderLayer" ], "xla": true, "xla_fsdp_v2": true, "xla_fsdp_grad_ckpt": true } EOF
Weitere Informationen zu FSDP finden Sie unter FSDPv2.
Laden Sie die Konfigurationsdateien mit den folgenden Befehlen auf Ihre TPU-VMs hoch:
ssh-add ~/.ssh/google_compute_engine #Setup SSH Key in the SSH agent. gcloud alpha compute tpus tpu-vm scp llama-config.json fsdp-config.json $TPU_NAME:. \ --worker=all \ --project=${PROJECT_ID} \ --zone=${ZONE}
Die Ausgabe dieses Befehls sieht in etwa so aus:
Using scp batch size of 4.Attempting to SCP into 1 nodes with a total of 4 workers. SCP: Attempting to connect to worker 0... SCP: Attempting to connect to worker 1... SCP: Attempting to connect to worker 2... SCP: Attempting to connect to worker 3... llama-config.json 100% 707 4.1KB/s 00:00 llama-config.json 100% 707 4.0KB/s 00:00 llama-config.json 100% 707 4.1KB/s 00:00 llama-config.json 100% 707 4.1KB/s 00:00 fsdp-config.json 100% 156 0.9KB/s 00:00 fsdp-config.json 100% 156 0.9KB/s 00:00 fsdp-config.json 100% 156 0.9KB/s 00:00 fsdp-config.json 100% 156 0.9KB/s 00:00
Modell ausführen
Führen Sie mit den Konfigurationsdateien, die Sie im vorherigen Abschnitt erstellt haben, das run_clm.py
-Script aus, um das Llama 3 8B-Modell mit dem WikiText-Dataset zu trainieren. Die Ausführung des Trainingsscripts auf einer TPU v5litepod-16 dauert etwa 10 Minuten.
Generieren Sie ein neues Hugging Face-Token, falls Sie noch keines haben:
- Klicken Sie auf Profil > Einstellungen > Zugriffstokens.
- Wählen Sie Neues Token aus.
- Geben Sie einen Namen Ihrer Wahl und eine Rolle von mindestens „Lesen“ an.
- Wählen Sie Token generieren aus.
Verwenden Sie Ihr Hugging Face-Token, um sich mit dem folgenden Befehl über Ihre TPU-VM bei Hugging Face anzumelden.
Ersetzen Sie die Tokenvariable
huggingface-cli login
durch diejenige, die im vorherigen Schritt von Hugging Face generiert wurde:gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} --project=${PROJECT_ID} \ --zone=${ZONE} \ --worker=all \ --command=' pip install -U "huggingface_hub[cli]" export PATH="/home/$USER/.local/bin/:$PATH" huggingface-cli login --token hf_abcxyzEFg'
Mit diesem Befehl werden Sie in Hugging Face angemeldet und das aktuell aktive Token wird angezeigt.
Modelltraining ausführen:
gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} --project=${PROJECT_ID} \ --zone=${ZONE} \ --worker=all \ --command=' source ~/venv/bin/activate export PJRT_DEVICE=TPU export XLA_USE_SPMD=1 export ENABLE_PJRT_COMPATIBILITY=true # Optional variables for debugging: export XLA_IR_DEBUG=1 export XLA_HLO_DEBUG=1 export PROFILE_EPOCH=0 export PROFILE_STEP=3 export PROFILE_DURATION_MS=100000 # Set PROFILE_LOGDIR to a local VM path or gs://my-bucket/profile_path export PROFILE_LOGDIR=your-bucket/profile_path python3 transformers/examples/pytorch/language-modeling/run_clm.py \ --dataset_name wikitext \ --dataset_config_name wikitext-2-raw-v1 \ --per_device_train_batch_size 16 \ --do_train \ --output_dir /home/$USER/tmp/test-clm \ --overwrite_output_dir \ --config_name /home/$USER/llama-config.json \ --cache_dir /home/$USER/cache \ --tokenizer_name meta-llama/Meta-Llama-3-8B \ --block_size 8192 \ --optim adafactor \ --save_strategy no \ --logging_strategy no \ --fsdp "full_shard" \ --fsdp_config /home/$USER/fsdp-config.json \ --torch_dtype bfloat16 \ --dataloader_drop_last yes \ --flash_attention \ --max_steps 20'
Der Trainingschritt dauert etwa 10 Minuten. Gegen Ende des Trainings werden Meldungen wie die folgenden angezeigt:
[INFO|trainer.py:2053] 2025-03-18 22:05:02,536 >> ***** Running training *****
[INFO|trainer.py:2054] 2025-03-18 22:05:02,536 >> Num examples = 272
[INFO|trainer.py:2055] 2025-03-18 22:05:02,536 >> Num Epochs = 2
[INFO|trainer.py:2056] 2025-03-18 22:05:02,536 >> Instantaneous batch size per device = 16
[INFO|trainer.py:2059] 2025-03-18 22:05:02,536 >> Total train batch size (w. parallel, distributed & accumulation) = 16
[INFO|trainer.py:2060] 2025-03-18 22:05:02,536 >> Gradient Accumulation steps = 1
[INFO|trainer.py:2061] 2025-03-18 22:05:02,536 >> Total optimization steps = 20
[INFO|trainer.py:2062] 2025-03-18 22:05:02,537 >> Number of trainable parameters = 8,030,261,248
0%| | 0/20 [00:00<?, ?it/s][INFO|trainer.py:2143] 2025-03-18 22:05:02,540 >> Profiling server started: <_XLAC.profiler.ProfilerServer object at 0x7f01bdcb6770>
5%|▌ | 1/20 [00:07<02:29, 7.86s/it]/home/your-username/venv/lib/python3.10/site-packages/torch/nn/modules/module.py:1810: UserWarning: For backward hooks to be called, module output should be a Tensor or a tuple of Tensors but received <class 'transformers.modeling_outputs.CausalLMOutputWithPast'>
5%|▌ | 1/20 [00:07<02:29, 7.89s/it]Compilation at Step 0, time: 213.83555555343628
/home/your-username/venv/lib/python3.10/site-packages/torch/nn/modules/module.py:1810:
10%|█ | 2/20 [03:43<38:57, 129.87s/it]Compilation at Step 0, time: 213.12156581878662
/home/your-username/venv/lib/python3.10/site-packages/torch/nn/modules/module.py:"
10%|█ | 2/20 [03:40<38:29, 128.30s/it]Compilation at Step 1, time: 224.5414960384369
15%|█▌ | 3/20 [07:22<48:31, 171.24s/it]Compilation at Step 1, time: 226.23664164543152
15%|█▌ | 3/20 [07:26<48:56, 172.73s/it]Compilation at Step 1, time: 226.9180543422699
Compilation at Step 1, time: 224.3874273300171
20%|██ | 4/20 [07:23<27:45, 104.10s/it]Starting to trace for 100000 ms. Remaining attempt(s): 2
2025-03-18 22:12:32.104419: W external/tsl/tsl/profiler/lib/profiler_session.cc:109] Profiling is late by 847930 nanoseconds and will start immediately.
Starting to trace for 100000 ms. Remaining attempt(s): 2
2025-03-18 22:12:32.104373: W external/tsl/tsl/profiler/lib/profiler_session.cc:109] Profiling is late by 763960 nanoseconds and will start immediately.
Starting to trace for 100000 ms. Remaining attempt(s): 2
2025-03-18 22:12:32.104538: W external/tsl/tsl/profiler/lib/profiler_session.cc:109] Profiling is late by 854020 nanoseconds and will start immediately.
2025-03-18 22:12:32.104347: W external/tsl/tsl/profiler/lib/profiler_session.cc:109] Profiling is late by 761070 nanoseconds and will start immediately.
Starting to trace for 100000 ms. Remaining attempt(s): 2
85%|████████▌ | 17/20 [07:55<00:06, 2.26s/it]Compilation at Step -1, time: 3.676558494567871
Compilation at Step -1, time: 3.447533130645752
Compilation at Step -1, time: 3.5890843868255615
Compilation at Step -1, time: 3.4956483840942383
100%|██████████| 20/20 [11:39<00:00, 35.14s/it][INFO|trainer.py:2350] 2025-03-18 22:16:42,476 >>
Training completed. Do not forget to share your model on huggingface.co/models =)
100%|██████████| 20/20 [11:47<00:00, 35.23s/it][INFO|trainer.py:2350] 2025-03-18 22:16:43,239 >>
Training completed. Do not forget to share your model on huggingface.co/models =)
Bereinigen
Löschen Sie nach Abschluss des Trainings die TPU-VM und die in der Warteschlange befindliche Ressource. Dadurch wird die Abrechnung für die Nutzung Ihrer TPU-VM beendet.
gcloud compute tpus queued-resources delete ${QUEUED_RESOURCE_ID} \ --project=${PROJECT_ID} \ --zone=${ZONE} \ --force \ --async