1156 คำ
6 นาที
เมื่ออยากทำ Image Gen AI บนเครื่องเอง!
สารบัญ

เคยมั้ยครับ อยากได้ภาพ 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-fp817 GBเชฟหลัก ปั้นภาพจาก noise
t5xxl_fp85 GBอ่าน prompt ยาวๆ เข้าใจ context
clip_l250 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 ชุดเดียว:

Terminal window
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:#fff

VRAM 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:

Terminal window
# 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):

  1. 📖 อ่าน content จริงก่อน — ไม่ใช่แค่ดูชื่อบท
  2. 💡 Pitch concept 2-3 ทางให้ผู้เขียนเลือก ก่อน gen prompt
  3. 🎯 Cover = universally recognizable — ต้องจำได้ทันทีว่าเรื่องอะไร (padlock = security, server rack = architecture, Kanban = PM)
  4. 🎨 Analogies (โดมิโน่, ห้องครัว, เรือดำน้ำ) ใส่ inline ได้ แต่ไม่ใช่ cover
  5. 👁 Self-review ภาพทุกตัว — regen ถ้าอ่อน ก่อนโชว์ผู้เขียน
  6. 🌈 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:, model 22GB บน D: เชื่อมด้วย directory junction

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 รวม)#

Terminal window
mkdir D:\LLM\comfyui\models\diffusion_models, D:\LLM\comfyui\models\clip, D:\LLM\comfyui\models\vae, D:\LLM\comfyui\models\loras

โหลดจาก HuggingFace (ไม่ต้อง login):

FileSizeURL (HuggingFace)
flux1-schnell-fp8.safetensors17 GBComfy-Org/flux1-schnell/resolve/main/flux1-schnell-fp8.safetensorsdiffusion_models/
clip_l.safetensors250 MBcomfyanonymous/flux_text_encoders/resolve/main/clip_l.safetensorsclip/
t5xxl_fp8_e4m3fn.safetensors5 GBcomfyanonymous/flux_text_encoders/resolve/main/t5xxl_fp8_e4m3fn.safetensorsclip/
ae.safetensors350 MBComfy-Org/Lumina_Image_2.0_Repackaged/resolve/main/split_files/vae/ae.safetensorsvae/

เต็ม URL prefix https://huggingface.co/ ใช้ curl -L -O หรือ IDM / aria2c (multi-thread เร็วกว่า browser 3-5 เท่า)

3. ผูก C: → D: ด้วย Windows directory junction#

เปิด PowerShell → รัน script นี้ครั้งเดียว:

Terminal window
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:
    • UNETLoaderflux1-schnell-fp8.safetensors, weight_dtype = fp8_e4m3fn (ไม่ใช่ default!)
    • DualCLIPLoader → clip_l + t5xxl_fp8_e4m3fn, type = flux
    • VAELoaderae.safetensors
    • KSamplersteps 4, cfg 1.0, sampler euler, scheduler simple (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:

Terminal window
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 ไม่มีบิลขึ้น