【Stable Diffusion】ckptをDiffusersで読み込む

【Stable Diffusion】ckptをDiffusersで読み込む プログラミング

「Stable Diffusionでckptファイルをモデルとして利用したい」
「ckptをDiffusersで読み込めるモデルに変換したい」

このような場合には、この記事の内容が参考になります。
この記事では、ckptをDiffusersでモデルとして読み込む方法を解説しています。

本記事の内容

  • Diffusers用モデルへのckptの変換
  • 変換に必要なモノ
  • 変換方法
  • 変換したモデルの読み込み
  • 「No module named ‘pytorch_lightning’」が出る場合の対策

それでは、上記に沿って解説していきます。

Diffusers用モデルへのckptの変換

画像生成AIのStable Diffusionは、公開以降の勢いがスゴイです。
その勢いに伴って、ファインチューニングしたモデルが次々に公開されています。

例えば、Waifu Diffusionです。
Waifu Diffusionについては、次の記事で説明しています。

他には、ポケモンのキャラをファインチューニングしたSD Pokémon Diffusersがあります。

これらは、Diffusersがインストール済みであれば簡単に利用できます。
単純な場合には、モデル指定の値を変更するだけです。

そんな中、ckptファイルがモデルとして公開されていることがあります。
ただ、ckptファイルはDiffusersで簡単に読み込むことができません。

例えば、HentaiDiffusionではckptがモデルとして公開されています。

Diffusersで読み込むためには、ckptを変換する必要があります。
変換すれば、Diffusersでモデルとして読み込めます。

以上、Diffusers用モデルへのckptの変換を説明しました。
次は、変換に必要なモノを説明します。

変換に必要なモノ

ckptをDiffusers用モデルに変換するには、以下が必要です。

  • Diffusers
  • Transformers
  • OmegaConf
  • Diffusersソース一式(GitHub)
  • Stable Diffusionの設定ファイル(v1-inference.yaml)

それぞれを以下で説明します。

DiffusersとTransformers

Diffusersライブラリのインストールが必要です。
Diffusersについては、次の記事で解説しています。

上記記事では、Transformersのインストールについても説明しています。
Transformers自体の詳細は、次の記事で解説しています。

OmegaConf

設定ファイルの読み込みに必要となります。
ここで言う設定ファイルとは、YAML形式のファイルです。

次のコマンドでインストールできます。

pip install OmegaConf

Diffusersソース一式(GitHub)

変換用のスクリプトが必要になります。
そのスクリプトが、GitHub上のDiffusersプロジェクトに含まれています。

ソース一式は、以下のコマンドで取得します。

git clone https://github.com/huggingface/diffusers

Windowsの場合は、Git for Windowsをインストールしておきましょう。
Windowsでもgitコマンドが利用できます。

Stable Diffusionの設定ファイル(v1-inference.yaml)

v1-inference.yamlは、Stable Diffusionの設定ファイルになります。
以下のページからダウンロードできます。

stable-diffusion/v1-inference.yaml at main · CompVis/stable-diffusion · GitHub
https://github.com/CompVis/stable-diffusion/blob/main/configs/stable-diffusion/v1-inference.yaml

まとめ

最低限で必要なモノを説明してきました。
早い話、Stable Diffusionが動く環境が必要です。

それにプラスアルファで必要なモノがあるということですね。
この場合、すでにStable Diffusionが動いている環境をそのまま利用するかどうかとなります。

個人的には、分けておいた方がよいと思います。
変換用の仕組みは、別のPython仮想環境に設けることを推奨します。

以上、変換に必要なモノについて説明しました。
次は、変換方法を説明します。

変換方法

ckptをDiffusers用モデルに変換していきます。
まずは、ckptの取得からです。

今回は、Stable Diffusionの標準モデルであるckptをダウンロードします。
ckptは、以下のページからダウンロードできます。
https://huggingface.co/CompVis/stable-diffusion-v-1-4-original/tree/main

