กลับไปที่บล็อก

การแก้ไขปัญหาคู่มือ

LLM โลคอล VRAM หมด? ดู weights กับ KV cache ด้วย gputaskman

ค้นหาว่าอะไรกินหน่วยความจำ GPU ของคุณเมื่อโมเดล Ollama หรือ llama.cpp พังหรือช้าลง ควรเปลี่ยนการตั้งค่าไหน และเมื่อ API เป็นทางที่ง่ายกว่า

โดย CheapTokens Teamเผยแพร่เมื่อ ใช้เวลาอ่าน 7 นาที

เทอร์มินัลแสดงหน่วยความจำ GPU ที่แบ่งเป็น weights, KV cache และ compute buffers
ในหน้านี้
  1. อะไรกันแน่ที่กิน VRAM ของคุณ
  2. ติดตั้ง gputaskman และดูรายโปรเซส
  3. Weights, KV cache, buffers: ตัวเลขมาจากไหน
  4. หมุนปุ่มไหน
  5. ถ้ามันไม่ทำงาน
  6. เมื่อโมเดลแบบโฮสต์เป็นทางแก้ที่ง่ายกว่า

โมเดลโลคอลของคุณโหลดได้ปกติเมื่อวาน แต่วันนี้กลับพังตอนโหลดหรือช้าอย่างกับหอยทาก และสิ่งเดียวที่คุณเปลี่ยนคือความยาวคอนเท็กซ์ ตัวการที่พบบ่อยคือ KV cache และเครื่องมือเทอร์มินัลฟรีชื่อ gputaskman ช่วยให้คุณเห็นสิ่งนั้นแทนที่จะปล่อยให้คุณเดา

โปรแกรมมอนิเตอร์ GPU ทั่วไปบอกคุณว่า VRAM เต็มแค่ไหน นั่นคือ "อะไร" ไม่ใช่ "ทำไม" README ของ gputaskman (ตรวจสอบเมื่อ 5 พฤศจิกายน 2026) เรียกตัวเองว่า "An htop for what's inside your GPU, not just how full it is." มันเป็นโปรเจกต์ระยะเริ่มต้น ทดลอง และใช้สัญญาอนุญาต MIT ดังนั้นมองมันเป็นเลนส์ที่ handy ไม่ใช่คำตัดสิน

อะไรกันแน่ที่กิน VRAM ของคุณ#

ลองนึกถึง VRAM เป็นกระเป๋าเดินทาง มีสามอย่างที่ใส่เข้าไป:

  • Weights: ตัวโมเดล ขนาดคงที่สำหรับโมเดลและ quantization ที่กำหนด
  • KV cache: ความจำระยะสั้นของโมเดลต่อบทสนทนาของคุณ มันโตขึ้นเมื่อคอนเท็กซ์โตขึ้น
  • Compute buffers: พื้นที่ชั่วคราวที่ runtime ต้องใช้ระหว่างทำงาน

เมื่อคนพูดว่า "โมเดลไม่พอดี" พวกเขามักหมายความว่า weights พอดี แต่ cache ที่คุณขอเพิ่มเข้าไปไม่พอดี ความแตกต่างนี้เป็นตัวกำหนดวิธีแก้ และเป็นสิ่งที่มอนิเตอร์ทั่วไปซ่อนไว้พอดี

เลือกกรณีของคุณ

คุณเห็นอะไร?

พังทันทีตอนโหลด

weights อย่างเดียว หรือ weights บวก cache สำหรับความยาวคอนเท็กซ์ของคุณ มีขนาดใหญ่กว่า VRAM ที่ว่างอยู่ เลือก quantization ที่เล็กลงหรือโมเดลที่เล็กลง หรือลดความยาวคอนเท็กซ์

โหลดได้ แล้วช้าลงหลังจากคุณเพิ่มคอนเท็กซ์

