如何充分利用我的每个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))
编辑:
答案 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利用率偶然达到峰值的原因。