ラベル 機械学習 の投稿を表示しています。 すべての投稿を表示
ラベル 機械学習 の投稿を表示しています。 すべての投稿を表示

2026年5月12日火曜日

LTX2 を M2 Pro Mac mini で動かす

LTX2 を M2 Pro Mac mini で動かす

概要

MLX 版があるのでそれを使って M2 Pro 上で動作させてみます

環境

  • M2 Pro mac mini (16GB)
  • macOS 26.4.1
  • LTX2-MLX c4f8c44
  • Python 3.12.13

インストール

  • git clone --depth=1 https://github.com/Acelogic/LTX-2-MLX.git
  • cd LTX-2-MLX
  • pyenv local 3.12.13
  • uv sync --all-groups

モデルダウンロード

  • uv run scripts/download_weights.py

注意事項

gemma3 はライセンスに同意する必要がある

  • https://huggingface.co/google/gemma-3-12b-it -> Acknowledge license
  • huggingface のアカウントが必要
  • エラーになった場合は一度 rm -rf weights/gemma-3-12b してから再度 uv run scripts/download_weights.py する

distilled は 43GB あるので動かない場合は distilled-fp8 27GB を変わりにダウンロードし使うこと

  • uv run scripts/download_weights.py 実行時に 3 - Custom - Choose individual weights を選択しダウンロードするモデルを個別に選択する

動画生成(通常)

uv run python scripts/generate.py "A realistic cat riding a skateboard on a street, smoothly moving forward, natural motion, full body visible, cinematic lighting, high detail, 4k, camera tracking shot, shallow depth of field" --height 512 --width 512

おそらくこれは M2 Pro mac mini ではエラーになります

動画生成(fp8版)

uv run python scripts/generate.py "A realistic cat riding a skateboard on a street, smoothly moving forward, natural motion, full body visible, cinematic lighting, high detail, 4k, camera tracking shot, shallow depth of field" --height 512 --width 512 --fp8

画像サイズを下げれば何とかこれでもいけるかもしれませんがおそらくこれも不可能です

動画生成(fp8版+低メモリ)

uv run python scripts/generate.py "A realistic cat riding a skateboard on a street" --height 64 --width 96 --fp8 --low-memory --frames 9

おそらくこれでないと M2 Pro mac mini のスペックでは無理かなと思います
画像サイズとプロンプトの長さ、フレーム数も下げています

動画生成(fp8版+低メモリ+fp16フラグ)

uv run python scripts/generate.py "A realistic cat riding a skateboard on a street" --height 64 --width 96 --fp8 --low-memory --frames 9 --fp16 --pipeline one-stage --cfg 5.0

トラブルシューティング

libc++abi: terminating due to uncaught exception of type std::runtime_error: [METAL] Command buffer execution failed: Impacting Interactivity (0000000e:kIOGPUCommandBufferCallbackErrorImpactingInteractivity)

基本的にはメモリ不足が原因です

There appear to be 1 leaked semaphore objects to clean up at shutdown

これもメモリ不足の場合はほとんどです

最後に

LTX2-MLX を M2 Pro mac mini で動かしてみました
何とか動きますが量子化済みのモデルでないと動かないのと生成する動画サイズもかなり小さく短いものでないと無理でした

本当にギリギリなのでもしかしたら環境によっては動かない可能性もあるのでご了承ください

参考サイト

2025年9月30日火曜日

LTX-Video の inference.py でメモリ使用量を抑えるテクニック

LTX-Video の inference.py でメモリ使用量を抑えるテクニック

概要

基本何もしないと30GBほどは消費します
VRAM の小さいマシンでも動作させるようにする方法を紹介します

環境

  • macOS 15.7
  • Python 3.10.12
  • LTX-Video (main revision: 53d263f31727a0021bf65e3e413d1cb139abb86b)

CPUオフロードをオンにする

  • source env/bin/activate
  • pip install accelerate
  • vim ltx_video/inference.py
     pipeline = LTXVideoPipeline(**submodel_dict)
     pipeline = pipeline.to(device)
+    pipeline.enable_attention_slicing()
+    pipeline.enable_model_cpu_offload()
     return pipeline

288 行目あたりに上記を追加します

distilled なモデルを使う

configs/ltxv-2b-0.9.8-distilled.yaml を使います

