first commit
This commit is contained in:
@@ -0,0 +1 @@
|
||||
gemma-4-E2B-it.*
|
||||
@@ -0,0 +1,260 @@
|
||||
# 🤖 LiteRT-LM Web Server
|
||||
|
||||
Chạy mô hình **Gemma 4** trên thiết bị nhúng (Orange Pi 5, Raspberry Pi, v.v.) thông qua [LiteRT-LM](https://github.com/google-ai-edge/litert-lm) với giao diện REST API và Web UI.
|
||||
|
||||
---
|
||||
|
||||
## 📋 Yêu cầu
|
||||
|
||||
- Python 3.10+
|
||||
- [`litert-lm`](https://github.com/google-ai-edge/litert-lm) đã cài và hoạt động
|
||||
- Model file: `gemma-4-E2B-it.litertlm` (hoặc model `.litertlm` khác)
|
||||
- Thư viện Python:
|
||||
|
||||
```bash
|
||||
pip install fastapi uvicorn pydantic
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📁 Cấu trúc
|
||||
|
||||
```
|
||||
.
|
||||
├── app.py # REST API đơn giản, single-turn
|
||||
├── server.py # REST API đầy đủ + Web UI, multi-turn sessions
|
||||
└── README.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Hướng dẫn sử dụng
|
||||
|
||||
### Bước 1 — Đặt model vào cùng thư mục
|
||||
|
||||
```
|
||||
gemma-4-E2B-it.litertlm ← model file
|
||||
app.py
|
||||
server.py
|
||||
```
|
||||
|
||||
Nếu model ở chỗ khác, sửa biến `MODEL_PATH` ở đầu mỗi file.
|
||||
|
||||
---
|
||||
|
||||
## 📄 `app.py` — REST API đơn giản
|
||||
|
||||
File cơ bản, phù hợp để tích hợp nhanh hoặc test.
|
||||
|
||||
### Chạy
|
||||
|
||||
```bash
|
||||
python app.py
|
||||
```
|
||||
|
||||
Server khởi động tại `http://0.0.0.0:8000`
|
||||
|
||||
### Endpoint
|
||||
|
||||
#### `POST /generate`
|
||||
|
||||
Gửi một prompt, nhận phản hồi. Mỗi request là độc lập, **không có bộ nhớ** giữa các lần gọi.
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8000/generate \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"prompt": "Bạn là ai?"}'
|
||||
```
|
||||
|
||||
**Response:**
|
||||
|
||||
```json
|
||||
{
|
||||
"response": "Tôi là Gemma 4, một Mô hình Ngôn ngữ Lớn..."
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🖥️ `server.py` — REST API đầy đủ + Web UI
|
||||
|
||||
Phiên bản đầy đủ với hỗ trợ multi-turn conversation, quản lý session và giao diện chat trên trình duyệt.
|
||||
|
||||
### Chạy
|
||||
|
||||
```bash
|
||||
python server.py
|
||||
```
|
||||
|
||||
Server khởi động tại `http://0.0.0.0:8000`
|
||||
|
||||
---
|
||||
|
||||
### 🌐 Web UI
|
||||
|
||||
Mở trình duyệt và truy cập:
|
||||
|
||||
```
|
||||
http://<địa-chỉ-ip>:8000
|
||||
```
|
||||
|
||||
Tính năng:
|
||||
- Giao diện chat trực quan, hỗ trợ tiếng Việt
|
||||
- Tự động tạo session khi mở trang
|
||||
- Nhớ ngữ cảnh hội thoại trong cùng một session
|
||||
- Nút **New** để bắt đầu cuộc trò chuyện mới
|
||||
- Nút **Clear** để xóa lịch sử và tạo session mới
|
||||
- `Enter` để gửi, `Shift + Enter` để xuống dòng
|
||||
|
||||
---
|
||||
|
||||
### 🔌 REST API
|
||||
|
||||
#### `POST /generate`
|
||||
Single-turn, không nhớ context. Dùng khi chỉ cần hỏi đáp đơn lẻ.
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8000/generate \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"prompt": "Thủ đô của Việt Nam là gì?"}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### `POST /chat/new`
|
||||
Tạo một session mới. Trả về `session_id` dùng cho các request tiếp theo.
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8000/chat/new
|
||||
```
|
||||
|
||||
**Response:**
|
||||
|
||||
```json
|
||||
{
|
||||
"session_id": "a3f2c1d4-..."
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### `POST /chat/{session_id}`
|
||||
Gửi tin nhắn trong một session. Model **nhớ toàn bộ lịch sử hội thoại** trong session đó.
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8000/chat/a3f2c1d4-... \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"prompt": "Kể thêm về điều đó đi"}'
|
||||
```
|
||||
|
||||
**Response:**
|
||||
|
||||
```json
|
||||
{
|
||||
"session_id": "a3f2c1d4-...",
|
||||
"response": "..."
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### `DELETE /chat/{session_id}`
|
||||
Xóa session và giải phóng bộ nhớ.
|
||||
|
||||
```bash
|
||||
curl -X DELETE http://localhost:8000/chat/a3f2c1d4-...
|
||||
```
|
||||
|
||||
**Response:**
|
||||
|
||||
```json
|
||||
{
|
||||
"status": "cleared",
|
||||
"session_id": "a3f2c1d4-..."
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### `GET /chat/sessions/list`
|
||||
Liệt kê tất cả session đang hoạt động.
|
||||
|
||||
```bash
|
||||
curl http://localhost:8000/chat/sessions/list
|
||||
```
|
||||
|
||||
**Response:**
|
||||
|
||||
```json
|
||||
{
|
||||
"sessions": ["a3f2c1d4-...", "b7e9f2a1-..."],
|
||||
"count": 2
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💡 Ví dụ: Multi-turn conversation qua curl
|
||||
|
||||
```bash
|
||||
# 1. Tạo session
|
||||
SESSION=$(curl -s -X POST http://localhost:8000/chat/new | python3 -c "import sys,json; print(json.load(sys.stdin)['session_id'])")
|
||||
|
||||
# 2. Gửi tin nhắn đầu tiên
|
||||
curl -s -X POST http://localhost:8000/chat/$SESSION \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"prompt": "Tên tôi là Nam"}' | python3 -m json.tool
|
||||
|
||||
# 3. Model nhớ context
|
||||
curl -s -X POST http://localhost:8000/chat/$SESSION \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"prompt": "Tên tôi là gì?"}' | python3 -m json.tool
|
||||
|
||||
# 4. Xóa session khi xong
|
||||
curl -X DELETE http://localhost:8000/chat/$SESSION
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Cấu hình
|
||||
|
||||
Các tham số có thể chỉnh trong đầu mỗi file:
|
||||
|
||||
| Biến | Mô tả | Mặc định |
|
||||
|------|-------|---------|
|
||||
| `MODEL_PATH` | Đường dẫn đến file model | `gemma-4-E2B-it.litertlm` |
|
||||
| `backend` | Backend inference | `litert_lm.Backend.CPU` |
|
||||
| `host` | Địa chỉ lắng nghe | `0.0.0.0` |
|
||||
| `port` | Cổng | `8000` |
|
||||
|
||||
Để đổi backend sang GPU (nếu thiết bị hỗ trợ):
|
||||
|
||||
```python
|
||||
engine = litert_lm.Engine(MODEL_PATH, backend=litert_lm.Backend.GPU)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Test nhanh
|
||||
|
||||
```bash
|
||||
# Kiểm tra server đang chạy
|
||||
curl http://localhost:8000/generate \
|
||||
-X POST \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"prompt": "Hello!"}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Ghi chú
|
||||
|
||||
- Mỗi session giữ toàn bộ lịch sử hội thoại trong RAM. Nên xóa session khi không dùng nữa.
|
||||
- Warning `mel_filterbank` khi khởi động là bình thường — liên quan đến audio encoder của Gemma 4 multimodal, không ảnh hưởng đến text generation.
|
||||
- Tốc độ generate phụ thuộc vào phần cứng. Trên Orange Pi 5 với CPU, khoảng 5–15 token/giây.
|
||||
|
||||
---
|
||||
|
||||
## 📜 License
|
||||
|
||||
MIT
|
||||
Reference in New Issue
Block a user