AI-LECTURER 速報課|2026-10-20|約 25 分鐘

TorchNeuron 上線:AWS Trainium 晶片終於能像一般顯卡那樣直接跑 Hugging Face 模型

📍 真實場景
阿凱,台北一家 12 人新創的後端工程師。老闆要他把公司的客服模型搬到比較便宜的 AWS Trainium 機器上。

他已經有一支在 GPU 上跑得好好的 Hugging Face 文字生成腳本,打算只改幾行就搬過去。

😖 卡住的地方:他查到舊做法要用 optimum-neuron,還得照編譯器的邏輯寫程式:形狀固定、一遇到圖斷裂就整個重新編譯。他怕一個小改動就讓他卡上好幾天。
💡 這課帶你看懂 TorchNeuron 改了什麼。搬家的重點變成把裝置指定為 neuron,腳本不必大改。你也會學到資深工程師怎麼評估這種硬體遷移。

🧭 這到底是什麼(白話版)

Trainium 和 Inferentia 是 AWS 設計的 AI 晶片專門用來做人工智慧運算的處理器,功能跟顯卡類似,但是由雲端公司自己設計。Trainium 主打用較低成本做訓練,Inferentia 主打用較低成本做大規模推論。過去在這些晶片上用 Hugging Face,靠的是一個叫 optimum-neuron 的函式庫。它底層用 torch-neuronx,而 torch-neuronx 又建立在 PyTorch XLA 上。

舊做法的代價,是你得「像編譯器一樣思考」。第一,它用 lazy tensor惰性張量,意思是你寫的運算不會馬上執行,而是先記下來,等到真的需要結果時才一起算,不是一行一行立刻跑。第二,它只接受 靜態形狀資料的大小(例如一次處理幾個字)必須事先固定,不能臨時變。第三,每次出現 graph break(計算流程被打斷),就要重新編譯一次。optimum-neuron 的任務就是把這些麻煩藏起來,所以得自己維護大量客製程式碼,例如模型類別和訓練器。

TorchNeuron 是一個 PyTorch 外掛,它改走另一條路:直接把 neuron 做成 PyTorch 認得的原生裝置。它支援 eager 模式PyTorch 的預設跑法,寫一行就立刻執行一行,方便除錯,支援 torch.compile,也支援 PyTorch 自己的分散式功能,例如 FSDP 和 TP。這樣一來,Transformers、Diffusers、Accelerate、PEFT、TRL 都能在 Trainium 上直接跑,用的類別和腳本跟在其他加速器上一樣。

時間點是這樣:TorchNeuron 預計從 2026 年 10 月 20 日起開放公開 beta,研究者和開發者可用 pip install torch-neuronx 安裝。Hugging Face 也明說,之後建議 Neuron 使用者直接用這些函式庫,不必再繞經 Optimum Neuron。

🎯 為什麼值得你花時間

支援的模型大幅增加文章給的數字是:最常用的 100 種文字生成模型架構中,TorchNeuron 開箱即用的有 89 種,Optimum Neuron v0.4.5 只有 46 種。你想用的模型能直接跑的機率,從不到一半提高到將近九成。
搬家只要指定裝置文字生成現在由 Transformers 原生支援,只要在程式裡傳入 device_map=neuron,模型就會被搬到 Neuron 裝置上。你不用再學另一套專用類別,維護成本跟著降低。
不必再當編譯器eager 執行、PyTorch 原生的分散式工具(DTensor、FSDP2)和 torch.compile 都能用。你不再需要一開始就把整個程式改成靜態形狀、惰性張量的寫法,除錯也比較接近你熟悉的 PyTorch。

⚙️ 它是怎麼運作的

1
安裝外掛公開 beta 開始後,在 Trainium 機器上用 pip install torch-neuronx 安裝 TorchNeuron,程式裡再 import torch_neuronx,neuron 這個裝置才會被 PyTorch 認得。
▼
2
建立分散式環境用 dist.init_process_group(backend="neuron") 啟動多顆晶片之間的通訊,再取得 world_size,也就是這次一共有幾個參與者。
▼
3
載入模型並切分from_pretrained 的 distributed_config 設 tp_size,就能把模型的權重切到多顆晶片上,這叫 張量平行把一個太大的模型矩陣切成幾塊,分給多顆晶片同時算,每顆只需負責一小塊。device_mesh 則是告訴程式有哪些 neuron 裝置可用。
▼
4
用靜態快取生成文字文章特別提醒,在 Neuron 上做生成時,強烈建議使用 靜態快取預先配置固定大小的記憶體空間存放中間結果,不會隨著文字變長而改變大小,這樣可以避免頻繁重新編譯。範例裡的 MAX_SEQ_LEN 與 PREFILL_CHUNK_SIZE 就是在規劃這個固定的空間與分段大小。
舊做法與 TorchNeuron 的差異(依文章內容整理)
項目Optimum Neuron(基於 PyTorch XLA)TorchNeuron
執行方式惰性張量eager 執行,另支援 torch.compile
張量形狀只支援靜態形狀文章建議生成時用靜態快取避免重編譯
Hugging Face 整合靠 optimum-neuron 的客製類別與訓練器Transformers、Diffusers、Accelerate、PEFT、TRL 直接執行
分散式由函式庫包裝處理PyTorch 原生的 DTensor、FSDP2、TP
前 100 名文字生成架構支援度46%(v0.4.5)89%

