ナード戦隊データマン

機械学習, 自然言語処理, データサイエンスについてのブログ

aws-parallelclusterでslurmを使う

AWS parallelclusterとは、AWSでハイパフォーマンスコンピューティング(HPC)を実行するための環境です。slurmはワークロードを管理するためのツールで、分散実行したいジョブを管理します。今回は、paracrawl/extractorというツールの分散実行を例にします。

github.com

aws parallelclusterの使い方

使い方は以下を見てください:

GitHub - aws/aws-parallelcluster: AWS ParallelCluster is an AWS supported Open Source cluster management tool to deploy and manage HPC clusters in the AWS cloud.

注意点としては、pemファイルを使う場合は以下のように指定する必要がある点です:

$ chmod 400 your.pem
$ pcluster ssh testcluster -i your.pem

paracrawl/extractorのコンパイル

まず、以下を見てコンパイルを行います:

GitHub - paracrawl/extractor

コンパイル後、以下のようなコマンドを実行します。

$ cp mono /home/ubuntu/bin
$ cp *.so /home/ubuntu/bin
$ cd /home/ubuntu/bin
$ mkdir libs
$ ldd mono | grep "=> /" | awk '{print $3}' | xargs -I '{}' cp -v '{}' libs/

実行スクリプトの作成

sbatchでparacrawl/extractorを実行するためのスクリプトを作成します。

[execute.sh]

#!/bin/bash

INDIR=$1
OUTDIR=$2
FILEID=$3
INFILE=${INDIR}/${FILEID}.txt
URL_NUM=$4
CPU_NUM=$5
OUTDIR_ID=${OUTDIR}/${FILEID}

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/home/ubuntu/extractor_workflow/bin/libs/

cat ${INFILE} | awk '{print "https://commoncrawl.s3.amazonaws.com/"$0}' | head -n ${URL_NUM} | ./bin/mono --icompression gzip --ocompression gzip --workers ${CPU_NUM} --output ${OUTDIR_ID} --curl --print_stats

このスクリプトは、事前に分割したURLのリストファイルから一つを選び、指定した数のURLを抽出した上で、指定した数のCPUを使ってモノリンガルコーパスを抽出します。

sbatchへ渡すスクリプト

sbatchというコマンドを使えばslurmにジョブを送信できますが、そのためのスクリプトを書きます。

#!/bin/bash

#SBATCH -N 2
#SBATCH -n 2
#SBATCH -c 2
#SBATCH -t 02:00:00


for i in $(seq 0 1); do
    srun -N 1 -n 1 bash execute.sh indir outdir ${i} 2 2 &
done

wait

これは、ノード数2, タスク数2, タスク1あたりのCPU数2としてexecute.shを実行します。並列実行したいため、forループ内の実行コマンドは&がついています。srunは、slurmのコマンドの一つで、指定したコマンドを送信します。

実行

$ sbatch run.sh

[実行ログ]

$ cat slurm-7.out
(info) [2019-12-18 02:04:11]: The number of workers set to 2.
(info) [2019-12-18 02:04:11]: Current limit of open file descriptors: 8192
(info) [2019-12-18 02:04:11]: Expecting input compression: gzip
(info) [2019-12-18 02:04:11]: Setting output compression: gzip
(info) [2019-12-18 02:04:11]: Outputting to: outdir/1
(info) [2019-12-18 02:04:11]: Using curl to download remote files.
(info) [2019-12-18 02:04:11]: Printing language statistics: On
(info) [2019-12-18 02:04:11]: The number of workers set to 2.
(info) [2019-12-18 02:04:11]: Current limit of open file descriptors: 8192
(info) [2019-12-18 02:04:11]: Expecting input compression: gzip
(info) [2019-12-18 02:04:11]: Setting output compression: gzip
(info) [2019-12-18 02:04:11]: Outputting to: outdir/0
(info) [2019-12-18 02:04:11]: Using curl to download remote files.
(info) [2019-12-18 02:04:11]: Printing language statistics: On
(info) [2019-12-18 02:04:11]: 2 files found to process.

(info) [2019-12-18 02:04:11]: 2 files found to process.

 2/2 [======================================================================] 100 %
(info) [2019-12-18 02:05:57]: Done.
 2/2 [======================================================================] 100 %
(info) [2019-12-18 02:05:59]: Done.

考察

このようにして、分散実行ができました。

まず考慮すべきことは、計算インスタンスタイプを選ぶことです。CPU数とコストに応じてインスタンスタイプを指定する必要がありますが、C5インスタンスはこの目的のために設計されています。

Amazon EC2 C5 インスタンス | AWS

また、各々の計算インスタンスにはライブラリ等がインストールされていないため、ライブラリをリンクしている場合はlddコマンド等を使ってリンクしているものを列挙し、それをHOME内にコピーする必要があります。HOME内のファイルはNFSでシェアされているため、各々の計算インスタンスでも利用できます。基本的には、単一のバイナリをHOME内に置いたり、リンクするライブラリのすべてをHOME内に置けば計算インスタンス内で実行しやすいです。

pythonの場合は、cythonを使えば単一のバイナリとして作れます。

build - Is there a way to compile python application into static binary? - Stack Overflow

基本的には、ローカルマシンのCPU数を遥かに超える並列処理を行う場合に限って、HPCを検討したほうが良いでしょう。もし、ローカルマシンのCPU数分の並列実行で十分なら、そのほうが低コストです。

参考

  1. A Scientist's Guide to Cloud-HPC: Example with AWS ParallelCluster, Slurm, Spack, and WRF | Jiawei Zhuang
  2. Copy all shared libraries for a binary to directory Using awk, cp, file, grep, ldd, xargs
  3. AWS ParallelCluster | AWS Open Source Blog
  4. Slurm Workload Manager - Documentation
  5. GitHub - aws/aws-parallelcluster: AWS ParallelCluster is an AWS supported Open Source cluster management tool to deploy and manage HPC clusters in the AWS cloud.
  6. How to Run Multiple Serial Programs as a Single SLURM Job | On Computing Well
  7. Running your first job on AWS ParallelCluster — AWS ParallelCluster 2.4.1
  8. GitHub - paracrawl/extractor
  9. build - Is there a way to compile python application into static binary? - Stack Overflow