HPCシステムズではエンジニアを募集しています。詳しくはこちらをご覧ください。
HPCシステムズのエンジニア達による技術ブログ

Tech Blog

Kamonohashiを構築してみた

Kamonohashiとは

 Kamonohashiとは、上にある絵のような生物ではなくて、日鉄ソリューションズが、AI開発の基盤システムとして提供しているソフトウェアで、5月にオープンソース化されました。データの管理や学習するGPUの割り振りなどをしてくれる開発プラットフォームです。今回は、Kamonohashiの構築について紹介したいと思います。

(カモノハシの絵は、本件のKamonohashiとは一切関係ありません。)

 Kamonohashiは、複数人で、GPU、ストレージを共有し、AI開発をチームで推進することを想定して開発されています。AI開発を、チームで進めるには、学習において、学習環境、モデル、データ、ハイパーパラメーターなどの情報共有が必要で、Kamonohashiは、それらの情報共有に最適なプラットフォームと言えます。

 Kamonohashiは、kubernetesをシステムの根幹にしています。kubernetesは、複数ノードに跨ってDockerコンテナを制御するシステムです。Webブラウザベースでアクセスをして、GPUサーバーにPodを作成し、Pod内でジョブを実行します。

Kamonohashi構築準備

  •  マシンの用意

 公式のインストール方法を参考にしてください。Kamonohashiを構築するためには、以下のノードが必要です。DNSサーバーは特別に用意する必要はないですが、構成するノードをDNSへ登録する必要はあります。

  台数 仮想マシン インターネットに接続 DNSへの登録

Kamonohashi

1 必要 必要

kubernetes-master

1 必要 必要

Storage

≥1 不要 必要
GPU Server ≥1 ※※

必要

必要

DNS Server

≥1 必要 不要

 GPU Serverに他のすべてのノードを仮想マシンで立てることも可能ですが、パフォーマンスを考えると、GPU Serverには仮想マシンを立てない方が良いでしょう(計算リソースが減少し、計算負荷が増すと、システム全体の安定性が下がるため)。それぞれのノードの必要スペックは公式サイトを参照ください。

Storageは、インターネットは不要ですが、各サーバーに加え、webブラウザでKamonohashiにアクセスする端末とも直接通信できる必要があります。

※※GPU Serverは、仮想マシンでも可能ですが、仮想環境でGPUを使えるようにするのが難しいです。

 

  •  インストール前設定

ここら辺は、だいたい公式サイト通り。

  1.  すべてのサーバーに、Ubuntu Server 16.04 をインストールします。
  2.  すべてのマシンに共通のsudoユーザを作成します。
  3.  共通のsudoユーザでパスワード無しログインできるようにSSH鍵を作成します。作成した鍵は、id_rsaというファイル名で、kubernetes-master の /root/.ssh の下に、所有者root、パーミッション600で保存する。
  4.  DNS Serverの設定をします。必要なすべてのサーバーの名前解決ができるように設定します。またインターネットに対して名前解決できるようにします。さらに、それぞれのサーバーにDNS Serverを登録します。
  5.  全ノードNTP設定により、時刻の設定を行います。
  6.  GPU ServerにNVIDIAドライバをインストールします。

 注意すべき点は、DNS Serverです。kubernetesの仕様上、kubernetesのPodは、登録したDNS Serverのうち1つがランダムに選ばれて、名前解決します。通常のLinux仕様のように、名前解決に失敗したら次のDNSサーバーに問い合わせるようなことはしないので、Kamonohashiのサーバー群と、インターネットへの名前解決をできるDNSサーバーを登録する必要があります。また、Kamonohashiのwebブラウザにアクセスする端末も、このDNS Serverを登録する必要があります。そのため、/etc/hostsなどで名前解決する形は、運用上、難しいと思った方が良いです。

Kamonohashiの構築

 Kamonohashiの構築自体は、とても簡単です。構築準備を完全にしていて、公式サイトの通り実行すれば、だいたい問題なく構築は完了します。

 kubernetesの仕様上、一度構築すると、Kamonohashiはシステム的な設定変更(ホスト名など)は不可能で、変更を要する場合は、再構築する他ないそうです。そのためか、Kamonohashiはインストール、アンインストールの部分の完成度が高い印象を受けています。

 kubernetes-masterに root でログインして、 下記を実行します。

