การสร้าง LLM API ที่มีประสิทธิภาพสูงและพร้อมใช้งานจริงด้วย FastAPI: คู่มือทีละขั้นตอน
การสร้าง LLM API ที่มีประสิทธิภาพสูงและพร้อมใช้งานจริงด้วย FastAPI: คู่มือทีละขั้นตอน
FastAPI ในฐานะเฟรมเวิร์ก Python Web ที่ทันสมัยและมีประสิทธิภาพสูง ได้รับความนิยมอย่างมากเนื่องจากใช้งานง่าย รวดเร็ว และสร้างเอกสาร API โดยอัตโนมัติ โดยเฉพาะอย่างยิ่งในการสร้าง API ส่วนหลังสำหรับแอปพลิเคชัน LLM (Large Language Model) FastAPI แสดงให้เห็นถึงข้อได้เปรียบที่แข็งแกร่ง บทความนี้จะสอนคุณทีละขั้นตอนเกี่ยวกับวิธีสร้าง LLM API ที่พร้อมใช้งานจริงด้วย FastAPI และสำรวจแนวทางปฏิบัติที่ดีที่สุด
ทำไมต้องเลือก FastAPI
เมื่อสร้าง API สำหรับแอปพลิเคชัน LLM, FastAPI มีข้อได้เปรียบที่สำคัญดังต่อไปนี้:
- ประสิทธิภาพสูง: จาก ASGI, FastAPI สามารถจัดการคำขอพร้อมกันจำนวนมาก ซึ่งมีความสำคัญอย่างยิ่งสำหรับแอปพลิเคชัน LLM ที่ต้องการการตอบสนองที่รวดเร็ว
- รองรับ Asynchronous: FastAPI มีการรองรับคีย์เวิร์ด
asyncและawaitในตัว ทำให้ง่ายต่อการจัดการการดำเนินการแบบอะซิงโครนัส เช่น การเรียกใช้ LLM inference เพื่อหลีกเลี่ยงการบล็อก main thread - เอกสาร API อัตโนมัติ: FastAPI ใช้ OpenAPI และ JSON Schema เพื่อสร้างเอกสาร API แบบโต้ตอบ (Swagger UI) โดยอัตโนมัติ ทำให้ผู้พัฒนาสามารถทดสอบและใช้งาน API ของคุณได้อย่างสะดวก
- การตรวจสอบข้อมูล: FastAPI ใช้ Pydantic สำหรับการตรวจสอบข้อมูล เพื่อให้มั่นใจในความถูกต้องของพารามิเตอร์คำขอ และลดข้อผิดพลาด
- Dependency Injection: ระบบ Dependency Injection ของ FastAPI สามารถจัดการและแชร์ทรัพยากรได้อย่างสะดวก เช่น โมเดล LLM
- ชุมชนที่กระตือรือร้น: FastAPI มีชุมชนขนาดใหญ่และกระตือรือร้น ซึ่งสามารถเข้าถึงทรัพยากรและการสนับสนุนมากมาย
สิ่งที่ต้องเตรียม
-
ติดตั้ง Python: ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง Python 3.7 หรือสูงกว่า
-
ติดตั้ง FastAPI และ Uvicorn: ใช้ pip เพื่อติดตั้ง FastAPI และ Uvicorn (ASGI server):
pip install fastapi uvicorn -
เลือกโมเดล LLM: เลือกโมเดล LLM ที่คุณต้องการใช้ อาจเป็นโมเดลของ OpenAI หรือโมเดลโอเพนซอร์ส เช่น TinyLlama หากเลือก OpenAI คุณจะต้องได้รับ OpenAI API key หากเลือก TinyLlama คุณจะต้องดาวน์โหลดไฟล์โมเดล
ขั้นตอนที่ 1: สร้างแอปพลิเคชัน FastAPI
สร้างไฟล์ชื่อ main.py และเพิ่มโค้ดต่อไปนี้:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI(title="LLM API", description="A simple API for interacting with LLMs.")
class InputText(BaseModel):
text: str
class OutputText(BaseModel):
generated_text: str
โค้ดนี้กำหนดแอปพลิเคชัน FastAPI และกำหนดโมเดล Pydantic สองตัว: InputText ใช้สำหรับรับข้อความอินพุต และ OutputText ใช้สำหรับส่งคืนข้อความที่สร้างขึ้น
ขั้นตอนที่ 2: เพิ่มตรรกะ LLM Inference
ตามโมเดล LLM ที่คุณเลือก ให้เพิ่มตรรกะ inference ที่เกี่ยวข้อง ที่นี่จะใช้ OpenAI API เป็นตัวอย่าง:
import openai
import os
# รับ OpenAI API key
openai.api_key = os.environ.get("OPENAI_API_KEY") # แนะนำให้ใช้ตัวแปรสภาพแวดล้อม
@app.post("/generate", response_model=OutputText)
async def generate_text(input_text: InputText):
"""
Generates text based on the input text using OpenAI.
"""
try:
response = openai.Completion.create(
engine="text-davinci-003", # เลือกโมเดล
prompt=input_text.text,
max_tokens=150,
n=1,
stop=None,
temperature=0.7,
)
generated_text = response.choices[0].text.strip()
return OutputText(generated_text=generated_text)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
โค้ดนี้กำหนดเส้นทาง /generate ซึ่งรับออบเจ็กต์ InputText เป็นอินพุต เรียกใช้ OpenAI API เพื่อสร้างข้อความ และส่งคืนข้อความที่สร้างขึ้นเป็นออบเจ็กต์ OutputText โปรดทราบว่าให้แทนที่ text-davinci-003 ด้วยโมเดลที่เหมาะสมที่คุณเลือก
หากใช้โมเดลโลคัลเช่น TinyLlama คุณจะต้องติดตั้งไลบรารีที่เกี่ยวข้อง เช่น transformers และโหลดโมเดลลงในหน่วยความจำ ตัวอย่างโค้ดมีดังนี้:
from transformers import pipeline
import torch
generator = pipeline('text-generation', model="TinyLlama/TinyLlama-1.1B-Chat-v1.0", torch_dtype=torch.bfloat16, device_map="auto")
@app.post("/generate", response_model=OutputText)
async def generate_text(input_text: InputText):
"""
Generates text based on the input text using TinyLlama.
"""
try:
generated_text = generator(input_text.text, max_length=50, do_sample=True, temperature=0.7)[0]['generated_text']
return OutputText(generated_text=generated_text)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
ขั้นตอนที่ 3: เรียกใช้แอปพลิเคชัน FastAPI
เรียกใช้แอปพลิเคชัน FastAPI โดยใช้ Uvicorn:
uvicorn main:app --reload
```นี่จะเริ่มต้นเซิร์ฟเวอร์ภายในเครื่อง ซึ่งคุณสามารถเข้าถึงได้ในเบราว์เซอร์ที่ `http://127.0.0.1:8000/docs` เพื่อดูเอกสาร API ที่สร้างขึ้นโดยอัตโนมัติ พารามิเตอร์ `--reload` สามารถรีสตาร์ทเซิร์ฟเวอร์โดยอัตโนมัติหลังจากแก้ไขโค้ด ซึ่งสะดวกสำหรับการพัฒนา
## ขั้นตอนที่ 4: ทดสอบ API
ใช้เอกสาร API หรือเครื่องมือเช่น curl เพื่อทดสอบ API ของคุณ ตัวอย่างเช่น ใช้ curl เพื่อส่งคำขอ POST:
```bash
curl -X POST -H "Content-Type: application/json" -d '{"text": "Tell me a joke about cats."}' http://127.0.0.1:8000/generate
คุณควรจะได้รับการตอบกลับ JSON ที่มีข้อความที่สร้างขึ้น
ขั้นตอนที่ 5: การปรับใช้ใน Production
ปรับใช้แอปพลิเคชัน FastAPI ของคุณในสภาพแวดล้อม Production เช่น:
- Docker: ใช้ Docker เพื่อ Containerize แอปพลิเคชันของคุณ เพื่อความสะดวกในการปรับใช้และการจัดการ
- Cloud Platform: ปรับใช้ไปยัง Cloud Platform เช่น AWS, Google Cloud Platform หรือ Azure Azure Cosmos DB และ Azure Functions ที่กล่าวถึงในบทความสามารถใช้เพื่อสร้าง serverless API ได้ Modal ยังสามารถใช้เพื่อปรับใช้แอปพลิเคชัน FastAPI ที่ปรับขนาดอัตโนมัติได้
- เซิร์ฟเวอร์: ปรับใช้ไปยังเซิร์ฟเวอร์ของคุณเอง
แนวทางปฏิบัติที่ดีที่สุด
- ใช้ตัวแปรสภาพแวดล้อมเพื่อจัดเก็บข้อมูลที่ละเอียดอ่อน: อย่า Hardcode ข้อมูลที่ละเอียดอ่อน เช่น คีย์ API ในโค้ด แต่ให้ใช้ตัวแปรสภาพแวดล้อมแทน
- เพิ่มการบันทึก: ใช้โมดูลการบันทึกเพื่อบันทึกสถานะการทำงานของ API เพื่อความสะดวกในการดีบักและการตรวจสอบ
- เพิ่มการจัดการข้อผิดพลาด: ใช้บล็อก
try...exceptเพื่อจัดการกับข้อยกเว้นที่อาจเกิดขึ้น และส่งคืนข้อมูลข้อผิดพลาดที่เหมาะสม - การจำกัดอัตรา: ใช้ตัวจำกัดอัตราเพื่อป้องกันการใช้งาน API ในทางที่ผิด FastAPI มีไลบรารีจำกัดอัตราสำเร็จรูปบางส่วนให้ใช้งาน
- แคช: สำหรับคำขอที่ซ้ำกัน คุณสามารถใช้แคชเพื่อปรับปรุงประสิทธิภาพ
- การตรวจสอบ: ใช้เครื่องมือตรวจสอบเพื่อตรวจสอบประสิทธิภาพและความพร้อมใช้งานของ API
เคล็ดลับขั้นสูง
- การประมวลผลแบบอะซิงโครนัส: สำหรับการอนุมาน LLM ที่ใช้เวลานาน ให้ใช้คีย์เวิร์ด
asyncและawaitเพื่อประมวลผลแบบอะซิงโครนัส เพื่อหลีกเลี่ยงการบล็อก Main Thread - การตอบสนองแบบสตรีมมิ่ง: การใช้ StreamingResponse สามารถส่งคืนข้อความที่สร้างขึ้นแบบเรียลไทม์ ซึ่งจะช่วยปรับปรุงประสบการณ์ของผู้ใช้
- Multithreading/Multiprocessing: สำหรับการอนุมาน LLM ที่ใช้ CPU อย่างหนัก คุณสามารถใช้ Multithreading หรือ Multiprocessing เพื่อปรับปรุงประสิทธิภาพ
- การเร่งความเร็วด้วย GPU: หากโมเดล LLM ของคุณรองรับการเร่งความเร็วด้วย GPU คุณสามารถใช้ CUDA หรือไลบรารีการเร่งความเร็วด้วย GPU อื่นๆ เพื่อเพิ่มความเร็วในการอนุมาน





