นำ Stable Diffusion 3.5 มาสร้างใหม่ตั้งแต่ต้นด้วย PyTorch ล้วน
(github.com/yousef-rafat)- โปรเจกต์ miniDiffusion เป็นโอเพนซอร์สที่นำโมเดล Stable Diffusion 3.5 มาสร้างใหม่ตั้งแต่ต้นโดยใช้ PyTorch เพียงอย่างเดียว
- โครงสร้างของโปรเจกต์นี้มีจุดเด่นที่เน้นเพื่อ การเรียนรู้ และการใช้งานสำหรับ การทดลองและการแฮ็ก
- โค้ดเบสทั้งหมดมีขนาดประมาณ 2800 บรรทัด โดยประกอบด้วยโค้ดขั้นต่ำตั้งแต่ VAE, DiT ไปจนถึงสคริปต์สำหรับการฝึกและชุดข้อมูล
- องค์ประกอบหลักประกอบด้วย VAE, ตัวเข้ารหัสข้อความ CLIP, T5, มัลติโหมดดิฟฟิวชันทรานส์ฟอร์เมอร์, Joint Attention เป็นต้น
- ยังอยู่ในสถานะที่มี ฟีเจอร์เชิงทดลอง รวมอยู่ และยังต้องการการทดสอบเพิ่มเติม
แนะนำโปรเจกต์ miniDiffusion
miniDiffusion เป็นโปรเจกต์โอเพนซอร์สที่นำความสามารถหลักของ Stable Diffusion 3.5 มาสร้างใหม่ด้วย PyTorch เพียงอย่างเดียว
เมื่อเทียบกับ Stable Diffusion 3.5 แบบเดิม โปรเจกต์นี้มีข้อดีดังนี้
- โค้ดเบสมีขนาดประมาณ 2,800 บรรทัด จึงมีขนาดเล็กและ เหมาะอย่างยิ่งสำหรับการวิเคราะห์โครงสร้างและเรียนรู้ด้วยตนเอง
- สามารถนำไปใช้ประโยชน์ได้ดีสำหรับ การทดลองด้านแมชชีนเลิร์นนิง และ การแฮ็กโมเดล
- มี dependency น้อยมาก และใช้ไลบรารีเท่าที่จำเป็นเท่านั้น
โครงสร้างหลักและไฟล์ประกอบ
- dit.py : ส่วน implementation ของโมเดล Stable Diffusion หลัก
- dit_components.py : รวม embedding, normalization, patch embedding และฟังก์ชันเสริมของ DiT
- attention.py : ส่วน implementation ของอัลกอริทึม Joint Attention
- noise.py : รวม Euler ODE scheduler สำหรับ Rectified Flow
- t5_encoder.py, clip.py : implementation ของตัวเข้ารหัสข้อความ T5 และ CLIP
- tokenizer.py : implementation ของโทเคไนเซอร์แบบ Byte-Pair และ Unigram
- metrics.py : implementation ของตัวชี้วัดประเมินผล FID (Fréchet inception distance)
- common.py : มีฟังก์ชันเสริมที่จำเป็นสำหรับการฝึก
- common_ds.py : implementation ของ iterable dataset สำหรับแปลงภาพเป็นข้อมูลฝึกสำหรับ DiT
- model โฟลเดอร์ : เก็บโมเดลเช็กพอยต์และล็อกหลังการฝึก
- encoders โฟลเดอร์ : เก็บเช็กพอยต์ของโมดูลแยก เช่น VAE, CLIP
⚠️ ฟีเจอร์เชิงทดลองและความจำเป็นในการทดสอบ miniDiffusion ยังมีฟีเจอร์เชิงทดลองรวมอยู่ และยังต้องการการทดสอบเพิ่มเติม
รายละเอียดตามฟังก์ชันหลัก
Core Image Generation Modules
- implementation ของ VAE, ตัวเข้ารหัสข้อความ CLIP, T5
- implementation ของโทเคไนเซอร์ Byte-Pair, Unigram
SD3 Components
- Multi-Modal Diffusion Transformer Model
- implementation ของ Flow-Matching Euler Scheduler
- Logit-Normal Sampling
- นำอัลกอริทึม Joint Attention มาใช้
สคริปต์สำหรับการฝึกและการอนุมานโมเดล
- มี สคริปต์สำหรับการฝึกและการอนุมาน สำหรับ SD3 (Stable Diffusion 3.5)
ใบอนุญาต
- เผยแพร่ภายใต้ MIT License และสร้างขึ้นเพื่อ วัตถุประสงค์ด้านการศึกษาและการทดลอง
ความหมายและข้อดีของโปรเจกต์โอเพนซอร์สนี้
- สามารถฝึกและแฮ็กโครงสร้างโมเดลสร้างภาพสมัยใหม่ระดับ Stable Diffusion 3.5 ได้โดยตรงด้วย PyTorch ล้วน
- โค้ดกระชับและเป็นอิสระ จึง เหมาะอย่างยิ่งสำหรับการวิเคราะห์โครงสร้าง / ปรับจูนโมเดล / วิจัยอัลกอริทึมใหม่
- สามารถลงมือฝึกปฏิบัติกับเทคนิคสมัยใหม่ด้านมัลติโหมด ทรานส์ฟอร์เมอร์ และ attention ได้โดยตรง
- มอบพื้นฐานสำหรับการทดลองได้อย่างปลอดภัย แยกจากโปรเจกต์เชิงพาณิชย์
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
โครงสร้างของ reference implementation ของ Flux มินิมอลมากจริง ๆ ดังนั้นถ้าใครสนใจก็คุ้มค่าที่จะลองไปดูสักครั้ง
Flux GitHub
จุดเด่นของโปรเจ็กต์ minRF คือใช้ rectified flow ทำให้เริ่มต้นฝึก diffusion model ขนาดเล็กได้ง่าย
minRF GitHub
reference implementation ของ Stable Diffusion 3.5 ก็เขียนไว้ค่อนข้างกระชับ จึงเหมาะสำหรับใช้อ้างอิงเช่นกัน
SD 3.5 GitHub
บ่อยครั้ง reference implementation ไม่ค่อยได้รับการดูแลและมีบั๊กเยอะ
เลยสงสัยว่าโปรเจ็กต์ miniDiffusion หมายถึงใช้โมเดล Stable Diffusion 3.5 หรือไม่
โค้ดที่เกี่ยวข้อง
ชุดข้อมูลสำหรับฝึกมีขนาดเล็กมาก และมีเพียงรูปภาพเกี่ยวกับแฟชั่นเท่านั้น
ชุดข้อมูลแฟชั่น
ชุดข้อมูลดังกล่าวมีไว้เพื่อทดลองฝึก fine-tuning diffusion model
สงสัยว่าการใช้ PyTorch ล้วน ๆ จะให้ข้อได้เปรียบด้านประสิทธิภาพบน GPU ที่ไม่ใช่ของ NVIDIA หรือไม่ หรือว่า PyTorch ถูกปรับจูนกับ CUDA มากเกินไปจนผู้ผลิต GPU รายอื่นแข่งไม่ได้
PyTorch ทำงานบน Apple Silicon ได้ค่อนข้างดีเหมือนกัน
บนดีไวซ์ที่ไม่ใช่ NVIDIA อย่าง AMD ก็สามารถรัน ML workload ผ่าน Vulkan ได้
การรองรับ ROCm ของ PyTorch ยังพัฒนาอย่างช้ามาก และถึงจะทำงานได้ก็ยังช้า
PyTorch ทำงานบน ROCm ได้ค่อนข้างดี แต่ยังไม่แน่ใจว่าดีถึงขั้น "เทียบชั้นกันเต็มที่" หรือไม่
มีข้อเสนอว่าน่าจะลองใช้ในโค้ด PyTorch ว่า
แทนที่จะเป็น
แบบนี้น่าจะดี
ถ้าทำแบบนี้ พารามิเตอร์ของ q, k, v จะถูกเชื่อมกัน แทนที่จะต่อกันอย่างอิสระเหมือนเดิม
ดูเหมือนจะเป็นแหล่งข้อมูลที่ดีสำหรับผู้เรียน
เลยสงสัยว่ามี tutorial หรือคำอธิบายที่มือใหม่ก็ทำตามได้หรือไม่
fast.ai มีคอร์สที่พาเขียน Stable Diffusion ด้วยตัวเอง
สงสัยว่านี่หมายความว่าสามารถใช้ Stable Diffusion ได้โดยไม่มีข้อจำกัดด้านไลเซนส์หรือไม่
พูดตามตรงแบบน่าอายหน่อย ๆ ฉันสงสัยว่าเมื่อเทียบก่อนและหลังมี repo นี้ขึ้นมา เราได้อะไรใหม่เพิ่มมาบ้าง
โดยส่วนตัวฉันหลีกเลี่ยงการสร้างโมเดลเอง และส่วนใหญ่แค่ติดตามผลลัพธ์อยู่ห่าง ๆ
ฉันเคยคิดแบบลอย ๆ ว่าน่าจะมีสคริปต์อนุมาน/การฝึกบน PyTorch เปิดเผยอยู่แล้ว
อย่างน้อยก็คิดว่าสคริปต์อนุมานน่าจะถูกปล่อยมากับการแจกจ่ายโมเดล และสคริปต์ fine-tuning/การฝึกก็น่าจะมีด้วย
เลยยังไม่แน่ใจว่าโปรเจ็กต์นี้เป็นการเขียนของเดิมขึ้นใหม่แบบ "clean room" หรือ "dirty room" หรือว่าที่จริงแม้แต่โค้ด PyTorch เดิมก็ยังซับซ้อนเพราะมี CUDA/C ปนอยู่มากจนเวอร์ชัน PyTorch ล้วน ๆ มีความหมายมาก
ยังไงก็ยังไม่ค่อยเข้าใจนัก ถ้าใครช่วยอธิบายได้ก็คงดี
คุณค่าหลักของโปรเจ็กต์นี้คือ "implementation ที่มี dependency ต่ำ"
Stability AI แจกจ่ายโมเดล Stable Diffusion ภายใต้ Stability AI Community License ซึ่งไม่ใช่แบบ "เสรีเต็มที่" เหมือน MIT
เมื่อนึกถึง SD 3.5 (หรือเวอร์ชันไหนก็ตาม) ฉันมองว่าส่วนสำคัญจริง ๆ คือบรรดาน้ำหนักที่ได้มาจากกระบวนการฝึก
สงสัยว่า academic source code ต้นฉบับที่ CompViz group ของ Ludwig Maximilian University เผยแพร่ออกมานั้นใช้งานจริงได้มากน้อยแค่ไหน
สงสัยว่า implementation ของ diffusion transformer (DiT) ที่นี่ทำ cross-token attention แบบเดียวกับเวอร์ชันเต็มของ SD 3.5 จริงหรือไม่ หรือถูกทำให้ง่ายลงเพื่อให้อ่านโค้ดได้สะดวกขึ้น