KQI_VERSION=1.0.2
wget -O /tmp/deploy-tools-$KQI_VERSION.tar.gz https://github.com/KAMONOHASHI/kamonohashi/releases/download/$KQI_VERSION/deploy-tools-$KQI_VERSION.tar.gz
mkdir -p /var/lib/kamonohashi/deploy-tools/$KQI_VERSION/
cd /var/lib/kamonohashi/deploy-tools/$KQI_VERSION/
tar --strip=1 -xf /tmp/deploy-tools-$KQI_VERSION.tar.gz
./deploy-basic-cluster.sh deploy

 実行すると対話形式で、各サーバーのホスト名、共通のユーザ名、SSHパスワード(鍵を使用する場合は、何も入力せずEnter)、sudoパスワード(こちらも不要なら何も入力せずEnter)、プロキシの設定、Kamonohashiのadminユーザのパスワードを、順に入力することになります。構築時は、GPU Serverは、複数登録できますが、Storageは1つのみ入力してください。

 必要事項を入力すると、構築が始まります。それぞれのサーバーで、Docker、kubernetes、nvidia-docker2、minioなどがインストールされます。途中、GPUが再起動されたり、ネットワーク設定がリフレッシュされたりするので、暫定的な設定で構築を実施することはできません。

Kamonohashとの連携

 Kamonohashiは、デフォルトで、GitHub、DockerHubと連携しています。恐らく、Kamonohashiを利用する人は、外部に自社のデータを置きたくない人(置くことを禁止されている人)が多いと思うので、オンプレミス環境のGitLabと、GitLabのDocker Registryとの連携を解説しようと思います。

  • GitLabの連携

 まずは、GitLabの連携を解説します。GitLabの連携は、HTTP/HTTPS どちらも対応しています。自己署名証明書によるHTTPSは、v1.0.2から有効になりました。連携の設定は、Kamonohashiにadminでログインして、[システム管理]→[Git管理]で、Gitの一覧が表示され、右上で新規登録ボタンがあるので、そこから設定を行います。

 下記は一例です。HTTPSの場合は、もちろん http→https となります。HTTPであれば、この設定だけで問題なく動作します。HTTPSの場合は証明書を各ノードで有効にする必要があるようです。

 HTTPSのSSL証明書を、「gitのFQDN.crt」というファイル名で、Kamonohashi、kubernetes-master、GPU Server の、/usr/local/share/ca-certificates の下に保存します。その後、各ノードで、update-ca-certificatesを実行して、Dockerを再起動します。(すべてのノードで証明書の登録は必要ないかもしれませんが、どの範囲までならOKかは、分かっていないです。)

 

  • GitLabのDocker Registryの連携

 GitLabのDocker Registryは、普通のDocker Regisitryと異なり、レポジトリ毎にDockerイメージを置けます。Gitと密接な関係にある分、少し癖がありました。

 上の画像は、GitLabをHTTPで、registryをHTTPSで、登録しています。API URL の部分がGitLabのURLになるところが注意です。これはRegistryの一部の情報を、GitLab側のAPIを使用して取得しているためです。

 さらに、Registryと、各GPU ServerのDockerを、連携する必要があります。これは普通のDockerとRegistryとの連携と同様で、HTTPならば、/etc/docker/daemon.jsonファイルに、

{ "insecure-registries":["RegistryのIPアドレス:ポート番号"] }

を加えて、Dockerを再起動します。HTTPSならば、証明書を、/etc/docker/certs.d/RegistryのIPアドレス:ポート番号/ca.crt にコピーして、Dockerを再起動します。

あとがき

 今回は、Kamonohashiの構築について書きました。構築時に、私が踏んだトラップは一通り解説したと思います。Kamonohashiは、DNSサーバーを除くと4種のサーバーが必要で、それらを用意するのは、結構手間がかかります。そのため、1台で簡易に試せる機能を開発中と聞いています。

 日鉄ソリューションズさんには、こちらの要望や不具合報告に真摯に応えて頂き、順次、対応して頂いています。NGCへの対応や、自己署名証明書によるGitLabのHTTPS対応も、予想以上に早く対応して頂きました。また、今も多くの機能が追加され続けています。

 近日中に、DGX-1にKamonohashiをインストールした、テストドライブを公開予定です。

 弊社でも、Kamonohashiの構築を請け負うことが可能になりました。要望があればお知らせください。

DL
HPCシステムズ Tech Blog