3. 昇腾精度排查工具链

精度调优这件事,说白了就是跟“误差”打交道。你想想看,模型在昇腾上跑出来的结果跟标杆对不上,到底差在哪?是某个算子算错了,还是整个网络累积了偏差?我个人习惯,先别急着改代码,先把工具链摸清楚。昇腾给了我们三把利器:精度比对工具(compare)、dump工具、profiling工具。这三样东西用熟了,定位精度问题就像有了导航。

昇腾精度排查工具链 精度比对工具 compare dump工具 数据转储 profiling工具 性能 & 精度 定位精度问题 → 数据流 + 算子输出 + 性能画像 三者配合:dump取数 → compare对比 → profiling定位瓶颈

3.1 精度比对工具(compare)—— 你的“照妖镜”

精度比对工具,我习惯叫它“compare”。它的核心任务就一个:把昇腾芯片上的算子输出跟标杆(比如GPU或者CPU上的结果)做逐元素对比。你想想看,如果某个算子的余弦相似度只有0.8,那肯定有问题。

我在项目中遇到过好几次,模型迁移后精度掉点,用compare一跑,发现是某个卷积算子的累加顺序不同导致的细微差异。嗯,这里要注意:compare工具支持多种比对模式,比如余弦相似度、最大绝对误差、相对误差。我个人建议,初次排查先用余弦相似度,快速筛出异常算子。

常用命令示例:
# 单算子精度比对
ascend_compare --input_file ./dump_data --benchmark ./gpu_data \
               --output ./compare_result --mode cosine

# 指定精度阈值,超过则告警
ascend_compare --input_file ./dump_data --benchmark ./gpu_data \
               --cosine_threshold 0.99 --max_abs_error 1e-3
💡 我的小技巧: 比对时最好把dump数据跟标杆数据放在同一目录结构下,命名规则保持一致。否则光整理文件就能浪费半天。我曾经因为文件名多了一个下划线,排查了俩小时……

3.2 dump工具 —— 把“黑盒”打开

dump工具说白了就是数据转储。你想看算子输入输出到底是什么数值,就得靠它。昇腾的dump工具可以按层、按迭代、按step来抓取张量数据。我个人习惯,在怀疑某个算子精度异常时,只dump那一个算子,避免数据量爆炸。

为什么会这样?因为全量dump一次可能产生几十GB数据,你想想看,光传输和存储就够头疼的。所以,精准dump才是王道。

⚠️ 避坑指南: 我曾经一次性dump了100个step的所有中间张量,结果磁盘直接爆满,训练都停了。后来我学乖了,用 --dump_step 5,10,15 只抓关键step。记住,dump是手段,不是目的。
# 配置dump参数(通过配置文件或环境变量)
export DUMP_CONFIG=./dump_cfg.json
# dump_cfg.json 示例
{
  "dump_mode": "layer",
  "dump_path": "/home/dump_data",
  "dump_step": "5,10",
  "dump_op": "Conv2D,MatMul"
}

3.3 profiling工具 —— 不止看性能,也看精度

很多人以为profiling只是看性能的,其实它也能辅助精度分析。profiling工具可以记录每个算子的执行时间、内存占用,同时还能捕捉到算子输入输出的tensor信息。你想想看,如果某个算子执行时间异常短,或者内存读写异常,往往意味着计算被优化掉了,精度可能跟着变。

我记得有一次,一个客户说模型精度不对,我打开profiling数据一看,发现某个融合算子被替换成了高性能但低精度的实现。这就是profiling给我们的线索。

工具核心能力适用场景
compare算子级/网络级精度比对定位具体哪个算子精度异常
dump张量数据转储获取中间层输入输出,做离线分析
profiling性能画像 + 算子信息发现异常优化、融合算子精度问题
三把斧头怎么配合? 我一般先跑一次profiling,看看有没有明显异常的算子(比如执行时间极短或极长)。然后针对可疑算子,用dump工具抓取它的输入输出。最后用compare工具跟标杆数据做比对。三步下来,90%的精度问题都能定位。

3.4 实战小记:一个真实案例

之前调一个BERT模型,精度掉点0.5%。我一开始毫无头绪。后来用profiling发现,LayerNorm算子的耗时只有标杆的一半——明显被“特殊优化”了。我立刻dump了该算子的输入,用compare一比对,发现均值和方差的计算顺序跟GPU不一样,导致精度偏差。最后通过关闭该算子的融合优化,精度就对齐了。

你看,工具链就是这样一环扣一环。没有dump,你拿不到数据;没有compare,你看不出差异;没有profiling,你甚至不知道从哪下手。

📌 我的建议: 刚开始接触昇腾的同学,别急着调精度。先花半天时间把这三种工具跑通,跑几个demo。我保证,后面调优会顺手很多。