Macで簡単 AI画像生成 -SDXLを使う編-(未経験者向け)
まえがき
本記事は、未経験者向けにmacOSのアプリケーションソフトで簡単にAI画像を生成する方法の補足の解説です。SDXLが7月にリリースされて半年位経ちましたので(2024/01/02現在の)ml-stable-dffusionのSDXLモデルについて解説します。
2023年7月にSDXLが公開されました、ml-stable-dffusionでも直ぐ使えるようになりましたが、macOSでバージョン14以降、iPadOS, iOSでバージョン17以降が必要だったので、これらが正式にリリースされるまでは気軽に使えませんでした。(また、私は数ヶ月間は新しいOSを様子見するために記事が遅くなってしまいました🙇)なお、ml-stable-dffusionのSDXLは、ControlNetが使えません。ControlNetが必要な方はSD1.5, 2.1baseの対応モデルを使ってください。
SDXLの画像生成
Mochi Diffusionのインストール
Mochi Diffusionを使って説明します。まず、Mochi Diffusionの配布先のリンクから最新版をダウンロードします。ダウンロードされた.dmgファイルを開いて、Mochi Diffusionをアプリケーションフォルダにドラッグ&ドロップすればインストール完了です。(その他設定は、省略します。)
Core MLモデルのインストール
試しに、Core ML Models Communityから、SDXLのモデルで画像サイズがSD1.5と同じanimagine-xl−2.0_split-einsum_6bit_512x512.zipをダウンロードする場合で説明します。(animagine-xl−2.0はTextEncoderもチューニングされているので、簡単なpromptで私好みの画像生成が可能です😆)
開いたページにanimagine-xl−2.0_split-einsum_6bit_512x512.zipというファイルがありますので、この隣にある下矢印ボタン(下図の赤線円内)をクリックするとモデルがダウンロードされます。
.zipファイルがダウンロードされたら、ダブルクリックして解凍します。次に、解凍された「animagine-xl−2.0_split-einsum_6bit_512x512」フォルダをMochi DiffusionのModelsフォルダへ移動します。これでCoreMLモデルのインストールは完了です。
Mochi Diffusionでの画像生成
画像生成方法は以前と変わっていませんが、split-einsumのモデルの初回の読み込み時間がM2で約5分、M1では約10分かかるらしくSD1.5, 2.1baseに比べると非常に長くなっています。気長に待つようお願いします。2枚目からは高速になります。
もし、GPUを沢山搭載したMacであれば「ML Conmute Unit」の設定を「CPU&GPU」へ変更すれば、モデルの読み込み時間も速くなりますし、「CPU & Neural Engine」の設定よりも画像生成の速度が速くなるかもしれません。(私は相変わらずMacBook Air M2 8GRAM 8コアGPUを使っていますので、GPUが何個以上あればより速くなるのか分かっていません🙏)画像生成の速度ですが、MacBook Air M2 8GRAM 8コアGPUのNeural Engineを使うと512x512だとSD1.5とほぼ同じ速度で画像生成できます(15秒位?)1024x1024で1分強位です。(画像サイズが大きい方が綺麗に生成できるようです。)
SDXLではsplit-einsumモデルでNeural Engineを使って横長、縦長の画像生成ができるようになりました🎉 また、SD1.5, 2.1baseでは難しかった1024x1024サイズの画像生成も難なく可能です。モデルは従来通り画像サイズ別になります。
SDXLのCoreMLモデル変換方法
モデルの変換環境の構築
Macで簡単 AI画像生成 -Core MLモデル変換編-(未経験者向け)で説明したように変換用の環境を作りますが、もうPythonのバージョンは3.8でなくても大丈夫なようですので、以下のコマンドはPython3.10が使われるように変更しても大丈夫だと思います。
conda create -n coreml_stable_diffusion python=3.8 -y
↓3.10の場合は以下のコマンドを使う
conda create -n coreml_stable_diffusion python=3.10 -y
また、現時点(2024/01/02)だと、(私のMacBook Airだけかもしれませんが)fp16のCoreMLモデル変換はできますが、モデルのファイルサイズ削減やNeural Engineで画像生成するために必要なquantize処理でエラーがでると思います。私が問題なく変換できている、ソフトウエアの組み合わせを、HuggingFaceにアップロードしていますので、requirements20240102.txtをダウンロードして、omegaconfのインストールコマンドの後に、以下のコマンドを実行し、変換環境のバージョンダウンを実行してください。
pip install -r requirements20240102.txt
変換コマンドについて
SDXL向けの変換コマンドですが、1024x1024サイズの画像用モデルでquantize処理を6bitにする場合はquantize-nbitsオプションの指定を以下のようにします。(元のモデルはHugging FaceのLinaqruf/animagine-xl-2.0を使う場合です。)
私のMacBook Air M2 8GRAMでは、モデルの変換に2時間以上かかりますので、
寝る前に実行して寝るなど時間に余裕がある際に行うのがおすすめです。2024/04/07追加:SDXLモデルは、以下のようにORIGINALオプションを付けて変換すると、数十分で変換できて、かつNeura Engineを使った画像生成もできるようです。(Unetのファイルサイズ約2GBの壁はあります。)Neural Engineを使って画像生成する際には、画像生成時に"CPU & Neural Engine"へ設定を固定してください。(最近…Macbook買い換えまして、色々と試していたら気がつきました(^^;)
2024/04/09追加:MacOS Sonomaでは、SD1.5, 2.1baseのCPU & GPU向けモデル(ORIGNALオプションを付けて変換したモデル)でもNeural Engineを使って画像生成できるようになっており、ControlNetを使った画層生成もできるようです。
2024/04/24追加:どうも、SDXLのORIGNALモデルを使って"CPU & Neural Engine"の設定で画像生成すると、SPLIT_EINSUMモデルよりも倍くらいの時間がかかるようです。モデル変換時の時間が早いか、画像生成時の時間が早い方が良いかで使い分けたほうが良いようです。
python -m python_coreml_stable_diffusion.torch2coreml --convert-unet --convert-vae-encoder --convert-vae-decoder --convert-text-encoder --xl-version --model-version Linaqruf/animagine-xl-2.0 --bundle-resources-for-swift-cli -o ./animagine-xl−2.0_split-einsum_6bit_1024x1024 --latent-w 128 --latent-h 128 --quantize-nbits 6 (--attention-implementation ORIGINAL)
※ORIGINALオプションを使うかどうかは上記2024/04/24追加を見て判断してください。
また、Neural Engineを使って画像生成する場合はUnetのファイルサイズを約2GB以下にしないと、CPUのみを使った画像生成となって非常に時間がかかるので注意が必要です。このファイルサイズ上限がどのあたりにあるのかは、今の所不明ですがquantizeを8bitに指定するとUnetのファイルサイズは約2.5GBになり、このサイズではNeural Engineを使った画像生成はできませんでした。animagine-xl−2.0をMixed-Bit Palettization (MBP)の6.55bitで変換してみたところ、Unetのファイルサイズは2GBをわずかに超えますがNeural Engineを使った画像生成ができます。(MBPを使った変換方法は非常に面倒なので割愛します🙇)
注意:モデルの変換にはシステムディスクの空き容量が20G位?程必要だと思います。また色々とモデルを変換していると、すぐ「ディスクの空き容量が不足しています!」のエラーが出ます、以前はTimeMachineのAPFSスナップショットを疑っていましたが🤔どうも違うようです。このエラーが出た時は、Finderに表示されるディスクの空き容量より少し大きいフォルダやファイルをコピーして他のフォルダにペーストしてみてください、するとmacOS14では、容量が足りないというエラーダイアログが出ます、このエラーダイアログの選択ボタンをどちらでも良いので押して、ダイアログを閉じるとディスクの空き容量が増えるようです。
.safetensorsファイルからの変換
.safetensorsファイルからdiffusersフォルダを作るコマンドは、以下のような例になります。convert_original_stable_diffusion_to_diffusers.pyは最新のファイルを入手してください。(hakoniwaさんのHKXL v2.x hkxl_v2x.safetensorsから変換する例です。)
python ./convert_original_stable_diffusion_to_diffusers.py --checkpoint_path ./hkxl_v2x.safetensors --device cpu --extract_ema --dump_path ./hkxl_v2x_diffusers_model --from_safetensors --pipeline_class_name StableDiffusionXLPipeline
以上で説明はおわりです。
おまけ
2024/04/13追加:
・ベンチマークみたいなもの
SDXLのCoreML変換モデル(1024x1024)を使ってCPU & NeuralEngineで複数枚画像生成した際の1枚あたりの生成時間(モデルのロード時間は除く)
MacbookAir M2 8CoreCPU 8GPU 約90秒
MacbookPro M3Pro 11CoreCPU 14GPU 約60秒
順当に速くなっているようです😆
・画像生成時にNeural Engineを使っているか確認できるコマンドを紹介します。CoreMLモデルを変換する環境で、以下のコマンドを実行します。
pip install asitop
実行する場合は、管理者権限が必要なので以下のコマンドで起動して管理者パスワードを入力します。
sudo asitop
起動した後のイメージは開発者のGitHubを参照してみてください。
更新履歴
2024/04/07:SDXLモデルの変換時間短縮について追記・修正
2024/04/09:SD1.5モデルについて追記
2024/04/13:M2とM3Proの画像生成時間の比較について追加
2024/04/24:ORIGINALモデルの注意を追加