Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support : OFT merge to base model #1580

Merged
merged 4 commits into from
Sep 13, 2024
Merged

Support : OFT merge to base model #1580

merged 4 commits into from
Sep 13, 2024

Conversation

Maru-mee
Copy link
Contributor

@Maru-mee Maru-mee commented Sep 9, 2024

既存のsdxl_merge_lora.pyに対して、
OFTをベースモデルへマージできるように機能追加しました。

Additional Changes
1.OFT学習結果のベースモデルへのマージ対応
複数のOFTのマージは非対応。
2.並列処理による高速化
import concurrent.futuresを用いることで、並列処理化。
OFTはLoRAと比べて、CPUでのマージが長いので並列処理を追加しました(※1)
3. CUDA対応
torch.device('cuda' ・・・行の追加により、CUDAでマージ処理できます(※2)

No.2,3はOFTのみ対応しています。LoRAには非対応です。
理由は、校閲が難しくならないよう情報を小出しにしただけです。変更自体は簡単です(数行書き換えるだけ?)


補足
・ 設計当初、sdxl_merge_lora.pyと独立したスクリプトとして作成を検討しましたが、
OFTは従来sdxl向けの学習方式なので同じ用途ですし、また共有できるライブラリが多いので、
統合する方が使いまわしやすいと考えました。
皆様のご意見を踏まえて対応します。
・ FLUX.1の期待が高まる現在、今さらOFTのマージの提案ではありますが、
VRAM10GB~16GBクラスにおいて、実用面を考慮すると、SDXLとOFTは最高クラスの組み合わせです(※3)。OFT普及のためにぜひ承認をお願いします。

動作確認結果
Lora @ extension for Stable Diffusion web UI と同等画風で、ほぼ同じ構図が出ることを確認済み。


※1:CPU利用の場合、私の環境ではCPU占有率が上がらず1hr以上かかりましたが、並列化によってマージ時間を25%に短縮できました。
※2:変数Rを適用する処理が30min→1secに短縮されました。
※3:VRAM14GB以下だとSDXL Fine tuning は利用困難。LoConや学習層削減するとクオリティ低下が顕著です。
一方、OFTは直行性を考慮した計算効率の高さゆえに、Fine tuningと同等の忠実さ、LoConと同程度のVRAMコストというメリットがあります。
しかしながら、ベースモデルにマージする手段がないため、繰り返しの学習が難しいです。OFTのマージが重要だと判断しました。

@Maru-mee Maru-mee marked this pull request as ready for review September 9, 2024 09:12
@Maru-mee
Copy link
Contributor Author

Maru-mee commented Sep 9, 2024

LoRAの部分は変わっていませんが、
OFTとの条件分岐実施のためにインデント調整した結果、変更があるように見えます。

@kohya-ss
Copy link
Owner

kohya-ss commented Sep 9, 2024

有用なpull requestをいただき、ありがとうございます。コメントした件についてご確認いただければ幸いです。

@Maru-mee Maru-mee closed this Sep 10, 2024
@Maru-mee Maru-mee reopened this Sep 10, 2024
@Maru-mee
Copy link
Contributor Author

間違えてクローズしてしまいました。再オープンします。

@Maru-mee
Copy link
Contributor Author

有用なpull requestをいただき、ありがとうございます。コメントした件についてご確認いただければ幸いです。

Pull requestに不慣れで、コメントがどこにあるか見つけることができませんでした。
どこを確認するとよいでしょうか?

@kohya-ss
Copy link
Owner

Pull requestに不慣れで、コメントがどこにあるか見つけることができませんでした。
どこを確認するとよいでしょうか?

私も不慣れでレビューが送信されていませんでした。大変失礼いたしました。

@Maru-mee
Copy link
Contributor Author

修正終わりました。
追加で体裁修正しています。
ご確認の程、よろしくお願い致します。

@kohya-ss
Copy link
Owner

手元でOFTをマージして試しているのですが、どうも思ったような結果が得られません。元のmerge_toの実装が誤っていた可能性がありそうです。学習済みのOFTモデルがありましたら、共有いただけますでしょうか。

@kohya-ss kohya-ss merged commit 1d7118a into kohya-ss:main Sep 13, 2024
1 check failed
@kohya-ss
Copy link
Owner

ありがとうございます。諸々動作確認等が取れましたのでマージいたしました。時間がかかり申し訳ありませんでした。

@FurkanGozukara
Copy link

what is OFT i used translate but not much info

@kohya-ss
Copy link
Owner

Please see HF's doc: https://huggingface.co/docs/peft/package_reference/oft

@FurkanGozukara
Copy link

Please see HF's doc: https://huggingface.co/docs/peft/package_reference/oft

I read it and It looks like fine tuning / training method do we have it? I see pull request is about merge

@kohya-ss
Copy link
Owner

OFT trains additional modules, just like LoRA, but it is a completely different algorithm. It hasn't been studied in the community, so we don't yet know what effects it has.

There is a bug in the current OFT implementation in sd-scripts, which I will fix soon.

@FurkanGozukara
Copy link

OFT trains additional modules, just like LoRA, but it is a completely different algorithm. It hasn't been studied in the community, so we don't yet know what effects it has.

There is a bug in the current OFT implementation in sd-scripts, which I will fix soon.

awesome i would like to test it. does it train all layers? or optimized like LoRA?

@kohya-ss
Copy link
Owner

Now the bug is fixed. OFT doesn't support FLUX.1 yet. I will work on it tomorrow.

However, even if we were able to train it, we wouldn't have an inference environment😅

awesome i would like to test it. does it train all layers? or optimized like LoRA?

It trains some layers (Linear and Conv2d if specified) like LoRA. See 'COFT with kohya-ss networks.oft' on #983 . I will add a further document later.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants