昇腾社区首页
中文
注册

图内设置AI Core和Vector Core核数

功能简介

多流场景下,会出现所有核(Core)都被一个流占用的情况,导致算子执行并行度降低,因此需要把核分给不同的流用,从而保证算子并行执行收益。

目前提供了两种指定核数的方法,算子级核数和全局核数(session)配置,其中算子级优先级高于全局核数的配置。用户需根据实际情况进行核数分配。

使用约束

  • 目前仅适用于如下产品:
    • Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件
    • Atlas A3 训练系列产品/Atlas A3 推理系列产品
  • 配置算子级核数或全局核数时,不能超过AI处理器本身允许的最大AI Core数量(设为max_aicore)最大Vector Core数量(设为max_vectorcore)。您可以通过“CANN软件安装目录/<arch>-linux/data/platform_config/<soc_version>.ini”文件查看,如下所示,说明AI处理器上存在32个AI Core,不存在Vector Core。
    1
    2
    3
    [SoCInfo]
    ai_core_cnt=32
    vector_core_cnt=0
    

    如果配置的算子级核数或全局核数超过AI处理器本身允许的最大核数,系统默认采用最大核数作为实际运行核数。

使用方法

  1. 用户自行分析模型脚本中需要指定核数的算子。
  2. (可选)指定算子级核数。

    使用如下with语句块(limit_core_num),语句块内的算子均按照入参指定核数。

    1
    with torchair.scope.limit_core_num (op_aicore_num: int, op_vectorcore_num: int):
    
    • op_aicore_num:表示该算子运行时的aicore核数,取值范围为[1, max_aicore]。
    • op_vectorcore_num:表示该算子运行时的vectorcore核数,取值范围为[1, max_vectorcore]。当AI处理器上仅存在AI Core不存在Vector Core时,此时仅支持取值为0。

    配置结果可通过如下操作查看:

    参考图结构dump功能获取完整的图结构信息,如config.debug.graph_dump.type="txt",再查看生效的算子级核数,一般在“attr”属性中,key名分别为“_op_aicore_num”和“_op_vectorcore_num”。

  3. (可选)指定全局核数。

    该功能通过torchair.get_npu_backend中compiler_config配置来指定全局核数,示例如下,参数介绍参见表1

    1
    2
    3
    4
    5
    6
    import torch_npu, torchair
    config = torchair.CompilerConfig()
    # 全局核数配置项
    config.ge_config.aicore_num = "24|100"
    npu_backend = torchair.get_npu_backend(compiler_config=config)
    opt_model = torch.compile(model, backend=npu_backend)
    
    表1 参数说明

    参数名

    参数说明

    aicore_num

    指定全局aicore和vectorcore核数,字符串类型,形如“${aicore_num}|${vectorcore_num}”,必须用“|”来分隔。

    • ${aicore_num}:表示全局aicore核数,整数类型,取值范围为[1, max_aicore]。
    • ${vectorcore_num}:表示全局vectorcore核数,整数类型,取值范围为[1, max_vectorcore]。当AI处理器上仅存在AI Core不存在Vector Core时,本参数可不配置,即config.ge_config.aicore_num = "24|",若配置了其它数值也不生效。

    配置结果可通过开启Python侧日志获取,假设config.ge_config.aicore_num="24|100",日志信息如下:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    log/debug/plog/plog-67380_20250418094019557.log:15072:[INFO] GE(67380,python3.x):2025-04-18-09:40:20.131.488 [session_manager.cc:60]67380 CreateSession:GE option: ge.aicoreNum, value: 24|100.
    log/debug/plog/plog-67380_20250418094019557.log:15083:[INFO] GE(67380,python3.x):2025-04-18-09:40:20.131.526 [platform_info_util.cc:141]67380 parseAicoreNumOption:origin ge.aicoreNum in options, value: 24|100.
    ......
    log/debug/plog/plog-67380_20250418094019557.log:42713:[INFO] GE(67380,python3.x):2025-04-18-09:40:27.333.983 [model_helper.cc:1703]67380 UpdateCoreCountWithOption:ge.aicoreNum in ThreadLocalContext, value: 24.
    log/debug/plog/plog-67380_20250418094019557.log:42714:[INFO] GE(67380,python3.x):2025-04-18-09:40:27.333.987 [model_helper.cc:1715]67380 UpdateCoreCountWithOption:Change ge.aicoreNum from platform 20 to rts 20.
    log/debug/plog/plog-67380_20250418094014712.log:54036:[INFO] GE(67380,python3.x):2025-04-18-09:40:16.442.320 [model_helper.cc:1703]67380 UpdateCoreCountWithOption:ge.aicoreNum in ThreadLocalContext, value: .
    log/debug/plog/plog-67380_20250418094014712.log:54037:[INFO] GE(67380,python3.x):2025-04-18-09:40:16.442.323 [model_helper.cc:1715]67380 UpdateCoreCountWithOption:Change ge.aicoreNum from platform 20 to rts 20.
    log/debug/plog/plog-67380_20250418094014712.log:54577:[DEBUG] TEFUSION(67380,python3.x):2025-04-18-09:40:16.663.665 [te_config_info.cc:283]67380 InitConfigItemsFromOptions The value of param[ge.aicoreNum] is [20].
    log/debug/plog/plog-67380_20250418094019557.log:15103:[INFO] GE(67380,python3.x):2025-04-18-09:40:20.131.766 [model_helper.cc:1700]67380 UpdateCoreCountWithOption:ge.vectorcoreNum in options, value: 100.
    log/debug/plog/plog-67380_20250418094019557.log:15104:[INFO] GE(67380,python3.x):2025-04-18-09:40:20.131.769 [model_helper.cc:1715]67380 UpdateCoreCountWithOption:Change ge.vectorcoreNum from platform 40 to rts 40.
    log/debug/plog/plog-67380_20250418094019557.log:42715:[INFO] GE(67380,python3.x):2025-04-18-09:40:27.333.990 [model_helper.cc:1703]67380 UpdateCoreCountWithOption:ge.vectorcoreNum in ThreadLocalContext, value: 100.
    log/debug/plog/plog-67380_20250418094019557.log:42716:[INFO] GE(67380,python3.x):2025-04-18-09:40:27.333.993 [model_helper.cc:1715]67380 UpdateCoreCountWithOption:Change ge.vectorcoreNum from platform 40 to rts 40.
    log/debug/plog/plog-67380_20250418094014712.log:54038:[INFO] GE(67380,python3.x):2025-04-18-09:40:16.442.326 [model_helper.cc:1703]67380 UpdateCoreCountWithOption:ge.vectorcoreNum in ThreadLocalContext, value: .
    log/debug/plog/plog-67380_20250418094014712.log:54039:[INFO] GE(67380,python3.x):2025-04-18-09:40:16.442.328 [model_helper.cc:1715]67380 UpdateCoreCountWithOption:Change ge.vectorcoreNum from platform 40 to rts 40.
    

    根据提示“Change ge.aicoreNum from xx”和“Change ge.vectorcoreNum from xx”发现核数均超过AI处理器允许的最大核数,默认采用最大核数作为实际运行核数,因此本案例中真正生效的核数为aicore_num=20、vectorcore_num=40。

