2 คะแนน โดย GN⁺ 2025-06-15 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • โปรเจกต์ 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 ความคิดเห็น

 
GN⁺ 2025-06-15
ความคิดเห็นจาก 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 ไม่ค่อยได้รับการดูแลและมีบั๊กเยอะ

      • ตัวอย่างเช่น CLIP tokenizer ของ OpenAI ซึ่งไม่ใช่เวอร์ชันที่ใช้ในการฝึกจริง เป็นเพียง reference เท่านั้น แต่บั๊กก็ยังไม่ถูกแก้ และถูกคัดลอกแบบเดิมไปยังหลายโปรเจ็กต์
      • Flux เองก็ไม่ได้เป็นตัวที่ใช้ฝึกจริง และมีบั๊กที่อาจก่อปัญหาเล็กน้อยกับ cudagraphs เป็นต้น
      • มันพึ่งพา CLIP reference แต่ตัว CLIP เองก็มีบั๊กอยู่แล้ว ดังนั้นบั๊กจึงแพร่ต่อกันไปด้วย
  • เลยสงสัยว่าโปรเจ็กต์ miniDiffusion หมายถึงใช้โมเดล Stable Diffusion 3.5 หรือไม่

    • โค้ดที่เกี่ยวข้อง

    • ชุดข้อมูลสำหรับฝึกมีขนาดเล็กมาก และมีเพียงรูปภาพเกี่ยวกับแฟชั่นเท่านั้น

    • ชุดข้อมูลแฟชั่น

    • ชุดข้อมูลดังกล่าวมีไว้เพื่อทดลองฝึก fine-tuning diffusion model

      • แม้จะเขียนโค้ด SD3 ขึ้นมาใหม่ แต่ด้วยข้อจำกัดด้านฮาร์ดแวร์ของฉัน จึงดึงน้ำหนักโมเดลมาใช้จาก HuggingFace
  • สงสัยว่าการใช้ PyTorch ล้วน ๆ จะให้ข้อได้เปรียบด้านประสิทธิภาพบน GPU ที่ไม่ใช่ของ NVIDIA หรือไม่ หรือว่า PyTorch ถูกปรับจูนกับ CUDA มากเกินไปจนผู้ผลิต GPU รายอื่นแข่งไม่ได้

    • PyTorch ทำงานบน Apple Silicon ได้ค่อนข้างดีเหมือนกัน

      • เพียงแต่ GPU ของ Apple นั้นยากจะให้พลังประมวลผลระดับเดียวกับ GPU รุ่นท็อปของ NVIDIA ดังนั้นจึงเทียบตรง ๆ ได้ยาก
      • อย่างไรก็ตาม มีจุดที่ค่อนข้างแปลกอยู่บ้างเวลาใช้ PyTorch บน Apple Silicon
        • Tensor แต่ละตัวจะถูกมองว่า "เป็นของ" อุปกรณ์ใดอุปกรณ์หนึ่งโดยเฉพาะ (CPU หรือ GPU) ดังนั้นเวลาย้ายข้อมูลจะเกิดการคัดลอกทั้งก้อน
        • แม้ Mac จะใช้ unified memory แต่ PyTorch ก็ยังทำงานในลักษณะที่คัดลอกข้อมูลอยู่ดี
    • บนดีไวซ์ที่ไม่ใช่ NVIDIA อย่าง AMD ก็สามารถรัน ML workload ผ่าน Vulkan ได้

      • หากมีการรองรับส่วนขยายใหม่ ๆ อย่าง cooperative matrix และฟีเจอร์ใหม่ในระดับไดรเวอร์เพิ่มขึ้น ก็มีโอกาสที่ช่องว่างด้านประสิทธิภาพเมื่อเทียบกับ CUDA ซึ่งอยู่ในระดับไม่กี่เปอร์เซ็นต์จะหายไปได้
    • การรองรับ ROCm ของ PyTorch ยังพัฒนาอย่างช้ามาก และถึงจะทำงานได้ก็ยังช้า

    • PyTorch ทำงานบน ROCm ได้ค่อนข้างดี แต่ยังไม่แน่ใจว่าดีถึงขั้น "เทียบชั้นกันเต็มที่" หรือไม่

  • มีข้อเสนอว่าน่าจะลองใช้ในโค้ด PyTorch ว่า

        self.q = nn.Linear(embed_size, embed_size, bias = False)
        self.k = nn.Linear(embed_size, embed_size, bias = False)
        self.v = nn.Linear(embed_size, embed_size, bias = False)
    

    แทนที่จะเป็น

        self.qkv = nn.Linear(embed_size, 3*embed_size, bias = False)
        # ภายในฟังก์ชัน forward
        qkv = self.qkv(x)
    

