跳到正文
Hugging Face Blog·· 4 天前精选AI 评分74

Hugging Face 推出 TorchTPU,为 PyTorch 原生支持 TPU

Hugging Face ❤️ TorchTPU: TPUs, Natively

AI 导读

Hugging Face 推出 TorchTPU,为 PyTorch 增加原生 TPU 后端,Transformers、Diffusers 和 Kernels 可在 TPU 上运行。

推荐理由

TorchTPU 将 TPU 接入原生 PyTorch 工作流,并覆盖 Transformers、Diffusers 与 Kernels;文中还提供测试通过率和性能数据,呈现了支持范围与当前进展。

正文 · AI 翻译

The Hugging Face mascot and a smiling PyTorch logo cheering over a glowing chip, on a manga-style background.

如果你曾尝试在 TPU 上运行 PyTorch,你可能把代码移植到了 torch_xla,或者最后不得不学习 JAX。借助 TorchTPU 这个原生 PyTorch 后端,TPU 现在就像另一种设备。它为 Hugging Face 生态系统带来了原生 TPU 支持。Transformers、Diffusers 和 Kernels 都能在 TPU 上原生运行。从 Hub 中选择一个模型,将它发送到 "tpu",就大功告成了。

等等,TPU 是什么?🤔

TPU 是 张量处理单元(Tensor Processing Unit)的缩写。TPU 是 Google 自研的 AI 加速器,是专为一项工作打造的芯片:神经网络大部分时间都在进行的矩阵运算。Google 已经设计 TPU 约十年,并用它们训练和部署自家的模型,包括 Gemini。

TPU 可通过 Google Cloud 使用,规模从单个芯片到数千个芯片组成的 pod 不等。当你需要大量算力进行训练或大规模部署时,TPU 尤其出色。

一直以来,难点都在软件上。TPU 技术栈围绕 TensorFlow 和 JAX 构建,PyTorch 用户要想使用 TPU,就得多费些功夫。

以往的方式

直到现在,要在 TPU 上运行 PyTorch,就意味着要通过 PyTorch/XLA(torch_xla)。它确实能用,但也有一些自己的问题。张量是惰性求值的(是张量惰性,不是你),所以代码不一定会在你以为的时机运行。微小的改动可能触发计算图重新编译,而且很难理清调试问题。

为了让使用更轻松,我们构建了 Optimum TPU。它为 Hugging Face 模型提供了在 TPU 上进行推理和训练的支持。如今 TorchTPU 带来了原生支持,运行使用 Transformers 和 Diffusers 的 Hugging Face 模型不再需要 Optimum TPU。

TorchTPU 登场 🚀

TorchTPU 为 PyTorch 添加了一个新的 TPU 后端。你只需编写常规 PyTorch 代码。它内置了针对 TPU 调优的 Pallas 内核、分布式训练支持,以及 torch.compile 集成,供你在需要更高速度时使用。在 TPU VM 上安装只需运行一条命令:

pip install torch-tpu --extra-index-url https://download.pytorch.org/whl/cpu

额外的索引源会为你提供 torch 的 CPU 版本。如果不加它,pip 会下载大得多的 CUDA 版本,而你在 TPU 上并不需要这个版本。

你喜爱的库,现在也能在 TPU 上运行

Transformers

Transformers v5 围绕一个理念构建:成为模型定义的唯一真实来源,让模型能够在任何地方运行。“任何地方”现在也包括 TPU。要在 TPU 上加载模型,只需传入 device_map="tpu"。就这么简单。

from transformers import AutoModelForCausalLM, AutoTokenizer

model_id = "Qwen/Qwen3.5-9B"
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    device_map="tpu", # will load model directly on the TPU
)
tokenizer = AutoTokenizer.from_pretrained(model_id)
inputs = tokenizer("The future of AI is", return_tensors="pt").to("tpu")
out = model.generate(**inputs, max_new_tokens=64)
print(tokenizer.decode(out[0], skip_special_tokens=True))

默认情况下,模型以 eager 模式运行。你也可以使用 torch.compile 来提升性能,或者在分布式设置中运行。

图像?视频?Diffusers 在 TPU 上为它们绘制 🎨

TPU 现在是 Diffusers 中的一等设备。对于原型开发或调试,eager 模式只需 pipe.to("tpu")。对于部署,编译模式只需额外调用一次 compile。你的流水线和代码保持不变,也无需维护 TPU 分支。

import torch
from diffusers import StableDiffusion3Pipeline

