見出し画像

[Stable Diffusion] PyTorchのバージョンによっても画像は変わりますよ

プロンプト、サンプラー、ステップ数、seedなど、画像ファイルのメタデータに記録されるような各種のパラメータを同じにしても、様々な違いによって生成される画像が変わることはご存じだと思います。

A1111系WebUIとComfyUIの生成画像の違いについて以前記事にしました。

A1111系でもA1111, Forge, reForge, Forge Classicなど、ツールが違えば生成画像も変わります。

ここで「ForgeはA1111よりも画質が落ちる」とか、さらには「reForgeとForge ClassicはForgeより画質が落ちる」とか、新しいものほど最適化されているため画質が落ちるという人がいますが本当でしょうか?

私にはそれらが本当かどうかは分かりません。
ですが同じA1111であってもxformersやpytorch attentionなどの最適化オプションによって生成画像は変わりますし、PyTorchのバージョンによっても変わります。ツールによる生成画像の優劣について語る人達が、他の要素による優劣について語らないのは不思議に思います。

特にPyTorchのバージョンによる画像の変化については、探しても情報が見つからなかったので自分で軽く検証してみました。


検証環境

生成画像に影響がありそうな環境の情報は以下のとおりです。

  • GPU: NVIDIA GeForce RTX 5090

  • Driver: Game Ready 591.74 WHQL (2026/1/5)

  • Tool: Stable Diffusion web UI (A1111) dev fd68e0c (2025/12/18)

  • Python: 3.10.18

PyTorchは以下のバージョンで検証しました。

  • 2.7.0+cu128

  • 2.8.0+cu128

  • 2.9.1+cu128

  • 2.10.0+cu128

  • 2.10.0+cu130

A1111の最適化オプションは何も付けませんが、私の環境では "--opt-split-attention" を付けた場合と同じDoggettx's cross-attentionが有効になります。https://github.com/AUTOMATIC1111/stable-diffusion-webui/blame/master/modules/sd_hijack_optimizations.py を見る限り、この最適化が実装されたのは2023年5月19日と古く、xformersやPyTorch attentionに比べて低速で最適化されていないものです。

生成内容

生成内容は以下のとおりです。

  • Model: WAI-illustrious-SDXL v14.0

  • Positive Prompt:
    1girl,hair ornament,earrings,china dress,action pose,fighting pose,outstretched arm,spread fingers,upper body,looking at viewer,abstract background,
    masterpiece,best quality,

  • Negative Prompt:
    bad quality,worst quality,worst detail,

  • Sampler: Euler a

  • Size: 832x1216

  • Steps: 28

  • Batch size: 1

  • CFG scale: 7

  • Seed: 20260126

  • RNG: CPU

細かい装飾や指の本数違い、破綻が起きやすいかと考え、髪飾り、イヤリング、腕を伸ばして手を広げるタグを使いました。

生成画像

PyTorchのバージョンを変えて生成した画像です。縦横とも半分程度に縮小しています。
2.10.0+cu130は2.10.0+cu128と完全一致したため割愛しました(細かい比較にはWinMergeを使っています)。

A1111, PyTorch 2.7.0~2.10.0

同じような画像ですが細かい違いがあります。順に見ていきます。

PyTorch 2.7.0と2.8.0の画像の違い

全体の輪郭や顔は同じですが所々に違いがあります。目立つ部分を赤枠で囲っています(赤枠の画像内での座標と大きさは同一です)。

  • 背景の模様の違い

  • 髪飾りの違い

  • 左耳の違い(2.8.0は耳たぶが短く欠けてるように見える)

  • 薬指の違い(2.7.0は中指より長くて変)

  • ドレスの龍の模様(2.7.0はぼやけている)

A1111, PyTorch 2.7.0と2.8.0の画像の違い

PyTorch 2.8.0と2.9.1の画像の違い

PyTorch 2.8.0と2.9.1は完全一致でした。
※ 何度か生成するうちに目視で分からないような違い(一部のドットについてRGB値が1のみズレる)が発生することがありましたが、再現できず目視で判別できないものなので無視します。

PyTorch 2.9.1と2.10.0の画像の違い