น่าจะเป็นเพราะ KV cache โตขึ้นและงานส่วนหนึ่งไม่พอดีใน VRAM อีกต่อไป มุมมองรายโปรเซสและการแบ่งจะยืนยันได้ ลดความยาวคอนเท็กซ์ก่อน เป็นปุ่มที่ถูกที่สุด

เคยทำงานได้ ตอนนี้พัง

มีโปรเซสอื่นแย่ง VRAM ไป: เกม เบราว์เซอร์ที่เปิด hardware acceleration หรือเซิร์ฟเวอร์โมเดลตัวที่สอง ดูมุมมองรายโปรเซสก่อนแตะโมเดล

ติดตั้ง gputaskman และดูรายโปรเซส#

README ระบุสามวิธี: ZIP แบบพกพาสำหรับ Windows, clone แล้วรันด้วย uv run --locked gputaskman หรือ pip ใน virtual environment ของ Python 3.11+ แพลตฟอร์มตามที่ README อธิบาย:

  • Windows 10/11 64-bit พร้อม GPU NVIDIA หรือ AMD (ZIP สำหรับ x64 และ ARM64 อยู่บนหน้า Releases);
  • Linux และ WSL พร้อม GPU NVIDIA (glibc 2.35+; WSL อ่านตัวนับของโฮสต์ Windows ได้);
  • macOS บน Apple Silicon เฉพาะจาก source clone ไม่มี build แบบพกพา

ZIP สำหรับ Windows ไม่ได้ลงนาม ดาวน์โหลดจากหน้า Releases ของรีโปอย่างเป็นทางการเท่านั้น github.com/shanselman/gputaskman คัดลอกคำสั่งจาก README ตามตัวอักษร โปรเจกต์ยังใหม่และตัวเลือกอาจเปลี่ยนได้

เมื่อรันแล้ว มีสองมุมมองที่สำคัญกับปัญหานี้:

  1. Device view: การใช้ VRAM, กิจกรรม GPU, PCIe, อุณหภูมิ, กำลังไฟ, คล็อก และกราฟประวัติ เหมาะกับคำถาม "มีอะไรพุ่งขึ้นมาไหม?"
  2. Process view: หน่วยความจำ GPU โลคอลต่อโปรเซส, RAM ระบบที่ GPU เข้าถึงได้, กิจกรรมของเอนจิน และ runtime ที่ตรวจพบ (CUDA, HIP, Vulkan, Direct3D, ggml, ONNX Runtime)

ในมุมมองรายโปรเซส ให้หาเซิร์ฟเวอร์โมเดลของคุณ (สำหรับ Ollama คือ runner ที่มาพร้อมกัน) แล้วตรวจส่วนที่เหลือของรายการ ถ้าเบราว์เซอร์หรือเกมถืออยู่หลายกิกะไบต์ คุณก็ได้คำตอบแล้วโดยไม่ต้องแตะโมเดล

Weights, KV cache, buffers: ตัวเลขมาจากไหน#

ตัวตรวจสอบโมเดลแสดงสถาปัตยกรรม quantization และขนาดบัฟเฟอร์เมื่อมีข้อมูล มีข้อควรระวังหนึ่งข้อ: ตาม README นั้น weights, KV cache และ compute buffers มาจาก load log ของ runtime เมื่อเปิด logging ที่เข้ากันได้ สำหรับ llama.cpp ให้เริ่ม llama-server ของคุณเองพร้อม logging (--log-file server.log -lv 4; README ระบุว่าต้องใช้ระดับ 4 สำหรับขนาดบัฟเฟอร์) สำหรับ Ollama นั้น gputaskman ใช้ server.log ของ Ollama ถ้ามี มิฉะนั้นจะเป็น ค่าประมาณ จาก metadata ของ GGUF และขนาดคอนเท็กซ์ โดยสมมติการจัดวางแบบ llama.cpp การบัญชี KV ต่อโมเดลภายในโปรเซสเดียวยังไม่รองรับ

Starting llama-server with a log file
How gputaskman gets buffer sizes from logs instead of estimates

