メインコンテンツへスキップ

PyTorch単体でゼロからStable Diffusion 3.5を再実装!

·2 分
2025/06 AI PyTorch Stable Diffusion 深層学習 プログラミング

PyTorch単体でゼロからStable Diffusion 3.5を再実装!

引用元:https://news.ycombinator.com/item?id=44276476

liuliu 2025/06/14 15:32:33

この記事に興味あるなら、Fluxの参照実装はすごいミニマルだよ: https://github.com/black-forest-labs/flux/tree/main/src/flux
minRFプロジェクトは小さなdiffusion modelをrectified flowで学習するのにすごく始めやすい: https://github.com/cloneofsimo/minRF
あと、SD 3.5の参照実装も実はミニマルだよ: https://github.com/Stability-AI/sd3-ref

doctorpangloss 2025/06/14 17:52:24

参照実装はメンテナンスされてなくてバグだらけだよ。
例えばhttps://github.com/huggingface/transformers/issues/27961 OpenAIのCLIP tokenizerはバグってるし、それはトレーニングに使われたものじゃない。問題は未解決で他のプロジェクトに延々コピーされてる。
Fluxは?トレーニングに使われたとは言ってないし、使われてない。cudagraphsとかを壊すけどそこまで影響ないバグがある。でもCLIP参照実装を使ってるから、これもバグってるんだ…

liuliu 2025/06/14 23:26:33

バグ見つけたのはすごい!でもキーワードはtraining
inferenceの乖離。学習済み重み使うにはbug-to-bugで再実装しないとダメ。参照実装が大事なのはそのため。SDXLはOpenClipGのpadding bug、FLUXはT5のmask無しbugとかね。直すと画像の質が下がるんだ。TL;DR: バグは直すよりbug-to-bug互換性維持が重要。参照実装マジ大事。(SwiftでSoTAモデル再実装してるhttps://github.com/drawthingsai/draw-things-community/tree/m…)

doctorpangloss 2025/06/15 01:26:07

そのissueをよく読めば、transformersやOpenAIが出してるCLIPの実装が間違ってて、学習済みモデルのコードと一致しないことがわかると思うよ。僕が提案する修正は、経験的にも理論的にも結果を改善するんだ。

42lux 2025/06/14 18:04:02

Fluxでclip lを無効にしても品質は落ちないよ。些細なことを大げさに言ってるだけ。CLIPはどこでも使われてるし。

doctorpangloss 2025/06/14 22:48:49

別の解釈も考えてみてよ: FluxでCLIP Lを無効にしても品質が落ちないのは、使い方がバグってるからじゃないの!

doctorpangloss 2025/06/15 18:43:36

実はFluxのCLIP conditioningはDreamboothみたいなfine tuningにはうまく機能するんだ。tokenization bugは重大になりうるけど、dev modelでCLIPの影響が低い原因になるほどじゃない。pro
max modelにはもっと影響あるかもだけど、BFLしか言えないね。

doctorpangloss 2025/06/18 17:12:22

分かった、いくつか確かなことがあるよ:(1)diffusers、BFL、OpenAIのCLIP tokenizerはバグってる。(2)Flux dev
schnellモデルではCLIPプロンプトの影響が低いことが多い。BFL
OpenAIのtokenizerはトレーニングに使われたものと違う可能性が高い。(2)guidance
timestep distillationがCLIPの役割を弱めてる。(3)CLIPをfine tuneするのは実践的。fine tuneに関心があるならtokenization bugは重要。それ以外は証明しづらいね。

doctorpangloss 2025/06/15 01:27:15

みんなバグの挙動合わせるのに夢中になりすぎて、元の実装がバグってたり、学習済みモデルとコードが合ってないっていう簡単なこと見えてないんだな。

reedlaw 2025/06/14 15:00:43

これってStable Diffusion 3.5モデルのこと?
なんでここで取ってきてるの?
https://github.com/yousef-rafat/miniDiffusion/blob/main/enco
学習データもすごく小さくてファッション関連だけみたいだし。
https://github.com/yousef-rafat/miniDiffusion/tree/main/data

yousef_g 2025/06/14 15:06:53

データセットはDiffusionモデルのファインチューニング試すためだよ。
SD3をゼロからコード書き直して再実装したけど、ウェイトはハードの都合でHuggingFaceから使ってるんだ。

reedlaw 2025/06/14 15:41:02

じゃあこれってSD3の推論とファインチューニングを実装してるってこと?

jatins 2025/06/15 03:19:48

>ハードの都合でウェイトはHuggingFaceから使ってる
ここ、どういう意味かハッキリさせてくれる?
ウェイトがHuggingFaceからなら、実装は何のため?

MoonGhost 2025/06/15 06:05:09

僕の推測では、HuggingFaceのウェイトは初期状態として使ってるんじゃないかな。フル学習は高すぎるから。
で、小さいデータセットで短時間学習、つまりファインチューニング。
これでモデルが1) 互換性がある 2) 学習可能だってわかる。
理論的には大きなデータセットでゼロから学習できる。
コードはまだ見てないんだけど、質問は
1) 並列学習できる?
2) 学習に必要なリソースは?
まあ、限定的な専門データセットで学習試してみてもいいかも。

