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

时间:2016-07-16 21:35:07

标签: amazon-web-services amazon-ec2 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())

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

NUM_THREADS = 16
sess = tf.InteractiveSession(config=tf.ConfigProto(intra_op_parallelism_threads=NUM_THREADS))

编辑:

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

1 个答案:

答案 0 :(得分:6)

你可以尝试几件事:

增加线程数

您已尝试更改intra_op_parallelism_threads。根据您的网络,增加inter_op_parallelism_threads也是有意义的。来自doc

inter_op_parallelism_threads:

  

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

intra_op_parallelism_threads:

  

执行个人操作(for   一些操作类型)可以在池上并行化   intra_op_parallelism_threads。 0表示系统选择合适的   号。

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

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

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

看一看 tensorflow code optimization strategy

它为您提供this之类的内容。在这张图片中,您可以看到实际计算发生在比可用线程少得多的线程上。这也可能是您的网络的情况。我标记了潜在的同步点。在那里,您可以看到所有线程都在短时间内处于活动状态,这可能是您遇到的CPU利用率偶然达到峰值的原因。

  • 确保您的内存不足(htop)
  • 确保您没有做很多I / O或类似的事情