生成する動画の長さを短くする

  • num_frames を下げる (デフォルトは121)
  • frame_rate を下げる (デフォルトは30)

でデフォルトは4秒((121-1)/30)の動画になるのですがどちらかを下げて動画の長さを短くしてもメモリ消費量を抑えられます

入力する画像のサイズを小さくする

  • 512x512ではな384x384などにする
  • それでもダメなら256x256にする
  • SD-WebUI に合わせるなら896x1152から256x384に比率を抑えながら解像度を下げて入力画像にする

最後に

Windows なら更に xformers の対応や Q8-Kernels もできます

2025年9月26日金曜日

LTX-Video を M2 mac mini で動かしてみた

LTX-Video を M2 mac mini で動かしてみた

概要

LTX-Video は軽量な動画生成モデルです
今回は M2Pro mac mini 上で動かしてみました

環境

  • macOS 15.7
  • Python 3.10.12
  • LTX-Video (main revision: 53d263f31727a0021bf65e3e413d1cb139abb86b)

環境準備

  • git clone https://github.com/Lightricks/LTX-Video.git
  • cd LTX-Video
  • pyenv local 3.10.12
  • python -m venv env
  • source env/bin/activate
  • python -m pip install -e .\[inference\]
  • pip install av imageio 'imageio[ffmpeg]'

なぜか av と imageio がインストールされていなかったので手動でインストールしました

実行

今回使用するモデルは ltxv-2b-0.9.8-distilled になります
13b もありますが M2 Pro mac mini では動作しないと判断し軽量な 2b を使っています

入力の画像のサイズは 512x512 にしています

プロンプトは画像に合わせてどういう動画にしたいのかを入力する感じです

PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0 \
python inference.py \
--prompt "A cute domestic short-haired cat riding a skateboard quickly along the street, cinematic, smooth motion, highly detailed, realistic lighting" \
--conditioning_media_paths ./input.png \
--conditioning_start_frames 0 \
--height 512 \
--width 512 \
--num_frames 16 \
--pipeline_config configs/ltxv-2b-0.9.8-distilled.yaml

最初に各種モデルのダウンロードが開始されます
結構いろいろなモデルをダウンロードするので全体で40GBほどあるので注意してください

num_frames を大きくすれば動画の長さも長くなります
ただ消費するメモリと生成時間も長くなるので注意してください
上記で紹介している num_frames=6 で生成までにだいたい20分ほどかかりました
動画のサイズは1秒にも満たない長さです

消費メモリはスワップも含めて30GBほどです
CPUとGPUは70%ほどの使用量で推移していました

生成されたファイルは outputs/2025-09-26/video_output_0_a-cute-domestic-shorthaired-cat_171198_512x512x6_1.mp4 という感じで生成されます

生成する動画の長さ

num_frames / frame_rate オプションで決まります
inference.py だとデフォルトは num_frames=121、frame_rate=30 なので4秒の動画が生成されます

なので今回のサンプルコマンドだと 16/30 なので0.5秒の動画になります
なお num_frames は作成したフレーム数+1するほうがいいようです

ちなみに M2 Pro mac mini で生成した際にデフォルトの値でも生成できました
生成時間は20分ほどでした
使用するメモリやCPU/GPUは変わりませんでした (生成する動画の長さに応じて使用するリソースは変化しないのかも?)

4秒版の動画は今の通りです

ちなみに num_frames=241 にしたところ untimeError: Invalid buffer size: 9.16 GiB が発生したので M2 Pro mac mini では 8 秒の長さが限界かもしれません

追記: 画像のサイズを256x256にし動画のサイズも256x256にしたらnum_frames=241でも生成できました

pip freeze

念の為動作したバージョンをメモしておきます

