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

【Stable Diffusion】safetensorsをDiffusersで読み込む ツール

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

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

本記事の内容

  • Diffusers用モデルへのsafetensorsの変換
  • safetensorsの変換に必要なシステム要件
  • safetensorsの変換方法
  • safetensorsから変換したモデルの読み込み

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

Diffusers用モデルへのsafetensorsの変換

画像生成AIのStable Diffusionは、まだまだその勢いが止まりません。
そして、技術的にもどんどんと新しいモノが取り入れられています。

その一つにsafetensorsがあります。
ckptとともに、次のようなファイルを見たことがありませんか?

次のページから確認できます。

stabilityai/stable-diffusion-2-base at main
https://huggingface.co/stabilityai/stable-diffusion-2-base/tree/main

簡単に言うと、新しいファイル形式です。
Stable Diffusionの世界では、その形式でモデルを配布する方向になりつつあります。

safetensorsの詳細については、次の記事で解説しています。

このsafetensorsの登場で、面倒なことが生じています。
そもそも、Diffusers利用者にとってはckptファイル自体が面倒な存在です。
さらにそこへ、safetensorsファイルが登場してきています。

上記で載せたStable Diffusion v2-baseなどは、そんなことは関係なく利用できます。
次の文字列をモデルに指定すれば、いいだけです。

stabilityai/stable-diffusion-2-base

そうすれば、あとはDiffusersがHugging Faceから必要なファイルを勝手にダウンロードしてくれます。
しかし、Diffusers対応していないモデルなどは自分で変換する必要があります。

ckptファイルしか配布されていないようなモデルですね。
例えば、人体の描画に特化したF222などがその形になります。

ckptファイルを変換する方法については、次の記事で解説しています。

これだけでも、ちょっとした手間でした。
そこに、safetensorsファイルも割り込んできたということです。

それも、現状ではckptファイルの変換と同じ手法が通じません。
というか、Diffusers公式からはその方法が公開されていないようです。

少なくとも、公式のGitHub上では見つかりません。
将来的には公開されるとは思いますが、それがいつになるかはわかりません。

そんな状況において、有志で変換スクリプトを公開してくれている人がいます。

Stable Diffusion checkpointとDiffusersモデルの相互変換スクリプト(SD2.0対応)
https://note.com/kohya_ss/n/n374f316fe4ad

本当にこういう活動は、ありがたいですね。

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

safetensorsの変換に必要なモノ

基本的には、次の記事に記載した通りです。

とりあえず、上記記事を参考にしてckptファイルの変換までができる状態にします。
インストールするモノは、その時点での最新版にしておきましょう。

では、今回のメインとなるスクリプトをダウンロードします。
先ほど紹介したページから、ダウンロードできます。

ダウンロードしたzipを解凍。

これらのファイルを変換用スクリプトの設置場所に保存します。

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

safetensorsの変換方法

ダウンロードしたスクリプトは、以下の変換が可能です。

  • checkpoint→Diffusersモデル
  • Diffusersモデル→checkpoint

ここでは、「checkpoint→Diffusersモデル」のみ取り上げます。
また、Stable Diffusionのバージョンについては1系、2系の両方ともに対応しています。

詳細については、紹介したページをご覧ください。
もしくは、ヘルプを確認しましょう。

> python convert_diffusers20_original_sd.py -h 
usage: convert_diffusers20_original_sd.py [-h] [--v1] [--v2] [--fp16] [--bf16] [--float] [--epoch EPOCH] [--global_step GLOBAL_STEP] [--reference_model REFERENCE_MODEL]
                                          [--use_safetensors]
                                          model_to_load model_to_save
  --v1                  load v1.x model (v1 or v2 is required to load checkpoint) / 1.xのモデルを読み込む
  --v2                  load v2.0 model (v1 or v2 is required to load checkpoint) / 2.0のモデルを読み込む
  --fp16                load as fp16 (Diffusers only) and save as fp16 (checkpoint only) / fp16形式で読み込み(Diffusers形式のみ対応)、保存する(checkpointのみ対応)
  --bf16                save as bf16 (checkpoint only) / bf16形式で保存する(checkpointのみ対応)
  --float               save as float (checkpoint only) / float(float32)形式で保存する(checkpointのみ対応)
  --epoch EPOCH         epoch to write to checkpoint / checkpointに記録するepoch数の値
  --global_step GLOBAL_STEP
                        global_step to write to checkpoint / checkpointに記録するglobal_stepの値
  --reference_model REFERENCE_MODEL
                        reference model for schduler/tokenizer, required in saving Diffusers, copy schduler/tokenizer from this /
                        scheduler/tokenizerのコピー元のDiffusersモデル、Diffusers形式で保存するときに必要
  --use_safetensors     use safetensors format to save Diffusers model (checkpoint depends on the file extension) / Duffusersモデルをsafetensors形式で保存する(checkpointは拡張子で自動 判定)

では、実際に変換してみましょう。
次の記事で取り上げたモデルが対象として利用できます。

もともとDiffusersモデルは、存在しています。
さらには、checkpoint(ckpt・safetensors両方)も公開されています。

prompthero/openjourney at main
https://huggingface.co/prompthero/openjourney/tree/main

「mdjrny-v4.safetensors」をダウンロードして、「ckpt」ディレクトリに保存。
Diffusersモデルを保存するために「model」ディレクトリも用意しておきます。

スクリプトのある場所で次のコマンドを実行します。

python convert_diffusers20_original_sd.py ..\..\ckpt\mdjrny-v4.safetensors  ..\..\model\mdjrny-v48  --v1 --reference_model runwayml/stable-diffusion-v1-5

Midjourney v4 Diffusionは、SD 1系をベースにしています。
そのため、次の指定となります。

--v1 --reference_model runwayml/stable-diffusion-v1-5

なお、「v1」を指定する場合は、以下のどちらでもOKのようです。

  • runwayml/stable-diffusion-v1-5
  • CompVis/stable-diffusion-v1-4

すでにダウンロード済みの方を選んでおけばよいでしょう。

では、コマンドを実行してみましょう。
処理はすぐに完了します。

~
loading text encoder: <All keys matched successfully>
converting and saving as Diffusers: ..\..\model\mdjrny-v48
copy scheduler/tokenizer config from: runwayml/stable-diffusion-v1-5
model saved.

指定した場所に、モデルが保存されていることを確認できます。

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

safetensorsから変換したモデルの読み込み

モデルは、パスを指定することで呼び出せます。

from diffusers import StableDiffusionPipeline
import torch

MODEL_ID = "model/mdjrny-v48"
DEVICE = "cuda"

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

prompt = "mdjrny-v4 style,a photo of an astronaut riding a horse on mars"
image = pipe(prompt, width=512, height=512).images[0]

image.save("astronaut_rides_horse.png")

なお、1つ注意点があります。
サイズ未指定だと、256 x 256で画像が生成されます。

そのため、サイズをデフォルトとされている512 x 512で設定しています。
コードを実行した結果は、次のような画像が生成されます。

Midjourney的な画像が生成されています。

以上、safetensorsから変換したモデルの読み込みを説明しました。

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