TensorFlow r1.8 eager模式是否支持tf.profiler及RunMetadata传入方法问询
针对你提到的问题,先给一个明确的结论:TensorFlow r1.8的Eager模式对tf.profiler的支持非常有限,原生的基于tf.RunMetadata()的profiling流程几乎无法正常工作。
原因其实和你观察到的一致:tf.profiler在r1.8版本的设计严重依赖Graph和Session机制,而Eager模式是即时执行,没有Session对象,也不会预先构建计算图,所以profiler构造函数会检测到Eager环境并限制功能,缺少RunMetadata更是直接阻断了核心的 profiling 数据捕获流程。
不过也不是完全没有办法,这里给你两个可行的替代方案:
方案1:临时切换到Graph模式完成profiling
如果你的代码可以兼容Graph模式,可以在需要分析的代码块前后手动切换执行模式,利用Graph模式下完整的profiler功能:
import tensorflow as tf tf.enable_eager_execution() # 你的Eager模式业务代码... # 切换到Graph模式执行profiling tf.disable_eager_execution() with tf.Session() as sess: run_metadata = tf.RunMetadata() # 配置profiler选项,比如统计浮点运算量 profiler_opts = tf.profiler.ProfileOptionBuilder.float_operation() # 构建你的计算图并运行(这里需要把Eager代码转成Graph模式的写法) result = sess.run(your_computation_op, run_metadata=run_metadata) # 执行profiling并输出报告 tf.profiler.profile( tf.get_default_graph(), run_meta=run_metadata, cmd='op', options=profiler_opts ) # 切回Eager模式继续后续代码 tf.enable_eager_execution()
这个方法虽然需要额外调整代码,但胜在能利用tf.profiler的完整功能,适合需要深度分析的场景。
方案2:使用tf.contrib.eager的轻量性能统计工具
r1.8的tf.contrib.eager模块提供了一套简易的性能统计工具,不需要依赖RunMetadata,可以直接在Eager模式下运行:
import tensorflow as tf from tensorflow.contrib.eager.python import profiler tf.enable_eager_execution() # 开始记录性能数据 profiler.start() # 执行你要分析的Eager模式代码 your_eager_training_loop() # 停止记录并生成统计报告 stats = profiler.stop() print(stats)
这个工具的输出比较基础,主要是函数调用耗时等信息,没有tf.profiler那么详细的算子内存占用、运算量统计,但胜在无需切换模式,使用简单。
另外补充一句:如果你的项目允许升级TensorFlow版本,建议考虑升级到1.10及以上——从1.10开始,Eager模式对tf.profiler的支持有了大幅改进,后续版本还推出了tf.profiler.experimental系列API,完全适配Eager模式的即时执行特性,使用起来会顺畅很多。
内容的提问来源于stack exchange,提问作者Steven D

