如何使TensorFlow使用更多可用的CPU

use*_*481 10 amazon-ec2 amazon-web-services tensorflow

如何充分利用我的每个EC2内核?

我正在使用c4.4xlarge AWS Ubuntu EC2实例和TensorFlow来构建一个大型复杂的神经网络.nproc说我的EC2实例有16个核心.当我运行我的convnet培训代码时,顶级实用程序说我只使用400%的CPU.由于有16个内核,我原以为它使用1600%的CPU.AWS EC2监控选项卡确认我只使用了25%的CPU容量.这是一个巨大的网络,在我的新Mac Pro上,它消耗大约600%的CPU并且需要几个小时来构建,所以我不认为原因是因为我的网络太小.

我相信下面这一行最终决定了CPU的使用情况:

sess = tf.InteractiveSession(config=tf.ConfigProto())
Run Code Online (Sandbox Code Playgroud)

我承认我并不完全理解线程和内核之间的关系,但我尝试增加内核数量.它与上面的行具有相同的效果:仍然是400%的CPU.

NUM_THREADS = 16
sess = tf.InteractiveSession(config=tf.ConfigProto(intra_op_parallelism_threads=NUM_THREADS))
Run Code Online (Sandbox Code Playgroud)

编辑:

  • htop显示我实际上使用了所有16个EC2核心,但每个核心只有大约25%
  • top显示我的总CPU%约为400%,但偶尔会达到1300%,然后几乎立即回落到约400%.这让我觉得可能存在死锁问题

ben*_*ben 6

你可以尝试几件事:

增加线程数

你已经尝试过更改了intra_op_parallelism_threads.根据您的网络,增加它也是有意义的inter_op_parallelism_threads.来自doc:

inter_op_parallelism_threads:

执行阻塞操作的节点
在每个进程中可用的inter_op_parallelism_threads 池中排队.0表示系统选择一个合适的号码.

intra_op_parallelism_threads:

可以在intra_op_parallelism_threads池上并行执行单个op(对于某些op类型).0表示系统选择一个合适的号码.

(旁注:上面引用的配置文件中的值不是tensorflow使用的实际默认值,而只是示例值.您可以通过手动检查tf.ConfigProto()返回的对象来查看实际的默认配置.)

Tensorflow对上述选项使用0表示它尝试自己选择适当的值.我不认为tensorflow选择了导致您出现问题的不良值,但您可以尝试使用上述选项的不同值来保证安全.


提取跟踪以查看代码并行化的程度

看看 tensorflow代码优化策略

它可以让你像这样.在这张图片中,您可以看到实际计算发生在比可用线程少得多的线程上.这也可能是您的网络的情况.我标记了潜在的同步点.在那里,您可以看到所有线程都在短时间内处于活动状态,这可能是您遇到的CPU利用率偶尔出现峰值的原因.

  • 确保没有内存不足(htop)
  • 确保你没有做很多I/O或类似的东西