av==15.1.0
certifi==2025.8.3
charset-normalizer==3.4.3
diffusers==0.35.1
einops==0.8.1
filelock==3.19.1
fsspec==2025.9.0
hf-xet==1.1.10
huggingface-hub==0.35.1
idna==3.10
imageio==2.37.0
imageio-ffmpeg==0.6.0
importlib_metadata==8.7.0
Jinja2==3.1.6
-e git+https://github.com/Lightricks/LTX-Video.git@53d263f31727a0021bf65e3e413d1cb139abb86b#egg=ltx_video
MarkupSafe==3.0.2
mpmath==1.3.0
networkx==3.4.2
numpy==2.2.6
packaging==25.0
pillow==11.3.0
psutil==7.1.0
PyYAML==6.0.3
regex==2025.9.18
requests==2.32.5
safetensors==0.6.2
sentencepiece==0.2.1
sympy==1.14.0
timm==1.0.20
tokenizers==0.21.4
torch==2.8.0
torchvision==0.23.0
tqdm==4.67.1
transformers==4.51.3
typing_extensions==4.15.0
urllib3==2.5.0
zipp==3.23.0

最後に

LTX-Video を M2 pro mac mini 上で動かしてみました
これまで Stable Video Diffusion を試してきましたがそれよりも精度や生成スピードなどいろいろな点が良かった気がします

今回は2bモデルを使いましたが13bモデルのほうが精度はいいはずなので機会があれば試してみたいです (ltxv-13b-0.9.8-distilled)

ちなみに種類としては

  • dev -> 高クオリティ、低スピード、VRAM大量消費
  • mix -> 中クオリティ、高スピード、VRAM中消費
  • distilled -> 低クオリティ、中スピード、VRAM低消費

という感じっぽいです

参考サイト

2025年9月25日木曜日

M2 Pro Mac mini で Stable Video Diffusion を動かす

M2 Pro Mac mini で Stable Video Diffusion を動かす

概要

過去に forge を使った方法を紹介しました
今回はモデルを Python スクリプトで直接動かし画像から動画を生成してみます

環境

  • macOS 15.6.1
  • Python 3.10.12
    • diffusers 0.35.1
    • torch 2.5.1

ライブラリインストール

  • pyenv local 3.10.12
  • python -m venv svd-env
  • source svd-env/bin/activate
  • pip install diffusers transformers accelerate

モデルダウンロード

  • git lfs install
  • git clone https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt svd-model

Python スクリプト

  • vim app.py
import torch
from diffusers import StableVideoDiffusionPipeline
from diffusers.utils import export_to_video, load_image

device = "mps" if torch.backends.mps.is_available() else "cpu"

pipe = StableVideoDiffusionPipeline.from_pretrained(
    "./svd-model", torch_dtype=torch.float16, variant="fp16"
)
pipe.to(device)
pipe.enable_model_cpu_offload()
pipe.unet.enable_forward_chunking()
pipe.enable_attention_slicing()

# Load the conditioning image
image = load_image("./input.png")
image = image.resize((256, 256))

# generator = torch.manual_seed(42)
# frames = pipe(image, decode_chunk_size=8, generator=generator, num_frames=4).frames[0]
frames = pipe(image, decode_chunk_size=8, num_frames=2).frames[0]

export_to_video(frames, "generated.mp4", fps=7)

動かすためのポイント

基本的にはそのままでは動かせんません
メモリが足りずに「RuntimeError: Invalid buffer size:」のエラーになります
なのでメモリを節約するための設定をいれる必要があります

pipe.enable_model_cpu_offload()
pipe.unet.enable_forward_chunking()
pipe.enable_attention_slicing()

更にもっともメモリを使用するのは num_frames でこれは生成する動画のフレーム数を指定します
SVD num_frames で指定したフレームを一度に生成するのこの値が大きければ大きいほど動画はスムーズになりますが逆に生成速度とメモリ消費量は大きくなります
デフォルトだと25が指定されていますが25では80GBほどVRAMを使うので到底動きません

最低が2以上で1を指定すると以下のエラーとなります

RuntimeError: Sizes of tensors must match except in dimension 2. Expected size 1 but got size 2 for tensor number 1 in the list.

一応サンプルコードの数値は自分が M2 Pro mac mini で試した感じ生成スピード/消費メモリ/画質のトレーズオフで一番良かった数値になります

また画像のサイズは動画の生成速度にはほぼ影響しませんでした

最後に

M2 Pro mac mini で SVD を動かしてみました
num_frames=2 でしか動かなかったので正直かなり厳しいです
1フレームずつ生成して結合する方法もあるらしいのですがその場合はかなり動きが不自然になる可能性があるのでそれも微妙かなと思います

GPU は問題なさそうですがやはりメモリが明らかに足りていない感じです

