MarkTechPost AI生成式AI

利用 NVIDIA Transformer Engine、融合內核、BF16、FP8 與 GPU 基準測試加速 Transformer 訓練

2026年8月1日 18:31

重點摘要

在本教學中,我們探討 NVIDIA Transformer Engine 如何透過結合融合 GPU 內核、BF16 計算與硬體感知的 FP8 執行來加速 Transformer 工作負載。我們首先安裝 Transformer Engine 並檢測活躍的 GPU 架構,以判斷執行環境是否支援 TE 內核、FP8 張量核心,或僅能使用純 PyTorch 回退路徑。接著,我們檢視核心融合元件,如 te.Linear、te.LayerNorm、te.LayerNormLinear、te.LayerNormMLP 和 te.TransformerLayer,同時配置一個延遲縮放 FP8 配方,以管理張量縮放、amax 歷史記錄與混合 E4M3/E5M2 格式。利用這些元件,我們建構一個精簡的 GPT 風格因果語言模型,在確定性的合成序列上進行訓練,並比較高精度與 FP8 的效能差異。

站內 AI 整理稿

In this tutorial, we explore how NVIDIA Transformer Engine accelerates transformer workloads by combining fused GPU kernels, BF16 computation, and hardware-aware FP8 execution.

We begin by installing Transformer Engine and detecting the active GPU architecture so that we can determine whether the runtime supports TE kernels, FP8 tensor cores, or only the pure-PyTorch fallback path.We then examine core fused components such as te.Linear, te.LayerNorm, te.

LayerNormLinear, te.LayerNormMLP, and te.TransformerLayer, while also configuring a delayed-scaling FP8 recipe that manages tensor scaling, amax history, and hybrid E4M3/E5M2 formats.

Using these components, we construct a compact GPT-style causal language model, train it on deterministic synthetic sequences, compare higher-precision and FP8 execution, measure runtime and peak GPU memory, inspect FP8 metadata, and validate the trained model through autoregressive generation.

Copy CodeCopiedUse a different Browserimport subprocess, sys, os def pip_install(*pkgs): subprocess.run([sys.executable, "-m", "pip", "install", "-q", "--no-build-isolation", *pkgs], check=False) print(">> Installing transformer_engine[pytorch] (this can take a few minutes)...

") pip_install("transformer_engine[pytorch]") import time, math, gc import torch import torch.nn as nn import torch.nn.functional as F assert torch.cuda.is_available(), "Enable a GPU runtime in Colab first!" DEVICE = "cuda" props = torch.cuda.get_device_properties(0) CC = (props.major, props.

minor) GPU_NAME = props.name print(f">> GPU: {GPU_NAME} | compute capability {CC[0]}.{CC[1]} | " f"{props.total_memory/1e9:.1f} GB") TE_CAPABLE = CC >= (8, 0) FP8_CAPABLE = CC >= (8, 9) te = None if TE_CAPABLE: try: import transformer_engine.pytorch as te from transformer_engine.

common import recipe print(">> Transformer Engine imported OK:", getattr(te, "__version__", "unknown version")) except Exception as e: print(f">> TE import failed ({e}); using pure-PyTorch fallback.") TE_CAPABLE = FP8_CAPABLE = False else: print(">> GPU is pre-Ampere (e.g.

T4): TE kernels unsupported -> fallback mode.") if TE_CAPABLE and FP8_CAPABLE and te is not None: try: ok, reason = te.fp8.

check_fp8_support() FP8_CAPABLE = bool(ok) if not ok: print(">> TE reports FP8 unsupported:", reason) except Exception: pass print(f">> Mode: TE={'ON' if TE_CAPABLE else 'OFF'} | " f"FP8={'ON' if FP8_CAPABLE else 'OFF (will use BF16)'}") torch.manual_seed(1234) if TE_CAPABLE: H = 768 x_demo = torch.

randn(8, 32, H, device=DEVICE, dtype=torch.bfloat16) lin = te.Linear(H, H, bias=True, params_dtype=torch.bfloat16).to(DEVICE) ln = te.LayerNorm(H, params_dtype=torch.bfloat16).to(DEVICE) ln_lin = te.LayerNormLinear(H, 3 * H, params_dtype=torch.bfloat16).to(DEVICE) ln_mlp = te.

