トレンドコラム

性能検証

Kubernetesを使ってGPUサーバークラスターを構築してみた

2021.09.15

NTTPC GPUエンジニア

NTTPC GPUエンジニア

Kubernetesを使ってGPUサーバークラスターを構築してみた

複数人が共同で作業するための大規模AI研究基盤を構築する場合、実行環境をどのように整備していくかは大きな検討ポイントです。

GPUサーバーを1台導入してみたものの、リソースの拡充のため、さらにサーバー台数を増やしたい・・・とスケールアップをお考えの方も多いのではないでしょうか。

今回はそんな方のために、複数台のサーバーのリソース管理・監視をラクに行うため、図1のように、Kubernetesを利用して、Masterサーバー - 2台のNodeサーバーによるクラスターを構築する手法を解説します。商用運用をイメージし、Monitorサーバーでの監視も行います。
※本記事は2021年時点の情報に基づいたものです


図1 Kubernetesを利用したクラスター化

本記事では、Kubernetes、Dockerをひととおり触ったことがある方向けに、GPUサーバーのクラスター化を行うための考え方や留意点、詰まりがちなポイントをお伝えします。みなさまの参考になれば幸いです。

Kubernetesによるクラスター化

通常、複数台のサーバー(ホスト)間でやり取りを行う場合、ネットワークスイッチやルーターを介した通信が必要になります。

しかし、Kubernetesを活用することで、複数台のホストから構成される環境を1かたまりのクラスターとして扱うことができるようになります。クラスター内では、統一的な管理・運用・リソース割り当てを行うことができます。

さらに、クラスター内のサーバースペックが足りなくなった場合は、単にノードを3つ4つと増やしていくだけで簡単に増強が可能です。

Kubernetesを利用して、複数台のGPUサーバーをクラスター化してみましょう!

検証構成

Kubernetesを利用したクラス化には
① Masterサーバー
② Nodeサーバー
が最低限必要となります。今回はより商用に近い環境を想定し、
③ Monitorサーバー
も準備しました。各サーバーの役割は表1の通りです。

表1 各サーバーの役割

Master ・Kubernetesで管理されるクラスター全体の管理を行う
・クラスターの監視ツールを実行させる
Node ・Kubernetesで管理されるクラスター全体の管理を行う
・クラスターの監視ツールを実行させる
Monitor ・Kubernetesの管理GUIアプリケーションを動作させる
・クラスター監視ツールを実行しにいく
・SSH接続時の踏み台サーバーになる

検証構成(論理)は図2のとおり。Masterサーバーにはリソース監視ソフトウェアの「Prometheus」、ダッシュボードツールの「Grafana🄬」をインストールし、それぞれMonitorサーバーのブラウザ上から監視できるようにします。
また保守管理のしやすさを考慮し、Monitorサーバーには、Kubernetes の管理コマンドラインツールである kubectl を GUI ベースで操作できるデスクトップアプリ「Lens」を入れています。


図2 論理検証構成

使用ソフトウェア

今回は主に下記のツールを使って監視・可視化を行っています。これでなければならないというわけではないので、ツールの選定はお好みで。

1. Prometheus

Prometheus(プロメテウス)は、もともとSoundCloudのエンジニアが中心となって開発されたリソース監視システムです。監視対象(サーバーだけでなく、ソフトウェアやサービスなどなんでもOK)を設定すると、能動的にアクセスしに行ってデータを引っ張ってくるという「Pull型」の監視アーキテクチャを備えています。

オープンソースの監視システムとしては、ElasticsearchやZabbixが有名どころですが、Prometheusは

  • DockerやKubernetesとの連携が深い
  • 多種多様なExporter(コンポーネント)によるカスタマイズ性がある

というメリットを持っており、様々な用途で導入がすすんでいます。今回のようなコンテナサービスの監視にはぴったりです。

2. Grafana🄬

