TensorFlow 并行计算
多 GPU
简述
如果有两块卡,但是代码里不设置的话,默认把变量都放到 device('/gpu:0')
,所以只有 gpu 0 在计算。
tensorflow 默认是占满显存的,然后等到程序需要用的时候直接拿来用,这个是 tensorflow 设计的一个机制,对于这一机制大家褒贬不一
限制 GPU 资源
动态申请显存
1 | config = tf.ConfigProto() |
限制GPU使用率
1 | gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.333) |
其中0.333是你自己设置的想用百分之多少的显存。
例一
1 | # Multi GPU computing |
例二
1 | # Place all ops on CPU by default |
多线程
在进行 tf.ConfigProto()
初始化时,我们也可以通过设置 intra_op_parallelism_threads
参数和 inter_op_parallelism_threads
参数,来控制每个操作符op并行计算的线程个数。
二者的区别在于:
intra_op_parallelism_threads
控制运算符op内部的并行
当运算符op为单一运算符,并且内部可以实现并行时,如矩阵乘法,reduce_sum
之类的操作,可以通过设置 intra_op_parallelism_threads
参数来并行, intra 代表内部。
inter_op_parallelism_threads
控制多个运算符op之间的并行计算
当有多个运算符 op,并且他们之间比较独立,运算符和运算符之间没有直接的路径Path相连。Tensorflow 会尝试并行地计算他们,使用由 inter_op_parallelism_threads
参数来控制数量的一个线程池。
以上两个参数如果设置为0代表让系统设置合适的数值
1 | config = tf.ConfigProto(device_count={"CPU": 4}, # limit to num_cpu_core CPU usage |
实例比较,线程数为2和4,平均每个batch的运行时间:
当参数为intra_op_parallelism_threads = 2时, 每个step的平均运行时间从610ms降低到380ms。
当参数为intra_op_parallelism_threads = 4时, 每个step的平均运行时间从610ms降低到230ms。
总结,在固定CPUcore的资源限制下,通过合理设置线程thread个数可以明显提升tensorflow程序运行速度。