如何从TensorBoard按tf.name_scope获取命名空间维度耗时汇总数据
按name_scope聚合TensorFlow模块耗时的可行方法
- 方法1:调用TF内置Profiler接口直接输出聚合结果
无需依赖TensorBoard面板的交互功能,直接在代码中接入原生profiler,即可自动按name_scope维度累加算子耗时,参考实现:
如果是TF2.x eager模式,可使用import tensorflow as tf # 图模式(TF1.x/TF2.x兼容图模式)参考实现 from tensorflow.python.profiler import model_analyzer from tensorflow.python.profiler import option_builder profiler = model_analyzer.Profiler(graph=tf.compat.v1.get_default_graph()) run_options = tf.compat.v1.RunOptions(trace_level=tf.compat.v1.RunOptions.FULL_TRACE) run_metadata = tf.compat.v1.RunMetadata() # 替换为实际的模型执行调用 sess.run(target_tensor, options=run_options, run_metadata=run_metadata) profiler.add_step(step=0, run_meta=run_metadata) # 配置统计规则:按name_scope聚合,按耗时排序,统计墙钟时间和调用次数 stat_options = option_builder.ProfileOptionBuilder( option_builder.ProfileOptionBuilder.time_and_memory() ).order_by('micros')\ .account_displayed_op_only(True)\ .select(['micros', 'occurrence'])\ .build() # 直接打印各name_scope的聚合耗时结果 profiler.profile_name_scope(stat_options)tf.profiler.experimental.start(logdir)、tf.profiler.experimental.stop()包裹待统计的代码段,采集完成后调用tf.profiler.experimental.profile(logdir, options)配置按name_scope维度输出统计结果即可。 - 方法2:自定义解析trace文件做聚合
你通过tf.summary.trace_export导出的trace为标准Chrome Trace格式JSON文件,可通过简单脚本自行统计:- 加载JSON文件,筛选出
cat字段为Op、ph字段为X的算子执行事件 - 每个事件的
name字段包含完整name_scope路径,按路径分隔符/即可提取事件所属的各层级scope - 按scope分组累加所有事件的
dur字段(单位为微秒),即可得到对应模块的总墙钟耗时
- 加载JSON文件,筛选出
- 方法3:采集完整profiler数据使用TensorBoard聚合面板
你当前TensorBoard仅显示Trace Viewer和Graph页面,是因为仅导出了基础trace数据,未采集完整profiler采样信息。将手动导出trace的逻辑替换为tf.profiler.experimental.start()/tf.profiler.experimental.stop()包裹待统计代码,重新生成日志后打开TensorBoard,Profile页会自动加载Op Profile面板,支持按name_scope层级展开查看各模块的聚合CPU/GPU总耗时、耗时占比等统计数据。
注意:如果模型使用
tf.function编译,需将with tf.name_scope(...)代码块写在被@tf.function装饰的函数内部,避免scope前缀无法正确绑定到编译后的算子,导致聚合结果不准。
内容的提问来源于stack exchange,提问作者Gareth Williams
相关产品推荐
相关产品推荐

