하나의 CPU 코어만 사용하는 GNU 병렬

하나의 CPU 코어만 사용하는 GNU 병렬

저는 GNU를 사용하여 일부 교육을 병렬로 수행하고 있습니다. 훈련은 한 번의 반복을 실행하는 데 약 30초가 걸리며 약 3000번을 실행해야 합니다. 훈련 자체는 병렬화될 수 없지만(적어도 상당한 노력 없이는) 여러 가지 다른 시드를 사용하여 이 훈련을 실행했는데, 모두 다른 코어에서 쉽게 실행할 수 있습니다.

이것이 내가 병렬성을 사용하는 방법입니다.

#!/bin/bash
parallel ./train.py config/config.yml _results/ \
--seed {1} \
::: {1..5}

동일한 코어(core0)에서 5개 프로세스 모두와 병렬로 실행하면 각 프로세스의 CPU 사용량은 20%입니다(htop을 사용하여 확인).

동일한 명령을 사용하여 다른 훈련 세트를 실행하면 5개의 프로세스가 core0에 추가되고 이제 모두 10%의 CPU 사용량이 표시됩니다.

우분투 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 &

이 경우, 쉘이 동일한 코어에서 모든 프로세스를 생성하도록 강제하는 경우가 있으며, 원인이 무엇인지 파악해야 합니다.

하지만 taskset작동한다면 다음을 해결 방법으로 사용할 수 있습니다.

parallel taskset -c '{=$_=slot()-1=}' train...

관련 정보