GNUParallel-代替引数

Sep 09 2020

並列コマンドを実行するたびに引数を変更できるようにしたい。

画像を処理するスクリプトがあり、GNUParallelを使用して複数のプロセスを同時に起動します。このスクリプトではGPUコアを使用していますが、2つのGPUコアのうち1つしか使用されていません。

2つの異なる構成ファイル(1つはGPU 1用、もう1つはGPU 2用)を使用できるようにしたいのですが、その方法がわかりません。

gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year $config" $ configが1回おきに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)
...
}

回答

1 OleTange Sep 10 2020 at 14:26

あなたの説明を考えると、おそらくGNUParallelを代替させたくないでしょう。すべての奇数ジョブに1秒かかり、すべての偶数ジョブに2秒かかると想像してください。次に、同じGPUで実行されているジョブが、他のGPUでは実行されていない状態になります。

代わりに必要なのは、GPU2でジョブが終了するとすぐにGPU2でジョブを開始することです。{%}(別名ジョブスロット)はこれのために作られています:

parallel -j2 'sleep {}; echo {}-GPU{%} seq {#}' ::: 1 2 1 2 1 2 1 2 1 2 1 2
MarkSetchell Sep 09 2020 at 18:35

このようなものが機能するはずです:

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