สารบัญ
เคยมั้ยครับ อยากได้ภาพ cover สวยๆ ประกอบโพสต์บล็อก พอจะ automate ผ่าน code ให้ระบบทำเอง ปรากฏว่า…
บริษัทใหญ่ๆ ที่เคยให้ฟรี มันเลิกฟรีไปพร้อมกันหมดแล้ว!
- Gemini Nano Banana → free tier โดนปิดปลาย 2025 ✗
- Grok Aurora → API paid เท่านั้น ✗
- DALL-E → $0.04/ภาพ ✗
ยังไม่ได้พอกินข้าวแพงๆ จะมาจ่ายค่า API รายภาพเหรอ 555+
เอางี้ ผมทำเองมันซะเลย บน GPU ที่มีอยู่แล้วในเครื่อง เท่าไหร่กันเชียว?
ปรากฏว่า… ได้ครับ และได้ดีด้วย วันนี้ผมเลยมีระบบที่ Cover ทุกโพสต์บนบล็อกเกิดจากเครื่องตัวเอง ฟรี 100% สั่งผ่านแชทอย่างเดียวได้เลย
แล้ว 4060 8GB ทำได้มั้ยฟะ?!
สเปคเครื่องผม — HP OMEN Laptop + RTX 4060 Laptop GPU 8GB VRAM ขนาดกลางๆ ของตลาด gaming laptop
ถามตรงๆ — 8GB ตึงไปมั้ย สำหรับ Flux ที่เป็นโมเดลใหม่ล่าสุดของวงการ open-source image gen?
รอดแบบเบียดๆ แต่รอดครับ
Flux Schnell เต็มตัว (precision fp16) ต้องการ VRAM ราวๆ 16GB — ของผมเหลือแค่ครึ่ง แต่มีตัวช่วยชื่อ fp8 quantization — ลด precision จาก 16-bit ลง 8-bit:
- ไฟล์เล็กครึ่งนึง
- VRAM ใช้ครึ่งนึง
- Quality หายไปแค่ ~3-5% (ตาคนปกติแทบมองไม่ออก)
แป๊บ! 8GB พอแล้วครับ 🎯
รวมพลโมเดลที่ต้องโหลด — 22GB
ทำ image gen ด้วย Flux ไม่ใช่แค่โหลดไฟล์เดียวจบ — ต้องมี 4 ชิ้น ทำงานร่วมกัน:
| ไฟล์ | ขนาด | หน้าที่ |
|---|---|---|
flux1-schnell-fp8 | 17 GB | เชฟหลัก ปั้นภาพจาก noise |
t5xxl_fp8 | 5 GB | อ่าน prompt ยาวๆ เข้าใจ context |
clip_l | 250 MB | อ่าน prompt แบบ concept |
ae (VAE) | 350 MB | แปลง latent → pixels จริง |
รวม ~22GB
ลง C: drive เหรอ? ผมเหลือแค่ 115GB ลงแล้วตึง… ดีที่ D: drive ว่าง 200GB+
วิธีแก้: Windows directory junctions — ชี้ C:\ComfyUI\models\* ไปที่ D:\LLM\comfyui\models\* ในระดับ filesystem เลย ComfyUI คิดว่าโฟลเดอร์อยู่ที่ C: แต่จริงๆ ข้อมูลอยู่ D: ทั้งหมด
คำสั่ง PowerShell ชุดเดียว:
foreach ($name in "diffusion_models","clip","vae","loras") { $src = "C:\ComfyUI\models\$name" $dst = "D:\LLM\comfyui\models\$name" Remove-Item $src -Force New-Item -ItemType Junction -Path $src -Target $dst | Out-Null}(เผื่อมีคนถาม — extra_model_paths.yaml ของ ComfyUI classic ใช้กับ Desktop เวอร์ชั่นไม่เสถียรนัก junction ชัวร์กว่า)
8GB ตึงจังกูแก้ยังไง
Flux ตัวเต็มทั้งตระกูล 22GB ถ้าโหลดเข้า VRAM พร้อมกัน — 8GB ตายสนิท
แต่ ComfyUI ฉลาดพอ — โหลด component เป็นชั้นๆ ไม่ใช่ยกเข้าพร้อมกัน:
flowchart TB
A[Prompt text] --> B[โหลด T5 + CLIP<br/>~5GB VRAM]
B --> C[Encode text → embeddings]
C --> D[ปลด encoders<br/>VRAM ว่าง]
D --> E[โหลด Flux diffusion<br/>~7GB VRAM]
E --> F[Denoise 4 steps]
F --> G[ปลด Flux<br/>VRAM ว่าง]
G --> H[โหลด VAE<br/>~1GB VRAM]
H --> I[Decode latent → PNG]
I --> J[ภาพเสร็จ!]
style A fill:#2b6cb0,color:#fff
style J fill:#2f855a,color:#fffVRAM peak อยู่แค่ ~7GB ไม่เกิน 8GB ที่ GPU มีให้ 👍
Speed? ~7-10 วินาที ต่อภาพ 1024×1024 เร็วกว่าที่คิดเยอะมาก
ตอนนี้ — แชทอย่างเดียว ได้ภาพขึ้นเว็บเลย!
เมื่อก่อนถ้าอยากได้ cover 1 ภาพ:
- เปิด ComfyUI UI
- วาด node graph (load model, encode, sample, decode, save)
- พิมพ์ prompt
- กด Run รอ
- Save PNG
- อัปโหลดเข้า R2 manual
- แก้ markdown เพิ่ม
image:URL - commit + push
8 step ต่อภาพ 1 ภาพ — ทำ 10 โพสต์ตายก่อน
ตอนนี้:
flowchart TB
A[ผมพิมพ์ในแชท<br/>'ทำ cover ให้โพสต์ X'] --> B[Claude เขียน draft]
B --> C[Pitch concept<br/>ผม approve]
C --> D[gen-cover.mjs รัน]
D --> E{ComfyUI เปิดอยู่?}
E -->|Yes| G[POST /prompt]
E -->|No| F[auto-spawn ComfyUI.exe<br/>รอ 30 วินาที]
F --> G
G --> H[Flux gen PNG ~8 วินาที]
H --> I[sharp compress<br/>→ WebP 85KB]
I --> J[wrangler upload R2]
J --> K[Update frontmatter]
K --> L[git commit + push]
L --> M[CF Pages deploy<br/>live ใน 1-2 นาที]
style A fill:#2b6cb0,color:#fff
style M fill:#2f855a,color:#fffผมไม่ต้อง:
- เปิด UI เอง
- เขียน prompt ใน node
- เซฟภาพ
- อัปโหลด
- แก้ markdown
แค่แชทครับ — ได้ cover ขึ้นเว็บ
Automation script ตัวเด็ด — gen-cover.mjs
Node script ~200 บรรทัด รองรับ 3 providers:
# Local (ฟรี ใช้เป็นหลัก)node scripts/gen-cover.mjs --provider=comfyui <slug> "<prompt>"
# API providers (สำรองถ้า local พัง)node scripts/gen-cover.mjs --provider=gemini <slug> "<prompt>"node scripts/gen-cover.mjs --provider=grok <slug> "<prompt>"ส่วน auto-start ที่ทำให้ผมไม่ต้องเปิด Comfy manual:
async function ensureComfyRunning(host) { try { const res = await fetch(`${host}/api/object_info`); if (res.ok) return; // already up } catch {}
spawn(COMFY_EXE, [], { detached: true, stdio: "ignore", }).unref();
// poll until API responds (max 90s) const deadline = Date.now() + 90_000; while (Date.now() < deadline) { await sleep(2000); if (await isUp(host)) return; } throw new Error("ComfyUI didn't start within 90s");}โค้ดสั้น แต่ประหยัดเวลาให้ตัวเองได้เยอะมาก — ไม่ต้องเปิด Comfy คอยอีกแล้ว
แต่ภาพต้องดีด้วย — ไม่ใช่ว่ากด gen มั่วๆ 555+
เจ็บตัวเป็นครูครับ — batch แรก gen 15 ภาพในกระบิดเดียว ด้วย prompt กลางๆ นั่งดูเองแล้ว… ไม่โอเคเลย 555+
Reject 14 ภาพ เพราะ:
❌ Prompt ใส่ metaphor กลางๆ — ไม่ตรง content แต่ละบท ❌ Cover ดูเป็น insider — ภาพ dark terminal + security logs, non-tech อ่านไม่รู้ว่านี่คือ security ❌ Theme เดียวทุกภาพ — boring
Discipline ที่จดไว้หลังจากนั้น (เก็บใน .claude/IMAGE_WORKFLOW.md):
- 📖 อ่าน content จริงก่อน — ไม่ใช่แค่ดูชื่อบท
- 💡 Pitch concept 2-3 ทางให้ผู้เขียนเลือก ก่อน gen prompt
- 🎯 Cover = universally recognizable — ต้องจำได้ทันทีว่าเรื่องอะไร (padlock = security, server rack = architecture, Kanban = PM)
- 🎨 Analogies (โดมิโน่, ห้องครัว, เรือดำน้ำ) ใส่ inline ได้ แต่ไม่ใช่ cover
- 👁 Self-review ภาพทุกตัว — regen ถ้าอ่อน ก่อนโชว์ผู้เขียน
- 🌈 Context-aware theme — memoir ≠ tech post ≠ humor ต้องใช้ mood ต่างกัน ไม่ใช่ cyan-dark ทุกภาพ
แล้วประหยัดเงินเท่าไหร่ 555+
เปรียบเทียบทางเลือก:
flowchart TB
A[ต้องการ auto-gen cover<br/>ทุกโพสต์บนบล็อก] --> B{เลือกทางไหน?}
B --> C[Paid API<br/>Gemini/Grok/DALL-E]
B --> D[Subscription Web App<br/>Gemini app / Grok Imagine]
B --> E[Local GPU<br/>Flux Schnell fp8]
C --> C1[~$0.04/ภาพ<br/>ต้องเปิด billing<br/>100 ภาพ/ปี = $4]
D --> D1[ฟรี แต่ manual<br/>download เองต่อภาพ<br/>automate ไม่ได้]
E --> E1[ฟรี 100% ตลอดกาล<br/>automate ได้เต็มรูปแบบ<br/>คุมตัว model เอง]
style E fill:#2f855a,color:#fff
style E1 fill:#2f855a,color:#fff
style D fill:#c53030,color:#fff
style D1 fill:#c53030,color:#fffปีนึง $4 ไม่เยอะใช่มั้ยครับ? ใช่ — แต่มันมี ตรรกะ “ไม่ต้องผูกบัตร ไม่ต้องกังวล rate limit ไม่ต้องกลัวราคาขึ้น” ที่ซื้อไม่ได้
GPU idle ในเครื่องอยู่แล้ว — gen ภาพตอนว่างก็ไม่ได้กินไฟเพิ่มเดือนละเป็นบาทๆ
จุดที่เจอตอนตั้งระบบ (เผื่อใครตามจะได้ข้ามช็อต)
⚠️ Comfy Desktop ไม่รับ extra_model_paths.yaml เสถียร → ใช้ directory junction แทน
⚠️ Port 8000 ไม่ใช่ 8188 ของ Comfy CLI classic — script ต้องชี้ให้ถูก
⚠️ fp8 model ต้องระบุ weight_dtype: fp8_e4m3fn ใน UNETLoader node ไม่งั้นโหลดไม่ได้
⚠️ Flux Schnell ต่าง SDXL — ใช้ 4 steps, cfg 1.0, scheduler "simple" (ไม่ใช่ DPM++ 2M 20 step)
⚠️ Raw PNG 1MB ใหญ่ไปสำหรับ web → sharp compress เป็น WebP quality 85 = ~85KB (90% เล็กลง ตาคนแทบไม่เห็น)
Setup ครบทำตามได้เลย (ลุย!)
ใครมี GPU 8GB+ (RTX 3060 / 4060 / 4070 / 4080 / 4090) ทำ 5 step ตามนี้ได้เลย — ผมใช้เวลา 40 นาทีก็ครบ (รวมเวลาโหลด model 22GB)

App อยู่ C: drive, model ใหญ่ๆ อยู่ D: drive เชื่อมกันผ่าน directory junction → ComfyUI คิดว่าทั้งหมดอยู่ C: แต่ไฟล์จริงไม่กินที่ C:
1. โหลด + ติดตั้ง ComfyUI Desktop
→ www.comfy.org/download (Windows installer)
Wizard 3 หน้า:
- Hardware: NVIDIA CUDA ✓
- Install location:
C:\ComfyUI(อย่าใส่ Documents มันปนกับไฟล์ส่วนตัว, และอย่าใส่ในAppData\Local\Programs\ComfyUIเพราะอันนั้นคือ bundle ที่โดนลบตอน update) - App Settings: Auto Updates ON, Usage Metrics OFF
Installer จะลง Electron app + Python venv + PyTorch (~3GB) ใช้เวลา 5-10 นาที
2. โหลด 4 ไฟล์ model (~22 GB รวม)
mkdir D:\LLM\comfyui\models\diffusion_models, D:\LLM\comfyui\models\clip, D:\LLM\comfyui\models\vae, D:\LLM\comfyui\models\lorasโหลดจาก HuggingFace (ไม่ต้อง login):
| File | Size | URL (HuggingFace) |
|---|---|---|
flux1-schnell-fp8.safetensors | 17 GB | Comfy-Org/flux1-schnell/resolve/main/flux1-schnell-fp8.safetensors → diffusion_models/ |
clip_l.safetensors | 250 MB | comfyanonymous/flux_text_encoders/resolve/main/clip_l.safetensors → clip/ |
t5xxl_fp8_e4m3fn.safetensors | 5 GB | comfyanonymous/flux_text_encoders/resolve/main/t5xxl_fp8_e4m3fn.safetensors → clip/ |
ae.safetensors | 350 MB | Comfy-Org/Lumina_Image_2.0_Repackaged/resolve/main/split_files/vae/ae.safetensors → vae/ |
เต็ม URL prefix https://huggingface.co/ ใช้ curl -L -O หรือ IDM / aria2c (multi-thread เร็วกว่า browser 3-5 เท่า)
3. ผูก C: → D: ด้วย Windows directory junction
เปิด PowerShell → รัน script นี้ครั้งเดียว:
foreach ($name in "diffusion_models","clip","vae","loras") { $src = "C:\ComfyUI\models\$name" $dst = "D:\LLM\comfyui\models\$name" if (Test-Path $src) { Remove-Item $src -Force } New-Item -ItemType Junction -Path $src -Target $dst | Out-Null Write-Host "OK: $src -> $dst"}ComfyUI จะเห็น model ทั้งที่ของจริงอยู่ D: — ไม่กินที่ C: แม้แต่ bit เดียว
4. เปิด Comfy + gen ภาพแรก
- Double-click icon Start Menu → ComfyUI Desktop เปิดขึ้น
- Templates → Text to Image (New) → Load
- ตั้งค่า node ในหน้า workflow:
UNETLoader→flux1-schnell-fp8.safetensors, weight_dtype =fp8_e4m3fn(ไม่ใช่ default!)DualCLIPLoader→ clip_l + t5xxl_fp8_e4m3fn, type =fluxVAELoader→ae.safetensorsKSampler→ steps4, cfg1.0, samplereuler, schedulersimple(Flux Schnell เฉพาะ, ต่าง SDXL)CLIPTextEncode(positive) → พิมพ์ prompt ที่อยากลอง
- กด Run → รอ ~10-15 วินาที (รอบแรก model ยังไม่ cache, รอบถัดไปเร็วกว่า)
- ภาพแรกเสร็จ! 🎉
5. Automation ผ่าน script (optional แต่คุ้มยาว)
Code boilerplate ของผม เปิด MIT: → github.com/justnotordinary/justnotordinary-blog/tree/main/scripts
ไฟล์หลัก gen-cover.mjs:
node scripts/gen-cover.mjs --provider=comfyui <slug> "<prompt>"- ตรวจ port 8000 ก่อน → ถ้า Comfy ปิดอยู่ spawn ผ่าน
schtasks(Windows trick ให้ GUI app รันใน user session จาก subprocess context — ตรง spawn ของ Node ไม่ work) - ยิง API ไป
/prompt+ poll/history - Download PNG → sharp compress → WebP q85 (~85 KB)
- Save ใน
tmp-covers/<slug>.webp
แค่นี้ — ไม่ต้องเปิด UI แล้ว คำสั่งเดียว ได้ภาพพร้อมขึ้นเว็บ
TL;DR สำหรับคนรีบ:
- Gemini/Grok image API ไม่ฟรีแล้ว → ย้ายมา local
- ComfyUI Desktop + Flux Schnell fp8 + T5 + CLIP + VAE = 22 GB
- RTX 4060 8GB VRAM รอดเพราะ smart load/unload + fp8 quant
- Directory junction ให้ model อยู่ D:, app อยู่ C:
gen-cover.mjs --provider=comfyuiทำทุกอย่าง auto — ยิง API, compress, save เอง + launch Comfy ผ่านschtasksด้วย- Pitch concept ก่อน gen, อ่าน content ก่อน prompt, self-review ก่อนโชว์
- ฟรี 100% ไม่มี rate limit ไม่มีบิลขึ้น