aki はついにお金を貯めることができました。ずっと考えていた AI 絵画を少し試してみることができそうです。
目を開けて無茶なことを言わない(アイブロウペンは金に勝る)という原則に従い、お金を無駄に使わないために、「高性能」(過去のもの)な計算カードを購入して Stable Diffusion(以下 SD)を試してみることを考えています。
元々はサーバー用にグラフィックカードを購入するつもりでしたが、結局は収容できないことがわかり、少し困りました。
PC には ubuntu22.04 がインストールされており、元々使っていたグラフィックカードは 1660TI で、今ちょうど新しいグラフィックカードのためにスペースを空けることができます。
コアコンポーネント | 交換前 | 交換後 |
---|---|---|
CPU | AMD Ryzen 5 3500X | 変わらず |
マザーボード | MSI B450M | 変わらず |
メモリ | 40G | 変わらず |
グラフィックカード 1 | NVIDIA GTX 1660TI | TESLA P40 |
グラフィックカード 2 | なし | NVIDIA GF 310 |
GF 310 はブートカードとしてのみ使用されます。交換前のこれらのコンポーネントが必要とする定格電力(オーバークロックを考慮しない場合)は約 215W で、交換後の電力は 335W に増加しました(国家電網のパートナーおよび外部従業員)、電気代は目に見えて上昇しています。
なぜ tesla P40 を選ぶのか#
まず、このカードの技術仕様を見てみましょう。
GPU アーキテクチャ | NVIDIA Pascal™ |
単精度浮動小数点演算能力 | 12 TeraFLOPS* |
整数演算能力 (INT8) | 47 TOPS* (万億回の演算 / 秒) |
GPU メモリ | 24 GB |
メモリ帯域幅 | 346 GB/s |
システムインターフェース | PCI Express 3.0 x16 |
外形 | 4.4”(高さ)x 10.5”(長さ)、デュアルスロット、フルハイト |
最大消費電力 | 250 W |
ページ移行エンジンによるプログラミング能力の向上 | はい |
ECC 保護 | はい |
ハードウェアアクセラレーションビデオエンジン | 1 つのデコーディングエンジン、2 つのエンコーディングエンジン |
P40 の実際の使用性能は GTX 1080TI に相当し、ネットユーザーが詳細な比較を行っています。詳しくは:知乎
さて、なぜ P40 を選ばなければならないのでしょうか?
単精度浮動小数点演算能力や整数演算能力などの技術指標は私には理解できませんが、実際には彼の 24GB のメモリに注目しています。この知乎の回答は 2018 年のもので、P40 は 2016 年に発表されました。間違いなく、このような専門用途の計算カードは高価であることは必然です。時が経つにつれ、現在の某魚市場の中古グラフィックカードを比較すると、1080TI の方が若干高いことがわかります(これは上半期に AI モデルが何度も更新された結果、中古市場でのトレーニング用途のグラフィックカードの価格が上昇したためです)。
P40 の 24GB のメモリは 1080TI の 12GB に比べて、より多くのタイプの AI モデルを実行するために使用できます。
さらに、サーバー自体に内蔵グラフィックがあるため、ブート問題を考慮する必要がなく、P40(950R)を優先しました。
P40 のインストール前後の操作#
ubuntu にグラフィックカードドライバをインストールする正しい手順は、まずオープンソースドライバ nouveau を無効にし、init 3 の純コマンドラインモードに入ることです。
以前に 1660TI にドライバをインストールした際にこれらの手順を行ったため、この記事では省略します。
この記事を参考にして Linux オペレーティングシステムにドライバをインストールする場合は、必ず上記の準備を整えてください。
この PC に最初に搭載されていたグラフィックカードは 1660TI で、交換後は出力表示がないため、別のブートカードを用意する必要があります。急いで近くのコンピュータ店で「高価」に GF310 グラフィックカードを購入しました(さもなければ点灯できず、自己診断を通過できません)。
ubuntu オペレーティングシステムでは P40 グラフィックカードをインストールできないため、まず GF310 を取り付け、その後元のドライバをアンインストールし、新しいドライバを更新してインストールします。
~$ lspci | grep -i nvidia
25:00.0 VGA互換コントローラ: NVIDIA Corporation GT218 [GeForce 310] (rev a2)
~$ apt remove --purge nvidia-*
~$ nvidia-smi
コマンド「nvidia-smi」が見つかりませんが、以下のパッケージをインストールすることでそれを取得できます:
~$ apt autoremove
lspci
は現在の pci にインストールされているグラフィックカードのモデルを確認するために使用されます。
apt remove --purge nvidia-*
は元の 1660TI のドライバをアンインストールするために使用されます。
nvidia-smi
が見つからないというメッセージは、ドライバが正常にアンインストールされたことを示します。
apt autoremove
は残余の依存パッケージが完全にアンインストールされることを保証します。
GF310 グラフィックカードに必要なドライバは 340 バージョンで、ubuntu-drivers devices
コマンドでは適切なドライババージョンが見つかりませんでした。ドライバファイルを公式サイトからダウンロードしてインストールしようとしましたが、失敗しました(このバージョンはどれほど古いのでしょうか)。
理由は、ppa リポジトリに 340 バージョンのドライバパッケージが含まれていないため、拡張する必要があります。
~$ add-apt-repository ppa:graphics-drivers/ppa
~$ apt-get update
~$ apt-get install nvidia-340
インストールが完了した後、再起動しても nvidia-smi コマンドで現在のグラフィックカードドライバを確認できませんでした。
~$ apt-get install nvidia-340
ソフトウェアパッケージリストを読み込んでいます... 完了
パッケージの依存関係ツリーを分析しています... 完了
状態情報を読み込んでいます... 完了
nvidia-340は最新バージョンです (340.108-0ubuntu8)。
0個のパッケージがアップグレードされ、新しくインストールされたパッケージは0個、アンインストールされたパッケージは0個、アップグレードされていないパッケージが2個あります。
しかし、再度apt-get install nvidia-340
コマンドを実行すると、すでにインストールされていると表示されます。したがって、ブートカードのドライバはインストールが完了しているはずで、ディスプレイからも解像度が自動的に調整されているのが確認でき、ブート表示の問題は解決しました。
P40 グラフィックカードをインストールする前に、まず BIOS に入り、Above4GDecoding を有効にし、Secure Boot を無効にする必要があります。
再度シャットダウンし、P40 グラフィックカードを再接続して起動します。
今度は PCI バス上に P40 グラフィックカードが表示されるのが確認できます。
~$ lspci | grep -i nvidia
25:00.0 VGA互換コントローラ: NVIDIA Corporation GT218 [GeForce 310] (rev a2)
25:00.1 オーディオデバイス: NVIDIA Corporation ハイデフィニションオーディオコントローラ (rev a1)
26:00.0 3Dコントローラ: NVIDIA Corporation GP102GL [Tesla P40] (rev a1)
ppa リポジトリを更新したため、次にドライバをインストールするのが簡単になりました。
~$ ubuntu-drivers autoinstall
インストールが完了した後、再度再起動し、コマンドを実行するとグラフィックカード情報が表示されます。
~$ nvidia-smi
Wed Oct 25 16:55:35 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.23.06 ドライババージョン: 545.23.06 CUDAバージョン: 12.3 |
|-----------------------------------------+----------------------+----------------------+
| GPU名 Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| ファン 温度 パフォーマンス Pwr:Usage/Cap | メモリ使用量 | GPU-利用率 計算M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 Tesla P40 Off | 00000000:26:00.0 Off | Off |
| N/A 41C P8 12W / 250W | 0MiB / 24576MiB | 0% デフォルト |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| プロセス: |
| GPU GI CI PID タイプ プロセス名 GPUメモリ |
| ID ID 使用量 |
|=======================================================================================|
| 実行中のプロセスは見つかりませんでした |
+---------------------------------------------------------------------------------------+
この時、P40 グラフィックカードの右側に off という表示があり、これは Persistence-M モードに対応しています。このモードはデフォルトでオフになっており、Persistence モードを有効にすると GPU がタスクに迅速に応答できるようになりますが、待機時の消費電力が増加します。
GPU が計算に迅速に応答できるようにするには、有効にする必要があります。
~$ nvidia-smi -pm 1
GPU 00000000:26:00.0のためのPersistenceモードを有効にしました。
すべて完了しました。
~$ nvidia-smi
Wed Oct 25 16:55:35 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.23.06 ドライババージョン: 545.23.06 CUDAバージョン: 12.3 |
|-----------------------------------------+----------------------+----------------------+
| GPU名 Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| ファン 温度 パフォーマンス Pwr:Usage/Cap | メモリ使用量 | GPU-利用率 計算M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 Tesla P40 On | 00000000:26:00.0 Off | Off |
| N/A 41C P8 12W / 250W | 0MiB / 24576MiB | 0% デフォルト |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| プロセス: |
| GPU GI CI PID タイプ プロセス名 GPUメモリ |
| ID ID 使用量 |
|=======================================================================================|
| 実行中のプロセスは見つかりませんでした |
+---------------------------------------------------------------------------------------+
上部には CUDA バージョンも表示されており、ここに表示されているのは本機にインストール可能な CUDA バージョンであり、すでにインストールされているわけではありません。インストールされているかどうかを確認するには、/usr/local ディレクトリに cuda 関連のファイルがあるかどうかを確認すればよく、なければインストールされていないことを示します。
CUDA のインストール#
~$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
~$ dpkg -i cuda-keyring_1.1-1_all.deb
~$ apt-get update
~$ apt-get -y install cuda
インストールが完了すると、次のようなメッセージが表示されます。
*****************************************************************************
*** コンピュータを再起動し、NVIDIAグラフィックスドライバが ***
*** 読み込まれることを確認してください。 ***
*****************************************************************************
~$ cd /usr/local
~$ ls
bin cuda cuda-12 cuda-12.3 etc games include lib man sbin share src
これは、再起動することで CUDA を適用でき、/usr/local ディレクトリに cuda のディレクトリがあることを示しています。
急がず、再起動前に関連する設定を行います。
~$ vim ~/.bashrc
#以下の内容を追加し、バージョン番号に注意してください
export PATH=/usr/local/cuda-12.3/bin${PATH:+:${PATH}}
設定が完了したら再起動します。
前述の GF310 グラフィックカードが nvidia-smi に表示されない問題は、バージョンが古すぎて現在の nvidia-smi と互換性がないために認識できない可能性がありますが、点灯はできます。
正常なドライバが表示されないため、/dev ディレクトリにも関連するハードウェア情報がないため、依然としていくつかの問題が残っています。次のステップとして、gtx750ti に交換するか、外部グラフィックドックを使用して新しい nvidia-smi で認識できるグラフィックカードをブートカードとして使用することを検討しています。
これは後の話です。
stable-diffusion のデプロイ#
git clone https://github.com/AbdBarho/stable-diffusion-webui-docker.git
cd stable-diffusion-webui-docker
# dockerのグラフィック依存関係をインストール
apt install nvidia-docker2 nvidia-container-toolkit nvidia-container-runtime
# 依存パッケージをインストールし、Stable Diffusion v1.5のモデルを自動的にダウンロードします。
docker compose --profile download up --build
# コンテナを起動し、autoを選択してAUTOMATIC1111が開発したWebUIを起動します。
docker compose --profile auto up --build
起動が完了したら、http://ip:7860 で SD のウェブページにアクセスできます。デフォルトでは Stable Diffusion v1.5 モデルのみが利用可能です。
絵を描いてみる
プロンプト(ネットからの引用):
水辺にあるチューダー様式の家の美しいレンダリング、ファンタジーの森。フォトリアリスティック、シネマティックな構成、シネマティックな高詳細、ウルトラリアリスティック、シネマティックなライティング、被写界深度、ハイパー詳細、美しく色分けされた、8k、多くの詳細、キアロスクーロライティング、++夢のような、ビネット
実際に画像を生成するのに約 3-5 秒かかります。このグラフィックカードはまだ使えます。
画像生成の過程でグラフィックカードの変化を観察できます。
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.23.06 ドライババージョン: 545.23.06 CUDAバージョン: 12.3 |
|-----------------------------------------+----------------------+----------------------+
| GPU名 Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| ファン 温度 パフォーマンス Pwr:Usage/Cap | メモリ使用量 | GPU-利用率 計算M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 Tesla P40 On | 00000000:26:00.0 Off | Off |
| N/A 50C P0 54W / 250W | 210MiB / 24576MiB | 0% デフォルト |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| プロセス: |
| GPU GI CI PID タイプ プロセス名 GPUメモリ |
| ID ID 使用量 |
|=======================================================================================|
| 0 N/A N/A 32634 C python 208MiB |
+---------------------------------------------------------------------------------------+
何も変更せずに(パラメータなど)、簡単に行えます。
参考資料#
[1] Tesla P40 技術仕様
[2] Tesla P40 発表資料
[3] Tesla P40 と GTX 1080TI の比較
[4] Ubuntu オペレーティングシステムでのドライバインストールの正しい手順
[5] NVIDIA CUDA リスト