elbear 2025/06/15 11:01:04

モデルはコードで表されるアーキテクチャと、学習で得られる知識、つまりウェイトからできてるんだよ。

montebicyclelo 2025/06/15 07:44:58

>ウェイトがHuggingFaceからなら、実装は何のため
ウェイトっていうのは、ただのfloatの集まり(テンソルにグループ化されてる)なんだ。
コードがそのウェイトを使ってどんな計算をするか、例えば行列Wをウェイトからロードして y = W @ x とか y = W.T @ x とか y = W @ W @ x とか、それを決めるんだよ。

refulgentis 2025/06/14 18:34:05

聞くの恥ずかしいんだけど、このリポジトリができて、前は無かったものって何?
モデル作りは一生懸命避けてきたけど、何年も出力には触れてきたんだ。
僕の混乱の根っこは、PyTorchベースの推論/学習スクリプトはもうあると思ってたこと。
(少なくとも推論スクリプトはモデルと一緒にリリースされてて、ファインチューニング/学習のもそうだろうと勝手に思ってた)
だからこれが、既存のもののクリーンルーム/ダーティルーム再実装なのかな、とかよく分からない。
それか、みんなPyTorchって言ってるけど、実際はCUDA/C/なんか独自の呼び出しをしてて、ピュアなPyTorch実装より理解しにくいとか?
まあ、どれも良い推測じゃないから、ここでやめとくね。

_tqr3 2025/06/14 20:00:36

Stability AI、Stable Diffusionの制作者は、MITライセンスみたいに”free”じゃない独自のコミュニティライセンスで製品を出してるんだって。特定のやり方で重みをいじるのは許されてないんだ。この記事のパッケージはモデルを動かす(推論)か、既存のAI重みを使ってファインチューニングするかって感じだけど、それでも同じライセンス問題にぶつかる可能性があるよ。

refulgentis 2025/06/14 20:40:16

え、SD 3.5ってファインチューニングできないの!?コミュニティライセンスは、Stability AIに少しでも利益が入るように、商用利用したり課金したりするのを阻止するためのものかと思ってたよ。マジかよ。Civitのゴナーとかは追ってないけど、SDは人気が落ちてきたと思ってたんだ。たぶん3.5がFluxの後に遅すぎた割に、クオリティの向上もほとんどなかったから、新しい環境をイチから作る価値がないって思われたのかな。

fc417fc802 2025/06/15 03:35:40

> You can’t finetune SD 3.5!?
特定のやり方でファインチューニングされると、それでStability AIのイメージが悪くなるのを避けたいからだって。