pipe = StableDiffusion3Pipeline.from_pretrained(
    "stabilityai/stable-diffusion-3.5-medium", dtype=torch.bfloat16
)
pipe.to("tpu")  # eager mode: that's the whole change
# optional: compiled mode
pipe.transformer.compile(backend="tpu", fullgraph=True, dynamic=False)

image = pipe("a corgi astronaut planting a flag on a pizza moon").images[0]

首次调用会进行编译,此后每次使用相同图像尺寸调用,都会复用计算图。

模型太大,单个芯片放不下?将 TensorParallelConfig 传给 from_pretrained,加载时就会把 transformer 分片到多个芯片上,因此完整模型无需全部装进同一个地方。许多热门流水线开箱即支持此功能,而不支持的流水线也只需进行 tp_plan。完整方案请参阅 Diffusers TPU 指南。

以下是在 Cloud TPU v6e-4 上运行的一些示例:

TP=4(每个模型拆分到四个芯片上)· bf16 · batch 1

MiniMax-H3(视频 + 音频) Qwen-Image-2.1
A capybara wearing a wizard hat, reading a book by candlelight, oil painting Neon shop sign reading QWEN IMAGE 2.1
“图中的 Hugging Face 毛绒吉祥物,圆圆的黄色笑脸,带着红润的脸颊和两只张开的小手,站在一艘古希腊三列桨战船的船头 […] 海浪拍击声、木材吱呀声、缆绳间的风声、远处的海鸥声,以及低沉恢弘的管弦乐渐强。” · 1344×768,5.2 s,49 步 · 编译模式 188 s,急切模式 262 s “戴着巫师帽的水豚在烛光下读书,油画” · 1024×1024,40 步 · 编译模式 3.5 s,急切模式 8.0 s “霓虹商店招牌上写着 ‘QWEN IMAGE 2.1’,雨夜,湿漉漉的人行道上倒映着灯光” · 2048×2048,40 步

内核

Kernels Hub 上有可直接使用的 TPU 内核。使用 Kernels 库加载一个内核,为你的模型提速。

TPU 内核使用 Pallas 编写,让你能够对硬件进行底层控制。你还可以引入 Tokamax 库中的内核。下面是一个来自 Tokamax 的 ragged-dot 内核接入混合专家模型的示例:

from kernels import get_kernel
from transformers import AutoModelForCausalLM
from transformers.integrations.moe import ALL_EXPERTS_FUNCTIONS

repo_id = "tengomucho/ragged-dot-tpu"
kernel = get_kernel(repo_id, version=1, trust_remote_code=[repo_id])
ALL_EXPERTS_FUNCTIONS.register("tokamax_ragged_dot", kernel.experts_forward)
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-30B-A3B-Instruct-2507",
    experts_implementation="tokamax_ragged_dot",
)

批次越大,收益越大。批次大小为 64 时,Qwen3-30B-A3B 的解码速度提升 21.5×,Gemma 4 26B-A4B 提升 12.8×。

Decode throughput with the Hub ragged-dot kernel versus the default grouped_mm, for Qwen3-30B-A3B and Gemma 4 26B-A4B 在 TPU v6e-8 上的解码吞吐量:Hub 内核与默认实现对比。

我们来测试,你就不用测了 🧪

我们通过运行库的测试套件,持续改进 transformers 对 TPU 的支持。我们正致力于在 TPU 上添加夜间 CI,并在 (transformers 仪表板)[https://huggingface.co/spaces/transformers-community/transformers-ci-dashboard] 上公布结果。

Transformers CI dashboard with TPU test results next to other accelerators Transformers CI 仪表板,展示 TPU 与其他加速器的测试结果。仍在开发中!

目前测试结果还不是全绿,但我们对此并不介意。在 TPU 上运行的测试中,96.5% 通过。我们发现的每个失败都会变成一个简短的复现脚本,并在 TorchTPU 仓库中提交一个问题。目前我们报告了 34 个问题,其中 19 个已修复。在 TPU 上运行测试还发现了 Transformers 本身的一些 bug,例如 StaticCache 和 Qwen3 张量并行方案中的问题。我们已在上游修复了这些问题。

如果 TPU 上出现问题,我们希望能抢在你之前发现。

开始使用

对于 PyTorch 用户来说,TPU 不再是支线任务。安装 TorchTPU,从 Hub 获取模型,然后将其发送到 "tpu"。

我们迫不及待地想看看你会构建出什么 🤗。如果遇到问题,请提交 issue 告诉我们。

来源:Hugging Face Blog · huggingface.co