Ubuntu日和
【第56回】例のミニPC「MS-01」にNVIDIA RTX A1000をセットしてStable Diffusionを動かしてみる
2024年7月20日 06:18
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のブラケットへと交換するには、T6サイズのトルクスドライバが必要であるため、合わせて用意しておこう。
さまざまな種類があるNVIDIAドライバ
それではさっそく、Ubuntu 24.04 LTSにA1000のドライバをインストールしていこう。NVIDIAのドライバをインストールする方法はこれまでにも、第15回をはじめとして何度か紹介している。
しかしながら今回はこれまでと様相が異なる。まず2024年7月15日時点で「 追加のドライバからドライバをインストールできない 」状態なのだ。そこで今回はこのあたりの事情と回避策、そして「 サーバー向けのNVIDIAのドライバのインストール方法 」について紹介しよう。
まず、「追加のドライバ」に表示されない件だが、これは単純に現時点で最新のドライバである「nvidia-driver-550」のメタデータとして、RTX A1000が含まれていないからだ。厳密にはRTX A1000は含まれているのだが、なぜかSubsystem Vendor IDがLenovoのものだけになっている。
$ apt show nvidia-driver-550
(中略)
Modaliases:
(中略)
pci:v000010DEd000025B0sv000017AAsd00001878bc03sc*i*
「sv000017AA」となっている部分がポイントで、これはLenovoのVendor IDになる。実際の手元のModaliasesは、RTX A1000のDevice IDである「25B0」でフィルタリングすると次のようになっていた。
$ 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」のバージョン番号については状況に応じて変わってくる。基本的には「追加のドライバ」を使うか、次のコマンドで最新のバージョンをインストールすれば良い。
デスクトップ向けのドライバを表示:
$ 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にディスプレイとキーボードを繋いでおこう。
あとは再起動すれば、NVIDIAのドライバが使われるようになっているはずだ。
ちなみにNVIDIAのドライバを導入した場合は、Waylandは無効化されX Window Systemで立ち上がることになる。もしNVIDIAはゲーム目的ではなくGPGPU目的であり、Wayland環境を使いたいということであれば、MS-01なら内蔵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環境を構築しよう。
$ 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に合わないため、こちらもダウングレードしておく必要がある。
$ python3.10 -m pip install pip==23.1.1
$ python3.10 -m pip install setuptool==59.6.0
この状態で、AUTOMATIC1111版Stable Diffusion web UIをインストールしよう。
$ 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が立ち上がるので何か画像を生成してみると良いだろう。
やはり生成AIだと、GPUそのものがボトルネックになる模様。ただしMS-01のサイズと排熱やら消費電力やらを考えると、十分に頑張っていると言えるだろう。USB4やSFPなどある種の「インターコネクト」が充実していることも踏まえると、MS-01とRTX A1000は「ご家庭用のちょっとしたGPUサーバー」としての使い方も楽しいかもしれない。