こちらも目立つ部分を赤枠で囲っています。

  • 背景の模様の違い

  • 髪飾りの違い

  • 左耳の違い(2.9.1は耳たぶが短く欠けてるように見える)

  • 薬指の違い(2.10.0は中指より長くて変)

  • 胸の大きさ(2.10.0のほうがやや大きい)

なお2.10.0は薬指が長いところや背景に模様が無いところは2.7.0と似ていますが、他の部分は異なっています。

A1111, PyTorch 2.9.1と2.10.0の画像の違い

Batch count: 9での結果

Batch count: 9でseedを1ずつ増やしながら9枚連続生成した場合の結果です。

A1111, PyTorch 2.7.0, Batch count: 9
A1111, PyTorch 2.8.0, Batch count: 9
A1111, PyTorch 2.10.0, Batch count: 9

気づいたことを箇条書きします。

  • 全体の雰囲気、輪郭、顔はあまり変わらないが、耳の位置や胸の大きさなど小さな違いがある(2.10.0のみ3枚目の瞳の色が違う)。

  • 髪型の細部、髪飾り、イヤリング、服や背景の模様などの装飾的なものは結構変わる。どのバージョンがよいかは個人の嗜好でありSeedによっても変わる。

  • 指や腕が破綻したものはバージョンが変わっても破綻している(3枚目の両手指、6枚目の左腕と指、9枚目の左手薬指)。

  • バージョンによって指の本数、形、長さが変わることがある(3枚目の右手指、2.7.0: 4本、2.8.0: 5本、2.10.0: 6本)。

Forge, reForgeでの結果

旧Forge (Forge1, bfee03d), 新Forge (Forge2, dfdcbab), reForge (630cf49)でもPyTorch 2.9.1でBatch count: 9で生成してみました。
A1111と同じく最適化オプションは何も付けませんが、私の環境では "--attention-pytorch" を付けた場合と同じpytorch cross-attentionが有効になります。
バージョンはそれぞれ現時点での最新版、最終版です。ちなみ旧Forgeと新Forgeでは画像が変わりますが、旧reForge (main-old) と新reForgeでは変わりません。

旧Forge, PyTorch 2.9.1, Batch count: 9
新Forge, PyTorch 2.9.1, Batch count: 9
reForge, PyTorch 2.9.1, Batch count: 9

3枚目、6枚目、9枚目はA1111と同様に破綻しています。それ以外については8枚目について右手指が旧Forgeで人差し指と中指の間が広すぎ、reForgeで6本になってしまいましたが、それ以外は破綻と言えるような違いはないと思います。

PyTorchのバージョンで画像が変わる理由

ChatGPTに以下のように聞いてみました。

質問:
Stable Diffusion の画像生成でPytorchのバージョンを2.7, 2.8, 2.9, 2.10と変え、他の要素(プロンプト、サンプラー、seed、ツール)は変えない場合、生成される画像は変わる?それとも変わらない? 理由とともに答えてください。

回答(要約):
結論:変わる可能性が高い。
PyTorchのバージョンが変わると、内部の数値計算方法やCUDAカーネル、最適化処理が変化し、浮動小数点の丸め誤差が異なる。拡散モデルは誤差が段階的に増幅されるため、同一プロンプト・サンプラー・seedでも最終画像が一致しないことが多い。理論上は同じ結果が理想だが、実用環境ではPyTorchの違いも再現条件の一部と考えるべきである。

まとめ

PyTorchのバージョンによる画像の変化についてA1111で軽く検証しつつ、旧Forge, 新Forge, reForgeとも比較してみました。
とりあえずPyTorchのバージョンによってそれなりに画像が変わることが分かりました。

旧Forge, 新Forge, reForgeとの比較についてはサンプルが少なすぎますし、そもそも優劣を語るつもりはありません。
私は細かいことは気にせずPyTorchをバージョンアップしますし、新しいツールを使います。たとえ多少の劣化があったとしても生成が速いほうが試行回数を増やせてよいと考えているからです。

他人の主観的な考えを否定する気はありませんが、PyTorchのバージョンでも画像は変わるので、ツールによる画像の優劣を語る人がそれについてどう考えているのかはちょっとモヤモヤしますね。

このような感じで、あまり体系的に整理や理解されていない技術的な内容を分かりやすく無料で解説しています。「スキ」「フォロー」「チップ」で応援よろしくお願いします。

いいなと思ったら応援しよう!