🔍 程式碼漫遊(點有 ● 的行看白話講解)

這是文章範例的前半段:在 Trainium 上用張量平行載入一個大型語言模型。原文在 tokenizer 那一行之後被截斷,所以這裡只講到載入模型為止。

●import torch_neuronx # noqa: F401
💬 這行看起來沒被使用,卻是關鍵。匯入它之後,PyTorch 才認得 neuron 這個裝置。後面的 noqa 只是叫程式檢查工具別抱怨「匯入了沒用到」。
●from transformers.distributed import DistributedConfig
💬 Transformers 提供的分散式設定類別,用來告訴模型要怎麼切到多顆晶片。
●from transformers.generation.configuration_utils import CompileConfig
💬 範例匯入了編譯設定類別,原文後半被截斷,沒有看到它的用法。
●MODEL_ID = "Qwen/Qwen3.8-27B"
💬 要載入的模型名稱,是一個 270 億參數規模的模型。
●MAX_SEQ_LEN = 1024
💬 最長序列長度。搭配靜態快取,空間會依此一次配好。
●PREFILL_CHUNK_SIZE = 512
💬 處理輸入提示時一次吃多少字,要分段處理,避免形狀亂變。
●dist.init_process_group(backend="neuron")
💬 重點行。使用 neuron 作為通訊後端,讓多顆晶片能彼此溝通。
●world_size = dist.get_world_size()
💬 取得總共有幾個參與者,後面拿來決定模型要切成幾份。
●distributed_config=DistributedConfig(tp_size=world_size),
💬 重點行。tp_size 代表張量平行的份數,這裡設成所有參與者的數量,才能完整用到整台 Neuron 機器。
●device_mesh=DeviceMesh("neuron", list(range(world_size))),
💬 指出要用哪些 neuron 裝置,編號從 0 到 world_size 減 1。

🛠️ 動手做:檢查環境,再用 device_map=neuron 跑一次文字生成

這是一個真實小專案:下載(或複製)檔案,照步驟在你電腦上跑起來。

📄 check_env.py ⬇ 下載
import importlib.util
import sys


def has(name):
    return importlib.util.find_spec(name) is not None


for pkg in ('torch', 'transformers', 'torch_neuronx'):
    print(pkg, 'OK' if has(pkg) else 'MISSING')

if not has('torch_neuronx'):
    print('尚未安裝 torch-neuronx:請在 Trainium 機器上執行 pip install torch-neuronx')
    sys.exit(1)

import torch
import torch_neuronx  # noqa: F401

print('torch 版本:', torch.__version__)
print('環境檢查完成,可以執行 run_generate.py')
📄 run_generate.py ⬇ 下載
import sys

import torch
import torch_neuronx  # noqa: F401  # 匯入後 neuron 才會成為 PyTorch 認得的裝置
from transformers import AutoModelForCausalLM, AutoTokenizer

# 預設沿用文章範例的模型;若單顆晶片放不下,請在指令後面帶入較小的模型名稱
MODEL_ID = sys.argv[1] if len(sys.argv) > 1 else 'Qwen/Qwen3.8-27B'
PROMPT = '用一句話解釋什麼是 Trainium。'

# 文章重點:只要 device_map='neuron',模型就會被搬到 Neuron 裝置上
model = AutoModelForCausalLM.from_pretrained(
    MODEL_ID,
    dtype=torch.bfloat16,
    device_map='neuron',
).eval()
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)

inputs = tokenizer(PROMPT, return_tensors='pt').to('neuron')

# 文章強烈建議在 Neuron 上用靜態快取,避免頻繁重新編譯
with torch.no_grad():
    out = model.generate(**inputs, max_new_tokens=64, cache_implementation='static')

