第2回 魁!! GPUクラスタ on GKE ~PodからGPUを使う編~
ドーモ、魁エンジニアを目指しているエンジニアの吉海です。
今回はPodからGPUを使う方法についてご紹介します。デプロイするGPUクラスタは前回の記事で作成したクラスタです。
今回の記事は2部構成で、これは第2回目の記事です。
- 第1回 GPUクラスタ構築編
- 第2回 PodからGPUを使う方法(本記事)
本記事の構成は以下のようになっています。
- 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でしたのでご興味のある方は下記の資料を見て頂けると幸いです。
その他の記事
Other Articles
関連職種
Recruit