先日ブラブラとサイトをみていたら、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