当環境でもStable-diffusion3.5 mediumを使って画像生成を行うことができましたので、RTX4060向けの微調整の経過を残します。
初期状態だと一枚生成するのに40分くらいかかりますが、微調整を行うことで、総生成時間が1分程度まで短縮できました。
環境
OS Windows11Home
CPU intel Core i7 14700
GPU NVIDIA GeForce RTX 4060(VRAM8GB)
※ドライバ v576.28、CUDA v12.9
Python 3.11.1
使用したモデル
Stable-diffusion-3.5-medium
パラメータ数 26億
推奨VRAM 9.9GB
ダウンロード先 https://huggingface.co/stabilityai/stable-diffusion-3.5-medium
サンプルを実行してみる
公式サイトから実行方法を確認したところ、次のコマンドで実行できるとのこと。
モデルは先行してダウンロード済みです
参照 ローカルLLMで画像生成(RTX4060使用) | タンス
# sd_standard.py
# 公式サンプルに実行時間を計測できるように修正したものです
import torch
import time
from diffusers import StableDiffusion3Pipeline
# 処理時間計測開始
start = time.time()
# ダウンロード先のモデルを指定
pipe = StableDiffusion3Pipeline.from_pretrained("./stable-diffusion-35-medium", torch_dtype=torch.bfloat16)
pipe = pipe.to("cuda")
image = pipe(
"A capybara holding a sign that reads Hello World",
num_inference_steps=40,
guidance_scale=4.5,
).images[0]
image.save("capybara.png")
end = time.time()
delta = f"{end - start:3f}"
print(f"処理時間: {delta} 秒")
# コマンドプロンプト
c:\ > cd {実行フォルダ}
c:\{実行フォルダ} > pip install -U diffusers
c:\{実行フォルダ} > python sd_standard.py
Loading checkpoint shards: 100%|█████████████| 2/2 [00:25<00:00, 12.62s/it]
Loading pipeline components...: 100%|███████████| 9/9 [00:32<00:00, 3.61s/it]
Loading pipeline components...: 100%|███████████| 40/40 [36:51<00:00, 55.30s/it]
処理時間: 2317.135271 秒
画像は生成できましたが、生成に36分もかかっています。

生成した画像がこちら、「HELLO WORLD」のテキストは成功していますが、手が昆虫のような状態になってしまいました。
生成した画像
ファイルサイズ 1,128KB
大きさ 1024×1024ピクセル
ビットの深さ 24ビット
です。
せっかく40分近く待ってもこれでは使えません。
# コマンドプロンプト
c:\ > nvidia-smi
:
| 0 NVIDIA GeForce RTX 4060 WDDM | 00000000:01:00.0 On | N/A |
| 34% 54C P2 N/A / 115W | 7881MiB / 8188MiB | 100% Default |
処理中に当環境のVRAMの使用状況を確認したところ、
8.18GB 中 7.881GBが使用中(96%)
ということがわかります。
この状態から、画像生成のパラメータを調整し、どこまで時間短縮ができるかに挑みます。
調整
公式サイトからパラメータの一覧を参照し、パラメータを変更できるようにしました。
# sd_35.py
import torch
import random
import os
from diffusers import StableDiffusion3Pipeline
from datetime import datetime
from modules.config import NEGATIVE_PROMPT
# 時間計測用
import time
MODEL_PATH = "./stable-diffusion-35-medium"
folder = "out"
PROMPT_LOG_FILE = "prompt_log.txt"
MODEL_PATH = "./stable-diffusion-35-medium"
# RTX4060(VRAM8GB)向け軽量画像生成調整版
def getImage(prompt_str):
pipeline = StableDiffusion3Pipeline.from_pretrained(
MODEL_PATH ,
torch_dtype = torch.float16, # 指定するとパイプラインの読み込み,生成速度が早くなる -1:20
low_cpu_mem_usage = True # 指定するとパイプラインの読み込みが早くなる -40s
)
#pipeline.to( "cuda" ) # 指定しない方が早い +2s
pipeline.enable_sequential_cpu_offload() # 指定した方が早い -18:20
pipeline.enable_attention_slicing("max") # 指定した方が早い -3s
torch.cuda.empty_cache()
# 再現実験用
seed = random.randint(0, 1_000_000)
#seed = 2
image = pipeline(
prompt = prompt_str,
height = 512,
width = 512,
num_inference_steps = 30, # def 50 10->33s, 50->63s 画像の品質,崩壊回避
guidance_scale = 7, # def 7.0 4.5->53s 7.0->56s
num_images_per_prompt = 1, # def 1
generator = torch.Generator().manual_seed(seed)
).images[0]
return image
#main
if __name__ == "__main__":
# 処理時間計測開始
start = time.time()
prompt = "A bright park scene with a boy and a girl sitting on a bench, smiling at each other. Between them, a cute puppy is sitting on the bench. The park is sunny and cheerful, with green trees and soft lighting. The boy and girl look happy and relaxed, casual clothing, springtime atmosphere. Photorealistic, vibrant colors, natural lighting, heartwarming scene."
path = makeImageFile(getImage(getPipeline(), prompt))
# 処理時間計測終了
end = time.time()
delta = f"{end - start:3f}"
print(f"処理時間: {delta} 秒")
# ログ出力
log_prompt(f"\t処理時間:{delta}秒\n\t出力ファイル:{path}\n\tプロンプト:[{prompt}]")
# end main
こちらのプログラムを実行すると、次のような出力になります。
※xformersについては、windows環境だとまだライブラリがそろっておらず、動作しないうえに挙動が不安定になりますので、現時点でのインストールはやめた方がいいです(python再インストールしました)
コメントにどの程度の速度効果があるのかメモしてありますので参考まで。
# コマンドプロンプト
c:\{実行フォルダ} > python sd_35.py
:
処理時間: 84.717939 秒