Prometheusのデフォルト可視化画面は使い心地がイマイチなので、グラフィカルなダッシュボードを作れる「Grafana🄬」もセットでインストールします。というか、Prometheus OperatorでPrometheusを導入すると、自動的にGrafanaもインストールされます。

Prometheusで取得したデータをWEBGUIで可視化できます。表示させるタイムスケールを変えたり、異常を示している特定のノードだけ拡大表示するなど、リアルタイムに画面表示を操作することも可能なツールです。


図3 Grafana🄬ダッシュボード画面

3. Lens(Kubernetes IDE Lens)

Kubernetesには、コマンドラインツールの「kubectl」を持っていますが、直感的に操作したい方はLensでGUI化しておきましょう。デスクトップアプリでインストールも簡単です。
kubectlと比べても、情報量が削減されることはなく、名前やコンテナ数などの詳細をそのまま表示することができます。


図4 リソースのデプロイ画面

図5 Helmの管理画面

ハードウェアスペック・ソフトウェアバージョン情報

本検証に使用した各ハードウェアのスペックは下記の通りです。ご参考まで。

Master

筐体:Supermicro SYS-1029GQ-TRT
CPU:Intel🄬 Xeon Silver 4214R x2枚
Mem:16GB x12枚(計192GB)
Disk:480GB SSD x2枚

Node

筐体:Supermicro SYS-1029GQ-TRT
GPU:NVIDIA T4 Tensor Core GPU x2枚
CPU:Intel🄬 Xeon Silver 4214R x2枚
Mem:16GB x12枚(計192GB)
Disk:480GB SSD x2枚

Monitor

筐体:Supermicro SYS-1029GQ-TRT
CPU:Intel🄬 Xeon Silver 4214R x2枚
Mem:16GB x12枚(計192GB)
Disk:480GB SSD x2枚

L2SW

Cisco WS-C2960CX-8PC-L

各ソフトウェアのバージョンは次の通りです。いずれも検証実施時(2021年7月)での最新安定版をインストールしています。

Master

Ubuntu20.04 Server
Kubernetes v1.5.2
Docker version 1.12.6, build 88a4867/1.12.6
Prometheus 2.29.2
Grafana 8.1.2

Node

Ubuntu20.04 Server
NvidiaDriver 471.41

Monitor

Ubuntu20.04 Desktop
Lens v5.1.3-latest.20210722.1

ツールインストール

各サーバーにはそれぞれ下記のソフトウェア、ツール群をインストールしていきます。OSやCUDAなどは事前にセットアップ済みとします。

表2 インストールソフトウェア一覧

インストール
対象
ソフトウェア 用途
Master kubeadm Kubernetesコマンドラインツール
kubelet Kubernetesコンテナの管理(Pod起動、コンテナの作成/削除、リソース割り当て)
kubectl クラスターにアクセスするためのコマンドライン・インターフェース
Docker コンテナ仮想化ツール
Helm Kubernetes向けパッケージマネジャー。Linuxでいうところのyumにあたる
Prometheus リソース監視ソフトウェア
Grafana🄬 ダッシュボードツール
Node kubeadm Kubernetesコマンドラインツール
kubelet Kubernetesコンテナの管理(Pod起動、コンテナの作成/削除、リソース割り当て)
kubectl クラスターにアクセスするためのコマンドライン・インターフェース
Docker コンテナ仮想化ツール
NVIDIAドライバ NVIDIA GPUを利用するためのドライバ。利用するGPUに合わせてインストールする
NVIDIA Container Toolkit DockerコンテナからCUDA経由でGPUが利用できるようになる
Monitor Lens Kubernetes の管理GUIツール

1. Masterサーバーへのツールインストール

表2のツール群を順次インストールします。公式ドキュメントにも記載がありますが、インストール時は下記にご注意ください。

<Kubeadmインストール時の注意事項>
  • iptablesがブリッジを通過するトラフィックを処理できるようにする
  • iptablesがnftablesバックエンドを使用しないようにする
  • Swapはオフにしておく

なお、下記のポートは必ず開けておく必要があります。

