我正在一台有 12 个 CPU 的计算机上运行 TensorFLow/Keras 机器学习 Python 脚本。
当我在我的 Ubuntu 终端中执行:时 taskset -c cpu_list main.py
,我发现该脚本的最佳 CPU 数量是 5。
差异相当显著,从 12 个 CPU 变为 5 个 CPU 时,时间减少了约 200%。
此外,1 个 CPU 的运行时间与 12 个 CPU 的运行时间相似。
我很困惑为什么会出现这种情况,为什么使用全部 12 个并不能提供最快的运行时间,因为它会有更多的 CPU 可用于计算?
答案1
你有 12线程,不是 12 个满核心。
因此,超过分配的 6 个 CPU 时,您将分享跨线程使用核心。如果任务仅使用核心功能的特定子集,那么您可能看不到任何性能优势,因为任务将有效地等待彼此完成工作。这称为超线程当任务具有多样性时效果最好浮点和整数计算的混合。
满载的 CPU 也会达到其热极限,因此不会涡轮增压否则,您可能会因此而失去性能。
通过完全加载所有 6/12 个核心,您还可能会没有足够的时间执行其他任务,例如从磁盘加载或保存数据,在将数据复制到内存或从内存复制数据以及执行许多其他操作时可能会达到带宽限制。
如果你不完全了解你正在执行的任务以及它如何探测系统的极限,那么仅仅投入更多 CPU 来解决问题并不一定有帮助。内存或 CPU-GPU 链路的带宽对于“正常”计算机任务来说可能非常大,但对于其他任务(例如神经学习任务)来说则完全不够。
我们将这些任务转移到 GPU 的一个原因是它们拥有大量小而快的内核,但与通用 CPU 相比,它们的带宽大幅增加也是一个经常被低估的关键因素。现代 GPU 的内存带宽为 256GB/s,而 CPU 的内存带宽为 42GB/s。
因此,超过 5 个核心可能会遇到很多限制。
经常可以看到人们在不知道瓶颈在哪里的情况下,投入大量资金购买一台“疯狂野兽”般的机器,最终却得到了一台具有一些非常具体且令人担忧的限制的机器,而这些限制本来可以避免,同时还能节省大量资金。Xeon 处理器在很多情况下可能会有所帮助,但在许多情况下,其较大的核心数和由此导致的较低时钟速度实际上可能会更糟。