저는 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...