先日ブラブラとサイトをみていたら、MicroK8s + GPUが割と楽しそうだったので試してみました。 ちなみに30分くらいで動かせました。
参考にした情報
- https://microk8s.io/docs/
- https://ubuntu.com/blog/using-gpgpus-with-kubernetes
- https://towardsdatascience.com/my-portable-ubuntu-18-deep-learning-setup-66151fe78da9
基本的には次の流れでセットアップすればすぐ使えるようです。
- Ubuntu Server or Desktop
- cuda-drivers
- Docker CE & NVIDIA Container Toolkit
- microk8s
- 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