Ubuntu日和

【第56回】例のミニPC「MS-01」にNVIDIA RTX A1000をセットしてStable Diffusionを動かしてみる

MS-01にベストフィットなRTX A1000

 MINISFORUMの「MS-01」は、ミニPCのふりをしつつSFP+x2ポートとか、PCI Express 4.0スロットとか妙な拡張性を持っているマシンだ。今回はこのMS-01のPCI Expressスロットに、6月に発売された「NVIDIA RTX A1000」をインストールしてみよう。

MS-01において悩ましいPCI Expressスロット

 MS-01にはPCI Express 4.0 x16のスロットが存在するのだが、このスロットには「 HHHL(Half-Hight/Half-Length)のシングルスロット 」というサイズの制約と、「 ブラケットからコネクタが飛び出ているカードだとケースと干渉する 」という形状の制約が存在する。前者の、特にシングルスロットのみの制約からほとんどのビデオカードは使えず、後者のコネクタの制約からSFP/QSFPが搭載されたNICもかなり限定されてしまう状態だった。

 そんな状況において2024年4月ぐらいに登場したのが、「 NVIDIA RTX A400/A1000 」だ。

 これはシングルスロットの厚みながら、GeForce RTX 30シリーズと同じAmpereアーキテクチャを採用し、より高性能なA1000の場合は2304基のCUDAコアや18基のRTコア、72基のTesorコアなどGeForce RTX 3050 6GBと同程度の性能を備えている。8GBのVRAMとMini DisplayPortが4ポートあるため、ゲーム用途でも生成AI用途でもそれなりに使える製品だ。

 ただし、あくまで「サイズの割にはそれなりに使える」程度であることに注意しよう。もし本格的にGPUを使いたいのであれば、USB4経由で外付けGPUボックスを使ったほうが選択肢は増えるし、そこまでやるくらいなら、MS-01ではなくきちんとした電源を搭載したPCを使うほうが「まっとう」な判断となる。あくまでMS-01でお手軽にGPUを使うならという前提において、A1000は有力な選択肢となるのだ。

シングルファンを備え、小さな筐体に必要十分な機能がぎゅっと詰まった一品。LowProfileのブラケットと、Mini DisplayPort→DisplayPort変換アダプタが付属する
コネクタはMini DisplayPortが4ポートのみ。PCI Expressはx16の形状だが実際の帯域はx8
MS-01にも問題なく収まるサイズ。ただしコネクタをきちんと挿入するには少しのコツと強く押す勇気が必要だ
特に背面側のブラケットの突起の位置には注意しよう

 なおLowProfileのブラケットへと交換するには、T6サイズのトルクスドライバが必要であるため、合わせて用意しておこう。

さまざまな種類があるNVIDIAドライバ

 それではさっそく、Ubuntu 24.04 LTSにA1000のドライバをインストールしていこう。NVIDIAのドライバをインストールする方法はこれまでにも、第15回をはじめとして何度か紹介している。

 しかしながら今回はこれまでと様相が異なる。まず2024年7月15日時点で「 追加のドライバからドライバをインストールできない 」状態なのだ。そこで今回はこのあたりの事情と回避策、そして「 サーバー向けのNVIDIAのドライバのインストール方法 」について紹介しよう。

RTX A1000を認識していても追加のドライバでは何も表示されない

 まず、「追加のドライバ」に表示されない件だが、これは単純に現時点で最新のドライバである「nvidia-driver-550」のメタデータとして、RTX A1000が含まれていないからだ。厳密にはRTX A1000は含まれているのだが、なぜかSubsystem Vendor IDがLenovoのものだけになっている。

apt showでModailasesフィールドを確認するとRTX A1000にマッチするものはこれだけ
$ apt show nvidia-driver-550
(中略)
Modaliases:
(中略)
  pci:v000010DEd000025B0sv000017AAsd00001878bc03sc*i*

 「sv000017AA」となっている部分がポイントで、これはLenovoのVendor IDになる。実際の手元のModaliasesは、RTX A1000のDevice IDである「25B0」でフィルタリングすると次のようになっていた。