ดังนั้นอ่านการแบ่งที่เป็นค่าประมาณว่า "คร่าว ๆ" และการแบ่งที่อิง log ว่า "สิ่งที่ runtime รายงาน" สำหรับ Ollama นั้น README ระบุว่าตรวจพบ runner ที่มาพร้อมกัน, blob ของ GGUF ถูกตั้งชื่อจาก manifest ของ Ollama และใช้ server.log เมื่อมี การรองรับ LM Studio เป็นบางส่วน: โมเดลถูกตั้งชื่อจากโฟลเดอร์ของมันและตรวจสอบผ่าน API โลคอล แต่ทดสอบด้วย fixture response ไม่ใช่แบบ end to end

คุณยังบันทึก snapshot สองอันเป็น JSON และเปรียบเทียบด้วยคำสั่ง diff ได้ด้วย นั่นเป็นวิธีที่สะอาดในการตอบคำถาม "อะไรเปลี่ยนไปเมื่อผมเปลี่ยนจากคอนเท็กซ์ 4K เป็น 16K?": จับ snapshot หนึ่งครั้ง เปลี่ยนการตั้งค่า โหลดใหม่ จับอีกครั้ง

เช็กด่วน

โมเดลของคุณโหลดได้แต่ช้าลงหลังจากคุณเพิ่มความยาวคอนเท็กซ์ ควรตรวจอะไรก่อน?

แสดงคำตอบ

คำตอบ: KV cache

weights ไม่เปลี่ยนตามความยาวคอนเท็กซ์ แต่ KV cache เปลี่ยน การลดความยาวคอนเท็กซ์ทำให้มันหดลงทันที

หมุนปุ่มไหน#

การอ่านการแบ่งทำให้คุณได้การตัดสินใจ ไม่ใช่แค่ภาพ

Weights คือส่วนที่ใหญ่ เปลี่ยนไปใช้ quantization ที่เล็กลงหรือโมเดลที่เล็กลง นี่คือคันโยกเดียวที่ลด weights ได้ ถ้าอยากได้คณิตศาสตร์เรื่องหน่วยความจำเบื้องหลัง ดู Can a 125B model run on a 16 GB GPU?

KV cache คือส่วนที่ใหญ่ ลดความยาวคอนเท็กซ์ ใน Ollama คุณลองได้เลยในเซสชัน:

text
ollama run <your-model>
>>> /set parameter num_ctx 8192

8192 เป็นเพียงค่าตัวอย่าง เลือกค่าที่งานของคุณต้องการจริง ๆ (คำสั่งตามเอกสารของ Ollama ตรวจสอบเมื่อ 5 พฤศจิกายน 2026)

ถ้าภายหลังคุณเห็นความช้าที่แปลก ๆ ตอนประมวลผล prompt กับ cache แบบ quantized ใน llama.cpp การแก้ไขนี้สำหรับ KV cache แบบ q5_1 คือจุดต่อไป สำหรับสิ่งที่ context window เก็บได้ตั้งแต่แรก อ่าน What is a context window?

โปรเซสอื่นคือส่วนที่ใหญ่ ปิดมัน หรือรันบน GPU แบบ integrated ไม่มีอะไรในโมเดลต้องเปลี่ยน

เช็กลิสต์

ก่อนจะโทษโมเดล

ถ้ามันไม่ทำงาน#

  • การแบ่งดูผิด ตรวจว่ามันเป็นค่าประมาณหรือไม่ (ไม่มี load log ที่เข้ากันได้) กับ llama.cpp ให้รัน llama-server ของคุณด้วย --log-file server.log -lv 4 แล้วโหลดโมเดลใหม่ กับ Ollama นั้น gputaskman ใช้ server.log ถ้ามี ป้ายค่าประมาณเป็นเรื่องปกติตรงนั้น
  • LM Studio แสดงรายละเอียดน้อยลง การรองรับเป็นบางส่วนตามข้างต้น
  • ไม่มี GPU NVIDIA หรือ AMD เครื่องมือนี้ครอบคลุมเฉพาะงาน GPU โลคอล งานแบบ CPU-only, NPU-only และคลาวด์อยู่นอกขอบเขต
  • macOS รันจาก source clone ไม่มี build แบบพกพา

