本指南使用一个 JAX 训练工作负载,该工作负载在与 Pathways 控制器组件相同的集群中运行至完成,以演示如何运行批处理工作负载。
您可以在 Google Kubernetes Engine (GKE) 集群或具有 Slurm 的 Cluster Director 集群上运行批处理工作负载:
- 在 GKE 上,JAX 工作负载完成后,Pathways 集群组件会终止。
- 在 Cluster Director 上,Pathways 控制器组件作为单独的 Slurm 作业运行,因此它们会在 JAX 工作负载完成后继续运行,直到您将其停止。
本页面提供了适用于这两个平台的说明。在每个部分中,选择 GKE 或 Cluster Director 标签页。
准备工作
-
选择标签页以了解您打算如何使用本页面上的示例:
gcloud
安装 Google Cloud CLI,然后 使用联合身份登录 gcloud CLI。 登录后,运行以下命令来初始化 Google Cloud CLI:
gcloud initREST
如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭证。
安装 Google Cloud CLI,然后 使用联合身份登录 gcloud CLI。
如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证。
准备工作
GKE
满足以下前提条件:
- 创建 GKE 集群。
- 设置 Cluster Toolkit。
- 安装 Kubernetes 工具。
- 启用 Kubernetes Engine API。
- 为 Pathways 工件和输出创建 Cloud Storage 存储桶。
Cluster Director
满足以下前提条件:
- 创建 Cluster Director 集群并设置 Pathways 环境。
- 创建一个 Cloud Storage 存储桶,以便写入 Pathways 暂存数据和检查点。
使用 MaxText 构建训练映像
MaxText 是由 Google 开发的开源大语言模型 (LLM) 项目。它采用 JAX 编写,旨在 Google Cloud TPU 和 GPU 上高效运行。
GKE
如需使用开源 GitHub 代码库中的最新稳定版 JAX 构建 MaxText Docker 映像,请运行以下命令:
git clone https://github.com/AI-Hypercomputer/maxtext cd maxtext gcloud config set project PROJECT_ID bash src/dependencies/scripts/docker_build_dependency_image.sh MODE=stable gcloud auth configure-docker # This script needs bash version >= 4.2 to execute. bash src/dependencies/scripts/docker_upload_runner.sh \ CLOUD_IMAGE_NAME=USER_runner
替换以下内容:
PROJECT_ID:您的Google Cloud 项目 ID。USER:您的Google Cloud 用户 ID。
此命令会将 MaxText Kubernetes 映像推送到 gcr.io/PROJECT_ID/USER_runner。
您可以使用此 Docker 映像通过 Pathways 后端在 TPU 上运行训练。
Cluster Director
您无需构建训练映像:setup_env.sh 已在 /home/pathways 的 Pathways 环境中安装 MaxText,run_maxtext.sh 会运行它。
运行批量工作负载
GKE
如果
gcluster二进制文件不在PATH环境变量中,请将包含gcluster的目录添加到PATH:export PATH="$PATH:CLUSTER_TOOLKIT_PATH"
将
CLUSTER_TOOLKIT_PATH替换为包含gcluster二进制文件的目录的绝对路径,例如$HOME/cluster-toolkit。使用
gcluster job submit命令提交预构建的 MaxText Docker 映像:gcluster job submit \ --pathways \ --pathways-gcs-location="gs://BUCKET_NAME/pathways-artifacts" \ --name=WORKLOAD \ --cluster=CLUSTER \ --project=PROJECT_ID \ --location=LOCATION \ --num-slices=WORKLOAD_NODEPOOL_COUNT \ --compute-type=COMPUTE_TYPE \ --topology=TOPOLOGY \ --image="gcr.io/PROJECT_ID/USER_runner" \ --command="python3 -m maxtext.trainers.pre_train.train /deps/src/maxtext/configs/base.yml base_output_directory=gs://BUCKET_NAME per_device_batch_size=1 enable_checkpointing=false remat_policy=full global_parameter_scale=1 steps=20 max_target_length=2048 use_iota_embed=true reuse_example_batch=1 dataset_type=synthetic attention=flash gcs_metrics=True enable_single_controller=True run_name=RUN_NAME-pathways-job"
替换以下内容:
BUCKET_NAME:用于输出的 Cloud Storage 存储桶。WORKLOAD:用于标识工作负载的唯一名称(由于 DNS 标签限制,长度不超过 22 个字符)。CLUSTER:GKE 集群的名称PROJECT_ID:您的Google Cloud 项目 ID。LOCATION:GKE 集群所在的区域或可用区。WORKLOAD_NODEPOOL_COUNT:TPU 切片节点池的数量。COMPUTE_TYPE:TPU 机器类型,例如ct6e-standard-4t。如需详细了解每个 TPU 版本支持的 TPU 类型,请参阅 TPU 版本。TOPOLOGY:TPU 放置拓扑,例如2x4。USER:您的Google Cloud 用户 ID。RUN_NAME:用户分配的用于标识工作流运行的名称。
如需详细了解作业提交选项,请参阅 Cluster Toolkit 作业提交指南。
使用
gcluster job logs命令跟踪工作负载的进度:gcluster job logs WORKLOAD \ --cluster=CLUSTER \ --project=PROJECT_ID \ --location=LOCATION \ --main-only \ --follow
输出类似于以下内容:
completed step: 0, seconds: 1.259, TFLOP/s/device: 10.792, Tokens/s/device: 1626.636, total_weights: 65536, loss: 10.876, lm_loss: 10.876, perplexity: 52906.090 completed step: 1, seconds: 3.366, TFLOP/s/device: 4.036, Tokens/s/device: 608.366, total_weights: 65536, loss: 10.876, lm_loss: 10.876, perplexity: 52906.090 completed step: 2, seconds: 0.264, TFLOP/s/device: 51.415, Tokens/s/device: 7749.885, total_weights: 65536, loss: 10.563, lm_loss: 10.563, perplexity: 38665.316 completed step: 3, seconds: 1.025, TFLOP/s/device: 13.257, Tokens/s/device: 1998.187, total_weights: 65536, loss: 9.983, lm_loss: 9.983, perplexity: 21646.125 completed step: 4, seconds: 1.194, TFLOP/s/device: 11.376, Tokens/s/device: 1714.750, total_weights: 65536, loss: 9.462, lm_loss: 9.462, perplexity: 12864.218 completed step: 5, seconds: 1.185, TFLOP/s/device: 11.465, Tokens/s/device: 1728.203, total_weights: 65536, loss: 8.961, lm_loss: 8.961, perplexity: 7791.373可选:如需在工作负载完成之前将其取消,请使用
gcluster job cancel命令:gcluster job cancel WORKLOAD \ --cluster=CLUSTER \ --project=PROJECT_ID \ --location=LOCATION
Cluster Director
在集群的登录节点上,从 ~/pathways 运行以下命令。
这些脚本会相互查找,并将其日志写入该目录。
启动 Pathways 服务:
cd ~/pathways SLICE_SHAPE=TOPOLOGY \ MIN_SLICES=MIN_SLICES \ MAX_SLICES=MAX_SLICES \ GCS_BUCKET=gs://BUCKET_NAME \ sbatch start_pathways.sh
替换以下内容:
TOPOLOGY:每个切片的 TPU 拓扑。它必须与 TPU 节点集的acceleratorTopology匹配,例如2x4。MIN_SLICES:启动和继续训练所需的运行切片数下限。MAX_SLICES:要使用的切片数量上限,通常是节点集中的切片数量。BUCKET_NAME:用于存储 Pathways 暂存数据和检查点的 Cloud Storage 存储桶。
如果您的 TPU 分区不是集群的默认分区,请将
PARTITION设置为其名称。当服务的日志
pathways-service-JOB_ID.out(其中JOB_ID是 Slurm 任务 ID)显示类似于以下内容的输出时,服务即已准备就绪:Pathways Runtime Service is READY! Discovery file : /home/USER/pathways/cluster.env IFRT Proxy Target : grpc://RM_IP:29000 Running TPU Slices : 2 / 2 (min=2)提交 MaxText 训练工作负载。您可以在服务作业之后立即提交该作业:它最多会等待一小时,直到服务准备就绪。
sbatch run_maxtext.shMaxText 作业会等到 Pathways 服务至少有
MIN_SLICES个正在运行的切片后,才开始训练。该工作负载使用合成数据训练 Llama 3.1 8B。切片设置和存储桶来自服务,因此请勿在此作业中设置它们。您可以设置以下可选变量:STEPS:训练步数。默认值为30。CHECKPOINT_PERIOD:检查点之间的步数。默认值为5。BASE_OUTPUT_DIR:MaxText 写入检查点的 Cloud Storage 路径。默认值为gs://BUCKET_NAME/maxtext-runs。REDUCED_LAYERS=1:针对2x2切片训练 8 层变体,而不是完整的 32 层。
跟踪工作负载的进度(将
JOB_ID替换为 MaxText 作业的 Slurm 任务 ID)。MaxText 会将其日志写入标准错误:tail -f maxtext-llama31-JOB_ID.err
每个训练步骤都会输出类似以下内容的一行:
completed step: 24, seconds: 0.326, live slice count: 2, TFLOP/s/device: 88.199, Tokens/s/device: 6289.27, total_weights: 32768, loss: 6.238您可以稍后再次提交
run_maxtext.sh,而无需重启服务。完成后,停止工作负载,然后停止 Pathways 服务:
scancel -u ${USER} -n maxtext-llama31 scancel -u ${USER} -n pathways-service取消服务也会取消 Pathways 工作器作业。TPU 虚拟机是静态节点,因此它们会继续运行,并可供其他 Slurm 作业使用。
如果您遇到问题,请参阅排查 Pathways on Cloud 问题。