GE Profiling 特性介绍【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge1. 业务视角Profiling 解决什么问题在 AI 模型训练和推理中性能瓶颈可能出现在任何一个环节算子执行耗时过长、内存分配不合理、流调度冲突、Host-Device 数据传输阻塞等。GE 的 Profiling 特性就是为了解决这些可观测性问题而设计的。典型用户场景训练场景性能调优开发者需要知道一个训练 step 中前向传播(FP)和反向传播(BP)各耗时多少哪些 AllReduce 算子成为通信瓶颈迭代之间是否有空闲等待。推理场景延迟分析模型加载耗时多少每个算子的执行时间分布如何是否存在某些算子异常慢内存分析静态算子的内存生命周期是怎样的是否存在内存排布冲突API 级别性能追踪用户调用的aclmdlExecute、aclopExecute等 API 耗时多少GE 的 Profiling 系统设计哲学是分层采集、按需使能、统一上报。不同层次API层、Host层、Device层独立采集通过统一的 msprof 库上报到分析工具如 MSProfiler用户可以根据需要开启不同粒度的 profiling。2. 如何开启 Profiling2.1 通过 GE Options 开启推荐方式在调用GEInitialize或创建 Session 时通过 options 参数配置ge.exec.profilingMode为 1 开启 profiling并在ge.exec.profilingOptions中以 JSON 格式指定输出路径、训练轨迹开关、fp_point/bp_point 算子名称、task_trace、hccl、aicpu、aic_metrics 等选项。2.2 通过环境变量开启设置环境变量GE_PROFILING_MODEtrue并通过GE_PROFILING_OPTIONS指定 JSON 格式的配置项output、training_trace、task_trace、hccl、aicpu、aic_metrics 等。2.3 通过 C API 动态控制包含头文件ge/ge_prof.h后按顺序调用aclgrphProfInit初始化并指定输出路径 →aclgrphProfCreateConfig创建设备列表和指标配置 →aclgrphProfStart开始采集 → 执行模型 →aclgrphProfStop停止采集 →aclgrphProfFinalize结束 profiling →aclgrphProfDestroyConfig销毁配置。2.4 Profiling 配置项详解配置项说明示例值outputProfiling 数据输出路径/tmp/profilingtraining_trace是否开启训练轨迹FP/BP 时间点on/offfp_point前向传播起始算子名称data不指定则自动查找 Data/GetNext 节点bp_point反向传播结束算子名称gradients不指定则自动查找 AllReduce 节点task_trace是否开启算子任务级别追踪on/offhccl是否开启集合通信追踪on/offaicpu是否开启 AI CPU 算子追踪on/offaic_metricsAI Core 性能指标类型PipeUtilization/ArithmeticUtilization/Memory等msproftx是否开启 msproftx 功能on/off2.5 AI Core Metrics 指标类型枚举值说明kAicoreArithmeticUtilization(0)计算类指标占比kAicorePipeUtilization(1)计算单元和搬运单元耗时占比kAicoreMemory(2)UB/L1/L2 读写带宽kAicoreMemoryL0(3)L0 读写带宽kAicoreResourceConflictRatio(4)流水线队列类指令占比kAicoreMemoryUB(5)细粒度 UB 读写带宽kAicoreL2Cache(6)Cache 命中/缺失次数3. 整体架构设计GE Profiling 系统采用分层架构从用户 API 调用到 Device 端算子执行每一层都有独立的采集机制最终统一通过 msprof 库上报。3.1 分层职责层次核心组件职责API 层AclProfilingReporter、GraphProfilingReporter采集用户 API 调用耗时如aclmdlExecute、GEInitializeHost 层GlobalProfilingWrapper、ScopeProfiler采集 Host 端框架执行耗时如 InferShape、Tiling、内存分配编译层ProfilingTaskUtils在编译期向模型中插入 ProfilerTrace 任务用于训练轨迹采集Runtime V1HybridProfiler、CannTracingProfiler、ProfilerCollectorHybrid 执行器下的算子执行时间采集Runtime V2CannProfilerV2、CannHostProfiler、CannMemoryProfilerV2 执行器下的算子执行、Host 调度、内存信息采集4. 代码链路从入口到实现4.1 初始化链路用户调用 GEInitialize(options) ↓ api/session/client/ge_api_v2.cc: InitProfiling(options) ↓ runtime/v1/common/profiling/profiling_init.cc: ProfilingInit::Instance().Init(options) ↓ 1. 解析 profilingMode 和 profilingOptions 2. 解析 training_trace、fp_point、bp_point 3. 调用 MsprofInit() 初始化 msprof 库 4. 注册 GE 控制回调 ProfRegisterCtrlCallback() 5. 设置 ProfilingProperties 单例状态初始化入口设计ge_api_v2.cc中的InitProfiling函数接收 options 参数调用ProfilingInit::Instance().Init(options)执行初始化。如果返回非 SUCCESS 状态则上报错误否则返回成功。Options 解析逻辑ProfilingInit::InitProfOptions方法采用优先级策略首先从 GE options 中查找ge.exec.profilingMode和ge.exec.profilingOptions如果 options 未配置profilingMode 不为 1则回退到读取环境变量MM_ENV_PROFILING_MODE和MM_ENV_PROFILING_OPTIONS如果环境变量也未设置或值不为 true则直接返回 SUCCESS表示未开启 profiling。解析完成后调用ParseOptions提取 JSON 中的 training_trace、fp_point、bp_point 等字段最后通过ProfilingProperties::Instance().SetExecuteProfiling(true)设置全局状态。4.2 编译期 Profiling 任务插入在图编译阶段ProfilingTaskUtils负责在计算图中插入 ProfilerTrace 任务。这些任务会在 Device 端执行时产生时间戳用于训练轨迹分析。编译图构建流程 ↓ compiler/graph/build/profiling_task_utils.cc: ProfilingTaskUtils::FindProfilingTaskIndex() ↓ 1. 检查 ProfilingProperties::ProfilingOn() 或 ProfilingTrainingTraceOn() 2. 查找 FP 点前向起始算子 - 用户指定通过 fp_point 配置查找匹配算子名 - 自动查找遍历图找到第一个 Data/GetNext/IteratorV2 节点 3. 查找 BP 点反向结束算子 - 用户指定通过 bp_point 配置查找匹配算子名 - 自动查找找到最后一个 AllReduce 或 NetOutput 节点 4. 查找迭代结束点FlowCtrl 相关节点或 NetOutput 5. 查找 AllReduce 节点列表用于通信轨迹 6. 查找 GetNext 节点列表用于数据加载轨迹 ↓ InsertProfilingTaskBefore/After() 在算子前后插入 TaskDef ↓ AssembleTaskForProfilerTrace() 生成 MODEL_TASK_PROFILER_TRACE 类型任务Profiling 任务插入逻辑InsertProfilingTaskBefore方法定义在compiler/graph/build/profiling_task_utils.cc在算子执行前检查是否需要插入 profiling 任务通过算子属性判断是否标记为 FP 插入点如果是则生成 ProfilerTrace 任务。对于 AllReduce 类型算子调用专门的方法插入通信轨迹任务对于 GetNext 类型算子插入数据加载轨迹任务。AssembleTaskForProfilerTrace方法负责组装 ProfilerTrace 任务创建 TaskDef 对象设置任务类型为MODEL_TASK_PROFILER_TRACE绑定 stream_id写入 logid 和迭代结束标记最后添加到任务列表。LogID 定义LogID含义kProfilingFpStartLogid 2前向传播开始kProfilingBpEndLogid 3反向传播结束kProfilingIterEndLogid 4迭代结束kProfilingArStartLogid 10000AllReduce 开始每个 AR 2kProfilingArEndLogid 10001AllReduce 结束每个 AR 2kProfilingGetNextStartLogid 20000GetNext 开始kProfilingGetNextEndLogid 20001GetNext 结束4.3 API 层 ProfilingAPI 层通过 RAII 模式的 Reporter 类采集用户 API 调用耗时。用户调用 aclmdlExecute(modelId, input, output) ↓ ACL_PROFILING_REG(AclProfType::AclmdlExecute) 宏展开 ↓ 创建 AclProfilingReporter 对象构造函数记录开始时间 ↓ 执行实际 API 逻辑 ↓ AclProfilingReporter 析构记录结束时间并上报 ↓ MsprofReportApi() 上报到 msprof 库API 层 RAII Profiling 机制ACL_PROFILING_REG(apiId)宏定义在api/acl/common/prof_api_reg.h在函数作用域内声明一个 const 类型的AclProfilingReporter局部对象。构造函数检查全局 profiling 运行状态并记录开始时间析构函数获取结束时间后构造MsprofApi结构体上报到 msprof 库。Graph API 层 Profiling使用类似的GRAPH_PROFILING_REG(api_id)宏定义在inc/framework/runtime/subscriber/global_profiler.h创建GraphProfilingReporter对象通过GlobalProfilingWrapper判断使能状态后上报。4.4 Host 层 ProfilingHost 层通过GlobalProfilingWrapper和ScopeProfiler采集框架内部执行耗时。Host 端执行流程如 InferShape、Tiling ↓ PROFILING_SCOPE(element, event) 宏展开 ↓ 创建 ScopeProfiler 对象RAII ↓ 执行实际逻辑 ↓ ScopeProfiler 析构记录 start/end 事件 ↓ ProfilingContext::RecordCurrentThread() 记录 ↓ GlobalProfiler::Record() 写入环形缓冲区 ↓ 最终 Dump 时输出Host 层 Scope Profiling 机制PROFILING_SCOPE(element, event)宏定义在inc/framework/common/profiling_definitions.h展开为创建ge::profiling::ScopeProfiler局部对象采用 RAII 模式自动记录作用域内的执行耗时。构造函数检查 profiling 使能状态并记录开始时间戳析构函数记录开始和结束两个事件到ProfilingContext。Runtime V2 的 Scope Profiling使用RT2_PROFILING_SCOPE(element, event)宏定义在inc/framework/runtime/subscriber/global_profiler.h创建gert::ScopeProfiler对象通过GlobalProfilingWrapper判断使能状态析构时记录kExecuteStart和kExecuteEnd事件。4.5 Runtime V2 Profiling核心实现Runtime V2 是 GE 的主要执行器CannProfilerV2是其核心 Profiling 组件。模型执行流程 ↓ CannProfilerV2::OnExecuteEvent() 接收执行事件 ↓ kModelStart 事件 → profiler-Init() 初始化 Profiling 信息 ↓ kExecuteStart 事件 → profiler-RecordLaunchBeginTime() 记录算子开始时间 ↓ 算子内核执行 ↓ kExecuteEnd 事件 → profiler-DoProf() 上报算子 Profiling 数据 ↓ 1. 上报 MsprofApi算子 API 级别信息 2. 上报 MsprofCompactInfo算子基本信息名称、类型、taskType、blockDim 3. 上报 MsprofAdditionalInfoTensor 信息shape、format、dataType 4. 上报 Context ID 信息用于 PMU 数据匹配V2 Profiling 初始化流程CannProfilerV2::Init方法定义在runtime/v2/subscriber/profiler/cann_profiler_v2.cc检查初始化标志和使能状态后调用InitForCannDevice执行完整初始化初始化算子名称和类型的 Hash 映射从 execute_graph 的零拷贝属性中反序列化 DfxExtendInfo遍历所有执行节点初始化基本信息和 Tensor 信息填充 shape 信息到 tensor info wrapper。V2 Profiling 数据上报流程DoProf方法在算子执行结束时被调用。首先检查是否为 DavinciModel 类型节点如果是则触发模型内部 profiling 数据上报。对于普通算子获取结束时间后调用MsprofReportApi上报 API 级别信息再遍历相关节点调用DoProfByNodeId上报算子基本信息和 Tensor 信息。RecordNodeBasicInfo方法填充并上报MsprofCompactInfo结构体。4.6 Runtime V1 Hybrid ProfilingV1 Hybrid 执行器使用ProfilerCollector进行模型执行级别的时间采集。模型执行流程V1 Hybrid ↓ ProfilerCollector::RecordStart(stream) 记录模型开始 ↓ 1. 上报 kModelExecute 事件 2. 上报 StepTrace Start Tag ↓ 模型执行 ↓ ProfilerCollector::RecordEnd(stream) 记录模型结束 ↓ 1. 上报 StepTrace End Tag 2. 上报 kModelExecute 事件 3. 上报 GraphIdMapgraph_id 到 model_id 的映射V1 Hybrid Profiling 实现ProfilerCollector::RecordStart方法定义在runtime/v1/common/profiling/profiling_manager.cc在模型执行开始时调用检查使能状态后上报kModelExecute类型事件并上报 StepTrace Start Tag 到指定 stream。ProfilerCollector::RecordEnd方法在模型执行结束时调用上报 StepTrace End Tag、kModelExecute事件以及 graph_id 到 model_id 的映射关系最后 step_id 自增。5. Profiling 数据流全景6. 核心数据结构6.1 ProfilingProperties全局状态管理ProfilingProperties类定义在base/common/profiling/profiling_properties.h是 profiling 系统的全局状态单例管理所有 profiling 开关和配置包括加载/执行 profiling 开关、训练轨迹开关、算子详情开关、任务事件开关、fp/bp 点配置、设备配置数据等。6.2 Profiling Event 枚举定义在inc/framework/common/profiling_definitions.h的ge::profiling命名空间中包含约 80 个 profiling 事件类型覆盖从 API 调用到算子执行的各个阶段包括 ACL 接口层、ACL 内部层、执行器层、静态单算子层、V2 执行器层、FFTS Plus 层等。6.3 GeProfInfoTypeGE 级别 Profiling 信息类型定义在inc/framework/runtime/subscriber/global_profiler.h按层级分为 Model 级别、Node 级别和 ACL 级别三类。6.4 AclProfTypeACL API Profiling 类型定义在api/acl/common/prof_api_reg.h按功能分为算子编译类型、算子执行类型、模型类型、CBLAS 类型四类使用不同的起始偏移量区分。7. Profiling 类型与使能位GE Profiling 系统通过位掩码enable_flags控制不同类型的 profiling 使能。GlobalProfilingWrapper::IsEnabled(ProfilingType profiling_type)方法通过位与操作检查对应类型的使能位是否设置。主要的 ProfilingType 包括ProfilingType说明采集内容kTaskTime任务时间 profilingAPI 调用耗时、算子执行时间kGeHostGE Host 层 profilingInferShape、Tiling 等框架内部耗时kDeviceDevice 层 profiling算子基本信息、Tensor 信息kCannHostCANN Host 层 profilingHost 端调度信息kCannHostL1CANN Host L1 层 profiling更细粒度的 Host 调度信息kMemory内存 profiling静态算子内存信息8. msprof 库集成GE Profiling 系统依赖外部 msprof 库进行数据采集和上报。CMake 中通过Findmsprof.cmake定义了三个 targetmsprofiler_fwk_share对应 libmsprofiler.so 主库profapi_share对应 libprofapi.so Profiling API 库msprof_headers提供 profiling/aprof_pub.h 等头文件路径。动态加载机制runtime/c/dbg/profiling/profiling_dynamic.c通过 dlsym 动态加载 msprof 函数指针包括MsprofInit、MsprofFinalize、MsprofGetHashId、MsprofSysCycleTime、MsprofReportData、MsprofRegisterCallback、MsprofNotifySetDevice等核心函数。核心上报函数函数用途MsprofInit()初始化 msprof 库MsprofFinalize()结束 profiling触发数据落盘MsprofSysCycleTime()获取高精度时间戳CPU cycleMsprofGetHashId()计算字符串 Hash用于减少数据传输MsprofReportApi()上报 API 级别 profiling 数据MsprofReportEvent()上报事件级别 profiling 数据MsprofReportCompactInfo()上报紧凑信息算子基本信息MsprofReportAdditionalInfo()上报附加信息Tensor 信息、Context IDMsprofRegisterCallback()注册控制回调用于动态启停 profiling9. 总结GE 的 Profiling 系统是一个分层、按需使能、统一上报的性能采集框架。它通过以下核心机制实现初始化通过 options 或环境变量配置调用ProfilingInit初始化 msprof 库编译期ProfilingTaskUtils在计算图中插入 ProfilerTrace 任务用于训练轨迹采集API 层通过 RAII 模式的AclProfilingReporter/GraphProfilingReporter采集 API 调用耗时Host 层通过ScopeProfiler和GlobalProfiler采集框架内部执行耗时Runtime 层CannProfilerV2V2和ProfilerCollectorV1采集算子执行时间和 Tensor 信息统一上报所有数据通过 msprof 库上报到 MSProfiler 工具进行分析这套设计使得开发者可以从宏观训练 step 耗时到微观单个算子执行时间全方位了解模型执行性能是性能调优不可或缺的工具。【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考