「今⽇から使い切る」
ための GNU Parallel
による並列処理⼊⾨
Koji Matsuda
1
並列処理:
ビッグデータ時代のリテラシー
•  我々が扱うべきデータ量は爆発的に増⼤
–  例)研究室で収集しているツイート:1⽇XXXX
万ツイート(圧縮してXGB)、年間XXX億ツイート
•  1CPUの性能向上は年間数⼗%、その代わり、
...
「使い切る」ための
3
赤線:クラスタに搭載されているCPU / 青線:使われているCPU数
2∼3割くらいしか使われていない!!
•  並列実⾏関係の機能が詰まったユーティリティ
•  便利なソフトウェアではあるのだが、マニュアル
が不親切(※ボリュームがありすぎる)
4
For people who live life in the parallel lane.
htt...
バカパラの三つのパターン
1.  ⼩さなファイルが超⼤量、それぞれに処理
ex. Wikipediaのすべての記事(100万記事)
2.  (1⾏1レコードの)巨⼤なファイル各⾏に処理
ex. ツイートログファイル(1ファイル数GB)
3.  ...
パターン1
処理すべきファイルがいっぱい
•  ⼤量のファイルに定型的な処理
6
001.txt
001.txt
./orig/
…
300.txt
./processed/
001.txt
001.txt
…
300.txt
何かの処理
パターン1
処理すべきファイルがいっぱい
•  GNU Parallel のファイル名置換を使う
7
ls orig/* | parallel –j 10 “mecab < {} > processed/{/}”
意味:
orig/ ディレクト...
パターン2
⼤きなファイルのすべての⾏に
8
original.txt
(100万行)
processed.txt
(100万行)何かの処理
パターン2
⼤きなファイルのすべての⾏に
•  --pipe オプションを使う
9
cat original.txt | parallel --pipe --L 10000 “hoge.py” > processed.txt
original....
パターン2’
ボトルネックの部分を並列化
•  --pipe の真髄:パイプラインの⼀部を並列
10
cat a.txt | hoge.py | fuga.py | piyo.py > b.txt
遅い速い 速い
cat a.txt | hog...
パターン3
試すべきパラメータがいっぱい
11
train.txt
学習率
0.1
0.01
0.001
層数
1
2
3
ユニット
100
200
300
train.py
./log/
lr=0.1_layer=1_u=100.log
lr...
パターン3
試すべきパラメータがいっぱい
•  GNU Parallel の 組み合わせ展開( ::: )を使う
12
lr=(0 0.05 0.1 0.5 1.0 5) # 学習率!
units=(100 200 300 400) # 隠れ層...
注意点 / Tips
•  気をつけておきたいこと:
–  time コマンドでこまめに計測
•  とくにパイプ並列の場合、早くならないこともある
–  IO / メモリが重い処理は控えめな並列数で
–  ⻑時間占有する場合は –nice オプ...
まとめ
•  GNU Parallel を使うことのメリット:
–  J簡潔に書けて
–  J柔軟に実⾏できる
–  J既存のコードとの組み合わせが容易
•  GNU Parallel を使うことのデメリット:
–  Lあまりにも簡単なので、計...
Upcoming SlideShare
Loading in...5
×

「今日から使い切る」 ための GNU Parallel による並列処理入門

112
-1

Published on

東北大学 乾・岡崎研究室で 2016/01/25 に行われた研究会でショートトークを行った際に使用した GNU Parallel のイントロダクションです。

Published in: Software
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
112
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

「今日から使い切る」 ための GNU Parallel による並列処理入門

  1. 1. 「今⽇から使い切る」 ための GNU Parallel による並列処理⼊⾨ Koji Matsuda 1
  2. 2. 並列処理: ビッグデータ時代のリテラシー •  我々が扱うべきデータ量は爆発的に増⼤ –  例)研究室で収集しているツイート:1⽇XXXX 万ツイート(圧縮してXGB)、年間XXX億ツイート •  1CPUの性能向上は年間数⼗%、その代わり、 コア数はドンドン増えてる –  乾・岡崎研はXXXコアくらいあります 「今日から使える」「プログラミング言語非依存な」 並列処理(バカパラ)の方法を共有したい 2 既存のコードを変更しなくて良い
  3. 3. 「使い切る」ための 3 赤線:クラスタに搭載されているCPU / 青線:使われているCPU数 2∼3割くらいしか使われていない!!
  4. 4. •  並列実⾏関係の機能が詰まったユーティリティ •  便利なソフトウェアではあるのだが、マニュアル が不親切(※ボリュームがありすぎる) 4 For people who live life in the parallel lane. http://www.gnu.org/software/parallel/man.html http://www.gnu.org/software/parallel/parallel_tutorial.html インスピレーションを刺激 する例も多くて良いドキュ メントだとは思うのです が・・・ 研究室生活でよく直面するユースケースに限って説明
  5. 5. バカパラの三つのパターン 1.  ⼩さなファイルが超⼤量、それぞれに処理 ex. Wikipediaのすべての記事(100万記事) 2.  (1⾏1レコードの)巨⼤なファイル各⾏に処理 ex. ツイートログファイル(1ファイル数GB) 3.  パラメータとその組み合わせが⼤量 ex. ディープラーニング •  層数、次元数、初期化、学習率, etc… GNU Parallel でワンストップに対応 5 参考:実際に動くチュートリアルが、 https://bitbucket.org/cl-tohoku/bakapara_tutorial にあります。 乾研の大半のサーバーには GNU Parallel はインストール済なので、すぐ試せるはず
  6. 6. パターン1 処理すべきファイルがいっぱい •  ⼤量のファイルに定型的な処理 6 001.txt 001.txt ./orig/ … 300.txt ./processed/ 001.txt 001.txt … 300.txt 何かの処理
  7. 7. パターン1 処理すべきファイルがいっぱい •  GNU Parallel のファイル名置換を使う 7 ls orig/* | parallel –j 10 “mecab < {} > processed/{/}” 意味: orig/ ディレクトリ以下のす べてのファイルに対して並列 で mecab を実行し、 processed/ 以下に出力せよ 処理するファイル のリストを生成 {} がファイル名に 置換される ex. orig/1.txt {/} はファイル名 からディレクトリを 取り除いたもの ex. orig/1.txt => 1.txt 並列数 並列数(-j) 所要時間(s) 1 13.70 3 4.61 5 3.79 10 3.21 表:並列数に対する所要時間の変化 @tequila
  8. 8. パターン2 ⼤きなファイルのすべての⾏に 8 original.txt (100万行) processed.txt (100万行)何かの処理
  9. 9. パターン2 ⼤きなファイルのすべての⾏に •  --pipe オプションを使う 9 cat original.txt | parallel --pipe --L 10000 “hoge.py” > processed.txt original.txt (100万行) original.txt を 1万行づつの「塊」に分解して、それぞ れを並列に hoge.py にパイプで入力せよ。結果を processed.txtにまとめよ。 1万行 hoge.py 1万行 hoge.py 1万行 hoge.py 1万行 hoge.py processed.txt (100万行) 並列実行
  10. 10. パターン2’ ボトルネックの部分を並列化 •  --pipe の真髄:パイプラインの⼀部を並列 10 cat a.txt | hoge.py | fuga.py | piyo.py > b.txt 遅い速い 速い cat a.txt | hoge.py | parallel –pipe –L 100 fuga.py | piyo.py > b.txt ここだけ並列化して ボトルネック解消! (余談) ボトルネックの定量化には pv (pipe-viewer) コマンドが便利
  11. 11. パターン3 試すべきパラメータがいっぱい 11 train.txt 学習率 0.1 0.01 0.001 層数 1 2 3 ユニット 100 200 300 train.py ./log/ lr=0.1_layer=1_u=100.log lr=0.1_layer=1_u=200.log … lr=0.1_layer=3_u=300.log ./model/ lr=0.1_layer=1_u=100.model lr=0.1_layer=1_u=200.model … lr=0.1_layer=3_u=300.model すべての組 み合わせを 試したい
  12. 12. パターン3 試すべきパラメータがいっぱい •  GNU Parallel の 組み合わせ展開( ::: )を使う 12 lr=(0 0.05 0.1 0.5 1.0 5) # 学習率! units=(100 200 300 400) # 隠れ層のユニット数! ! parallel “train.py --lr={1} --units={2} > log/{1}_{2}.txt“ ! "::: ${lr[@]} ::: ${units[@]} これまでfor文の多重ループで書いていた 処理が、たった3行に!!(しかも並列実行) Pythonの string.fmt と似た文法
  13. 13. 注意点 / Tips •  気をつけておきたいこと: –  time コマンドでこまめに計測 •  とくにパイプ並列の場合、早くならないこともある –  IO / メモリが重い処理は控えめな並列数で –  ⻑時間占有する場合は –nice オプションを –  まずは --dry-run オプションをつけて実⾏ •  どういうコマンドが実⾏されるか、教えてくれる •  Tips –  --bar : 進捗状況を表⽰、残り時間の推定 –  -S オプション: マシンを跨いだ並列処理 –  並列数は –j オプションで指定、デフォルトではCPU数 13 --bar の例:63%のタスクが終了し、残りは8秒
  14. 14. まとめ •  GNU Parallel を使うことのメリット: –  J簡潔に書けて –  J柔軟に実⾏できる –  J既存のコードとの組み合わせが容易 •  GNU Parallel を使うことのデメリット: –  Lあまりにも簡単なので、計算機資源の奪い合い が・・? •  是⾮「今⽇から」使ってみてください •  他にもいい使い⽅があったらシェアしてくだ さいJ 14
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×