WebARENAコンテナサービス(Kubernetesクラスタ)でオンプレミスGPUサーバーを利用する

kubernetesクラスタでGPUサーバー利用するために必要な設定等について紹介します。

 

構成は次の図のようにWebARENA コンテナサービスのRancherServerとお客さま環境(オンプレミス)に作成したGPUサーバーを利用してハイブリッドクラウド環境を作成します。

 

・RancherServerは、kubernetesクラスタを作成管理します。
・お客さま環境に作成のサーバーで、kubernetesクラスタ内のnodeを作成します。
※今回はそのうちの1台がオンプレミスのGPUサーバーです。

 

図1 概要図

図1 概要図

 

■作業前に必要な事項

■GPUサーバーでの設定

■GPU利用のPOD起動について

 

 

■作業前に必要な事項

本稿の手順で作業をする前に、次の事項を満たしている必要があります。

 

(1) Kubernetesの条件

kuberentesがバージョン1.10以降である必要があります。

 

(2) オンプレミスサーバー側で必要な設定

①メモリ【2GB以上】

②Nvidia製のGPUが利用サーバーに取り付け済であることを確認してください。

③次のバージョンのNVIDIA driverをインストール済であることを確認してください。

【バージョン番号:361.93 以降】

※nvidia-smi コマンドの利用ができることも確認してください。

④CentOS v7 または Ubuntu16.04で以下を満たしていること

【64bit(x86_64)版】
【kernel version > 3.10】

⑤Dockerのインストール

次のバージョンのDockerをインストールしている必要があります。
【version 1.13.1】

⑥GPUサーバーは、インターネット接続できることを確認してください。特にGPUサーバー宛ての通信は次のポートでインターネットからアクセスできるようにして下さい。

 

プロトコル ポート番号 備考
TCP 4149 kubeletポート
TCP 8080 http/httpsでRancherServerと通信 (default)
※Rancher Serverでポート番号変更可能
TCP 10250 kubeletポート
TCP 10255 kubeletポート
TCP 30000-32767 NODE PORTで利用

※ネットワークセキュリティについて

ポート番号4149/10250/10255については、お客さま拠点で作成するサーバーとRancherServerのみ通信可能。それ以外との通信はできないように通信制御の設定を入れてください。

詳細については以下参照ください。

Kubernetes – Security

 

オンプレミスサーバー側で主に必要な作業は以上のとおりです。
Rancherでノード追加する場合のノードで必要な仕様詳細については、以下参照してみてください。

Rancher 1.6 Docs > Hosts > Getting Started with Hosts

 

 

 

■GPUサーバーでの設定

必要な作業:

(1)Nvidia-Docker2.0のインストール

(2)Nvidia Dockerのデフォルト化

(3)kubernetesクラスタへの取り込み

(4)kubelet確認

(5)DevicePlugin DaemonSetの起動

 

本稿では、次の環境を前提に詳細説明を記載しています。

OS 【Ubuntu16.04】
Docker version 【 1.13.1】
Rancherサーバー 【version 1.16.8】

 

 

(1)Nvidia-Docker2.0のインストール

①aptの取得先としてNvidia repository を追加

# curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-docker.list | \
> sudo tee /etc/apt/sources.list.d/nvidia-docker.list

 

②認証用の鍵のインストール

# curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -

 

③利用可能なパッケージリストのアップデート

# apt-get update

 

④インストール

Dockerバージョンを変えずにnvidia-docker2.0 およびruntimeをいれます。

# apt-get install -y nvidia-docker2=2.0.3+docker1.13.1-1 nvidia-container-runtime=2.0.0+docker1.13.1-1

 

⑤追加後の確認

docker system info コマンドでdockerの状態を確認します。
次のとおりRuntimesにnvidia が追加されていれば正常に追加されています。

