Real-ESRGAN の vkQueueSubmit failed -4
原因 : タイルがデカすぎる
某ソフトが先日のアップデートでDirectX12に対応するGPU全部で動くようになりました。
CUDAからDirectMLに移行したことで実現したそう。RadeonならGeForceより安く手に入ります。
前から嫌々使ってたわけだし ”これでとうとうGeForce卒業だ!” と思ったその矢先・・・
Windows7はDirectX12に対応していない という事実が発覚。
そのうえ作業機にしていた自作PCⅠがBIOS設定画面までしか進めなくなりました。\(^o^)/オワタ
以前から動きの怪しかったGTX960君が福岡県としては26年ぶりの厳寒 *1 に耐えきれず冬眠してしまった模様。
もちろんWindows7でも従来通りCUDAを使えば処理することはできます *2 が、
そもそもマシンが起動しないのではどうしようもありません。
しかし、自作PCⅠはWindows7永住が決まっているのでOSは変えられません(変えたくない)。
別のPCを組むことはできなくもない、けどOSがないので1万円以上の追加出費は避けられません。
そして瀕死(あるいは死亡)のGTX960君を降板させるならグラフィックボード代として2万円以上かかります。
さてどうしたものか・・・
そこで、同アップデートで追加対応した 「 Real-ESRGAN 」 なる超解像技術を使ってみることにしました。
こちらもTecoGANと同じく人工知能を用いるソフトウェアであるものの、
DirectMLではなくVulkanを用いているため、より古いグラフィックボードでも動作します。
我が家の dynabook WS754/M は Quadro K2100M を搭載しています。OSはWindows8.1。
DirectMLへの対応はOSがまずアウト、そしてK2100Mもどうか分からない *3 という悲しい構成ですが、
OSもグラボもVulkanには対応しているのでReal-ESRGANであれば動作します。
Real-ESRGANはGitHubでビルド済みのものが配布されており、コマンドプロンプトから操作できます。
GitHubのReadme.mdか、コマンドプロンプトから実行ファイルをポチッとすればマニュアルが読めます。
扱いは超絶簡単なので軽く遊んでみれば誰でも超解像技術者(?)になれるでしょう。
ところが・・・
「 vkQueueSubmit failed -4 」 という謎のメッセージが出てしまいます。
出力される画像ファイルは一面真っ黒。はてさてどうしたものでしょう。
検索してみたところ、このページを見つけました↓
「try smaller tile-size」とのこと。
タイルサイズというのはおそらく画像を分割する際の大きさのことでしょう。大きいほどVRAMが多く必要です。
Real-ESRGANの場合は指定しないと「auto」になります。ちなみにK2100MのVRAMは2GBしかありません。
最小サイズは「32」なので32を指定(-t 32)して実行したところ・・・
無事完了しました。ちなみに64に設定するとダメでした。
一方、タイルサイズを32にしたままであれば、より解像度の高い画像も処理できたため、
タイルサイズを抑えていればVRAM2GBでも割と動かせるようでした。
ちなみに、Real-ESRGANは標準で2プロセスの並列動作になっています。
画像が2枚以上あるフォルダをinputに指定して動作させると2枚ずつ処理されるのはこのためです。
引数-jでload:proc:save(読み込み・処理・保存)の並列数を変更できます。(デフォルトは1:2:2)
また、Real-ESRGANの動作中はマシンがかなり重くなり、普通のマウス操作さえカクつくようになります。
基本的に「処理を開始したマシンは動かせない」と考えるべきでしょう。
ここはちょっと加減してほしいところでありますが・・・。
で、画像を何枚かReal-ESRGANで処理してみましたが、実写はともかく漫画・アニメ系にはかなり良さそうでした。
手元の1000pxくらいの画像を何枚か加工してみましたが、非常にシャープで違和感もありません。
AviUtlで連番出力すればアニメも加工できそう。でもめんどくさいね・・・。
なお結局パソコンは買い換える模様。(デスクトップ時代の終わり)
■追記 at 2022,03,06 13:45
NVIDIA Optimus 対応のマシンではGPUが複数検出されますが、
いずれかのGPUを「GPU0」に固定したい場合はNVIDIAコントロールパネルのグローバル設定で
GPU0に固定したい方を選択しておくと良いようです。・・・たぶん。
また、リモートデスクトップ接続中はGPU0がGPU1に複製され、GPU1がGPU2になります。