LayerNormMLP(H, 4 * H, params_dtype=torch.bfloat16).to(DEVICE) with torch.no_grad(): print("\n>> Module tour (shapes):") print(" te.Linear ", tuple(lin(x_demo).shape)) print(" te.LayerNorm ", tuple(ln(x_demo).shape)) print(" te.LayerNormLinear", tuple(ln_lin(x_demo).shape)) print(" te.

LayerNormMLP ", tuple(ln_mlp(x_demo).shape)) del lin, ln, ln_lin, ln_mlp, x_demo gc.collect(); torch.cuda.empty_cache() fp8_recipe = None if FP8_CAPABLE: fp8_recipe = recipe.DelayedScaling( fp8_format=recipe.Format.

HYBRID, amax_history_len=16, amax_compute_algo="max", ) print("\n>> FP8 recipe:", fp8_recipe) We install NVIDIA Transformer Engine and initialize the PyTorch environment required for GPU-accelerated execution.

We inspect the active GPU, compute capability, and memory capacity to determine whether fused TE kernels and FP8 tensor cores are available.We also validate the core fused modules and configure a delayed-scaling FP8 recipe while preserving an automatic PyTorch fallback for unsupported hardware.

Copy CodeCopiedUse a different BrowserVOCAB, D_MODEL, N_HEADS, N_LAYERS, FFN, SEQ = 96, 768, 12, 4, 3072, 256 class MiniGPT_TE(nn.Module): """Causal LM where every block is a single fused te.TransformerLayer.""" def __init__(self): super().__init__() self.emb = nn.Embedding(VOCAB, D_MODEL) self.

pos = nn.Embedding(SEQ, D_MODEL) self.blocks = nn.ModuleList([ te.TransformerLayer( hidden_size=D_MODEL, ffn_hidden_size=FFN, num_attention_heads=N_HEADS, self_attn_mask_type="causal", layer_number=i + 1, params_dtype=torch.bfloat16, hidden_dropout=0.0, attention_dropout=0.

0, ) for i in range(N_LAYERS) ]) self.ln_f = nn.LayerNorm(D_MODEL) self.head = nn.Linear(D_MODEL, VOCAB, bias=False) def forward(self, idx): B, T = idx.shape h = self.emb(idx) + self.pos(torch.arange(T, device=idx.device)) h = h.to(torch.bfloat16) for blk in self.blocks: h = blk(h) h = self.ln_f(h.

float()) return self.head(h) class Block_PT(nn.Module): """Plain-PyTorch transformer block, mirrors te.TransformerLayer.""" def __init__(self): super().__init__() self.ln1 = nn.LayerNorm(D_MODEL) self.attn = nn.MultiheadAttention(D_MODEL, N_HEADS, batch_first=True) self.ln2 = nn.

LayerNorm(D_MODEL) self.mlp = nn.Sequential(nn.Linear(D_MODEL, FFN), nn.GELU(), nn.Linear(FFN, D_MODEL)) def forward(self, x, mask): a, _ = self.attn(self.ln1(x), self.ln1(x), self.ln1(x), attn_mask=mask, need_weights=False) x = x + a return x + self.mlp(self.ln2(x)) class MiniGPT_PT(nn.

Module): def __init__(self): super().__init__() self.emb = nn.Embedding(VOCAB, D_MODEL) self.pos = nn.Embedding(SEQ, D_MODEL) self.blocks = nn.ModuleList([Block_PT() for _ in range(N_LAYERS)]) self.ln_f = nn.LayerNorm(D_MODEL) self.head = nn.

Linear(D_MODEL, VOCAB, bias=False) def forward(self, idx): B, T = idx.shape mask = torch.triu(torch.full((T, T), float("-inf"), device=idx.device), diagonal=1) h = self.emb(idx) + self.pos(torch.arange(T, device=idx.device)) for blk in self.blocks: h = blk(h, mask) return self.head(self.

ln_f(h)) model = (MiniGPT_TE() if TE_CAPABLE else MiniGPT_PT()).to(DEVICE) n_params = sum(p.numel() for p in model.parameters()) print(f"\n>> Model: {'TE fused' if TE_CAPABLE else 'pure PyTorch'} | " f"{n_params/1e6:.

1f}M params | {N_LAYERS} layers x {D_MODEL}d") We define a compact causal language model using fused te.TransformerLayer blocks for Transformer Engine execution.

