More Related Content
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料) PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021 [論文解説]KGAT:Knowledge Graph Attention Network for Recommendation What's hot (20)
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~ Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料) Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 ストリーム処理を支えるキューイングシステムの選び方 続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2 ARM CPUにおけるSIMDを用いた高速計算入門 アーキテクチャから理解するPostgreSQLのレプリケーション 株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game... 乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料) Hopper アーキテクチャで、変わること、変わらないこと Similar to Slurmのジョブスケジューリングと実装 (20)
[DDBJing31] 軽量仮想環境を用いてNGSデータの解析再現性を担保する 遊休リソースを用いた相同性検索処理の並列化とその評価 Twitterのリアルタイム分散処理システム「Storm」入門 How to Schedule Machine Learning Workloads Nicely In Kubernetes #CNDT2020 / C... KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub... Hadoop operation chaper 4 デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~ 【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮 『じゃらん』『ホットペッパーグルメ』を支えるクラウド・データ基盤 Intranet Development v1.0 (TSG LIVE! 12 LT ) GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話 GNS3上の仮想アプライアンス+GitLabRunner+BDDによるテスト自動化 ゆるふわLinux-HA 〜PostgreSQL編〜 Clovaにおける機械学習モジュールの配信&運用基盤の紹介 Linux女子会 - お仕事メリハリ術♪(プロセススケジューラ編) 第4回 配信講義 計算科学技術特論A (2021) Modernizing Big Data Workload Using Amazon EMR & AWS Glue Slurmのジョブスケジューリングと実装
- 2. 自己紹介
• 名前
• 坂本龍一
• 所属
• 東京大学 計数システム、情報基盤センター(兼任)、助教
• JST CREST さきがけ研究員
• 計算機の省電力化に関する研究
• HPCシステム
• データセンター
• マイクロサービス
• 仮想化環境
• 5G
• 自動運転
• SLAM
• パスプランニング
2020/1/22 Slurm User Group Meetup Tokyo #1 2
- 5. HPC(high-performance computing)
システム
• 数台から数十万ノードの計算機
• Fugaku: 150,000ノード (48コアCPU), 30MW-40MW
• 高速ネットワーク
• 32GB/s (Dual-rail EDR InfiniBand network)
• ヘテロジーニアス構成
• GPU/FPGA
• 複数ノードでのプログラミング
• 分散メモリプログラミング
• MPI(Message Passing Interface)
• 分散学習フレームワーク
2020/1/22 Slurm User Group Meetup Tokyo #1 5
- 7. • 共有の計算機資源を時分割で多数のユーザーが利用
• ノードを時分割し占有する
• バッチジョブ実行
• 利用したい期間、CPU数、特定HWの有無(GPU等)を宣言
• リソースマネージャーは様々なユーザーからの要求を受け付け、実行中
のジョブ、ノード利用状況を加味し、要求されたジョブを実行
• 計算機の有効利用が重要
• 多数のユーザーが多数のノードを時分割し利用
バッチジョブとは
2020/1/22 Slurm User Group Meetup Tokyo #1 7
ユーザー
リソース
マネージャ
(資源管理) クラスタ
ジョブの投入
終了通知
ジョブ
実行制御
- 15. GPUを考慮したスケジューリング
• ノードあたりのGPU搭載数
• 1枚、2枚、4枚
• 異種GPUの混在
• V100, P100
• GPU間高速ネットワークと
ノード間低速ネットワーク
• NVLink (300GB/s)
• InfiniBand (32GB/s)
2020/1/22 Slurm User Group Meetup Tokyo #1 15
GPU GPU GPU
GPU
GPUGPU
GPU
GPU
NVlink
GPU
GPU
GPU
GPU
NVlink
GPU
GPU
GPU
GPU
InfiniBand
V100 P100 P100V100
ノード構成に合わせて最適な割当を変える必要がある
- 18. プラグイン(資源管理や最適化)
• ジョブスケジューリング
• Backfill, fifo
• ノードスケジューリング
• 効率的なノード割当てを計算
• 粗粒度:ジョブ間でのノード共有を行わない
• 細粒度:ジョブ間でノードを共有(CPUコアやメモリ単位の共
有)
• アクセラレータ(Generic REsource Scheduling = GRES)
• GPU, MIC, NIC
• ネットワーク
• Mesh/Tours, hypercube, tree
2020/1/22 Slurm User Group Meetup Tokyo #1 18
- 20. プラグイン
(コントロールフローの拡張)
• SPANKプラグイン
• Slurm Plug-in Architecture for Node and job (K)control
• ジョブ実行フローを拡張するためのプラグイン
• ジョブの実行直前・直後などの様々なポイントでプラ
グインAPIが呼ばれる
• プログラム実行直前にハードウェアを制御したい
• 特定のハードウェアを制御できる権限を付加
• 特殊な権限を与えてプログラムを実行したい
• ファイルの属性変更
• プログラム実行直前・直後に特殊な前処理を走らせたい
• コンテナ仮想化等をサポート
2020/1/22 Slurm User Group Meetup Tokyo #1 20
- 21. Slurmの全体構成
• ユーザーインタ
フェースプログラム
• sbatch:ジョブの投入
• Squeue:ジョブの確認
2020/1/22 Slurm User Group Meetup Tokyo #1 21
ユーザー
リソース
マネージャ
クラスタ
ジョブの投入
終了確認
ジョブ
実行制御
• リソースマネー
ジャデーモン
• slurmctld:
• ログ保存DB
• slurmdbd
• 計算ノード
デーモン
• Slurmd:
sbatch
squeue
slurmdbd
slurmctld
ログ保存
slurmd
slurmd
slurmd
slurmd
- 24. バックフィルの動作
(schedプラグイン)
• プラグインの呼び出し
• 起動直後にsched pluginの初期化関数が呼
ばれる
• バックフィルを行うスレッドを生成
• 一定期間ごとにタイマーによって起床
• バックフィルの試行
• 将来の資源利用を予想
• ジョブリストをコピーし、各ジョブの終了
時刻を予測、将来のジョブリストを生成
• スケジューリングを試みる
• 将来の最適なノード割当てをノードスケ
ジューラに問い合わせる
2020/1/22 Slurm User Group Meetup Tokyo #1 24
controller.c@main()
slurm_sched_init()
backfill_wrapper.c@init()
backfill.c@backfill_agent()
_attempt_backfill()
_try_sched()
select_g_job_test()
コード
- 26. ノードスケジューラ
(linearプラグイン)の動作
• プラグインの呼び出し
• ジョブスケジューラやジョブ実行直前
にselect_p_job_test()が呼び出される
• モードによって_will_run_test()、また
は_run_now()が呼び出される
• _will_run_test()の場合
• ジョブの要件に合うノードをカウン
ト・リストアップ
• GRESプラグインにてGPU割当てを最適化
• 要求されるノード数、メモリ数より候補
となるノードリスト作成
• 最適化を行い実行可能かテストする
• ネットワークトポロジーの最適化
2020/1/22 Slurm User Group Meetup Tokyo #1 26
plugins/select/linear/
select_linear.c
select_p_job_test()
_will_run_test()
_job_count_bitmap()
_gres_plugin_job_test()
_job_test()
_job_test_hypercube()
_job_test_dfly()
_job_test_topo()
コード
*_run_now()も流れは同様。実際にノードを割り当てる
- 27. ファイル構成
2020/1/22 Slurm User Group Meetup Tokyo #1 27
slurm-18.XX
├── autogen.sh # Autotools向けスクリプト
├── configure #
├── configure.ac # Makefile.am等のファイル情報を含む
├── slurm # 重要なヘッダファイル類が入っている
│ ├── slurm.h.in # グローバルなデータの定義が入っている
├── slurm.spec # RPMパッケージを作る際の情報が入っている
├── src # ソースコード本体
│ ├── api # 高機能なAPIが入っている
│ ├── common # 様々な共通のプリミティブなAPIの実装が入っている
│ ├── plugins # プラグインが入っている
│ ├── sbatch # ジョブ投入コマンドの実装
│ ├── slurmctld # リソースマネージャ本体のソースコード
│ ├── slurmd # 計算ノード側のデーモンのソ-スコード
*Makefile.am, Makefile.in、他のファイルは省略
- 28. Slurmctldのジョブ・ノード管理
関連のソースコード
• ジョブとノード管理を行う部分は4つのソースに記述
2020/1/22 Slurm User Group Meetup Tokyo #1 28
Job
list
Avail_node_bitmap
idle_node_bitmap
job_mgr.c
・ジョブリストを扱う
プリミティブな関数
・ジョブの終了・開始
処理
job_scheduler.c
・schedule():ジョブリスト
の先頭からジョブ実行
(Backfillとは独立に動作)
・非同期なepilog / prolog /
rebootの実行
node_mgr.c
・ノードの様々な
状態を保持
・ノードリストを扱う
プリミティブな関数
select_nodes()
_get_req_features()
_pick_best_nodes()
select_g_job_test()
gres_set_job_tres_cnt()
allocate_node()
_fill_in_gres_fileds()
node_scheduler.c
select_nodes()
ジョブに対する最適
なノード割当てを求
め、実際にノードを
割り当てる
- 29. 並列化とグローバルデータ
• スレッドを生成し、生成したスレッドで処理を行う
• 他の処理との並列化
• ジョブスケジューリング、RPC受付処理、死活管理、非同期処理
• 重要なデータはグローバルに配置
• Configデータ、ジョブデータ、ノードデータ、他
• 排他制御
• 適切な排他制御が必要
• NO_LOCK, READ_LOCK, WRITE_LOCK
2020/1/22 Slurm User Group Meetup Tokyo #1 29
RPCフロント
エンド
ジョブ投入
進捗確認
ジョブ終了
通知
ユーザー
クラスタ
ジョブスケジュー
リング(Timer)
ジョブキュー更新
ジョブキュー更新
ジョブキュー更新
ジョブキュー確認
Job
listRead
lock
Write
lock
slurmctld
- 30. コンパイルフローと新しい
ソースファイルの追加
• コンパイルにはAutotoolsを利用
./autogen.sh, ./configure, make
• コンパイルフローの理解は大切
• 新しいソースコードを追加してもコンパイルされない
• グローバルデータを更新しても反映されない
• 新しいソースコードの追加(新しいプラグイン作成)
• Makefile.amを新規作成
• 親ディレクトリのMakefile.amを修正
• Configure.acに新しいMakefile.amの場所を登録
• アルファベット順に並べる必要がある
• autoreconfを実行
• 必要ならMakefile.inも修正
• slurm.specを修正
2020/1/22 Slurm User Group Meetup Tokyo #1 30
- 32. ソースコードを解析するため
に用いたツール
• Doxygen
• 定番、Webベースで見れる
• Call/Callerグラフはコードが複雑すぎて有効に利用でき
なかった
• GNU GLOBAL
• Webベースで見れる
• それなりに活用
• プラグイン呼び出し側APIとプラグイン本体のAPI名が異
なるため、直接飛べない
• 呼び出し側select_g_job_test
• プラグイン本体select_p_job_test
• find -type f | xargs grep select_g_job_test
• プラグイン周りのAPI検索に利用
2020/1/22 Slurm User Group Meetup Tokyo #1 32
- 33. 研究紹介 (IPDPS17, Ryuichi Sakamoto)
• HPCシステムの省電力化のため
Slurmを拡張
• 省電力化のためのプラグイン
インタフェースを追加
• 電力のモニタリング機能を追加
• 実際の大規模HPCシステムにイ
ンストールし電力制御を実現
• 1000ノードの電力を
リアルタイムに管理
• HPCシステム全体の電力
管理を現実的なものに
• 従来はシミュレーション
2020/1/22 Slurm User Group Meetup Tokyo #1 33
実行待ちの
ジョブ数
遊休ノード
の消費電力
ジョブごと
の消費電力
実行時間
1000ノード
の消費電力
- 34. まとめ
• バッチジョブの概要
• バッチジョブの難しさ
• Slurmの特徴と全体構成
• ジョブスケジューリングの概要
• バックフィリングによるジョブスケジューリング
• ノードスケジューラによる将来のノード割当て
• ジョブスケジューリングの実装
• backfillジョブプラグイン
• linearノードプラグイン
2020/1/22 Slurm User Group Meetup Tokyo #1 34