生成した画像は、
ファイルサイズ 396KB
大きさ 512×512PX
ビットの深さ 24ビット
です。
実行中のメモリ使用量を確認すると、まだ空きがあります。
# コマンドプロンプト
c:\{実行フォルダ} > nvidia-smi
:
Memory-Usage 1519MiB / 8188MiB
調整による生成時間への影響
num_inference_stepsによる調整
調整については、seed値を固定して、
推論のステップ数 num_inference_steps
の値を増減させる方法で、生成時間と画像がどのように変化するのかを調べました。(標準値50)
他のパラメータは
height = 512
width = 512
guidance_scale = 7.0
で固定します。

num_inference_steps=70
生成時間 103秒
備考 大きな崩壊はないが、男の子の左手に違和感

num_inference_steps=60
生成時間 89秒
備考 崩壊はない、実写よりCG感が強い

num_inference_steps=50(標準値)
生成時間 84秒
備考 女の子の左手がおかしい

num_inference_steps=40
生成時間 78秒
備考 男の子の左手が太ももにめり込んでいる

num_inference_steps=30
生成時間 71秒
備考 男の子の左手が不自然、表情に違和感

num_inference_steps=20
生成時間 60秒
備考 男の子の左足が不自然、CG調に変わる

num_inference_steps=10
生成時間 51.9秒
備考 犬が中央にいない、男の子と犬の体が崩壊、女の子の足が増える

num_inference_steps=5
生成時間 51.2秒
備考 犬がいない、全体的に抽象的なイラストとなる
num_inference_stepsは、私の個人的な感覚だと
30以上
なら使える画像が取得できそうです。
数値が高くても画像崩壊を起こしていますので、闇雲に高い数値にする必要もなさそうです。
ガチャ法を使うなら30~40辺りで大量の画像を生成して、ほしい画像のSEED値を選び、50前後で微調整をかける使い方ができそうですね。
guidance_scale による調整
seed値を固定して、
guidance_scale プロンプトの忠実性
の値を増減させる方法で、生成される画像がどのように変化するのか調べました。(標準値7.5)
公式でguidance_scale の説明については、
ガイダンススケールは を設定することで有効になります。
ガイダンススケールを大きくすると、テキストに密接にリンクされた画像が生成されますが、通常は画像品質が低下します
等と書かれています。

guidance_scale =10
生成時間 80秒
備考 CG調に変わる、女の子の足が増える

guidance_scale =7.5(基準値)
生成時間 84秒
備考 男の子と女の子の手が崩壊

guidance_scale =5.0
生成時間 86秒
備考 男の子と女の子の手が不自然

guidance_scale =2.0
生成時間 88秒
備考 画像のタッチが変わる、取り込んだオリジナル画像に近づいている? 片方が男の子でなくなる

guidance_scale =0.5
生成時間 80秒
備考 写真を切り張りしたようなタッチ
数値を変えて実験しましたが、この値は生成時間に大きく影響しないように感じました。
guidance_scale を小さくすると、切り張りしたような画像になることから、生成AIでは、
①プロンプトに従って、大まかな画像を切り張りして生成
②ブロック単位で自然な画像に変換しているのではないか
と感じています。
いずれにしてもguidance_scale を変更しても生成時間にはあまり影響がないようですので、標準値でいいかなと思っています。
調整後に生成した画像
調整後、次のようなプロンプトで画像を生成してみました。
# プロンプト
A girl standing in front of a large aquarium tank, viewing many colorful tropical fish swimming inside. The scene is dimly lit, evoking the quiet atmosphere of an aquarium. The girl is seen from behind, with long flowing hair, wearing casual clothing. The fish tank is glowing slightly with underwater lighting, illuminating the vibrant fish inside. Photorealistic, soft lighting, atmospheric.
# 日本語(直訳)
大きな水槽の前に立っている女の子が、中で泳ぐたくさんのカラフルな熱帯魚を眺めている。シーンは薄暗く、水族館の静かな雰囲気を呼び起こす。女の子は後ろ姿で、長く流れるような髪をしており、カジュアルな服装をしている。水槽は水中照明でほんのりと光っており、中の鮮やかな魚たちを照らしている。フォトリアルで、柔らかな光、雰囲気がある

生成時間 76秒
画像の大きさ 512×512
num_inference_steps = 40
guidance_scale = 7.0
感想
ちょっとしたパラメータのつけ方で、生成時間に雲泥の差があることがわかり、微調整を行うことで、生成時間を40分から約1分に縮めることができました。
このくらいの画像が約1分で出力されるなら、充分使い道もありますよね。
VRAMのメモリに空きがあるので、さらに上位のモデルも使ってみたいですね。