使用示例

 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
32
33
import torch, os
import torch_npu
import torchair
from torchair.configs.compiler_config import CompilerConfig
from torchair.core.utils import logger
import logging
logger.setLevel(logging.DEBUG)

# 定义模型model
class Model(torch.nn.Module):
    def __init__(self):
        super().__init__()
    def forward(self, in1, in2, in3, in4):
        # 指定算子级核数
        with torchair.scope.limit_core_num(4, 5): 
            mm_result = torch.mm(in3, in4)
            add_result = torch.add(in1, in2)
        mm1_result = torch.mm(in3, in4)
        return add_result, mm_result,mm1_result

model = Model()
config = CompilerConfig()
config.debug.graph_dump.type = "pbtxt"
# 指定全局核数
config.ge_config.aicore_num = "24|48"     
npu_backend = torchair.get_npu_backend(compiler_config=config)
model = torch.compile(model, backend=npu_backend, dynamic=False, fullgraph=True)
in1 = torch.randn(1000, 1000, dtype = torch.float16).npu()
in2 = torch.randn(1000, 1000, dtype = torch.float16).npu()
in3 = torch.randn(1000, 1000, dtype = torch.float16).npu()
in4 = torch.randn(1000, 1000, dtype = torch.float16).npu()
result = model(in1, in2, in3, in4)
print(f"Result:\n{result}\n")