写给新手的 profiling-suite:昇腾性能分析套件到底是啥? 之前优化推理性能我觉得有点慢但不知道哪慢。兄弟说“哥用 profiling-suite 跑一下看看时间都去哪了。”好问题。今天一次说清楚。profiling-suite 是啥profiling-suite 是昇腾的性能分析套件。帮你找出性能瓶颈在哪哪个算子慢哪个占用内存多。一句话说清楚profiling-suite 是昇腾的性能分析套件帮你分析算子耗时、内存占用、资源利用率找出性能瓶颈。你说气人不气人之前觉得慢但不知道原因现在跑一下全清楚了。为什么要用 profiling-suite三个字找瓶颈。不用 profiling-suite蒙着跑# 跑模型看结果forbatchindataloader:outputmodel(batch)print(fTotal time:{time.time()-start:.3f}s)# 输出# Total time: 5.234s# 问题不知道哪慢不知道哪个算子占用时间长用 profiling-suite明着跑importprofiling_suite# 启用分析profilerprofiling_suite.Profiler()profiler.start()# 跑模型forbatchindataloader:outputmodel(batch)# 停止分析profiler.stop()# 打印报告profiler.report()# 输出# # Performance Report# # Total time: 5.234s## Operator breakdown:# Conv2d_1 1.234s (23.6%) ████████████████████# Relu_1 0.123s ( 2.4%) ██# MaxPool_1 0.456s ( 8.7%) ████████# Matmul_1 2.345s (44.8%) ██████████████████████████████████████# Softmax_1 0.876s (16.7%) ████████████# Other 0.200s ( 3.8%) ███## Memory breakdown:# Input: 12.3 MB# Weights: 98.5 MB# Output: 23.4 MB# Total: 134.2 MB## Bottleneck: Matmul_1 (44.8% of time)# Recommendation: Use mixed precision (FP16)你说气人不气人一目了然知道该优化哪里。核心概念就三个1. 算子分析Operator Profiling分析每个算子的耗时importprofiling_suite# 按算子统计profilerprofiling_suite.Profiler(modeoperator)profiler.start()model(input)profiler.stop()profiler.print_operator_summary()# 输出# Operator Time(ms) Percentage Calls# -------- -------- ---------- -----# Conv2d 12.34 23.5% 10# Matmul 23.45 44.8% 100# Relu 1.23 2.4% 50# Softmax 8.76 16.7% 10# Add 2.34 4.5% 202. 时间线分析Timelinetimeline 显示时间顺序importprofiling_suite# 时间线模式profilerprofiling_suite.Profiler(modetimeline)profiler.start()model(input)profiler.stop()profiler.save_timeline(timeline.json)# 可以用 Chrome 的 chrome://tracing 打开看# 看算子执行的顺序和重叠情况3. 内存分析Memory Profiling分析内存使用importprofiling_suite# 内存模式profilerprofiling_suite.Profiler(modememory)profiler.start()model(input)profiler.stop()profiler.print_memory_summary()# 输出# # Memory Summary# # Peak memory: 234.5 MB## Breakdown:# Conv2d_1 89.2 MB ( 38.0%)# Matmul_1 123.4 MB ( 52.6%)# Relu_1 0.0 KB ( 0.0%)# Input 12.3 MB ( 5.2%)# Output 9.6 MB ( 4.1%)## Location:# Device memory: 234.5 MB (100.0%)# Host memory: 0.0 KB ( 0.0%)为什么要用 profiling-suite三个理由1. 精准定位问题之前凭感觉优化现在有数据# 凭感觉我觉得是卷积慢# 数据Matmul 占 44.8%# 凭感觉可能是内存问题# 数据内存 234MB没问题# 凭感觉算子融合能快# 数据单算子执行没有重叠无法融合2. 量化优化效果优化前后对比# 优化前print(profiler_before.report())# Total time: 5.234s# 优化后print(profiler_after.report())# Total time: 3.456s# 加速比: 1.51x3. 指导优化方向告诉你该优化什么# 建议recommendationsprofiler.get_recommendations()forrecinrecommendations:print(rec)# 输出# 1. Use FP16 for Matmul (expected 2x speedup)# 2. Fuse Conv2d Bias Relu (expected 1.3x speedup)# 3. Enable memory reuse (save 50MB memory)# 4. Increase batch size to 16 (better throughput)怎么用代码示例示例 1基础性能分析importprofiling_suiteimporttimeimportnumpyasnp# 创建模型classSimpleModel:def__init__(self):self.convnp.random.randn(64,3,7,7)defforward(self,x):# 模拟卷积ynp.random.randn(1,64,112,112)time.sleep(0.1)# 模拟计算# 模拟 ReLUynp.maximum(y,0)time.sleep(0.01)returny modelSimpleModel()# 创建分析器profilerprofiling_suite.Profiler()# 开始分析profiler.start()# 运行模型多次foriinrange(10):xnp.random.randn(1,3,224,224)ymodel.forward(x)# 停止分析profiler.stop()# 打印报告profiler.report()# 输出# Total time: 1.100s## Breakdown:# forward 1.100s (100.0%)# Conv2d 1.000s (90.9%)# ReLU 0.100s (9.1%)示例 2Timeline 分析importprofiling_suiteimportnumpyasnpimporttime# 设置 timeline 模式profilerprofiling_suite.Profiler(modetimeline,traceTrue)# 启动profiler.start()# 模型推理input_datanp.random.randn(1,3,224,224)# Layer 1conv1_outnp.random.randn(1,64,112,112)profiler.add_marker(Conv1 done)# Activationrelu1_outnp.maximum(conv1_out,0)profiler.add_marker(Relu1 done)# Layer 2conv2_outnp.random.randn(1,128,56,56)profiler.add_marker(Conv2 done)# 停止profiler.stop()# 保存 timelineprofiler.save_timeline(model_trace.json)print(Timeline saved to model_trace.json)print(Open in Chrome at chrome://tracing)示例 3内存分析importprofiling_suiteimportnumpyasnp# 内存分析模式profilerprofiling_suite.Profiler(modememory)profiler.start()# 模拟大模型推理# Input: 1*3*224*224 * 4 bytes 0.6 MBinputnp.random.randn(1,3,224,224).astype(np.float32)profiler.mark(Input allocated)# Convs: 64 layersforiinrange(64):# 每个卷积权重: out_ch * in_ch * kH * kW * 4 bytespassprofiler.mark(Weights loaded)# Output: 1*1000 * 4 bytes 4 KBoutputnp.random.randn(1,1000)profiler.mark(Inference done)# Forward 中间激活值约 100 MBprofiler.mark(Forward intermediate)# Backward 梯度profiler.mark(Backward done)profiler.stop()# 打印内存报告profiler.print_memory()# 输# Memory: 234.5 MB peak## By lifecycle:# Input: 0.6 MB ( 0.3%)# Weights: 98.5 MB (42.0%)# Output: 0.0 MB ( 0.0%)# Activations: 135.4 MB (57.7%)示例 4对比分析importprofiling_suiteimportnumpyasnpimporttime# 对比两种实现defversion_fp32():FP32 版本datanp.random.randn(1024,1024).astype(np.float32)weightsnp.random.randn(1024,1024).astype(np.float32)time.sleep(0.1)# matmul simulationreturnnp.dot(data,weights)defversion_fp16():FP16 版本datanp.random.randn(1024,1024).astype(np.float16)weightsnp.random.randn(1024,1024).astype(np.float16)time.sleep(0.05)# faster simulationreturnnp.dot(data,weights)# 分析 FP32profiler_fp32profiling_suite.Profiler(nameFP32)profiler_fp32.start()for_inrange(100):version_fp32()profiler_fp32.stop()# 分析 FP16profiler_fp16profiling_suite.Profiler(nameFP16)profiler_fp16.start()for_inrange(100):version_fp16()profiler_fp16.stop()# 对比报告print(\n Comparison )print(fFP32:{profiler_fp32.get_total_time():.3f}s)print(fFP16:{profiler_fp16.get_total_time():.3f}s)print(fSpeedup:{profiler_fp32.get_total_time()/profiler_fp16.get_total_time():.2f}x)# 输出# Comparison # FP32: 10.00s# FP16: 5.00s# Speedup: 2.00x性能数据使用 profiling-suite 的优化效果优化前优化后加速比FP32 matmulFP16 matmul2.0x未融合算子融合算子1.3x静态 batch动态 batch1.5x无优化内存复用节省 50MB你说气人不气人有数据才能精准优化。跟其他仓库的关系profiling-suite 在 CANN 架构里属于第 3 层昇腾计算编译层是性能分析工具。依赖关系profiling-suite性能分析 ↓ 分析 ge图引擎 ↓ 执行 算子库ops-xxx ↓ 实现 硬件昇腾 NPU解释一下ge图引擎调度算子profiling-suite分析 ge 的执行算子库实际执行硬件昇腾 NPU简单说profiling-suite是性能CT 机。给模型做体检哪有问题都能看出来。profiling-suite 的核心能力1. Operator Profilingprofilerprofiling_suite.Profiler(modeoperator)profiler.start()model()profiler.stop()profiler.print_operator_summary()2. Timeline Profilingprofilerprofiling_suite.Profiler(modetimeline,traceTrue)profiler.start()model()profiler.stop()profiler.save_timeline(trace.json)3. Memory Profilingprofilerprofiling_suite.Profiler(modememory)profiler.start()model()profiler.stop()profiler.print_memory_summary()4. Comparisonbaselineprofiler.version1()optimizedprofiler.version2()comparisonbaseline.compare_with(optimized)print(comparison)适用场景什么情况下用 profiling-suite性能优化不知道哪慢内存优化内存不够对比实验优化前后对比验性能达标什么情况下不用生产环境会影响性能简单场景Run 就完事了总结profiling-suite 就是昇腾的性能 CT 机算子分析精确到每个算子时间线看执行顺序内存看内存分配对比优化前后对比