リソースを飽和させずにマルチコアノードで合理的な並列化を取得する方法は?他の多くの同様の質問と同様に、問題は合理的なパフォーマンスのためにGNU Parallelを調整する方法を学ぶ方法です。
次の例では、リソースが飽和しておらず、プロセスを並列に実行できないか、-j -N
特定のオプションを使用した後、すべてが1つのCPUで実行されるように見えます。
マルチコアシステムで実行される Bash スクリプト内では、次のループが GNU Parallel に渡されます。
for BAND in $(seq 1 "$BANDS") ;do
echo "gdalmerge_and_clean $VARIABLE $YEAR $BAND $OUTPUT_PIXEL_SIZE_X $OUTPUT_PIXEL_SIZE_Y"
done |parallel
しかし、これにより機械が飽和し、処理速度が遅くなる可能性がある。
man parallel
私が読んだ後
--作業-N
-j -N
--max-procs -N
-P -NCPU スレッド数から N を引いた数です。
あまりにも多くのタスクを並列に実行してください。評価された数値が1未満の場合、1が使用されます。
参照: --スレッド数 --コア数 --ソケット数
使ってみました。
|parallel -j -3
ただし、何らかの理由で、これは40個のCPUのうちの1つだけを使用します。 [h]top チェックを使用すると、CPU 1 つだけが高い使用量で報告され、残りは 0 に低下します。 「CPU数」は使用しないでください-j -3
。たとえば、3の場合、CPUは37個になります。
それからさっき通話を延長した
-j -3 --use-cores-instead-of-threads
盲目的にするようです。私は読んだhttps://unix.stackexchange.com/a/114678/13011そして、これらの並列ジョブを実行するために使用しているクラスタの管理者から学びました。ハイパースレッディングが無効になっています。。これはまだCPUで実行されます。
今、私は次を使用しようとしています。
for BAND in $(seq 1 "$BANDS") ;do
echo "gdalmerge_and_clean $VARIABLE $YEAR $BAND $OUTPUT_PIXEL_SIZE_X $OUTPUT_PIXEL_SIZE_Y"
done |parallel -j 95%
または|parallel -j 95% --use-cores-instead-of-threads
。
ノート
ちなみに、これはHTCondorを介してスケジュールされたバッチジョブの一部であり、各ジョブは約40個の使用可能な物理CPUを持つ別々のノードで実行されます。
上記では必要な部分だけを維持しました。パイプされた完全なforループはparallel
次のとおりです。
for BAND in $(seq 1 "$BANDS") ;do # Do not extract, unscale and merge if the scaled map exists already! SCALED_MAP="era5_and_land_${VARIABLE}_${YEAR}_band_${BAND}_merged_scaled.nc" MERGED_MAP="era5_and_land_${VARIABLE}_${YEAR}_band_${BAND}_merged.nc" if [ ! -f "${SCALED_MAP+set}" ] ;then echo "log $LOG_FILE Action=Merge, Output=$MERGED_MAP, Pixel >size=$OUTPUT_PIXEL_SIZE_X $OUTPUT_PIXEL_SIZE_Y, Timestamp=$(timestamp)" echo "gdalmerge_and_clean $VARIABLE $YEAR $BAND $OUTPUT_PIXEL_SIZE_X >$OUTPUT_PIXEL_SIZE_Y" else echo "warning "Scaled map "$SCALED_MAP" exists already! Skipping merging.-"" fi done |parallel -j 95% log "$LOG_FILE" "Action=Merge, End=$(timestamp)"
where `log` and `warning` are a custom functions
答え1
デバッグするには、まずthanを使用することをお勧めしますgdalmerge_and_clean
。
努力する:
seq 100 | parallel 'seq {} 100000000 | gzip | wc -c'
各CPUスレッドが1つのジョブを正しく実行していますか?
seq 100 | parallel -j 95% 'seq {} 100000000 | gzip | wc -c'
20個のCPUスレッドごとに19個のジョブを正しく実行しますか?
私の考えでは、gdalmerge_and_clean
実際には正しい数のインスタンスで実行されていますが、I / Oによって異なり、それを待っているようです。したがって、CPUがアイドル状態で待機している間、ディスクまたはネットワークは最大値に達します。
を使用して、正しい数のレプリカが開始されたことを確認できますps aux | grep gdalmerge_and_clean
。
ディスクが使用中であることを確認できますiostats -dkx 1
。