djhn 2025/06/16 05:55:24

それでさ、興味本位なんだけど、ゴナーシーンを追うのに良いTLDRな情報源ってない?ニュースレターとかsubreddit、podcast、YouTubeチャンネルとかさ。彼らのやり方の方に興味あって、結果じゃなくてね。

rockemsockem 2025/06/14 22:09:48

これのメインはたぶん、「最小限の依存関係で」って部分だと思うな。SD 3.5はHugging Faceのライブラリをベースにしてるけど、あれって依存関係がごちゃごちゃしてて、開発者が使った正確な設定じゃないとセットアップするのが本当に大変なんだよね。元のリリースから数ヶ月、数年経つと、特に特定のモデルを動かすのがすごく難しくなるんだ。例えば、Stability AIのリファレンス実装のSD3.5のrequirements.txt見ると、バージョン指定ないし、”transformers”みたいな巨大ライブラリが含まれてるんだ。

refulgentis 2025/06/14 22:20:20

ああ、ありがとう、それすごくよく分かるわ。ONNXの推論ラッパーをDartで書いた経験あるんだけど、transformers.jsのONNXデモコードをDartに移植できたことがないんだよね。あれって抽象化レイヤーで書かれてて、transformersみたいなAPIになってるんだけど、それが実際モデルに何を渡してるのか分かりにくくしてるんだ。その上Pythonの依存関係も絡んでくると…もう大変!

albert_e 2025/06/14 14:27:21

学習者にとってはすごく良いリソースみたいね。ちょっと疑問なんだけど、初心者でもこれを追って学べるようなチュートリアルとか解説って、ひょっとしてどこかにあるのかな?

an0malous 2025/06/14 15:22:10

fast.aiにStable Diffusionをイチから作るコースがあるよ:https://course.fast.ai/Lessons/part2.html

BinaryMachine 2025/06/14 17:23:11

fast.aiの情報ありがとう、Jeremy Howardはマジですごいよね。このコース受けようと思ってたんだ。ディープラーニングって1年経つとすぐ古くなると思ってて、新しいバージョンが出るの待ってたんだよね。

whiplash451 2025/06/14 19:47:00

いや、それは違うと思うな。fast.aiの授業は今でも通用するし、役に立つ基礎をたくさんカバーしてるよ。

socalgal2 2025/06/15 18:34:16

いやー、前提条件厳しすぎない?ゼロからSGD組めるとか、Kaggle勝てるとか、最新のNLPやCV使えたりとか、PyTorchとfastai詳しいとか…。1つのコースでこんなスキル身につくと思えないんだけど、とほほ。

Dwedit 2025/06/14 21:31:18

ねぇねぇ、PyTorch単体で使うと、NVIDIA以外のGPUでもパフォーマンス良くなるの?それともCUDAに最適化されすぎてて、他のGPUじゃ勝ち目無いの?どうなの?

jwitthuhn 2025/06/14 22:06:18

PyTorchってApple siliconでもちゃんと動くよ!でも、AppleのGPUはNVIDIAほどじゃないから、直接比較は難しいかもね。あと、Apple silicon特有の変な癖で、データ転送でフルコピーしちゃうんだ。ユニファイドメモリ向けじゃないから仕方ないか。

もっとコメントを表示(1)
brcmthrowaway 2025/06/14 22:38:16

PyTorchってApple siliconで特別なことしなくてもすぐ使えるの?それともApple独自のパッケージが必要なの?知りたいな。

thom 2025/06/15 01:32:55

uv pip install torch でOKだよ。デバイスを mps:0 にして、メモリ使いまくって!ただ、全部の機能があるわけじゃないから、GammaとかBetaとかStudent-T分布とか、できないこともあるけどね。

chickenzzzzu 2025/06/14 21:57:44

AMDとかでもVulkan使えばML動かせるよ。Cooperative Matrixみたいな新しい拡張とか、将来ドライバ経由で出てくる機能があれば、CUDAとの差もほとんど無くなるかもね。

