.title: TorchNeuron 問世:Hugging Face 模型在 AWS Trainium 上進入 PyTorch 原生後端時代
.slug: torchneuron-huggingface-aws-trainium-native-backend
Hugging Face 官方部落格在 2026 年 10 月 19 日發表了〈TorchNeuron: running HF models on AWS Trainium is easier than ever〉一文,由 Régis Pierrard、Simon Pagezy、Michael Benayoun、Jingya Huang、Alvaro Moran、David Corvoysier 與 Jeff Boudier 等人共同署名,說明 TorchNeuron 正式成為 PyTorch 在 AWS Trainium 上的新後端,並在隔日(10 月 20 日)以公開測試版形式釋出,使用者只需 pip install torch-neuronx 即可安裝。AWS Trainium 是 Amazon 自行設計的 AI 晶片,主要用於大規模訓練時壓低成本,其兄弟產品 Inferentia 則針對推論;兩者過去若要搭配 Hugging Face 生態系使用,都必須透過一個名為 optimum-neuron 的中介函式庫。
背景:為何過去的作法不夠順手
optimum-neuron 底層依賴 torch-neuronx 套件,而 torch-neuronx 是建立在 PyTorch XLA 之上的。XLA 是一種將運算圖編譯到硬體加速器的方案,但在開發體驗上與一般 PyTorch 程式差異很大:它採用 lazy tensor(延遲求值張量,即運算先被記錄、等到需要結果才真正執行),只支援靜態形狀(static shapes,張量維度必須在編譯前完全固定),而且只要程式中斷運算圖(graph break)就必須重新編譯一次。為了掩蓋這些複雜度,optimum-neuron 必須自行維護一套模型類別、Trainer 與其他客製程式碼,等於在 Hugging Face 與 Trainium 之間多了一層需要單獨維護的分支。
核心內容:Neuron 成為 PyTorch 的原生裝置
TorchNeuron 的作法完全不同。它是一個 PyTorch 外掛,直接把 neuron 註冊為 PyTorch 的原生 device(裝置),並同時支援 eager mode( eager 執行,也就是算子被即時逐步執行、行為與一般 CPU 或 GPU 程式一致)、torch.compile(PyTorch 內建的圖編譯器),以及 DTensor、FSDP2 等 PyTorch 官方分散式 API。對 Hugging Face 各函式庫而言,Trainium 因此變成了「跟其他加速器沒兩樣的裝置」:Transformers、Diffusers、Accelerate、PEFT 與 TRL 可以直接在上面執行,用的是與其他硬體完全相同的類別與腳本。官方明確表示,Neuron 使用者從今以後應直接使用這些函式庫,不必再透過 Optimum Neuron。
這種轉變最直接的成果出現在文字生成推論上。原文指出,憑藉 TorchNeuron,Hugging Face 上使用量最高的前 100 種文字生成模型架構中,有 89% 可以開箱即用,而舊的 Optimum Neuron v0.4.5 只有 46%。程式端只需在載入模型時指定 device_map="neuron",模型就會搬到 Neuron 裝置上。以 Qwen3-8B-27B 為例的張量並行(tensor parallelism,把同一層的運算切分到多顆晶片上協同計算)範例顯示,啟動分散式訓練需以 backend="neuron" 初始化 process group,並透過 DistributedConfig 指定 TP 世界大小。原文特別提醒,Neuron 上的生成應搭配 static cache(靜態快取,提前預留固定長度的 KV 緩衝區),以避免頻繁重新編譯。
技術脈絡:訓練、並行與生成的實務設定
訓練方面,由於 Neuron 已是原生裝置,一個標準的 TRL SFTTrainer 監督式微調腳本只需加入少數 Neuron 專屬設定即可在 Trainium 上執行,不再需要專用 Trainer 或模型程式碼的 Neuron 分支。並行策略由 Transformers 原生處理:把含 TP 與 FSDP 大小的 DistributedConfig 放進 model_init_kwargs,SFTTrainer 會將其傳給 from_pretrained,模型在權重載入的當下就完成切分,Trainer 看到模型已是分散式狀態便不會再次包裹,因此不需要 --fsdp 旗標或 Accelerate 的 FSDP 設定檔,整段腳本沒有任何與 Trainium 綁死的程式碼。
原文給出的實測配置是以 torchrun 啟動、每個 NeuronCore 一個程序,TP_SIZE=4、FSDP_SIZE=8,兩者相乘為 32,正好對上 --nproc_per_node=32,形成 4×8 的程序網格:張量並行把每一層切給 TP 組內的 4 顆核心,FSDP 則把參數、梯度與最佳化器狀態切分到 8 個 TP 組上。該實驗使用 8 顆 Trainium2 晶片共 32 個 NeuronCore,相當於 trn2.48xlarge 實例的一半,以 Qwen3-8B 搭配 HuggingFaceH4/ultrachat_200k 資料集、max_length 2048、learning_rate 2e-5、1 個 epoch 訓練完成,並輸出標準 Transformers checkpoint,可直接推上 Hugging Face Hub 供其他硬體載入。
幾個需要記住的限制包括:Neuron 後端目前尚不支援 Dynamo 的自動動態形狀,因此腳本需設定 torch._dynamo.config.automatic_dynamic_shapes = False,並以 wrapped packing 產生最長 2048 token 的序列;TRL 1.16 以上版本會把 Neuron 上的批次補齊到 128 token 的倍數,以壓低輸入形狀數量,讓編譯後的計算圖能在相同形狀的後續步驟被重用。開啟 torch.compile 只需 --torch_compile true,Trainium 實例上會自動偵測裝置並選用 Neuron 後端。此外 Transformers 內建的非同步權重載入在 Neuron 上尚不支援,目前須以 HF_DEACTIVATE_ASYNC_LOAD=1 關閉。
Diffusers 與 Kernel 的延伸
Diffusers 的多數 pipeline 已在 eager 與編譯模式下相容 TorchNeuron,其中 FLUX.1-dev、FLUX.2、Qwen-Image、Qwen-Image-2.1 與 H3 更支援張量並行,可透過 DeviceMesh 指定 TP=8 並配合 NEURON_LOGICAL_NC_CONFIG=2 與 torchrun --nproc_per_node=8 執行,文字編碼器留在 CPU、Transformer 與 VAE 放到 Neuron 裝置。若某個 pipeline 尚未支援,社群可依官方指引自行補上。Kernel 層面則有 Neuron Kernel Interface(NKI,Neuron 官方提供的底層算子撰寫介面,讓使用者能更細粒度地控制運算、榨取硬體效能),Neuron 團隊的 kernel 會陸續上架 Hub,官方並以一個加速視覺 Transformer 的 kernel 為例,宣稱在 Trainium 上最高可達 2.4 倍加速。
影響與限制
這篇公告的意義在於降低了硬體綁定的成本:模型程式碼、微調腳本與 checkpoint 首次與 Trainium 完全同構,開發者不必再為單一加速器維護平行版本。不過現階段仍是公開測試版,動態形狀、非同步權重載入尚未支援,kernel 與 pipeline 覆蓋也還在擴充,實際部署前仍需確認所用模型與 pipeline 是否已納入支援清單。原文也特別感謝 AWS 團隊在 TorchNeuron 開發上的投入,以及對 Hugging Face 回饋的快速回應。
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。