ジョブはコンテナとしてスケジューリングされる
高速性能とマルチユーザーの利便性・柔軟性というニーズに対応するため、MN-1とともに次のような環境を構築した。まず、学習用のデータセットなどのため、分散ファイルシステムの「Hadoop HDFS」と「GlusterFS」を実装したストレージを用意。ジョブ管理ツールは、PFN特有のジョブスタイルや手法をサポートするため、内製した。ジョブのスケジューリングはOSSミドルウェアを利用する。
内製ジョブ管理ツールは、ユーザー(社内のAIエンジニア)が自分のモデル開発や学習のジョブを記述、制御する。これらのツールセットを利用してジョブに必要なGPUやストレージなどのリソース、データセットなどを定義、指示する。ジョブの定義はYAMLを利用する。記述されたジョブはGitレポジトリからコマンドインターフェースで実行される。与えられたジョブはMesosとKubernetesによってコンテナ群としてスケジューリングされる。実はPFNのクラスタサービスは、ハイブリッドクラウド構成だ。
MN-1やジョブ管理システムはオンプレミスサーバー上に構築されるが、インターンを含む多くのユーザーの便宜のためAWSとAzureも利用している。AWSにはJenkinsやHarborを実装し、Webインターフェースでのジョブ制御をできるようにしている。AzureはSlackを利用したチャットボットを稼働させている。
その他、レポジトリとしてGitHub、モニタリングなどのためのDatadog、そして複数のクラウドサービスを利用するためのシングルサインオンシステムなども稼働している。
設計構築での工夫とシステムの課題
この機械学習クラスタを設計、構築するにあたり大村氏が留意した要件がいくつかある。前述のようにPFNのAIエンジニア、クラスタのユーザーのリテラシーレベルはさまざまだ。PythonとGitHubの知識は必要だが、コマンドラインよりブラウザ経由の操作が楽な人もいれば、ITはそもそも専門ではない人もいる。また、PFNの典型的なワークフローである小さく試して大きく回すというポリシーを反映できること。ジョブのトレーサビリティと再現性の確保。学習の可視化などだ。
クラスタの利用率・運用効率の向上ではさらなる工夫もしたと言う。まず、ジョブごとにどのクラスタを割り当てるか、オンラインビンパッキングは非常に難しい問題だ。一般的にはジョブキューの順に、なるべく隙間なくつめるMost Resource Requested方式がとられるが、より柔軟で効率を高めるため改修する予定だと言う。また、ジョブとノードにラベルをつけることで、ラックごとにまとめるジョブ、GPUのメモリに割り当てるジョブ、InfiniBandスイッチごとに割り当てるジョブといった細かい指定ができるようにもなっている。
アルゴリズム優先で割り当てを行うと、結果的に特定の人ばかり優先されるような不公平も発生すると言う。また、大き目のジョブがなかなか割り当てられないといった問題に対して、ギャングスケジューリング(必要なコア、リソースをまとめて確保する)が必要なときもある。
これらの制御には、ジョブのプリエンプションとリエントラント性の保証が重要になる。稼働中のジョブを強制的に中断し、リソースを確保(プリエンプション)したり、中断されたジョブを再開するとき、やり直しではなく中断箇所からの再開を保証したい。現状、学習中のジョブはプリエンプトされると、再開はその学習エポックの最初からになってしまう。