GNU 병렬-대체 인수
병렬 명령을 실행할 때마다 인수를 대체 할 수 있기를 원합니다.
이미지를 처리하는 스크립트가 있고 GNU Parallel을 사용하여 동시에 여러 프로세스를 시작합니다. 이 스크립트에서 GPU 코어를 사용하지만 2 개의 GPU 코어 중 하나만 사용됩니다.
2 개의 다른 구성 파일 (GPU 1 용, GPU 2 용)을 사용할 수 있기를 원하지만 그 방법을 모르겠습니다.
gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year $config" $ config가 실행될 때마다 gpu_1에서 gpu_2로 변경됨
이것이 가능합니까?
감사합니다 😉
편집하다:
병렬 명령 ( {#}) 의 작업 번호를 인수로 사용하고 다음 작업 번호의 모듈로를 사용하여 0 또는 1을 가져옵니다.
gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year {#}"
에서 작업 기능 :
task(){
...
jobnumber=$4 gpu=$(expr $jobnumber% 2)
...
}
답변
설명을 감안할 때 GNU Parallel이 대체하는 것을 원하지 않을 것입니다. 모든 홀수 작업에는 1 초가 걸리고 모든 짝수 작업에는 2 초가 걸린다고 상상해보십시오. 그런 다음 동일한 GPU에서 실행되는 작업이 끝나고 다른 GPU에서는 실행되지 않습니다.
대신 원하는 것은 GPU2에서 작업이 완료되는 즉시 GPU2에서 작업을 시작하는 것입니다. {%}(일명 작업 슬롯)은이를 위해 만들어집니다.
parallel -j2 'sleep {}; echo {}-GPU{%} seq {#}' ::: 1 2 1 2 1 2 1 2 1 2 1 2
다음과 같이 작동합니다.
seq 14 | parallel -k echo task {} {= '$_=seq() % 2 ? "gpu1" : "gpu2"' =}
산출
task 1 gpu1
task 2 gpu2
task 3 gpu1
task 4 gpu2
task 5 gpu1
task 6 gpu2
task 7 gpu1
task 8 gpu2
task 9 gpu1
task 10 gpu2
task 11 gpu1
task 12 gpu2
task 13 gpu1
task 14 gpu2