Debugging 是程序员必备技能,TensorFlow 程序员也不例外。然而 TensorFlow 的运行模式是先构造一张 graph,再执行 session.run(),这就为调试带来一些困难。普通调试工具如 pdb 只能看到 graph 外部的变量和控制流程,无法深入 graph 内部一探究竟。
几种常用方法:
1.通过Session.run()获取变量的值
2.利用Tensorboard查看一些可视化统计
3.使用tf.Print()和tf.Assert()打印变量
4.使用Python的debug工具: ipdb, pudb
5.利用tf.py_func()向图中插入自定义的打印代码, tdb
6.使用官方debug工具: tfdbg
>>tf的eager模式与graph模式(https://zhuanlan.zhihu.com/p/47201474)
eager 模式就是类似于 python 这样的命令式编程,写好程序之后,不需要编译,就可以直接运行了,而且非常直观;而之前的静态图模式则类似于 c/c++ 的声明式编程。写好程序之后要先编译,然后才能运行。
官方给的建议是:同时写 eager 模式代码和 graph 模式代码,使用 eager 模式快速调试和 debug,然后利用 graph 模式在分布式训练方面的优势部署;
>>tfdbg:
(1)导包
from tensorflow.python import debug as tfdbg
(2)封装原会话,添加过滤规则
sess = tfdbg.LocalCLIDebugWrapperSession(sess) # 被调试器封装的会话
sess.add_tensor_filter("has_inf_or_nan", tfdbg.has_inf_or_nan) # 调试器添加过滤规则
(3)查看图中节点信息
》run ##运行图
》pt *** ##查看tensor详情
》ni *** ##查看节点信息(包含前后节点)
》ls 命令可以查看创建节点的框架源码
》run -f has_inf_or_nan 使用该过滤器,检查运行时的 tensor 出现 NaN 或 Inf 的情况。
>>error处理
当你的cuda和cudnn都load成功时,
依然出现了cudnn failed to initialize错误
这时候你需要做的是指定tensorflow对gpu的使用率,
###设定使用率不超过50%
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.5)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
###设定使用率按需增长
session_config = tf.ConfigProto(gpu_options=tf.GPUOptions(allow_growth=True))
sess = tf.Session(config=session_config)
但是如果cuda与cudnn load 失败时,则需要考虑cuda与cudnn安装是否成功!
参考链接: