Flan-T5 Ascend 910 推理性能优化实战(Autoresearch 版)
约束与前提
- 时间预算:5 小时(终端限时)
- 版本管理:Git 全链路追踪,每个实验 = 一个 commit/branch
- 自动回滚:性能/精度回退时自动
git checkout 恢复
- 双路径:Path A(torch_npu 在线)与 Path B(OM 离线)并行探索
- 精度红线:与 GPU/CPU 误差 < 1%,不达标立即回滚
- AtomGit 提交:测试 token 推送能力后决定是否自动推送
Autoresearch 核心机制
1. Experiment-as-Commit
# 每个优化尝试前自动创建分支
git checkout -b exp/flan-t5_{optimization}_$(date +%s)
# 修改代码 → 运行 → 记录结果 → commit
git add -A && git commit -m "exp(...): ...
- metric_primary: XX → XX
- metric_accuracy_diff: XX
- status: PASS/FAIL
"
2. 结构化结果记录(results.json)
{
"experiment_id": "exp_001_fln_t5_env",
"timestamp": "2026-05-14T15:00:00Z",
"hypothesis": "TASK_QUEUE_ENABLE=2 + CPU_AFFINITY_CONF=2 可提升推理吞吐",
"changes": [],
"metrics": {
"throughput_samples_per_sec": 12.5,
"latency_p50_ms": 78.0,
"latency_p99_ms": 95.0,
"bleu_diff": 0.001,
"memory_mb": 4200
},
"status": "PASS",
"commit_hash": "a1b2c3d"
}
3. 自动对比与自动回滚
if current.throughput > best.throughput * 1.05 and current.bleu_diff < 0.01:
git_merge_to_main()
best = current
else:
git_checkout_main() # 丢弃当前实验分支
4. 时间预算分配
| 时间段 | 阶段 | 预算 | 说明 |
|---|
| 0:00-0:30 | 启动准备 | 0.5小时 | 代码克隆、环境配置、基线测试、git初始化 |
| 0:30-1:30 | 路径A快速优化 | 1小时 | torch_npu亲和算子适配 + 环境变量配置 |
| 1:30-2:30 | 路径B模型转换 | 1小时 | ONNX → ATC → OM(可选流程) |
| 2:30-3:30 | 性能分析闭环 | 1小时 | L1级性能分析 → 瓶颈定位 → 运行时优化 |
| 3:30-4:30 | 方案择优与验证 | 1小时 | 双路径效果对比、最终精度验收 |
| 4:30-5:00 | 成果交付与提交 | 0.5小时 | 编写SKILL.md文档、推送至AtomGit |
/goal 闭环定义
goal: "Flan-T5 Ascend 910 推理性能达标且精度误差<1%"
termination:
success: throughput >= baseline_target AND bleu_diff < 0.01
failure: time_budget_exceeded (5h) OR consecutive_rollbacks >= 5
metrics:
primary: throughput # samples/sec 或 tokens/sec
secondary: latency_p50_ms, latency_p99_ms
guardrail: bleu_diff, memory_mb
loop:
interval: "每个实验完成后立即评估"
max_iterations: 50
actions:
on_pass: git merge → update best → generate_next_hypothesis
on_fail: git rollback → log_failure → try_alternative_path
on_timeout: package_current_best → submit_deliverables
阶段 0:启动(0:00-0:30)
0.1 环境检查
npu-smi info
python -c "import torch; import torch_npu; print(torch_npu.__version__)"
0.2 克隆与初始化
cd /workspace
git clone https://ai.gitcode.com/hf_mirrors/google/flan-t5-base flan-t5-ascend
cd flan-t5-ascend
pip install -r requirements.txt # 或 transformers, torch, datasets
git init
git add -A && git commit -m "init: clone flan-t5 upstream"
0.3 基线跑测 → 自动提交
python eval/baseline_run.py --device npu --batch 1,8,16
生成 results/baseline.json,并自动提交。
0.4 创建 main-best 分支
第一阶段:路径 A — torch_npu 在线优化(0:30-1:30)
优化优先级(按预期收益排序)
实验 1:环境变量优化(预期提升 +5~15%)
git checkout -b exp/env_optimization
git checkout main-best -- .
export TASK_QUEUE_ENABLE=2
export CPU_AFFINITY_CONF=2
python eval/perf_eval.py --device npu
实验 2:LayerNorm → npu_add_layer_norm(预期提升 3%~8%)
git checkout -b exp/npu_add_layer_norm
# 修改 modeling_t5.py 中 T5LayerNorm 的 forward
# 注意:T5 实际使用 T5LayerNorm(RMSNorm 变体),先确认具体实现
python eval/perf_eval.py
实验 3:注意力 → npu_fusion_attention(预期提升 +10~20%,需使用 fp16/bf16)
git checkout -b exp/npu_fusion_attention
# 修改 T5Attention.forward,替换手动 Q@K^T → softmax → @V
# 构建 causal_mask 和 padding_mask
# input_layout="BSND"
python eval/perf_eval.py --dtype bf16
实验 4:FFN → npu_ffn(预期提升 +5~15%,需支持 fp16/bf16)
git checkout -b exp/npu_ffn
# 修改 T5DenseGatedActDense / T5DenseActDense
# 提取 weight,调用 torch_npu.npu_ffn
python eval/perf_eval.py --dtype bf16
实验 5:permute/transpose + contiguous(预期提升 +1~3%)
git checkout -b exp/contiguous_layout
# 全图扫描补 .contiguous()
python eval/perf_eval.py
时间控制
- 每个实验最多 10 分钟
- 1 小时内完成 4-6 个实验
- 如果前 2 个实验均失败,立即切换到 Path B
第二阶段:Path B — OM 离线转换(1:30-2:30)
2.1 PyTorch → ONNX
git checkout -b exp/om_conversion
git checkout main-best -- .
# 使用 transformers.onnx 导出
python -m transformers.onnx --model=google/flan-t5-base --feature=seq2seq-lm onnx/
python eval/compare_onnx_torch.py
2.2 ONNX → OM(ATC)
bash om_model/atc_convert.sh
# 若失败 → 调整 opset / 简化图 / 修改输入 shape → 重试
# 最多 3 次尝试
2.3 ACL 推理脚本
python inference_acl.py --model om_model/flan-t5-base.om --device npu
python eval/perf_eval.py --backend acl
2.4 评估与决策
- OM 精度达标且吞吐量 > Path A 最优值 → 合并
- OM 精度不达标 → 保留分支但回滚
- OM 转换失败 → 丢弃分支,Path A 作为最终方案
阶段 3:性能分析驱动优化(2:30-3:30)
3.1 L1 性能分析数据采集
import torch_npu
prof = torch_npu.profiler.profile(
activities=[torch_npu.profiler.ProfilerActivity.CPU,
torch_npu.profiler.ProfilerActivity.NPU],
on_trace_ready=torch_npu.profiler.tensorboard_trace_handler("./Profiling_L1"),
schedule=torch_npu.profiler.schedule(wait=0, warmup=0, active=1, repeat=1),
experimental_config=torch_npu.profiler._ExperimentalConfig(
aic_metrics=torch_npu.profiler.AiCMetrics.PipeUtilization,
profiler_level=torch_npu.profiler.ProfilerLevel.Level1,
l2_cache=False
),
record_shapes=True, profile_memory=False
)
3.2 自动解析瓶颈
python eval/parse_profiling.py --input ./Profiling_L1 --output results/profiling_top_ops.json
3.3 运行时优化实验(按需启用)
| 实验 | 环境变量 | 触发条件 |
|---|
| exp/task_queue | TASK_QUEUE_ENABLE=2 | 性能分析显示空闲时间占比 > 20% |
| exp/cpu_affinity | CPU_AFFINITY_CONF=2 | CPU 调度开销高 |
| exp/tcmalloc | LD_PRELOAD=libtcmalloc.so | malloc 热点 |
| exp/alloc_conf | PYTORCH_NPU_ALLOC_CONF=max_split_size_mb:512 | 显存碎片 |
| exp/fp16 | torch.float16 AMP | 模型支持且精度允许 |
阶段 4:择优与最终验证(3:30-4:30)
4.1 双路径对比表
python eval/final_compare.py
# 输出:Path A vs Path B 的 throughput、latency、精度差异
4.2 精度最终验收
- 在验证数据集(如 SAMSum、XSum 摘要任务)上执行完整推理
- 对比 NPU、GPU 与 CPU 的 BLEU/ROUGE 指标
- 指标要求:
bleu_diff < 0.01
4.3 确定最终方案
- 选择
吞吐量最高且精度达标的 commit
- 执行
git tag v1.0-optimized
- 执行
git checkout v1.0-optimized
阶段 5:交付与 AtomGit 提交(4:30-5:00)
5.1 交付件生成
mkdir -p deliverables
cp inference.py deliverables/
cp readme.md deliverables/
cp -r eval/ deliverables/
cp -r logs/ deliverables/
cp SKILL.md deliverables/
5.2 AtomGit 提交测试
REPO_URL="https://oauth2:${ATOMGIT_USER_TOKEN}@gitcode.com/yourname/flan-t5-ascend.git"
git remote add origin "$REPO_URL"
git push -u origin main
5.3 结果报告
cat results/final_report.md
关键脚本清单
| 脚本 | 功能 |
|---|
eval/baseline_run.py | 跑基线 |
eval/perf_eval.py | 性能评测:samples/sec、延迟、显存 |
eval/accuracy_eval.py | 精度评测:BLEU、ROUGE |
eval/compare_gpu_cpu.py | 三端对比 |
eval/parse_profiling.py | 解析 profiling |
eval/final_compare.py | 双路径最终对比 |
eval/auto_experiment.py | autoresearch 主循环 |
om_model/export_onnx.py | ONNX 导出 |
om_model/atc_convert.sh | ATC 转换 |
inference_acl.py | ACL 推理入口 |
inference.py | 最终交付推理脚本 |
readme.md | 部署文档 |
SKILL.md | 优化记录与复现指南(本文件) |
回滚策略
if experiment.bleu_diff > 0.01:
rollback("精度超标")
elif experiment.throughput < best.throughput * 0.95:
rollback("性能倒退 > 5%")
elif experiment.memory_mb > best.memory_mb * 1.3:
rollback("显存暴涨 > 30%")
elif experiment.latency_p99_ms > best.latency_p99_ms * 1.2:
rollback("尾部延迟恶化 > 20%")
else:
merge_to_main_best()
时间熔断机制
| 时间节点 | 熔断动作 |
|---|
| 1h | Path A 无成功实验 → 全力投入 Path B |
| 2h | Path B OM 转换失败 → 放弃 Path B,Path A + profiling 兜底 |
| 3h | 仍无达标方案 → 启用激进优化(降低精度阈值到 2%) |
| 4h | 仍未达标 → 锁定当前 best,开始生成交付件 |
| 4.5h | 停止所有实验,全力完成交付 |
| 5h | 强制终止,提交当前最优结果 |