TensorFlow配置项的文档位于这里
TensorFlow可以通过指定配置项,来配置需要运行的会话,示例代码如下:
run_config = tf.ConfigProto()
sess = tf.Session(config=run_config)
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的列表。
GPUOpition配置项
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固定内存是不能分页的,因而有大量固定内存对于整个主机系统的性能可能会有负面影响。
GraphOption配置项
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:控制图的重写类型和次数的选项。
OptimizerOption配置项
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:编辑器/运行时编译的等级。
RPCOption配置项
RPCOptions类,有如下设置选项:
bool use_rpc_for_inprocess_master:是否在进程间使用远程调用的选项。如果设置为True,总是允许使用远程调用来联系会话目标。默认设置为False,那么TensorFlow会为客主之间的交流提供优化的传送方式,从而避免使用远程调用堆栈。这个选项主要用于测试远程堆栈的时候使用。
比较完整的配置使用示例:
run_config = tf.ConfigProto()
run_config.use_per_session_threads = False
run_config.allow_soft_placement = False
run_config.gpu_options.per_process_gpu_memory_fraction = 0.0
run_config.gpu_options.allow_growth = False
run_config.graph_options.enable_recv_scheduling = False
run_config.graph_options.timeline_step = 0
run_config.rpc_options.use_rpc_for_inprocess_master = False
sess = tf.Session(config=run_config)