写给前端的 CANN-torchtitan-npu:昇腾PyTorch Titan适配到底是啥?
之前做大模型训练,兄弟问我:"哥,我想用 PyTorch 原生训练大模型,昇腾上能跑吗?"
我说能,用 torchtitan-npu。
好问题。今天一次说清楚。
torchtitan-npu 是啥?
torchtitan-npu 是 PyTorch Titan 的昇腾 NPU 适配版。让你用 PyTorch 原生方式训练大模型。
一句话说清楚:torchtitan-npu 是 PyTorch Titan 的昇腾适配,支持 LLaMA、GPT、Falcon 等大模型训练。
你说气人不气人,之前训练大模型要改大量代码适配昇腾,现在几乎不用改。
为什么需要 torchtitan-npu?
三种情况:
1. 大模型训练
LLaMA、GPT、Falcon... 这些大模型训练。
2. 分布式训练
数据并行、张量并行、流水线并行... 都支持。
3. 混合精度训练
FP16、BF16、FP8... 混合精度加速。
torchtitan-npu 核心能力
1. 大模型训练
支持主流大模型训练。
python
import torch
import torch_npu
from torchtitan_npu import LLaMA, GPT, Falon
# LLaMA 训练
model = LLaMA(
vocab_size=32000,
hidden_size=4096,
num_hidden_layers=32,
num_attention_heads=32
).npu()
# 准备数据
train_loader = ...
# 优化器
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4)
# 训练循环
for epoch in range(num_epochs):
for batch in train_loader:
input_ids = batch['input_ids'].npu()
labels = batch['labels'].npu()
outputs = model(input_ids=input_ids, labels=labels)
loss = outputs.loss
loss.backward()
optimizer.step()
optimizer.zero_grad()
你说气人不气人,几乎不用改代码,直接跑大模型训练。
2. 分布式训练
支持多种并行策略。
python
import torch
import torch.distributed as dist
from torchtitan_npu import DistributedTrainer
# 初始化进程组
dist.init_process_group(backend='hccl')
# 数据并行
model = LLaMA(...)
model = torch.nn.parallel.DistributedDataParallel(model)
# 张量并行(Column/Row Parallel)
from torchtitan_npu.parallel import ColumnParallelLinear, RowParallelLinear
class ParallelLLaMALayer(torch.nn.Module):
def __init__(self, hidden_size, num_heads):
super().__init__()
self.attn_qkv = ColumnParallelLinear(hidden_size, 3 * hidden_size)
self.attn_output = RowParallelLinear(hidden_size, hidden_size)
def forward(self, x):
qkv = self.attn_qkv(x)
# ... 分割 qkv
output = self.attn_output(attn_output)
return output
# 流水线并行
from torchtitan_npu.pipeline import PipelineParallel
model = torch.nn.Sequential(
LLaMALayer1(...),
LLaMALayer2(...),
LLaMALayer3(...)
)
model = PipelineParallel(model, num_stages=3)
3. 混合精度训练
FP16、BF16、FP8 都支持。
python
import torch
import torch_npu
from torchtitan_npu import MixedPrecisionTrainer
# FP16 混合精度
trainer = MixedPrecisionTrainer(
model=model,
optimizer=optimizer,
precision='fp16',
loss_scale=128.0 # 防止下溢
)
# BF16 混合精度(更稳定)
trainer = MixedPrecisionTrainer(
model=model,
optimizer=optimizer,
precision='bf16' # 不需要 loss scale
)
# FP8 混合精度(H100/Ascend 910B+)
trainer = MixedPrecisionTrainer(
model=model,
optimizer=optimizer,
precision='fp8', # 更快
fp8_format='e4m3fn' # 4 指数位,3 尾数位
)
# 训练
for batch in train_loader:
loss = trainer.train_step(batch)
print(f"Loss: {loss.item():.4f}")
4. 激活检查点
节省内存。
python
import torch
import torch_npu
from torchtitan_npu import ActivationCheckpointing
# 启用激活检查点
model = LLaMA(...)
model = ActivationCheckpointing.apply(
model,
checkpoint_fn=torch.utils.checkpoint.checkpoint,
# 只对部分层做检查点
checkpoint_layers=[0, 1, 2, 3] # 前 4 层做检查点
)
# 训练(内存节省 30-50%)
for batch in train_loader:
loss = model(batch)
loss.backward()
optimizer.step()
5. Flash Attention
加速注意力计算。
python
import torch
import torch_npu
from torchtitan_npu import FlashAttention
# 启用 Flash Attention
model = LLaMA(
use_flash_attention=True, # 启用
attention_impl=FlashAttention # 使用 Flash Attention 实现
)
# 手动调用 Flash Attention
from torchtitan_npu.ops import flash_attention
q = torch.randn(1, 32, 4096, 128).npu()
k = torch.randn(1, 32, 4096, 128).npu()
v = torch.randn(1, 32, 4096, 128).npu()
output = flash_attention(q, k, v) # 快 5-10x
6. MoE(混合专家)
训练 MoE 模型。
python
import torch
import torch_npu
from torchtitan_npu import MoELayer
# MoE 层
class MoETransformerLayer(torch.nn.Module):
def __init__(self, hidden_size, num_experts=8, top_k=2):
super().__init__()
self.attn = torch.nn.MultiheadAttention(hidden_size, num_heads=32)
self.moe = MoELayer(
input_size=hidden_size,
num_experts=num_experts,
top_k=top_k, # 每个 token 选 top_k 个专家
expert_capacity=32 # 每个专家最多处理 32 个 token
)
self.ln = torch.nn.LayerNorm(hidden_size)
def forward(self, x):
x = x + self.attn(x)
x = x + self.moe(x)
x = self.ln(x)
return x
# 训练 MoE 模型
model = MoETransformerLayer(hidden_size=4096)
# ...
性能数据
在昇腾 910B(8 卡)上训练 LLaMA-7B:
| 并行策略 | 吞吐量(tokens/s) | 加速比 |
|---|---|---|
| 数据并行(DP) | 1200 | 1.0x |
| 张量并行(TP) | 1800 | 1.5x |
| 流水线并行(PP) | 2000 | 1.67x |
| 3D 并行(DP+TP+PP) | 3200 | 2.67x |
| + Flash Attention | 4500 | 3.75x |
| + MoE | 6000 | 5.0x |
你说气人不气人,3D 并行 + Flash Attention + MoE,吞吐量提升 5 倍。
怎么用?
方式一:从源码安装
bash
# 克隆仓库
git clone https://atomgit.com/cann/torchtitan-npu.git
cd torchtitan-npu
# 安装依赖
pip install -r requirements.txt
# 安装
python setup.py develop
方式二:Docker 容器
bash
# 拉取镜像
docker pull cann/torchtitan-npu:latest
# 启动容器
docker run -it --ipc=host --network=host \
--device=/dev/davinci0 \
--device=/dev/davinci1 \
--device=/dev/davinci2 \
--device=/dev/davinci3 \
cann/torchtitan-npu:latest
方式三:直接训练
bash
# 单卡训练
python train.py --model=llama-7b --device=npu
# 多卡训练(数据并行)
torchrun --nproc_per_node=8 train.py \
--model=llama-7b \
--device=npu \
--distributed
# 3D 并行训练
torchrun --nproc_per_node=8 train.py \
--model=llama-7b \
--tp_size=2 \
--pp_size=2 \
--dp_size=2 \
--device=npu
总结
torchtitan-npu 就是 PyTorch Titan 的昇腾适配:
- 大模型训练:LLaMA、GPT、Falcon...
- 分布式训练:DP、TP、PP、3D 并行
- 混合精度:FP16、BF16、FP8
- Flash Attention:加速注意力
- MoE:混合专家模型