【发布时间】:2017-03-06 05:03:10
【问题描述】:
我目前正在使用 C++ 实现 Tensorflow 自定义操作(用于自定义数据获取器),以加快我的 Tensorflow 模型。由于我的 Tensorflow 模型不经常使用 GPU,我相信我可以同时使用多个工作线程来实现最大性能。
问题是,即使我有足够的工人,我的程序并没有利用所有的 CPU。在我的开发机器中,(4 个物理内核)它使用了大约 90% 的用户时间、4% 的系统时间、4 个工作线程和tf.ConfigProto(inter_op_parallelism_threads=6)options。
有了更多的工作线程和inter_op_parallelism_threads 选项,我得到的模型运行性能比以前的配置差得多。由于我不擅长prpfiling,我不知道我的代码的瓶颈在哪里。
是否有任何经验法则可以最大限度地提高 CPU 使用率和/或找到 Linux 中单个进程(非系统范围)的性能瓶颈/互斥锁的好工具?
编辑:我的代码运行 python,但(几乎)每次执行都在 C++ 代码中。其中一些不是我的(Tensorflow 和 Eigen),我制作了一个可以在 Python 中动态加载的共享库,它被 Tensorflow 内核调用。 Tensorflow 拥有他们的线程池,我的动态库代码也拥有线程池,我的代码是thread safe。我还创建线程来同时调用sess.run() 以便调用它们。就像 Python 可以同时调用多个 HTTP 请求一样,sess.run() 发布 GIL。我的对象是尽可能调用sess.run() 以提高“真实”性能,并且任何与python 相关的分析器都没有成功。
【问题讨论】:
-
我觉得你有点自相矛盾。首先你提到“我的程序利用所有cpu”,然后你说“有没有什么经验法则可以最大限度地利用CPU”。那么你想增加 CPU 负载还是减少它呢?
-
@SingerOfTheFall 这是错字。固定。
-
您应该首先使用分析器来查找瓶颈。对于它的价值,CPU 可能大部分时间都在等待从内存/磁盘中获取数据。
-
有了更多的工作线程...我的模型运行性能变得更差了 -- 假设你使用的是 CPython,多线程会影响 CPU-bound 性能,因为只有 1 个线程在 Python 中一次工作,但由于线程如何获取和释放全局解释器锁,最终会产生很多开销。要改进 CPU 密集型工作,您需要多个进程。还要考虑到您的瓶颈实际上可能不是 CPU。
-
@sytech AFAIK tensorflow 的 sess.run() 发布 GIL,因此通常同时调用 sess.run() 函数。 stackoverflow.com/a/34420169
标签: python c++ multithreading tensorflow profiling