参考サイト

2025年6月18日水曜日

AudioCraft で MAGNeT を使って音楽生成してみた

AudioCraft で MAGNeT を使って音楽生成してみた

概要

過去に MusicGen を使いました
今回は MAGNeT を使ってみます

環境

  • macOS 15.5
  • AudioCraft
  • Python 3.9.23

インストール

過去の記事と同じです
Python のバージョンは 3.9 系の最新を使いました

  • pyenv install 3.9.23
  • git clone https://github.com/facebookresearch/audiocraft
  • cd audiocraft
  • pyenv local 3.9.17
  • pip install "torch==2.1.0"
  • pip install -r requirements.txt

MAGNeT を使って音楽生成

まずは MAGNeT 用の WebUI を起動します

  • python -m demos.magnet_app --share

起動したら http://127.0.0.1:7860 にアクセスします

以下のような画面が表示されたら Submit しましょう
デフォルトでプロンプトも入力されておりモデルも初回は自動でダウンロードしてくれます

あとは右ペインに生成された音楽をクリックすれば聞くことができます
デフォルトでは10秒分の音楽が生成されます

TypeError: argument of type ‘bool’ is not iterable

というエラーになる場合は以下を実行してください

  • pip install pydantic==2.10.6

が MPS サポートされていない

https://github.com/facebookresearch/audiocraft/issues/396

いずれサポートされれば Mac + AudioCraft + MAGNeT で音楽生成できるはずです# 最後に MAGNeT はまだ Apple Sillicon はサポートされていないようです
MusicGen は使えるのでしばらくは MusicGen を使うことになりそうです

モデルのパス

内部的に hf なので以下にあります

.cache/huggingface/hub/models--facebook--magnet-small-10secs 

参考サイト

2025年6月17日火曜日

M2 mac で ComfyUI を試してみる

M2 mac で ComfyUI を試してみる

概要

macOS クライアントアプリがあるのでそれを試してみました
画像を生成するところまで紹介します

環境

  • macOS 15.5
  • Comfyui 0.4.51,2505290u29zbcgf
  • Python 3.12.9

インストール

  • brew install comfyui

起動

アプリケーションの一覧に ComfyUI があるのでクリックしてインストールします
警告が出るので「開く」で OK です

起動すると設定画面になります
ちゃんと GPU バックエンドに Metal が選択できるようになっていました

各種設定をし起動すると uv で仮想環境を作成し各種ライブラリのインストールが始まります
その後 GUI が起動すれば OK です

Python は 3.12.9 が使われていました

画像を生成してみる

テンプレートがあるのでそれを使ってとりあえず画像を生成してみます
テンプレートの一覧から「画像」を選択します

初回はモデルのダウンロードが必要なのでダウンロードします
ComfyUI に最適化された Stable Diffusion のモデルを使います

モデルのダウンロードが完了すると以下のようなノードが線で繋がれたフローが表示されます
ComfyUI はこんな感じでノードごとを線でつなぎ画像生成までのフローを作成します
プロンプトやサンプラーなど Stable Diffusion WebUI でも定義する値が ComfyUI のノードとして定義されていることが確認できると思います

プロンプトの内容を変更してもいいですがとりあえずこの状態で「実行する」をクリックすると画像が生成できます
生成された画像は最後のノードとしてフローに追加されます

ComfyUI の場合今何を処理しているかがノードの経過として目視することができます
デフォルトのテンプレートはシード値が設定されているので同じような画像が毎回生成されます
ランダムに生成したい場合は「0」を設定しましょう

最後に

とりあえず M2 mac 上で ComfyUI を動作させてみました
基本的には Stable Diffusion WebUI で設定する値と同じ値を ComfyUI でも設定しますが ComfyUI では各項目をノードとして定義できるため管理がしやすくなります

またノードの種類もたくさんあり画像生成後に自動で保存したりフローの途中で外部の API をコールしたり自分でノード自体を定義することもできます

LoRA や ControlNet など画像の生成に関するノードもあらかじめノードライブラリに用意されておりかつカテゴライズもされているので探しやすいのも嬉しい点かなと思います

参考サイト

2025年6月11日水曜日

stable-diffusion-webui-forge で API を使ってテキストから画像を生成する方

stable-diffusion-webui-forge で API を使ってテキストから画像を生成する方

