在 Tensorflow 中需要通过创建 Session 类实例来为当前计算图注册会话,然后通过会话的 run
方法或者是 tf.Tensor.eval
来执行计算,得到所需操作的输出。
通常而言,在平时的学习和 demo 测试中采用 Session 的默认设置已经足够了。但是当我们需要编写多 GPU 程序还要保证程序的可移植性,又或者因为生产需要而要求更准确地控制会话的时候就涉及到 Session 的配置。
Session 可以通过 ConfigProto 类来进行配置。ConfigProto 包含有许多属性,能够配置并行的线程数、GPU 的分配策略、设备日记等等属性,更多属性详情请自行参考 Tensorflow 官网 API 介绍。
在这众多的属性当中,最常用的一般是 log_device_placement
和 allow_soft_placement
。配置的设置方式如下:
config = tf.ConfigProto(log_device_placement=True,
allow_soft_placement=True)
sess = tf.Session(config=config)
allow_soft_placement
allow_soft_placement
是布尔类型的属性,默认情况下是 False
。当将它的值设置为 True
的时候,在以下任意一条条件满足时,程序会将原先在 GPU 上的计算迁移到 CPU 中完成:
- 运算无法在 GPU 上执行
- 没有 GPU 资源
- 运算输入包含对 CPU 计算结果的引用
考虑到不同机器中的 GPU 驱动版本、数量等都可能存在差异,因此为了提升程序的可移植性,可以将该选项设置为 True
,从而避免了在其它机器上运行程序时因为 GPU 支持问题而直接抛出异常。
log_device_placement
log_device_placement
也是一个布尔型属性,默认为 False
。将该属性设置为 True
的时候,程序日志中将记录计算图中每个节点是在哪个设备中进行计算的。在编写与测试程序的过程中设置为 True
可以方便调试,而在生产中可以将该属性设置为 False
以减少日志占用的空间。