แบบนี้น่าจะดี

  • ถ้าทำแบบนี้ พารามิเตอร์ของ q, k, v จะถูกเชื่อมกัน แทนที่จะต่อกันอย่างอิสระเหมือนเดิม

    • ถ้าฉันกำลังสับสนเพราะเหนื่อยมากไปก็ขออภัยด้วย
  • ดูเหมือนจะเป็นแหล่งข้อมูลที่ดีสำหรับผู้เรียน

    • เลยสงสัยว่ามี tutorial หรือคำอธิบายที่มือใหม่ก็ทำตามได้หรือไม่

    • fast.ai มีคอร์สที่พาเขียน Stable Diffusion ด้วยตัวเอง

  • สงสัยว่านี่หมายความว่าสามารถใช้ Stable Diffusion ได้โดยไม่มีข้อจำกัดด้านไลเซนส์หรือไม่

    • ไม่ใช่ เพราะอัลกอริทึมหาอนุมาน/การฝึก (คณิตศาสตร์ล้วน ๆ) ไม่อยู่ภายใต้ลิขสิทธิ์ แต่ OP แค่เขียนโค้ดขึ้นมาใหม่เท่านั้น
      • สิ่งที่มีประเด็นด้านลิขสิทธิ์คือตัวโมเดลเอง (น้ำหนัก) และ OP ก็ไม่ได้ฝึกมันเองเพราะไม่มีทั้งข้อมูลและพลังประมวลผล
  • พูดตามตรงแบบน่าอายหน่อย ๆ ฉันสงสัยว่าเมื่อเทียบก่อนและหลังมี repo นี้ขึ้นมา เราได้อะไรใหม่เพิ่มมาบ้าง

    • โดยส่วนตัวฉันหลีกเลี่ยงการสร้างโมเดลเอง และส่วนใหญ่แค่ติดตามผลลัพธ์อยู่ห่าง ๆ

    • ฉันเคยคิดแบบลอย ๆ ว่าน่าจะมีสคริปต์อนุมาน/การฝึกบน PyTorch เปิดเผยอยู่แล้ว

    • อย่างน้อยก็คิดว่าสคริปต์อนุมานน่าจะถูกปล่อยมากับการแจกจ่ายโมเดล และสคริปต์ fine-tuning/การฝึกก็น่าจะมีด้วย

    • เลยยังไม่แน่ใจว่าโปรเจ็กต์นี้เป็นการเขียนของเดิมขึ้นใหม่แบบ "clean room" หรือ "dirty room" หรือว่าที่จริงแม้แต่โค้ด PyTorch เดิมก็ยังซับซ้อนเพราะมี CUDA/C ปนอยู่มากจนเวอร์ชัน PyTorch ล้วน ๆ มีความหมายมาก

    • ยังไงก็ยังไม่ค่อยเข้าใจนัก ถ้าใครช่วยอธิบายได้ก็คงดี

      • คุณค่าหลักของโปรเจ็กต์นี้คือ "implementation ที่มี dependency ต่ำ"

        • ฉันยังไม่เคยลองรัน SD 3.5 จริง ๆ แต่เห็นว่ามันสร้างบนไลบรารี huggingface และโดยส่วนตัวฉันรู้สึกว่า huggingface มี dependency ซับซ้อนเกินไป จนถ้าไม่จัดสภาพแวดล้อมให้ใกล้เคียงกับของนักพัฒนาแทบจะรันไม่ได้เลย
        • โดยเฉพาะเมื่อผ่านไปหลายเดือนหรือหลายปีหลังการปล่อยต้นฉบับ การรันโมเดลบางตัวจะยากมาก
        • ตัวอย่างเช่น หากดูไฟล์ requirements.txt ของ reference implementation ของ Stability AI สำหรับ SD3.5 จะเห็นว่าไม่มีการระบุเวอร์ชันไว้ และยังรวมไลบรารีขนาดใหญ่มากอย่าง transformers ด้วย ซึ่งในงานจริงถือว่าน่าปวดหัวมาก
      • Stability AI แจกจ่ายโมเดล Stable Diffusion ภายใต้ Stability AI Community License ซึ่งไม่ใช่แบบ "เสรีเต็มที่" เหมือน MIT

        • การแก้ไขน้ำหนักในบางลักษณะไม่ได้รับอนุญาต
        • แพ็กเกจนี้จึงอยู่ในรูปแบบที่สามารถใช้รันโมเดล (inference) หรือ fine-tuning ด้วยน้ำหนัก AI ที่มีอยู่แล้วได้
        • เหมาะมากสำหรับการเรียนรู้/การศึกษา แต่ประเด็นด้านไลเซนส์ก็ยังคงมีอยู่
  • เมื่อนึกถึง SD 3.5 (หรือเวอร์ชันไหนก็ตาม) ฉันมองว่าส่วนสำคัญจริง ๆ คือบรรดาน้ำหนักที่ได้มาจากกระบวนการฝึก

    • ตัวโค้ดเองมีความสำคัญค่อนข้างน้อยกว่าในแง่คุณภาพผลลัพธ์หรือประสิทธิภาพ
    • แต่ก็ไม่ใช่ว่าฉันตัดสินได้ถูกต้องเสมอไป และไม่ได้มีเจตนาจะลดคุณค่าความพยายามนี้
  • สงสัยว่า academic source code ต้นฉบับที่ CompViz group ของ Ludwig Maximilian University เผยแพร่ออกมานั้นใช้งานจริงได้มากน้อยแค่ไหน

  • สงสัยว่า implementation ของ diffusion transformer (DiT) ที่นี่ทำ cross-token attention แบบเดียวกับเวอร์ชันเต็มของ SD 3.5 จริงหรือไม่ หรือถูกทำให้ง่ายลงเพื่อให้อ่านโค้ดได้สะดวกขึ้น