我正在使用 GNU 并行进行一些训练。训练需要大约 30 秒来运行一次迭代,而我需要运行大约 3000 次。训练本身无法并行化(至少需要付出相当大的努力),但是,我使用几个不同的种子运行此训练,所有这些种子可以轻松地在不同的内核上运行。
这就是我使用并行的方式 -
#!/bin/bash
parallel ./train.py config/config.yml _results/ \
--seed {1} \
::: {1..5}
当我运行它时,并行将所有 5 个进程放在同一个核心 (core0) 上,每个进程都有 20% 的 CPU 使用率(使用 htop 检查)。
如果我使用相同的命令运行另一组训练,则会向 core0 添加 5 个进程,现在它们都显示 10% 的 CPU 使用率。
我使用的是 Ubuntu 18.04
Operating System: Ubuntu 18.04.4 LTS
Kernel: Linux 5.3.0-28-generic
和锐龙 5 3600
processor : 0
vendor_id : AuthenticAMD
cpu family : 23
model : 113
model name : AMD Ryzen 5 3600 6-Core Processor
stepping : 0
microcode : 0x8701013
cpu MHz : 3868.329
cache size : 512 KB
physical id : 0
siblings : 12
core id : 0
cpu cores : 6
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 16
wp : yes
...
我当前的(非)解决方案是在开始训练后使用任务集将每个种子放在不同的核心上。
答案1
GNU Parallel 不控制在哪个核心上运行,所以我希望它们也能在同一个核心上运行:
bzip2 < /dev/zero >/dev/null &
bzip2 < /dev/zero >/dev/null &
bzip2 < /dev/zero >/dev/null &
bzip2 < /dev/zero >/dev/null &
bzip2 < /dev/zero >/dev/null &
如果是这种情况,则说明某些因素迫使您的 shell 在同一核心上生成所有进程,您可能应该找出导致此情况的原因。
但如果taskset
有效,您可以将其作为解决方法:
parallel taskset -c '{=$_=slot()-1=}' train...