Ubuntu Weekly Recipe

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

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

第641回ではLXDとmicrok8sでシングルサーバーをKubernetesクラスターにすると題して,より高機能になったmicrok8sについて紹介しました。microk8sで構築したKubernetesがあれば,気軽にたくさんのCPUコアを使ってさまざまなワークロードを動かし,部屋を暖められます。でも,待ってください。そのサーバーにはもっと便利な熱源がありませんか? そうGPUですね。本格的に寒くなる前に,Kubernetes環境からもGPUを使えるようにしましょう。

ホスト側でGPUパススルーの準備

第641回ではLXDの仮想マシンインスタンスの上にmicrok8sをインストールしました。つまりホストマシンのGPUを使うには,LXDの仮想マシンの中からGPUにアクセスできなくてはなりません※1⁠。コンテナの場合,第532回のLXDのコンテナからGPUを利用するなどで手順を紹介していますが,実はLXD 4.3から仮想マシンインスタンスでも同じ手順でGPUパススルーをサポートするようになったのです。

※1
ホストマシンに直接microk8sをインストールする場合はLXD関連の話は無視して大丈夫です。「サーバー向けNVIDAドライバーのインストール」までスキップしてください。

この方法の注意点はふたつあります。まず,LXD 4.3はフィーチャーリリースであること。LXDにはLTSリリースとフィーチャーリリースの2種類のリリースブランチが存在します。LTSリリースはUbuntuのLTSと同じタイミング(つまり2年周期)でリリースされるリリースブランチで,メンテナンスもそれに合わせて行われます。Ubuntuサーバーをインストールしたときに一緒についてくるのは,LTSリリースのLXDです。現在はLTS 2.0,3.0,4.0のLTSリリースが存在します。

それに対してフィーチャーリリースは,ほぼ1ヶ月周期でリリースされる機能追加ブランチです。次のLTSリリースに向けてさまざまな新機能を追加しているため,どんどんと仕組みが更新されています。このようにフィーチャーリリースは安定性を求める環境には向かない点に注意が必要です。

もうひとつの注意点はGPUが仮想マシンに占有されてしまうことです。仮想マシンの場合,IOMMU(IntelのVT-dやAMDのAMD-Vi)を用いてPCIパススルーで仮想マシン上からGPUをアクセスできるようにするため,そのGPUを使えるのは設定した仮想マシンインスタンスのみとなります。コンテナインスタンスの場合は,GPUを複数のインスタンスで共有できますが,仮想マシンの場合はインスタンスの数だけGPUを用意してください。

よってまずはLXDをフィーチャーリリースに変更します。新規にインストールする際はsnap installのオプションに--channel=latest/stableとつけるだけです。すでにインストール済みの環境であれば,次のようにrefreshしてください。

$ sudo snap refresh --channel=latest/stable lxd
lxd 4.7 from Canonical✓ refreshed

$ lxd --version
4.7

これでLXD側の準備は整いました。次にカーネル側の準備を行います。Intelの場合,IOMMU機能は有効化されていません。よってIntel CPUを使っている場合,カーネルのコマンドラインからIOMMU機能を有効化します。ちなみにAMDの場合は最初から有効化されているようです。

/etc/default/grubGRUB_CMDLINE_LINUXを次のように変更してください。

GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt"

あとはGRUBの変更を反映します。

$ sudo update-grub

またNVIDIAのGPUを利用している場合,Nouveauドライバーをロードしないようにしておいてください。

$ echo "blacklist nouveau" | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf

ここまで実行したら,一度ホストシステムを再起動しておきましょう。起動後に次のようにIOMMU enabledが表示されればOKです。

$ dmesg | grep IOMMU
[    0.114164] DMAR: IOMMU enabled
[    0.217696] DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000 IOMMU 1

もし表示されない場合,チップセットが対応していない可能性もあります。まずはBIOSメニューでIOMMUが有効化されているか確認してみましょう。

著者プロフィール

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

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