第2回 魁!! GPUクラスタ on GKE ~PodからGPUを使う編~
2017/10/13
  • このエントリーをはてなブックマークに追加

ドーモ、魁エンジニアを目指しているエンジニアの吉海です。 今回はPodからGPUを使う方法についてご紹介します。デプロイするGPUクラスタは前回の記事で作成したクラスタです。

今回の記事は2部構成で、これは第2回目の記事です。 本記事の構成は以下のようになっています。
  • GPUを使うために必要な設定について
  • サンプルのPodをデプロイ

対象読者

  • Kubernetesを使ったことがある方
  • Google Container Engineを使ったことがある方
  • 魁たい方

検証環境

Kubernetes側の環境
  • Google Container Engine 1.7.5
  • Kubernetes 1.7.5
クライアントの環境
  • macOS Sierra 10.12.6
  • kubectl 1.7.3

GPUを使うために必要な設定について

PodからGPUを使うには2つほど設定が必要になるので、それについてご説明します。

コンテナのリソースの設定

Podのコンテナの設定で下記のリソースの設定が必要です。xの所にPodで使いたいGPUの数を指定します。

resources:
  limits:
    alpha.kubernetes.io/nvidia-gpu: x
注意点として、1つのコンテナにつき1つのGPUになります。1つのGPUを複数のコンテナで使うことは、出来ないので注意して下さい。 ちなみに、GPUが足りない場合にPodをデプロイするとSTATUSがpendingになります。

ホスト側のNvidiaのドライバーの/binと/libをマウントする

PodからGPUを使うためにはDaemonSetでインストールしたNvidiaのディレクトリをマウントする必要があります。マウントするのはbinとlibのディレクトリになります。binは必須ではないので、必要がなければマウントしなくても大丈夫です。

- name: nvidia-debug-tools # optional
  hostPath:
    path: /home/kubernetes/bin/nvidia/bin
- name: nvidia-libraries # required
  hostPath:
    path: /home/kubernetes/bin/nvidia/lib

サンプルのPodをデプロイ

それでは、実際にPodをデプロイして動作確認をしてみましょう。デプロイするPodの種類はJobにしてnvidia-smiコマンドを実行するようにします。Jobはバッチ処理的なことを行うためのPodの種類です。nvidia-smiはNVIDIAのシステムマネージメントインタフェースのコマンドで、GPUを正しく認識できているかを確認するために使います。使うイメージはNvidiaの公式のnvidia/cuda:8.0-runtimeです。


下記のYAMLをコピーアンドペーストしてtest-gpu.yamlという名前で保存して下さい。
---
apiVersion: batch/v1
kind: Job
metadata:
  name: test-gpu
spec:
  template:
    metadata:
      labels:
        app: test-gpu
    spec:
      volumes:
      - name: nvidia-debug-tools # optional
        hostPath:
          path: /home/kubernetes/bin/nvidia/bin
      - name: nvidia-libraries # required
        hostPath:
          path: /home/kubernetes/bin/nvidia/lib
      containers:
      - name: test-gpu
        image: nvidia/cuda:8.0-runtime
        command: ["nvidia-smi"]
        resources:
          limits:
            alpha.kubernetes.io/nvidia-gpu: 1
        volumeMounts:
        - name: nvidia-debug-tools
          mountPath: /usr/local/nvidia/bin
        - name: nvidia-libraries
          mountPath: /usr/local/nvidia/lib

下記のコマンドでデプロイします。
$ kubectl apply -f test-gpu.yaml
デプロイが完了したらget jobコマンドでJobの状態を確認しましょう!!
$ kubectl get job
NAME       DESIRED   SUCCESSFUL   AGE
test-gpu   1         1            3m
Jobが完了していれば、SUCCESSFULが1になっていると思います。Jobが完了していたら次はkubectl logでnvidia-smiの結果を確認してみましょう。
$ kubectl logs job/test-gpu
Fri Sep 29 11:41:44 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.69                 Driver Version: 384.69                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla K80           Off  | 00000000:00:04.0 Off |                    0 |
| N/A   35C    P0    72W / 149W |      0MiB / 11439MiB |    100%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
上記のようにノードに搭載されたGPUが結果に表示されていればOKです! 以上でGPUをPodから使う方法は完了です!お疲れ様でした!

まとめ

これでPodからGPUが使えるようになりました。後は各自お好きなPodをデプロイして色々試して見て下さい!
最後になりますが、前回の記事で解説したDaemonSetについて、少し踏み込んだ説明をGCPUG Tokyo DevOps Day September 2017でしたのでご興味のある方は下記の資料を見て頂けると幸いです。