print(tokenizer.decode(out[0], skip_special_tokens=True))
  1. Trainium 機器本身是雲端的 AWS 機器,無法在一般 Windows 電腦上直接跑。請先用 AWS 開好 Trainium 執行個體,再在 Windows 的 PowerShell 裡用 ssh 連上去。
  2. 在你的 Windows 電腦上建立資料夾,例如 mkdir C:\neuron-lab,把 check_env.py 與 run_generate.py 存進去。
  3. 在 PowerShell 用 scp 把檔案傳到機器上,指令格式為 scp C:\neuron-lab\*.py 使用者名稱@機器位址:~/,記得換成你自己的使用者名稱與位址。
  4. 連進機器後,在 Python 環境內安裝:pip install torch-neuronx transformers。torch-neuronx 的公開 beta 從 2026 年 10 月 20 日開始。
  5. 先執行 python check_env.py,確認三個套件都顯示 OK。
  6. 再執行 python run_generate.py,第一次載入模型與編譯會比較久。若記憶體放不下預設的 27B 模型,改成 python run_generate.py 較小模型名稱。
  7. 看到模型回覆那一句話,就代表你已經用 device_map=neuron 在 Trainium 上跑完一次文字生成。

🧠 工程思維透鏡(資深工程師看到的是什麼)

🔭 為什麼 AWS 要從「藏起複雜度的函式庫」改成「讓晶片變成原生裝置」?
optimum-neuron 把編譯器的複雜度藏起來,代價是團隊必須自己維護客製的模型類別和訓練器,每當新模型或 Hugging Face 函式庫更新,就得跟著改。把 neuron 做成 PyTorch 的原生裝置,等於把整合責任下放給 PyTorch 生態系:上層函式庫只要支援 PyTorch 裝置抽象,就自動支援 Trainium。這是用「標準介面」換「客製維護」,長期的整合成本會低很多。
🔭 支援度從 46% 提高到 89%,這個數字背後的設計理由是什麼?
舊做法要為每種模型架構寫專用類別,所以覆蓋率只能隨人力慢慢爬。新做法讓 Transformers 的原本實作直接跑在 neuron 裝置上,不必逐一改寫,覆蓋率自然大幅上升。但這個數字只涵蓋最常用的 100 種文字生成架構,而且是文章自己的說法,上線前仍要用你自己的模型實測。
🔭 既然 eager 執行更好用,為什麼文章仍強烈建議用靜態快取?
這是一個誠實的取捨。eager 讓你不必改寫程式,但晶片仍然偏好形狀固定的計算,形狀一變就可能觸發重新編譯。靜態快取預先配置固定大小的空間,用一點記憶體換取穩定的形狀,避免反覆重編譯造成的延遲。資深工程師看到的是:易用性提升了,但效能的底層限制並沒有消失,只是被推到使用者少數需要注意的地方。

📝 隨堂考(點選答案,立即回饋)

Q1. 舊的 optimum-neuron 底層依賴哪個技術,因此要求使用者像編譯器一樣思考?
✅ 文章說 optimum-neuron 依賴 torch-neuronx,而 torch-neuronx 是基於 PyTorch XLA,所以才有惰性張量、靜態形狀與重新編譯的問題。
Q2. 用 TorchNeuron 載入 Transformers 模型時,文章指出要把模型搬到 Neuron 裝置上,需要傳入哪個參數?
✅ 文章明確寫到,只要在程式裡傳入 device_map=neuron,模型就會被搬到 Neuron 裝置上。
Q3. 依文章數字,TorchNeuron 開箱即用支援前 100 名最常用文字生成架構的比例是多少?
✅ TorchNeuron 是 89%,46% 是 Optimum Neuron v0.4.5 的數字。
Q4. 為什麼文章建議在 Neuron 上做文字生成時使用靜態快取?
✅ 文章說靜態快取是為了避免頻繁重新編譯,因為 Neuron 對形狀變動比較敏感。

🃏 翻牌記憶卡(先想答案,再點開對答)

TorchNeuron 是什麼?點我翻面
一個 PyTorch 外掛,為 Trainium 提供新後端,支援 eager 模式、torch.compile 與 FSDP、TP 等原生分散式功能,並把 neuron 做成原生裝置。
舊做法 optimum-neuron 的三個痛點?點我翻面
惰性張量(不是立刻執行)、只支援靜態形狀、每次圖斷裂就要重新編譯。
如何用 pip 安裝 TorchNeuron?點我翻面
pip install torch-neuronx,公開 beta 從 2026 年 10 月 20 日起開放。
把模型搬到 Neuron 裝置上的關鍵參數?點我翻面
device_map=neuron。
為什麼要用靜態快取?點我翻面
預先配置固定大小空間,避免形狀變動造成頻繁重新編譯。

✅ 離開前自測(全勾=這課真的學會了)

0%