图模式精度比对

精度比对流程

当PyTorch网络在昇腾NPU上进行图模式推理时,如果精度不满足预期,应该如何定位和分析问题?

首先进行问题定界,然后将复杂的整网精度问题转换为单个算子问题进行分析。

整体分析流程如下图所示,请根据实际情况逐一排查,目前核心原因集中在:

  • 算子成Ascend IR图后导致的精度问题:
    • 先在图外将单算子单独成图编译运行,确保单算子精度正常,这是定位图模式精度问题的前提。
  • Eager模式下模型存在精度问题:
    • Eager模式NPU和CPU分别运行进行精度比对。
  • 原生Dynamo导致的精度问题:
    • 排查Dynamo和算子Meta推导等是否正常。
  • 单个算子运行正常但局部结构成图后导致的精度问题:
    • 整网dump进行图模式与Eager模式比对,可使用精度比对工具(msit)进行比对,详见下节精度比对工具说明;
    • 工程师按经验分析拆除常见问题;
    • 对于GE图,可关闭算子融合规则(fusion_switch_file),排除算子融合问题,详见算子融合配置功能(fusion_switch_file)

图 1 精度问题分析流程

精度比对工具

说明: msit工具封装了TorchAir捕获编译过程中图结构和算子数据的相关配置,与算子data dump功能相比,简化了开发者的参数设置,并在此基础上提供了精度比对等高级功能。

MindStudio(msit工具包)推理工具链为开发者提供了一站式推理开发工具,包括模型压缩、推理数据dump、自动精度比对、性能调优等能力。

精度比对能力一般借助大模型推理精度工具(Large Language Model Debug Tool)实现,其软件包安装参考msit大模型推理精度工具,在“简介>工具列表”中获取精度自动比对功能介绍。

关键命令如下,此处仅为示例,请以开源仓的说明为准,全量参数介绍参见精度比对命令完整参数

msit llm compare -gp ${golden_data} -mp ${target_data} -o ${compare_result_dir}

表 1 关键命令参数

参数 说明
-gp,--golden-path 指定标杆数据所在路径,支持单个数据文件路径或文件夹。
-mp,--my-path 指定待比对的数据所在路径,即有精度问题的数据。支持单个数据文件路径或文件夹。
-o,--output 指定比对结果保存路径。

借助msit工具进行图模式与Eager模式下模型精度差异比对的原理如下图所示,具体过程可参考精度比对案例

精度比对案例

假设有一个PyTorch模型,在图模式下出现了精度异常。为确定问题来源,借助msit工具比对图模式与Eager模式下模型精度差异,请参见精度比对工具,具体操作步骤如下:

说明: 关于TorchAir图模式下FX图和GE图数据dump、compare等详细介绍,请参考msit大模型推理精度工具,在“简介>场景列表”中获取TorchAir场景-整网算子精度比对介绍。

  1. 环境准备,参考安装完成torch_npu安装和依赖的软件安装。

  2. 安装msit工具包里llm组件(大模型推理精度工具)。

    1. 首先安装msit工具。

      这里以源码安装为例,详细安装过程和命令介绍请参考msit工具安装

      git clone https://gitcode.com/ascend/msit.git
      cd msit/msit
      pip install .
      
    2. 下载llm组件包。

      使用msit download下载命令,--dest表示存放的指定目录。

      msit download llm --dest ${llm_dir}
      
    3. 安装llm组件包。

      使用msit install安装命令,--find-links表示待安装的文件目录。

      msit install llm --find-links ${llm_dir}
      
    4. 检查是否安装成功。

      使用msit check命令检查安装结果,日志会提示“msit-llm”安装成功。

      msit check all
      
  3. 获取图模式下Ascend IR图dump数据。

    以如下脚本为例,在torch.compile入图处使用msit提供的get_ge_dump_config接口获取Ascend IR图数据。

    # 导包
    import torch, torch_npu, torchair 
    from msit_llm.dump import torchair_dump  
    
    # 定义模型Model
    class Model(torch.nn.Module):
        def __init__(self):
            super().__init__()
        def forward(self, x, y):
            # ...
    model = Model().npu()
    # 配置获取Ascend IR图dump的config
    config = torchair_dump.get_ge_dump_config(dump_path="./") # 注意,此处dump_path实际值应和下文${ge_dump_path}保持一致
    # ...
    # Graph模式下torch.compile 
    npu_backend = torchair.get_npu_backend(compiler_config=config) 
    model = torch.compile(model, backend=npu_backend, dynamic=True) 
    # ...
    

    配置后执行推理脚本,会在dump_path指定目录下生成dump数据,目录样式如下:

    |--${ge_dump_path}
       |--dump_${timestamp}
         |--${op_dump_timestamp}   // 图模式下dump的算子输入/输出信息文件夹,以时间戳命名
         |--dynamo_original_graph_${graph_id}_rank_${rank_id}_pid_${pid}_ts_${timestamp}.txt    // 图模式下dump的原始图结构
         |--dynamo_optimized_graph_${graph_id}_rank_${rank_id}_pid_${pid}_ts_${timestamp}.txt     // 图模式下dump的优化后图结构
    

    dump的数据包括两部分,一部分是“图模式下dump的算子输入/输出信息”,文件介绍可参考算子data dump功能中“产物说明”;另一部分是“图模式下dump的图结构信息”,文件介绍可参考图结构dump功能中的产物说明”。

  4. 获取Eager模式下FX图dump数据。

    以如下脚本为例,在torch.compile入图处使用msit提供的get_fx_dump_config接口获取FX图数据。

    import torch, torch_npu, torchair 
    from msit_llm.dump import torchair_dump  
    
    # 定义模型Model
    class Model(torch.nn.Module):
        def __init__(self):
            super().__init__()
        def forward(self, x, y):
            # ...
    model = Model().npu()
    # 配置获取FX图dump的config
    config = torchair_dump.get_fx_dump_config()  
    # ...
    # Eager模式下torch.compile
    npu_backend = torchair.get_npu_backend(compiler_config=config) 
    model = torch.compile(model, backend=npu_backend, dynamic=True) 
    # ...
    

    配置后执行推理脚本,一般会在当前路径下data_dump/${token_id}/gm_${time stamp}_dump(老版本中路径可能为gm_${timestamp}_dump)目录生成dump数据,其中${token_id}从1开始,相对于GE模式是从0开始的,比对时会将FX模式的${token_id}减1。产物是npy格式,文件名和内容介绍可参考算子data dump功能(Eager模式)中“产物说明”。

  5. 通过llm组件提供的精度比对能力,比对两种模式下的模型精度。

    使用如下命令,请确保当前用户已拥有目标文件的读、写权限。

    msit llm compare --my-path ${ge_dump_path}/dump_${timestamp} --golden-path ${fx_dump_path}
    
    • ${ge_dump_path}:图模式下Ascend IR图dump数据路径,即get_ge_dump_config接口dump_path参数指定路径下${ge_dump_path}/dump_${timestamp}目录。
    • ${timestamp}:图模式下dump对应的时间戳。
    • ${fx_dump_path}:Eager模式下FX dump数据路径,即get_fx_dump_config接口默认路径下data_dump目录。

    执行命令后,会出现类似的回显信息,精度比对结果文件中的参数说明请参见精度比对结果参数说明,以便做进一步分析。

    msit_llm_logger - INFO - Comparing GE with FX
    msit_llm_logger - INFO - All token ids in my_dump_data: dict_keys([0])
    ......
    msit_llm_logger - INFO - Saved comparing results: ./msit_cmp_report_${timestamp}.csv