tpu-trainer
TPU v7 (Ironwood) 模型训练自动化。当用户说"帮我训练"、"跑一下训练"、"测试训练"等并指定 tpu-recipes 下的模型路径时触发。自动生成脚本、提交训练、收集结果并写文档。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
TPU v7 (Ironwood) 模型训练自动化。当用户说"帮我训练"、"跑一下训练"、"测试训练"等并指定 tpu-recipes 下的模型路径时触发。自动生成脚本、提交训练、收集结果并写文档。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
This skill should be used when users need to install, configure, or troubleshoot DeepEP (DeepSeek Expert Parallelism) on NVIDIA GPU systems. It covers the complete installation workflow including CUDA, DOCA-OFED, NVSHMEM with IBGDA support, and DeepEP itself. The skill is particularly useful for B200/H100/A100 GPUs with RoCE/InfiniBand networking, and includes comprehensive debugging capabilities for common installation failures.
创建和管理 Agent Teams 并行任务团队。当用户说"建个团队"、"拉个队伍"、"并行跑"、"create team"、"spawn agents"、"组队"时触发。
查看 Agent Teams 状态。当用户说"teams"、"团队状态"、"看看团队"、"team status"时触发。
Generate videos using Google Veo 3.1 on Vertex AI. Use when the user says "生成视频", "做个视频", "generate video", "帮我生成一段视频", "create a video", "视频生成", "text to video", "文生视频", or when you need to create video content.
Generate images using Google Imagen 4 on Vertex AI. Use when the user says "生成图片", "画一张", "generate image", "帮我画", "生成一张图", "create an image", "图片生成", or when you need to create visual content to explain concepts.
Deploy a Discord Bot that connects to Claude Code via persistent processes using Unix socketpair + stream-json (same mechanism as VSCode extension). Each user gets their own long-running Claude process with full interactive mode support (auto memory, CLAUDE.md, skills). Includes Whisper voice transcription, user whitelist, session history with dropdown switcher, and slash commands. Use when the user says "帮我建一个 Discord Bot", "setup discord bot", "搭建 Discord 机器人", "discord bot 设置", or "部署 discord bot".
| name | tpu-trainer |
| description | TPU v7 (Ironwood) 模型训练自动化。当用户说"帮我训练"、"跑一下训练"、"测试训练"等并指定 tpu-recipes 下的模型路径时触发。自动生成脚本、提交训练、收集结果并写文档。 |
| license | MIT |
在 TPU v7 (Ironwood) 上自动执行 MaxText 模型训练,包括环境准备、任务提交、结果收集和文档生成。
当用户的请求包含以下模式时触发:
tpu-recipes/training/ironwood/<model>/<config>/xpk 路径隐私信息存储在 ~/.claude/skills/tpu-trainer/config.yaml,包含:
project_id: GCP 项目 IDcluster_name: GKE 集群名称reservations: TPU reservation 列表(按优先级排序)default_zone: 默认 zone(优先 us-central1-ai1a)base_output_dir: GCS 输出路径workload_image: Docker 镜像地址tpu_recipes_path: tpu-recipes 仓库本地路径首先读取配置文件获取这些值,不要硬编码。
从用户指定的路径中解析出:
deepseek3-671b, qwen3-235b-a22b4k-bf16-tpu7x-4x4x8, 4k-fp8-tpu7x-4x8x8tpu7x-4x4x8 (128 chips) 或 tpu7x-4x8x8 (256 chips)路径模式:tpu-recipes/training/ironwood/<model>/<config>/xpk
读取指定路径下的 run_recipe.sh,从中提取:
tpu7x-4x4x8)在指定路径下生成两个脚本:
setup_training_env.sh — 环境设置 + Docker 镜像构建#!/bin/bash
# 从 config.yaml 读取的值填入
set -e
export PROJECT_ID="<from config>"
export CLUSTER_NAME="<from config>"
export ZONE="<from config>"
export WORKLOAD_IMAGE="<from config>"
# 构建 Docker 镜像(如果镜像不存在)
# 使用 maxtext_branch, jax_version, libtpu_version from config
注意:如果 Docker 镜像已存在(docker manifest inspect 能找到),跳过构建步骤。
submit_<model>.sh — 提交训练任务#!/bin/bash
set -e
export PROJECT_ID="<from config>"
export CLUSTER_NAME="<from config>"
export ZONE="<from config>"
export BASE_OUTPUT_DIR="<from config>"
export WORKLOAD_IMAGE="<from config>"
export WORKLOAD_NAME="$(printf \"%.26s\" \"${USER//_/-}-<model-short-name>\")-$(date +%Y%m%d-%H%M)"
# XLA_FLAGS 和 MAXTEXT_ARGS 从 run_recipe.sh 完整复制
# 额外添加 profiler 配置:
# profiler=xplane profiler_steps=3 skip_first_n_steps_for_profiler=5
xpk workload create \
--cluster=$CLUSTER_NAME \
--project=$PROJECT_ID \
--zone=$ZONE \
--priority=very-high \
--max-restarts=0 \
--device-type=<from recipe> \
--num-slices=1 \
--docker-image="${WORKLOAD_IMAGE}" \
--enable-debug-logs \
--workload="${WORKLOAD_NAME}" \
--command="set -e && export ENABLE_PATHWAYS_PERSISTENCE='1' && \
export LIBTPU_INIT_ARGS='${XLA_FLAGS}' && \
export JAX_PLATFORMS='tpu,cpu' && export ENABLE_PJRT_COMPATIBILITY='true' && \
python3 -m MaxText.train MaxText/configs/base.yml ${MAXTEXT_ARGS}"
gcloud container clusters list --filter=name=<cluster>xpk cluster adapt 创建:
gcloud container node-pools create(TPU v7 需要 workload policy,gcloud 只支持 placement policy 会报错 INVALID_ARGUMENT)xpk cluster adapt \
--cluster=<cluster> \
--project=<project_id> \
--zone=<zone> \
--tpu-type=tpu7x-<topology like 4x4x8> \
--num-slices=1 \
--reservation=<reservation_name>
此命令需要几分钟完成,建议在后台运行。
如果 xpk adapt 因 memory_limit bug 失败,可以用 gcloud beta 手动创建:
gcloud beta container node-pools create <np-name> \
--cluster=<cluster> \
--project=<project_id> \
--location=us-central1 \
--node-locations=<zone> \
--machine-type=tpu7x-ultranet-4t \
--num-nodes=<num_hosts> \
--placement-policy=tpu7x-<num_devices>-<topology>-placement-policy \
--reservation-affinity=specific \
--reservation=<reservation_name> \
--enable-gvnic \
--scopes=storage-full,gke-default,"https://www.googleapis.com/auth/cloud-platform" \
--max-pods-per-node=15 \
--node-version=<cluster_node_version>
关键注意事项:
gcloud beta,不是 gcloud--placement-type=COMPACT 和 --tpu-topology(TPU v7 用 workload policy)--placement-policy=tpu7x-<devices>-<topology>-placement-policy(xpk workload 的 pod 用这个 label 做 node selector)--no-enable-autoupgrade(RAPID channel 强制开启)gcloud compute resource-policies describe tpu7x-<devices>-<topology>-placement-policy --region=us-central1如果 xpk adapt 没有正确配置 Kueue(检查方法见下),需要手动配置:
| 拓扑 | Chips | Devices | Hosts/Nodes | GKE Machine Type | Kueue Flavor | Kueue Quota |
|---|---|---|---|---|---|---|
| tpu7x-4x4x8 | 128 | 256 | 32 | tpu7x-ultranet-4t | 1xtpu7x-256 | 128 |
| tpu7x-4x8x8 | 256 | 512 | 64 | tpu7x-ultranet-4t | 1xtpu7x-512 | 256 |
| tpu7x-8x8x8 | 512 | 1024 | 128 | tpu7x-ultranet-4t | 1xtpu7x-1024 | 512 |
| tpu7x-8x8x16 | 1024 | 2048 | 256 | tpu7x-ultranet-4t | 1xtpu7x-2048 | 1024 |
ResourceFlavor:
apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
name: 1xtpu7x-<num_devices>
spec:
nodeLabels:
cloud.google.com/gke-tpu-accelerator: tpu7x
cloud.google.com/gke-tpu-topology: <topology like 4x8x8>
ClusterQueue 需要在 resourceGroups 中添加新的 flavor:
- name: 1xtpu7x-<num_devices>
resources:
- name: google.com/tpu
nominalQuota: <num_chips>
xpk configmap patch:
kubectl patch configmap <cluster>-resources-configmap --type merge \
-p '{"data":{"tpu7x-<num_devices>":"<num_hosts>"}}'
kubectl logs -f <pod-name>)从训练日志中提取每个 step 的指标:
completed step: N, seconds: X, TFLOP/s/device: Y, Tokens/s/device: Z, total_weights: W, loss: L
计算 per-chip 指标:
稳态性能取 Step 2+ 的平均值(排除 Step 0 JIT 编译、Step 1 warmup、profiler 步)。
在模型根目录(如 tpu-recipes/training/ironwood/deepseek3-671b/)创建或更新 README.md。
README 模板:
# <Model Name> 训练测试记录
## 模型概况
| 项目 | 值 |
|------|-----|
| 模型 | <model name> |
| 总参数量 | <params> |
| 硬件 | TPU v7 (Ironwood) |
| 框架 | MaxText (<branch>) |
| JAX | <version> |
| Libtpu | <version> |
| XPK | <version> |
## 测试结果
### 我的测试记录
| 日期 | 配置 | Precision | Step Time (s) | TFLOPs/s/device | TFLOPs/s/chip | Tokens/s/chip | Loss (final) | 备注 |
|------|------|-----------|...
### 详细训练日志 - <topology> (<date>)
| Step | 耗时 (s) | TFLOP/s/device | TFLOP/s/chip | Tokens/s/chip | Loss |
|------|---------|...
- **稳态性能 (Step 2+)**: ~X s/step, ~Y TFLOP/s/chip, ~Z Tokens/s/chip
- **Loss 下降**: from → to (N%)
如果 README 已存在,追加新的测试记录行和详细日志 section,不要覆盖已有数据。
训练完成后,主动删除 node pool 释放预留资源(不需要询问用户确认):
删除 xpk workload:
xpk workload delete --workload <name> \
--cluster=<cluster> --project=<project_id> --zone=<zone>
删除 TPU node pool(释放 reservation 资源):
gcloud container node-pools delete <np-name> \
--cluster=<cluster> \
--region=us-central1 \
--project=<project_id> \
--quiet
注意:使用 --region=us-central1(区域级集群),不要用 --zone。
验证清理完毕:
gcloud container node-pools list --cluster=<cluster> --region=us-central1 --project=<project_id>
应该只剩 default-pool。
--region=us-central1(区域级集群),不要用 --zonegcloud container operations cancel 只能取消 node upgrade,不能取消 CREATE_NODE_POOLmemory_limit bugquantization=fp8_full 和 use_qwix_quantization=Truewi_tile_*, wo_tile_*),必须从 run_recipe.sh 完整复制weight_quantization_calibration_method 和 act_quantization_calibration_method 参数fp8 的 4x8x8 recipe 与 4x4x8 有以下关键差异:
ici_fsdp_transpose_parallelism: 4x4x8 用 1,4x8x8 用 2moe_fsdp_use_two_stage_all_gather: 仅 4x8x8 有此参数(True)use_max_logit_estimate: 4x4x8 用 -1,4x8x8 用 22attn_logits_soft_cap: 仅 4x8x8 有此参数(15)data_parallel_opt、ici_rs_pipelining、impure_use_lmr_on_gxc、dot_dot_fusion、rwb_fusion 等 flagsfsdp × fsdp_transpose 不能超过 512,否则分片无法整除 tensor 维度ici_data_parallelism=2 把多余设备用于数据并行ValueError: global size of its dimension 0 should be divisible by 1024,
but it is equal to 512 (full shape: (512, 3, 128, 256))
看到此类报错时:
fsdp × fsdp_transpose 的乘积ici_data_parallelism=2(牺牲效率换取可运行)提交训练前,按此清单逐项检查可避免大部分调度失败:
gcloud compute resource-policies describe tpu7x-<devices>-<topology>-placement-policy --region=us-central1kubectl get resourceflavor 1xtpu7x-<devices>kubectl get clusterqueue -o yaml | grep 1xtpu7x-<devices>kubectl get configmap <cluster>-resources-configmap -o yaml | grep tpu7x-<devices>gcloud container node-pools list --cluster=<cluster> --region=us-central1chrisya-maxtext-runner 是通用的,支持所有 MaxText 模型和精度(bf16/fp8)用户:"帮我训练 tpu-recipes/training/ironwood/deepseek3-671b/4k-bf16-tpu7x-4x4x8/xpk 这个"
执行:
用户:"帮我跑一下 qwen3-235b-a22b 的 fp8 训练"
执行:
tpu-recipes/training/ironwood/qwen3-235b-a22b/4k-fp8-tpu7x-4x8x8/xpkxpk configmap 缺少对应的 TPU 类型条目。解决:
kubectl patch configmap <cluster>-resources-configmap --type merge \
-p '{"data":{"tpu7x-<devices>":"<hosts>"}}'
缺少 ResourceFlavor 或 ClusterQueue 配置。参考第四步创建。
Reservation 容量不足。查看容量(用 gcloud beta compute reservations describe):
gcloud beta compute reservations describe <reservation_name> \
--zone=<zone> --project=<project_id> \
--format="value(aggregateReservation.hostCount,aggregateReservation.inUseHostCount)"
可用容量 = hostCount - inUseHostCount(单位是 hosts,每 host 4 chips)。
实践中直接尝试创建也可以,容量不足会返回 RESOURCE_EXHAUSTED 或 No available resources。
注意:即使 hostCount - inUseHostCount > 0,如果 reservation 处于 DEGRADED 状态(有维护进行中),也可能无法分配资源。
切换到其他 reservation 重试。
重要:切换 reservation/zone 后,submit 脚本的 ZONE 变量也必须同步更新(xpk workload create 的 --zone 参数需要与 node pool 所在 zone 一致)。
使用 --reservation-affinity=specific --reservation=<name> 时,reservation 必须存在于 --node-locations 指定的 zone 中。如果 reservation 在 us-central1-ai1a 但 --node-locations=us-central1-c,会报错 "Reservation is incorrect for the requested resources"。
查找 reservation 所在 zone:
gcloud beta compute reservations list --project=<project_id> --filter="name~<reservation_name>" --format="table(name,zone,status)"
TPU v7 的 GKE machine type 是 tpu7x-ultranet-4t,不是 ct7x-4x4x8 或类似格式。
查询可用 machine type:
gcloud compute machine-types list --filter="name~tpu7x" --zones=<zone> --project=<project_id>
等待操作完成(可能需要 60+ 分钟),无法取消。gcloud container operations cancel 只能取消 node upgrade,不能取消 CREATE_NODE_POOL。完成后删除重试。
之前创建失败的 node pool 可能残留为 ERROR 状态,导致再次创建时报 409 Already Exists。解决:
gcloud container node-pools delete <np-name> \
--cluster=<cluster> --region=us-central1 --project=<project_id> --quiet
删除后重新创建即可。
Multi-slice(跨多个 TPU slice 的分布式训练)需要集群级网络基础设施支持,这些配置在集群创建后不可更改:
--enable-multi-networking,提供双网卡(eth0 管理 + eth1 高速 DCN)ADVANCED_DATAPATH(Cilium),而非 LEGACY(kube-proxy)tcp_rmem="4096 41943040 314572800"--megascale_grpc_interface_prefixes=eth1,eth2,lo通信机制:Multi-slice DCN 通过 host-mediated gRPC(MegaScale 协议)通信,数据经由 host CPU 而非 chip-to-chip 直连。因此需要高速的 host 间网络(双网卡 + 专用 VPC)。
不支持后期启用:如果集群创建时未配置上述选项,需要重建集群才能支持 multi-slice 训练。
xpk 提交 multi-slice 训练的额外参数:
--num-slices=2(或更多)--device-type=tpu7x-4x8x8(单个 slice 的拓扑)dcn_data_parallelism=2, dcn_pipeline_parallelism=1机器类型说明:
tpu7x-standard-4t:标准机器类型,支持 multi-slicetpu7x-ultranet-4t:带 iRDMA(Intel RDMA + Diorite SmartNIC),可加速 DCN 传输但非必要tpu7x-standard-4t,说明 iRDMA 不是 multi-slice 的必要条件TPU v7 每 chip 有 192GB HBM,但每 chip 有 2 个 TensorCore(device):
OOM 报错中显示的是 per-device 限制(94.75GB),不是 per-chip 的 192GB。如果看到 OOM 且使用量在 95-105GB 范围内,需要减小 per_device_batch_size 或启用更多 offload(如 decoder_layer_input=offload)。
如果集群之前已经用 xpk adapt 配置过相同拓扑(比如 bf16 4x8x8),那么 Kueue、configmap、placement-policy 都已就绪。再次训练相同拓扑(比如 fp8 4x8x8)时: