Google 与 Meta 发布 TorchTPU:PyTorch 原生 TPU 后端
TL;DR · AI 摘要
Google ä¸ Meta åå¸ TorchTPUï¼PyTorch åç TPU å端 · AIHOT PyTorchï¼Blog · The TorchTPU Teamâ 2026-10-21 00...
核心要点
- 主题聚焦:Google 与 Meta 发布 TorchTPU:PyTorch 原生 TPU 后端
- 来源:AI HOT 精选,建议结合原文判断细节。
- AI 分析暂不可用,本条为保底评分与摘要。
Google ä¸ Meta åå¸ TorchTPUï¼PyTorch åç TPU å端 · AIHOT
PyTorchï¼Blog
·
The TorchTPU Teamâ
2026-10-21 00:00
2 å°æ¶å
ç²¾é
AI è¯å
70
Google ä¸ Meta åå¸ TorchTPUï¼PyTorch åç TPU å端
Introducing TorchTPU
AI 导读
Google ä¸ Meta åå¸å¼æºé¡¹ç® TorchTPUï¼ä¸º Google TPU æä¾åç PyTorch åç«¯ï¼æ¨¡åè¿ç§»åªéæ .to("cuda") æ¹ä¸º .to("tpu")ã
æ¨èçç±
Google ä¸ Meta 宿¹è¯¦è§£ TorchTPU çæ¶æè®¾è®¡ã精度çç¥ååå¸å¼æ¯æï¼è¯»è 坿®æ¤è¯ä¼°æç°æ PyTorch 工使µè¿å° TPU çæ¹å¨ææ¬ã
å¦å¤ 1 家乿¥éäº
æ£æ · AI ç¿»è¯
è¯æå°ä¸å®æ´ï¼å®æ´å å®¹è¯·åæ¢å°åæã
TL;DR
TorchTPU æ¯ Google ä¸ Meta åä½å¼åç弿ºé¡¹ç®ï¼ä¸º Google TPU å¼å ¥äºåçä¸ç¬¦å设计ååç PyTorch å端ã宿¯æå¼ç®±å³ç¨çæ ç¼æ¨¡åæ§è¡ä¸ TPU è¿ç§»ï¼å¹¶éè¿ eager æ§è¡ä¼åãtorch.compile éæååç硬件å éï¼æä¾å ·æè¡ä¸ç«äºåçæ¨çä¸è®ç»æ§è½ã
æ¨åº TorchTPU
Google TPU å¨ Google å å¤é½å·²è¢«é常æåå°ç¨äºå¤§è§æ¨¡è®ç»åé¨ç½²å¤§åæºå¨å¦ä¹ 模åãå®ä»¬ä¸ä¸ºæºå¨å¦ä¹ è设计ï¼å æ¤å¨æ§è½ãè½èåææ¬æ¹é¢å ·ææ¾èä¼å¿ã尽管 TPU åå²ä¸ä¸ç´ä¸ TensorFlow å JAX çæç³»ç»ç¸å ³èï¼æä»¬å¾é«å ´æ¨åº TorchTPU ââè¿æ¯ Google äº 2025 å¹´ä¸å¯å¨ãä¸ Meta ç PyTorch å¢éåä½å¼å±çæ°é¡¹ç®ï¼æ¨å¨è®© PyTorch åçè¿è¡å¨ TPU ä¸ã
为äºå¨ Python æ¡æ¶ä¹ä¸å¯¹ Google TPU è¿è¡ç¼ç¨ï¼å¼åè ä½¿ç¨ XLA ç¼è¯å¨æ ã2020 å¹´ï¼Google æ¨åºäºé¦ä¸ªé¢å TPU ç PyTorch ç¼è¯çæ¬ PyTorch/XLAï¼åºäº Lazy Tensorsãå°½ç®¡å ·æå¥ åºæä¹ï¼è¿ä¸æ©æéæé¾ä»¥è·ä¸ PyTorch ç±ç¤¾åºé©±å¨çå¿«éæ¼è¿ãå ³é®å¨äºï¼PyTorch/XLA éè¦ä¾µå ¥å¼ä¿®æ¹æºä»£ç 以æ¾å¼å®ä¹å¯ç¼è¯åºåï¼ç¼è¯æ¶å»¶è¿ä¸¥éï¼ä¸æ¯æ PyTorch åççå½ä»¤å¼ï¼âeagerâï¼æ§è¡æ¨¡å¼ï¼å¹¶ä¸å¨æ¯æ PyTorch çæå æ°å ´çåå¸å¼è®¡ç®åè¯æ¹é¢æ»åãä¸ PyTorch/XLA å TorchAX ç以å¾å° PyTorch 强è¡å¡å ¥ JAX è¿ä½æ¹å¼çå°è¯ä¸åï¼TorchTPU æ¯ä½ä¸º PyTorch çä¸ä¸ªç¬¦å设计ååç TPU å端èæå»ºçï¼eager æ§è¡æ¯é¦è¦ä¼å 级ï¼ç°æ PyTorch å·¥ä½è´è½½åªéæå°çä»£ç æ¹å¨å³å¯å¼ç®±å³ç¨ï¼ä¾å¦ï¼ .to("cuda") â .to("tpu") ï¼ã
æ´å ·ä½å°è¯´ï¼å¨å¯å¨ TorchTPU æ¶ï¼æä»¬å»æå¶å®äºä¸å¥éµå¾ªçååï¼
- PyTorch Citizenship : è¿è¡æ¶ä¸ä¸ä¾èµ JAXï¼ ç¨³å¥ç eager 模å¼ï¼ åºäº Torch Dynamoï¼èé Lazy Tensorï¼ç Torch.compile()ï¼æ§è½ä¸ JAX compile ç¸è¿ï¼ éè¿å¨ PyTorch æ çæåºå±ï¼ä¾å¦ Process Group APIï¼æä¾ TPU éåéä¿¡ï¼å¹¿æ³æ¯æ PyTorch åå¸å¼æ¯ç¨æ³ï¼DDPãFSDPãDTensor çï¼ï¼ æ ç¼éæå° PyTorch çæç³»ç»ä¸ï¼ 社åºåä¸ã
- Focus on the User: å°å·¥ä½è´è½½ç§»æ¤å° TPU åºå½åæ model.to("cuda") æ¹ä¸º model.to("tpu") 䏿 ·ç®åãï¼ä» é è¿ä¸ç®åæ¹å¨æ æ³è¾¾å° TPU ç峰弿§è½ï¼å 为模åçå½¢ç¶ãåçåç®åå¯è½åå GPU æ¶æï¼ä½æ¨¡ååºå½è½å¤å¼ç®±å³ç¨ãï¼ ä¸ºè¿è¡æ¶/ç¼è¯å¨é误æä¾ç¨æ·å好ä¸å¯æä½çæç¤ºä¿¡æ¯ï¼ ä¸ PyTorch 社åºå·²å¨ä½¿ç¨çå·¥å ·åæ¡æ¶éæï¼ä¾å¦ torch.profilerãDTensorãRayï¼ã
- Improve the State of the Art : æå»ºä¸ä¸ªè½å¤å¨å¤§è§æ¨¡å·¥ä½è´è½½ä¸ä¸ GPU ä¸ç PyTorch ç«äºçè§£å³æ¹æ¡ï¼ 为 eager æ§è¡å¼å ¥ JIT ç¼è¯æ¹æ³ï¼éè¿è¿è¡æ¶ä¼åå¼¥åéç®åæ§è¡ä¸ç¼è¯æ§è¡ä¹é´çæ§è½å·®è·ï¼ éè¿å¼å ¥æç卿æ§ãé¿å å å½¢ç¶ååå¯¼è´ XLA éæ°ç¼è¯ï¼ä»¥åæ¢ç´¢å¯æåé¢ç¼è¯ç卿 TPU å æ ¸ï¼æ¹è¿ TPU ç¼ç¨æ ã
TorchTPU æ£å¨ç§¯æå¼åä¸ï¼å®å·²å¨ç产ç¯å¢ä¸ç¨äºé¨åæå¤§ Google Cloud 客æ·çæ¨çåè®ç»å·¥ä½è´è½½ï¼å¹¶ä¸å¯ä»¥å¨è¯¥ GitHub ä»åº 䏿¾å°å ¶å¼æºé¡¹ç®ãæ°åæ¬ææ¶ï¼æä»¬å·²ï¼
- æ°å¢å¯¹ eager åç¼è¯æ¨¡å¼çæ¯æï¼å æ¬æ°ç DeferAndFuse eager 模å¼ï¼
- æ°å¢å¯¹çº¦ 450 个 Aten ç®åçæ¯æï¼è·³è¿å ·æç»æåæå¤åå§æçç®åï¼ï¼å æ¬ä¸»è¦æ·±åº¦å¦ä¹ æ¶ææéçå ¨é¨ Core ATen ç®åçåååååä¼ æï¼
- æ°å¢éè¿ JAX/Pallas å Helion DSL ç¼åèªå®ä¹å æ ¸çè½åï¼
- Validated out-of-box execution on the 5,000 most downloaded Hugging Face models, including: LLMï¼QwenãDeepSeekãGemmaãLLamaãMistralãGPTãOPTãBLOOMãFalconãStableML é³é¢/è¯é³ï¼WhisperãWav2Vec2ãHuBERTãMMS è§è§ï¼DinoV2ãSigLIPãCLIPãSwin TransformerãConvNeXtãViTãResNetãDETR ææ¬ç¼ç å¨ä¸æç´¢ï¼BERTãALBERT ä¸ ElectraãRoBERTaãDeBERTaãT5ãMT5ãFlan-T5
- å·²éªè¯åºäº DTensor çåçï¼
- å·²éªè¯å¤ä¸»æºæ¨çï¼vLLM å SGLangï¼ä»¥åå¾®è°/è®ç»å·¥ä½è´è½½ï¼TorchTitanï¼ï¼å¹¶éç¨åºäº Ray çç¼æï¼
- å·²éªè¯ä¸ vLLMãSGLangãTorchTitanãRay å TorchRec çéæã
卿¬ææ¡£çå©ä½é¨åï¼æä»¬å°è®¨è®º TorchTPU æ¶æçå ³é®æ¹é¢ä»¥åä¸äºåæ¥ç»æã
æ¶ææ·±å ¥æ¢è®¨
TPU å ¥é¨
Google TPU æ¯ä¸é¨è®¾è®¡ç ASIC ï¼ç¨äºæ§è¡ä½ä¸ºæ·±åº¦å¦ä¹ åºç¡çå·¨éå¼ éè¿ç®ãä» ç¡¬ä»¶æ¶æè§åº¦ æ¥çï¼ä¸ä¸ª TPU è¯ç å å«ï¼åå³äºä»£é ï¼ï¼
- ä¸ä¸ªæå¤ä¸ª TensorCore ï¼æ¯ä¸ªå å«ä¸ä¸ªæå¤ä¸ªç©éµä¹æ³åå ï¼MXUï¼ãä¸ä¸ªåéåå ï¼VPUï¼åä¸ä¸ªæ éåå ï¼åè§ æ¤é¾æ¥ ï¼ãæ ¹æ® TPU 代é ï¼ä¸ä¸ª MXU å¯å å« 256Ã256 个ä¹å å¨ï¼å®ä»¬ä»¥ èå¨éµå ç形弿åã
- ä¸ä¸ªæå¤ä¸ª SparseCore ï¼å®ä»¬æ¯ç¨äºç¨çæä½ï¼ä¾å¦ gatherãscatterãembeddingsï¼åéåéä¿¡ç ä¸ç¨åå ãå®ä»¬å¯ä»¥ä¸ TensorCore å¹¶è¡è¿è¡ï¼ä»èå®ç°è®¡ç®-计ç®å计ç®-éä¿¡çéå ã
- 大容é é«å¸¦å®½å å ï¼HBMï¼ââå¨ TPU 8i ä¸ä¸º 288 GBã8.6 TB/sï¼å¯ç¨äºåå¨ ML æ°æ®å¹¶ä¸ CPU å ±äº«ã
- åå è¯çé´äºè¿ ï¼ICIï¼ââå¨ TPU 8t å 8i ä¸ä¸º 19.2 TBpsï¼å è®¸ç¨æ·é ç½®ç TPU Slice å ç TPU è¯çä¹é´å¿«ééä¿¡ï¼TPU Slice æ¯ TPU Pod çé»è¾åç»ï¼ç±é¢é ç½®æ°éç TPU è¯çç»æï¼è¿äºè¯ç以 3D torusï¼éç¨äº TPU 7ãTPUv 8tï¼æ Boardflyï¼TPU 8iï¼é ç½®è¿æ¥ã
- åå æ°æ®ä¸å¿ç½ç» ï¼DCNï¼ââå¨ TPU 8t ä¸ä¸º 400 GBpsï¼å 许跨 Slice ç TPU è¯çä¹é´éä¿¡ã
TPU éè¿ä¸¤ä¸ªä¸åçå ¥å£ç¹ä½¿ç¨ XLA ç¼è¯å¨ æ è¿è¡ç¼ç¨ï¼ StableHLO ï¼ç¨äº ML ç®åçè¾é«çº§ IRï¼å Mosaic ï¼ç¨äºèªå®ä¹å æ ¸çè¾ä½çº§ IR ï¼ãå®é ç TPU ISA æ¯ä¸æçãå¯è½åçååä¸ä¸å ¬å¼ãå®é ä¸ï¼å¯ä»¥å° StableHLO 以åï¼æ´æ¯å¦æ¤ï¼Mosaic è§ä¸ºçåäº PTXãåè§ä¸å¾çé«å±ç¤ºæå¾ã
C++ ç¨åºå¯ä»¥éè¿å®ä¾å PjRT Client æ¥è®¿é®æ¬å° TPUï¼å ¶ API æä¾äºå° MLIRï¼StableHLO æ Mosaicï¼ç¼è¯ä¸º TPU 坿§è¡æä»¶ãå¯å¨è¯¥å¯æ§è¡æä»¶ä»¥åå¨ TPU ä¹é´å¤å¶æ°æ®çæ¹æ³ã请注æï¼TPU æ§è¡æ¯å¼æ¥çï¼CPU å¯ä»¥éè¿çå¾ å ³èç PjRTBuffer æ¥çå¾ TPU ç»æå°±ç»ªã
TPU ç¼ç¨æ¨¡åçæ¾èç¹ç¹ï¼
- TensorCore 设å¤å¯ä»¥è¢«è§ä¸ºä¸ä¸ªå线ç¨å¤çå¨ï¼å¸¦æä¸ä¸ªæå¤ä¸ªå¤§è§æ¨¡ç©éµä¹æ³åå ï¼MXUï¼ãå æ¤ï¼è¦è¾¾å°å³°å¼æ§è½ï¼å ³é®å¨äºæ¨¡åçå½¢ç¶è¦è¶³å¤å®½ï¼ä»¥å å忥 MXU çæ½åãè¿ä¸ GPU ä¸åï¼å¨ GPU ä¸å¹¶è¡å¯å¨å¤ä¸ªè¾å°çå æ ¸æå©äºæå¤§å硬件å©ç¨çã
- XLA ç¼è¯å¨å¯ä»¥æç¤º TensorCore å°ç¨çè¿ç®åéåè¿ç®å¸è½½å° SparseCoreï¼ä»¥å®ç°æ´é«æå/æå¹¶è¡çæ§è¡ãè¿å¯ä»¥èªå¨åçï¼ä¹å¯ä»¥éè¿ç¼è¯åç StableHLO 模åä¸ç¨æ·æä¾ç MLIR 注解æ¥å®ç°ã
- ä¸ä¸ª TPU 设å¤åªè½è¢«ä¸ä¸ªç¨æ·ç©ºé´è¿ç¨è®¿é®ãéµå¾ªæä»¬æ ç¼éæå° PyTorch çæç³»ç»çç®æ ï¼å¯¹äºåå¸å¼ TorchTPU å·¥ä½è´è½½ï¼æä»¬éç¨æ¯è®¾å¤ä¸è¿ç¨ç模åï¼è¿ä¸ JAX çæ¯ä¸»æºä¸è¿ç¨æ¨¡åå½¢æå¯¹æ¯ãç¶èï¼ç±äºä¸ä¸ª TPU åªè½è¢«ä¸ä¸ªç¨æ·ç©ºé´è¿ç¨è®¿é®ï¼RL å ±ç½®æ æ³å¼ç®±å³ç¨å°æ¯æï¼æä»¬æ£å¨ç ç©¶æ¾å®½æç»è¿è¿ä¸ TPU éå¶çæ¹æ³ã
- StableHLO éµå¾ª SSA èå¼ ï¼å æ¤ä¸å 许åå°ä¿®æ¹ï¼å³åæä½æ»æ¯äº§çä¸ä¸ªæ°å¼ï¼è³å°å¨æ¦å¿µä¸å¦æ¤ï¼ãè¿å¯¹ TorchTPU 尤为éè¦ï¼å®ç¡®å®éè¿è§å¾åè§£åå转æä¾äºçæç PyTorchâè§å¾âè¯ä¹ï¼å æ¬ä¿®æ¹ï¼ï¼å¦æ¬ææ¡£åé¢æè¿°ã
- XLA ç¼è¯å¨å PjRT è¿è¡æ¶åå®å¼ éå½¢ç¶å¨ç¼è¯æ¶å·²ç¥ã认è¯å°è¿æ¯ PyTorch å·¥ä½è´è½½çä¸ä¸ªéå¶ï¼æä»¬ä¸ç´å¨æ·»å 对æç卿æ§çæ¯æï¼å³å½å½¢ç¶ç»´åº¦çæå¤§è¾¹çå¨ç¼è¯æ¶å·²ç¥ï¼ä½å®é ç»´åº¦ä» å¨è¿è¡æ¶å·²ç¥æ¶ã
- éåæä½è¢«é级为 StableHLO æä½ä¼ éç» XLAï¼è䏿¯ä½¿ç¨ NCCL çåç¬çåºã
å¯ç¨æ§ä¸èªå¨å è½½æºå¶
æä»¬å¨è®¾è®¡ TorchTPU æ¶èèäºå¯ç¨æ§ãå½ç¨æ·å¨å®è£ äº TorchTPU wheel ç TPU æºå¨ä¸å¯¼å ¥ PyTorch æ¶ï¼å¨ TPU ä¸è¿è¡ PyTorch 代ç åªéè¿è¡å¾®ä¸è¶³éçæ´æ¹ï¼å¹¶ä¸å¾çäº PyTorch çèªå¨å è½½æºå¶ï¼åªéå è¡ä»£ç å³å¯å®æï¼
请åé ä¸è¡¨è¿è¡å¹¶ææ¯è¾ã
ä¹åï¼GPUï¼
ä¹åï¼TPUï¼
æ¿ä»£æ¹æ¡ï¼TPU æ GPUï¼
import torch
import torch.distributed as dist
def main():
device = torch.device("cuda")
dist.init_process_group(backend="nccl")
rank = dist.get_rank()
word_size = dist.get_world_size()
...
model = model.to(device)
...import torch
import torch.distributed as dist
def main():
device = torch.device("tpu")
dist.init_process_group(backend="tpu_dist")
rank = dist.get_rank()
word_size = dist.get_world_size()
...
model = model.to(device)
...import torch
import torch.distributed as dist
def main():
device = torch.accelerator.current_accelerator()
dist.init_process_group()
rank = dist.get_rank()
word_size = dist.get_world_size()
...
model = model.to(device)
...æ°å¼ç²¾åº¦
TorchTPU 为 TPU 硬件éé æ å PyTorch 精度 APIã䏿æé«æ§è½æºå¨å¦ä¹ æ¶æä¸æ ·ï¼TPU éå¯¹å ¶ç¹å®ä»£é æå好çåçæ°æ®ç±»åè¿è¡äºä¼åï¼ä»¥å®ç°å³°å¼æ§è½åè½æãå¯¹äº TPUï¼åçç©éµä¹æ³æ ¼å¼ä¸º bfloat16ï¼BF16ï¼ï¼å®å¨é«å¨æèå´ä¸é«æååä¹é´åå¾å¹³è¡¡ãç±äº TPU ç©éµä¹æ³åå ï¼MXUï¼è¢«è®¾è®¡ä¸ºä½¿ç¨ BF16 è¾å ¥æ§è¡ç®æ¯è¿ç®ï¼å¹¶ä»¥ 32 使µ®ç¹è¿è¡ä¸é´ç´¯å ï¼è¿ä¸é ç½®æ¯ TPU 髿§è½è®¡ç®çåºç³ã对äºéæ¶ç¼©è¿ç®ï¼ä¾å¦éå ç´ å æ³ãæ¿æ´»ãlayernorm å softmaxï¼ï¼TorchTPU ä½¿ç¨ TPU åéæ§è¡åå ï¼VPUï¼æ§è¡ FP32 å¼ éè¿ç®ï¼è¯¥åå åçæ§è¡å®æ´ç IEEE-754 FP32 ç®æ¯ã
TorchTPU å° PyTorch ç²¾åº¦æ¨¡å¼æ å°å°åºå± XLA/StableHLO é ç½®ï¼ä»¥æ´é²è¿ä¸ç¡¬ä»¶è½åï¼
- medium ï¼ä¹æ³ä½¿ç¨è¾ä½ç²¾åº¦ï¼å°è¾å ¥è½¬æ¢ä¸º MXU çåç BF16ï¼ï¼èç´¯å 以 FP32 æ§è¡ä»¥ä¿æç¨³å®æ§ãTorchTPU é»è®¤ä½¿ç¨æ¤æ¨¡å¼ä»¥å åå©ç¨ TPU 硬件å éï¼å 为åé BF16 乿³é å FP32 ç´¯å 对å ä¹æææ·±åº¦å¦ä¹ å·¥ä½è´è½½é½è½æä¾è¶³å¤ç²¾åº¦ã
- high ï¼ä½¿ç¨ 3 éç®æ³ï¼å°è¾å ¥æå为é«ãä½åé以计ç®ä¸ä¸ªäº¤å项ï¼ä»¥çº¦ 3 åè®¡ç®ææ¬æ¢å¤å¤§é¨å FP32 精度ã
- highest ï¼ä½¿ç¨ 6 éç®æ³è®¡ç®ææäº¤å项ï¼ä»¥è¿ä¼¼å®æ´ç IEEE FP32 精度ï¼å¨ MXU ä¸äº§ç约 6 å计ç®å¼éã
对äºç»å¤§å¤æ°æ·±åº¦å¦ä¹ å·¥ä½è´è½½ï¼æä»¬å»ºè®®ä½¿ç¨ medium ï¼é»è®¤ï¼ç²¾åº¦ãå¨ TorchTPU 䏿¾å¼éæ© high æ highest ä¼è§¦åæ§è½è¦åï¼ TORCH_WARN_ONCE ï¼ãåªæå¨æç¡®è¯å«å°ä¸ç²¾åº¦ç¸å ³çæ¶æé®é¢æ¶æåæ¢å° high æ highest ï¼å 为è¿äºæ¨¡å¼ä¼å¸¦æ¥æ¾èçæ§è½å¼éãé¤å ¨å±è®¾ç½®å¤ï¼TorchTPU è¿æä¾çº¿ç¨æ¬å°ä¸ä¸æç®¡çå¨ï¼ torch.tpu.precision ï¼ç¨äºç»ç²åº¦ä½ç¨åï¼ä¾å¦é对æ°å¼ææçå±ï¼ã
å¹¶æå¯¹æ¯è§ä¸è¡¨ã
维度
CUDA ä¸ç PyTorch
TPU ä¸ç PyTorchï¼TorchTPUï¼
é»è®¤ç²¾åº¦æ¨¡å¼
highestï¼çº¯ FP32ï¼
mediumï¼Precision.DEFAULTï¼
å¿«éæ°å¦å éå¨åè¯
Tensor Coresï¼TF32ï¼
èå¨ MXUï¼bfloat16ï¼
å¿«éæ°å¦ä½æ°
1 符å·ä½ + 10 å°¾æ°ä½ + 8 ææ°ä½ï¼19 ä½ TF32 æ ¼å¼ï¼
1 符å·ä½ + 7 å°¾æ°ä½ + 8 ææ°ä½ï¼16 ä½ BF16 æ ¼å¼ï¼
ç´¯å 精度
FP32ï¼highest å high ä¸ï¼ï¼TF32ï¼medium ä¸ï¼
æææ¨¡å¼å为 FP32
æ´é«/æé«ç²¾åº¦æºå¶
ä¸ç¨ç¡¬ä»¶ FP32/TF32 åå
å¤éç®æ³åè§£ï¼3 åæ 6 å MXU éï¼
high/highest çæ§è½å½±å
åºçº¿é度æéåº¦åæ ¢ï¼çº¦ 1â2 åï¼
high 约 3 å MXU è®¡ç®ææ¬ï¼highest 约 6 å计ç®å¼é
ä½ç¨å API
å ¨å± torch.set_float32_matmul_precision
å ¨å± torch.set_float32_matmul_precision + ä½ç¨å torch.tpu.precision ä¸ä¸æç®¡çå¨
Eager æ§è¡ãStableHLO é级å JIT ç¼è¯
éµå¾ª è¿ä»½ PyTorch æå ï¼æä»¬éè¿ä¸ä¸ªæ°ç C++ å端æ©å±äº PyTorch dispatcherï¼å¹¶å°å ¶æ³¨å为 PrivateUse1 ãæ¤å¤ï¼æä»¬ä½¿ç¨äºæ åç at::Tensor æºå¶æ¥å®ä¹å¼ éåå¨ç设å¤ç¹å®å®ç°ï¼éè¿å¨ c10::StorageImpl å ä½¿ç¨ c10::UniqueVoidPtr ï¼ã
TorchTPU ç eager æ§è¡çä¸ä¸ªç¬ç¹ç¹æ§æ¯ï¼å®å¯ä»¥ä»¥å¤ç§æ¨¡å¼å° Aten ç®åååå° TPUï¼
- ç«å³ ï¼å³ææå°å®ç°éç®åååï¼
- å»¶è¿ ï¼ä¸ç´å»¶è¿å°èªå¨ç¡®å®ç ç©åç¹ ï¼ä¾å¦ï¼ä¸æ¡ .to("cpu") è¯å¥ï¼ï¼å¹¶ä¸æªè³è¯¥ç¹è¢«å»¶è¿çææå ¶ä»ç®åä¸èµ·èå/ç¼è¯ï¼
- ä»äºä¸¤è ä¹é´ç任使 åµã
è½ç¶è¿ç§çµæ´»æ§ç¡®å®ç»è®¾è®¡å¸¦æ¥äºé¢å¤ç夿æ§ï¼ä½æä»¬ä»ä¸å¼å§å°±å»æå å ¥å®ï¼å 为æä»¬å¸æè¯éªä¸åççç¥ï¼ä»¥å¨åºæ¬çéç®åå忍¡å¼ä¹ä¸æå eager æ§è½ãï¼æ¤å¤ï¼æ£å¦æ¬ææ¡£åé¢æè®¨è®ºçï¼è¿ç§çµæ´»æ§å¨å¤çè§å¾è¯ä¹å torch.compile æ¶é常æ¹ä¾¿ãï¼
æ»ä¹ï¼TorchTPU æä¾äº 3 ç§ eager 模å¼ï¼å¯ä»¥éè¿ç¯å¢åéæä¸ä¸æç®¡ç卿¥è®¾ç½®ï¼
- Strict ï¼é»è®¤ï¼ï¼æä»¬ä¸æ¬¡ååä¸ä¸ª Aten ç®åï¼å®ä»¬å¨ TPU ä¸ä¸ CPU 弿¥æ§è¡ãè¿ç¸å½äºå¨ GPU ä¸ä»¥ eager 模å¼è¿è¡ PyTorch æ¶ç颿è¡ä¸ºã
- Debug ï¼ export TORCH_TPU_LAUNCH_BLOCKING=1 ï¼ï¼æä»¬ä¸æ¬¡ååä¸ä¸ª Aten ç®åï¼ä½ TPU æ§è¡ä¸ CPU 忥ãè¿å¾æ ¢ï¼æ¨å¨ç¨äºè°è¯ï¼ç¸å½äºå¨ GPU ä¸ä½¿ç¨ CUDA_LAUNCH_BLOCKING ï¼å¹¶é¢å¤æä¾äº TorchTPU çè¾¹çæ£æ¥ã
- DeferAndFuse ï¼ export TORCH_TPU_DEFER_AND_FUSE=1 ï¼ï¼æä»¬å°å¤ä¸ª Aten ç®åå»¶è¿å¹¶èåææ´å¤§çåãè¿æ¯ TorchTPU å¼å ¥çä¸ç§æ°ç eager/ç¼è¯ æ··å æ¨¡å¼ï¼æ¯ Strict Eager å¿« 50% ææ´å¤ï¼åæ¶éä½å³°å¼ HBM å åï¼ç®åèååå°äº HBM ä¸ç临æ¶åå¨ï¼ã
ç°å¨æä»¬å·²ç»æè¿°äº TorchTPU eager 模å¼çåºç¡ç¥è¯ï¼è®©æä»¬å¾åä¸ä¸å½æ¶å°æ¥èª PyTorch dispatcher çåè°è°ç¨æ¶ä¼åçä»ä¹ãå设æä»¬ä½¿ç¨çæ¯ DeferAndFuse 模å¼ï¼å¹¶ä»¥ at::mul.out 为ä¾ï¼
- Create a Deferred Op instance that contains: A StableHLO builder object, which when invoked returns a StableHLO function implementing the semantics of aten::mul , as shown below (note that any implicit broadcasting and dtype promotion are handled elsewhere) func.func @main(%arg0: tensor<4x16xbfloat16>, %arg1: tensor<4x16xbfloat16>) -> tensor<4x16xbfloat16> { %0 = stablehlo.multiply %arg0, %arg1 : tensor<4x16xbfloat16> return %0 : tensor<4x16xbfloat16> } ä¸ä¸ªå¯éçéæç®ååæ°æ å°ï¼ä¾å¦ï¼å¯¹äº aten::native_batch_norm ä½¿ç¨ training å momentum ï¼ï¼ç¨äºè®¡ç®ç¼åé®ï¼ä¸æè®¨è®ºï¼ï¼
- è¿åä¸ä¸ªæ°ç at::Tensor ï¼å ¶ c10::StorageImpl ï¼éè¿é´æ¥æ¹å¼ï¼æå该 Deferred Op å®ä¾ã
彿¶å°æ¥èª PyTorch dispatcher ç对åºäº mytensor.to("cpu") æ mytensor.item() æç±»ä¼¼å 容çåè°æ¶ï¼TorchTPU å°ï¼
- åæå°ç®å为æ¢ç´¯ç§¯çãå¯¼è´ mytensor 计ç®çå»¶è¿ç®ååºå Rï¼
- åºç¨æ´»è·æ§åææ¥ç¡®å® R ä¸åªäºç®åéè¦ç©åï¼ä»¥å产ç mytensor çé£ä¸ªç®åï¼éè¦çæ¯ï¼å ·æå¯ä½ç¨çç®åï¼ä¾å¦ï¼éåéä¿¡ï¼æ»æ¯è¢«ä¿çï¼å ¶è°ç¨é¡ºåºä¹æ¯å¦æ¤ï¼ï¼è R ä¹å¤ä¸æ´»è·çç®åå¯ä»¥å¨ä¸åçå·¥ä½è´è½½å¯æ¬ä¹é´ç¡®å®æ§å°æ£æµå°ï¼å 为 Python çå å管ç使ç¨å¼ç¨è®¡æ°ã
- 为è¦ç©åçç®åå¾ G å建ä¸ä¸ªç¼è¯ç¼åé®ï¼ä»¥ä¾¿å°æ¥å¿«éä¸å¯ä¸å°è¯å«è¯¥å¾ï¼
- Use the computed cache keys to check in a Compilation Cache if graph G has been already compiled. 妿æ¯ï¼åå¨ TPU ä¸åå G ç坿§è¡æä»¶ï¼ 妿䏿¯ï¼å使ç¨çº¿ç¨æ± ï¼å¼æ¥å°ï¼ç¼è¯ Gï¼ç¶åå¨ TPU ä¸ååå ¶æ§è¡ã
- çå¾ mytensor ç TPU å¼å°±ç»ªï¼ç¶åå°å ¶ä» TPU HBM å¤å¶å°ä¸ç®æ at::Tensor å ³èç CPU åå¨ã
表é¢ä¸çï¼ä¸è¿°æ¹æ³ä¼¼ä¹æçä¸é«ï¼å 为 CPU åªæå¨éå° .to("cpu") è¯å¥æ¶æä¼å¯å¨ TPU æ§è¡ã对äºçå®å·¥ä½è´è½½ï¼æä»¬å¯ä»¥é¢æï¼å¨å°æ°åå§è¿ä»£/æ¥éª¤å¡«å ç¼è¯ç¼åä¹åï¼CPU æ§è¡åºä» æ¶å PyTorch 追踪åç®åååï¼å æ¤ä¼å§ç»é¢å äº TPU æ§è¡ï¼èåè å°å¿äºåé¿çæ°å¼è®¡ç®ãå°½ç®¡å¦æ¤ï¼ä¸ºäºå é坹夿¬¡éå¤çç®ååºåï¼æ³æ³ä¸å transformer åï¼çç©åï¼æä»¬æ·»å äºéå¤ç®åå¯åå¼ï¼Repeated Ops Heuristicï¼ï¼å®ä¼æ£æµæ¤ç±»éå¤ï¼å¹¶å¨å°è¾¾ TPU å° CPU ä¼ è¾ä¹å就触åç©åç¹ã
ç¼è¯ç¼å
TorchTPU éç¨ç¼è¯ç¼åæ¥é¿å ä¸å¿ è¦ç XLA ç¼è¯ãä¸ç°ä»£è®¡ç®æºåå¨ç³»ç»ç±»ä¼¼ï¼è¯¥ç¼åå å«å¤ä¸ªååå·¥ä½çå±çº§ï¼
- 第 1 å± ï¼è¿ç¨æ¬å°å åç¼åï¼ç¨äºå¨åä¸è¿ç¨å å ±äº«ç¼è¯ç»æãè¿æ¯ä¸å±ä¸æå¿«çã
- 第 2 å± ï¼æºå¨æ¬å°å ±äº«å åï¼æ¯æåä¸ä¸»æºä¸çè·¨è¿ç¨å ±äº«ãè¿å¯¹äºå¤è®¾å¤è®ç»/æ¨ç徿ç¨ã
- 第 3 å± ï¼ç±è¿ç¨æä»¶ç³»ç»ï¼ä¾å¦ Google Cloud Storageï¼æ¯æçæä¹ ç¼åï¼å 许跨主æºãç¨åºåä½ä¸éå¯å¤ç¨ãè¿å¨ Colab åæ°æ®ä¸å¿çæ§è¡ç¯å¢ä¸è¿è¡ TPU ç¨åºæ¶å¾æç¨ã
第 1 å±ç¼åå§ç»å¯ç¨ãé»è®¤æ åµä¸ï¼ç¬¬ 2 å±å¯¹åå¸å¼ç¨åºå¯ç¨ï¼å¯¹å设å¤ç¨åºç¦ç¨ãç¨æ·å¯ä»¥æ ¹æ®éè¦è¦çæ¤è¡ä¸ºã第 3 å±é»è®¤ç¦ç¨ï¼ä½å¯ä»¥éè¿æå®å ±äº«åå¨è·¯å¾æ¾å¼å¯ç¨ã
ç¼åä¸çæ¯ä¸ªæ¡ç®é½æ¯é对 StableHLO 计ç®å¾ç¼è¯ç TPU 坿§è¡æä»¶ãå¨ç¬¬ 1 å±ç¼åä¸ï¼æ¯ä¸ªå¯æ§è¡æä»¶é½æ¯ä¸ä¸ª C++ 对象ï¼å¯ä»¥ç´æ¥è°åº¦å° TPU 设å¤ä¸æ§è¡ãç±äºå¯¹è±¡æ æ³ç´æ¥è·¨è¿ç¨å ±äº«ï¼ç¬¬ 2 å±å第 3 å±ç¼åå°å¯æ§è¡æä»¶ä¿å为åºååçäºè¿å¶å符串ã
åºäºæ§è½åå ï¼æä»¬ä¸ä½¿ç¨ StableHLO 徿¬èº«ä½ä¸ºç¼åé®ãç¸åï¼æä»¬å°è®¡ç®ãç¼è¯å¨é项å主è¦ç»ä»¶ççæ¬æçº¹å为ä¸ä¸ª 64 使´æ°ï¼å¹¶ä½¿ç¨è¯¥å ç»ä½ä¸ºç¼åé®ï¼
- ä¸ä¸ªæ å½¢ç¶é®ï¼æè·è®¡ç®å¾çç»æï¼ä½ä¸æè·å¼ éè¾å ¥/è¾åºç大å°ï¼
- ä¸ä¸ªç»´åº¦é®ï¼æè·å¼ é大å°ï¼ä»¥å
- ä¸ä¸ªç¼è¯é项é®ï¼æè·ä¼ éç» XLA ç¼è¯å¨çé项以å TorchTPUãlibtpu å PjRt è¿è¡æ¶ççæ¬ã
æ å½¢ç¶é®å维度é®åå¨ä¸èµ·ä¹ç§°ä¸ºå¾é®ãè½ç¶ç论ä¸ä¸åå¾ãç¼è¯å¨é项åç»ä»¶çæ¬ä¹é´å¯è½åçç¼åé®å²çªï¼ä½æä»¬è®¤ä¸º 192 ä½é®ç©ºé´è¶³å¤å¤§ï¼å®è·µä¸ä¸ä¼åºç°æ¤ç±»å²çªã
è§å¾è¯ä¹
PyTorch çæä½è¯ä¹ä¸ StableHLO è¯ä¹ä¹é´ä¸ä¸ªç¹å«ä¸åçé¢åæ¯å¯åæ§åå ±äº«å åè§å¾çå¤çï¼
- PyTorch å设æ¯ä¸ª Tensor 齿¯æå线æ§åèæ°ç»çæéï¼å¹¶å¨ Tensor å±çº§å¸¦æ stride å æ°æ®ï¼ç¨äºæè¿°é»è¾ç´¢å¼å ç»å°è¯¥æ°ç»ä¸çº¿æ§åç§»éä¹é´ç转æ¢å ³ç³»ãå¤ä¸ª Tensor å¯ä»¥å ±äº«åä¸åºå±åèæ°ç»ï¼å æ¤å¯ä»¥ä»ä»»æ Tensor æ§è¡åå°åå ¥ï¼å¹¶ä¸è¯¥åå ¥ä¼ä»ä»»ä½å ¶ä» Tensor å¯è§ãå¾çäºéå ç stride å æ°æ®ï¼è§å¾æä½å¯ä»¥å¨ dispatch é¶æ®µå¨ CPU ä¸ä»¥è¾ä½å¼é宿ï¼åªéæ´æ°è¯¥å æ°æ®å³å¯ãè½ç¶è¿äºè§å¾å¤§å¤å±äºå°æ°å ç§å¸¸è§æä½ï¼ä½ä½¿ç¨ as_strided è¿ç®ç¬¦å¯ä»¥å®ä¹ä»»æå¤æç模å¼ã
- ç¸æ¯ä¹ä¸ï¼StableHLO æ¯ä¸ç§çº¯å½æ°å¼è¯è¨ï¼å ¶ä¸ææå¼ éå¼å¨æé ååä¸å¯åãç©çå¸å±å¯¹ç¨æ·æ¯æ½è±¡çï¼å®åæ ç¼è¯å¨ååºçååå³çï¼å æ¤ä¸æ¯æç´æ¥æä½ strideãæ¤å¤ï¼StableHLO 䏿¯æåå°åå ¥ï¼ç¸åï¼å¯ä»¥éè¿ dynamic_update_slice æä½åºç¨éæ©æ§æ´æ°ï¼å°ä¸ç»æ°å¼åå¹¶å°ç°æå¼ éçååçä¸ã
å¨åå¨åå ¥çæ åµä¸ï¼å¨ TPU ä¸å®ç°æ£ç¡®çè§å¾è¯ä¹å¹¶ä¸ç®åï¼ç¶èï¼TorchTPU åå©ä¸äºæºå¶å®ç°äºè¿ä¸ç¹ï¼å æ¬ è§å¾åè§£ ã è§å¾å转 åå»¶è¿æä½ãè¿ä¸è¯ä¹æ¡¥æ¥ä½¿ TorchTPU è½å¤åçæ¯æåæ¬ä¸å¯è½æ¯æç PyTorch 模å¼ï¼ä¾å¦ç¨äºåå¸å¼è®ç»çæ¼æ¥åæ°æ°ç»ã
æµä¸ SparseCore
å¨ä¼åæ¨¡åæ§è½æ¶ï¼PyTorch ç¨æ·å¯è½å¸æåæ¶æ§è¡ 3 ç±»æä½ï¼
- è®¡ç®æä½ï¼
- éåéä¿¡æä½ï¼
- 主æºä¸è®¾å¤ä¹é´çæ°æ®ä¼ è¾ã
å¨ GPU ä¸ï¼è¿é常éè¿ä½¿ç¨åç¬çå½ä»¤é忥å®ç°ï¼ä»¥ä¾¿è®¾å¤å¯ä»¥å°å·¥ä½åæ´¾å°ä¸åç硬件åå ï¼SMãDMA çï¼ãå¨ PyTorch ä¸ï¼è®¾å¤å½ä»¤éå以 Streams ç形弿´é²ï¼å®ä»¬é常æ¢ç¨äºç¨æ·ä»£ç ï¼ä¹ç¨äºæ¡æ¶ä»£ç ï¼ä¾å¦å¨ FSDPv2 ä¸ï¼ã
TorchTPU ä¹å®ç°äº PyTorch Stream APIï¼ä½å¹¶éå¨æææ åµä¸é½è½å®ç° GPU ä¸å¯ç¨çç¸ååè½ãèèå° TPU TensorCore æ¬è´¨ä¸æ¯ä¸ä¸ªåçº¿ç¨æ§è¡å¤çå¨ï¼æä»¬å¨ç»å® TensorCore ä¸ä¸æ¬¡åªè½åæ´¾ä¸ä¸ªè®¡ç®ãç¸åï¼GPU å å«è®¸å¤ç¸åçè®¡ç®æ ¸å¿ï¼SMï¼ï¼å¯ä»¥å¹¶è¡è¿è¡ãæå¹¸ï¼ä¸ä¸ª TPU TensorCore å ³èä¸ä¸ªæå¤ä¸ª DMA 弿以åä¸ä¸ªæå¤ä¸ª SparseCore 弿ãä¸åºææï¼DMA 弿å¯ç¨äºå¨ä¸»æºä¸è®¾å¤ä¹é´è¿è¡æ°æ®ä¼ è¾ï¼å¹¶ä¸ TensorCore æä½å¹¶è¡æ§è¡ãæ´æè¶£çæ¯ï¼SparseCore 弿æ¯ä¸ä¸ªç¬ç«åå ï¼é对ç¨çæä½ï¼ä¾å¦ gather/scatterï¼è¿è¡äºä¼åï¼å¹¶ä¸è¿å¯ä»¥æ¯æéåéä¿¡æä½ãååä¸å®å¯ä»¥æ¯æå®æ´ç StableHLO æä½éï¼ä½éè¦æ³¨æçæ¯ï¼å®å¨ç¨çæ°å¦è¿ç®ä¸ä¼ä¼äº TensorCoreï¼èå¨ç¨ 坿°å¦è¿ç®ä¸ä¼éäº TensorCoreï¼èåè æ£æ¯ TensorCore å MXU ç强项ã为äºè®©ç¨æ·å®å ¨æ§å¶å·¥ä½è¿è¡çä½ç½®ï¼å¯ä»¥å° TorchTPU æµæå¨åºå®å° SparseCoreï¼å¹¶ä¸ä»æ§è½åæä½æ¯æå®æ´æ§çè§åº¦æ¥çï¼è¯¥æµä¸è¿è¡å¨ TensorCore ä¸çé»è®¤æµå¹¶ä¸ç¸åãæµè¿å¯ä»¥ç¨äºåè°å¼æ¥æ°æ®ä¼ è¾ï¼ä½¿ç¨ DMA 弿ï¼ï¼æ¹å¼ä¸ GPU ä¸ç±»ä¼¼ã
ç¼è¯æ¨¡å¼
æä»¬çé¦è¦ç®æ æ¯ä¿æä¸å ¶ä» torch.compile() å端ä¸è´çç¨æ·ä½éªï¼å¹¶å æ¤å ±äº«ç¸åçç¼è¯å¨å端ï¼å³ Dynamoãæ ¹æ® è¿ä»½ PyTorch æå ï¼æä»¬æ³¨åäºä¸ä¸ªæ°ç TorchDynamo å端ï¼å ¶ç¨æ³å¦ä¸ï¼
compiled_model = torch.compile(model, backend="tpu")Dynamo éè¿ä¼ å ¥ torch.fx.GraphModule 以åä¸ç»ç¤ºä¾è¾å ¥å¼ 鿥è°ç¨æä»¬çåç«¯ãæ¤æ¶ï¼æä»¬åå¨ eager 模å¼ä¸ä¸æ ·å¯¹ææä¾çå¾è¿è¡è¿½è¸ªï¼ä½ææç®åé½è¢«å»¶è¿æ§è¡ï¼ä¸ä¸ä¼å¨ TPU ä¸å®é è¿è¡ãè¿ä½¿æä»¬è½å¤ä¸ºæ´ä¸ª FX å¾çæå¹¶ç¼è¯å个 StableHLO ç¨åºãæåï¼æä»¬ç Dynamo å端è¿åä¸ä¸ª Python å¯è°ç¨å¯¹è±¡ï¼è¯¥å¯¹è±¡å°è£ äºå¯¹æçæ TPU 坿§è¡æä»¶çè°ç¨ã请注æï¼ä½ä¸ºä¸é¡¹ä¸´æ¶éå¶ï¼å¨ TPU æºå¨ä¸è°ç¨ torch.compile æ¶ï¼æä»¬ä¼èªå¨è®¾ç½® dynamic=False ï¼å ä¸ºæ¯æ SymInt éè¦æç卿æ§ï¼ä¸æå°è®¨è®ºï¼ï¼ä½è¯¥ç¹æ§ç®åå°æªé»è®¤å¯ç¨ã
æç卿æ§
TPU ä¸ GPU çä¸ä¸ªä¸»è¦åºå«å¨äºï¼XLA ä¼ ç»ä¸åºäºéæå½¢ç¶è¿è¡ï¼ä»¥çæä¼åç硬件å¸å±åèåå æ ¸ãå¨å®è·µä¸ï¼è¿å¹¶é严ééå¶ï¼å½å¼ é维度ï¼å¦æ¹å¤§å°æåºåé¿åº¦ï¼å¨å·¥ä½è´è½½æ§è¡æé´åçååæ¶ï¼å¼åè é常éè¿é¢åé æ´å¤§çå¼ éå¹¶å¨è®¡ç®ååæå¨å¡«å /åçæ¥è§£å³ã
为é¿å æå¨ä¿®æ¹ä»£ç åéæ°ç¼è¯çå¼éï¼æä»¬æ£å¨ç§¯æå¼åï¼ä»¥éè¿ TorchTPU ä¸ç XLA æç卿æ§åçæ¯æå¨æå½¢ç¶ã卿ç卿æ§ä¸ï¼å¨æç¼å²åºå¨ä¸»æ¨¡å模åå ææå¤§ä¸éåé ï¼å¾åªç¼è¯ä¸æ¬¡ã计ç®ä½¿ç¨æçç¼å²åºå¨ TPU 䏿§è¡ï¼è XLA ä¼è·è¸ªé»è¾ç»´åº¦å¤§å°å¹¶èªå¨å¤çå¡«å ååçï¼ä¸ä¼è§¦åéæ°ç¼è¯ã
å æ ¸
æä»¬åºåä¸¤ç±»å æ ¸ï¼
- ç± PyTorch æ¡æ¶æä¾çå æ ¸ï¼ä¾å¦ torch.nn.functional.scaled_dot_product_attention ã
- ç¨æ·æä¾çèªå®ä¹å æ ¸ï¼ç¨äºå 鿍¡åçç¹å®é¨åï¼è¿äºé常ä¸å ·ä½æ¨¡åç¸å ³ï¼
对äºç¬¬ 1 ç±»ï¼æä»¬æåå®ç°äºä¸ç§æ¹æ³ï¼ç¨ Pallas ç¼å TPU å æ ¸ï¼ç¶å以符å·å½¢ç¶å¯¼åºå° Mosaicï¼åéè¿ä¸ä¸ª TorchTPU æ¥éª¤å¨è°ç¨æ¶ç¹åå æ ¸çå½¢ç¶ã该æºå¶è¢«è¯æä¸å¦é¢æçµæ´»ï¼å æ¤æä»¬æ£å¨è¯éªä¸ç§æ°æ¹æ³ï¼ä»¥ç¼åæ¯æå¨æå½¢ç¶ç Mosaic å æ ¸ã
对äºç¬¬ 2 ç±»ï¼æä»¬å¼åäºä¸ç§è§£å³æ¹æ¡ï¼
- (Production ready) The user writes their TPU kernel in Pallas and integrates it with PyTorch via a TorchTPU API, as follows # Define a simple vector addition Pallas kernel def add_vectors_kernel(x_ref, y_ref, o_ref): o_ref[...] = x_ref[...] + y_ref[...] # Wrap the Pallas kernel into a JAX function @torch.tpu.pallas.jax_op("pallas::add_vectors") def add_vectors(x: jax.Array, y: jax.Array) -> jax.Array: out_shape=jax.ShapeDtypeStruct(x.shape, x.dtype) return pl.pallas_call(add_vectors_pallas_kernel, out_shape)(x, y) # Use it like a standard PyTorch function x = torch.tensor([1.0, 2.0, 3.0], device="tpu") y = torch.tensor([4.0, 5.0, 6.0], device="tpu") z = add_vectors(x, y)
- ï¼çäº§å°±ç»ªï¼ ç¨æ·å¯å©ç¨æ¥èª Tokamax çå æ ¸ ï¼è¿æ¯ä¸ä¸ªé«æ§è½ TPU å æ ¸åºï¼ç°å·²å¯ç¨äºä¸ PyTorch æ ç¼äºæä½ãTokamax æä¾å ³é®ç®åçé«åº¦ä¼åå®ç°ï¼å æ¬æ··åä¸å®¶æå»ºæ¨¡åï¼å¦åç»ç©éµä¹æ³å token gather/scatterï¼ã注æååä½ï¼å¦å页注æåã鍿§ deltanetãKimi delta 注æååå¤å¤´æ½å¨æ³¨æåï¼ä»¥å TopK 计ç®ãç®åç»åå°éæ¶é´æ¼è¿ï¼ä»¥æ¯æå¨ææ°ç¡¬ä»¶å éå¨ä¸è¿è¡çææ° OSS 模åï¼ä¾å¦ï¼å叿¶æ¯æ TPU v8iï¼ãè¿äºå æ ¸ç±ç¨³å¥çéæåºç¡åºç¡è®¾æ½æä¾æ¯æï¼ä¾å¦èªå¨è°ä¼ï¼å¦ tile å¤§å°æç´¢ï¼ãä½å¼éçåºäº XProf çåºåæµè¯åå彿µè¯ï¼ä»¥éä½è¿ç»´å¤ææ§ãè½ç¶å æ ¸æ¬èº«ç¨ JAX/Pallas ç¼åï¼ä½è¯¥åºçåºç¡è®¾æ½éç¨ torch.tpu.pallas.jax_op API æ¥éæå°ç®¡çäºæä½ï¼å¹¶æ´é²åç PyTorch API 以æ¹ä¾¿å¼åè ã
- (Experimental) The user rewrites their GPU kernel in Helion , which enables targeting multiple accelerators with the same PyTorch-based DSL, as shown below # Define the kernel directly in Helion @helion.kernel(backend="pallas") def add_vectors(x: torch.Tensor, y: torch.Tensor) -> torch.Tensor: out = torch.empty_like(x) # Device execution loop over automatically partitioned tiles for tile in hl.tile(out.size()): out[tile] = x[tile] + y[tile] return out # Use it like a standard PyTorch function x = torch.tensor([1.0, 2.0, 3.0], device="tpu") y = torch.tensor([4.0, 5.0, 6.0], device="tpu") z = add_vectors(x, y)
åå¸å¼æ¯æ
为确ä¿ä¸ç°æ PyTorch åå¸å¼ API åæ¡æ¶å ¼å®¹ï¼æä»¬å³å®å¨ Process Group API å±é¢å®ç° TPU éåéä¿¡ï¼éè¿ç»§æ¿ c10d::Backend ï¼è¿ä½¿æä»¬è½å¤å¨ eager åç¼è¯æ¨¡å¼ä¸æ¦æªéåæä½ï¼å¹¶æ ç¼æ¯æ PyTorch åå¸å¼æ¡æ¶ï¼å¦ DTensorãFSDPv2ãSimpleFSDPãFairScale çãä¸ GPU ä¸ç PyTorch ç±»ä¼¼ï¼æä»¬éµå¾ªï¼å¹¶å®é å¼ºå¶æ§è¡ï¼æ¯è®¾å¤ä¸è¿ç¨çæ¹æ³ãä»å®ç°è§åº¦çï¼TPU æ 䏿ä¾åç¬ç TPU é´éä¿¡åºï¼èæ¯å° TPU éåæä½è¡¨ç¤ºä¸º StableHLO æä½ ï¼ stablehlo.all_gather ã stablehlo.all_scatter ã stablehlo.all_to_all çï¼ï¼è¿ä¸ä¸è¿°æºå¶èªç¶å¥åã
å¨ Process Group å±é¢æ¦æªéåæä½å ä¹è®©æä»¬å°è¾¾ç»ç¹ï¼é¤äºä¸ GPU ç¸æ¯ TPU çä¸äºæ¾èç¹æ§ï¼
- ä¸åçåå§ååºå ãèèä¸ä¸ªè¿æ¥äºå¤ä¸ªè®¾å¤ç主æºãå¨ GPU çæ åµä¸ï¼ç± torchrun å¯å¨çè¿ç¨å¯ä»¥çå°ææè¿æ¥ç设å¤ï¼å³ä½¿å®åªä¼ä½¿ç¨å ¶ä¸ä¸ä¸ªï¼ä¾å¦ï¼ä½¿ç¨ device=f"cuda:{local_rank}" ï¼ï¼å¹¶ä¸å¯ä»¥å¨è°ç¨ torch.distributed.init_process_group() ä¹åå°æ¨¡åç§»å¨å°è¯¥è®¾å¤ãç¶èï¼å¨ TPU çæ åµä¸ï¼ä¸ä¸ªè¿ç¨åªè½çå°ä¸ä¸ªè®¾å¤ï¼å¹¶ä¸ä¸ç¥é主æºè¿æ¥äºå¤å°è®¾å¤ãè¦æ£ç¡®åå§å TPU è¿è¡æ¶ï¼è¿ç¨éè¦å¨è°ç¨ torch.distributed.init_process_group ä¹åç¥é (a) è¿è¡åå¸å¼çæå¾ï¼(b) TPU æ°éï¼world sizeï¼ï¼ä»¥å (c) TPU ç±»åï¼å 为å®å½±åææï¼ã
- Default Process Group Knowledge . Consider two subgroups (4, 0, 1, 3) and (5, 2, 6, 7) running an all_reduce among themselves. Note that torch.distributed.all_reduce takes as input only the subgroup in which the collective op must execute. In contrast, stablehlo.all_reduce requires information about all subgroups (i.e., PyTorchâs default process group), even those the current process is not part of, as shown in the following MLIR snippet: %0 = "stablehlo.all_reduce"(%arg0) <{replica_groups=dense<[[4,0,1,3], [5,2,6,7]]>: tensor<2x4xi64>}> ({...
- MPMD Support . Historically, the TPU stack was built with SPMD in mind. Thanks to tools such as Shardy , distributed JAX programs are written for a single host, with no communication code included, and then are sharded at massive scale with user-provided directives, while the XLA compiler is fully responsible for inserting collective ops at the right points while maximizing the overlap between computation and communication. Unfortunately, the PyTorch ecosystem doesnât adopt a clean SPMD approach (a notable exception is SimpleFSDP ) and different processes may execute different ML ops leading to a collective op for reasons such as: ç¨æ·æå ¥ç以è¿ç¨ rank 为æ¡ä»¶çè¯å¥ï¼ å½å¼ é维度ä¸è½è¢«è®¾å¤æ°éæ´é¤æ¶ï¼DTensor å¯¹å ±äº«å¼ éçä¸ååæåã å½å å«éåæä½ç TPU StableHLO 模åä¸ä¸è´æ¶ï¼å¯è½ä¼åçä¸å¯é¢æµçæ»éæå åæåï¼è¿æ¯ç±äºçæç TPU 代ç ä¸è·¨ rank ç忥æ å¿ ID æç¼å²åºåç§»å¯è½ä¸å¹é ï¼ãTorchTPU 对æ¤çå¤çå¦ä¸ï¼ (é»è®¤) Skinny Collectives ãé»è®¤æ åµä¸ï¼TorchTPU ä¼å°æ¯ä¸ªéåéä¿¡æä½ç¼è¯å°å ¶ç¬ç«çâskinnyâ StableHLO 模åä¸ï¼è¿ä¿è¯äºå rank ä¹é´ç¼å²åºå忥æ å¿ ID çä¸è´æ§ãè¿æ ·åè½ç¶å¯è¡ï¼ä½ç¸æ¯ä¸ä¸æ¡ä¸è®¨è®ºçæ¹æ¡ä¼å¸¦æ¥ææ¾çæ§è½æå¤±ï¼ä¾å¦ç«¯å°ç«¯ 30-40%ï¼ï¼å 为å®ä¸å 许 XLA ç¼è¯å¨å°è®¡ç®ä¸éä¿¡éå ãç®åæ£å¨è¿è¡çä¸é¡¹å·¥ä½æ¯å° Skinny Collectives è¿è¡å¨ç»å®å° SparseCore çç¬ç«æµä¸ï¼ä»èä½¿å ¶è½å¤ä¸è¿è¡å¨ TensorCore ä¸çæ°å¦è®¡ç®éå ãæä»¬é¢è®¡è¯¥ä¼åå°æ½å Skinny Collectives ç大é¨åæ§è½æå¤±ã (å¯é) @spmd_safe è£ é¥°å¨ ãå¦æç¨æ·ç¥éææ®µä»£ç æ¯ SPMD çï¼ä¾å¦ï¼ä¸åå¨ä»¥ torch.distributed.get_rank() 为æ¡ä»¶ç if è¯å¥ï¼ï¼ä»ä»¬å¯ä»¥ç¨ TorchTPU ç @spmd_safe è£ é¥°å¨æ 记该段代ç ãå¨ torch.compile ä¸ï¼è¿ä¼æ¶é¤ TorchTPU 忬ä¼å¨éåéä¿¡å¨å´æå ¥ç徿ç¹ï¼åè§ä¸æ Skinny Collectivesï¼ï¼å¹¶å æ¤çæä¸ä¸ªå åµéåéä¿¡ç大å StableHLO 模åï¼XLA ç¼è¯å¨å¯ä»¥éè¿ç§»å¨éåéä¿¡ä½ç½®æ¥é«æä¼å该模åï¼ä»èæå¤§å计ç®ä¸éä¿¡çéå ï¼è¿å·²è¢«è¯æå¨ SimpleFSDP ææå¨æ¾ç½®éåéä¿¡æä½æ¶è½å¸¦æ¥æ¾èçæ§è½æ¶çãè¿ç§æ¹æ³çä¸ä¸ªæææ¯ MPMD 代ç å¯è½ä¸æå¯è§ï¼ç¨æ·å¯è½å¨ä»£ç å¹¶éä¸¥æ ¼ SPMD çæ åµä¸ä½¿ç¨ @spmd_safe è£ é¥°å¨ï¼ä»è导è´èå¼±çæ åµã (Optional) Compilation Handshake ( RFC ). This mechanism runs when a given torch.compile statement triggers compilation of a module containing communication operations. It initiates a consensus round across all replicas to verify that the compiled FX graphs are identical, which in turn allows replicas to disable graph breaks around collectives for the given FX graphs, similarly to the @spmd_safe mechanism described above.The handshake stage is controlled by an environment variable TORCH_TPU_SPMD_HANDSHAKE_STAGE which can be set to: OFF â ä»ä¸æ§è¡æ¡æï¼å½åé»è®¤ï¼ï¼ COMPILE_STAGE â å¨å¼å§ FX å¾ç¼è¯ä¹åæ§è¡æ¡æï¼ DISPATCH_STAGE â å¨å¼å§å·²ç¼è¯ç FX 徿§è¡ä¹åæ§è¡æ¡æãä» å½ç¨æ·é¢æä¼åºç° ç¹å®äº rank çéæ°ç¼è¯ æ¶æåºä½¿ç¨æ¤æ¨¡å¼ï¼å ä¸ºå®æ¯ä¸ä¸ä¸ªé项æ¶åæ´å¤§çå¼éã
åå¸å¼åå§å
å¨ TorchTPU ä¸åå§ååå¸å¼å·¥ä½è´è½½éµå¾ªæ å PyTorch åå¸å¼è¯ä¹ï¼ä½é注æ TorchTPU éè¦ä¸¤ä¸ª TPU ç¹æçåéï¼èæ å PyTorch torchrun ä¸ç¥éå¦ä½è®¾ç½®å®ä»¬ï¼
- TORCH_TPU_TOPOLOGY ï¼TPU åççç©ç mesh å ä½ç»æï¼ä¾å¦ï¼å¯¹äº 2x2x1 åçé 置为â2,2,1âï¼ã
- TORCH_TPU_SLICEBUILDER_ADDRESSES ï¼ç¨äºæå»º TPU è¯çé´äºè¿ï¼ICIï¼ç½ç» mesh ç弿¾ç«¯å£/å°ååè¡¨ï¼æ¯ä¸ªè®¾å¤ä¸ä¸ªï¼ï¼ä¾å¦ï¼âlocalhost:8471,localhost:8472,â¦âï¼ã
å¦ä¸ç§æ¹æ³æ¯å¨ Python ä¸ä½¿ç¨ torch.tpu.distributed.set_tpu_launch_env() ï¼å®å¯ä»¥å¨ Google Cloud ç¯å¢ä¸è®¾ç½®è¿äºåéãä¸é¢æä»¬å±ç¤ºå¯å¨åå¸å¼ TorchTPU å·¥ä½è´è½½ç示ä¾ä»£ç ã
A. Worker å®ç°ï¼ train.py ï¼
import os
import torch
import torch.distributed as dist
def worker_main():
# 1. Initialize distributed process group on TPU using the tpu_dist backend
dist.init_process_group(backend="tpu_dist")
# 2. Query rank, world size, and construct target TPU device
rank = dist.get_rank()
world_size = dist.get_world_size()
device = torch.device("tpu")
print(f"[Rank {rank}/{world_size}] Initialized on {device}")
# 3. Perform a distributed collective operation across TPU workers
x = torch.ones(4, 4, device=device) * (rank + 1)
dist.all_reduce(x, op=dist.ReduceOp.SUM)
print(f"[Rank {rank}] Reduced sum: {x[0, 0].item()}")
# 4. Clean up process group resources
dist.destroy_process_group()
if __name__ == "__main__":
worker_main()B. ä½¿ç¨ torchrun å¯å¨å·¥ä½è´è½½ï¼CLIï¼
# Single host launch (spawns 1 process per TPU chip on an 8-chip node)
eval $(python -m torch.tpu.distributed | sed 's/^/export /')
torchrun --nproc_per_node=8 train.pyæåï¼è¯·æ³¨æç»å®èç¹çé»è®¤è¿ç¨ç»æ¯è¯¥èç¹ç åç ã
æä¼è®¾å¤ Mesh æ å°
ç±äº TPU ç¬ç¹çè¿æ¥æ§ï¼å°æ¨¡åçå¹¶è¡çç¥ï¼TCãCPãFSDPãDPï¼ä¸ç©ç TPU 硬件äºè¿ææå¯¹é½é常éè¦ï¼ä»¥æå¤§å带宽并æå°åç½ç»å»¶è¿ãå顾ä¸ä¸ï¼TPU 使ç¨åå±ç½ç»æ¶æï¼
- ICI ï¼ç´æ¥çå 纤/éç¼äºè¿ï¼ä»¥ Torus mesh è¿æ¥è¯çãæä¾æ°åå°æ°ç¾ GB/ç§ç带宽ã
- DCN ï¼ç¨äºè¿æ¥ä¸å TPU åççæ å主æºçº§ä»¥å¤ªç½ãå ¶å¸¦å®½æ¾èä½äº ICIï¼å»¶è¿æ¾èé«äº ICIã
ä¸ä¸ªå¥½çè§åæ¯ä½¿ç¨ TorchTPU ç topology_aware_mesh() APIï¼å¹¶å°éä¿¡æå¯éçå¹¶è¡ç»´åº¦æ å°å°æå¿«ãæè¿ç»çç©ç ICI 维度ï¼ä¹å°±æ¯å° mesh 维度ä»ç½ç»å¼ºåº¦æä½å°ç½ç»å¼ºåº¦æé«è¿è¡æåºã示ä¾è§ä¸è¡¨ï¼
å¹¶è¡ç±»å
é信模å¼
é¢ç / æ°æ®é
æä¼ç©çæ¾ç½®
å¼ éå¹¶è¡ï¼TPï¼
all_reduceãreduce_scatter
æ¯ä¸ª transformer å±ï¼åå + ååï¼
æå¿«ç ICI ç¯ï¼åä¸ tray/hostï¼è¿ç»ç 1-hop è¯çï¼
ä¸ä¸æ / åºåå¹¶è¡ï¼CP/SPï¼
all_to_allãRing Attention
é«ï¼æ¯ä¸ª attention å±ï¼
æ¬å° ICI è½´ï¼slice å ï¼
ä¸å®¶å¹¶è¡ï¼EPï¼
all_to_all
æ¯ä¸ª MoE router æ¥éª¤
æ¬å° ICI è½´
FSDP / å®å ¨åç DP
all_gatherãreduce_scatter
æ¯ä¸ªæ¨¡å/å± 1 次
å¤å¶æ°æ®å¹¶è¡ï¼DPï¼
all_reduceï¼ä» 梯度ï¼
æ¯ä¸ªè®ç»æ¥éª¤ä¸æ¬¡
ICI æ DCNï¼å¤ Sliceï¼
以䏿¯ä¸ä¸ªä»£ç 示ä¾ï¼
from torch.distributed.device_mesh import DeviceMesh
# Single-Slice 2D Mesh Example (DP + TP)
# Logical mesh shape: (dp=4, tp=2) on an 8-chip slice ordered from least
# communication-intensive to most communication-intensive:
mesh_shape = (4, 2)
dim_names = ("dp", "tp")
# Computes optimal rank layout aligned with physical ICI rings
optimal_rank_tensor = torch.tpu.topology_aware_mesh(
mesh_shape=mesh_shape,
)
# Instantiate the DeviceMesh
mesh_2d = DeviceMesh("tpu", mesh=optimal_rank_tensor,
mesh_dim_names=dim_names, preserve_rank_order=True)
dp_mesh = mesh_2d["dp"]
tp_mesh = mesh_2d["tp"]ä½ä¸ºæªæ¥å·¥ä½ï¼æä»¬å°æ¢ç´¢ä¸ç§ APIï¼å è®¸ç¨æ·æ´ç´æ¥å°èªå®ä¹å ¶ meshï¼ä»èå¨ç¹æ®åºæ¯ä¸å®ç°æä¼çéåéä¿¡æ§è½ã
åå¸å¼ Pallas å æ ¸
TorchTPU æ¯æèªå®ä¹ Pallas å æ ¸ï¼å¯éè¿ ICI ä¸ç硬件 RDMA ç´æ¥è¿è¡è¯çé´éä¿¡ï¼æ éä¸»æº CPU åä¸ãè¿ä½¿ä½ å¯ä»¥ç¼å髿çç¹å¯¹ç¹éä¿¡å æ ¸ï¼ä¾å¦ Ring Attentionãèªå®ä¹ All-to-All / Shufflesãæµæ°´çº¿å¹¶è¡ç§»ä½æ Halo 交æ¢ï¼ï¼å¹¶å°å®ä»¬ä½ä¸ºåç PyTorch 彿°è°ç¨ã示ä¾å¦ä¸ï¼
# 1. Pallas Kernel Body: Asynchronously sends local buffer to neighbor rank (rank + 1)
def pallas_send_to_next_kernel(x_ref, y_ref, send_sem, recv_sem):
rank = jax.lax.axis_index("x")
world_size = jax.lax.axis_size("x")
dest_id = (rank + 1) % world_size
# Trigger hardware Remote DMA over TPU interconnect
async_copy = pltpu.make_async_remote_copy(
src_ref=x_ref,
dst_ref=y_ref,
send_sem=send_sem,
recv_sem=recv_sem,
device_id=(dest_id,),
)
async_copy.start()
async_copy.wait()
# 2. JAX Wrapper with ShardMap and DMA Semaphores
def build_jax_fn(mesh):
def local_pallas_call(x):
return pl.pallas_call(
pallas_send_to_next_kernel,
out_shape=jax.ShapeDtypeStruct(x.shape, x.dtype),
grid_spec=pltpu.PrefetchScalarGridSpec(
num_scalar_prefetch=0,
in_specs=[pl.BlockSpec(x.shape)],
out_specs=pl.BlockSpec(x.shape),
scratch_shapes=(
pltpu.SemaphoreType.DMA,
pltpu.SemaphoreType.DMA,
), # send & recv semaphores
),
)(x)
return jax.shard_map(
local_pallas_call,
mesh=mesh,
in_specs=P("x"),
out_specs=P("x"),
check_vma=False,
)
# 3. Create the TorchTPU callable wrapper
def get_send_to_next_op(world_size: int):
mesh = torch.tpu.pallas.get_pallas_mesh(axis_names=("x",), mesh_shape=(world_size,))
jax_fn = build_jax_fn(mesh)
return torch.tpu.pallas.jax_op(
"pallas::send_to_next",
build_jax_fn(mesh),
mesh=mesh,
input_partition_specs=[P("x")],
output_partition_specs=[P("x")],
)ä¸è¡¨æ»ç»äºå¦ä½ç¼åéä¿¡å Pallas å æ ¸ã
é¶æ®µ
å ³é®æ¥éª¤ä¸æä½
- Pallas å æ ¸ä¸»ä½
æ¥è¯¢é»è¾ rank ä¸ç®æ ID
è°ç¨
pltpu.make_async_remote_copy(...)æ§å¶å¼æ¥è°ç¨çå½å¨æï¼
desc.start()/
desc.wait()- åçæ å°ä¸ä¿¡å·é
å¨
scratch_shapesä¸åé DMA ä¿¡å·é
å¨ JAX Mesh ä¸ PartitionSpec ä¸ä½¿ç¨
jax.shard_mapå è£
- TorchTPU 注å
使ç¨
torch.tpu.pallas.jax_opæä¾ mesh å
input_partition_specsç´æ¥å¨ PyTorch å¼ éä¸è°ç¨ï¼Eager ä¸
torch.compileï¼
è§£å³è®¾å¤æ å°ä¸ä¸è´é®é¢ ãæ¤åå¨ TorchTPU ä¸ï¼ä½¿ç¨åºå±è¯çé´æä½ï¼å¦ lax.axis_index å async_remote_dma / make_async_remote_copy ï¼ç Pallas å æ ¸åºäºåå§ç¡¬ä»¶è®¾å¤ ID èé PyTorch rank æ¥è·¯ç±éä¿¡ï¼ä¸ JAX ä¿æä¸è´ãå½ç¡¬ä»¶è®¾å¤ ID ä¸ rank 顺åºä¸ä¸è´æ¶ï¼ç¯éä¿¡åè·¨è®¾å¤ DMA ä¼è¢«è·¯ç±å°é颿çç©ç设å¤ï¼èå¨é离åç»ä¸çæ§è¡ä¼å ååºæ°éä¸å¹é è失败ã
TorchTPU éè¿å¼ºå¶é»è¾å¯»åè§£å³äºè¿äºä¸ä¸è´é®é¢ï¼
- Rank 坹齿 å° ï¼TorchTPU ç°å¨å° Pallas å æ ¸ç´æ¥æ å°å° PyTorch rankï¼èéåå§ç©çè®¾å¤ IDï¼éè¿ get_pallas_mesh API ç¡®ä¿è·¯ç±ä¸è´ï¼è¯¥ API å° pallas ä¸çååºåè½´ç´æ¥æ å°å° PyTorch Process Group ä¸ç rank 顺åºã
- é»è¾è®¾å¤å¯»åï¼ TorchTPU ç°å¨å¼ºå¶ä½¿ç¨ DeviceIdType.LOGICAL åè§èç设å¤åé ï¼ da(0, p) = p ï¼ï¼ä¿è¯æ¯ä¸ªé»è¾ rank å§ç»æ å°å°å ¶æ£ç¡®çç©çç®æ ã
ç»ä¸ ProcessGroup éæã TorchTPU ç°å¨æä¾è·å rank å¯¹é½ JAX Mesh çæºå¶ï¼ä½¿å æ ¸è½å¤ç»§æ¿ PyTorch ProcessGroup ææãè¿å¯ä»¥å¨å ¨éä¸çåé离åç»é ç½®ä¸é«ææ§è¡ï¼æ éæå¨ä¿®è¡¥ç¶ææä¸æè®¡ç®å¾ã
å¼å模å
TorchTPU 以弿¾æ¹å¼å¼åï¼æ¯ Google ä¸ç¤¾åºåä½çææï¼ä¼å èèéæåº¦ååä¸åº¦ã该å¼å模å¼é¼å±æ´å¹¿æ³ç PyTorch çæåè¡ä¸åä½ä¼ä¼´è´¡ç®åéã
æä»¬é¢è®¡ TorchTPU å°æå¡äºå¤æ ·åçç¨æ·ç¾¤ä½ï¼å æ¬ç ç©¶æºæåè¡ä¸é¢å¯¼è ãæä»¬è¿è®¡åå°å ¶ä¸ Hugging Face çå¹³å°éæï¼ä¸ºå¹¿æ³ç弿¾æºä»£ç 模åæä¾å¼ç®±å³ç¨ç TPU æ¯æã
ä¸ºæ¯æå¼åè ï¼TorchTPU æä¾å ¨é¢çææ¡£ï¼å æ¬ ï¼åè§ http://torchtpu.readthedocs.io/ ï¼ ï¼
- æç¨ ï¼å¼å¯¼å¼å¦ä¹ è·¯å¾ï¼å æ¬èææºé ç½®åæ¨¡åç§»æ¤ã
- é æ¹ ï¼é¢åé®é¢çè§£å³æ¹æ¡ï¼éç¨äºæ§è½ä¼ååå æ ¸å®ç°çä»»å¡ã
- åè ï¼ææ¯è§èå API æ å°ã
- 说æ ï¼æ·±å ¥æ¢è®¨æ¶æå硬件åºç¡ã
ææ¡£ä½¿ç¨å¯ç´æ¥è¿è¡ç notebook æå»ºã
该项ç®å©ç¨ Bazel è¿è¡ç¨³å¥çæå»ºåæµè¯ç®¡çï¼æµè¯æ¡æ¶ä»å¨æ¼è¿ï¼å¹¶è®¡åéç¨ PytestãCI/CD åºç¡è®¾æ½æ£å¨éæå°å®æ¹ PyTorch CI HUD ä¸ï¼ä»¥ä¿æé«å¯é æ§å¹¶ä¿è¿ç¤¾åºè´¡ç®ã
TorchTPU è®¾è®¡ä¸ºå¯æ©å±ï¼è½å¤ä¸å ³é® PyTorch çæç»ä»¶æ ç¼éæã宿¯æéè¿ Pallas å Helion è¿è¡èªå®ä¹å æ ¸å¼åï¼å¹¶éè¿ vLLMãSGLang å TorchTitan ç项ç®ä¸ºåå¸å¼è®ç»åæ¨çå·¥ä½è´è½½æä¾ä¸çæ¯æãè¿ç§æ¨¡ååæ¹æ³å è®¸ç¨æ·å©ç¨ç°æç PyTorch æ¯ç¨æ³ï¼åæ¶é对 TPU ç¹å®çç¡¬ä»¶æ¶æè¿è¡ä¼åã
æ¡ä¾ç ç©¶
æ¡ä¾ç ç©¶ 1ï¼Hugging Face 模åè¦ç
TorchTPU æä¾ä¸ PyTorch çæçå¼ç®±å³ç¨å ¼å®¹æ§ï¼ä½¿å¼åè æ éä¿®æ¹ä»£ç æéæ°ç¼åå³å¯å¨ Google Cloud TPU ä¸è¿è¡å¼æ¾æºä»£ç 模åã为éªè¯è¿ä¸æ¿è¯ºï¼æä»¬æå»ºäºä¸ä¸ªèªå¨åæµè¯æ¡æ¶ï¼ä½¿ç¨ Hugging Face 模åè¦ç NLPãè§è§ãé³é¢ã夿¨¡æåçæå¼æ©æ£é¢åã该æç»éææµæ°´çº¿ä»¥ CPU å GPU åºçº¿ä¸ºåºåï¼å¯¹ TorchTPU çè¦çèå´ãç¨³å®æ§åæ°å¼çä»·æ§è¿è¡åºåæµè¯ãæä»¬å¨ä» v5e å¼å§ç TPU 硬件代é ä¸ï¼ä»¥ eager åç¼è¯æ¨¡å¼æç»è¯ä¼°çº¦ 5,000 个 Hugging Face 模åï¼æ¶µçæ°ç¾ç§æ¶æã
æä»¬éç¨åºäºè¯æåå±ååè¡¡æ¶æéæ©çç¨³å¥æµè¯æ¹æ³ãæä»¬çæ¹æ³ä¾èµäºä¸¤çº§éæ©æµç¨ï¼æ¨å¨å¹³è¡¡å®é éç¨ä¸å¹¿æ³çæ¶æå¤æ ·æ§ï¼é¿å 对ç»å¾®åä½è¿è¡å使µè¯ï¼åæ¶ç¡®ä¿çå®ç产æéå¾å°å åè¯ä¼°ãå¨ç¬¬ä¸çº§ä¸ï¼æä»¬æ ¹æ®ç¤¾åºéç¨åº¦ãä¸è½½é度åè¶å¿è¯åä¼å éæ©æåé åçæ¨¡åââä¾å¦ QwenãGemmaãMistralãDeepSeekãGLMãKimiãLlamaãWhisperãStable DiffusionãFLUX å Vision Transformerââ以确ä¿å ³é®ç¤¾åºç鍿¨¡åå®ç¾è¿è¡ã第äºçº§æ¯ä»ç¬¬ä¸çº§ä¸éåºçèç¦åéï¼ç¡®ä¿æä»¬ä»è¶ è¿ 500 个ä¸åçæ¨¡åå®¶æä¸è³å°éæ© 1 ä¸ªä»£è¡¨æ§æ¨¡åãæä»¬ä½¿ç¨ç¬¬äºçº§å¨å ¨é¢ç PyTorch ç®ååç¼è¯å¨æ¨¡å¼éåä¸éªè¯ç¸å¯¹äº GPU åºçº¿çæ°å¼åç¡®æ§ã
éªè¯è¿ç¨ä»ç¬¬ 1 é¶æ®µå¼å§ï¼è¯¥é¶æ®µä¾§éäºåçæµè¯åéä½éªè¯ï¼ä»¥ä¿è¯è¿è¡æ¶ç¨³å®æ§ã卿¤åå§é¶æ®µï¼æµæ°´çº¿ä½¿ç¨åææéå®ä¾å模åï¼éªè¯ eager 模å¼çååæ§è¡ï¼å¹¶ç¡®è®¤å¾è¿½è¸ªãFX å° StableHLO çå¾çæä»¥å XLA ç¼è¯åè½æå宿䏿 é误ï¼ä¾å¦ï¼æ å´©æºæå¼å¸¸ï¼ã䏿¦ç¡®è®¤è¿è¡æ¶ç¨³å®æ§ï¼ç¬¬ 2 é¶æ®µä¾¿ä½¿ç¨é¢åç¹å®çè¯ä¼°ææ ï¼å¯¹ç §æ¢å®åºçº¿è¯ä¼°æ°å¼æ£ç¡®æ§ã对äºå æ LLMï¼æ°å¦ä¿ç度éè¿å°æåº¦ï¼ Perplexity = e L = exp((1/ N ) Σ i =1 N L i )ï¼æ¥è¡¡éï¼è¥ TPU ä¸åºçº¿å°æåº¦ä¹é´çç¸å¯¹å·®å¼ä¿æå¨ 0.10 以å ï¼åæµè¯éè¿ã对äºè§è§ãé³é¢åç¼ç 卿¶æä¸çé«ç»´ç¹å¾ç©ºé´ï¼æä»¬éç¨åéå¼ç¸å¯¹ MSE ææ ï¼ Relative MSE = MSE( Y TPU , Y Baseline ) / (Var( Y Baseline ) + 10 â7 )ï¼ï¼è¦æ±ç¸å¯¹ MSE ⤠0.10 æç»å¯¹ MSE < 0.05ï¼ä»¥é²æ¢åºçº¿è¾åºæ¥è¿å¸¸æ°ã
ä¸è¡¨æ»ç»äºæªè³æ¬ææ°åæ¶ç模åè¦çç»æï¼
ææ ç±»å«
èå´ / å®ä¹
ç»æ
å·²éªè¯æ¨¡åæ»æ°
端å°ç«¯æµè¯çä¸å弿ºæ¨¡å
4,917 个模å
ç¬ç¹æ¶æå®¶æ
è·¨ TransformerãDiffuser ççä¸åæ¶æç±»å«
500+ ä¸ªæ¶æå®¶æ
第 1 å±ï¼æµè¡åº¦ï¼â éè¿çï¼å³æ å´©æºï¼
ä¸è½½éæé«çç¤¾åº LLMãè§è§ãé³é¢å夿¨¡ææ¨¡å
98%
â 4,917 个ä¸ç 4,821 个
第 2 å±ï¼æ¶æï¼â æ°å¼ä¸è´æ§
æ å ä¸åæ¶æçä»£è¡¨æ§æ¨¡å
97%
â 657 个ä¸ç 638 个ï¼ç¸å¯¹äº GPUï¼
å¯¹äºæçå¨ææ§æ¯æï¼é对 SymIntsï¼ï¼æä»¬å¨ 839 个模åï¼æ¥èª 5K è¯æåºçå æ LLM å表ï¼ä¸è¯ä¼°äºæ£ç¡®æ§ï¼å¹¶ç¡®è®¤äº 834 个ï¼99%ï¼æ¨¡åçæ°å¼æ£ç¡®ã
æ¡ä¾ç ç©¶ 2ï¼å¼ç®±å³ç¨çæ§è½
TorchTPU è´åäºæä¸º PyTorch ççæ£åç TPU å端ãå¨æä»¬çæ¥ï¼è¿ä¸ææå æ¬å¨è¿è¡çº¯ PyTorchãè®¾å¤æ å ³ä»£ç æ¶å ·æè¯å¥½çæ§è½ãæä»¬éè¿ä¸¤ä¸ªç¤ºä¾æ¥å±ç¤ºè¿ä¸ç¹ã
第ä¸ä¸ªç¤ºä¾å å«å¨ TorchTPU ä»åºä¸ï¼æ¯ä¸ä¸ªèªå å«çã纯 PyTorch å®ç°ç Muse Glimmer 30B 模åï¼æä»¬ä» ä½¿ç¨æ å PyTorch 模ååç®åç¼åï¼ä¾å¦ nn.Linear ã nn.RMSNorm ã F.scaled_dot_product_attention å torch.distributed éåéä¿¡ãæä»¬ ææ æ²¡æä½¿ç¨ä»»ä½æ¨¡åç¹å®çèªå®ä¹å æ ¸ï¼ä½ä»ä½¿ç¨äº PyTorch å é¨å æ ¸ï¼ã卿¤ç¤ºä¾ä¸ï¼æä»¬å±ç¤ºäºï¼
- Inference (prefill) performance on a single TPUv7 chip at åºåé¿åº¦ä¸º 5,120 æ¶ï¼ ~25.7k TPS ï¼ 59% MFU ï¼ä»¥å åºåé¿åº¦ä¸º 10,240 æ¶ï¼ ~22.4k TPS ï¼ 51% MFU ã 请注æï¼æ¤ç¤ºä¾ä½¿ç¨ FSDPï¼éè¿åç PyTorch éåéä¿¡å®ç°ï¼ï¼world size 为 2ï¼å 为å个 TPUv7 è¯çå PyTorch æ´é²ä¸¤ä¸ªè®¾å¤ï¼å¯¹åºä¸¤ä¸ªå å«ç TensorCoreï¼ã
- Training on 4 TPUv7 chips (i.e. a full single host), using FSDP, at æ¯ä¸ª TPU å¨åºåé¿åº¦ä¸º 5,120 æ¶è¾¾å° ~5.6k TPS ï¼ 38% MFU ï¼ä»¥å æ¯ä¸ª TPU å¨åºåé¿åº¦ä¸º 10,240 æ¶è¾¾å° ~4.6k TPS ï¼ 32% MFU ã å¨ç¬¬äºä¸ªç¤ºä¾ä¸ï¼æä»¬å¯ç¨äº æ¿æ´»æ£æ¥ç¹ ï¼å®ä» å¨ HBM ä¸åå¨ååä¼ ææ¿æ´»çä¸ä¸ªåéï¼å¹¶å¨ååä¼ æè®¡ç®éè¦æ¶éæ°è®¡ç®/éç©åæªåå¨çä¸é´æ¿æ´»ã
æèè示ä¾çä¸ä¸ªå³å®æ§ç¹å¾æ¯ï¼åä¸ä»½ä»£ç å¨é¤æå®å éå¨ç±»åï¼ä¾å¦ç¼å device="tpu" èé device="cuda" ï¼ä¹å¤ 没æä»»ä½ å®è´¨æ§æ¹å¨çæ åµä¸ï¼å³å¯å¨ TPU å GPU ä¸è¿è¡ï¼å¹¶ä¸å¨æ å PyTorch ä¼åä¸åçææ¯ï¼å¦ torch.compile å FSDPï¼ä¸å¨ TPU ä¸è¡¨ç°é常åºè²ã
为è¿ä¸æ¥éªè¯ TorchTPU å¨çº¯ PyTorch 代ç ä¸çæ§è½ï¼æä»¬è¿ä» TorchTitan 项ç®ä¸éåäºä¸ä¸ª å¤é¨äº§åº ç Muse Glimmer 30B å®ç°ï¼è¯¥å®ç°æåæ¯ä¸º GPU/CUDA ç¼åçãå¨å¯¹å ¶åæå°é度éé å° TorchTPU åï¼æä»¬ä» å° TorchTPU å°ä¸æ¯æç FlexAttention æ¿æ¢ä¸ºåç F.scaled_dot_product_attention ï¼å¹¶åºç¨äº torch.compile å SimpleFSDPï¼ï¼TorchTPU ç§»æ¤çå®ç°äºï¼
- Training on 4 TPUv7 chips: å¨åºåé¿åº¦ä¸º 5,120 æ¶ï¼æ¯ TPU 约 5.3k TPS ï¼ MFU 为 36% ï¼ä»¥å å¨åºåé¿åº¦ä¸º 10,240 æ¶ï¼æ¯ TPU 约 4.2k TPS ï¼ MFU 为 29% ã
æ»ä¹ï¼ææè¿äºç¤ºä¾è¡¨æï¼çº¯ PyTorch 模åå®ç°ï¼çè³æå为 GPU ç¼åçå®ç°ï¼åªéç®åç PyTorch æ¹å¨å¹¶é åæ å PyTorch ä¼åï¼å³å¯å¨ TPU ä¸è¡¨ç°è¶³å¤åºè²ï¼èæ éåå©èªå®ä¹å æ ¸çé«çº§çã设å¤ç¹å®çç¬å±±ææ¯ãæä»¬è®¤ä¸ºè¿æ¯ TorchTPU éç¨çä¸é¡¹éè¦ç¹æ§ãå½ç¶ï¼å¯¹äºè¿½æ±å³°å¼æ§è½çç产工ä½è´è½½ï¼æä»¬ç»å¯¹å»ºè®®éç¨åºäº Pallas å æ ¸çæä¼æ¹æ¡ï¼ä»¥å vLLM-TorchTPUãSGLang-TorchTPU æ TorchTitan-TorchTPU ççäº§çº§ææ¯æ ä½ä¸ºç¤ºä¾ã
æ¡ä¾ç ç©¶ 3ï¼å°è®ç»æ©å±å° Pod è§æ¨¡
æä»¬ä½¿ç¨ TorchTitan éªè¯äº TorchTPU 坿©å±è³ 1 个 TPU v7 PODãå¯¹äºæ¤æµè¯ï¼æä»¬éæ©äº Qwen3 MoE 235Bãä½ä¸ºåæ¥åçæµè¯ï¼æä»¬ç¡®è®¤å¨ 64 个 TPU v7 é ç½®ä¸ï¼TorchTitan é å TorchTPU çæ¨¡åæ§è½ä¸ MaxText ä¸ç JAX ç¸å½ï¼PyTorch/TorchTitan 为 1828 TPSï¼JAX/MaxText 为 1937 TPSï¼ã
ä¸æè®¨è®ºçæ°æ®åºäºä»¥ä¸è®¾ç½®è®¡ç®å¾åºï¼
- 模åï¼ qwen3_moe_235b_scan
- æ¬å°æ¹å¤§å°ï¼å³æ¯ä¸ª TensorCoreï¼ï¼16ï¼åºåé¿åº¦ï¼4096
- å¹¶è¡çç¥ï¼ååçè¿è¡ä½¿ç¨ FSDPï¼éè¿ SimpleFSDPï¼ï¼å¤åçè¿è¡ä½¿ç¨ HSDP
- 精度ï¼BF16 é å FP32 æ··å精度å½çº¦ï¼æ¢¯åº¦å½çº¦ï¼f32ï¼RoPEï¼f32ï¼ä¼åå¨ç¶æï¼f32ï¼
- å æ ¸ï¼Pallasï¼ï¼Tokamax Splash Attentionï¼å¸¦æ¥å¤§å¹ æ§è½æåï¼ãèå交åçµæå¤±å æ ¸ï¼ä»¥å MoE å±çåç»ç©éµä¹æ³
- æ«æä¼åï¼94 个解ç å¨å±ä½ä¸ºåä¸ªæ«æå¾ªç¯å¨å å æéä¸è¿è¡
- è§£ç å¨å±è¾å ¥çæ¿æ´»å¸è½½ï¼ä½ä¸ºæ«æä¼åçä¸é¨åï¼
- éåéä¿¡æµæ°´çº¿åï¼ä»¥å°éåéä¿¡ä¸ç¸é»å±ç计ç®éå ï¼æ«æçä¸é¨åï¼
- 宿´æ¿æ´»æ£æ¥ç¹
- ä½¿ç¨ TorchTitan ç Graph Trainer è¿è¡èååååååä¼ æ
- ä¸å®¶ä¸åè¡¡ï¼ä½¿ç¨ TorchTitan çè¾ å©æå¤±é²æ¢ MoE ä¸åè¡¡
- è®ç»æ°æ®éï¼Hugging Face C4 en æ°æ®éï¼é åèªå®ä¹æ°æ®éåç
ææ
TPU v7 è¯çæ°é
TensorCore æ°é
æ»æ¹å¤§å°
æ¯ TensorCore TPS
MFU
æ¥æ¶é´
1 åçé å FSDP
1024
2048
32768
2,236
28.8%
29.3s
2 åçé å HSDP
4096
65536
2,214
28.5%
29.6s
4 åçé å HSDP
8192
131072
2,095
26.9%
31.3s
8 åçé å HSDP
16384
262144
2,104
27.1%
31.2s
å¨ææææä¸ï¼æä»¬çæ°æ®è¯å®äº å¼±æ©å± ï¼æ´ä½è®¡ç®éåçº¿æ§æ©å±ï¼å¦ä¸æç¤ºï¼æ»æ¯ç§ token æ°çº¿æ§å¢é¿ï¼è MFU åºæ¬ä¿æå¹³ç¨³ã
æä»¬çæ°æ®è¿æ¾ç¤ºï¼å¨æèèçåç§å¹¶è¡çº§å«ä¸ï¼ æå¤±æ²çº¿ å ä¹å®å ¨ç¸åã
å¨å¤åç HSDP é ç½®ä¸ï¼ååä¼ æä¸æ¶åä»»ä½è·¨åçéä¿¡ï¼æ¯ä¸ªåçå¤çèªå·±é£ä»½æ¹æ¬¡æ°æ®ãä½å¨ååä¼ æä¸ï¼ä¸ä¸ªåçå 计ç®ç¬¬ t å±ç梯度ï¼ç¶åéè¿ all-reduceï¼å¨ DCN ä¸ï¼ä½¿ç¨ Megascale-XLAï¼å¯¹ååççææè¿äºæ¢¯åº¦æ±åã计ç®éåç»§ç»å¤ç第 t-1 å±ç梯度ãå¾çäº XLAï¼TorchTPU è½å¤å°ç¬¬ t+1 å±ç all-reduce ä¸ç¬¬ t å±ç计ç®å®å ¨éå ï¼å¦ä¸å¾æç¤ºãå®ç°è¿ç§éå æ¯æ¯ä¸ª TensorCore ç TPS ä»ä¸çå°å «çå ä¹ä¿æå¹³ç¨³ç主è¦åå ï¼å¦ä¸è¡¨æç¤ºã
æ¡ä¾ç ç©¶ 4ï¼å¨ vLLM ä¸ä½¿ç¨ Qwen3.5 è¿è¡ LLM æ¨çï¼SemiAnalysis InferenceXï¼
大è¯è¨æ¨¡åï¼LLMï¼æ¨çââå°¤å ¶æ¯éå¯¹å¤§è§æ¨¡æ··åä¸å®¶ï¼MoEï¼æ¶æââæ¯ AI äºåºç¡è®¾æ½ä¸è¦æ±æé«ãææ¬æå ³é®çå·¥ä½è´è½½ä¹ä¸ãå¨ SemiAnalysis åå¸çä¸é¡¹ç¬ç«åºåè¯ä¼°ä¸ï¼ TPU Inference Externalization Full Steam Ahead â InferenceX ï¼ï¼Google ç TPU v7 æé vLLM-TorchTPU 软件æ ï¼äº¤ä»äºå ·æè¡ä¸ç«äºåçæ¯ç¾å æ§è½ã该åºåæä¾äºå¯¹ TorchTPU 软件å¨å¤§è§æ¨¡æ··åä¸å®¶ï¼MoEï¼å·¥ä½è´è½½ä¸å°±ç»ªç¨åº¦çç¬¬ä¸æ¹æ¨ç审计ï¼è¡¨æé¢å TPU çæ° vLLM 软件æ å¨ç¤¾åºå ¬å¼å¯ç¨ç TPU ç³»ç»ä¸æä¾äºå¼ºå¤§çææ¬æçåé«ååéã
卿¤åºç¡ä¸ï¼Google æè¿æäº¤äº Qwen 3.5 å¨ Ironwood TPU ä¸ç馿¹ AgentX æ§è½ç»æãAgentX ææäºæºè½ä½å·¥ä½è´è½½çå个è¦ç´ ââå¤è½®ãé¿ä¸ä¸æãé«åç¼å¤ç¨ååæºè½ä½çªåãTPU å·²è½å¤è¯æå ¶å³å°æ¨åºç vLLM-TorchTPU 软件æ è½å¤æåå¤çæºè½ä½å·¥ä½è´è½½ãä» ç¨ 4 åè¯çï¼TPU v7 å°±å®ç°äºå¸ç´¯æå沿çå ¨é¢é¢å ã
- å¨ InferenceX 8K/1K ä¸ï¼æ¯ç¾ä¸ token æ»ä½ææ¬æä½ï¼ä¸º 2.01 ç¾åï¼ä½äºæä»¬ 9 æé¦æ¬¡äº®ç¸æ¶ç 3.6 ç¾åï¼ï¼
- å¨ AgentX ä¸ï¼æ¯ç¾ä¸ token æ»ä½ææ¬æä½ï¼ä¸º 0.83 ç¾åï¼å¹¶å ·å¤ SOTA äº¤äºæ§ï¼ç¨æ·ååºè½åï¼ãå¸ç´¯æåæ²¿å ¨é¢é¢å ã
è¿äºåºåç»æåæ äºå¨ TPU ç³»ç»ä¸å®ç°ç强大ãçå®çå¨çº¿æå¡æçï¼çªæ¾äºå¨ Google å®å¶è®¾è®¡ç ML è¯çä¸é¨ç½²å¤§è§æ¨¡æ¨¡åçå·¨å¤§ç»æµå¯è¡æ§ã
è¦å®ç°è¿äºæç«äºåçæ§è½å TCO ç»æï¼éè¦éè¿èªå®ä¹ Pallas å æ ¸åæé对æ§çè¿è¡æ¶è°ä¼æ¥è§£å³å ³é®ç软硬件对é½ç¶é¢ï¼ä¸è¡¨ååºäºå 个示ä¾ï¼
ä¼å
ç¶é¢
å®ç°
å°ä¸å®¶å¹¶è¡ MoE å±ä½ä¸ºå个 SPMD ç¨åº
å¨ DP8 + EP ä¸ï¼vLLM ç MoE å±å°æ¯ä¸ª rank ç token æ¶éå°æ¯ä¸ª rankï¼å¯¹å®ä»¬è¿è¡è·¯ç±ãç½®æ¢ï¼è¿è¡ä¸¤ä¸ªåç»ç©éµä¹æ³å䏿¬¡åå¹¶ï¼ç¶åå°ç»æ reduce-scatter åå»ãå¨å¹¶å度为 256 ç prefill å¯éåæ¥éª¤ä¸ï¼è¯¥ reduce-scatter æ¯å±èæ¶ 1,190 µsï¼å ææè®¾å¤æ¶é´ç 22%ï¼ä¸æé´æ²¡æå ¶ä»æä½å¹¶è¡è¿è¡ã
ä¸ä¸ª SPMD ç¨åºå¨å ¨é¨å «ä¸ª TensorCore ä¸è¿è¡è¯¥å±ãæ¯ä¸ª TensorCore å°å ¶è¡éå为 FP8ï¼å¹¶å¨ SparseCore ä¸å¼æ¥å°å¯¹å®ä»¬è¿è¡ all-gatherãåæ¶ï¼å®ç¨ Pallas top-k 为èªå·±ç token éæ©ä¸å®¶ï¼å¹¶å¨ä¸å®¶ç´¢å¼åè¡ç¼©æ¾å åçç¬¬äºæ¬¡å°å all-gather ä¸å ±äº«å®ä»¬ãéåï¼ä¸ä¸ª Pallas å æ ¸å¨è·¯ç±å°æ¯ä¸ªæ¬å°ä¸å®¶çè¡ä¸è¿è¡è¯¥ä¸å®¶ç两个ç©éµä¹æ³ï¼æç´¢å¼è·åè¿äºè¡ãå®éè¿è¿ç¨ DMA å°æ¯ä¸ªç»æè¡ï¼ä»¥ FP8 å½¢å¼ï¼å¸¦æ¯è¡ç¼©æ¾å åï¼æ¨éå°æ¥æè¯¥ token ç TensorCoreï¼
pltpu.make_async_remote_copyï¼ãè¿äºæ¨éä¸åç»ä¸å®¶çç©éµä¹æ³éå ãç¶åï¼æ¯ä¸ª TensorCore å¯¹ä¸ºå ¶ token å°è¾¾çè¡æ±åï¼å¹¶æè·¯ç±å¨åæ°å æãæ¯å±ä¸ï¼è¿å代äºè·¯ç±è¡ç argsortãSparseCore ç permute å combineã两个åç»ç©éµä¹æ³ä»¥å combine reduce-scatterã
Sequence-on-Lane 注æåå¸å±ï¼æ å¡«å FP8 KV ç¼åï¼
TPU çåéåå 以 32 ä½åå·¥ä½ï¼KV ç¼å乿æ¤å¸å±ï¼å æ¤å个 FP8 å¼å ±äº«æ¯ä¸ªåãæ å KV å¸å±ç¨æ¥èªå¤ä¸ªå¤´ç K å V å¡«å ä¸ä¸ªåãå¨ 8 è·¯å¼ éå¹¶è¡ä¸ï¼æ¯ä¸ªæ ¸å¿åªæææ¨¡å两个 KV 头ä¸çä¸ä¸ªï¼å æ¤æ¯ä¸ªåçä¸åæ¯å¡«å ï¼æ¯ä¸ªæ ¸å¿ä¸æ¯ä¸ª token ç 1,024 åèç¼åä» å¯¹åº 512 åèæ°æ®ã
Sequence-on-lane å°ä¸é¡µç token 沿 128 个 lane æåï¼å°å¤´ç»´åº¦æ²¿å lane å䏿åï¼å æ¤ä¸ä¸ªå容纳åä¸ token çå个å¼ï¼æ²¡æä»»ä½æµªè´¹ãè¿å° KV å ååæ¯ä¸ªè§£ç æ¥éª¤è¯»åç KV åèååãSequence-on-lane æ¯ vllm-torchtpu ç°å¨æ¯æçéç¨å¸å±ã
Gated DeltaNet ä¼å
60 å±ä¸æ 45 å±ä½¿ç¨ Gated DeltaNetï¼å®æ¯ä¸ªå¤´ä¿æåºå®ç 128 à 128 ç¶æï¼è䏿¯ä¸æå¢é¿ç KV ç¼åãè§£ç å¿ é¡»å¨æ¯ä¸æ¥è¯»åååå ¥æ¯ä¸ªåºåçç¶æï¼å¨å¹¶å度为 64 æ¶ï¼ç§»é¤å æ ¸çææç®æ¯åªè®©å®å¿«äº 6%ãé token è®¡ç®æ¶ï¼é¢å¡«å æ¯ä¸ä¸ªé¡ºåºéå½ï¼ä½¿ç©éµåå 空é²ã
ä¸ä¸ª Pallas å æ ¸èåäºå·ç§¯åéå½ï¼æ¹å¤çè§£ç åºåï¼å¹¶ä»¥ 64 token çåå¤çé¢å¡«å ï¼å¤§é¨åéå为ç©éµä¹æ³ãç¶æä¸ KV ç¼åä½äºåä¸ä¸ªåé¡µæ± ä¸ãå æ ¸ç´æ¥ä»æ± 页æµå¼ä¼ è¾å®ï¼å¹¶åå°è¯»åéå½ç¶æï¼éè¿æ¹å寻åè¿äºåèçæ¹å¼è䏿¯è½¬æ¢å®ä»¬ãå æ¤ï¼å ±äº«æ± ä¸ä¼å¸¦æ¥ååéæå¤±ï¼å¨æä»¬çæµè¯ä¸ï¼å®å¨æ¯ç§é ç½®ä¸é½æä¾äºçäºæé«äºç¬ç«ç¼åçååéã
è¿äºç»æçªæ¾äºç°ä»£æå¡åºç¡è®¾æ½ä¸ç TPU ä¼åï¼è¡¨æ TCO å软硬件对é½å³å®äºçå®ä¸ççæå¡æçãæç»ï¼å¸¦æ TorchTPU åç«¯çæ° vLLM-TPU 使工ç¨å¢éè½å¤å¨å ¬å¼å¯ç¨ç TPU åºç¡è®¾æ½ä¸ä½¿ç¨æ å PyTorch æ¯ç¨æ³é¨ç½²ç°æç弿¾æé模åã
æ¡ä¾ç ç©¶ 5ï¼ä½¿ç¨ TorchTitan è¿è¡ LLM å¾®è°
TorchTPU ä¸ TorchTitan åçéæââTorchTitan æ¯ PyTorch é¢åå¤§è§æ¨¡åå¸å¼è®ç»çåèå¹³å°ââå¨ç¨ å¯å¤§è¯è¨æ¨¡åï¼MuseGlimmer 30BãLlama 3 8Bâ405Bï¼ãç¨çæ··åä¸å®¶æ¨¡åï¼Qwen 3 235B MoEï¼ä»¥åçæå¼æ©æ£ Transformerï¼FLUX.1-dev 12Bï¼ä¸æä¾ç»ä¸ç髿§è½è®ç»ç¯å¢ãå¨ TPU v6eï¼Trilliumï¼å TPU v7xï¼Ironwoodï¼é群ä¸ä»¥ BF16 精度è¿è¡è¯ä¼°ï¼å¤åçæ§è¡éè¿ torchrun å¨ Google Kubernetes Engineï¼GKEï¼ä¸æ ç¼ç¼æãTorchTitan ä½ä¸ºå¼æºé¡¹ç®å¯å¨æ¤ GitHub ä»åº 䏿¾å°ã
åå¸å¼çç¥ä¸åçæ¶æ ã髿çå¤å éå¨è®ç»è¦æ±æ¨¡åå¹¶è¡çç¥ä¸ TPU çç©çäºè¿ææä¹é´å®ç°æ ç¼å¯¹é½ã为æ¤ï¼æä»¬éç¨ 2D+ DeviceMesh æ å°ï¼å°éä¿¡å¯éç维度ââä¾å¦å¼ éå¹¶è¡åä¸å®¶å¹¶è¡ââä¸è¿ç»çé«å¸¦å®½è¯çé´äºè¿ï¼ICIï¼å¯¹é½ï¼åæ¶å°å¤å¶çæ°æ®å¹¶è¡æµéè·¯ç±å°è¾æ ¢çè·¨åçæ°æ®ä¸å¿ç½ç»ï¼DCNï¼ãè¿ä¸çç¥éè¿æä»¬ä¸ SimpleFSDP çéææ¥å®ç°ï¼åè æä¾ç¬¦å SPMD è§èçæä½ã为è¿ä¸æ¥éä½å»¶è¿ï¼æä»¬å° XLA è¿è¡æ¶é 置为æéåéä¿¡æä½ï¼å¦ All-Gather å Reduce-Scatterï¼ç´æ¥å¸è½½å°çä¸ SparseCore 弿ï¼ä»èææå°å°éä¿¡ä¸è®¡ç®å¯éç TensorCore MXU æ°å¦è¿ç®éå ãæåï¼æä»¬éè¿ä½¿ç¨ HLO diffing å·¥å ·å @spmd_safe 注解æ¥ç¡®ä¿ç¡®å®æ§æ§è¡å¹¶é²æ¢åæ¥æ»éï¼è¿äºå·¥å ·å注解æ¶é¤äº torch.compile ä¸ä¸å¿ è¦çå¾ä¸æã
æ§è½ä¸å¤èç¹æ©å± ãéè¿ç³»ç»æ§çéå±ä¼åï¼TorchTPU ä¸ç TorchTitan 为 FLUX 模åå®ç°äºåè¶çæ§è½åå¤èç¹æ©å±æçãä»å¼ç®±å³ç¨ç eager åºçº¿æ¥è¿æ¶é´ 11.49sï¼0.26 samples/sï¼å¼å§ï¼åºç¨ DeferAndFuse eager 模å¼å°æ¥è¿å»¶è¿æ¹åè³ 9.95sï¼1.15à å éï¼ãå¼å ¥ SimpleFSDP åçè¿ä¸æ¥å°æ§è¡å éè³ 6.52sï¼1.76à å éï¼ï¼èéæèªå®ä¹ Pallas SplashAttention å æ ¸åå°æ¥è¿æ¶é´éè³ 5.55sï¼2.07à å éï¼ãå¯ç¨å®æ´ç torch.compile(backend=âtpuâ) å¸¦æ¥æ¾èçæ§è½é£è·ï¼è¾¾å° 3.02sï¼3.80à å éï¼ï¼èåºç¨ç®æ 模å窥åéåå产çæç»ä¼ååçæ¥è¿æ¶é´ 2.78sï¼1.08 samples/sï¼ãå¨å¤ä¸»æºé群ä¸ï¼TorchTitan å±ç°åºæ¥è¿çæ³çå¼±æ©å±å强æ©å±ï¼å¨ FLUX.1-dev ä¸ï¼ä½¿ç¨ SimpleFSDP ä»å个 v6e-8 èç¹ï¼8 è¯çï¼æ©å±å° v6e-256 åçï¼64 个èç¹å ± 256 è¯çï¼ï¼æ¯æ ·æ¬æ¥è¿æ¶é´ä» ä» 0.92s ç¥å¾®å¢å å° 1.00sï¼æ»æ¥è¿æ¶é´ 3.01sï¼ï¼å¨å äºè¿ ICI ç½ç»ä¸å±ç°åºæ¥è¿çº¿æ§çæçã卿´å¤§è§æ¨¡ä¸ï¼TorchTitan å¨ TPU v7xï¼Ironwoodï¼ä¸ä»¥ BF16 精度ã8K ä¸ä¸æçªå£å¨ 1,024 个è¯çä¸è¿è¡ Llama 3 405Bï¼å®ç° 500 tokens/sec/chip å 50+% MFUãåæ ·ï¼å¨ 8,192 个 TPU v7x è¯çä¸è¯ä¼° Qwen3 235B MoE ä¹å±ç°åºé«ææ©å±ï¼å¨ BF16 精度ã4K åºåé¿åº¦ä¸è¾¾å° 28% MFUã
å ³é®æ¶æä¼å ã为å¨å¤æ ·åçæ¨¡åæ¶æä¸ç»´æå³°å¼è®¡ç®å¯åº¦å¹¶æ¶é¤ç¡¬ä»¶ç¶é¢ï¼æä»¬éç¨äºå¤é¡¹ç³»ç»åå æ ¸ä¼åï¼
- SimpleFSDPï¼ ä¸ç§å¯¹ç¼è¯å¨å好ç FSDP çæ¬ãFSDP2 éè¿æ¨¡åé©åæ³¨å ¥å ¶ all-gather å reduce-scatterï¼è¿ä¼æ torch.compile æææéç®åååï¼SimpleFSDP åå°å®ä»¬è¡¨è¾¾ä¸ºè¢«è¿½è¸ªå¾ä¸çæ®éæä½ãè¿æ ·éåé信对 XLA ä¿æå¯è§ï¼TPU ç¼è¯å¨ä¾¿è½å´ç»å®ä»¬è¿è¡èåãä¸ MXU 计ç®éå ï¼å¹¶å¯å°å ¶å¸è½½å° SparseCoreã
- Scan é«é¶ç®å ï¼torch._higher_order_ops.scanï¼ï¼å°éå¤ç transformer åä½ä¸ºå¯¹å å æéç䏿¬¡å¾ªç¯æ¥è¿è¡ãéçæ·±åº¦å¢é¿ï¼è¿ä½¿ç¼è¯æ¶é´åèååæ°å åä¿ææå®ãéå±çéåéä¿¡ä½äºå¾ªç¯å é¨ï¼å æ¤ XLA å¯ä»¥å°å®ä»¬ä¸è®¡ç®éå ï¼å»¶è¿éèè°åº¦å¨å°æ¯ä¸å±ç all-gather éèå¨è¯¥å±ç计ç®ä¹åï¼éåéä¿¡æµæ°´çº¿å¨å¯éæ©æ§å°é¢åä¸ä¸å±ç all-gatherï¼èå¨ååä¼ æä¸ï¼å®å¯ä»¥è®©æä¸å±ç reduce-scatter å¨ä¸ä¸å±è®¡ç®æ¶å®æã
- Pallas SplashAttention å æ ¸ ï¼å°ç¼ºä¹åéç¦ç对é½çé»è®¤æ³¨æåå®ç°æ¿æ¢ä¸ºèªå®ä¹ Pallas å æ ¸ï¼æ¯æå®æ´ç Grouped-Query Attentionï¼GQAï¼ãåç½®å dropoutï¼å¨æ©æ£æ³¨æååä¸å¸¦æ¥ +17.5% çå éã
- Fused Pallas Cross-Entropy Loss : Avoids out-of-memory (OOM) faults when materializing [BÃSÃV] logits for large vocabularies by porting Tokamaxâs online reduction kernel to compute loss in-place.
- Graph trainer: Captures the full training step, forward, loss, backward and optimizer update, as a single graph that compiles into one XLA program. This gives the TPU compiler a global view for fusion, collective scheduling and memory planning, and lets TPU-specific passes decide per activation whether to save, recompute or offload to host, and donate optimizer buffers so state is updated in place rather than double-buffered.
- Activation Offloading : The activations that the backward pass needs can be moved to host memory after the forward and copied back just before backward uses them, which frees HBM for larger models and longer sequences. The graph trainer inserts the offload and reload ops into the traced graph. Under scan, they sit inside the loop body, so saved activations move one layer at a time. XLA turns these copies into async transfers, and in backward copies the next layerâs activations back while the current layer computes. This is essential for the largest models, such as Llama3-405B and Qwen3-235B, to fit at their target sequence lengths.
Ongoing development for TorchTitan on TorchTPU targets four strategic priorities: expanding list of models optimized for TPU; integrating FP8 and FP4 low-bit quantization via torchao ; and supporting end-to-end Reinforcement Learning (RL) by coupling training loops with vLLM/SGLang sampling backends in VeRL.
Case Study 6: Hardware-Accelerated Recommendation Models with TorchRec and SparseCore
Recommendation and ranking architecturesâsuch as Metaâs Deep Learning Recommendation Model (DLRM)âface critical memory and compute bottlenecks due to high-cardinality embedding tables. On standard GPU clusters, managing these tables may require complex software-based sharding via DistributedModelParallel (DMP) and separate optimizer updates, which often introduce latency. To bridge this gap, Google collaborated with the Meta PyTorch team to upstream a native TPU backend directly into the TorchRec repository, allowing recommendation models to bypass host-side compute bottlenecks and tap directly into TPU SparseCore (SC) hardware.
- Architectural Integration. The resulting implementation creates a seamless data pipeline where high-cardinality lookups are accelerated by dedicated hardware. A multi-threaded C++ PyBind backend runs on the host CPU to parallelize partition mapping and index padding, outputting structured batches that map directly to the TPU SparseCore units. Within the TPU, we implemented In-Place Optimizer Fusion: rather than materializing gradient tensors (.grad) in High Bandwidth Memory (HBM)âa process that traditionally complicates memory managementâwe map backpropagation directly to SparseDenseMatmulGrad. This ensures parameter updates (SGD, AdaGrad, or Adam) occur in-place, eliminating gradient memory overhead entirely. Finally, low-level ATen operators, such as SparseDenseMatmulOp (for forward lookups) and RaggedAllToAll (for optical ICI cross-chip collectives), provide hardware-accelerated kernels that execute directly on the silicon.
- Performance & Results. When evaluated on an industry-standard DLRM v2 model across a distributed 32-chip TPU v7x (Ghostfish) cluster, this integration achieved 100% performance parity with Googleâs highly optimized JAX baseline, reaching an identical 18.3ms step latency. Notably, this performance matching was established using baseline SparseCore kernels before applying advanced optimizations. Convergence and mathematical fidelity were equally robust, yielding identical loss trajectories compared to the JAX implementation.
Active development focuses on further saturating bandwidth through TensorCore/SparseCore pipeliningâinterleaving MLP execution with embedding lookupsâand advanced table-stacking techniques to unify memory buffers and reduce kernel overhead. Additionally, ongoing work aims to expose lower-level SparseCore embedding lookup operations (e.g. SparseMapRow, SparseGather etc) via ATen kernels, enabling users to implement custom lookup algorithms and advanced sharding strategies. This integration solidifies the TPU as a high-efficiency engine for the next generation of recommendation architectures.
Future Work
With TorchTPU now publicly available on GitHub , this initial open-source release represents only the beginning of our development journey. As we engage directly with the broader PyTorch community, our roadmap for the next 6 to 12 months focuses on production hardening, ecosystem expansion, and continually integrating community feedback to bridge the gap between TPU hardware capabilities and PyTorch-native developer workflows. We are prioritizing four strategic pillars to drive this evolution:
- Foundational Hardening & User Velocity : We are refining the âTrue Eagerâ experience by building a robust library of precompiled, dynamic kernels for ATen operators. We are also making XLA Bounded Dynamism fully production-ready, allowing the torch.compile stack to handle SymInts without extra recompilation, and streamlining our GKE packaging to lower the barrier for deployment across PyTorch versions. Furthermore, we are continuously expanding operator coverage and advancing our quantization supportâspecifically targeting FP8 and FP4 formats for next-generation TPUv8 architectures, and implementing nested compiler regions to reduce compilation time.
- Pod-Scale Distributed Training & Advanced Training : Building on our successful POD-scale training validation of Qwen3, we are expanding to additional model architecture and sharding techniques at and beyond that scale. We are enabling end-to-end Reinforcement Learning (RL) training loops by tightly coupling scalable training with high-throughput vLLM/SGLang sampling backends orchestrated via Ray Core. To enhance distributed stability, we are also validating a consensus-based compilation handshake to safely optimize collective operations with compute without fragile @spmd_safe annotations.
- Emerging Architectures, Inference & Serving : We are committing to proactively support cutting-edge model architectures as they emerge in the open-source ecosystemâincluding reasoning models, multimodal and generative diffusion models (e.g., Wan 2.2, Flux Klein), and novel Mixture-of-Experts (MoE) variants. Our efforts focus on optimizing the serving stack in vLLM and SGLang for low-latency production, incorporating native FP8/FP4 quantization across future TPU generations, and ensuring day-one TPU support for new architectural paradigms.
- High-Efficiency Communication & Diagnostics : We are optimizing collective operations within and across TPU slices and adding zero-copy DMA to enable hardware-assisted memory offloading. To support debugging at scale, we are transitioning to a WebGPU-based Trace Viewer 2.0 and deploying âflight recorderâ continuous profiling (XProfz) to identify intermittent bottlenecks in production environments.
TorchTPU is built on the belief that a successful ecosystem thrives through transparent, collaborative engineering. As we open-source our four foundational repositories (TorchTPU, vLLM-TorchTPU, SGLang-TorchTPU, and TorchTitan) at the October 2026 PyTorch Conference, we actively seek feedback on model architecture prioritization and workload sequencing. We invite developers, researchers, and partners to collaborate with us via GitHub or our active TPU Builders program.
â The TorchTPU Team
Claudio Basile, Michael Voznesensky, Gunhyun Park, Ben Wilson, Parker Holloway, Zhanyong Wan, Vlad Belous, Manish Khanna, Paul Ganssle, Kevin Gleason, Andrew Dame, Brendan Folie, Bhavya Bahl, Haifeng Jin, Pedro Goncalves Mokarzel, Arian Arfain, Luke Boyer, Chi Zhang, Yiling Yuan, Adam Mainz, Aditya Patel, Huangze Tang, Jay Gan, Lizzie Liang, Will Froom, Tushar Agarwal, Karlo Basioli, Theotime Combes, Emilio Cota, Minos Papadopoulos, Tudor Pipernea, Yarong Mu, Qi Zhou, Yaoshiang Ho, Aleksey Vlasenko, Alexander Brauckmann, Ziyin Huang, Jack Oh, Jerry Hsu, Tanvi Bajpai, Jialei Chen, Wenjun Gu, Chintan Shah, Chris Chan, Sayce Falk, Chris Jones, Rob Torres, Kat Ko, Lee Howes, Freya Azad, Andi Gavrilescu, Joe Pamer, Bill Jia
Plus many, many othersâ¦
The post Introducing TorchTPU appeared first on PyTorch .
æ¥æºï¼ PyTorchï¼Blog · pytorch.org
Google / Gemini
Meta / Llama
é¨ç½²å·¥ç¨
äº§åæ´æ°
#
é¨ç½²/å·¥ç¨
Meta