TensorFlow会话的配置项

01 TensorFlow配置项的文档位于这里

TensorFlow可以通过指定配置项,来配置需要运行的会话,示例代码如下:

run_config = tf.ConfigProto() sess = tf.Session(config=run_config)

02 ConfigProto类配置项

对于ConfigProto类具体有如下可配置的部分。

map<string, int32> device_count:设备的数量映射。key为设备的名称(比如”CPU”或者”GPU”),而value为该类型设备的数量的最大值。如果没有设置的话,系统会自动设置合适的数值。

int32 intra_op_parallelism_threads:线程池中线程的数量,一些独立的操作可以在这指定的数量的线程中进行并行,如果设置为0代表让系统设置合适的数值。

int32 inter_op_parallelism_threads:每个进程可用的为进行阻塞操作节点准备的线程池中线程的数量,设置为0代表让系统选择合适的数值。需要注意的是,第一个创建的会话会为将来创建的所有会话设置这个线程的数值,除非use_per_session_threads被设置为True,或者是session_inter_op_thread_pool被配置。

bool use_per_session_threads:是否为每个会话使用单独的线程池。如果设置为True,则为这个会话使用新的线程池,而不是使用全局的线程池。仅仅支持直接的会话。如果设置为False,将会使用由第一个会话创建的全局线程池,或者使用由session_inter_op_thread_pool为每个会话配置的线程池。这个设置已经过时。设置session_inter_op_thread_pool参数中有一个元素,这个元素的num_thread等于session_inter_op_thread_pool,那么这个效果是一样的。

repeated ThreadPoolOptionProto session_inter_op_thread_pool:(实验性配置,将来可能被不同的机制所取代,这个参数是为了给那些会话需要运行在后台,并限制其运行在少量的线程中)配置会话的线程池。如果配置了这个,那么RunOption在Run被调用时,可以选择这个线程池来使用。如果线程池的num_thread被设置为0,那么inter_op_parallelism_threads会被作为num_thread设置。

int32 placement_period:这是数值是指定分配节点到硬件的周期,在系统预热(warm up)之前每隔placemeant_period步,都会重新计算节点到硬件的分配,而在此之后重新计算通常会自动降低频率。

repeated string device_filters:这个参数是硬件过滤器,如果被设置的话,会话会忽略掉所有不匹配过滤器的硬件。每个过滤器可以分别制定比如 "/job:ps" "/job:worker/replica:3".

