多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

MXNet Profiler API 完全指南:从 set_config 配置到自定义 Task/Counter 埋点

MXNet Profiler API 完全指南:从 set_config 配置到自定义 Task/Counter 埋点 深度学习人工智能机器学习分布式训练【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址https://gitcode.com/gh_mirrors/mx/mxnet点击查看免费下载MXNet 内置了与 Chrome Tracing 兼容的性能剖析器Profiler用于量化符号算子、命令式算子、C API 调用与内存分配的时间开销。本文以官方 API 参考页 docs/python_docs/python/api/profiler/index.rst 对应的mxnet.profiler模块为骨架结合 Python 封装源码、C 后端实现与官方示例完整讲解从基本配置、状态控制到自定义埋点Domain / Task / Frame / Event / Counter / Marker / scope的实战用法帮助读者定位训练或推理中的性能瓶颈。一、Profiler 是什么整体架构与输出格式MXNet Profiler 是内置在 MXNet 运行时的轻量级性能分析工具其核心实现在 C 侧src/profiler/profiler.cc 与 src/profiler/profiler.hPython 侧则通过 python/mxnet/profiler.py 以ctypes方式封装 C API 对外暴露。从 C 源码可以看到 Profiler 的核心数据结构ProfileStat一次算子执行operator execution或一个 C API 调用的统计记录包含算子名称name_、类别categories_、事件类型、时间戳、线程 ID 与进程 IDsrc/profiler/profiler.hEventType直接对齐 Chrome Tracing 的事件类型枚举例如kDurationBegin B、kDurationEnd E、kComplete X、kInstant i、kCounter C、kMetadata Msrc/profiler/profiler.hDeviceStats按设备划分的统计桶CPU 侧按核索引命名为cpu/0、cpu/1……GPU 侧命名为gpu/0、gpu/1……另有cpu pinned/与cpu shared/两类src/profiler/profiler.cc输出文件是标准的 Chrome Tracing JSON 格式顶层为{traceEvents: [...]}并附带displayTimeUnit: mssrc/profiler/profiler.cc。这意味着最终生成的profile.json可以直接被 Chrome 浏览器的chrome://tracing或 Perfetto 等同类 Trace Viewer打开进行时间线可视化。二、基本使用流程配置、启动、停止完整的 Profiler 使用流程非常简单仅需三步import mxnet as mx # 1. 配置指定输出文件并开启全部剖析类型 mx.profiler.set_config(profile_allTrue, filenameprofile.json) # 2. 启动 mx.profiler.set_state(run) # 3. …… 运行你的训练 / 推理代码 …… # 4. 停止 mx.profiler.set_state(stop)官方示例 example/profiler/profiler_ndarray.py 完整演示了这一流程先用set_config(profile_allTrue, filenameprofile_ndarray.json)开启全部剖析类型随后set_state(run)启动剖析执行一系列 NDArray 运算后set_state(stop)结束if __name__ __main__: mx.profiler.set_config(profile_allTrue, filenameprofile_ndarray.json) mx.profiler.set_state(run) test_ndarray_slice_along_axis() test_broadcast() # ... 更多 NDArray 运算 ... mx.profiler.set_state(stop)该示例只需直接运行python profiler_ndarray.py即可在当前目录生成profile_ndarray.json见 example/profiler/README.md。三、set_config全部配置项详解mx.profiler.set_config()是 Profiler 的核心配置入口只接受关键字参数。它通过MXSetProcessProfilerConfig将键值对一次性下发到 C 后端python/mxnet/profiler.py。可用的配置项及含义如下配置项类型含义filenamestring剖析数据的输出文件默认profile.jsongpu_memory_profile_filename_prefixstringGPU 内存剖析输出文件的前缀profile_allboolean一次性开启全部剖析类型profile_symbolicboolean是否剖析符号Symbolic算子profile_imperativeboolean是否剖析命令式Imperative算子profile_memoryboolean是否剖析内存使用情况profile_apiboolean是否剖析 C API 调用continuous_dumpboolean是否周期性将剖析数据落盘dump_periodfloat两次落盘之间的间隔秒aggregate_statsboolean是否在内存中维护用于控制台输出的聚合统计对性能有一定负面影响profile_processstring剖析 kvstore 的server还是worker不传时默认workerserver仅在 kvstore 类型为dist时可用3.1 底层行为SetConfig 做了什么在 C 侧Profiler::SetConfig会完成三件事src/profiler/profiler.cc记录mode_与输出文件名filename_并先删除旧输出文件::unlink保证每次运行从干净状态开始若开启continuous_dump则调用SetContinuousProfileDump启动一个名为DumpProfileTimer的定时线程每隔dump_period秒追加写盘一次src/profiler/profiler.cc若开启aggregate_stats则创建AggregateStats对象供dumps()在内存中汇总统计。注意continuous_dump与dump_period必须配合使用C 侧有CHECK(!continuous_dump || dump_period 0)的硬性校验即开启周期性落盘时 dump 间隔必须大于 0。3.2 选择性地开启剖析类型如果只想关注某一部分开销无需开启全部类型。例如官方示例 example/profiler/profiler_matmul.py 只剖析符号算子mx.profiler.set_config(profile_symbolicTrue, filenameargs.profile_filename)该示例在 GPU 上反复执行A (4096×4096) × B (4096×4096)的矩阵乘法并通过迭代轮次控制剖析区间for i in range(args.iter_num): if i args.begin_profiling_iter: # 默认第 50 轮开始 mx.profiler.set_state(run) if i args.end_profiling_iter: # 默认第 70 轮结束 mx.profiler.set_state(stop) executor.forward() c executor.outputs[0] c.wait_to_read()它支持四个命令行参数--profile_filename输出文件名默认profile_matmul_20iter.json、--iter_num迭代总数默认 100、--begin_profiling_iter开始剖析的迭代默认 50、--end_profiling_iter结束剖析的迭代默认 70。这种预热后再剖析的做法可以排除初始化开销值得在实际调优中借鉴。四、set_state 与 dump剖析状态机与结果落盘4.1 状态控制set_state(statestop, profile_processworker)用于在run与stop两个状态间切换python/mxnet/profiler.py。在 C 侧SetState在切到kRunning时会同时开启输出并解除暂停set_paused(false)切到停止状态则挂起输出src/profiler/profiler.cc。重要提醒set_state(run)之后请务必调用set_state(stop)结束剖析否则数据可能不完整。此外还可以用pause()/resume()在剖析过程中临时暂停与恢复python/mxnet/profiler.py两者分别向MXProcessProfilePause传入1和0。例如训练循环中只想剖析某个区间时mx.profiler.set_state(run) # ... 不想剖析的部分 ... mx.profiler.pause() # ... 关键区间 ... mx.profiler.resume() # ... mx.profiler.set_state(stop)4.2 dump 与 dumps两种查看结果的方式dump(finishedTrue, profile_processworker)用于立即将剖析数据写入文件python/mxnet/profiler.py。在程序无法正常退出例如中途崩溃时可以用它提前保存剖析结果。finishedFalse表示本次落盘后不终止剖析后续还能继续记录finishedTrue则落盘后停止统计输出。dumps(resetFalse, formattable, sort_bytotal, ascendingFalse)则把内存中的聚合统计以可打印字符串返回直接在控制台查看python/mxnet/profiler.pyimport mxnet as mx from mxnet import profiler profiler.set_config(profile_allTrue) profiler.set_state(run) # ... 执行你的算子 ... profiler.set_state(stop) print(profiler.dumps())dumps()的各参数含义参数可选值默认值说明resetFalse/TrueFalse是否清除此前累计的聚合统计数据formattable/jsontable以表格还是 JSON 形式返回sort_bytotal/avg/min/max/counttotal每个类别内按哪个统计量排序ascendingFalse/TrueFalse是否升序排列这里输出的内容依赖set_config中的aggregate_stats选项——只有开启该选项后C 侧才会在DumpProfile写盘的同时把每条ProfileStat送入AggregateStats::OnProfileStat累积src/profiler/profiler.cc。该选项对性能有轻微负面影响适合在调试期开启。五、零代码改动启动剖析环境变量 MXNET_PROFILER_AUTOSTART如果不想在代码里加任何剖析语句可以直接用环境变量让 Profiler 随进程自动启动$ MXNET_PROFILER_AUTOSTART1 python my_script.py此时 Profiler 自动进入运行状态剖析整个进程输出文件默认为当前目录下的profile.json。其原理在 C 构造函数中当dmlc::GetEnv(MXNET_PROFILER_AUTOSTART, 0)非零时直接把state_置为kRunning并开启输出src/profiler/profiler.cc。环境变量参考MXNET_PROFILER_AUTOSTART设置为1时自动启动剖析见 docs/static_site/src/pages/api/faq/env_var.mdMXNET_PROFILER_MODE指定剖析类型位掩码各类型数值相加即可组合例如1表示剖析命令式算子2表示剖析符号算子321表示同时剖析符号与命令式算子见 docs/static_site/src/pages/api/faq/env_var.md。注意自动启动会剖析整个进程输出文件可能非常大。官方建议优先用set_state只剖析感兴趣的代码段详见 docs/python_docs/python/tutorials/performance/backend/profiler.md。六、自定义埋点Domain、Task、Frame、Event、Counter 与 Marker除了自动记录算子与 C API 开销mxnet.profiler还提供了一整套手动埋点 API用于剖析自定义代码区间。这些 API 都通过MXProfileCreateDomain、MXProfileCreateTask等 C API 与后端交互include/mxnet/c_api.h输出事件同样遵循 Chrome Tracing 格式。6.1 Domain归类容器Domain(name)用于创建剖析域将任务、帧、计数器、标记等对象归入同一类别对应chrome://tracing中的 categoriespython/mxnet/profiler.py。Domain 句柄永不销毁。一个 Domain 可以派生四类子对象方法返回类型用途domain.new_task(name)Task创建任务domain.new_frame(name)Frame创建帧domain.new_counter(name, valueNone)Counter创建计数器可带初始值domain.new_marker(name)Marker创建标记6.2 Task 与 Frame两种计时对象Task(domain, name)表示某个线程上的一段逻辑工作单元python/mxnet/profiler.py。任务可以嵌套通常对应函数、作用域或 switch 分支。Task 的关键特征是所有经过 begin/end 点的执行统计会被累计到同一个统计分析中而不是对每次执行分别分析。import mxnet as mx from mxnet import profiler profiler.set_config(profile_allTrue, filenamecustom.json) profiler.set_state(run) domain profiler.Domain(my_app) task domain.new_task(data_loading) task.start() # ... 你的数据加载代码 ... task.stop() profiler.set_state(stop) profiler.dump()Frame(domain, name)与 Task 的差别在于每一次帧的时长都会被编号为独立事件并统计帧率类似于为视频渲染的每一帧做剖析python/mxnet/profiler.py。在 Intel VTune Amplifier 中Frame 会显示在独立的轨道上便于与普通任务数据视觉分离。若使用 VTune 查看剖析结果Frame 对应kComplete X等事件类型帧率也会被呈现出来。6.3 Event单线程时间事件Event(name)用于标记应用中某类事件的发生时刻或衡量某段代码的执行耗时python/mxnet/profiler.py。Event API 是线程本地的且只在 resumed运行状态下生效在 paused 状态下不工作event profiler.Event(checkpoint_save) event.start() # ... 保存 checkpoint ... event.stop()6.4 Counter随时间变化的值Counter(domain, name, valueNone)用于追踪一个随时间变化的值python/mxnet/profiler.py。它的典型用途是监控显存占用、队列长度等指标counter domain.new_counter(queue_length, value0) counter.set_value(42) # 直接设置 counter.increment(3) # 加 3 counter.decrement(1) # 减 1 counter 2 # 支持 / - 运算符重载其中increment/decrement最终都调用MXProfileAdjustCounter增量为负数即实现递减set_value调用MXProfileSetCounter分别对应 Chrome Tracing 的kCounter C事件。6.5 Marker时间轴上的瞬时标记Marker(domain, name)用于在某个时间点上做标记且可跨作用域边界python/mxnet/profiler.pymarker domain.new_marker(epoch_end) marker.mark(scopeprocess)mark()的scope参数决定标记的作用范围可选global、process、thread、task、marker默认process。它底层调用MXProfileSetMarker(domain.handle, name, scope)include/mxnet/c_api.h。6.6 关键注意事项Task、Frame、Event、Counter 的start()/stop()分别调用MXProfileDurationStart/MXProfileDurationStop所有对象都有析构函数__del__会调用MXProfileDestroyHandle释放句柄例如 python/mxnet/profiler.pyEvent 不依赖 Domain构造函数只接收name而 Task、Frame、Counter、Marker 都必须归属某个 Domain。七、scope 上下文管理器GPU 内存剖析的作用域标注profiler.scope(nameunk:, append_modeTrue)是一个上下文管理器用于为GPU 内存剖析器标注当前作用域python/mxnet/profiler.py。在 Gluon API 中它会被隐式调用。其工作方式如下from mxnet import profiler with profiler.scope(layer1): # 这里的显存分配都会归入 layer1 作用域 with profiler.scope(conv): # append_modeTrue 时自动拼接为 layer1:conv ...实现细节若name不以:结尾会自动补上冒号append_modeTrue且当前作用域不是默认的unk:时新作用域名会拼接在旧作用域之后形成layer1:conv这样的层级进入和退出时分别调用MXSetProfilerScope将作用域信息同步到 C 后端C 侧由ProfilerScope::SetCurrentProfilerScope/GetCurrentProfilerScope维护src/profiler/profiler.ccPython 侧用contextvars.ContextVar_current_scope记录当前作用域保证线程与协程间隔离python/mxnet/profiler.py。八、实战数据加载管线剖析示例官方示例 example/profiler/profiler_imageiter.py 演示了如何剖析数据加载管线ImageIter 迭代。运行前需要先用 MXNet 工具制作test.rec图像数据集文件然后mx.profiler.set_config(profile_allTrue, filenameprofile_imageiter.json) mx.profiler.set_state(run) run_imageiter(test.rec, 20) # 迭代 20 个 batch mx.profiler.set_state(stop)其中run_imageiter使用mx.img.ImageIter构造batch_size32、data_shape(3, 224, 224)、开启随机裁剪 / 缩放 / 翻转的图像迭代器并统计吞吐量每秒处理的图片数。这个示例非常适合用来分析数据加载是否成为训练瓶颈。九、查看剖析结果9.1 控制台查看聚合统计运行print(profiler.dumps())即可在控制台查看表格形式的统计包含每个算子、每个 C API 调用的耗时以及 CPU / GPU 的内存占用情况详见 docs/python_docs/python/tutorials/performance/backend/profiler.md。9.2 浏览器可视化时间线调用profiler.dump(finishedFalse)生成 JSON 文件后用 Chrome 打开chrome://tracing并加载该文件即可看到按时间轴排列的算子执行序列与各自耗时docs/python_docs/python/tutorials/performance/backend/profiler.md。注意finishedFalse表示落盘后不停止剖析如果直接dump()finishedTrue则落盘后无法继续剖析后续代码段。9.3 提升剖析粒度MXNet 默认以批量模式bulk mode执行计算图以减少算子间的内核启动间隙这会降低剖析输出的粒度。若需要每个算子单独的输出记录可设置环境变量MXNET_EXEC_BULK_EXEC_INFERENCE0与MXNET_EXEC_BULK_EXEC_TRAIN0关闭批量执行docs/python_docs/python/tutorials/performance/backend/profiler.md。另外Gluon 网络在 hybridize混合编程后算子可能被融合导致剖析输出粒度变粗调试时可先剖析未 hybridize 的网络。9.4 oneDNN 算子内部剖析对于 oneDNN 算子可借助 oneDNN 自带的 verbose 日志设置DNNL_VERBOSE1运行脚本并将输出重定向到日志文件之后用grep/awk等工具统计各 primitive 的耗时DNNL_VERBOSE2还可额外收集 primitive 的创建时间docs/python_docs/python/tutorials/performance/backend/profiler.md。十、API 速查表与弃用说明mxnet.profiler模块的完整公开 API对应index.rst中automodule渲染的成员列表类别API说明配置set_config(**kwargs)设置剖析配置当前推荐入口状态set_state(state, profile_processworker)启动 / 停止剖析落盘dump(finishedTrue, profile_processworker)立即落盘可提前保存聚合dumps(reset, format, sort_by, ascending)返回控制台可打印的聚合统计暂停pause()/resume()剖析过程中暂停 / 恢复埋点Domain/Task/Frame/Event/Counter/Marker自定义剖析对象作用域scope(name, append_modeTrue)GPU 内存剖析作用域上下文管理器注意profiler_set_config()、profiler_set_state()、dump_profile()三个旧 API 已标记为Deprecated调用时会发出DeprecationWarning请分别改用set_config()、set_state()、dump()见 python/mxnet/profiler.py 与 python/mxnet/profiler.py。十一、小结MXNet Profiler 提供了一条从整体概览到细粒度埋点的完整性能分析路径快速上手set_configset_state(run)set_state(stop)或直接用MXNET_PROFILER_AUTOSTART1零改动启动按需剖析用profile_symbolic/profile_imperative/profile_memory/profile_api选择性开启用pause()/resume()圈定热点区间结果解读dumps()看控制台聚合统计dump()生成 JSON 在chrome://tracing看时间线必要时配合 VTune、NVIDIA 工具或DNNL_VERBOSE深挖硬件级细节自定义埋点Domain Task / Frame / Event / Counter / Marker 足以覆盖自定义代码区间的计时、计数与标记需求scope()则让 GPU 内存剖析结果按模块分层归因。通过以上 API 组合开发者可以系统性地定位训练管线中的算子热点、数据加载瓶颈与显存分配问题为后续优化提供量化依据。赞分享深度学习人工智能机器学习分布式训练【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址https://gitcode.com/gh_mirrors/mx/mxnet点击查看免费下载相关推荐Zeus工具常见问题解答从安装错误到审计结果解读Zeus工具常见问题解答从安装错误到审计结果解读 ZeusAWS Auditing Hardening Tool是一款强大的AWS安全审计与加固工具人工智能深度学习机器学习Wasp 自定义 HTTP API 端点完全指南从 api 声明、CORS 配置到流式响应Wasp 自定义 HTTP API 端点完全指南从 api 声明、CORS 配置到流式响应 在 Waspv0.19中客户端与服务端交互的默认机制是 OpWeb框架后端前端CLI开发工具Celery 任务Task完全指南从定义、配置到重试与最佳实践Celery 任务Task完全指南从定义、配置到重试与最佳实践 本指南以 Celery 官方用户指南的 Tasks 章节 https://link.git任务调度后端消息队列创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表