# docker system info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.13.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 0
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: nvidia runc       	← nvidia が 追記されたことを確認します
Default Runtime: runc     	← この時点では default runtime は runc
Init Binary: docker-init 
containerd version:  (expected: aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1)
runc version: N/A (expected: 9df8b306d01f59d3a8029be411de015b7304dd8f)

 < 省 略 >

 

⑥Nvidia-Docker2.0の利用

Default runtime が docker標準のruncであるため次のようにruntimeを指定して利用します。

# docker run --runtime = nvidia --rm nvidia/cuda nvidia-smi

 

(2)nvidia-container-runtimeのデフォルト化

次の手順を実行することでDefault runtime を runc から nvidia-container-runtimeに変更します。

①設定ファイル(/etc/docker/daemon.json)を以下のように編集します。

# cat /etc/docker/daemon.json  
{
    "default-runtime": "nvidia",       ← この行だけ追記
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
#

※もしもruntimesの欄がない場合は、nvidia-dockerのインストールをやり直してください。

 

②プロセス再起動

# pkill -SIGHUP dockerd

 

③確認

再度次のとおりdocker の状態を確認し、default runtimeがnvidiaに変更されたことを確認します。

# docker system info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.13.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 0
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: nvidia runc
Default Runtime: nvidia	  ← デフォルトが nvidia に変わったこと確認
Init Binary: docker-init
containerd version:  (expected: aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1)
runc version: N/A (expected: 9df8b306d01f59d3a8029be411de015b7304dd8f)

 < 省 略 >

 

④Nvidia-Docker2.0の利用

Default runtime の変更が行われたため、runtimeの指定なく以下のとおり利用できます。

# docker run --rm nvidia/cuda nvidia-smi

 

(3)Kubernetesクラスタへの取り込み

RancherServerを使いkubernetesのクラスタにGPUサーバーを組み込みます。
(まだkubernetesを構成するノードがない場合は、次の作業を実施し、新規作成します。)

 

①RancherServerにログインしてください。
②ログイン後、GPU利用可能なEnvironmentを選択してください。
③INFRASTRUCTURE -> Hosts を選択し Add Host ボタンをクリックしてください。
④Add Hostの画面で Custom を選択します。
⑤ Customの設定画面において以下欄にある文字列をコピーします。
「5 Copy, paste, and run the command below to register the host with Rancher:」

図2 Customの設定画面

図2 Customの設定画面

 

⑥GPUサーバーにログインしてコピーした文字列を貼り付けます。
しばらくするとHostsの画面に該当サーバーが表示され、起動するコンテナが見えてきます。

ホスト追加の詳細は以下を参照してください。

◆Dockerコンテナ管理ソフトRancherをVPSにインストールする

◆Adding Custom Hosts

 

(4)kubelet確認

KubernetesでGPUを利用するためには、kubeletに特別な設定が必要です。
以降は、この設定がRancherサーバーよりGPUサーバーに伝わり、正しくkubernetesのnodeとして作成されているか確認を行います。

※Kuberentesがバージョン1.10以降の場合はこの作業は必要ありません。

 

①RancherServerにログインして以下を選択します。
INFRASTRUCTURE -> Hosts
②該当のGPUサーバーの中のすべてのコンテナの起動が落ち着くのを待ちます。
③GPUサーバーの中にkubeletと文字列のあるものについて右のボタンをクリックで展開し、「View in API」を選択します。

 

図3 kubeltの設定

図3 kubeltの設定

 

④以下図のように、commandの欄に次の文字列が入っていることを確認します。
–feature-gates=DevicePlugins=True

 

図4 kubelt設定の確認

図4 kubelt設定の確認

(5)DevicePlugin DaemonSetの起動

次の手順を実施することによりDevicePluginを起動し、GPUを利用したPODを作成できるようになります。

I)RancherServerでkubectl用のウィンドウを起動
①RancherServerへログインします。
②前工程でGPUサーバーをノードとして追加したEnvironmentに入ります。
③KUBERNETES -> CLI を選択します。kubectlを実行するウィンドウが表示されます。

 