GPUOptions gpu_options:关于GPU的配置项,这是个类对象,具体参数[后面](## GPUOpition配置项)补充。

bool allow_soft_placement:这个参数制定是否允许计算的“软分配”。如果这个参数设置为True,那么一个操作在下列情况下会被放在CPU上运行:

1.操作没有GPU的实现 2.没有已知的GPU 3.需要与来自CPU的reftype输入进行协同定位

bool log_device_placement:这个参数指定是否log硬件的分配,比如某个操作分配到CPU:0之类的。

GraphOptions graph_options:关于tensorflow图的配置项,这也是个类对象,具体能配置的内容,后面补充。

int64 operation_timeout_in_ms:为会话中所有阻塞操作的全局的超时时间。如果这个值不为0,也没有被每个操作的基准修改的话,这个值就是所有阻塞操作的最长等待时间。

RPCOptions rpc_options:远程操作的选项,只在会话在分布式运行的情况下使用,是个类对象,具体可设置的参数[后面](## RPCOption配置项)补充。

ClusterDef cluster_def:所有可选择为会话所使用的workers的列表。

03 GPU Opition配置项

GPUOptions类,有如下设置选项:

double per_process_gpu_memory_fraction:数值在0到1之间,表示预分配多少比例的可用GPU显存给每个进程。比如1表示预分配所有的可用的GPU显存,0.5则表示分配50%的可用的GPU显存。

string allocator_type:用于设置GPU分配的策略。””空字符串(为默认值)表示由系统选择策略,但是这个策略会一直变化。”BFC”指定采用最佳适配合并算法,是Doung Lea’s malloc算法的简化版,具体算法介绍,可以参考博文http://www.cnblogs.com/yao62995/p/5773166.html

int64 deferred_deletion_bytes:这是设置删除的缓存上限的值。如果这个值不为0,那么删除操作会到这个指定的bytes大小的时候才进行删除操作,以此来减少与CPU驱动代码的交互次数。如果设置为0,系统会选择一个合理的数值。

bool allow_growth:是否采用增长的方式分配显存。如果这个值为True,那么分配器不会预分配整个指定的GPU显存空间,而是开始分配一小部分显存,然后随着需要而增加。

string visible_device_list:逗号分隔的GPU的id列表,决定着GPU硬件从”可见的”到”虚拟的”之间的映射关系。比如TensorFlow在进程里可以看到8张GPU,而有人想把可见的GPU的5和3映射成”/gpu:0”和”/gpu:1”,那么他可以制定这个参数值为”5,3”。除了应用于进程可见的CPU之外,这个域类似于CUDA_VISIBLE_DEVICES环境变量。

注意:GPU驱动以某种顺序提供给进程可见的GPU,但是这个顺序并不保证与机器上的物理的CPU的id有任何关系。这个域用以重新从可见到虚拟建立映射,这就意味着这个操作在进程启动之后。因而,要求用户在调用TensorFlow之前,使用供应商指定的机制(比如CUDA_VISIBLE_DEVICES)来控制从物理的到可见硬件的映射关系。

int32 polling_active_delay_usecs:轮询的间隔时间长,当队列不为空的时候,两个轮询调用时间休眠设置的时间长(单位:microseconds),如果这个值被设置为0或者没有设置,那么会设置为一个非0的默认值。

int32 polling_inactive_delay_msecs:轮询休眠时长,当队列为空的情况下,两次调用轮询的时间间隔设置的时间长(单位:millisconds)。如果设置为0或没有设置,那么设置为默认的非0数值。

bool force_gpu_compatible:是否启动强制张量的GPU兼容。在启用了GPU的TensorFlow中,这个选项为True,意味着所有的CPU的张量将被分配Cuda的固定内存。通常情况下,TensorFlow会推断哪些张量应该分配固定内存。但是有些情况下这种推断可能不完整,那么只要它适配内存,这个选项就对于跨硬件的内存拷贝的性能尤为重要。

注意:这个选项对于未知或者非常大的模型不能默认开启,因为所有的Cuda固定内存是不能分页的,因而有大量固定内存对于整个主机系统的性能可能会有负面影响。

04 Graph Option配置项

GraphOptions类,有如下设置选项:

bool enable_recv_scheduling:接收节点调度选项,如果设置为True,会使用控制流来安排接收节点的激活。(暂时被忽略)

OptimizerOptions optimizer_options:图的优化选项,这是个类对象,具体能配置的内容,[后面](### OptimizerOption配置项)补充。

int64 build_cost_model:在返回成本模型之前运行的步骤数,这个模型会详细的描述图中每个节点的内存使用和性能。设置为0表示没有成本模型。

int64 build_cost_model_after:在为成本模型收集统计信息之前运行的步骤数,即成本模型运行前,模型运行的步骤数。

bool infer_shapes:是否推测形状数据。设置为True的话,会用输出的数据的形状信息来标注每个节点,只要这个形状能被静态的推导出来。

bool place_pruned_graph:是否放置修建的图。设置为True的话,仅仅只放置运行的子图,而不是整个图。这个对于交互图的构建很有用,因为在这过程中,可能会产生无法在调试进程中放置的图。特别是它允许用户在往图中添加了一个无法满足的其放置位置限制的节点后,还能够继续进行会话。

bool enable_bfloat16_sendrecv:是否开启到bfloat16的转换,如果这个设置为True,那么进程之间的float数据会被转换成bfloat16的类型,这个类型定义文件见这里。

int32 timeline_step:时间表的记录的间隔步骤数。如果大于0的话,在每隔设置的步骤数,记录时间表。实验性的:这个现在对于主会话没有影响。

RewriterConfig rewrite_options:控制图的重写类型和次数的选项。

05 Optimizer Option配置项

OptimizerOptions类,有如下设置选项:

bool do_common_subexpression_elimination:是否使用通用子表达式删除来优化图。关于通用子表达式删除算法的描述,见这里。

bool do_constant_folding:是否使用常量合并来优化图。常量合并(constant folding optimization)具体描述,见这里 和这里

bool do_function_inlining:是否使用函数内联。如果设置为True,在图中执行函数内联。

enum Level:优化的等级。L1(=0)为默认的等级,会执行如下优化:1.通用子表达式删除;2.常量合并。L0(=-1)为没有优化。

Level opt_level:优化的等级选择。

enum GlobalJitLevel:控制编译器/运行时编译的使用。(实验性参数)默认设置为关闭,但是以后将被设置为打开。关闭的设置参数为OFF(=-1),其他参数(ON_1,ON_2)是打开编译器,并且数值越高,越为主动积极。更高的数值可能会降低并行的机会,并且会使用更多的内存(现在对于这些没有限制,但是之后会改变。)

GlobalJitLevel global_jit_level:编辑器/运行时编译的等级。

06 RPCOption配置项

RPCOptions类,有如下设置选项:

bool use_rpc_for_inprocess_master:是否在进程间使用远程调用的选项。如果设置为True,总是允许使用远程调用来联系会话目标。默认设置为False,那么TensorFlow会为客主之间的交流提供优化的传送方式,从而避免使用远程调用堆栈。这个选项主要用于测试远程堆栈的时候使用。

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2018-01-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python攻城狮

Python web 开发框架 Pyramid

博客地址:https://ask.hellobi.com/blog/zhiji 欢迎大家来交流学习。

1123
来自专栏人工智能LeadAI

调优哪家强——tensorflow命令行参数

深度学习神经网络往往有过多的Hyperparameter需要调优,优化算法、学习率、卷积核尺寸等很多参数都需要不断调整,使用命令行参数是非常方便的。有两种实现方...

3685
来自专栏熊二哥

MongoDB快速入门

    从我第一次听到Nosql这个概念到如今已经走过4个年头了,但仍然没有具体的去做过相应的实践。最近获得一段学习休息时间,购买了Nosql技术实践一书,正在...

18710
来自专栏Golang语言社区

厚土Go学习笔记 | 36. web服务指定路径下的get参数接收与处理

当我们使用go建立了服务器,那么一种常见的需求就摆在面前。如何给这个服务器的某个路径传参数呢?我们研究一下URL传参的接收与处理。 对于 http.Reques...

2544
来自专栏咸鱼不闲

基于http的百度语音 REST api

什么是REST api? -- REpresentational State Transfer REST api是基于http请求的一种api,就百度语音...

853
来自专栏张善友的专栏

分布式文件存储的数据库开源项目MongoDB

MongoDB是一个基于分布式文件存储的数据库开源项目。由C++语言编写。旨在为WEB应用提供可护展的高性能数据存储解决方案。 它的特点是高性能、易部署、易使用...

1999
来自专栏抠抠空间

Flask之基本使用与配置

Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于...

812
来自专栏技术博文

URI与URL的区别

Web上可用的每种资源 - HTML文档、图像、视频片段、程序等 - 由一个通过通用资源标志符(Universal Resource Identifier, 简...

2806
来自专栏C/C++基础

Linux命令(9)——tcpdump命令

tcpdump是一款类Unix/Linux环境下的抓包工具,允许用户截获和显示发送或收到的网络数据包。tcpdump 是一个在BSD许可证下发布的自由软件。

783
来自专栏个人分享

Spark BlockManager的通信及内存占用分析(源码阅读九)

  之前阅读也有总结过Block的RPC服务是通过NettyBlockRpcServer提供打开,即下载Block文件的功能。然后在启动jbo的时候由Drive...

652

扫码关注云+社区