VeejayRampay 2025/06/14 21:55:26

PyTorchはROCmでもうまく動くとは思うけど、NVIDIA並みにちゃんと動くかって言われると、どうかなぁ。分からないや。

3abiton 2025/06/14 21:55:40

そうみたいだね。PyTorch ROCmはゆっくりだけど着実に進んでるみたい。でも、動かせたとしても、まだすごく遅いみたいだけどね。

godelski 2025/06/14 23:25:22

コードの提案だよ!qとかkとかvを個別のLinear層にする代わりに、まとめて3*embed_sizeにしちゃおうぜ。
self.qkv = nn.Linear(embed_size, 3*embed_size, bias = False)
フォワード関数もちょい変更ね。

jszymborski 2025/06/14 23:30:54

ちょっと待った。それってqとかkとかvのパラメータに繋がりができちゃうんじゃない?元のコードはそうじゃないはずだけど…。俺、疲れてて何か勘違いしてる?

godelski 2025/06/15 03:58:24

それって実は超普通のことだよ。線形レイヤーは単一だからノード内の接続なんて無いし、計算負荷がちょっと軽くなるからそうしてるんだ。結局、線形レイヤーには結合法則があるってこと。

NoelJacob 2025/06/14 16:09:47

ってことは、これってライセンスの制約が無いStable Diffusionってこと?

Sharlin 2025/06/14 17:26:01

いや、推論とか学習のアルゴリズムは数学だから著作権は無いんだ。記事の人はただ別の実装を書いただけだよ。著作権があるのはモデルの方。記事の人はそれをゼロから学習させたわけじゃない(学習データも計算力も無いだろうし)。

Zambyte 2025/06/14 21:39:24

>著作権があるのはモデル
それって実際に試されたことあるの?まだAI企業がそうだって信じ込ませようとしてる段階じゃないの?

bravesoul2 2025/06/14 23:47:50

もしモデルが著作権で保護されてるなら、学習データみたいな元の依存関係にあったライセンスは当然守ってるんだろね。

bredren 2025/06/15 05:36:26

元の依存関係のライセンスって、著作権を確立するのに必要なの?例えば、『I Need a Haircut』は『Alone Again』をサンプリングした権利がどうあれ、ユニークな作品だったじゃん。

echelon 2025/06/14 18:23:50

”モデル”って言う時は具体的にしようよ。ネットワークを記述したコードと、結果としてのウェイトは違うんだ。(学習、推論、ファインチューニング、その他のサポートコードともね。)コードがネットワークとかモジュールをどう繋ぐかって理論的な図は数学。でもそれをコードで実装したら著作権があるんだ。僕の知る限り、ウェイトはまだグレーゾーン。コードはコードで著作権があるけどね。ウェイトは人間が作ったんじゃない。自動プロセスの結果で、著作権保護は受けられないはず。でもこれは裁判で試されてないんだ。もしOpenAIのGPT-4oのウェイトが漏れたら、世界中の人がタダで使えると思うよ。ただ、動かすコードは自分で書かなきゃだけどね。

bravesoul2 2025/06/14 23:49:22

コードや数式にはモデルアーキテクチャ、重みにはウェイトって言葉を使うと、混乱しないよ! ウェイトを使うためには、ハイパーパラメータも知っておく必要があるね。

MoonGhost 2025/06/15 06:17:05

> コードや数式にはモデルアーキテクチャ…
コードは著作権保護されるけど、数学は違うよね。「アーキテクチャ」ってどうなんだろう?

vrighter 2025/06/14 20:08:42

つまり、彼はまだ彼らのライセンスを完全に違反してるってことだね。

ineedasername 2025/06/14 21:11:27