We also implement an equivalent pure-PyTorch transformer architecture with multi-head attention, layer normalization, residual connections, and feed-forward networks.

We select the appropriate model dynamically according to GPU support and report the final parameter count and architectural dimensions.Copy CodeCopiedUse a different Browserdef make_batch(bsz=16): phase = torch.randint(0, VOCAB, (bsz, 1)) stride = torch.randint(1, 7, (bsz, 1)) steps = torch.

arange(SEQ + 1).unsqueeze(0) seq = (phase + stride * steps) % VOCAB return seq[:, :-1].to(DEVICE), seq[:, 1:].to(DEVICE) opt = torch.optim.AdamW(model.parameters(), lr=3e-4) def run_step(x, y, use_fp8): if TE_CAPABLE and use_fp8: with te.

fp8_autocast(enabled=True, fp8_recipe=fp8_recipe): logits = model(x) else: logits = model(x) loss = F.cross_entropy(logits.float().reshape(-1, VOCAB), y.reshape(-1)) opt.zero_grad(set_to_none=True) loss.backward() opt.step() return loss.

item() print(f"\n>> Training 60 steps ({'FP8' if FP8_CAPABLE else 'BF16/FP32'})...") t0 = time.time() for step in range(1, 61): x, y = make_batch() loss = run_step(x, y, use_fp8=FP8_CAPABLE) if step % 10 == 0: print(f" step {step:3d} | loss {loss:.4f} | " f"{(time.time()-t0)/step*1000:.

0f} ms/step") print(f">> Final loss: {loss:.4f} (random guess would be ~{math.log(VOCAB):.2f})") We create deterministic arithmetic-pattern sequences that allow the model to learn predictable token transitions across the vocabulary.

We configure the AdamW optimizer and implement a training step that conditionally wraps the forward pass in te.fp8_autocast when FP8 execution is supported.We train the model for multiple iterations, monitor the loss and step latency, and compare the final loss against the random-guess baseline.

Copy CodeCopiedUse a different Browserdef bench(use_fp8, iters=30, warmup=10): x, y = make_batch(bsz=32) for _ in range(warmup): r

Related

相關文章

六巨頭定AI插件新標準,撞臉Claude,Anthropic沒上桌

六大科技巨頭(AWS、Anysphere、GitHub、微軟、OpenAI、Vercel)聯合發布AI智能體插件統一開放規範Agent Plugins 1.0.0,旨在統一插件打包格式,減少開發者重複勞動。該規範的結構與Anthropic的Claude Code插件系統高度相似,但Anthropic並未參與制定,而是繼續經營自己的封閉生態。

2 小時前
鈦媒體生成式AI

DeepSeek重啟融資,三年市值對齊騰訊?

DeepSeek重啟第二輪融資,以5000億元人民幣估值尋求籌集80億美元,但網傳一份由小型醫藥私募發起的專項基金募資材料引發網友質疑,後經DeepSeek員工證實部分數據屬實。該公司近期宣布API大幅漲價,可能打破其以低價換規模的估值邏輯,面臨客戶流失風險。市場關注其能否從「價格屠夫」轉型為價值提供商,以及三年內市值能否對齊騰訊等巨頭。

3 小時前

可靈AI核心技術骨幹王鑫濤被曝離職

快手可靈AI核心技術骨幹王鑫濤被曝離職,去向未知,快手官方與本人均未回應。王鑫濤是圖像與視頻生成領域知名開源項目主要作者,被視為可靈從0到1的關鍵推手。其離職發生在可靈完成獨立融資、估值180億美元的關鍵階段,可能影響研發進度與競爭優勢。

3 小時前

AI短劇、漫劇、戀綜、電影、藝人都有了,AI觀眾也不遠了

2026年AI影視內容全面爆發,從短劇、長劇到電影、綜藝,AI製作的作品大量湧現,衛視也開始播出AI短劇。AI演員如方桃子迅速走紅,商業變現能力驚人,廣告報價甚至超過許多真人網紅。AI短劇市場規模已突破220億元,用戶超過6億,但同時也引發了對真人演員就業和內容品質的擔憂。

3 小時前