← 文章 / AI技术
HuggingFace博客 9天前 · 2026-10-21 01:55:02 · 6 阅读

Hugging Face 携手 TorchTPU:让 TPU 成为 PyTorch 原生设备

如果你曾尝试在 TPU 上运行 PyTorch,多半是把代码移植到了 torch_xla,或者不得不转头去学 JAX。有了 TorchTPU 这个原生 PyTorch 后端,TPU 现在成了又一个普通设备。它让 Hugging Face 生态实现了对 TPU 的原生支持。Transformers、Diffusers 和 Kernels 都能直接在 TPU 上运行。从 Hub 挑个模型,把它放到 "tpu" 上,完事。

等等,TPU 是什么?🤔

TPU 即 张量处理单元。TPU 是 Google 自研的 AI 加速器。这些芯片只干一件事:矩阵运算,这正是神经网络大部分时间花在上面的活。Google 设计 TPU 已约十年,并用它们训练和部署自家模型,包括 Gemini。

TPU 可在 Google Cloud 上获取,从单芯片到由数千芯片组成的 Pod 集群均有。当需要海量算力来做训练或大规模推理时,TPU 最能发挥优势。

但麻烦一直出在软件上。TPU 的软件栈围绕 TensorFlow 和 JAX 构建,PyTorch 用户想上手得费点劲。

以前的路子

在此之前,在 TPU 上跑 PyTorch 得走 PyTorch/XLA (torch_xla)。虽然能用,但怪癖不少。张量是惰性的(张量惰,人别惰),所以代码并不总按你想象的时机运行。一点小改动就可能触发图重编译,调试起来很难理清因果。

为了让事情简单点,我们做了 Optimum TPU,为 Hugging Face 模型在 TPU 上提供推理和训练支持。现在 TorchTPU 带来了原生支持,用 Transformers 和 Diffusers 跑 Hugging Face 模型时,Optimum TPU 已不再必需。

TorchTPU 登场 🚀

TorchTPU 把 TPU 作为新后端加入 PyTorch。你照常用 PyTorch 写代码即可。它自带为 TPU 调优的 Pallas 内核,支持分布式训练,还有 torch.compile 集成供你追求更高速度时使用。在 TPU VM 上安装只需一条命令:

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

额外指定 index 是为了拿 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 调用。你的 pipeline 和代码保持不变,也不用维护单独的 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]

第一次调用会触发编译,之后相同尺寸的图片会直接复用已编译的计算图。

模型大到单芯片装不下?给 from_pretrained 传入一个 TensorParallelConfig,transformer 就会在加载时切分到多块芯片上,无需整个模型挤在一个设备里。许多常用 pipeline 开箱即用,不支持的也只需加上一个 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 秒,49 步 · 编译后耗时 188 秒,纯 eager 模式耗时 262 秒 “戴巫师帽的水豚,在烛光下读书,油画风格” · 1024×1024,40 步 · 编译后耗时 3.5 秒,纯 eager 模式耗时 8.0 秒 “霓虹招牌上写着 'QWEN IMAGE 2.1',雨夜,湿漉漉的路面映出倒影” · 2048×2048,40 步

Kernels

Kernels Hub 提供了现成的 TPU kernel。通过 Kernels 库加载其中一个,即可让模型提速。

TPU kernel 使用 Pallas 编写,提供了对底层硬件的精细控制。你也可以引入 Tokamax 库中的 kernel。下面展示了一个来自 Tokamax 的 ragged-dot kernel 在 Mixture-of-Experts 模型中的应用:

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",
)

批次越大,收益越显著。当 batch size 为 64 时,Qwen3-30B-A3B 的解码速度提升 21.5 倍,Gemma 4 26B-A4B 提升 12.8 倍。

使用 Hub 非对齐点积内核与默认 grouped_mm 对比,针对 Qwen3-30B-A3B 和 Gemma 4 26B-A4B 的解码吞吐量 TPU v6e-8 上的解码吞吐量,Hub 内核与默认实现对比。

我们先测,省得你操心 🧪

我们通过运行库测试套件持续改进 transformers 对 TPU 的支持。目前正努力在 TPU 上添加夜间 CI(持续集成),并将结果呈现在 transformers 仪表盘 中。

包含 TPU 测试结果的 Transformers CI 仪表盘,与其他加速器并列展示 Transformers CI 仪表盘,TPU 结果与其他加速器并列展示。还在完善中!

目前还不是全绿,但这没关系。在 TPU 上运行的测试中,96.5% 已通过。我们发现的每个失败用例都会变成一个小的复现脚本,并在 TorchTPU 仓库中创建 issue。截至目前已报告 34 个问题,其中 19 个已修复。在 TPU 上运行还发现了几处 Transformers 自身的 bug,例如 StaticCache 和 Qwen3 张量并行方案中的问题,我们已在上游修复。

如果在 TPU 上出现问题,我们希望在用户之前先发现。

快速上手

TPU 不再是 PyTorch 用户的小众选项。安装 TorchTPU,从 Hub 获取模型,并将其发送到 "tpu"。

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

原始来源: HuggingFace博客

评论 (0)