# 🦙 LLaMA Server 部署與使用說明
本篇筆記說明如何部署並啟用一個支援 HTTP POST 請求的 LLaMA Server,供 VoiceTalk 或其他應用進行 LLM 查詢。
---
## 📦 1. 環境與依賴
### ✅ 測試環境
- GPU:NVIDIA A100(或其他支援 FP16 的顯卡)
- 實驗室有 A100 server 的相關使用說明
- 需申請對外連線的 port
### ✅ 使用套件
`vllm`
`torch`
`transformers`
`fastapi`
`uvicorn`
`pydantic`
---
## 📁 2. Server 程式碼
這是一個 LLaMA HTTP Server,可處理 POST 應並返回模型回應:
```python=
# llm_server_API.py
from typing import List, Optional, Union
from vllm.engine.llm_engine import LLMEngine
from vllm.engine.arg_utils import EngineArgs
from vllm.usage.usage_lib import UsageContext
from vllm.utils import Counter
from vllm.outputs import RequestOutput
from vllm import SamplingParams
from transformers import PreTrainedTokenizer, PreTrainedTokenizerFast
import torch
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List, Tuple
import uvicorn
app = FastAPI()
class StreamingLLM:
def __init__(
self,
model: str,
dtype: str = "auto",
quantization: Optional[str] = None,
**kwargs,
) -> None:
engine_args = EngineArgs(model=model, quantization=quantization, dtype=dtype, enforce_eager=True)
self.llm_engine = LLMEngine.from_engine_args(engine_args, usage_context=UsageContext.LLM_CLASS)
self.request_counter = Counter()
def generate(
self,
prompt: Optional[str] = None,
sampling_params: Optional[SamplingParams] = None
) -> List[RequestOutput]:
request_id = str(next(self.request_counter))
self.llm_engine.add_request(request_id, prompt, sampling_params)
while self.llm_engine.has_unfinished_requests():
step_outputs = self.llm_engine.step()
for output in step_outputs:
yield output
def format_chat_prompt(message: str, history: List[Tuple[str, str]]) -> str:
chat_format = []
for user_msg, assistant_msg in history:
chat_format.append({"role": "user", "content": user_msg})
chat_format.append({"role": "assistant", "content": assistant_msg})
chat_format.append({"role": "user", "content": message})
return tokenizer.apply_chat_template(chat_format, tokenize=False)
# === 啟動時初始化模型與 Tokenizer ===
@app.on_event("startup")
async def startup_event():
global llm, tokenizer, sampling_params
torch.cuda.empty_cache()
llm = StreamingLLM(model="meta-llama/Llama-3.2-3B-Instruct", dtype="float16")
tokenizer = llm.llm_engine.tokenizer.tokenizer
sampling_params = SamplingParams(
temperature=0.6,
top_p=0.9,
max_tokens=4096,
stop_token_ids=[
tokenizer.eos_token_id,
tokenizer.convert_tokens_to_ids("<|eot_id|>")
]
)
# === Request / Response 資料模型 ===
class ChatRequest(BaseModel):
message: str
history: List[Tuple[str, str]] = []
class ChatResponse(BaseModel):
response: str
# === Chat API 路由 ===
@app.post("/chat", response_model=ChatResponse)
async def chat(req: ChatRequest):
try:
prompt = format_chat_prompt(req.message, req.history)
for chunk in llm.generate(prompt, sampling_params):
output_text = chunk.outputs[0].text
return ChatResponse(response=output_text)
except Exception as e:
return ChatResponse(response=f"Error: {str(e)}")
```
設定 Hugging Face Token
1. 申請存取權限
Llama 模型(如 Llama 3.2)是由 Meta 釋出,需要在 Hugging Face 上申請使用權限:
前往模型頁面:https://huggingface.co/meta-llama/Llama-3.2-3B-Instruct
登入後填一份表單、接受 Meta 使用條款(如下圖紅框處)。

提出申請後需等待一段時間,存取要求的申請狀態可以到 `setting -> Gated Repositories` 查看如(下圖紅框處)。

2. Hugging Face CLI 登入
如果你已經取得存取權限,接著要在機器上用 Hugging Face CLI 登入:
```
huggingface-cli login
```
然後輸入你的 Hugging Face token(可以從這裡找到:[Access Tokens](https://huggingface.co/settings/tokens))
若沒有 token,只需要申請一個 token type 為 `Read` 的 access Tokens 就可以了。
登入後即可執行 Llama server
```bash=
uvicorn llm_server_API:app --host 0.0.0.0 --port <你申請的 port>
```
---
## 🧪 3. 測試方式
使用 curl 傳送 JSON 測試請求:
```bash
curl -X POST http://localhost:<你申請的 port>/chat \
-H "Content-Type: application/json" \
-d '{"message": "請介紹一下物聯網的應用", "history": []}'
```
---
## 🔌 4. 與 VoiceTalk 整合方式
在 `VoiceTalk_library/Client/config.py` 中設定:
```python
Llama_API_url = "http://<你的IP或Domain>:<你申請的 port>/chat"
```
VoiceTalk 使用的 Prompt 在 `VoiceTalk_library/Client/Llama_API.py`。