見出し画像

TensorRTで高解像度の画像を高速生成

TensorRTは64の倍数しか生成できない

とても重要なことですが、「TensorRTエンジンを使って作る画像は最終的な出力サイズが64で割り切れる数字でなければならない」という制約があります。
前回作成した画像は縦768px、横512pxでしたので問題ありませんでした。
この制約はとても重要で、アップスケーラーを使って高解像度化したときも、最終的に出来上がる画像がのサイズが64の倍数である必要があります。

高解像度用のプロファイルを作ってみる

デフォルトプロファイルは、縦横が最低512px、最大で768pxなので、それ以上のサイズをアップスケーラーを使って生成する場合は、TensorRTのプロファイルを新たに作らなければなりません。
では試しに、縦横が最大で1600pxの画像を生成するためのプロファイルを作成してみます。

TensorRTのメニューから1024x1024(Static)を選び、Advanced Settingsから「Use static shapes」のチェックを外します。
「Min height」を512px、「Min width」のスライダーを512pxにセットします。この値が生成画像サイズの下限値ですので、最低512pxの解像度にしておきます。
そして、「Max height」と「Max width」を1600pxにセットします。
「Optimal prompt token count」も、150では心もとないので450まで上げてみました。

1024x1024のプリセットを使う
縦横を最低512px、最大1600、最大プロンプトを450にセット

このサイズの画像を複数枚同時に作るにはVRAMがいくらあっても足りないので、バッチサイズは1のままです。
セットしたら「Export Engine」を押して作成開始です。

VRAMを16GB目一杯使っている…!

RTX A4000はVRAMを16GB搭載しているのですが、ほぼ上限まで使っています。
TensorRTの動作要件に「VRAM8GB以上のNVIDIA製GPU」と書いてありましたが、8GBでは厳しいのでは…?

エラーを出しつつもTensorRTエンジン作成は終了

またコンソール上ではエラーが出ていますが、TensorRTエンジンは作成できたようです。
webUI上でもプロファイルが2つになっています。

最低512px、最大1600px、プロンプトは450トークンまで

ウチの子を描いてみる

では試しにウチの子を描いてみまることにします。
まずは昨日と同じく512x768で描きます。

しまった表情を入れ忘れた…

描画時間は4秒でした。

アップスケーラーで高解像度にしてみる

ではアップスケーラーを使ってみます。
この環境は新しく作ったためESRGANに何も入っていないので、アップスケーラーは「Latent (nearest-exact)」を使ってみます。
パラメーターは下記の通りです。

高解像度でのステップ数0でいいのか…?

エラーが発生しました

なんだかエラーになってしまいました。
どうもプロファイルを読み込んでくれなかったようですね。

解像度は1600px以内のはずなんだけど…

出力はできましたが出力時間は43秒でした。
A4000はRTX30シリーズと同じくAmpereアーキテクチャなので、VRAM16GB積んでいるRTX30xxと捉えることもできますから速度的には普通だと思います。

43秒かかった、普通である

プロファイルを作り直してみる

実はこのエラーについて、Stable-Diffusion-WebUI-TensorRTのディスカッションで聞いた情報がありました。
スタティックプロファイルではなくダイナミックプロファイルだとうまくいく」というものです。

スタティックではバッチサイズは1で、要するに1枚ずつ生成するというプロファイルになります。
しかし、前回は4枚同時に生成したように、デフォルトプロファイルは最大768pxでバッチサイズ4になっています。
だから同じようにバッチサイズ4にして、画像サイズだけ大きくすればうまくいく、という理屈です。

バッチサイズ1-4になっているのがダイナミックプロファイル

さらに、出力サイズを決め打ちにしたほうがいいという情報もありましたので、今回は元の生成画像の幅に合わせて最低を512px、アップスケーリング後の縦サイズは1536px、幅は1152pxで合わせて作成することにします。

アップスケール後のサイズに合わせてみた

ダイナミックプロファイルにしたらエラーが消えた件

ダイナミックプロファイルを作ったらエラーが消えました
なぜだ。
よくわかりません!

赤い字で出ていたエラーが出なかった

気を取り直してもう一度生成してみます。
高解像度でのステップ数が0だったせいなのか、前回の画像はジャギーが目立ったため、今回はサンプリングステップ数の半分の15にしてみました。

今回の設定

今度は前回のようなエラーは出ませんでした。ちゃんとプロファイルを読み込んでくれたようです。
生成時間は19秒でした。
しかしながら、やはりジャギーが目立つ生成結果になりました。

画像が粗い

アップスケーラーを変えてみる

これはアップスケーラーの問題では?という気がしてきました。
そこでアップスケーラーを「R-ESRGAN 4x+ Anime6B」に変更してみます。
生成時間はやや延びて、22秒かかりました。

今度は綺麗になりました

今度は綺麗な生成画像になりました。
アップスケーラーって大事ですね!(笑)
上記の設定で10枚描いてみたところ、生成時間は4分42秒でした。

R-ESRGAN 4x+ Anime6Bで1024x1536を10枚生成するのに4分42秒かかった
ややメスガキっぽさが薄れたウチの子

「R-ESRGAN 4x+ Anime6B」は重いのであまり使わないのですが、TensorRTエンジンを使えば生成時間が速くなったので気にならないレベルでした。
アップスケーリングにもいろいろな技法があるらしいのですが、私はそちらには詳しくありません。

ちょっとプロファイルの作り方を考えなければいけないということがわかりました。
また、デフォルトエンジンを作る際に発生しているエラーも、どうもインストールしたパッケージのどれかがが新しすぎて、どこかが対応できていないような感じがします。
ひとまず、今回の検証はここまでにしたいと思います。

この記事が気に入ったらサポートをしてみませんか?