Hugging Face 推出 TorchNeuron,让模型更易在 AWS Trainium 上运行
TorchNeuron: running HF models on AWS Trainium is easier than ever
Hugging Face 宣布 TorchNeuron 将于 2026 年 10 月 20 日开启公开测试,为 AWS Trainium 提供原生 PyTorch 后端。Transformers、Diffusers、Accelerate、PEFT 和 TRL 可直接使用 Trainium;文本生成模型架构的开箱支持率为 89%,而 Optimum Neuron v0.4.5 为 46%。
TorchNeuron将Trainium接入原生PyTorch工作流,并以89%对46%的架构支持率与Optimum Neuron形成对照,呈现迁移路径的变化。
TorchNeuron 为 AWS Trainium 上的 PyTorch 提供了全新的原生后端。Transformers、Diffusers 和 Kernels 原生支持该后端,让你能够以前所未有的便捷方式在 Trainium 上运行模型,并将模型分享到 HF hub。
TorchNeuron
TorchNeuron 是一个 PyTorch 插件,为 Trainium 带来全新的后端,支持急切模式、torch.compile以及 FSDP 和 TP 等原生分布式 API。
阅读 PyTorch 博客,详细了解 TorchNeuron。
从 2026 年 10 月 20 日起,TorchNeuron 将开放公测。研究人员和开发者可以使用 pip install torch-neuronx 安装它。
全新后端,HF 库中的原生接口
迄今为止,Hugging Face 在 AWS Trainium 和 Inferentia 上的使用体验——这两款 AI 芯片分别专为经济高效的训练和大规模推理而设计——一直通过 optimum-neuron 提供。该库依赖基于 PyTorch XLA 的 torch-neuronx 软件包。当时这自然是合适的选择,但也意味着必须以编译器的方式思考:使用惰性张量而非急切执行、仅支持静态形状,并且每次遇到计算图中断都要重新编译。Optimum Neuron 的存在就是为了隐藏这些复杂性,并通过维护自定义代码(模型类、训练器等)来实现这一点。
TorchNeuron 改变了这一切。它直接集成到 PyTorch 中,并将 neuron 作为原生设备提供,支持急切执行、PyTorch 自带的分布式原语(DTensor、FSDP2)以及 torch.compile。
对于 Hugging Face 库而言,Trainium 就像其他任何设备一样:Transformers、Diffusers、Accelerate、PEFT 和 TRL 都能直接在其上运行,使用的类和脚本与在其他加速器上完全相同。从现在起,我们建议 Neuron 用户直接使用这些库,而不是通过 Optimum Neuron。
Transformers
推理
Transformers 现在原生支持多种模型的文本生成。借助 TorchNeuron,使用量最高的 100 种文本生成模型架构中有 89% 可开箱即用,而 Optimum Neuron v0.4.5 支持的比例为 46%。只需在代码中传入 device_map=neuron 参数,模型就会被移至 Neuron 设备上。
下面是一个使用张量并行进行文本生成的示例,这样可以充分利用 Neuron 实例。请注意,示例使用了静态缓存进行生成,因为强烈建议在 Neuron 上这样做,以避免频繁重新编译。
import os
import torch
import torch.distributed as dist
import torch_neuronx # noqa: F401
from torch.distributed import DeviceMesh
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig
from transformers.distributed import DistributedConfig
from transformers.generation.configuration_utils import CompileConfig
MODEL_ID = "Qwen/Qwen3.8-27B"
MAX_SEQ_LEN = 1024
PREFILL_CHUNK_SIZE = 512
dist.init_process_group(backend="neuron")
world_size = dist.get_world_size()
model = AutoModelForCausalLM.from_pretrained(
MODEL_ID,
dtype=torch.bfloat16,
distributed_config=DistributedConfig(tp_size=world_size),
device_mesh=DeviceMesh("neuron", list(range(world_size))),
).eval()
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "left"
inputs = tokenizer.apply_chat_template(
[{"role": "user", "content": "The future of AI is"}],
add_generation_prompt=True,
padding=True,
tokenizer_kwargs={"pad_to_multiple_of": PREFILL_CHUNK_SIZE},
return_tensors="pt",
)
generation_config = GenerationConfig(
max_new_tokens=128,
do_sample=False,
use_cache=True,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.eos_token_id,
cache_implementation="static",
max_cache_len=MAX_SEQ_LEN,
prefill_chunk_size=PREFILL_CHUNK_SIZE,
compile_config=CompileConfig(backend="neuron", fullgraph=False, dynamic=False),
)
with torch.no_grad():
output_ids = model.generate(
inputs["input_ids"],
attention_mask=inputs["attention_mask"],
generation_config=generation_config,
)
if dist.get_rank() == 0:
prompt_len = inputs["input_ids"].shape[1]
print(tokenizer.decode(output_ids[0, prompt_len:], skip_special_tokens=True))
训练
现在 Neuron 已成为 PyTorch 原生设备,在 Trainium 上训练时,使用的 Hugging Face 库与其他加速器相同:Transformers、Accelerate、PEFT 和 TRL。你不再需要专用训练器或针对 Neuron 修改的模型代码分支。标准的 TRL 微调脚本只需设置少量 Neuron 专用参数,就能在 Trainium 实例上运行。
下面是一个基于 TRL 的 SFTTrainer 编写的监督微调脚本。如果你之前用 TRL 在 GPU 上微调过模型,这个脚本应该会让你感到熟悉。
import os
import torch
from datasets import load_dataset
from transformers.distributed import DistributedConfig
from trl import ModelConfig, ScriptArguments, SFTConfig, SFTTrainer, TrlParser
def main(script_args, training_args, model_args):
# The Neuron backend can't compile Dynamo's automatic dynamic shapes yet (https://github.com/huggingface/trl/issues/7660)
torch._dynamo.config.automatic_dynamic_shapes = False
training_args.model_init_kwargs = {
"revision": model_args.model_revision,
"trust_remote_code": training_args.trust_remote_code,
"attn_implementation": model_args.attn_implementation,
"dtype": model_args.dtype,
"device_map": None,
}
if int(os.environ.get("WORLD_SIZE", "1")) > 1:
# The model is sharded on the TP x FSDP grid as its weights are loaded
training_args.model_init_kwargs["distributed_config"] = DistributedConfig(
tp_size=int(os.environ.get("TP_SIZE", "1")),
fsdp_size=int(os.environ.get("FSDP_SIZE", "1")),
)
# Prepare dataset
train_dataset = load_dataset(
script_args.dataset_name,
name=script_args.dataset_config,
split=script_args.dataset_train_split,
)
# UltraChat also has a string `prompt` column, which makes TRL treat it as a prompt-completion dataset.
train_dataset = train_dataset.select_columns(["messages"])
# Training
trainer = SFTTrainer(
model=model_args.model_name_or_path,
args=training_args,
train_dataset=train_dataset,
)
trainer.train()
trainer.save_model(training_args.output_dir)
trainer.end()
if __name__ == "__main__":
parser = TrlParser((ScriptArguments, SFTConfig, ModelConfig))
script_args, training_args, model_args = parser.parse_args_and_config()
main(script_args, training_args, model_args)
并行化由 Transformers 原生处理。你只需在 model_init_kwargs 中设置包含张量并行(TP)和 FSDP 大小的 DistributedConfig,SFTTrainer 将其传递给 from_pretrained,模型便会在加载权重时进行分片。Trainer 会检测到模型已完成分布式处理,因此不会再次对其进行封装。你无需设置 --fsdp 标志,也无需使用 Accelerate FSDP 配置。
脚本中的内容都不专属于 Trainium:相同代码可以在任何硬件上运行。在 Trainium 上运行时,有几点值得了解:
- 静态形状。该脚本会在
torch.compile中禁用自动动态形状,并使用带换行的打包方式生成最多包含 2048 个 token 的序列。使用 TRL ≥ 1.16 时,Neuron 上的批次会填充至 128 个 token 的倍数,从而限制输入形状的数量。后续步骤中,形状相同的批次会复用已编译的计算图。 - 启用
torch.compile。只需传入--torch_compile true:在 Trainium 实例上,torch.compile会自动检测设备并选择 Neuron 后端,无需进行其他配置。 - 关闭异步权重加载。Transformers 内置的异步权重加载不支持 Neuron,因此目前我们通过
HF_DEACTIVATE_ASYNC_LOAD=1将其禁用。
下面的命令使用 torchrun 启动训练,它会为每个 NeuronCore 启动一个进程。TP_SIZE 和 FSDP_SIZE 用于设置并行布局,两者的乘积就是进程数:此处为 4 x 8 = 32,与 --nproc_per_node 相符。这 32 个进程组成一个 4 x 8 的网格。张量并行会将每一层拆分到 TP 组中的 4 个核心上,而 FSDP 会将参数、梯度和优化器状态分片到 8 个 TP 组上。
TP_SIZE=4 FSDP_SIZE=8 HF_DEACTIVATE_ASYNC_LOAD=1 uv run torchrun --nproc_per_node=32 sft_neuron_example.py \
--model_name_or_path Qwen/Qwen3-8B \
--dataset_name HuggingFaceH4/ultrachat_200k \
--dataset_train_split train_sft \
--output_dir Qwen3-8B-sft-tp4-fsdp8 \
--dtype bfloat16 \
--max_length 2048 \
--packing true \
--packing_strategy wrapped \
--learning_rate 2e-5 \
--warmup_steps 0.03 \
--num_train_epochs 1 \
--logging_steps 2 \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 4 \
--save_only_model true \
--torch_compile true
我们在 8 个 Trainium2 芯片(32 个 NeuronCore)上运行了该任务,这是 trn2.48xlarge 实例的一半。
训练顺利完成,trainer.save_model 会写入标准的 Transformers 检查点。检查点中没有任何内容与 Neuron 绑定:你可以直接将其推送到 Hugging Face Hub,并在任何其他硬件上加载。
Diffusers
推理
Diffusers 库中的许多管道都兼容 TorchNeuron 的即时执行模式和编译模式。FLUX.1-dev、FLUX.2、Qwen-Image、Qwen-Image-2.1 和 H3 也兼容张量并行,可充分利用你的 Neuron 设备。下面的示例展示了如何使用 TP:
import torch, torch.distributed as dist, torch_neuronx # TP
from torch.distributed.device_mesh import DeviceMesh # TP
from diffusers import QwenImage21Pipeline, QwenImage21Transformer2DModel, TensorParallelConfig
# Distributed devices initialization
dist.init_process_group(backend="neuron") # TP
dev = torch.neuron.current_device()
mesh = DeviceMesh("neuron", list(range(8))) # TP=8
# Pipeline initialization
model = "Qwen/Qwen-Image-2.1"
transformer = QwenImage21Transformer2DModel.from_pretrained(
model,
subfolder="transformer",
torch_dtype=torch.bfloat16,
parallel_config=TensorParallelConfig(mesh=mesh), # TP
)
pipe = QwenImage21Pipeline.from_pretrained(
model,
transformer=transformer,
torch_dtype=torch.bfloat16,
)
pipe.vae.to(dev)
pipe.transformer.compile_repeated_blocks(backend="neuron", fullgraph=True, dynamic=False)
# Image generation
emb, mask, _ = pipe.encode_prompt(prompt="A capybara wearing a wizard hat, oil painting", device="cpu") # text encoder stays on CPU
image = pipe(
prompt_embeds=emb.to(dev),
prompt_embeds_mask=mask.to(dev) if mask is not None else None,
height=1024,
width=1024,
num_inference_steps=40,
generator=torch.Generator("cpu").manual_seed(0), # same noise on every rank
).images[0]
if dist.get_rank() == 0:
image.save("out.png")
你可以使用以下命令运行这段代码:NEURON_LOGICAL_NC_CONFIG=2 torchrun --nproc_per_node=8 run.py。
兼容 TP 的管道会越来越多。如果你喜欢的管道尚不兼容,也可以按照本指南为其添加支持。
内核
请务必查看Neuron 团队开发的内核;越来越多的 Neuron 内核将会发布到 Hub,以加速你的模型。 Neuron 内核可以使用Neuron Kernel Interface(NKI)编写,它提供更底层的控制能力,便于优化操作。这样一来,用户就能运行自己的自定义操作,并将其分享到 Hub。
例如,你可以使用这个内核加速视觉 Transformer,在 Trainium 上实现最高 x2.4 的加速!
致谢
特别感谢 AWS 团队开发 TorchNeuron,并积极响应我们的反馈,尽可能完善与 HF 的集成。
来源:Hugging Face Blog · huggingface.co
