LoRAでオリジナルの画像を学習させたい準備編
完成形Stable Diffusion web UI上でLoRAでオリジナル画像を学習させる方法について紹介と補足をしたいと思います。Google Colabではなくローカル環境(自分のPC)で実行することを前提としています。
【Stable Diffusion】超簡単にLoRAを自作できる拡張機能「sd-webui-train-tools」の使い方!
すでにわかりやすいサイトがあり、この通りにやるのが簡単そうだとわかりました。しかし「sd-webui-train-tools」をインストールするまでいろいろハマりポイントがありました。
この手の操作では、自分が操作を正しく行なえているかの確認がとても重要で、気づかぬうちに間違ったことをして変なエラーを起こしてしまうものです。
この確認するという手順も含めて解説できたらとおもいます。
初期時点の環境
OS:Windows10GPU 1番目のPCIスロット:GTX 1650 (VRAM 4GB)
GPU 2番目のPCIスロット:RTX 2080Ti (VRAM 11GB)
Pythonバージョン:python 3.9.12(Anaconda)
使用Webブラウザ:Google Chrome (ver 116)
まずはサイト通りにやってみる
ひとまずこの3点が重要なようです- Python 3.10.6
- web UIのバージョンはコミット「a9fed7c364061ae6efb37f797b6b522cb3cf7aa2」
- xformers0.0.16以外のバージョン
- 「Stable Diffusion web UI」のデータが入ったフォルダを日本語(全角)や半角スペースが含まれるフォルダに保存する
- 「Stable Diffusion web UI」のデータが入ったフォルダを別の場所に移動して使う
やること1点目のPython 3.10.6については、すでに自分のパソコンにはAnacondaがインストールされていて、バージョンは3.9.12とやや古いものでした。
現在のPythonのバージョンの確認方法
コマンドプロンプトを開きます。画面一番左下のWindowsマークを左クリックしcmdと入力、Enter
その後でてきた画面で「Python」と打ち込みEnter
これでバージョンがわかりました。
3.10.6がほしいので
まずはAnaconda経由でPythonをアップデートしようと
conda install python=3.10.6
をコマンドプロンプトから実行しましたがこれが遅い遅い。solving environmentが永遠におわらないのですがタスクマネージャーをみるとプロセスは稼働しているようで、結局おわるのに一晩かかりました。
実際は待ちきれずに
https://www.python.org/downloads/release/python-3106/
ここからAnacondaじゃなく普通のPythonインストーラーをダウンロードしてインストールしました。
2点目コミット「a9fed7c364061ae6efb37f797b6b522cb3cf7aa2」は上記サイトにもあるよう
https://github.com/AUTOMATIC1111/stable-diffusion-webui/tree/a9fed7c364061ae6efb37f797b6b522cb3cf7aa2
からダウンロードすれば良いです。
ちなみに3点目のxformersのバージョンに関しては、特になにかする必要はありませんでした。
web UIのインストール
さてstable-diffusion-webui-a9fed7c364061ae6efb37f797b6b522cb3cf7aa2.zip
が手に入ったとおもうのでこれを解凍して中の
webui-user.bat
をメモ帳などで編集します。
このときwebui-user.batの中身は最初こうなっています。
Pythonのパスを記入
先程の「現在のPythonのバージョンの確認方法」ですでに3.10.6だった人や、Python3.10.6インストール後パスを通している人はここの記入は不要です。まずは
PYTHON=
のところに先程インストールしたPython 3.10.6のパスを入力する必要があります。
set PYTHON=C:\Users\9920x\AppData\Local\Programs\Python\Python310\python.exe
私の名前(9920x)は人によってかわるところです。
Python 3.10.6の場所(python.exe)がわからい人はEverythingなどのファイル検索ソフトで「python.exe」の名前を検索し、それっぽいところを見つけてください。
それらしいpython.exeをダブルクリック実行してPython 3.10.6と表示されればそれが3.10.6のpython.exeです。
--xformersを記入
おまじない--xformersをCOMMANDLINE_ARGS=のあとに記入します。set COMMANDLINE_ARGS=--xformers
この時点でNVIDIAのGPUじゃないとダメなので、AMDのGPUしかもってない方はここは記入しないで進むか、あきらめてください。AMDのGPUでは検証してません。
webui-user.batを実行
webui-user.batをダブルクリックして実行するとインストールが始まります。私の環境では
torch==1.13.1+cu117
のバージョンが勝手に選択されてインストールされてました。
しばらくするとエラーがでます。
cannot import name '_compare_version' from 'torchmetrics.utilities.imports'
このエラーがでたらこの記事のように対処します。ローカルでstable diffusion web uiを起動するまでの手順メモ
pip install torchmetrics==0.11.4
このコマンドをコマンドプロンプトに貼り付けて実行します。
ここで注意ですが、これを実行するときのカレントディレクトリが
(解凍したフォルダ)\venv\Scripts
でないと多分ダメです。
画像のように、解凍したフォルダを開いてvenv→Scriptsとフォルダを開いて、画面上部の矢印のところにcmdと入力してエンターを押すと、その開いてる場所がカレントディレクトリになってコマンドプロンプトが起動します。
この「開いてる場所」が間違ってるとダメなので画像を見ながらよく確認してください。
このフォルダ内にpip.exeが入っており、これをコマンドのpip installで起動してるんですね。
web UIのPythonが3.10.6か確認する方法
ついでに、web UIがちゃんとPython3.10.6でインストールされているかも確認できます。このフォルダ内に「pip3.10.exe」というファイルがある時点でなんとなく察しはつきますが、フォルダ内の「python.exe」を実行してください。
このようになっているはずです。ここが3.10.6以外だとweb UIがPython 3.10.6で動くことはないのでさきほどの手順をやり直してください。
(そもそもwebui-user.batを実行したときの2行目に書いてありますが)
webui-user.batを再度実行
torchmetricsのバージョンが解決したので再度webui-user.batを実行します。今度はなにやら3.97GBのデータのダウンロードが始まりました。
こういった重いデータは、そのサイズやファイル名はなんとなく覚えておいたほうがいいです。ダウンロードが途切れて後にエラーに遭遇した場合、ファイルサイズからダウンロードが100%できてなかったことに気づけることがあります。
web UIをインストールできた状態(起動した状態)
なんかごちゃごちゃ書いてありますが、「error」と書かれてなければエラーはでていません。これが正しくインストールし起動できた状態です。
127.0.0.1:7860 はブラウザに貼り付けるURLです。
私の場合はChromeを使いました。
ざっくりいうと127.0.0.1は自分自身へアクセスするという意味なので、これでweb UIの画面がでなければ少なくとも「起動」に失敗してるということがわかります。
起動できてるかはGPU-Zなどでも確認できます。
今回の場合、なぜか2番目のGPUのRTX2080Tiでちゃんと起動できてるようで、メモリが2.8GB消費されているのがわかります。起動できてなければ300-700MBくらいになっているはずです。
GPU-Zやタスクマネージャーでメモリ消費量を見れば、どのGPUで起動できているか、できてないかが一目でわかるのでおすすめです。
外付けGPUを使う場合でも、そもそもGPUを認識しているかの確認ができるのでよく使うソフトです。
sd-webui-train-toolsのインストール
【Stable Diffusion】超簡単にLoRAを自作できる拡張機能「sd-webui-train-tools」の使い方!引き続きこの記事の
「ローカル版の場合」
を参考に進めます。
「Extensions」→「Install from URL」の「URL for extension’s git repository」に下記URLを入力しInstallをクリックします。
https://github.com/liasece/sd-webui-train-tools
さて何が起こりましたか?
Loadingというちっちゃい文字がしばらく出たあと私はこうなりました。
stderr: ERROR: Could not install packages due to an OSError: [WinError 5] ANZX\u06c2\u0702B: 'z:\\sd\\venv\\lib\\site-packages\\google\\~rotobuf\\internal\\_api_implementation.cp310-win_amd64.pyd' Check the permissions. [notice] A new release of pip available: 22.2.1 -> 23.2.1 [notice] To update, run: Z:\sd\venv\Scripts\python.exe -m pip install --upgrade pip
コマンドプロンプトではERRORがでて、ブラウザ側はインストールに成功したような文字がでています。
とりあえずいわれた通りInstalledタブからrestartします。
しかし「Train Tools」タブはでてきません。
詰んだ・・・
webui-user.batから再起動
一旦コマンドプロンプトを消して、再度webui-user.batを起動したところなぜか現れていました。
とりあえずこれで先に進めそうです。
ファイルをドロップする
学習させたい画像ファイルを読み込ませます。さきほどのサイトの通りに進めていきますが、私がつまづいたので一応メモしておきます。
ファイルをドロップするのところにフォルダごとドロップしてはダメです。
ファイルを複数選択しドラッグドロップです。(web UIにも書いてあるのに間違えた)
もし間違えるとこのようなエラーがでます。
File "Z:\sd\venv\lib\site-packages\gradio\routes.py", line 337, in run_predict output = await app.get_blocks().process_api( File "Z:\sd\venv\lib\site-packages\gradio\blocks.py", line 1013, in process_api inputs = self.preprocess_data(fn_index, inputs, state) File "Z:\sd\venv\lib\site-packages\gradio\blocks.py", line 911, in preprocess_data processed_input.append(block.preprocess(inputs[i])) File "Z:\sd\venv\lib\site-packages\gradio\components.py", line 2360, in preprocess return [process_single_file(f) for f in x] File "Z:\sd\venv\lib\site-packages\gradio\components.py", line 2360, in <listcomp> return [process_single_file(f) for f in x] File "Z:\sd\venv\lib\site-packages\gradio\components.py", line 2334, in process_single_file file = processing_utils.decode_base64_to_file( File "Z:\sd\venv\lib\site-packages\gradio\processing_utils.py", line 276, in decode_base64_to_file data, extension = decode_base64_to_binary(encoding) File "Z:\sd\venv\lib\site-packages\gradio\processing_utils.py", line 263, in decode_base64_to_binary extension = get_extension(encoding) File "Z:\sd\venv\lib\site-packages\gradio\processing_utils.py", line 73, in get_extension encoding = encoding.replace("audio/wav", "audio/x-wav") AttributeError: 'NoneType' object has no attribute 'replace'
また、日本語ファイル名のものでも意外とエラーは起きなかったのですが念のため注意しておく必要があります。
deepbooruはなくBLIPを使う
アニメ絵や二次絵ならdeepbooruがいいようですが、今回リアルよりな風景を学習させたかったのでBLIPにチェックを入れました。ちなみに今回学習させる画像は1280x720と横長ですが、Preprocess imagesのWidthとHeightは512,512でやって特に問題なく動きました。(学習もまともにできていた印象でした)
次にUpdate Datasetを押します。
また855MBの重いデータがダウンロードされはじめました。
ここらへんも念のため目を光らせておきます。
ご丁寧にファイルの保存先が書いてあります。
TypeError: 'NoneType' object is not subscriptable
もしダウンロード中になんらかのトラブルがあって855MB全部ダウンロードできてないとこうなります。
Train Tools: dataset update error 'NoneType' object is not subscriptable Traceback (most recent call last): File "Z:\sd\extensions\sd-webui-train-tools\liasece_sd_webui_train_tools\dateset_ui.py", line 107, in on_ui_update_dataset_click preprocess.preprocess(None, origin_preload_data_path, processed_output_path, File "Z:\sd\extensions\sd-webui-train-tools\liasece_sd_webui_train_tools\tools\preprocess.py", line 17, in preprocess shared.interrogator.load() File "Z:\sd\modules\interrogate.py", line 123, in load self.blip_model = self.load_blip_model() File "Z:\sd\modules\interrogate.py", line 103, in load_blip_model blip_model = models.blip.blip_decoder(pretrained=files[0], image_size=blip_image_eval_size, vit='base', med_config=os.path.join(paths.paths["BLIP"], "configs", "med_config.json")) File "Z:\sd\repositories\BLIP\models\blip.py", line 175, in blip_decoder model,msg = load_checkpoint(model,pretrained) File "Z:\sd\repositories\BLIP\models\blip.py", line 224, in load_checkpoint state_dict = checkpoint['model'] TypeError: 'NoneType' object is not subscriptable
この場合283MBダウンロードしたところで止まってしまったようです。
再度ダウンロードすれば良いので一旦このファイルは消して、web UIを再起動しUpdate Datasetボタンを押すと今度はうまくいくはずです。
下の方の設定
Update Datasetが問題なく終了したら下のほうの設定にうつります。基本的にサイトと同じ設定で、アニメ絵を学習させるわけではないので
・Train base model
v1-5-pruned-emaonly.safetensors(最初からついてる)
・Clip skip
2
・Save every n epochs
5
・Batch size
1
・Number of epochs
5
・Learning rate
0.0001
・Net dim
128
・Alpha
64
・Optimizer type
Lion
・Mixed precision
fp16
としました。
なおUse xformersにチェックがデフォルトで入っていますが、これはwebui-user.batで--xformersを記入してないとこの先でエラーがおきます。
Traceback (most recent call last): File "Z:\sd\extensions\sd-webui-train-tools\liasece_sd_webui_train_tools\train_ui.py", line 127, in on_train_begin_click train.train(cfg) File "Z:\sd\extensions\sd-webui-train-tools\liasece_sd_webui_train_tools\train.py", line 37, in train train_network.train(args) File "Z:\sd\extensions\sd-webui-train-tools\liasece_sd_webui_train_tools\sd_scripts\train_network.py", line 171, in train train_util.replace_unet_modules(unet, args.mem_eff_attn, args.xformers) File "Z:\sd\extensions\sd-webui-train-tools\liasece_sd_webui_train_tools\sd_scripts\library\train_util.py", line 1865, in replace_unet_modules replace_unet_cross_attn_to_xformers() File "Z:\sd\extensions\sd-webui-train-tools\liasece_sd_webui_train_tools\sd_scripts\library\train_util.py", line 1913, in replace_unet_cross_attn_to_xformers raise ImportError("No xformers / xformersがインストールされていないようです") ImportError: No xformers / xformersがインストールされていないようです
設定が終わったら
「Begin Train」を押します。
コマンドプロンプトに大量の白い文字が流れていきますがerrorの文字が出てなければうまくいってます。
A matching Triton is not available, some optimizations will not be enabled.
Error caught was: No module named 'triton'
のエラーは出てしまいましたが、なぜか学習はうまく進んでいるようです。
調べると無視しても問題ないようなエラーらしく(ほんとか)、ここではGPU-Zでもながめておとなしくまちましょう。
Vram消費量10081MB、結構ギリです・・。GPU Loadをみると47%であり、そこそこの負荷で稼働しているのがわかります。のエラーは出てしまいましたが、なぜか学習はうまく進んでいるようです。
調べると無視しても問題ないようなエラーらしく(ほんとか)、ここではGPU-Zでもながめておとなしくまちましょう。
学習が終了するとsafetensorsファイルが生成されます。
(解凍フォルダ)\outputs\train_tools\projects\test0\versions\v1\trains\v1-5-pruned-emaonly-bs-1-ep-5-op-Lion-lr-0_0001-net-128-ap-64
このディレクトリに
test0-v1.safetensors
こんな名前のsafetensorsファイルができているのでこれを
(解凍フォルダ)\models\Lora
のフォルダ内にいれると、img2imgやtex2imgでsafetensorsファイルが読み込めるようになります。(使うにはゴミ箱ボタンの右のボタンを1回押す必要があります)
これですきな絵を学習させることができるようになりました!
おわりの雑談
今回私はゲームのステージの作成にAIを使おうとしており、今後うまく行ったらまた記事にしようと考えています。(参考)画像生成AIで絵柄が一貫した2Dゲームのステージを制作する
ここにたどり着くまでつまづきポイントが多くあり、エラー内容でググる人もいるとおもい、少しでも解決の糸口になればと今回記事にしました。
もとのサイトでもコメント欄がすごいことになってますしね
エラーが長い場合、エラーの先頭付近と最後付近の行に注目するとヒントが得られる場合があります。ググるときもそこらへんにアタリをつけて検索するといいと思います。
また検索時
Z:\sd\extensions\sd-webui-train-tools\liasece_sd_webui_train_tools\train_ui.pyみたいにパスを含めて検索することもあると思いますが、"Z:\sd\"までは個々の環境次第でかわってくる部分なので、そこは検索に含めないなど工夫をするとより精度のよい情報にたどり着けるかもしれません。
GoogleだけじゃなくてTwitter(X)でも有益な情報をつぶやいてる人がいるので、検索で使うのもいいとおもいます。
エラー内容から個人情報が抜かれることはあまりないとおもいますが、私の例では「9920x」の箇所のように、Windowsをセットアップするときにユーザー名をいれるところに本名をいれてしまった人は、パスの中にその本名がでてくるかもしれないので注意が必要です。
(ちなみに9920xはCPUの型番からとりました)
2023/9現在、まだこのような難しい手順をとっていく必要がありますが、この界隈は発展が速いので、そのうちもっと簡単にLora学習ができるようになると思います。
またAI学習に関してはNVIDIA GPUが他のベンダーより2歩3歩さきをいっている印象です。CUDAソフトウェアの資産は歴史が長くユーザーも多いことから一朝一夕にAMDやIntelが逆転できる状況ではないと考えています。
--xformersの指定も、Vram消費量を抑えたり高速化に寄与している点でほぼ必須です。これはNVIDIAのGPUでしか使えない機能のようです。
もしGPUをAI画像生成目的に購入しようと考えているなら間違いなくNVIDIA製GPU一択であり、求められるOSはWindows、次点でLinuxと考えます。
WindowsのノートPCしか持ってない方なら、外付けGPU Boxの選択肢もありです。実際私はAKiTiOの外付けGPU Box(約3万円)にRTX3080やRTX2080Tiを搭載してStable Diffusion web UIを動かすことに成功しています。ただノートPC側にThunderBolt対応USB-C端子がないとこれも無理な話ですが。