ubuntu-driversコマンドは、「追加のドライバ」のバックエンドだ
$ ubuntu-drivers debug | grep 25B0
pci:v000010DEd000025B0sv000010DEsd00001878bc03scsc00i00

 こちらはSubsystem Vendor IDも「10DE」とNVIDIAのVendor IDになっている。この不一致が「追加のドライバ」で、NVIDIAのドライバが表示されない要因となっている。では、「nvidia-driver-550」やそれ以降のバージョンはRTX A1000では使えないのか?というとそんなことはない。実際にNVIDIAのドキュメントだと、550系のドライバはRTX A1000をサポートしている。さらに実はnvidia-driver-550パッケージを、aptコマンドでインストールしてしまえば普通に認識する。

 そこで、ここからは「追加のドライバ」を使わずに、NVIDIAのドライバをインストールする方法を説明しよう。これはサーバーでNVIDIAをGPGPUとして使う場合にも役に立つはずだ。第15回の「追加のドライバ」のスクリーンショットにもあるように、UbuntuのNVIDIAのドライバは複数提供されている。まずこの違いについて説明しよう。

 簡単に区別すると、次のような12種類が存在する。「XXX」にはバージョン番号が入る。

  • nvidia-driver-XXX
  • nvidia-driver-XXX-server
  • nvidia-driver-XXX-open
  • nvidia-driver-XXX-server-open
  • nvidia-headless-XXX
  • nvidia-headless-XXX-server
  • nvidia-headless-XXX-open
  • nvidia-headless-XXX-server-open

 実際はほかにも似たような名前のパッケージが存在するが、基本的には上記パッケージの依存パッケージとして入るだけなのであまり気にしなくて良い。

 まず大きな違いが「 serverのありなし 」だ。UbuntuではNVIDIA向けのドライバを次のように大別している。

  • Unified Driver Architecture(UDA): 主にデスクトップ・ゲーム向けのドライバセット、nvidia-drver-XXXが該当
  • Enterprise Ready Drivers(ERD): 主にサーバー・GPGPU向けのドライバセット、パッケージ名に「server」が含まれる

 ベースとなるコードは同じだが、パッケージの依存関係、インストールされる設定ファイルなどに違いがある。特にUDAなnvidia-driver-XXXは、デスクトップ向けのパッケージ(X Window System向けのドライバ)が依存関係に含まれるが、ERDのほうは含まれないのが大きな違いだろう。

 さらにNVIDIAは最近、オープンソースライセンス版のLinux向けドライバを提供している。「 openのありなし 」はこのオープンソースライセンス版を使っているかどうかの違いになる。将来的にはプロプライエタリ版との違いはなくなっていく方向性ではあるが、現状はまだ差分があるようだ。このあたりは好みで使い分けると良いだろう。

 「nvidia-headless-XXX」系は、「server」からさらに踏み込んで「ドライバだけ」をインストールするパッケージだ。たとえばコンテナ環境でGPGPU/CUDAを動かす場合、ホストサーバーにはNVIDIAのドライバのみをインストールし、コンテナ環境側に任意のライブラリをインストールするような使い方を想定している。

 ここまでをまとめると次の通りだ。

  • デスクトップでもゲームでも使いたいのであればUDA(nvidia-driver-XXX)をインストールする
  • サーバーでGPGPU/CUDA環境として使うのであればERD(nvidia-driver-XXX-server)をインストールする
  • コンテナ環境でのみ使うのであればnvidia-headless-XXXも検討する

 「XXX」のバージョン番号については状況に応じて変わってくる。基本的には「追加のドライバ」を使うか、次のコマンドで最新のバージョンをインストールすれば良い。

CLIから追加のドライバ相当の作業を行なうコマンド
デスクトップ向けのドライバを表示:
$ sudo ubuntu-drivers list
バージョンを指定してインストール
$ sudo ubuntu-drivers install nvidia:550

サーバー向けのドライバを表示:
$ sudo ubuntu-drivers list --gpgpu
バージョンを指定してインストール
$ sudo ubuntu-drivers install --gpgpu nvidia:550-server

 今回のように「追加のドライバ」で表示されない(ubuntu-driversでも表示されない)場合は、aptコマンドを使ってインストールすることになる。

パッケージを検索してインストールするコマンド
nvidia-driversで始まるパッケージを検索:
$ apt search '^nvidia-driver-[0-9]+$'
最新のパッケージをインストール:
$ sudo apt install nvidia-driver-XXX

 なお、セキュアブート有効化環境の場合、NVIDIAのようなサードパーティのドライバをインストールするにはMokManagerの設定が必要になる点に注意しよう。これは要するにカーネルドライバが更新されて再ビルドされた時に、自動的にドライバを署名/検証する仕組みだ。再ビルド時に使う署名用の鍵をUEFI変数に登録しなくてはならないのだが、セキュリティ上の都合で一度「UEFI環境で鍵の登録」を行なう必要がある。このあたりは画面の指示に従って作業すれば良い。

