仮想化通信

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

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

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

参考にした情報

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

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

Ubuntuをインストール

NVIDIA Container Toolkitと対象のCUDAがサポートするOSとGPUを用意します。

[2023/7/4 追記] マトリックス表はこちらをご覧ください。 docs.nvidia.com

この記事を書いた時点では正式サポートではなかったようですが、現在はUbuntu 22.04LTSにおいてバージョン1.26のMicrok8sでのNVIDIA GPU Operatorを使ったGPU割り当てがサポートされています。

cuda-driversをインストール

CUDAのパッケージリポジトリーを追加して、cuda-driversパッケージをインストールします(GPU Driverなども一緒に入ります)。手順通り cuda をセットアップすると、依存パッケージとしてデスクトップ環境も入ってしまいます。

Docker CEをインストール

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

NVIDIA Container Toolkitをインストール

NVIDIA Container Toolkitのパッケージリポジトリーを追加して、必要なパッケージをインストールします。

[2020/4/9 追記] Docker 19.03以前のバージョンでは nvidia-docker2 、Docker 19.03以降のバージョンでは nvidia-container-toolkit をインストールします。インストール後はDockerサービスを再起動します。

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 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

  • Ubuntu Server 18.04.4 (Linux 4.15.0-96-generic #97-Ubuntu)

  • Docker 19.03.6
  • MicroK8s v1.18.0
  • CUDA Toolkit 10.2
  • cuda-drivers 440.33.01

[2023/7/4 追記]

  • Ubuntu Server 22.04.2 (Linux 5.15.0-76-generic #83-Ubuntu)
  • Docker 24.0.2
  • MicroK8s v1.26.0
  • CUDA Toolkit 12.0.1
  • cuda-drivers 525.85.12