Ubuntu Weekly Recipe

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

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

仮想マシンインスタンスからGPUを見えるようにする

GPUを使うための仮想マシンインスタンスを用意します。このあたりは第641回とほぼ同じです。

$ lxc launch ubuntu:20.04 kubeflow --vm -c limits.cpu=4 -c limits.memory=16GiB
$ lxc exec kubeflow -- sed -i 's/archive.ubuntu/jp.archive.ubuntu/' /etc/apt/sources.list
$ lxc exec kubeflow -- timedatectl set-timezone Asia/Tokyo
$ lxc exec kubeflow -- sh -c 'apt update && apt full-upgrade -y'

インスタンス名が「kubeflow」ですが残念ながら今回はKubeflowは関係ありません※2⁠。タイムゾーンの設定やインスタンスのスペックを上げているのも,今回の話とは関係ありません。

※2
microk8sでKubeflowを使用する記事を執筆できた暁には,伏線として活用される予定です。

次に一度インスタンスを停止して,GPUをインスタンスに追加します。仮想マシンインスタンスの場合このあたりの設定変更の際は,毎回インスタンスを停止しなくてはならないので少し面倒です。

$ lxc stop kubeflow
$ lxc config device override kubeflow root size=150GiB
$ lxc config set kubeflow security.secureboot=false
$ lxc config device add kubeflow nv gpu vendorid=10de
$ echo -n '-cpu host,kvm=off' | lxc config set kubeflow raw.qemu -
$ lxc start kubeflow

ストレージを増やしていますが,これもスペック等と同じで関係ありません。重要なのはその次の行からです。

まずsecurity.secureboot=falseでセキュアブートを無効化しています。LXDの仮想マシンインスタンスは,初期状態だとセキュアブートが有効化されています。普段使う分には問題ありませんが,あとで説明するようにサードパーティのドライバーをインストールしたい場合(つまりはDKMSを使いたい場合)には若干手間がかかります。具体的にはDKMSインストール時にパスワードを設定し,再起動後にコンソールからそのパスワードを入力する必要があるのです。LXDの場合,lxc consoleで仮想マシンインスタンスのコンソールにアクセスできるものの,手間とメリットを考えるとセキュアブートを切ってしまうのもひとつの手でしょう。

次にlxc config device addでベンダーIDが「0x10de」なPCIデバイスをnvという名前でインスタンスに紐づけています。ここで言う「0x10de」はNVIDIAのベンダーIDです。具体的には次のコマンドで確認できます。

$ lspci -nn | grep -i nvidia
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP107 [GeForce GTX 1050 Ti] [10de:1c82] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation GP107GL High Definition Audio Controller [10de:0fb9] (rev a1)

他にもproductidのようにデバイスIDやPCIのアドレスなど,より細かい粒度でも指定可能です。複数のGPUが繋がったサーバーだとこれらの指定が必要になるでしょう。詳しいことはLXDのドキュメントのGPUデバイスに関する項目を参照してください。

最後は仮想マシンの中でNVIDIAのGPUを使うためのオプションとなります。raw.qemuオプションに-cpu host,kvm=offを設定しています。LXDではraw.qemuに任意の文字列を設定することで,仮想マシンを起動する際のQEMUコマンドのパラメーターを変更可能です。kvm=offは仮想マシンインスタンスが「仮想マシンであること」を隠すためのオプションです。

どんな仮想マシンシステムもゲストの中からCPUID命令を発行することで,⁠自分自身がどんなハイパーバイザー上で動いているか」がわかる仕組みが存在します。Ubuntuだとcpuidパッケージで提供されているcpuidコマンドを使うと,たとえばhypervisor guest status = truehypervisor_id = "KVMKVMKVM "とセットされることが確認できます。どうやらNVIDIAのツールは「KVMインスタンスであること」を検知すると「Unknown error」を発生させるようです。そこでQEMUにはこのKVMシグネチャを表示しないオプションが追加されました。これがCPUオプションのkvm=offです。

設定後にインスタンスを起動したら,インスタンスの中からもGPUデバイスが見えていることを確認しましょう。

$ lxc exec kubeflow -- lspci -nn | grep -i nvidia
06:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP107 [GeForce GTX 1050 Ti] [10de:1c82] (rev a1)
06:00.1 Audio device [0403]: NVIDIA Corporation GP107GL High Definition Audio Controller [10de:0fb9] (rev a1)

著者プロフィール

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

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