仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

microk8sでGPUコンテナーを使う環境を整える

先日ブラブラとサイトをみていたら、microk8s + GPUが割と楽しそうだったので試してみました。 ちなみに30分くらいで動かせました。

参考にした情報

基本的には次の流れでセットアップすればすぐ使えるようです。

  1. Ubuntu Server or Desktop
  2. cuda-drivers
  3. Docker CE & nvidia-docker2
  4. microk8s
  5. microk8sでGPUモジュールを有効化

Ubuntuをインストール

NVIDIA Docker2と対象のCUDAがサポートするOSとGPUを用意します。 16.04 LTSか18.04 LTSをインストールします。

cuda-driversをインストール

CUDAのパッケージリポジトリーを追加して、cuda-driversパッケージをインストールします(GPU Driverなども一緒に入ります)。

Docker CEをインストール

Docker CEのパッケージリポジトリーを追加します。NVIDIA-Docker2とのバージョンの組み合わせが絡むので、リポジトリーの追加だけを行います。

nvidia-docker2をインストール

NVIDIA Docker 2のパッケージリポジトリーを追加して、Docker CEとnvidia-docker2をインストールします。

GPUコンテナーが動くことを確認

コマンドを実行して、nvidia-smiの実行結果が出力されることを確認します。 一行目のコマンドはDocker 19.03以降が必要です。

~$ sudo docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
~$ sudo nvidia-docker run nvidia/cuda:9.0-base nvidia-smi

microk8sをインストール

snapコマンドでmicrok8sをインストールします。

~$ sudo snap install microk8s --classic

microk8sコマンドを任意のユーザーで実行するにはグループへの追加が必要です。 usermodコマンドで-aオプションのつけ忘れに要注意。

~$ sudo usermod -aG microk8s ubuntu && logout

microk8sでGPUを有効化

コマンドを実行するとモジュールを有効化できます。 GPUモジュールの要件として、NVIDIA Container Toolkitが事前にインストールされている必要があります。

~$ microk8s.enable gpu
Enabling NVIDIA GPU
NVIDIA kernel module detected
Enabling DNS
Applying manifest
serviceaccount/coredns created
configmap/coredns created
deployment.apps/coredns created
service/kube-dns created
clusterrole.rbac.authorization.k8s.io/coredns created
clusterrolebinding.rbac.authorization.k8s.io/coredns created
Restarting kubelet
DNS is enabled
Applying manifest
daemonset.apps/nvidia-device-plugin-daemonset created
NVIDIA is enabled

GPUを使おう

GPUをmicrok8sで使ってみましょう。 まずはYAMLを適当に書きます。

~$ vi gpupod-demo.yml
apiVersion: v1
kind: Pod
metadata:
  name: gpu-hello-world
spec:
  containers:
    - name: cuda
      image: nvidia/cuda:9.0-base
      tty: true

GPU Podを作ります。

~$ microk8s.kubectl create -f gpupod-demo.yml

GPU PodでGPUを使ってみましょう。

~$ microk8s.kubectl exec -it gpu-hello-world -- nvidia-smi
Wed Oct  2 06:39:51 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.87.00    Driver Version: 418.87.00    CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 1080    Off  | 00000000:03:00.0 Off |                  N/A |
| 32%   31C    P8     8W / 180W |      0MiB /  8119MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

というわけで、Ubuntuベースでmicrok8sを使いKubernetesを稼働させて、GPUをコンテナーで実行することが簡単にできるのがわかりました。 microk8sを使えば手軽にKubernetes環境を動かすことができ、かつNVIDIA GPUを使った解析作業とかが捗りそうですね。

インストールしたバージョン

最終的にインストールしたソフトウェアの構成はこちらです。

  • Ubuntu Server 16.04.6 (Linux 4.4.0-165-generic #193-Ubuntu)
  • Docker CE 19.03.2
  • microk8s v1.16.0
  • CUDA Toolkit 10.1 Update 2
  • cuda-drivers 418.87.00-1