เมื่อโมเดลแบบโฮสต์เป็นทางแก้ที่ง่ายกว่า#

สมมติคุณต้องการคอนเท็กซ์ยาวสำหรับงานหนึ่ง เช่นสรุปเอกสารใหญ่ และ GPU ของคุณใส่โมเดลได้แค่กับคอนเท็กซ์สั้น คุณจะปรับแต่งต่อไปหรือเอา VRAM ออกจากสมการก็ได้ สำหรับงานแบบนั้น CheapTokens เสนอ DeepSeek-V4-Flash: คอนเท็กซ์ 380K เอาต์พุตสูงสุด 32,768 โทเคนต่อคำตอบ ราคาเดียวตลอดทั้งวัน ผ่าน API ที่เข้ากันได้กับ OpenAI GLM-5.3-Flash มีคอนเท็กซ์ 390K และเอาต์พุตสูงสุด 8,192 โทเคน

การเรียกใช้เป็นรูปแบบ OpenAI ปกติ (ใส่คีย์ของคุณใน environment variable):

bash
curl https://api.cheaptokens.dev/v1/chat/completions \
  -H "Authorization: Bearer $CHEAPTOKENS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "deepseek-ai/DeepSeek-V4-Flash-0731", "messages": [{"role": "user", "content": "Summarize this document: ..."}]}'

รายละเอียดการตั้งค่าอยู่ใน docs กฎง่าย ๆ ในการตัดสินใจ: ถ้างานหนึ่งต้องใช้คอนเท็กซ์มากขึ้นหรือโมเดลใหญ่กว่าที่การ์ดของคุณใส่ได้เรื่อย ๆ และมุมมองรายโปรเซสแสดงว่า VRAM ของคุณถูกใช้ไปมากแล้ว ให้ส่งงานนั้นไปที่ API และเก็บงานเล็ก ๆ ที่เร็วไว้โลคอล Run DeepSeek locally or use an API? เจาะลึกเรื่องการแลกเปลี่ยนนี้

สมมติคุณสรุปเอกสารใหญ่ 100 ฉบับ แต่ละฉบับมีอินพุต 60,000 โทเคนและเอาต์พุต 1,000 โทเคน (อยู่ในหน้าต่าง 380K ได้สบาย) นี่คือค่าใช้จ่ายวันนี้:

โมเดล ต่อคำขอ 100 คำขอ OpenRouter, 100 คำขอ
GLM-5.3-Flash $0.0012 $0.124 $0.209
DeepSeek-V4-Flash $0.001 $0.10 $0.434
MiniMax-M2.7 $0.0032 $0.315 $3.78

60,000 โทเค็นอินพุตและ 1,000 โทเค็นเอาต์พุตต่อคำขอ ราคาต่อ 1M โทเค็นเป็นราคาปัจจุบันและเปลี่ยนแปลงไปพร้อมกับอัตราค่าบริการของเรา คอลัมน์ OpenRouter แสดงราคาอ้างอิงสำหรับปริมาณงานเดียวกัน

จากตัวเลขเหล่านั้น $0.001 ต่อเอกสารคือราคาจริงสำหรับการเรียกหนึ่งครั้ง และโดยรวมเมื่อนับอินพุตและเอาต์พุตรวมกัน ต่ำกว่า OpenRouter

เครื่องคำนวณค่าใช้จ่าย

แบตช์ของคุณเอง: เปลี่ยนโทเคนและจำนวนคำขอ

โทเค็นอินพุตต่อคำขอ: 60,000 · โทเค็นเอาต์พุตต่อคำขอ: 1,000 · คำขอต่อวัน: 100

โมเดลต่อวันต่อเดือน
GLM-5.3-Flash$0.124$3.72
DeepSeek-V4-Flash$0.10$3.00
MiniMax-M2.7$0.315$9.45