CANN性能基线建立指南

发布时间:2026/7/16 6:49:38

CANN性能基线建立指南 性能基线建立指南【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills本文档提供详细的性能基线建立方法用于对比 SuperKernel 优化前后的性能差异。为什么需要性能基线性能基线是评估优化效果的参照标准量化提升精确计算性能提升比例问题定位性能下降时快速定位问题方案对比对比不同 Scope 策略的效果回归测试确保后续修改不影响性能性能指标核心指标指标说明单位重要性Decode 单步耗时生成一个 token 的时间ms 高吞吐量每秒生成的 token 数tokens/s 高首 token 延迟Prefill 阶段耗时ms 中内存占用推理时的显存使用GB 中编译时间torch.compile 耗时s 低辅助指标指标说明用途CPU 使用率CPU 占用百分比识别 CPU 瓶颈NPU 利用率NPU 计算资源使用率识别 NPU 瓶颈通信开销多卡场景的通信时间优化并行策略基线建立流程步骤 1准备测试环境1.1 确认硬件配置# 查看 NPU 信息 npu-smi info # 确认硬件型号 # 应该是 Atlas A3 系列1.2 确认软件版本# CANN 版本 cat /usr/local/Ascend/ascend-toolkit/latest/version.cfg # PyTorch 版本 python -c import torch; print(torch.__version__) # torch_npu 版本 python -c import torch_npu; print(torch_npu.__version__)1.3 设置环境变量source /usr/local/Ascend/ascend-toolkit/latest/bin/setenv.bash export PYTHONPATH/path/to/cann-recipes-infer:$PYTHONPATH步骤 2配置基线测试2.1 禁用 SuperKernel修改config.yamlexe_mode: ge_graph # 保持图模式 model_config: enable_superkernel: False # 禁用 SuperKernel enable_multi_streams: False # 禁用其他优化 enable_cache_compile: False2.2 配置测试参数# 推理配置 batch_size: 1 # 固定 batch size max_new_tokens: 100 # 固定生成长度 temperature: 0.0 # 固定采样参数确保可复现 top_p: 1.0 top_k: 1 # 数据集配置 dataset: custom # 使用固定的测试数据 prompt: 请介绍一下人工智能的发展历史。 # 固定 prompt2.3 准备测试脚本创建scripts/benchmark_baseline.sh#!/bin/bash # 设置环境 source /usr/local/Ascend/ascend-toolkit/latest/bin/setenv.bash # 进入模型目录 cd cann-recipes-infer/models/${MODEL_NAME} # 运行基线测试 echo Running Baseline Test python -u cann-recipes-infer/models/runner_*.py \ --config config.yaml \ --output baseline_output.json \ 21 | tee baseline.log # 提取性能数据 python ../../scripts/extract_performance.py baseline.log baseline_performance.json echo Baseline Test Complete cat baseline_performance.json步骤 3运行基线测试3.1 预热运行# 第一次运行预热不计入统计 bash scripts/benchmark_baseline.sh # 等待编译完成3.2 正式测试# 运行 3-5 次取平均值 for i in {1..5}; do echo Run $i bash scripts/benchmark_baseline.sh sleep 5 done # 计算平均值 python scripts/calculate_average.py baseline_performance_*.json baseline_avg.json步骤 4记录基线数据4.1 性能数据格式创建baseline_performance.json{ test_info: { model_name: deepseek-r1, hardware: Atlas A3, cann_version: 8.3.RC1, pytorch_version: 2.6.0, torch_npu_version: 2.6.0, test_date: 2026-03-30, config: { exe_mode: ge_graph, enable_superkernel: false, batch_size: 1, max_new_tokens: 100 } }, performance: { decode_latency_ms: 15.2, throughput_tokens_per_sec: 65.8, prefill_latency_ms: 120.5, memory_usage_gb: 24.3, compile_time_sec: 45.2 }, statistics: { runs: 5, decode_latency_std: 0.3, throughput_std: 1.2 } }4.2 日志文件保存完整的运行日志baseline.log- 完整输出baseline_performance.json- 性能数据baseline_output.json- 模型输出步骤 5验证基线稳定性5.1 检查波动import json import numpy as np # 读取多次运行的数据 data [] for i in range(1, 6): with open(fbaseline_performance_{i}.json) as f: data.append(json.load(f)[performance][decode_latency_ms]) # 计算统计量 mean np.mean(data) std np.std(data) cv std / mean * 100 # 变异系数 print(fMean: {mean:.2f} ms) print(fStd: {std:.2f} ms) print(fCV: {cv:.2f}%) # 判断稳定性 if cv 5: print(✓ 基线稳定) else: print(✗ 基线波动较大建议重新测试)5.2 稳定性标准变异系数 (CV)稳定性建议 5%优秀可以使用5% - 10%良好可以使用注意波动10% - 20%一般建议增加测试次数 20%较差需要排查环境问题优化后性能测试步骤 1启用 SuperKernel修改config.yamlexe_mode: ge_graph model_config: enable_superkernel: True # 启用 SuperKernel # 其他配置保持与基线一致步骤 2运行优化测试# 使用相同的测试脚本 bash scripts/benchmark_optimized.sh # 运行多次取平均 for i in {1..5}; do echo Run $i bash scripts/benchmark_optimized.sh sleep 5 done python scripts/calculate_average.py optimized_performance_*.json optimized_avg.json步骤 3性能对比创建scripts/compare_performance.pyimport json # 读取基线和优化后的数据 with open(baseline_avg.json) as f: baseline json.load(f) with open(optimized_avg.json) as f: optimized json.load(f) # 计算性能提升 def calculate_improvement(baseline_val, optimized_val, lower_is_betterTrue): if lower_is_better: improvement (baseline_val - optimized_val) / baseline_val * 100 else: improvement (optimized_val - baseline_val) / baseline_val * 100 return improvement # 对比各项指标 metrics { decode_latency_ms: True, # lower is better throughput_tokens_per_sec: False, # higher is better memory_usage_gb: True, } print( Performance Comparison \n) for metric, lower_is_better in metrics.items(): baseline_val baseline[performance][metric] optimized_val optimized[performance][metric] improvement calculate_improvement(baseline_val, optimized_val, lower_is_better) print(f{metric}:) print(f Baseline: {baseline_val:.2f}) print(f Optimized: {optimized_val:.2f}) print(f Improvement: {improvement:.2f}%) print() # 生成对比报告 report { baseline: baseline, optimized: optimized, improvements: {} } for metric, lower_is_better in metrics.items(): baseline_val baseline[performance][metric] optimized_val optimized[performance][metric] improvement calculate_improvement(baseline_val, optimized_val, lower_is_better) report[improvements][metric] { baseline: baseline_val, optimized: optimized_val, improvement_percent: improvement } with open(performance_comparison.json, w) as f: json.dump(report, f, indent2) print(Report saved to performance_comparison.json)性能分析工具工具 1NPU Profilerimport torch_npu # 启用 profiler torch_npu.npu.profile(use_npuTrue) with torch_npu.npu.profile(): output model(input_ids) # 查看性能报告 # 结果保存在 prof/ 目录工具 2CANN Profiler# 在 config.yaml 中启用 enable_profiler: True # 运行模型 bash infer.sh # 查看 profiling 结果 ls prof/工具 3自定义计时import time import torch_npu def benchmark_decode(model, input_ids, num_steps100): # 预热 for _ in range(10): _ model.decode(input_ids) # 正式测试 torch_npu.npu.synchronize() start time.time() for _ in range(num_steps): _ model.decode(input_ids) torch_npu.npu.synchronize() end time.time() avg_latency (end - start) / num_steps * 1000 # ms throughput num_steps / (end - start) # steps/s return { avg_latency_ms: avg_latency, throughput_steps_per_sec: throughput }性能报告模板完整报告结构# SuperKernel 性能测试报告 ## 测试环境 - 模型DeepSeek-R1 - 硬件Atlas A3 (8 卡) - CANN 版本8.3.RC1 - PyTorch 版本2.6.0 - 测试日期2026-03-30 ## 测试配置 - Batch Size: 1 - Max New Tokens: 100 - Scope 策略仅 Attention 模块 ## 性能对比 | 指标 | 基线 | 优化后 | 提升 | |------|------|--------|------| | Decode 单步耗时 | 15.2 ms | 12.8 ms | 15.8% | | 吞吐量 | 65.8 tokens/s | 78.1 tokens/s | 18.7% | | 内存占用 | 24.3 GB | 24.5 GB | -0.8% | ## 详细数据 ### 基线性能 - Decode 单步耗时15.2 ± 0.3 ms - 吞吐量65.8 ± 1.2 tokens/s - Prefill 延迟120.5 ms - 内存占用24.3 GB ### 优化后性能 - Decode 单步耗时12.8 ± 0.2 ms - 吞吐量78.1 ± 1.0 tokens/s - Prefill 延迟120.3 ms - 内存占用24.5 GB ## 结论 SuperKernel 优化在 Decode 阶段带来了 **15.8%** 的性能提升吞吐量提升 **18.7%**。内存占用基本持平。优化效果符合预期。 ## 下一步 - 尝试扩大 Scope 范围到全 Decoder 层 - 结合多流并行进一步优化 - 在更长序列上测试性能常见问题Q1: 基线性能波动大怎么办可能原因系统负载不稳定NPU 频率波动测试数据不一致解决方法关闭其他进程确保系统空闲固定 NPU 频率使用固定的测试数据和参数增加测试次数取中位数而非平均值Q2: 如何确保测试的公平性关键点使用相同的测试数据使用相同的配置参数除了 enable_superkernel在相同的环境下测试预热后再测试多次运行取平均值Q3: 性能提升不明显怎么办排查步骤确认 SuperKernel 是否真正启用查看日志检查 Scope 范围是否合适使用 profiler 分析瓶颈尝试不同的 Scope 策略结合其他优化技术最佳实践固定测试条件确保基线和优化测试使用完全相同的条件多次测试至少运行 3-5 次取平均值预热运行第一次运行不计入统计记录详细信息保存完整的配置、日志和性能数据版本控制使用 git 记录每次测试的代码版本自动化编写脚本自动化测试流程可视化使用图表展示性能对比参考资源Scope 分析指南scope-analysis-guide.md调试指南debugging-guide.md性能分析工具../../scripts/performance_analysis.py官方文档CANN 性能分析工具【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