表3 Masterサーバー 必須ポート

ポート番号 使用目的 使用者 備考
6443 Kubernetes API server すべて ポート番号は任意に書き換え可能
2379-2380 etcd server client API kube-apiserver、etcd  
10250 Kubelet API 自身、コントロールプレーン  
10251 kube-scheduler 自身  
10252 kube-controller-manager 自身  
<Prometheusインストール時の注意事項>

煩雑なPrometheusのインストールは、「Prometheus Operator」を入れると簡略化できます。Helmで名前空間をつけてインストールしましょう。Grafanaも勝手にインストールされるので一石二鳥です。

また、同じくHelmにて「DCGM-Exporter」もインストールしておきます。PrometheusでGPUを監視するためのコンポーネントです。

Prometheusのインストール、構成については下記URLもご参照ください。
https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack
https://docs.nvidia.com/datacenter/cloud-native/kubernetes/dcgme2e.html#gpu-telemetry

2. Nodeサーバーへのツールインストール

続いて、Nodeサーバーにも必要なソフトウェアをインストールしていきます。kubeadmをインストールする際の注意事項は「1.Masterサーバーへのツールインストール」を参照ください。

なお、下記のポートは必ず開けておく必要があります。

表4 Nodeサーバー 必須ポート

ポート番号 使用目的 使用者 備考
10250 Kubelet API 自身、コントロールプレーン  
30000-32767 NodePort Service すべて NodePort Serviceのデフォルトのポートの範囲

また、Dockerインストール時には、Dockerのデフォルトランタイムがnvidia-container-runtimeになっていることをご確認ください。

Kubernetesでは、PodがGPU(NVIDIA or AMD)にアクセスするための専用プラグインが実装されており非常に有用です。詳細は下記を参照ください。
https://kubernetes.io/ja/docs/tasks/manage-gpus/scheduling-gpus/

3. Monitorサーバーへのツールインストール

通常のデスクトップアプリケーションと同じ要領でLensをインストールします。インストール方法やその後の操作手順などを特に解説する必要がないのがLensのいいところですね。

クラスター構築

通常のデスクトップアプリケーションと同じ要領でLensをインストールします。インストール方法やその後の操作手順などを特に解説する必要がないのがLensのいいところですね。。

1. MasterサーバーでKubernetesを実行

  • クラスター初期化
    コマンド実行時、[kubeadm join ----]を忘れずメモしておきましょう。この後のステップで使います。
    $ kubeadm init
    
  • Podネットワークアドオンのインストール
    クラスター内での通信を許可します。
    ネットワークアドオンは、スタンダードにflannelを使用します。
  • kubectlコマンドが実行できるよう、admin.confをコピー
    /etc/kubernetes/admin.conf から $HOME/.kube/config にコピーします

2. Nodeサーバー参加

  • Node参加
    前述のクラスター初期化時にメモしたコマンドを実行します
  • NVIDIA device plugin for Kubernetes
    MasterサーバーでNVIDIA device-pluginを適用します

ここまでの実装で、Kubernetesクラスター上のNodeに、PodをデプロイしてContainerを立ち上げることができます。
参考:https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

3. MonitorサーバーとMasterサーバーの紐づけ

最後の仕上げとして、Monitorサーバーからクラスターの監視ができるよう、Masterサーバーと紐づけておきましょう。

  • クラスターへのアクセス
    kubeconfig本体のファイルを登録します(kubectl config viewではないので注意!)
    ※Masterサーバーにアクセスするイメージです

図6 kubeconfig

構築結果

このように、Kubernetesを利用することで、GPUサーバーのクラスター化を行い、リソース管理・監視ができるようになりました。

今回の構成は、複数のソフトウェアを組み合わせて管理・監視体制を構築しました。それぞれのソフトウェア間で連携するための機能や公式ドキュメントが整備されており、複雑すぎないスタンダードな構成で実現できたと思います。
本記事が、GPUサーバーのクラスタリングを行われる方の参考になれば幸いです。