概要

stable-diffusion-webui-forge の REST API を使って画像を生成する方法を紹介します

環境

  • macOS 15.5
  • stable-diffusion-web-ui-forge f2.0.1v1.10.1-previous-664-gd557aef9

API の起動

  • ./webui.sh --force-upcast-attention --api

--api オプションを付与して起動します

API リクエストに必要なペイロードを生成できるようにする

https://github.com/huchenlei/sd-webui-api-payload-display をインストールします

これで画像を生成後にその画像を API で生成した際の JSON ペイロードが確認できるようになります

生成されるペイロードには拡張機能用のペイロードを含まれるので不要なものは削除して OK です

以下のサンプルではすべてのペイロードを表示しています

ライブラリインストール

  • pipenv install Pillow requests

テキストから画像生成

レスポンスの兼ね合いで Python などのプログラムから実行することをおすすめします
ペイロードは JSON 文字列なのでプロンプトなどに改行コードが含まれる場合は削除してください
また true/false/null は True/False/None に置き換えて Python の辞書として使えるようにしておきましょう

import base64
import io

import requests
from PIL import Image, PngImagePlugin

model_name = "AnythingXL_xl.safetensors"
payload = {
    "alwayson_scripts": {
        "ADetailer": {
            "args": [
                False,
                False,
                {
                    "ad_cfg_scale": 7,
                    "ad_checkpoint": "Use same checkpoint",
                    "ad_clip_skip": 1,
                    "ad_confidence": 0.3,
                    "ad_controlnet_guidance_end": 1,
                    "ad_controlnet_guidance_start": 0,
                    "ad_controlnet_model": "None",
                    "ad_controlnet_module": "None",
                    "ad_controlnet_weight": 1,
                    "ad_denoising_strength": 0.4,
                    "ad_dilate_erode": 4,
                    "ad_inpaint_height": 512,
                    "ad_inpaint_only_masked": True,
                    "ad_inpaint_only_masked_padding": 32,
                    "ad_inpaint_width": 512,
                    "ad_mask_blur": 4,
                    "ad_mask_filter_method": "Area",
                    "ad_mask_k": 0,
                    "ad_mask_max_ratio": 1,
                    "ad_mask_merge_invert": "None",
                    "ad_mask_min_ratio": 0,
                    "ad_model": "face_yolov8n.pt",
                    "ad_model_classes": "",
                    "ad_negative_prompt": "",
                    "ad_noise_multiplier": 1,
                    "ad_prompt": "",
                    "ad_restore_face": False,
                    "ad_sampler": "DPM++ 2M",
                    "ad_scheduler": "Use same scheduler",
                    "ad_steps": 28,
                    "ad_tab_enable": True,
                    "ad_use_cfg_scale": False,
                    "ad_use_checkpoint": False,
                    "ad_use_clip_skip": False,
                    "ad_use_inpaint_width_height": False,
                    "ad_use_noise_multiplier": False,
                    "ad_use_sampler": False,
                    "ad_use_steps": False,
                    "ad_use_vae": False,
                    "ad_vae": "Use same VAE",
                    "ad_x_offset": 0,
                    "ad_y_offset": 0,
                    "is_api": [],
                },
                {
                    "ad_cfg_scale": 7,
                    "ad_checkpoint": "Use same checkpoint",
                    "ad_clip_skip": 1,
                    "ad_confidence": 0.3,
                    "ad_controlnet_guidance_end": 1,
                    "ad_controlnet_guidance_start": 0,
                    "ad_controlnet_model": "None",
                    "ad_controlnet_module": "None",
                    "ad_controlnet_weight": 1,
                    "ad_denoising_strength": 0.4,
                    "ad_dilate_erode": 4,
                    "ad_inpaint_height": 512,
                    "ad_inpaint_only_masked": True,
                    "ad_inpaint_only_masked_padding": 32,
                    "ad_inpaint_width": 512,
                    "ad_mask_blur": 4,
                    "ad_mask_filter_method": "Area",
                    "ad_mask_k": 0,
                    "ad_mask_max_ratio": 1,
                    "ad_mask_merge_invert": "None",
                    "ad_mask_min_ratio": 0,
                    "ad_model": "None",
                    "ad_model_classes": "",
                    "ad_negative_prompt": "",
                    "ad_noise_multiplier": 1,
                    "ad_prompt": "",
                    "ad_restore_face": False,
                    "ad_sampler": "DPM++ 2M",
                    "ad_scheduler": "Use same scheduler",
                    "ad_steps": 28,
                    "ad_tab_enable": True,
                    "ad_use_cfg_scale": False,
                    "ad_use_checkpoint": False,
                    "ad_use_clip_skip": False,
                    "ad_use_inpaint_width_height": False,
                    "ad_use_noise_multiplier": False,
                    "ad_use_sampler": False,
                    "ad_use_steps": False,
                    "ad_use_vae": False,
                    "ad_vae": "Use same VAE",
                    "ad_x_offset": 0,
                    "ad_y_offset": 0,
                    "is_api": [],
                },
                {
                    "ad_cfg_scale": 7,
                    "ad_checkpoint": "Use same checkpoint",
                    "ad_clip_skip": 1,
                    "ad_confidence": 0.3,
                    "ad_controlnet_guidance_end": 1,
                    "ad_controlnet_guidance_start": 0,
                    "ad_controlnet_model": "None",
                    "ad_controlnet_module": "None",
                    "ad_controlnet_weight": 1,
                    "ad_denoising_strength": 0.4,
                    "ad_dilate_erode": 4,
                    "ad_inpaint_height": 512,
                    "ad_inpaint_only_masked": True,
                    "ad_inpaint_only_masked_padding": 32,
                    "ad_inpaint_width": 512,
                    "ad_mask_blur": 4,
                    "ad_mask_filter_method": "Area",
                    "ad_mask_k": 0,
                    "ad_mask_max_ratio": 1,
                    "ad_mask_merge_invert": "None",
                    "ad_mask_min_ratio": 0,
                    "ad_model": "None",
                    "ad_model_classes": "",
                    "ad_negative_prompt": "",
                    "ad_noise_multiplier": 1,
                    "ad_prompt": "",
                    "ad_restore_face": False,
                    "ad_sampler": "DPM++ 2M",
                    "ad_scheduler": "Use same scheduler",
                    "ad_steps": 28,
                    "ad_tab_enable": True,
                    "ad_use_cfg_scale": False,
                    "ad_use_checkpoint": False,
                    "ad_use_clip_skip": False,
                    "ad_use_inpaint_width_height": False,
                    "ad_use_noise_multiplier": False,
                    "ad_use_sampler": False,
                    "ad_use_steps": False,
                    "ad_use_vae": False,
                    "ad_vae": "Use same VAE",
                    "ad_x_offset": 0,
                    "ad_y_offset": 0,
                    "is_api": [],
                },
                {
                    "ad_cfg_scale": 7,
                    "ad_checkpoint": "Use same checkpoint",
                    "ad_clip_skip": 1,
                    "ad_confidence": 0.3,
                    "ad_controlnet_guidance_end": 1,
                    "ad_controlnet_guidance_start": 0,
                    "ad_controlnet_model": "None",
                    "ad_controlnet_module": "None",
                    "ad_controlnet_weight": 1,
                    "ad_denoising_strength": 0.4,
                    "ad_dilate_erode": 4,
                    "ad_inpaint_height": 512,
                    "ad_inpaint_only_masked": True,
                    "ad_inpaint_only_masked_padding": 32,
                    "ad_inpaint_width": 512,
                    "ad_mask_blur": 4,
                    "ad_mask_filter_method": "Area",
                    "ad_mask_k": 0,
                    "ad_mask_max_ratio": 1,
                    "ad_mask_merge_invert": "None",
                    "ad_mask_min_ratio": 0,
                    "ad_model": "None",
                    "ad_model_classes": "",
                    "ad_negative_prompt": "",
                    "ad_noise_multiplier": 1,
                    "ad_prompt": "",
                    "ad_restore_face": False,
                    "ad_sampler": "DPM++ 2M",
                    "ad_scheduler": "Use same scheduler",
                    "ad_steps": 28,
                    "ad_tab_enable": True,
                    "ad_use_cfg_scale": False,
                    "ad_use_checkpoint": False,
                    "ad_use_clip_skip": False,
                    "ad_use_inpaint_width_height": False,
                    "ad_use_noise_multiplier": False,
                    "ad_use_sampler": False,
                    "ad_use_steps": False,
                    "ad_use_vae": False,
                    "ad_vae": "Use same VAE",
                    "ad_x_offset": 0,
                    "ad_y_offset": 0,
                    "is_api": [],
                },
            ]
        },
        "API payload": {"args": []},
        "ControlNet": {
            "args": [
                {
                    "batch_image_dir": "",
                    "batch_input_gallery": None,
                    "batch_mask_dir": "",
                    "batch_mask_gallery": None,
                    "control_mode": "Balanced",
                    "enabled": False,
                    "generated_image": None,
                    "guidance_end": 1.0,
                    "guidance_start": 0.0,
                    "hr_option": "Both",
                    "image": None,
                    "image_fg": None,
                    "input_mode": "simple",
                    "mask_image": None,
                    "mask_image_fg": None,
                    "model": "None",
                    "module": "None",
                    "pixel_perfect": False,
                    "processor_res": -1,
                    "resize_mode": "Crop and Resize",
                    "save_detected_map": True,
                    "threshold_a": -1,
                    "threshold_b": -1,
                    "use_preview_as_input": False,
                    "weight": 1,
                },
                {
                    "batch_image_dir": "",
                    "batch_input_gallery": None,
                    "batch_mask_dir": "",
                    "batch_mask_gallery": None,
                    "control_mode": "Balanced",
                    "enabled": False,
                    "generated_image": None,
                    "guidance_end": 1.0,
                    "guidance_start": 0.0,
                    "hr_option": "Both",
                    "image": None,
                    "image_fg": None,
                    "input_mode": "simple",
                    "mask_image": None,
                    "mask_image_fg": None,
                    "model": "None",
                    "module": "None",
                    "pixel_perfect": False,
                    "processor_res": -1,
                    "resize_mode": "Crop and Resize",
                    "save_detected_map": True,
                    "threshold_a": -1,
                    "threshold_b": -1,
                    "use_preview_as_input": False,
                    "weight": 1,
                },
                {
                    "batch_image_dir": "",
                    "batch_input_gallery": None,
                    "batch_mask_dir": "",
                    "batch_mask_gallery": None,
                    "control_mode": "Balanced",
                    "enabled": False,
                    "generated_image": None,
                    "guidance_end": 1.0,
                    "guidance_start": 0.0,
                    "hr_option": "Both",
                    "image": None,
                    "image_fg": None,
                    "input_mode": "simple",
                    "mask_image": None,
                    "mask_image_fg": None,
                    "model": "None",
                    "module": "None",
                    "pixel_perfect": False,
                    "processor_res": -1,
                    "resize_mode": "Crop and Resize",
                    "save_detected_map": True,
                    "threshold_a": -1,
                    "threshold_b": -1,
                    "use_preview_as_input": False,
                    "weight": 1,
                },
            ]
        },
        "Dynamic Prompts v2.17.1": {
            "args": [
                True,
                False,
                1,
                False,
                False,
                False,
                1.1,
                1.5,
                100,
                0.7,
                False,
                False,
                True,
                False,
                False,
                0,
                "Gustavosta/MagicPrompt-Stable-Diffusion",
                "",
            ]
        },
        "DynamicThresholding (CFG-Fix) Integrated": {
            "args": [
                False,
                7,
                1,
                "Constant",
                0,
                "Constant",
                0,
                1,
                "enable",
                "MEAN",
                "AD",
                1,
            ]
        },
        "Extra options": {"args": []},
        "FreeU Integrated (SD 1.x, SD 2.x, SDXL)": {
            "args": [False, 1.01, 1.02, 0.99, 0.95, 0, 1]
        },
        "Kohya HRFix Integrated": {
            "args": [False, 3, 2, 0, 0.35, True, "bicubic", "bicubic"]
        },
        "LatentModifier Integrated": {
            "args": [
                False,
                0,
                "anisotropic",
                0,
                "reinhard",
                100,
                0,
                "subtract",
                0,
                0,
                "gaussian",
                "add",
                0,
                100,
                127,
                0,
                "hard_clamp",
                5,
                0,
                "None",
                "None",
            ]
        },
        "MultiDiffusion Integrated": {
            "args": [False, "MultiDiffusion", 768, 768, 64, 4]
        },
        "Never OOM Integrated": {"args": [False, False]},
        "PerturbedAttentionGuidance Integrated": {"args": [False, 3, 0, 0, 1]},
        "Refiner": {"args": [False, "", 0.8]},
        "Sampler": {"args": [20, "DPM++ 2M SDE", "Karras"]},
        "Seed": {"args": [-1, False, -1, 0, 0, 0]},
        "SelfAttentionGuidance Integrated (SD 1.x, SD 2.x, SDXL)": {
            "args": [False, 0.5, 2, 1]
        },
        "StyleAlign Integrated": {"args": [False, 1]},
    },
    "batch_size": 1,
    "cfg_scale": 5,
    "comments": {},
    "denoising_strength": 0.7,
    "disable_extra_networks": False,
    "distilled_cfg_scale": 3.5,
    "do_not_save_grid": False,
    "do_not_save_samples": False,
    "enable_hr": False,
    "height": 1152,
    "hr_additional_modules": ["Use same choices"],
    "hr_cfg": 5,
    "hr_distilled_cfg": 3.5,
    "hr_negative_prompt": "",
    "hr_prompt": "",
    "hr_resize_x": 0,
    "hr_resize_y": 0,
    "hr_scale": 2,
    "hr_second_pass_steps": 0,
    "hr_upscaler": "Latent",
    "n_iter": 1,
    "negative_prompt": "low quality, worst quality, lowres, blurry, jpeg artifacts, text, watermark, error, extra limbs, mutated hands, poorly drawn hands, bad anatomy, unrealistic eyes, cloned face, multiple heads, bad proportions, out of frame, heavy makeup",
    "override_settings": {
        "sd_model_checkpoint": model_name,
    },
    "override_settings_restore_afterwards": True,
    "prompt": "masterpiece, best quality, ultra-detailed, 8k, cinematic lighting,\nbeautiful japanese young women, 20age, fair skin, light makeup, realistic face,\nlooking at viewer,\nbrown short hair,\nsmile,\npark background,\nsleeveless blouse, flare skirt,",
    "restore_faces": False,
    "s_churn": 0,
    "s_min_uncond": 0,
    "s_noise": 1,
    "s_tmax": None,
    "s_tmin": 0,
    "sampler_name": "DPM++ 2M SDE",
    "scheduler": "Karras",
    "script_args": [],
    "script_name": None,
    "seed": 1752460840,
    "seed_enable_extras": True,
    "seed_resize_from_h": -1,
    "seed_resize_from_w": -1,
    "steps": 20,
    "styles": [],
    "subseed": 33927003,
    "subseed_strength": 0,
    "tiling": False,
    "width": 896,
}

