Ollama keep_alive: ปัญหาโมเดลโหลดซ้ำ 214 ครั้งต่อวัน
เจาะลึกปัญหา Ollama โหลดโมเดลซ้ำ 214 ครั้งจาก 1,180 คำขอต่อวันเพราะค่า keep_alive พร้อมแนวทางแก้ไขให้แชทบอทกลับมาเร็ว

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- ค่าเริ่มต้น keep_alive ของ Ollama คือ 5 นาที ซึ่งเร็วเกินไปสำหรับงานที่มีทราฟฟิกแบบประปราย
- การส่ง keep_alive ผ่าน OpenAI SDK ใช้งานไม่ได้ในบางเวอร์ชันเนื่องจากชั้นความเข้ากันได้
- การตั้งค่า keep_alive เป็น -1 ทำให้โมเดลถูกแบ่งไปรันบน CPU ส่งผลให้ความเร็วลดลงเหลือ 6 โทเค็นต่อวินาที
- การตั้งค่า OLLAMA_KEEP_ALIVE=24h ที่ฝั่งเซิร์ฟเวอร์ช่วยแก้ปัญหาโมเดลโหลดซ้ำได้อย่างถาวร
นักพัฒนาซอฟต์แวร์รายหนึ่งพบปัญหาแอปพลิเคชันแชทท้องถิ่นของตนเองทำงานเร็วมากตอนทดสอบ แต่กลับช้าผิดปกติระหว่างใช้งานจริง หลังจากปล่อยปัญหานี้ทิ้งไว้หลายสัปดาห์จึงเริ่มตรวจสอบอย่างจริงจังด้วยการบันทึกเวลาของทุกคำขอตลอด 24 ชั่วโมง ซึ่งพบสถิติที่น่าตกใจว่ามีคำขอทั้งหมด 1,180 ครั้ง แต่เกิดเหตุการณ์โหลดโมเดลซ้ำจากดิสก์สูงถึง 214 ครั้ง หรือคิดเป็นอัตราส่วนการโหลดใหม่ 1 ครั้งทุกๆ 5.5 คำขอ
สาเหตุหลักมาจากค่าเริ่มต้นของ Ollama ที่กำหนด keep_alive ไว้เพียง 5 นาที หากไม่มีการรับส่งข้อมูลภายในช่วงเวลานี้ ตัวรันจะปิดตัวลงและน้ำหนักของโมเดลจะถูกลบออกจากหน่วยความจำ VRAM ทำให้คำขอถัดไปต้องอ่านข้อมูลหลายกิกะไบต์จากดิสก์ใหม่อีกครั้ง ซึ่งนี่คือค่าเริ่มต้นที่แย่มากสำหรับโปรเจกต์ส่วนตัวที่มีการใช้งานแบบเป็นช่วงๆ

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
การตรวจสอบสถานะทำได้ง่ายๆ ด้วยคำสั่ง ollama ps หากแสดงผลว่างเปล่าแสดงว่าโมเดลไม่ได้รันอยู่บนหน่วยความจำ นอกจากนี้ยังสามารถตรวจสอบจำนวนการโหลดผ่านล็อกของเซิร์ฟเวอร์ เช่น บน Linux สามารถใช้คำสั่ง journalctl -u ollama --since "24 hours ago" | grep -ci "llama runner started" เพื่อดูจำนวนครั้งที่เกิดขึ้นจริงในหนึ่งวัน
การเข้าใจกลไกการจัดการหน่วยความจำของ Ollama เป็นสิ่งสำคัญสำหรับนักพัฒนาที่รันโมเดลภาษาขนาดใหญ่ (LLM) บนฮาร์ดแวร์จำกัด การที่โมเดลต้องถูกสลับเข้าออกระหว่างดิสก์และ VRAM บ่อยครั้งไม่เพียงแต่เพิ่มเวลา Latency แต่ยังทำให้อุปกรณ์สึกหรอเร็วขึ้นจากการอ่านเขียนข้อมูลปริมาณมาก การกำหนดค่าสิ่งแวดล้อม (Environment Variables) ให้ถูกต้องจึงช่วยเพิ่มประสิทธิภาพระบบได้อย่างมหาศาลโดยไม่ต้องเปลี่ยนฮาร์ดแวร์
ความผิดพลาดอีกประการหนึ่งคือการพยายามส่งพารามิเตอร์ keep_alive ผ่าน OpenAI SDK ที่ชี้ไปยังพับลิก /v1 เนื่องจากชั้นความเข้ากันได้ในเวอร์ชันนั้นตัดพารามิเตอร์ดังกล่าวทิ้ง ส่งผลให้ค่าไม่เปลี่ยนแปลง ในขณะเดียวกัน การตั้งค่า keep_alive เป็น -1 เพื่อให้อยู่ในหน่วยความจำตลอดเวลาก็สร้างปัญหาใหม่ เมื่อรันโมเดลขนาด 8B และ 14B พร้อมกันบนฮาร์ดแวร์ที่มี VRAM 16GB ทำให้โมเดลขนาด 14B ต้องแบ่งบางส่วนไปประมวลผลบน CPU ส่งผลให้ความเร็วตกลงจาก 42 โทเค็นต่อวินาทีเหลือเพียง 6 โทเค็นต่อวินาที
แนวทางแก้ไขที่ได้ผลดีที่สุดเรียงตามลำดับความสำคัญมีดังนี้:
- กำหนดค่าเซิร์ฟเวอร์ด้วยตัวแปรสภาพแวดล้อม OLLAMA_KEEP_ALIVE=24h ในไฟล์ระบบ
- ให้มีโมเดลหลักอยู่ในหน่วยความจำ GPU เพียงตัวเดียวเพื่อหลีกเลี่ยงการแย่งทรัพยากร
- แยกกระบวนการสร้าง Embedding ไปรันบนอินสแตนซ์ที่ใช้เฉพาะ CPU เพื่อไม่ให้แย่ง VRAM
- ยกเลิกสคริปต์ Cron ที่คอยส่งคำขอปลุกโมเดลทุกๆ 4 นาที เพราะตัวแปร keep_alive จัดการเรื่องนี้ได้ดีกว่า
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น