SD 3.5(どのバージョンでも)って聞くと、トレーニングの結果、つまりウェイトのことを思い浮かべるんだよね。コードはそこまで重要じゃないのかな?出力品質とかパフォーマンスに関しては。でも正直よく分かんないし、そういう基準でこの取り組みを判断しようとしてるわけじゃないんだけど。

CamperBob2 2025/06/14 15:06:11

get_checkpoints.pyを実行する前にHugging Face Tokenを追加してってあるけど、もう少し具体的に教えてくれない?そういうトークンが何なのか、どうやって手に入れるのか、get_checkpoints.pyのどこに置けばいいのか分からないんだ。

einsteinx2 2025/06/14 16:01:33

> そういうトークンが何なのか
Hugging FaceのAPIトークンだよ
> どうやって手に入れるのか
Hugging Faceアカウントで生成するんだ
> get_checkpoints.pyのどこに置けばいいのか
59行目の空の引用符の中、token = ””って書いてあるところさ

CamperBob2 2025/06/14 17:11:00

あー、分かった、ありがとうね。
そういうのは、スタイルの話だけど、モジュールの一番最初に定義するのが良いと思うよ。

einsteinx2 2025/06/14 21:44:39

同感だよ。僕はプロジェクトのメンバーじゃないんだけど、君のコメントを見て助けになればと思ってさ。

Dwedit 2025/06/14 21:14:15

「APIトークン」から「API」を省くと混乱するよ。AIモデルはモデルを実行する前に全てのテキストを「トークン」にトークン化するからね。全く違う二つのものに同じ単語を使ってるんだ。

squircle 2025/06/14 14:07:38

ソフトウェア開発への情熱は薄れてきたけど、このプロジェクトはマジでクールだね。誰でも基本から再発明できるとか超ヤバい。

b0a04gl 2025/06/14 14:39:05

このDiTって、ほんとのSD 3.5みたいにcross-token attentionをちゃんと捉えてるの?それとも分かりやすくするために単純化されてる?

caycep 2025/06/14 16:26:37

Ludwig Maximilian UniversityのCompViz groupから手に入る元の学術論文って、どのくらい実用的なの?

vergessenmir 2025/06/14 16:01:40

この実装に何か際立った特徴はある?例えば、遅い部分とか速い部分とかさ。

eapriv 2025/06/14 16:44:16

「ゼロから」ってのが、今じゃ「PyTorchで」って意味になってるのがマジウケる。

mardifoufs 2025/06/14 20:51:01

ある程度複雑なモデルだとPyTorchは基本的な部品だよ。SDみたいにもっと「高レベル」なものを再実装するのに、PyTorchが提供するautogradとかを自分で実装してもつまんないでしょ。ウェブアプリをゼロから作る時にOSとかJavaScriptエンジンを再実装しないのと一緒だよ。最近はPyTorch上の抽象化や、APIとして使うだけのパッケージが増えてるけど(それはそれで便利なんだけどね!)、PyTorchの機能を抽象化する依存関係が多すぎる実装より、これくらいので見るのは良いね。

eapriv 2025/06/15 06:00:43

>「そんなの面白くないだろ」って?Andrej Karpathyはそれと全く同じことやってたし、結構面白かったと思うけどね。

もっとコメントを表示(2)
yorpinn 2025/06/16 02:29:51

同意!動画シリーズは最高だね。でも、「>…SDみたいに”高い”レベルのものの再実装を見せるのが目的の場合」っていう従属節があるんだよ。autograd実装は面白いけどStable Diffusionには直接関係ないし、元のプロジェクト並みに複雑で大脱線だよね。

nothrowaways 2025/06/15 01:38:23

ピュアPyTorchなの?

theturtle 2025/06/14 15:09:00

いいね。Anne Hathawayが青いキリンの群れをMoonで率いてる画像、まだ作れるの?

記事一覧へ

海外テックの反応まとめ
著者
海外テックの反応まとめ
暇つぶしがてらに読むだけで海外のテックニュースに詳しくなれるまとめサイトです。