url = "http://127.0.0.1:7860"
response = requests.post(url=f"{url}/sdapi/v1/txt2img", json=payload)

r = response.json()

for index, image_info in enumerate(r["images"]):
    image = Image.open(io.BytesIO(base64.b64decode(image_info.split(",", 1)[0])))

    png_payload = {"image": "data:image/png;base64," + image_info}
    response_png_info = requests.post(url=f"{url}/sdapi/v1/png-info", json=png_payload)

    pnginfo = PngImagePlugin.PngInfo()
    pnginfo.add_text("parameters", response_png_info.json().get("info"))
    image.save(f"output_{index}.png", pnginfo=pnginfo)

override_settings は指定しない場合 sd-webui 上で指定しているモデルが使われます
基本は指定することをおすすめします

レスポンスはバイト情報なのでそこから画像を生成します
API では stable-diffusion-webui 側に画像は自動で保存されません

ただわざわざ保存しないでも stable-diffusion-webui 側にはちゃんと保存されているのでそれを参照するのであればわざわざレスポンスを保存しないでも OK です

API リファレンス

http://localhost:7860/docs にアクセスすると確認できます

最後に

stable-diffusion-webui-forge の REST API を使って Python スクリプトから画像を生成してみました
プロンプト情報などもコードで管理できるようになるのでかなり便利です
cron など自動実行などを仕掛けておけば勝手ガチャしてくれるようになります

Python スクリプトや流れは複雑になりますが XYZ-plot や Hires Fix などもできるので仕上げまで全自動にすることも可能かなと思います

参考サイト