Hướng dẫn từng bước: Xây dựng API LLM hiệu suất cao, sẵn sàng cho sản xuất bằng FastAPI
# Hướng dẫn từng bước: Xây dựng API LLM hiệu suất cao, sẵn sàng cho sản xuất bằng FastAPI
FastAPI, một framework web Python hiện đại, hiệu suất cao, được ưa chuộng vì tính dễ sử dụng, tốc độ và tài liệu API tự động tạo. Đặc biệt, FastAPI thể hiện những ưu điểm mạnh mẽ trong việc xây dựng API backend cho các ứng dụng LLM (Large Language Model). Bài viết này sẽ hướng dẫn bạn từng bước cách sử dụng FastAPI để xây dựng một API LLM sẵn sàng cho sản xuất và khám phá một số phương pháp hay nhất.
## Tại sao chọn FastAPI?
Khi xây dựng API cho các ứng dụng LLM, FastAPI cung cấp những lợi thế chính sau:
* **Hiệu suất cao:** Dựa trên ASGI, FastAPI có thể xử lý các yêu cầu đồng thời cao, điều này rất quan trọng đối với các ứng dụng LLM cần phản hồi nhanh.
* **Hỗ trợ bất đồng bộ:** FastAPI tích hợp sẵn hỗ trợ cho các từ khóa `async` và `await`, giúp dễ dàng xử lý các thao tác bất đồng bộ, chẳng hạn như gọi suy luận LLM, tránh chặn luồng chính.
* **Tài liệu API tự động:** FastAPI sử dụng OpenAPI và JSON Schema để tự động tạo tài liệu API tương tác (Swagger UI), giúp các nhà phát triển dễ dàng kiểm tra và sử dụng API của bạn.
* **Xác thực dữ liệu:** FastAPI sử dụng Pydantic để xác thực dữ liệu, đảm bảo tính chính xác của các tham số yêu cầu, giảm thiểu lỗi.
* **Dependency Injection:** Hệ thống dependency injection của FastAPI giúp dễ dàng quản lý và chia sẻ tài nguyên, chẳng hạn như mô hình LLM.
* **Cộng đồng năng động:** FastAPI có một cộng đồng lớn và năng động, nơi bạn có thể nhận được nhiều tài nguyên và hỗ trợ.
## Chuẩn bị
1. **Cài đặt Python:** Đảm bảo bạn đã cài đặt Python 3.7 trở lên.
2. **Cài đặt FastAPI và Uvicorn:** Sử dụng pip để cài đặt FastAPI và Uvicorn (máy chủ ASGI):
```bash
pip install fastapi uvicorn
- Chọn mô hình LLM: Chọn mô hình LLM bạn muốn sử dụng. Có thể là mô hình của OpenAI hoặc mô hình nguồn mở, chẳng hạn như TinyLlama. Nếu bạn chọn OpenAI, bạn cần lấy khóa API OpenAI. Nếu bạn chọn TinyLlama, bạn cần tải xuống tệp mô hình.
Bước 1: Tạo ứng dụng FastAPI
Tạo một tệp có tên main.py và thêm mã sau:
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
Đoạn mã này định nghĩa một ứng dụng FastAPI và định nghĩa hai mô hình Pydantic: InputText để nhận văn bản đầu vào và OutputText để trả về văn bản được tạo.
Bước 2: Thêm logic suy luận LLM
Dựa trên mô hình LLM bạn đã chọn, hãy thêm logic suy luận tương ứng. Ở đây, chúng ta lấy ví dụ sử dụng OpenAI API:
import openai
import os
# Lấy khóa API OpenAI
openai.api_key = os.environ.get("OPENAI_API_KEY") # Nên sử dụng biến môi trường
```@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", # Chọn model
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))
Đoạn code này định nghĩa một route /generate, nó nhận một đối tượng InputText làm đầu vào, gọi OpenAI API để tạo văn bản và trả về văn bản đã tạo dưới dạng đối tượng OutputText. Lưu ý thay thế text-davinci-003 bằng model phù hợp mà bạn chọn.
Nếu sử dụng các model cục bộ như TinyLlama, bạn cần cài đặt các thư viện tương ứng, ví dụ: transformers, và tải model vào bộ nhớ. Ví dụ code như sau:
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))
Bước 3: Chạy ứng dụng FastAPI
Sử dụng Uvicorn để chạy ứng dụng FastAPI:
uvicorn main:app --reload
```Điều này sẽ khởi động một máy chủ cục bộ, bạn có thể truy cập `http://127.0.0.1:8000/docs` trong trình duyệt để xem tài liệu API được tạo tự động. Tham số `--reload` có thể tự động khởi động lại máy chủ sau khi sửa đổi mã, thuận tiện cho việc phát triển.
## Bước 4: Kiểm tra API
Sử dụng tài liệu API hoặc các công cụ như curl để kiểm tra API của bạn. Ví dụ: sử dụng curl để gửi yêu cầu 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
Bạn sẽ nhận được phản hồi JSON chứa văn bản đã tạo.
Bước 5: Triển khai sản xuất
Triển khai ứng dụng FastAPI của bạn vào môi trường sản xuất, ví dụ:
- Docker: Sử dụng Docker để container hóa ứng dụng của bạn, giúp triển khai và quản lý dễ dàng hơn.
- Nền tảng đám mây: Triển khai lên nền tảng đám mây, ví dụ như AWS, Google Cloud Platform hoặc Azure. Azure Cosmos DB và Azure Functions được đề cập trong bài viết có thể được sử dụng để xây dựng API serverless. Modal cũng có thể được sử dụng để triển khai các ứng dụng FastAPI tự động mở rộng.
- Máy chủ: Triển khai lên máy chủ của riêng bạn.
Thực hành tốt nhất
- Sử dụng biến môi trường để lưu trữ thông tin nhạy cảm: Không mã hóa cứng các thông tin nhạy cảm như khóa API trong mã, mà hãy sử dụng các biến môi trường.
- Thêm nhật ký: Sử dụng mô-đun nhật ký để ghi lại trạng thái hoạt động của API, thuận tiện cho việc gỡ lỗi và giám sát.
- Thêm xử lý lỗi: Sử dụng khối
try...exceptđể xử lý các ngoại lệ có thể xảy ra và trả về thông tin lỗi phù hợp. - Giới hạn tốc độ: Sử dụng bộ giới hạn tốc độ để ngăn chặn việc lạm dụng API. FastAPI có một số thư viện giới hạn tốc độ có sẵn.
- Bộ nhớ đệm: Đối với các yêu cầu lặp đi lặp lại, bạn có thể sử dụng bộ nhớ đệm để cải thiện hiệu suất.
- Giám sát: Sử dụng các công cụ giám sát để theo dõi hiệu suất và tính khả dụng của API.
Thủ thuật nâng cao
- Xử lý không đồng bộ: Đối với suy luận LLM tốn thời gian, hãy sử dụng các từ khóa
asyncvàawaitđể xử lý không đồng bộ, tránh chặn luồng chính. - Phản hồi luồng: Sử dụng phản hồi luồng (StreamingResponse) có thể trả về văn bản được tạo theo thời gian thực, cải thiện trải nghiệm người dùng.
- Đa luồng/Đa tiến trình: Đối với suy luận LLM chuyên sâu về CPU, bạn có thể sử dụng đa luồng hoặc đa tiến trình để cải thiện hiệu suất.
- Tăng tốc GPU: Nếu mô hình LLM của bạn hỗ trợ tăng tốc GPU, bạn có thể sử dụng CUDA hoặc các thư viện tăng tốc GPU khác để tăng tốc độ suy luận.





