- อิมพลีเมนเทชัน C ล้วนสำหรับ สร้างภาพ จากข้อความหรือรูปภาพอินพุตโดยใช้โมเดล FLUX.2-klein-4B
- ทำงานได้โดยไม่มี dependency ภายนอก และสามารถเร่งความเร็วได้สูงสุด 30 เท่าผ่าน BLAS หรือ Metal แบบเลือกใช้ได้
- มี ตัวเข้ารหัสข้อความ Qwen3-4B ฝังมาในตัว จึงไม่ต้องมีขั้นตอนคำนวณ embedding แยกต่างหาก
- รองรับทั้ง text-to-image และ image-to-image พร้อมอินเทอร์เฟซบรรทัดคำสั่งและ C library API
- รันได้โดยไม่ต้องใช้ Python runtime หรือ PyTorch จึงมีความหมายต่อสภาพแวดล้อมการอนุมานแบบเบาและการขยายการเข้าถึง AI โอเพนซอร์ส
ภาพรวมโครงการ
- FLUX.2-klein-4B เป็นโมเดลสร้างภาพของ Black Forest Labs ที่รับ text prompt หรือรูปภาพเดิมเป็นอินพุตเพื่อสร้างภาพใหม่
- โค้ดทั้งหมด เขียนด้วย standard C library เท่านั้น และรองรับการเร่งความเร็วด้วย MPS (Apple Metal) และ BLAS (OpenBLAS) แบบเลือกใช้ได้
- สามารถดาวน์โหลดโมเดลจาก HuggingFace ได้ขนาดประมาณ 16GB โดยองค์ประกอบมี VAE (300MB), Transformer (4GB), Qwen3-4B encoder (8GB) และ Tokenizer
ความสามารถหลัก
- Zero dependencies: รันแบบสแตนด์อโลนได้โดยไม่ต้องใช้ไลบรารีภายนอก
- เมื่อใช้ BLAS จะเร็วขึ้นประมาณ 30 เท่า โดยบน macOS ใช้ Apple Accelerate และบน Linux ใช้ OpenBLAS ได้
- Metal GPU acceleration: เปิดใช้งานอัตโนมัติบน Apple Silicon
- Text-to-image: สร้างภาพจาก text prompt
- Image-to-image: แปลงรูปภาพเดิมตาม prompt
- Integrated text encoder: มีตัวเข้ารหัส Qwen3-4B ในตัว ไม่ต้องใช้งาน embedding ภายนอก
- Memory efficient: หลังเข้ารหัสแล้วจะคืนหน่วยความจำของ encoder อัตโนมัติ ช่วยประหยัดได้ประมาณ 8GB
ตัวอย่างการใช้งาน
โครงสร้างโมเดลและประสิทธิภาพ
- Transformer: 5 double blocks และ 20 single blocks, hidden dimension 3072, 24 attention heads
- VAE: AutoencoderKL, 128 latent channels, บีบอัดเชิงพื้นที่ 8 เท่า
- Text Encoder: Qwen3-4B, 36 ชั้น, hidden dimension 2560
- ขั้นตอนการอนุมาน: ใช้การสุ่มตัวอย่าง 4 ขั้นตอนเพื่อสร้างผลลัพธ์คุณภาพสูง
- ความต้องการหน่วยความจำ
- การเข้ารหัสข้อความ: ประมาณ 8GB
- Diffusion: ประมาณ 8GB
- จุดพีกสูงสุด: 16GB (ก่อนปล่อย encoder)
- เบนช์มาร์กประสิทธิภาพ (Apple M3 Max, RAM 128GB)
- 512×512: MPS 49.6 วินาที, BLAS 51.9 วินาที, PyTorch MPS 5.4 วินาที
- 256×256: MPS 32.4 วินาที, BLAS 29.7 วินาที, PyTorch MPS 3.0 วินาที
- 64×64: MPS 25.0 วินาที, BLAS 23.5 วินาที, PyTorch MPS 2.2 วินาที
- แบ็กเอนด์ C ล้วนช้ามากและเหมาะสำหรับการทดสอบเท่านั้น
การบิลด์และรัน
C library API
- โหลดและคืนทรัพยากรโมเดล
flux_load_dir(path) / flux_free(ctx)
- สร้างและแปลงภาพ
flux_generate(ctx, prompt, params)
flux_img2img(ctx, prompt, input, params)
- อินพุต/เอาต์พุตรูปภาพ
flux_image_load(path) / flux_image_save(img, path)
- ยูทิลิตี
- ใช้
flux_set_seed(seed) เพื่อให้ทำซ้ำผลลัพธ์ได้
- ใช้
flux_get_error() เพื่อตรวจสอบข้อความผิดพลาด
- ใช้
flux_release_text_encoder(ctx) เพื่อคืนหน่วยความจำด้วยตนเองได้
ไลเซนส์และข้อมูลอื่น ๆ
- เผยแพร่ภายใต้ MIT License
- สัดส่วนภาษาของคลังเก็บ: C 93.9%, Objective-C 3.5%, Makefile 1.7%, Python 0.9%
- มี 446 ดาว และ 20 ฟอร์ก สะท้อนความสนใจจากชุมชนอย่างต่อเนื่อง
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เหตุผลที่โปรเจ็กต์นี้เป็นไปได้ก็เพราะสั่งให้ Opus ต้องใช้ไฟล์ IMPLEMENTATION_NOTES.md เสมอ
ทุกอย่างที่ค้นพบระหว่างพัฒนาจะถูกสะสมไว้ในไฟล์นี้ อัปเดตให้ล่าสุดอยู่ตลอด และกำหนดให้จัดการทันทีหลังการบีบอัดคอนเท็กซ์
วิธีนี้ช่วยให้ทำงานโค้ดขนาดใหญ่ได้อย่างมีประสิทธิภาพโดยไม่หลุดจากโฟลว์
รายละเอียดเพิ่มเติมดูได้ที่ไฟล์ IMPLEMENTATION_NOTES.md บน GitHub
ฉันเคยพูดถึงแนวทางนี้ไว้ในบทความ vibe-speccing
อีกอย่างที่มีประโยชน์คือใส่ “บันทึกการทดลอง” ไว้ท้ายสเปก เพื่อจดทุกครั้งที่มีการเปลี่ยนแปลงที่ไม่คาดคิด
อยากรู้ว่าได้ลองรันเบนช์มาร์กหรือยัง และก็น่าสนใจเหมือนกันว่า Python stack เร็วหรือช้ากว่าเครื่องมือ inference ที่ทำบน C
ในฐานะแฟนมานาน ฉันอยากฟัง มุมมอง ของคุณเกี่ยวกับการใช้เครื่องมือแบบนี้
ฉันอยากเรียนรู้ กระบวนการทำงาน ของคุณ
ฉันใช้ Beads อยู่ และคุณภาพผลลัพธ์ดีขึ้นชัดเจน โดยเฉพาะกับโปรเจ็กต์ขนาดใหญ่
อ่านแรงจูงใจใน README แล้วน่าสนใจมาก
ฉันเองก็กำลังลองใส่ไฟล์ PROMPTS.md แบบคล้ายกัน
ถ้าจุดประสงค์คือการแชร์และการสอน การแสดงให้เห็นว่านักพัฒนาที่มีประสบการณ์ใช้วิธีไหนก็มีประโยชน์มาก
สามารถใช้ Claude hook เพื่อทำให้สิ่งนี้ คงความเป็น deterministic ได้ ฉันระบุไว้ใน AGENTS.md ว่าให้อ่านได้อย่างเดียว
มันยังมีประโยชน์ในการส่งต่อบริบทของงานเวลาสลับระหว่าง LLM ต่าง ๆ ด้วย
สุดท้ายแล้วพรอมป์ก็คือผลรวมของปฏิสัมพันธ์เหล่านี้ทั้งหมด จึงยากมากที่จะเรียบเรียงใหม่ให้มีความหมาย
เกี่ยวกับการทดลองใช้ LLM เพื่อ transpile ไปเป็นภาษาอื่น อยากรู้ว่าผลลัพธ์และกระบวนการเป็นอย่างไร
เมื่อไม่นานมานี้ฉันให้ Claude “เขียนใหม่เป็น Rust” สำหรับคอขวดในโปรเจ็กต์หนึ่ง แล้วความเร็วดีขึ้นมาก
แต่ผลงานที่ได้ยังไม่น่าเชื่อถือพอสำหรับใช้นอกห้องทดลอง
หัวใจสำคัญคือเอเจนต์ต้องเข้าใจได้ว่ากำลังก้าวหน้าไหมผ่านฟีดแบ็ก และต้องดีบักได้โดยเทียบกับ implementation อ้างอิง
โค้ดทั้งหมดเขียนขึ้นจาก คำใบ้ด้านการติดตั้งใช้งาน ที่ระบุผลลัพธ์ที่ฉันต้องการ
วันนี้มีคนเอา implementation ของ HNSW vectorset ของฉันไป พอร์ตเป็น Swift แล้ว และรู้สึกดีเพราะใช้ไลเซนส์เดียวกัน
แล้วให้ GPT-5.x-Codex ตรวจโค้ดที่ Claude สร้างขึ้นอีกที
แม้แต่ Opus 4.5 ก็ยังพลาดแบบ off-by-one อยู่ ดังนั้นการใช้โมเดลอื่นเป็น ผู้รีวิวแบบเพื่อนร่วมงาน จึงได้ผลดี
ลำดับการตรวจสอบของฉันคือ lint → test → โมเดลอื่น → ตัวฉันเอง
โมเดล FLUX.2 [klein] ต้นฉบับและโค้ด Python เพิ่งถูกเปิดเผยเมื่อ 3 วันก่อนเท่านั้น
ดูการพูดคุยที่เกี่ยวข้องได้ ที่นี่
การเขียนด้วย C ไม่ได้แปลว่าจะได้ ประสิทธิภาพระดับ C เสมอไป
ถ้าดูเบนช์มาร์กจะช้ากว่า PyTorch ถึง 8 เท่า แสดงว่า LLM ยังมีข้อจำกัดในการสร้างโค้ดสมรรถนะสูงระดับนี้
สาเหตุที่ช้าไม่ได้มาจากคุณภาพโค้ดของ LLM แต่เป็นเพราะ ความต่างของฮาร์ดแวร์
ตัวโอเปอเรชันแกนกลางจริง ๆ ก็เรียกใช้ไลบรารี kernel เดียวกับ PyTorch
มันสามารถลองหลายวิธีแล้ววนเบนช์มาร์กเพื่อปรับปรุงได้เร็ว และบางครั้งก็แซง baseline ที่แข็งแกร่งของ torch ได้ด้วย
เท่าที่ทราบ นี่เป็น OSS โปรเจ็กต์แรกของ Salvatore ในสาย ML เลย อยากรู้ว่าไปสร้าง ความรู้พื้นฐาน ด้านนี้มาอย่างไร
แล้ว Claude ช่วยเติมความเชี่ยวชาญเฉพาะทางให้มากน้อยแค่ไหนก็น่าสนใจ
ฉันยังทำ ช่อง YouTube ด้าน AI เป็นภาษาอิตาลีด้วย โดยอ่านและอธิบายงานวิจัย
ฉันสร้าง implementation ของ neural network ตัวแรกในปี 2003 และหลังจากนั้นก็ทดลองกับ GPT ขนาดเล็กด้วย PyTorch หรือ C มาเรื่อย ๆ
ตอนทำ Redis Vector Sets ก็ได้ทำงานกับ embedding model หลายแบบ
Claude ช่วยให้ implementation เร็วขึ้น แต่แนวคิดพื้นฐานฉันรู้อยู่แล้ว
ถ้ามีพื้นฐานด้านโปรแกรมมิงแต่แทบไม่มีประสบการณ์ AI ก็อาจทำได้เหมือนกัน แต่คงต้องมี รอบป้อนกลับไปมา มากกว่านี้
เดือนที่แล้วฉันทำการทดลองคล้ายกัน โดยพอร์ต Qwen 3 Omni ไปเป็น llama.cpp
ฉันทำทั้งการแปลงเป็น GGUF, quantization และโมดาลิตี input/output เสร็จในหนึ่งสัปดาห์ แต่ PR ถูกปฏิเสธ
ลิงก์ที่เกี่ยวข้อง: PR #18404, โมเดลบน Hugging Face
ถ้าคนที่เขียน kernel ด้วยมือสามารถชี้นำโมเดลได้ดี ก็อาจได้ผลลัพธ์ที่ยอดเยี่ยม
ถ้าแนวโน้มนี้ยังไปต่อ เราอาจได้เห็น fork ของ llama.cpp ที่เร็วกว่าและดีกว่าออกมา
น่าสนใจที่ OpenBLAS กับ MPS ทำความเร็วได้ใกล้เคียงกันมาก
ใน README ระบุว่ามีเพียง MPS เท่านั้นที่ใช้ GPU
ถ้าฉันให้ Claude ทำงานแบบเดียวกัน จะสามารถติดชื่อฉันแล้วออกเป็นไลเซนส์ MIT ได้ไหม
อ้างอิง: Flux2 ใช้ Apache License
มันไม่ได้ต่างกันมาก แต่รายละเอียดเรื่อง ไลเซนส์ แบบนี้ก็ชวนให้กังวลอยู่
แต่จะมีความหมายก็ต่อเมื่อมัน ใช้งานได้จริง
ฉันไม่ค่อยรู้ C และทำงานสายวิเคราะห์ด้วย SQL เป็นหลัก เลยสงสัยว่าโค้ดนี้ถือว่า พร้อมใช้ระดับ production ไหม
ได้ยินบ่อยว่าโค้ดที่ LLM สร้างดูแลรักษายาก
งาน data science อาจยังมีความสม่ำเสมอของประสิทธิภาพไม่มากนัก แต่ถ้านิยามปัญหาและให้ข้อมูลนำเข้าชัดเจน ก็ได้ผลลัพธ์ที่ดี