パッケージインストール時にセキュアブート関係の設定が必要な旨が通知される
鍵を登録するための一時的なパスワードの設定を要求される。再起動後に一度使うだけなので何でも良い

 ここまで来ればいったんインストール完了したので、再起動が必要になる。ただし再起動時にはPCにディスプレイとキーボードを繋いでおこう。

Ubuntuが起動する前にMokManagerが起動するので、「Enroll MOK」を選択する
「View key 0」を選択すると登録する鍵情報が表示される。ここでは「Continue」で継続する
「Yes」を選択する
先ほど登録したパスワードを入力する
「Reboot」を選択すればMokManagerの設定は完了だ

 あとは再起動すれば、NVIDIAのドライバが使われるようになっているはずだ。

nvidia-smiコマンドでも、RTX A1000を認識していることが分かる
システム設定の「システム」から、「グラフィック」の欄が正しく認識していることを確認できる

 ちなみにNVIDIAのドライバを導入した場合は、Waylandは無効化されX Window Systemで立ち上がることになる。もしNVIDIAはゲーム目的ではなくGPGPU目的であり、Wayland環境を使いたいということであれば、MS-01なら内蔵GPUを優先させると良い。

UEFI設定の「Onboard Deevice settings」で「Primary Display」を「IGFX」にすると内蔵GPUが優先されるようになる

 内蔵GPUの場合はマルチディスプレイに枚数の制約が出てしまうが、RTX A1000の機能を純粋にGPGPUだけで使えるようになるので、1つの選択肢となるだろう。

Stable Diffusion web UI

 最後に、「Stable Diffusion web UI」をインストールしてみよう。基本的な考え方は第25回と同じだ。ただし、Ubuntu 24.04 LTSで実行しようとするといくつかの注意点が存在する。

  • AUTOMATIC1111版のWeb UIはPython 3.10.6でのみ動く
  • Ubuntu 24.04 LTSはPython 3.12なのでインストール時にいくつか問題が出る

 Web UIが動けば良いので、コンテナに閉じ込めて動かすのが常道ではあるのだが、「とりあえず動けば良い」ならPython 3.10パッケージをインストールするという手もある。deadsnakesプロジェクトでは、古いバージョンのPythonパッケージをUbuntuにも提供するプロジェクトだ。そこで今回はこのdeadsnakesを使ってPython 3.10環境を構築しよう。

deadsnakesリポジトリを追加し、必要なパッケージをインストールする
$ sudo add-apt-repository ppa:deadsnakes/ppa
$ sudo apt install wget git python3.10-venv python3-pip \
  libgl1 libglib2.0-0 google-perftools

 しかしながら「python3-pip」パッケージと「python3-setuptool」パッケージが、Python 3.10に合わないため、こちらもダウングレードしておく必要がある。

Python 3.10向けにpipとsetuptoolをダウングレード
$ python3.10 -m pip install pip==23.1.1
$ python3.10 -m pip install setuptool==59.6.0

 この状態で、AUTOMATIC1111版Stable Diffusion web UIをインストールしよう。

python=cmd変数にPython 3.10を指定する
$ git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
$ cd stable-diffusion-webui
$ python_cmd=python3.10 ./webui.sh --xformers

 あとはStable Diffusion web UIの使い方と同じだ。Web UIが立ち上がるので何か画像を生成してみると良いだろう。

バッチカウント5、バッチサイズ2、サンプリングステップ20で適当に画像を生成すると、ものの数秒で終わる
モデルにもよると思うがGPUの使用率はほぼ100%、VRAMの使用量は半分の4GiB程度であり、温度は90℃ぐらいになることもあった
CPUやDRAMはほぼ使われず、多少ストレージのアクセスがあるかなという具合

 やはり生成AIだと、GPUそのものがボトルネックになる模様。ただしMS-01のサイズと排熱やら消費電力やらを考えると、十分に頑張っていると言えるだろう。USB4やSFPなどある種の「インターコネクト」が充実していることも踏まえると、MS-01とRTX A1000は「ご家庭用のちょっとしたGPUサーバー」としての使い方も楽しいかもしれない。