II)追加ノードの状態確認
追加したサーバーを含めてkubectlで管理できているか確認します。
①ノード名で確認します。

# kubectl get nodes

確認項目
□ NAMEの欄に追加したサーバーのホスト名が入っているか確認
□ STATUSが Ready となっていることを確認

 

②IPアドレスで確認します。

# kubectl get nodes -o

確認項目
☐ GPUサーバーのIPアドレスが入っていることを確認

 

Ⅲ)Daemonsetを追加
①インストールします。

# kubectl create -f

 

②インストールした状態を確認します。

# kubectl get daemonsets
NAME                     DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
nvidia-device-plugin-daemonset   1         1          1          1              1                      12m
#

確認項目
□ NAMEにnvidia-device-plugin-daemonset の表示を確認

 

 

以上で設定は完了です。

 

 

■GPU利用のPOD起動について

ドキュメントサイトにあるGPUを利用するPodの例を試します。

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vector-add
spec:
  restartPolicy: OnFailure
  containers:
    - name: cuda-vector-add
      # https://github.com/kubernetes/kubernetes/blob/v1.7.11/test/images/nvidia-cuda/Dockerfile
      image: "k8s.gcr.io/cuda-vector-add:v0.1"
      resources:
        limits:
          nvidia.com/gpu: 1 # requesting 1 GPU

kubernetesドキュメントサイトより引用

 

(1)RancherServerでkubectl用のウィンドウを起動

①RancherServerへログインします。
②前工程でGPUサーバーをノードとして追加したEnvironmentに入ります。
③KUBERNETES -> CLI を選択します。kubectlを実行するウィンドウが表示されます。

 

(2)GPUを使うPodマニュスクリプトファイル作成

次の内容を投入してファイル作成をします。

cat > test-gpu.yml <<\EOF
apiVersion: v1
kind: Pod
metadata:
  name: cuda-vector-add
spec:
  restartPolicy: OnFailure
  containers:
    - name: cuda-vector-add
      # https://github.com/kubernetes/kubernetes/blob/v1.7.11/test/images/nvidia-cuda/Dockerfile
      image: "k8s.gcr.io/cuda-vector-add:v0.1"
      resources:
        limits:
          nvidia.com/gpu: 1 # requesting 1 GPU
EOF

※実施後は、次の内容を確認してください。

 

 

図5 GPU利用のPOD起動の確認

図5 GPU利用のPOD起動の確認

 

(3)kubectl を利用してPodを起動

※起動後、計算処理を実行しPODは終了します。
GPUが動いたかどうかはPod起動前に別途GPUサーバーにログインして以下コマンドでモニタリングしながらPod起動を行ってください。

 

①GPUサーバーでのモニタリング
GPUサーバーで以下を実行します。

図6 GPUサーバーでのモニタリング

図6 GPUサーバーでのモニタリング

 

②RancherServerのkubectl用ウィンドウで以下を実行します。

kubectl create –f test-gpu.yml

※実行後①のモニタリングでGPUに関連する値の変化が現れます。
gpuを利用しないPod起動の場合は①のモニタリングでは変化はおきません。

 

※注意
RancherServerでのCLIウィンドウにおいて作成したファイルは一時的なファイルです。また、RancherServerでのCLIウィンドウは定期的にタイムアウトをします。タイムアウトまたは他のページ画面を遷移して再度CLIウィンドウを開くとファイルは消えるため(2)と(3)の手順は一緒につづけて実施が必要です。
外部のサーバー等でファイルを作成し、そのサーバーからkubectlコマンドを使い操作することもできます。この場合、ファイルは損なわれません。
接続方法については、以下手順を参照してください。

Rancher1.6 Docs > Kubernetes > Launching Kubernetes > kubectl

 

GPUを利用したPODのマニュスクリプト作成詳細については、以下Kubernetesドキュメントサイトを参照してください。

Schedule GPUs

 

 

 

 

 

 

ほった
テクノロジー&オペレーション開発本部所属         (監修:とみなが)

オススメ記事