Ubuntu Weekly Recipe

第642回 仮想マシン上のmicrok8sからGPUを利用する

この記事を読むのに必要な時間:およそ 7 分

サーバー向けNVIDAドライバーのインストール

インスタンスの中からGPUデバイスが見えるようになったので適切なデバイスドライバーをインストールします。AMD系であれば標準のドライバーで問題ないはずですし,第471回第524回でも紹介しているように,プロプライエタリなドライバーも用意されています。それに対してNVIDIAはプロプライエタリーなドライバー一択です。

具体的なインストール方法は第454回のUbuntu 16.04 LTSにNVIDIA製ドライバーをインストールする3つの方法で紹介しているものの,当時と状況が若干異なっています。まずパッケージ名が「nvidia-XXX」から「nvida-driver-XXX」に変更されました。さらに「nvidia-driver-XXX-server」なるパッケージも追加されています。この「nvidia-driver-XXX-server」は中身が少し異なる(Powerサーバー向け対応が入っている)ものの,中身そのものはほとんど「nvidia-driver-XXX」と同じです。

では,何が違うのかと言うと新バージョンが出た時の挙動です。たとえば2020年11月時点での最新は「nvidia-driver-450」でその一つ前は「nvidia-driver-440」となっています。これらは現時点で次のような形になっています。

  • nvidia-driver-440:nvidia-driver-450に依存するだけの移行用ダミーパッケージ
  • nvidia-driver-440-server:NVIDA Driver 440.95.01をインストールする
  • nvidia-driver-450:NVIDA Driver 450.80.02をインストールする
  • nvidia-driver-450-server:NVIDA Driver 450.80.02をインストールする

つまり「nvidia-driver-XXX」をインストールした場合,新しいドライバーがリリースされたら自動的にアップグレードされます。それに対して「nvidia-driver-XXX-server」の場合はアップグレードされません。サーバーの用にドライバーが更新されることを防ぎたい場合に「nvidia-driver-XXX-server」は便利なパッケージなのです。

さらにサーバー向けとして「nvidia-headless-XXX」「nvidia-headless-XXX-server」が追加されました。これらはX Window System/Wayland関連のパッケージに依存しないため,サーバーのようなヘッドレスマシンにおいてGPGPU目的でNVIDIAのドライバーをインストールしたい際に便利です。

ここからはNVIDIAのGPU前提で話を進めます。まずはドライバーのインストールです。次のコマンドでインストールできるバージョンを確認して,必要なものをインストールしてまいましょう。

インストール可能なバージョンを確認する:
$ lxc exec kubeflow -- apt search "^nvidia-headless-[0-9]"

最新もしくは必要なバージョンをインストールする:
$ lxc exec kubeflow -- apt install -y nvidia-headless-450
  => 今回はバージョンアップを許容して「-server」がついていない方を選択

念のため再起動する:
$ lxc restart kubeflow

ロードされていることを確認する:
$ lxc exec kubeflow lsmod | grep nvidia
nvidia_uvm            847872  0
nvidia_modeset       1060864  0
nvidia              18190336  18 nvidia_uvm,nvidia_modeset
nvidia_drm             12288  0

ちなみに実機にNVIDIAドライバーをインストールしたときと比べるとDRMやKMS関連のドライバーがロードされていないことに気がつくかもしれません。これはLXDの仮想マシンインスタンスで使用しているカーネル(linux-image-kvm)は通常のカーネル(linux-image-generic)と異なり,CONFIG_DRMなどサーバーで使うことが少ないコンフィグを軒並み無効化しているためです。もし,何らかの理由で通常のカーネルが必要になった場合は次のようにカーネルを差し替えてください。

$ lxc exec kubeflow -- sh -c 'apt install -y linux-generic'
$ lxc exec kubeflow -- sh -c 'apt remove -y ~nlinux-.*kvm'
  => 実行中のカーネルパッケージを削除することになるので,
     削除を中断するか(Abort kernel removal?)という問い合わせが表示される。
     消すのが正しいのでNoを選択する。
     GRUBメニューから通常のカーネルで起動したあとに消しても良い。

$ lxc restart kubeflow

恒例のnvidia-smiコマンドで動作確認しましょう。

$ lxc exec kubeflow -- apt install nvidia-utils-450
$ lxc exec kubeflow nvidia-smi
Sat Nov 14 20:52:25 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.80.02    Driver Version: 450.80.02    CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce GTX 105...  Off  | 00000000:06:00.0 Off |                  N/A |
|  0%   49C    P0    N/A /  72W |      0MiB /  4040MiB |      1%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

もしUnable to determine the device handle for GPU 0000:06:00.0: Unknown Errorのようなエラーメッセージが表示される場合,何か設定に問題があります。一番可能性が高いのが,KVM上と判定されたケースなので,前項で説明したようにLXDのraw.qemu設定に-cpu host,kvm=offを追加できているか確認してください。一番手っ取り早いのはホスト上でps -fe | grep kvm=offすることです。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。