ここでは、「sd-v1-4.ckpt」を選択。
4GB以上あるので、ダウンロードに時間はかかります。

保存場所は、各自の都合の良い場所でOKです。

「diffusers」は、GitHubから取得したDiffusersソース一式です。
その付近に関係のあるディレクトリを作成しました。
今回は、「ckpt」と「model」を新規作成しています。

ダウンロードしたckptは、「ckpt」ディレクトリに保存しています。
あと、「v1-inference.yaml」(設定ファイル)は次の場所に設置しましょう。

「convert_original_stable_diffusion_to_diffusers.py」が、利用する変換用のスクリプトです。
このスクリプトと同じ階層に「v1-inference.yaml」を設置します。

ここまでの作業で準備は整いました。
では、「convert_original_stable_diffusion_to_diffusers.py」がある場所まで移動します。

ここで実行するのは、以下のコマンドです。
ckptのパスとモデルの出力を指定しています。

python .\convert_original_stable_diffusion_to_diffusers.py --checkpoint_path "..\..\ckpt\sd-v1-4.ckpt" --dump_path "..\..\model\sd"

上記を実行して、処理が進んだらラッキー!!
次のようなエラーが出たら、後述の対策をご覧ください。

ModuleNotFoundError: No module named 'pytorch_lightning'

処理が進んでラッキーな場合でも、しばらく待たされます。
指定したモデルの出力先に、ディレクトリが作成されている様子を確認できます。

..\..\model\sd
..\..\model\sd\vae
..\..\model\sd\vae
..\..\model\sd\text_encoder
..\..\model\sd\text_encoder
..\..\model\sd\tokenizer
..\..\model\sd\unet
..\..\model\sd\unet
..\..\model\sd\scheduler
..\..\model\sd\safety_checker
..\..\model\sd\safety_checker
..\..\model\sd\feature_extractor

処理が完了したら、確認しましょう。
最終的には、次のような構成になっています。

ここまでの作業により、ckptをDiffusers用モデルに変換できました。

以上、変換方法を説明しました。
次は、変換したモデルの読み込みを説明します。

変換したモデルの読み込み

基本的には、モデルに合わせた読み込みが必要となります。
今回の「sd-v1-4.ckpt」であれば、次のコードでモデル読み込みが可能です。

import torch
from diffusers import StableDiffusionPipeline
from torch import autocast

MODEL_PATH = "./model/sd"
DEVICE = "cuda"

pipe = StableDiffusionPipeline.from_pretrained(MODEL_PATH, torch_dtype=torch.float16)
pipe.to(DEVICE)

prompt = "a dog painted by Katsuhika Hokusai"

with autocast(DEVICE):
    image = pipe(prompt, guidance_scale=7.5)["sample"][0]
    image.save("test.png")

from_pretrained関数は、モデル名かモデルパスを設定します。
モデル名であれば、みなさんも普通に指定していることでしょう。

それと同じように、同じ位置にモデルパスを指定できるということです。
相対パスでも絶対パスでも、どちらでも問題ありません。

上記コードを実行した結果、次のような画像が作成されます。

結果は、問題ありません。

以上、変換したモデルの読み込みを説明しました。
最後は、「No module named ‘pytorch_lightning’」が出る場合の対策について説明します。

「No module named ‘pytorch_lightning’」が出る場合の対策

ckptによって、エラーが出る場合と出ない場合があります。
別のckptの場合は、エラーが出ずに処理を進めることができました。

しかし、「sd-v1-4.ckpt」の場合はPyTorch Lightningが必要ということです。
PyTorch Lightningのインストールは、次の記事で解説しています。

もしかしたら、他のckptの変換時にはまた別のエラーが出るかもしれません。
都度エラー内容を見て対策するしかないでしょうね。

以上、「No module named ‘pytorch_lightning’」が出る場合の対策を説明しました。

タイトルとURLをコピーしました