昇腾社区首页
中文
注册

DataFlow子图编译缓存

功能介绍

开启DataFlow编译缓存功能,当修改DataFlow单个节点的子图时,只增量编译修改的子图,其余子图使用缓存,从而降低编译耗时。

使用约束

  • 该功能支持FlowGraph,不支持AscendGraph。
  • 当前不支持带资源类算子的模型。
  • 缓存不保证跨版本的兼容性,如果版本升级,需要清理缓存目录重新编译生成缓存。
  • DataFlow子图发生变化后,原来的缓存文件不可用,用户需要手动删除缓存目录中的缓存文件,重新编译生成缓存文件。

使用方法

  1. 缓存配置启用。
    配置示例如下。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    python
        # 初始化
        SOC_VERSION = os.getenv('SOC_VERSION', 'AscendXXX')
        options = {
            "ge.exec.deviceId":"0",
            "ge.exec.logicalDeviceClusterDeployMode":"SINGLE",
            "ge.exec.logicalDeviceId":"[0:0]",
            "ge.socVersion": SOC_VERSION, # 运行环境的SOC_VERSION,必须设置的参数
            "ge.graph_compiler_cache_dir":"./build_cache_dir"
        }
        df.init(options)
    
        flow_node0 = df.FlowNode(input_num=1, output_num=2)
        flow_node0_out = flow_node0(data0)
    
        # 构建FlowGraph,此处着重体现option使用,实际构造dataflow graph请参考其他章节
        options = {
            "ge.graph_key":"test_graph_00"
        }
        dag = df.FlowGraph([out for out in flow_node0_out], options)
    	
    	
        flow_node0 = df.FlowNode(input_num=1, output_num=2)
        flow_node0_out = flow_node0(data0)
    
        # 构建FlowGraph
        options = {
            "ge.graph_compiler_cache_dir":"./build_cache_dir",
            "ge.graph_key":"test_graph_00"
        }    
        dag = df.FlowGraph([out for out in flow_node0_out], options)
    
    表1 参数解释

    参数名

    含义

    ge.graph_compiler_cache_dir

    图编译磁盘缓存目录,和ge.graph_key配合使用,ge.graph_compiler_cache_dir和ge.graph_key同时配置非空时图编译磁盘缓存功能生效。

    配置的缓存目录必须存在,否则会导致编译失败。

    图发生变化后,原来的缓存文件不可用,用户需要手动删除缓存目录中的缓存文件,包括模型缓存文件、索引文件和变量格式文件,重新编译生成缓存文件。

    ge.graph_key

    图唯一标识,建议取值只包含大小写字母(A-Z,a-z)、数字(0-9)、下划线(_)、中划线(-)并且长度不超过128。不满足条件时,系统会报错。

    编译完成会在指定的目录下生成缓存文件。具体内容请参考缓存文件生成规则

  2. 图发生变化后,如果需要重新编译。请参考如下步骤。
    图变化包括:修改graphpp对应的graph或者config.json、修改udf的实现文件和修改部署信息。
    1. 手动删除整图缓存的文件(包括模型缓存文件、索引文件和变量格式文件,具体内容请参考缓存文件生成规则)。
    2. 重新编译。

      编译完成会在指定的目录下生成缓存文件。具体内容请参考缓存文件生成规则

缓存文件生成规则

生成文件包括:

  • 模型缓存文件
  • 索引文件,便于用户通过graph_key快速找到对应的缓存文件,索引文件内容示例如下:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    {
        "cache_file_list":[
            {
                "cache_file_name":"./cache_dir/graph_$key1_20230117202307.om",
                "graph_key":"graph_$key1",
                "var_desc_file_name":"./cache_dir/graph_$key1_20230117202307.rdcpkt"
            },
            {
                "cache_file_name":"./cache_dir/graph_$key1_20230117203007.om",
                "graph_key":"graph_$key1",
                "var_desc_file_name":"./cache_dir/graph_$key1_20230117203007.rdcpkt"
            }
        ]
    }
    
  • 变量格式文件,仅在图中存在变量时生成。用于框架匹配模型缓存文件,如果graph_key对应的图内变量格式发生变更,则之前缓存的缓存文件将无法直接恢复使用,该场景下会重新触发编译流程重新生成缓存文件。
  • 如果开启了权重外置功能,即options选项中配置了ge.externalWeight参数,并且设置为1,则在ge.graph_compiler_cache_dir参数指定路径下还会生成weight目录,用于保存原始网络中的Const/Constant节点的权重信息。
  • DataFlow子图缓存文件夹,仅在FlowGraph场景下生成。以graph_key命名,存放DataFlow子图编译时产生的缓存文件。

文件名生成规则:

  • 当ge.graph_key配置值只包含大小写字母(A-Z,a-z)、数字(0-9)、下划线(_)、中划线(-)并且长度不超过128时
    • 索引文件命名为:ge.graph_key + “.idx”。
    • 模型缓存文件命名为: ge.graph_key + 当前时间 + “.om”。
    • 变量格式文件命名为: ge.graph_key + 当前时间 + “.rdcpkt”。
  • 不满足上面条件时,系统会报错。