コンテンツへスキップ

MacStudio上でLoRAを動かしてみる

タグ:

せっかくMacStudioを買ったので、重い処理を実行してみるということで試してみました。

2023年だと苦労する部分は殆どなく、基本は記載されている通りに操作するだけとなります。

LoRAについて

LoRAは画像生成AIに追加学習をする事によって新たな画像を与える処理となります。使い方によりますが「ある人の画風を学習して、その画風を持った新しい絵を生成する」事が出来ます。これは絵に関わる人にとってはかなり驚異に感じられる事であり、今も様々な場所で話題となり議論されています。

物議を醸したものですが、ここでは技術として触れておこうというのもあります。

GitHubからスクリプトを取得

仕組み自体はすでにスクリプトを構築された方がいますので、それをそのまま使用します。

# 適当なフォルダに git clone します。
git clone https://github.com/bmaltais/kohya_ss.git
cd kohya_ss

# 新しいPython環境を構築します。
conda create -n pyenv310_kohya_ss python=3.10
conda activate pyenv310_kohya_ss

プログラムは git clone してきただけでは動かす事が出来ず、モジュールを追加でインストールする必要があります。

作業としては pip install するだけなのですが、自分の手元にある環境だとリポジトリに収められている requirements_macos_arm64.txt が利用できませんでした。

ここでは1行1モジュール指定に書き換えます。

torch==2.0.0
torchvision==0.15.1 -f https://download.pytorch.org/whl/cpu/torch_stable.html
xformers
bitsandbytes==0.41.1
tensorflow-macos
tensorflow-metal
tensorboard==2.12.1
-r requirements.txt

書き換えた requirements_macos_arm64.txt を使って pip install を行います。

pip install -r requirements_macos_arm64.txt

accelerate の設定

M1やM2プロセッサ上で動かす場合はこの設定通りにしないとうまく動作しませんので、忘れずに設定しておきます。

accelerate config
-> This machine  
-> No distributed training     
-> No
-> No
-> no

学習データの配置方法

学習データは配置ルールが決まっています。

dataset
    train
        20_vvs 1girl
            ...(学習したい画像を512x512のサイズで20枚程度配置)
    reg
        1_1girl
            ...(元のモデルに含まれる 1girl の画像を50枚程度配置)

regデータ生成スクリプト

こんな感じで 1girl 画像の生成スクリプトを書きました。

from diffusers import StableDiffusionPipeline

model_id = "runwayml/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id)
pipe = pipe.to("mps")

for i in range(50):
    prompt = "1girl"
    image = pipe(prompt).images[0]  
    
    image.save("../../dataset_2/reg/1_1girl/1girl_{:02d}.png".format(i))

学習スクリプトの呼び出し

–pretrained_model_name_or_path は https://huggingface.co/runwayml/stable-diffusion-v1-5/tree/main からダウンロードします。

–max_train_epochs でepoch(学習)回数を設定します。

–sample_every_n_steps, –sample_sampler, –sample_prompts の三つを指定しておくと、進捗状況の確認をしつつその環境で生成が行えるかも確認出来ます。

accelerate launch --num_cpu_threads_per_process 4 train_network.py \
    --enable_bucket --bucket_no_upscale \
    --pretrained_model_name_or_path="./v1-5-pruned.ckpt" \
    --train_data_dir="../../dataset/train" \
    --reg_data_dir="../../dataset_2/reg" \
    --prior_loss_weight 1.0 --resolution 512 \
    --output_dir="./output" \
    --output_name mizunagi_vvs_lora \
    --train_batch_size 2 --learning_rate 1e-4 --max_train_epochs 10 \
    --seed 0 --save_model_as safetensors \
    --save_every_n_epochs 1 \
    --sample_every_n_steps 50 \
    --sample_sampler="k_euler_a" \
    --sample_prompts="./mzwork_prompts.txt" \
    --max_data_loader_n_workers 1 \
    --network_module networks.lora --network_dim 4 \
    --training_comment="activate by vvs 1girl" \
    --mixed_precision="no" --save_precision="float"

mzwork_prompt.txtの中身

vvs, 1girl
python gen_img_diffusers.py \
    --ckpt ./v1-5-pruned.ckpt \
    --n_iter 1 --scale 7.5 --steps 40 \
    --outdir ./outdir --W 512 --H 512 --sampler k_euler_a \
    --network_module networks.lora \
    --network_weights ./output/mzwork_vvs_lora.safetensors \
    --network_mul 1.0 --max_embeddings_multiples 3 --clip_skip 1 \
    --batch_size 1 --images_per_prompt 1 --interactive

生成に使用したプロンプト例

vvs, 1girl --n low quality, worst quality, bad anatomy, bad composition, poor, low effort --d 25000 --s 40

なんか微妙な感じ。