ในโปรเจกต์ล่าสุดที่ผมพัฒนา AI Agent สำหรับองค์กร พบว่าการใช้งาน API จากเซิร์ฟเวอร์ภายนอกในบางสถานการณ์มีข้อจำกัดเรื่องความเป็นส่วนตัวของข้อมูล ความหน่วง (Latency) และค่าใช้จ่าย โดยเฉพาะเมื่อต้องประมวลผลข้อมูลจำนวนมาก ผมจึงหันมาสร้าง LocalAI ที่สามารถใช้งานได้ทันทีกับโค้ดเดิมที่เคยใช้กับ OpenAI API
บทความนี้จะอธิบายวิธีการตั้งค่า LocalAI Server แบบเต็มรูปแบบ พร้อมตัวอย่างโค้ดที่ใช้งานได้จริง และวิธีแก้ไขปัญหาที่ผมเจอมาด้วยตัวเอง
LocalAI คืออะไร และทำไมต้องใช้
LocalAI เป็นโปรเจกต์ Open Source ที่ทำหน้าที่เป็น REST API Server สำหรับ Inference แบบ Local โดยมี API Interface ที่เข้ากันได้กับ OpenAI API อย่างสมบูรณ์ หมายความว่าโค้ดที่ใช้กับ OpenAI สามารถนำมาใช้กับ LocalAI ได้เลยโดยแทบไม่ต้องแก้ไข
ข้อดีหลักของการใช้ LocalAI คือ:
- ความเป็นส่วนตัวของข้อมูล — ข้อมูลทั้งหมดประมวลผลบนเครื่องของคุณเอง
- ลดความหน่วง — ลดความหน่วงได้ถึง 80-90% เมื่อเทียบกับการเรียก API ภายนอก
- ประหยัดค่าใช้จ่าย — ไม่ต้องจ่ายค่า API ต่อ Token เมื่อใช้งานในองค์กร
- ใช้ GPU เครื่องคุณเอง — ความสามารถในการประมวลผลขึ้นอยู่กับ Hardware ที่มี
การติดตั้ง LocalAI บน Ubuntu/Linux
ผมแนะนำให้ติดตั้งบน Ubuntu 22.04 LTS ขึ้นไปเพื่อความเสถียรของ Driver และ Library ต่างๆ ขั้นตอนมีดังนี้:
1. ติดตั้ง NVIDIA Driver และ CUDA Toolkit
ก่อนอื่นต้องตรวจสอบว่ามี NVIDIA GPU และ Driver ที่รองรับ ผมใช้คำสั่งนี้ในการตรวจสอบ:
# ตรวจสอบ NVIDIA Driver
nvidia-smi
ผลลัพธ์ที่คาดหวัง:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.54.03 Driver Version: 535.54.03 CUDA Version: 12.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... 67C P0 250W / 350W | 18456MiB / 24576MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
2. ติดตั้ง Docker และ Docker Compose
# ติดตั้ง Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
ติดตั้ง Docker Compose
sudo apt update
sudo apt install docker-compose -y
เพิ่มสิทธิ์ให้ User ปัจจุบัน
sudo usermod -aG docker $USER
newgrp docker
3. สร้าง docker-compose.yml สำหรับ LocalAI
version: '3.8'
services:
localai:
image: quay.io/go-skynet/local-ai:latest
container_name: localai_server
ports:
- "8080:8080"
environment:
- DEBUG=true
- REBUILD=false
- CONTEXT_SIZE=4096
- MODELS_PATH=/models
- THREADS=8
- CONTEXT_SIZE=8192
- GPU_LAYERS=50
volumes:
- ./models:/models
- ./data:/tmp/data
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
restart: always
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 5
4. ดาวน์โหลดโมเดลและเริ่มต้น Server
# สร้างโฟลเดอร์สำหรับเก็บโมเดล
mkdir -p ~/localai/models
cd ~/localai
ดาวน์โหลดโมเดล Llama 2 (7B-chat) ตัวอย่าง
ขนาดประมาณ 13GB
wget -O models/llama-2-7b-chat.gguf \
"https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF/main/llama-2-7b-chat.Q4_K_M.gguf"
เริ่มต้น Container
docker-compose up -d
ตรวจสอบสถานะ
docker logs -f localai_server
ทดสอบ Health Check
curl http://localhost:8080/health
การใช้งาน Python Client กับ LocalAI
ส่วนนี้คือหัวใจสำคัญของบทความ ผมจะแสดงวิธีเปลี่ยนจาก OpenAI API มาใช้ LocalAI แทน ด้วยการเปลี่ยนแค่ base_url เท่านั้น
ตัวอย่าง Chat Completion
# -*- coding: utf-8 -*-
"""
ตัวอย่างการใช้งาน LocalAI กับ OpenAI Python Client
หลังจากติดตั้ง: pip install openai
"""
from openai import OpenAI
สำหรับ LocalAI Server ที่รันบน localhost
localai_client = OpenAI(
base_url="http://localhost:8080/v1",
api_key="not-needed" # LocalAI ไม่ต้องการ API Key
)
สร้าง Chat Completion
response = localai_client.chat.completions.create(
model="llama-2-7b-chat", # ชื่อโมเดลที่ดาวน์โหลดมา
messages=[
{"role": "system", "content": "คุณเป็นผู้ช่วย AI ภาษาไทย"},
{"role": "user", "content": "อธิบายเรื่อง Machine Learning แบบง่ายๆ"}
],
temperature=0.7,
max_tokens=500
)
print(response.choices[0].message.content)
ตัวอย่าง Streaming Response
# -*- coding: utf-8 -*-
"""
การใช้งาน Streaming กับ LocalAI
เหมาะสำหรับ Chat Interface ที่ต้องการแสดงผลแบบ Real-time
"""
from openai import OpenAI
localai_client = OpenAI(
base_url="http://localhost:8080/v1",
api_key="not-needed"
)
Streaming Response
stream = localai_client.chat.completions.create(
model="llama-2-7b-chat",
messages=[
{"role": "user", "content": "เขียนโค้ด Python สำหรับ Bubble Sort"}
],
stream=True,
temperature=0.3
)
แสดงผลทีละ Token
print("กำลังสร้างคำตอบ: ", end="", flush=True)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
print() # ขึ้นบรรทัดใหม่เมื่อจบ
การปรับแต่ง Performance และ Memory
จากประสบการณ์ที่ผมใช้งาน LocalAI มาพักใหญ่ พบว่าการปรับแต่ง Parameter ถูกต้องสามารถเพิ่มความเร็วได้ถึง 3-5 เท่า
Environment Variables ที่สำคัญ
# ตัวอย่าง .env file สำหรับ Performance สูงสุด
ขนาด Context (หน่วย Tokens)
CONTEXT_SIZE=8192
จำนวน Threads สำหรับ CPU Processing
THREADS=16
จำนวน Layers ที่โหลดลง GPU
ควรตั้งค่าเท่ากับจำนวน Layers ของโมเดล
Llama 2 7B มี 32 layers ให้ตั้ง GPU_LAYERS=32
GPU_LAYERS=32
ปรับ Memory Allocation
F16_ENABLED=true
N_PARALLEL=4
Enable CUDA Acceleration
BACKEND=cublas
คำสั่งตรวจสอบ Resource Usage
# ตรวจสอบ GPU Memory Usage
nvidia-smi
ตรวจสอบ Container Memory
docker stats localai_server
ดู Logs แบบ Real-time
docker logs -f --tail 100 localai_server
วัดความหน่วง (Latency) ของ API
curl -w "\nTime: %{time_total}s\n" \
-X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"llama-2-7b-chat","messages":[{"role":"user","content":"ทดสอบ"}]}'
ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข
1. ConnectionError: [Errno 111] Connection refused
อาการ: เมื่อเรียก API แล้วได้รับ Error Connection refused หมายความว่า LocalAI Server ไม่ได้รันอยู่หรือ Container ล้มเหลว
# วิธีแก้ไข:
1. ตรวจสอบสถานะ Container
docker ps -a | grep localai
2. ถ้าหยุดทำงาน ให้ดู Logs หาสาเหตุ
docker logs localai_server
3. Restart Container
docker restart localai_server
4. รอสักครู่แล้วทดสอบใหม่
sleep 10
curl http://localhost:8080/health
2. OutOfMemoryError: CUDA out of memory
อาการ: GPU Memory เต็ม ทำให้โมเดลไม่สามารถโหลดได้ มักเกิดกับโมเดลขนาดใหญ่ที่มี GPU VRAM ไม่พอ
# วิธีแก้ไข:
1. ใช้โมเดลขนาดเล็กลง
เปลี่ยนจาก Q4_K_M เป็น Q5_K_S หรือ Q8_0
หรือใช้โมเดล 3B แทน 7B
2. ลด GPU_LAYERS
แก้ไขใน docker-compose.yml
environment:
- GPU_LAYERS=20 # แทน 32
3. ใช้โมเดล Quantized แบบ GGUF
แนะนำ Q4_K_M สำหรับ Balance ระหว่างคุณภาพและ Memory
4. Restart หลังแก้ไข
docker-compose down && docker-compose up -d
3. Model not found / 404 Not Found
อาการ: เรียก API แล้วได้ Response ว่าโมเดลไม่พบ ทั้งที่ดาวน์โหลดมาแล้ว
# วิธีแก้ไข:
1. ตรวจสอบชื่อโมเดลในโฟลเดอร์
ls -la ~/localai/models/
2. ตรวจสอบชื่อที่ LocalAI รู้จัก
curl http://localhost:8080/v1/models
3. สร้างไฟล์ config.yaml ในโฟลเดอร์โมเดล
เช่น สร้าง models/llama-2-7b-chat.yaml
cat > ~/localai/models/llama-2-7b-chat.yaml << 'EOF'
name: llama-2-7b-chat
backend: llama
parameters:
model: llama-2-7b-chat.gguf
context_size: 4096
f16: true
threads: 8
gpu_layers: 32
EOF
4. Restart Container
docker-compose restart
4. 401 Unauthorized เมื่อใช้กับ OpenAI Client
อาการ: แม้จะใช้ LocalAI แต่ได้รับ Error 401 ซึ่งเกิดจากการตั้งค่า API Key ไม่ถูกต้อง
# วิธีแก้ไข:
1. กรณีใช้ LocalAI เ