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