ジャコ Lab

プログラミング関連のメモ帳的ブログです

diffusers で Civitai の LoRA(.safetensors) を使ってみる

diffusers は Hugging Face のモジュールなので、
Hugging Face 上にあるモデルはモデルIDだけで簡単に扱うことができます。

Hugging Face にはなく Civitai にはあるようなモデルも多く存在しています。
この記事では Civitai にある LoRA を diffusers で使ってみることにします。

.safetensors とは

zako-lab929.hatenablog.com

zako-lab929.hatenablog.com

上記の記事(EasyNegative や LoRAを使ってみた)のときにも登場した拡張子です。
色々なモデルデータの形式らしいです。

前回はどうやって使ってたっけ?

pipe.load_textual_inversion(
    "embed/negative", 
    weight_name="EasyNegativeV2.safetensors", 
    token="EasyNegative"
)

pipeline.load_lora_weights(
    "ostris/super-cereal-sdxl-lora", 
    weight_name="cereal_box_sdxl_v1.safetensors"
)

こんな感じでしたね。

  • 第一引数: Hugging Face 上のモデルID
  • キーワード引数(weight_nane): Hugging Face 上のファイル名

Civitai のデータを diffusers で使う

Civitai の というよりは .safetensors の データを使うイメージです。

今回は、以下の LoRA を使うことにします。

civitai.com

お。ポケモンじゃん!と思いつつ、
こんな画風を簡単に出力できてしまっていいのか?とも思いつつ。。。
確実に色々な問題を抱えていそうな気がします。AI 怖い。

今回はサンプルとして使わせてもらいましょう。

手順

  1. パッケージをインストールする
  2. Google Colab インスタンス上に .safetensors を配置する
  3. パイプラインの準備をする
  4. Google Colab インスタンス上の .safetensors を load_lora_weights() でロードする
  5. パイプラインを実行する

ほとんど過去の記事と一緒なのでピックアップしながら記載していきます。

2. Google Colab インスタンス上に .safetensors を配置する

ダウンロードした .safetensors をアップロードします。

もしくは wget で取ってくる感じです

!wget -O lora.safetensors https://civitai.com/api/download/models/73529?type=Model&format=SafeTensor

パイプラインを準備する

ダウンロードページ の説明等を読むと以下のようなキーワードが読み取れました

  • トリガーワードが存在している (v3 では不要かもしれない)
  • AnyLoRA というモデルを使用している (これは LoRA ではない)
  • 重みは 0.5 か 0.6 を使用している
  • CLIP Skip 2 を使用している
from diffusers import StableDiffusionPipeline
import torch

# HuggingFace 上にある AnyLoRA モデルを使用する
pipe = StableDiffusionPipeline.from_pretrained("Lykon/AnyLoRA", torch_dtype=torch.float16).to("cuda")

# 実行環境上にある lora.safetensors を使用する
pipe.load_lora_weights(
    ".", 
    weight_name="lora.safetensors"
)
# LoRA パラメータで出力にどの程度影響を与えるかを制御する
pipe.fuse_lora(lora_scale=0.6)

# HuggingFace 上にある EasyNegative を使用する
pipe.load_textual_inversion(
    "embed/negative",
    weight_name="EasyNegativeV2.safetensors",
    token="EasyNegative"
)

パイプラインを実行する

あとはいつも通り、プロンプトを用意してパイプラインの実行です。
1つ違うとすれば num_hidden_layers=11 を付けています。
こちらの記事 を参考にしました。

image = pipe(
    prompt,
    negative_prompt="EasyNegative",
    generator=generator,
    width=768, height=512,
    num_hidden_layers=11, # CLIP skip 2
).images[0]

実行結果

使ったプロンプトは catelectric pokemon などです。
でんきタイプの猫を出力したかった感じです。

LoRA 無し

LoRA 有り

まとめ

でんきタイプが生成されたかどうかは置いといて、
意外と LoRA 無しでもキャラクターぽくなってますね。
LoRA を付けると雰囲気がよりポケモンっぽく。