ในโปรเจกต์ล่าสุดที่ผมพัฒนา 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 คือ:

การติดตั้ง 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 เ