昇腾社区首页
中文
注册
开发者
下载

aclgraph间内存复用功能

功能简介

本功能为试验特性,后续版本可能存在变更,暂不支持应用于商用产品中。

reduce-overhead模式下,由于aclgraph本身不支持动态shape,因此执行过程中可能会存在多张aclgraph。

  • 当torch.compile使用dynamic为False编译时,每一种shape将对应一张FX graph,同时也对应一张aclgraph。
  • 当torch.compile使用dynamic为True编译时,多种shape只要满足规则都只会对应一张FX graph,但不同的shape会对应不同的aclgraph。

这可能导致多张aclgraph占用多份内存,从而在模型执行时引发 OOM(Out Of Memory)问题。为解决这一问题,TorchAir提供两种内存复用模式,可按实际需要选择。

  • 模式一:用户可在config中显式指定要使用的内存池,后续使用该config的graph均使用该内存池,从而达成多个aclgraph内存复用的效果。
  • 模式二(默认开启):torch.compile编译过程中默认将一张FX graph里的多种shape捕获成多张aclgraph,实现同一张FX graph内多张aclgraph间的内存复用。如需关闭,需显式设置。

此外,由于aclgraph是基于固定内存地址执行,因此前次执行的输出Tensor内存会被后续执行覆盖。如需将输出结果长时间保存和使用,可能会引入精度问题。针对该问题,可使用Clone接口对指定输出结果做克隆。

使用约束

  • 目前仅适用于如下产品:
    • Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件
    • Atlas A3 训练系列产品/Atlas A3 推理系列产品
  • 本功能仅支持reduce-overhead模式,约束与reduce-overhead模式配置一致。
  • 注意,开启模式一时,模式二功能会自动关闭。

使用方法

该功能通过torchair.get_npu_backend中compiler_config配置,示例如下,仅供参考不支持直接拷贝运行,参数介绍参见表1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import torch_npu, torchair
config = torchair.CompilerConfig()
# 配置图执行模式
config.mode = "reduce-overhead"
# 开启模式一
config.aclgraph_config.use_custom_pool = torch.npu.graph_pool_handle()
# 关闭模式二
config.debug.aclgraph.disable_mempool_reuse_in_same_fx = True
# 主动开启输出内存拷贝
config.debug.aclgraph.enable_output_clone = True
npu_backend = torchair.get_npu_backend(compiler_config=config)
opt_model = torch.compile(model, backend=npu_backend)
表1 参数说明

参数名

说明

aclgraph_config.use_custom_pool

tuple类型,用于传入需要使用的内存池。一般通过torch.npu.graph_pool_handle主动创建一个pool。

说明:

torch.npu.graph_pool_handle是PyTorch原生cuda接口torch.cuda.graph_pool_handle的NPU形式。

None(默认值):默认不传入指定内存池。

aclgraph.disable_mempool_reuse_in_same_fx

布尔类型,是否关闭FX graph的内存池复用模式。该模式实现了同一张FX graph捕获出来的不同shape的aclgraph之间的内存复用 。

  • False(默认值):默认打开模式。
  • True:关闭模式。

aclgraph.enable_output_clone

布尔类型,是否对aclgraph输出做clone。该功能主要在开启了内存池复用时使用,可以在脚本将输出长时间持有的场景下开启,对aclgraph的输出全部做clone之后再返回用户,可以解决长时间持有的输出被覆写而导致的精度问题。

  • False(默认值):默认不对输出clone。
  • True:开启对输出的clone。