RTX3060から4080に変えたら速度〇倍?stablediffusion環境を再構築した話 (Pixiv Fanbox)
Content
こんにちは、スタジオ真榊です。今日はソフトでなくハードのお話で、グラボを23万円のRTX4080に変えたらどれくらい速度が変わるのか?というのを各種比較実験でご報告したいと思います。
今年1月下旬にRTX3060(VRAM12GB)を5万円超(当時の市場価格)で購入し、楽しく画像生成を続けてきたのですが、今回ひょんなことから上位機種RTX4080(同16GB)を中古で譲っていただけることになり、ガタが来ていたPCをまるごと入れ替えることになったという経緯です。
ことの始まりは12月初旬。とある信頼のおけるフォロワーさんから「RTX4090環境に切り替えた関係で、3ヶ月程度しか使っていないRTX4080が浮いている。中古で売るつもりだったのですが、10万円でいかがですか」というDMをいただいたことでした。
まあそうなりますわね。
ちなみに、「価格.com」によるとRTX4080搭載グラボの市場価格は記事執筆時点で最安18万円。
譲っていただいたモデルは平均22~23万円前後で取引されていました。(その後最安値は20万割り)
▲ https://kakaku.com/item/K0001492543/pricehistory/ よりスクショ引用
というわけで、無事届いたこちらのRTX4080。
そもそも推奨電源的にいま使っているPCでは正常動作しないはずなんですが、とりあえず動作確認してみよっかな・・・と思ったら、普通にデカすぎてケースに入りませんでした。(そりゃそうだ)
メモリ増設やM.2SSDおかわりでなんとかごまかしてきたものの、友人に4万円で組んでもらった中古ゲーミングPCでしたので、CPUがそもそも限界。選択肢として、
①RTX4080にちょうどいいグラボ抜きPCをBTOメーカーに配送してもらって自分で取り付ける(4080搭載BTOの4080抜きみたいなもの)
②RTX4080をはじめからBTOメーカーに持ち込んで、ちょうどいい構成に組んでもらう
③Yahooオクなどで個人から激安グラボなしPCを購入して適当に自作する
…というのが思いつくところです。当初は③を模索していて、実際注文の直前まで行ったのですが、BTOメーカー(PCsevenさん)に持ち込みでの見積もりを出したところ10万円ほどしか変わらなかったため、アフターケアやリスク、やりとりの面倒くささなどいろいろ考えた上で持ち込みにしました。ちなみにグラボ持ち込み料金は5000円とお高く「届いたあと自分で付けりゃいいじゃん」と悩んだんですが、もうワンストップで組んでもらえて動作確認もしてもらえる魅力に負けました…。
PCsevenさんにはRTX4080搭載モデルというものが当然いろいろとありまして、それの「4080抜き」の値段を見るとこんな感じ。
まあいろいろと松竹梅なポイントはあるのですが、今後しばらく買い換えをしたくないのでCPUは第14世代のCore i7、電源は850Wか1000W、メモリは64GBで足りなければ増設、ストレージはm.2SSDで4TB・・・というのが希望ライン。特にストレージは基本モデルに3980円足すだけで2TB→4TBにグレードアップしてもらえると聞いて、喜んで注文しました。
・最終的な構成
最終的な構成はこのように、Core i7-14700KF、RTX4080、メモリDDR5 32GBx2枚、SSD4TB (m.2)、電源850W(Gold認証)、水冷クーラーで、持ち込み4080を組み入れてくれて税込約33万円の見積もり。10万円で4080を入手しているので、しめて43万円のお買い物ということになります。同等品を新品で買うと50万~55万円くらいするので、まずまずかなと。ちなみにストレージ2は「なし」となっていますが、旧PCに増設していた2TBのm.2SSDに旧PCの中身をあらかた詰め込んで載せ替えました。(PC開いてマザーボードに差すだけなので誰にでもできます)
・水冷必須?
4080を買うことをこれまで想定していなかったので、熱量について調べていなかったんですが、ハイエンド機ともなると空冷だと冷やしきれないそうで、PCsevenの構成候補では水冷クーラーの中からしか選べませんでした。4080や4090といったハイエンドモデルの電源ケーブルには新規格の12VHPWRというコネクタが使われているのですが、このコネクタ、RTX4090で発熱・融解報告が相次いでいまして・・・そのあたりも自己責任で組まず、きちんとしたお店にお願いしたいなと思ったポイントでした。
メールで相談したところ、レスポンス早く見積もりを出していただけたため、数日程度で配送の段取りが整いました。お店が近かったため、配送ではなく休日に車で受け取りに行ったんですが、なんと梱包がデカすぎてトランクにも座席にも入らないというおもしろ現象が発生。平日に休みが取れたので、1日早く受け取りたかっただけなんですが、おとなしくプロの配送にお任せすればよかったです・・・。店員さんがその場で梱包を開封して、本体とその他の空箱に分けてくださったので事なきを得ました。
AIイラストのローカル生成用途で何を重視するかといえばグラボ性能であり、とりわけそのVRAM容量なわけですが、それに次いでストレージ容量です。今は本当にSSDが安いので、メインを4TB、そこに旧PCのために買った2TBを増設して実に快適になりました。chckpointやLoRA、生成イラストでどんどん嵩張っていくので、ストレージはあればあっただけ良いですね。
StableDiffusion環境を再構築
というわけで、せっかくPCを入れ替えたのでSDwebUIを入れなおすことにしました。ちょうどv1.7.0の正式版がお目見えしたところだったので、StabilityMatrixではなくGitとPythonから入れる方式で再構築。とりあえずxformersは適用していません。
この環境で生成したら、最初は普通に生成できていたんですが、いきなりブルースクリーンが出て焦りました。なじぇ!?
まさかグラボに異変でも…?と思いましたが、NVIDIAのドライバを入れていなかったことを思い出し(PCsevenさんが入れてくれてると思い込んでた)、更新したところ安定しました。びっくりした…。
そんなわけで、とりあえず新環境で生成ができるようになりました。
いつも必ず入れる拡張機能
では拡張を入れていきましょう。最初に日本語にローカライゼーションしてから、基本的に拡張機能一覧の上から順にどんどんインストールしていきます。
ja_JP Localization
日本語化。
sd-webui-depth-lib
Controlnetに放り込む用の手などの画像を簡単に作れる。個別記事参照。
Wildcards
ワイルドカード。ポーズや背景などのランダム生成に。個別記事参照。
d-webui-animatediff
今回のお楽しみ。連続した静止画を生成して動画が作れる機能。
sd-webui-prompt_history
プロンプト履歴が表示される。ちょっと前に戻したいときに便利
!After Detailer
生成範囲が小さく崩壊しやすい顔や手を描きなおしてくれる。個別記事参照。
TiledDiffusion with Tiled VAE
VRAMの手にあまる大きなサイズの画像も小分けにして生成できる。個別記事参照。
d-webui-controlnet
言わずと知れたControlnet。個別記事参照。
OpenPose Editor
CNで使うポーズ制御機能をさらに使いやすくしてくれる。個別記事参照。
Aspect Ratio selector
生成サイズをボタンで選べる地味にうれしい機能。個別記事参照。
System Info
生成速度などを確認できる。今回の比較用。
WD 1.4 Tagger
画像を放り込むと自動でタグを検出してくれる。LoRA作成のためによく使う。
Booru tag autocompletion
Danbooruプロンプトをオート補完してくれる。
Dynamic Prompts
プロンプトのランダム変化。個別記事参照。
ほかにも忘れているものがいくつかありそうですが(Eagle用拡張とか)、とりあえずこの構成で進めてみます。
生成速度を確かめてみよう
さて、肝心の画像生成性能はどう変わったかを確かめるため、xformersなどなしのプレーン状態で比較実験を行ってみましょう。
生成設定はこちら。
checkpoint:SDHK v4(852話さん提供モデル)
VAE:kl-f8-anime2 CLIP SKIP:2
PP 1girl,solo,sitting on chair,crossed legs,red glasses,(navy school uniform,navy serafuku:1.3),ponytail,short sleeves,navy pleated skirt, shiny skin,detailed black pantyhose, detailed feet,beautiful purple eyes,black hair,white ribbon,masterpiece,extremely detailed CG,official art,high resolusion
NP (worst quality, low quality:1.4), (greyscale, monochrome:1.0), text, title, logo, signature,(extra fingers, deformed hands, polydactyl:1.5)
サンプラー DPM++ 2M Karras
sampling steps 28
Width 512 Batch count 10
Height 768 Batch size 1
CFG Scale 7
Seed 1111111
比較するために、まずRTX3060環境の旧PCで生成するとこんな感じ。Xformers適用状態で、だいたい1枚に11秒掛かる感じでしょうか。
生成所要時間67.6秒 A: 2.83 GB, R: 3.58 GB, Sys: 5.7/12 GB (47.4%)
SDwebUI version: v1.7.0 • python: 3.10.6 • torch: 2.0.1+cu118 • xformers: 0.0.20 • gradio: 3.41.2
RTX4080だとどうなる?
今度はRTX4080環境でやってみます。生成設定は全く同じ。
こちらが実際の生成画面。
プレーン状態での生成結果はこんな感じ。
必要生成時間26.7秒 A: 3.11 GB, R: 3.60 GB, Sys: 5.0/15.9922 GB (31.0%)
Xformersなしでも、だいたい1枚2~3秒で生成できる速度が出ました。67秒掛かったRTX3060と比べると2倍以上の速さ。
ただ、さきほど紹介した各種拡張機能を入れてからだと
必要生成時間34.3秒 A: 4.54 GB, R: 4.66 GB, Sys: 6.0/15.9922 GB (37.7%)
までパフォーマンスダウンしてしまったんですよね。これはちょっと原因が特定できなかった。
拡張機能「SystemInfo」でベンチマークをやってみます。
【RTX4080環境】
ベンチマーク結果はこのような感じ。「パフォーマンス」は、共通のtxt2img設定でさまざまなバッチ サイズ (1、2、4、8 ...) での生成を行い、1秒あたりのステップ回数をスコア化したものです。例えば20it/sなら1秒間に20ステップ分処理できたという意味なので、生成時間と逆で「数字が大きい方が高性能」ということですね。
【RTX3060環境】
RTX3060だと「5.41 / 6.2 / 6.78it/s」だったのに対し、RTX4080だと「11.6 / 11.34 / 17.84it/s」という結果になりました。3060の方はXformersを適用しているのですが、それでも1秒5~7ステップくらいしか処理できない感じですね。
Xformersを入れてみる
拡張機能インストールによる謎のパフォーマンスダウンは気になりますが(WD14taggerがエラーを吐いていたのでとりあえず除去しました)、とりあえず今度はXformersで高速化を図ってみます。
webui-user.batを右クリック→「編集」でこのように変えるだけ。SDwebUIの下部に「xformers: 0.0.20」(記事執筆時点の最新ver.)となっていれば導入完了。(※StabilityMatrixを使っている方はLaunch画面の左上の歯車「⚙」からxformersにチェックしましょう)
生成結果はこちら。
【RTX3060環境】
必要生成時間67.6秒 A: 2.83 GB, R: 3.58 GB, Sys: 5.7/12 GB (47.4%)
【RTX4080・高速化せず】
必要生成時間34.3秒 A: 4.54 GB, R: 4.66 GB, Sys: 6.0/15.9922 GB (37.7%)
▶【RTX4080・Xformers適用】
必要生成時間19.6秒 A: 2.99 GB, R: 3.74 GB, Sys: 5.1/15.9922 GB (31.9%)
段違いの結果ですね!ベンチマークを見てみましょう。上段が導入前、下段が導入後です。「11.34it/s・16.08it/s・17.84it/s」だったのが「22.33it/s・25.14it/s・27.29it/s」と倍増近いスコアに上がっています。1秒に11~17ステップしか処理できなかったのが、Xformers導入により22~27ステップも処理できるようになったということですね。
opt-sdp-attention、--opt-sdp-no-mem-attentionを試す
今度はXformersとは別の高速化手法を試します。「--opt-sdp-attention」はVRAM消費量がxFormersよりも大きく、生成結果にランダム化が加わるかわりに、より高速な演算が可能になるオプション。xformersとは併用できず、もし「--xformers --opt-sdp-attention」と記入してもXformersしか有効化されないようです。
【RTX3060環境】
必要生成時間67.6秒 A: 2.83 GB, R: 3.58 GB, Sys: 5.7/12 GB (47.4%)
【高速化せず】
必要生成時間34.3秒 A: 4.54 GB, R: 4.66 GB, Sys: 6.0/15.9922 GB (37.7%)
【Xformers適用】
必要生成時間19.6秒 A: 2.99 GB, R: 3.74 GB, Sys: 5.1/15.9922 GB (31.9%)
▶【opt-sdp-attention適用】
必要生成時間20.6秒 A: 2.99 GB, R: 3.74 GB, Sys: 5.1/15.9922 GB (31.9%)
むしろ、この環境ではわずかにXformersよりパフォーマンスが落ちてしまいました。ベンチマーク(一番下の段)でも同様の結果が出ており、Xformersでよさそうな感じがしますね。「--opt-sdp-no-mem-attention」も試しましたが、さらにわずかにパフォーマンスダウンするようでした。
このように、RTX3060 vs.4080の比較結果は「だいたい3倍速ちょい」という結果となりました。グラボ比較実験といえばちもろぐさんですが、こちらでもおおむね同様の生成結果が出ていますね。4080が15.4秒、3060が44秒ですから、こちらもおよそ3倍の生成速度ということになります。(こちらは512x512サイズなのでミナちゃんテストより少し早い)
ただ、普段512サイズを大量にガチャすることってあまりないんですよね。私の場合は普段使用しているモデルで768x512サイズを高解像度補助で2倍にアップスケールすることが多いので、その普段使いの設定でトライしてみましょう。
高解像度補助(Hires)でテスト
今度の設定は以下の通り。
checkpoint:(普段使用しているアニメ系モデル)
VAE:kl-f8-anime2 CLIP SKIP:2
PP 1girl,solo,sitting on chair,crossed legs,red glasses,(navy school uniform,navy serafuku:1.3),ponytail,short sleeves,navy pleated skirt, shiny skin,detailed black pantyhose, detailed feet,beautiful purple eyes,black hair,white ribbon,masterpiece,extremely detailed CG,official art,high resolusion
NP (worst quality, low quality:1.4), (greyscale, monochrome:1.0), text, title, logo, signature,(extra fingers, deformed hands, polydactyl:1.5)
サンプラー DPM++ 2M Karras
Steps 28
Width 512 Batch count 10
Height 768 Batch size 1
Hires upscaler:4xAnimeSharp HiresSteps15、ノイズ除去強度0.4、サイズ2倍
CFG Scale 7
Seed 1111111
高解像度補助のステップ数は0にすると生成ステップ数と同じ設定(この場合28ステップ)になって時間がかかるし、ある程度以上やっても飽和してほぼ結果が変わらないので注意しましょう。
生成結果がこちら。
【Hiresあり・いつもの1512×1024px】※Hires使用、Xformers適用
必要生成時間1分30.9秒 A: 5.27 GB, R: 8.34 GB, Sys: 9.7/15.9922 GB (60.7%)
【さきほどの実験・768×512px】※Xformers適用
必要生成時間19.6秒 A: 2.99 GB, R: 3.74 GB, Sys: 5.1/15.9922 GB (31.9%)
そんなわけで、高解像度補助が入ると相当に生成時間とVRAM消費が増えることがわかります。ちなみに、同じ設定でRTX3060環境で生成すると、必要生成時間4分59.0秒 A: 5.27 GB, R: 8.34 GB, Sys: 10.5/12 GB (87.7%)と、やはり3倍超の時間がかかりました。
一応画像も載せておきます。こちらがHiresありで生成した「いつものモデル・いつもの設定」の10枚。(各1512×1024px)
ちなみに、RTX3060で生成したものはほぼ同じですが、比べるとわずかに細部が違います。どちらが高精度だったというものでもなく、おそらくXformers由来のランダマイズではないかと考えています。
ちなみに、これが最初のミナちゃんベンチマークの10枚です。高解像度補助なしだと物足りないですね。(768×512px)
img2imgアップスケールの最大サイズは?
さて、これまでは速度の話でしたが、img2imgでアップスケールする際、どこまで大きな画像を作れるかも試してみました。こちらの画像は1024x1536pxですので、これをアップスケールしてみます。
2倍(2048x3072px)
ぎりぎりRTX3060でも可能なサイズですが、VRAM16GBをあっさり割り、ばっちり共有GPUに漏れました。生成時間は割と大したことなく1分半程度。
経過時間1 min. 33.8 sec. A: 14.81 GB, R: 27.07 GB, Sys: 16.0/15.9922 GB (100.0%)
▲ぎゃあああああ
生成画像はこちら。
3倍(3072x4608px)
もうプログレスバーが出てきません。生成開始と同時にVRAM消費量は100%張り付きのまま、webUI全体がフリーズ状態に。完全に応答なくなったので放置してたところ、いつの間にか「OutOfMemoryError: CUDA out of memory」になっていました。画像サイズに基づくVRAM消費量はRTX3060と大差ないので、12GBが16GBになってもできることに大きな差はない(※画像生成サイズについては)ということですね。大きいサイズを作る場合は、これまで通りTile diffusion & VAEで小分けにやりましょう。
動画もスムーズに作れる?
これまで意図的にこのFANBOXで扱ってこなかったのが、AnimateDiffに代表される動画生成技術について。RTX3060だとやや非力なことや、さほど動画方面に興味関心が向かっていなかったことで、静止画の生成技術を優先して研究してきたのですが、せっかく4080環境にした以上挑戦しないわけにはいきません。
AnimateDiffをインストールし、「Motion module」(AnimateDiffで絵を動かすために必要なモデル)をダウンロード(ここではAnimateDiffの作者さんが配布されている「mm_sd_v15_v2.ckpt」をDLしました)。「stable-diffusion-webui/extensions/sd-webui-animatediff/model/」に配置したら、あとはSDwebUIの「設定▶Optimizations」欄にある「Pad prompt/negative prompt to be same length」にチェックを入れるだけです。
初めての動画がこちら。
ポニーテイルが二つあるとか、細部の破綻はお許しください。動画生成は静止画をたくさん生成して動かす仕組み上、野放図にt2i生成してもほぼ思ったような動画はできあがりません。「動かし方」のモデルとなる動作をControlnet指定するなど、それなりに習熟が必要ですし、一枚絵に比べて戦わないといけない破綻が無数に現れます。
生成時間でいうと、1024x1024サイズの4秒動画(計36枚の画像のパラパラ漫画)がRTX4080環境では3-4分ほどで生成できました。ただ、Controlnetを使うなどするとVRAM量がかなり圧迫され、途中でエラーになることも少なくなかったです。ComfyUIのほうが動画生成に向いているとよく聞きますので、門外漢ながら、本格的に動画を触る方はSDwebUIにこだわらない方がよいのかなと思います。
終わりに
そんなわけで、「RTX3060から4080に変えたら速度〇倍?stablediffusion環境を再構築した話」でした。言わずもがなではありますが、速度が速いからといって作れるイラストの質が向上するわけでは全くないので、宝の持ち腐れにしないようにしたいですね。
動画生成はとても面白そうなのですが、偶然性がどうしても生じてしまうのがあまり好みではなく、AnimateAnyoneのように想定した通りに動作させられるような技術が一般化してきたらぜひまた触れてみたいなと思っています。