見出し画像

WSL2でFreeControlを試してみる

「あらゆる条件でテキストから画像への拡散モデルをトレーニング不要で空間制御」できるらしいFreeControlを試してみます。

使用するPCはドスパラさんの「GALLERIA UL9C-R49」。スペックは
・CPU: Intel® Core™ i9-13900HX Processor
・Mem: 64 GB
・GPU: NVIDIA® GeForce RTX™ 4090 Laptop GPU(16GB)
・GPU: NVIDIA® GeForce RTX™ 4090 (24GB)
・OS: Ubuntu22.04 on WSL2(Windows 11)
です。


1. 準備

python3 -m venv freecontrol
cd $_
source bin/activate

リポジトリをクローン。

git clone https://github.com/genforce/freecontrol.git
cd freecontrol

パッケージを・・・

requirements.txtがない! くじけません。envrionment.ymlから変換します。

envfile=./environment.yml
grep -n "pip:" ${envfile} \
	| cut -d":" -f1 \
	| xargs -I{} expr {} + 1 \
	| xargs -I{} tail -n +{} ${envfile} \
	| sed 's/^[[:space:]]*- //' \
	> requirements.txt

気を取り直して、パッケージのインストールです。

pip install -r requirements.txt

2. チェックポイントの作成

サンプルコードを使用して作成するか、OneDriveからダウンロードするか、を選べます。

えぇ、もちろん、作らないとですよね。

セマンティックベースを計算するサンプルコードが ./scripts ディレクトリに2つあります。
今回は、SD1.5を ./scripts/scripts/example_sample_cat_basis_1.5.sh で試します。

スクリプトの中身を確認

PROMPT="A photo of a cat, with a simple background, best quality, extremely detailed"
NEGATIVE_PROMPT="fewer digits, cropped, worst quality, low quality"
SD_VERSION="1.5"
MODEL_NAME="naive"
HEIGHT=512
WIDTH=512
SEED=2024
NUM_STEPS=200
OUTPUT_CLASS="cat"

python sample_semantic_bases.py --prompt "${PROMPT}" \
--negative_prompt "${NEGATIVE_PROMPT}" \
--sd_version ${SD_VERSION} \
--model_name ${MODEL_NAME} \
--height ${HEIGHT} \
--width ${WIDTH} \
--seed ${SEED} \
--num_steps ${NUM_STEPS} \
--output_class ${OUTPUT_CLASS} \
--num_images 20 \
--num_batch 1 \
--log \

実質的な処理は、カレントディレクトリにあるsample_semantic_bases.pyがになっていますね。

sample_semantic_bases.pyを見ると、config/base.yamlを設定のデフォルトとして、引数で渡された値で上書きし、チェックポイントを./dataset/basisディレクトリの下の方に生成するようです。

で、チェックポイントができあがると、gradio_app.pyの設定ファイルである./config/gradio_info.yamlに生成したチェックポイントのパスを書き込んでいます。

スクリプト実行

では、実行しましょう。

$ bash ./scripts/example_sample_cat_basis_1.5.sh
Loading pipeline components...: 100%|████████████████████████████████████████████████████████| 7/7 [00:04<00:00,  1.51it/s]
 60%|██████████████████████████████████████████████████▍                                 | 120/200 [03:00<02:00,  1.50s/it]
Updated gradio_info.yaml

60%で終了していますが、「Updated gradio_info.yaml」と出力されているので処理は最後まで正常に実行しているようです。(パラメータを調べれば良いのだろうけれども、いったん横に置きます)

生成されたチェックポイントは以下です。約120MBほどです。

$ find dataset/basis/ -type f -ls
157941782 117220 -rw-r--r--   1 user user 120029427 Feb 21 22:48 dataset/basis/1.5/naive/cat/step_200_sample_20_id_0/pca_info.pt
$

VRAM使用量は 19.9 GBです。

3. 試してみる

アプリ起動

python gradio_app.py

犬がかわいい。

先の手順で生成したチェックポイントを「Select Semantic Bases」欄で選びます。

えらぶ!

「Inversion Prompt to invert the condition image」という入力項目があります。ここには、「Input Condition Image」で指定した画像のプロンプトを入力します(なので、サンプルは A photo of a dogとなっている)。

この反転プロンプトに指定された文字列が変更されると、反転データの生成処理が動きます。

では、GPUカード別に、RUNボタンを押下した結果をまとめます。

RTX 4090 Laptop GPU(16GB)

・反転プロンプトによる反転データの生成時間 : 91秒
・生成プロンプトによる画像生成時間 : 65秒
・VRAM : 12.0 GB (13.1 - 1.0) ※1.0GBはDisplay表示で使用。

Loading pipeline components...: 100%|████████████████████████████████████████████████████████| 7/7 [00:01<00:00,  5.42it/s]
Image size:  (512, 512)
100%|████████████████████████████████████████████████████████████████████████████████████| 999/999 [01:30<00:00, 11.00it/s]
Inversion time 91.36453580856323
input_string: (dog; lion)
100%|████████████████████████████████████████████████████████████████████████████████████| 200/200 [01:05<00:00,  3.07it/s]

生成画像はこちら。

ライオン

RTX 4090 (24GB)

・反転プロンプトによる反転データの生成時間 : 78秒
・生成プロンプトによる画像生成時間 : 41 秒
・VRAM : 12.3 GB

Loading pipeline components...: 100%|████████████████████████████████████████████████████████| 7/7 [00:03<00:00,  2.05it/s]
Image size:  (512, 512)
100%|████████████████████████████████████████████████████████████████████████████████████| 999/999 [01:18<00:00, 12.80it/s]
Inversion time 78.16477966308594
input_string: (dog; lion)
100%|████████████████████████████████████████████████████████████████████████████████████| 200/200 [00:41<00:00,  4.79it/s]

生成された画像はこちら。

こちらもライオン

生成された反転データ

反転プロンプトの文字列単位にチェックポイントが生成され、保存されています。

$ find dataset/latent/ -type f -ls
157941789  36720 -rw-r--r--   1 user user 37599171 Feb 21 23:13 dataset/latent/DDIM/aa5026683160a5a5cdba9e5d47d2157b65976be4e3576198ebcda0e673fe95ca.pt
157941790  36720 -rw-r--r--   1 user user 37599171 Feb 21 23:25 dataset/latent/DDIM/0d162bf698af1b9effa3a897c3433317c0e44cf8f27bb01ce320f4499aa8b290.pt
$

ひとつファイルの中身を見てみましたが、以下のように入力したプロンプトが記録されていますね。

$ strings  dataset/latent/DDIM/aa5026683160a5a5cdba9e5d47d2157b65976be4e3576198ebcda0e673fe95ca.pt | grep dog
A photo of a dogq
$

プロンプトを書き換えるときの注意点

以下の条件に合致しないと、エラーとなって画像生成されませんでした。

  • 「Generation Prompt」欄に記載の文字のいずれかが、「Paired subject」欄の2つ目に記載されていることあること

  • 「Inversion Prompt」欄に記載の文字のいずれかが、「Paired subject」欄の1つ目に記載されていること

(dog, doraemon)

4. まとめ

チェックポイントの生成は、VRAM 16GBでは溢れます。24GBならば問題なしでした。

この記事が気に入ったらサポートをしてみませんか?