Kamonohashiとは
Kamonohashiとは、上にある絵のような生物ではなくて、日鉄ソリューションズ社が、AI開発の基盤システムとして提供しているソフトウェアで、2020年5月にオープンソース化されました。データの管理や学習するGPUの割り振りなどをしてくれる開発プラットフォームです。今回は、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を使えるようにするのが難しいです。
- インストール前設定
ここら辺は、だいたい公式サイト通り。
- すべてのサーバーに、Ubuntu Server 16.04 をインストールします。
- すべてのマシンに共通のsudoユーザを作成します。
- 共通のsudoユーザでパスワード無しログインできるようにSSH鍵を作成します。作成した鍵は、id_rsaというファイル名で、kubernetes-master の /root/.ssh の下に、所有者root、パーミッション600で保存する。
- DNS Serverの設定をします。必要なすべてのサーバーの名前解決ができるように設定します。またインターネットに対して名前解決できるようにします。さらに、それぞれのサーバーにDNS Serverを登録します。
- 全ノードNTP設定により、時刻の設定を行います。
- 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台で簡易に試せる機能を開発中と聞いています。