本文重點介紹Fastchat是什么,各個組件的作用和關(guān)系,如何使用Fastchat框架部署大模型。
Fastchat是什么撞芍?
FastChat是一個用于訓(xùn)練秧了、部署和評估大模型的開源框架,支持一行代碼部署大語言模型序无,支持Web UI和OpenAI兼容的RESTful API验毡。其核心功能:
- 模型訓(xùn)練與評估:提供模型的權(quán)重、訓(xùn)練代碼和評估代碼(例如Vicuna帝嗡、FastChat-T5)
- 分布式多模型服務(wù)系統(tǒng):支持大量并發(fā)連接晶通,并允許多個Worker(模型工作者)注冊到單個Controller(控制器)。
- 兼容OpenAI的API:提供OpenAI的API哟玷,方便開發(fā)集成到項目狮辽。
Fastchat各個組件詳解
為了能夠通過 Web 和 SDK/API 訪問 LLM 服務(wù),我們需要在服務(wù)器上部署以下 FastChat 的組件:
- Controller(控制器)
- Worker(工作者)
- Gradio Web Server(Web服務(wù)器)
- OpenAI API Server(API服務(wù)器)
前提是大模型已經(jīng)部署巢寡,詳見安裝 FastChat & vLLM & 下載大模型 喉脖,若已安裝,請?zhí)^抑月。
1. Controller(控制器)
- 作用:Controller負(fù)責(zé)管理分布式模型實例树叽。它監(jiān)控所有Worker的狀態(tài),并調(diào)度Worker谦絮,以保證各個同名Worker之間的負(fù)載均衡题诵,確保請求被合理地分配到各個Worker。
# 查看Controller的參數(shù)
python3 -m fastchat.serve.controller --help
-
命令行參數(shù)及其用途:
-
基本配置
-
--host
和--port
:指定控制器服務(wù)監(jiān)聽的主機地址和端口號层皱。 -
--ssl
:啟用SSL加密性锭,需要設(shè)置SSL密鑰文件和證書文件的環(huán)境變量。
-
-
調(diào)度配置
-
--dispatch-method
:指定請求的分發(fā)方法叫胖,可以是lottery
(隨機選擇工作者)或shortest_queue
(選擇任務(wù)隊列最短的工作者)篷店。
-
-
基本配置
啟動Controller(控制器)
- 示例
python -m fastchat.serve.controller --host 0.0.0.0
默認(rèn)端口為21001
,可通過--port
指定。--host
參數(shù)是設(shè)置服務(wù)的主機地址疲陕,這里設(shè)置為0.0.0.0
方淤,表示可以通過任何地址訪問,讓Controller監(jiān)聽所有網(wǎng)絡(luò)接口蹄殃。
2. Worker(工作者)
作用:Worker是大模型的服務(wù)實例携茂,負(fù)責(zé)加載大語言模型的權(quán)重、tokenizer诅岩、對話模板等讳苦,并對來自O(shè)penAI API Server的請求生成模型推斷結(jié)果。
-
兩種類型:
- VLLM Worker基于vllm框架進(jìn)行推理加速吩谦,
本文選擇vllm
鸳谜。 - 普通Model Worker。
- VLLM Worker基于vllm框架進(jìn)行推理加速吩谦,
VLLM Worker 參數(shù)
# 查看vllm worker參數(shù)
python -m fastchat.serve.vllm_worker --help
-
基本配置:
-
--host
和--port
:指定工作者服務(wù)監(jiān)聽的主機地址和端口號式廷。 -
--worker-address
和--controller-address
:指定工作者和控制器的地址咐扭,用于內(nèi)部通信。
-
-
模型配置:
-
--model-path
滑废、--model-names(可選)
蝗肪、--tokenizer
、--model
等:指定模型權(quán)重蠕趁、模型和分詞器的路徑或名稱薛闪。 -
--load-format
:指定模型權(quán)重的加載格式。 -
--quantization
:指定模型的量化方法俺陋,有助于減少內(nèi)存占用和提高推理速度豁延。
-
-
并行和性能優(yōu)化:
-
--num-gpus
:指定使用的GPU數(shù)量。 -
--pipeline-parallel-size
和--tensor-parallel-size
:指定流水線并行和張量并行的規(guī)模腊状,用于分布式模型訓(xùn)練或推理术浪。 -
--gpu-memory-utilization
:指定GPU內(nèi)存的利用率。 -
--cpu-offload-gb
:指定從GPU卸載到CPU的內(nèi)存量(以GiB為單位)寿酌,有助于處理大型模型胰苏。
-
-
高級配置:
-
--guided-decoding-backend
:指定引導(dǎo)解碼的后端引擎。 -
--quantization-param-path
:指定量化參數(shù)的路徑醇疼,對于使用FP8等低精度量化時特別重要硕并。 -
--lora-related
參數(shù):配置LoRA(Low-Rank Adaptation)適配器,允許在不重新訓(xùn)練整個模型的情況下進(jìn)行微調(diào)秧荆。
-
-
監(jiān)控和日志:
-
--disable-log-stats
:禁用日志統(tǒng)計信息的記錄倔毙。 -
--otlp-traces-endpoint
:指定OpenTelemetry跟蹤的端點URL壤蚜,用于發(fā)送跟蹤數(shù)據(jù)瘫拣。
-
啟動VLLM Worker(模型工作者)
- 單worker示例
python -m fastchat.serve.vllm_worker \
--model-path llm/Llama3.1_8B\ # 替換自己的模型地址
--model-names Llama3.1_8B \. # 替換自己的模型名稱
--port 21002 \
--worker-address http://localhost:21002 # 替換自己的地址
默認(rèn)端口為21002
,可通過--port
指定瓜挽。FastChat 的 Worker 會向 Controller 注冊自身。--worker-address http://localhost:21002 用于指定端口和地址么库,以便 Controller 能夠找到 Model Worker傻丝。
--worker-address
:用于指定Model Worker自身的地址。如果你需要手動指定Worker在網(wǎng)絡(luò)中的監(jiān)聽地址(而不是默認(rèn)值)诉儒,可以通過這個參數(shù)來設(shè)置葡缰。Controller和Worker的通信是完成任務(wù)的關(guān)鍵。
- 多Worker示例
假設(shè)一個聊天服務(wù)需要處理大量的用戶請求忱反,需要部署了多個Model Worker來分擔(dān)負(fù)載泛释。
在同一機器上啟動多個Worker:運行多個Worker時,使用不同的GPU或端口:
# 啟動Worker1
CUDA_VISIBLE_DEVICES=0 python -m fastchat.serve.vllm_worker \
--model-path /path/to/local_model \
--worker-address="server1.example.com:8001"
# 啟動Worker2
CUDA_VISIBLE_DEVICES=1 python -m fastchat.serve.vllm_worker \
--model-path /path/to/local_model \
--worker-address="server2.example.com:8002"
# 啟動Worker X
一旦Model Worker啟動温算,它們會自動向Controller注冊怜校。Controller會將用戶請求分配給可用的Model Worker進(jìn)行處理。在Controller啟動后注竿,它可以自動發(fā)現(xiàn)所有注冊的Model Worker茄茁,并為用戶提供模型推理服務(wù)。
在不同的機器上運行多個Worker:確保這些Worker能夠與Controller正常通信蔓搞。
# Worker 1
python3 -m fastchat.serve.vllm_worker \
--model-path <path-to-your-model> \
--controller-address controller_server.example.com:21001
# Worker X
python3 -m fastchat.serve.vllm_worker \
--model-path <path-to-your-model> \
--controller-address controller_server.example.com:21001
注意這里是
--controller-address
,用于Model Worker需要它來與Controller通信随橘,它是必須的喂分,Controller所在的機器的IP地址和端口。--worker-address
是可選的机蔗,用于指定Model Worker的監(jiān)聽地址蒲祈。
若沒有安裝vLLM,可通過下面的命令直接啟model_work:
python -m fastchat.serve.model_worker \
--model-path /path/to/local_model \
--host 0.0.0.0
與vLLM區(qū)別只在命令行vllm_worker換成model_worker 萝嘁,其余是一樣的梆掸。
3.Gradio Web Server(Gradio Web服務(wù)器)
功能:Gradio Web Server提供了一個用戶友好的Web界面,允許用戶通過瀏覽器與聊天機器人進(jìn)行交互牙言。
-
命令行參數(shù)及其用途:
- 基本配置
-
--host
和--port
:指定控制器服務(wù)監(jiān)聽的主機地址和端口號酸钦。 -
--share
:生成一個公共的、可分享的鏈接咱枉,允許用戶通過互聯(lián)網(wǎng)訪問服務(wù)卑硫。
-
調(diào)度配置
-
--controller-url
:指定 Controller 的地址,Controller 負(fù)責(zé)管理和調(diào)度 Model Worker蚕断。 -
--concurrency-count
:設(shè)置 Gradio 隊列的并發(fā)數(shù)欢伏,即同時處理的請求數(shù)量。 -
--model-list-mode {once,reload}
:設(shè)置模型列表的加載模式亿乳,可以是一次性加載或每次重新加載硝拧。
-
-
安全配置
-
--moderate
:啟用內(nèi)容審查,以阻止不安全的輸入。 -
--show-terms-of-use
:在加載演示之前顯示使用條款障陶。 -
--register-api-endpoint-file
:從 JSON 文件注冊基于 API 的模型端點滋恬。 -
--gradio-auth-path
:設(shè)置 Gradio 認(rèn)證文件路徑,文件應(yīng)包含一個或多個用戶:密碼對咸这。 -
--gradio-root-path
:設(shè)置 Gradio 的根路徑夷恍,例如在運行在反向代理后面或自定義 URL 路徑前綴時使用。
-
啟動Gradio Web Serve(Web)
- 示例
# 直接啟動
python -m fastchat.serve.gradio_web_server \
--host 0.0.0.0 --port 8001
- 配置多并發(fā)示例
python3 -m fastchat.serve.gradio_web_server \
--host 0.0.0.0 \
--port 7860 \
--controller-url http://192.168.1.100:21001 \ #是啟動controller的IP和地址
--concurrency-count 10 \ # 并發(fā)數(shù)
--model-list-mode once \ #加載模型方式
--moderate # 啟用內(nèi)容審查
Gradio Web Server 并不直接選擇 Worker媳维,它只負(fù)責(zé)將請求傳遞給 Controller酿雪。Controller 是負(fù)責(zé)調(diào)度的組件,它會根據(jù) Worker 的狀態(tài)侄刽、負(fù)載指黎、模型類型等信息,決定哪個 Worker 處理每個請求州丹。
-
OpenAI API Server(OpenAI API服務(wù)器)
功能:OpenAI API Server提供與OpenAI兼容的API服務(wù)醋安。它接受用戶的HTTP調(diào)用請求,并將這些請求分發(fā)給相應(yīng)的Worker進(jìn)行處理墓毒,最后返回處理結(jié)果吓揪。
-
命令行參數(shù)及其用途:
-
--host
和--port
:指定控制器服務(wù)監(jiān)聽的主機地址和端口號。 -
--controller-address
:指定控制器的地址所计,控制器負(fù)責(zé)管理模型和處理請求柠辞。 - -
-allow-credentials
:允許發(fā)送憑證(如 cookies)。 -
--allowed-origins
:指定允許的請求來源主胧,用于跨域資源共享(CORS)叭首。 -
--allowed-methods
:指定允許的 HTTP 方法,如 GET踪栋、POST 等焙格。 -
--allowed-headers
:指定允許的 HTTP 請求頭。 -
--api-keys
:可選參數(shù)夷都,用于限制訪問的 API 密鑰列表眷唉,多個密鑰用逗號分隔。 -
--ssl
:啟用 SSL 加密囤官。需要設(shè)置環(huán)境變量 SSL_KEYFILE 和 SSL_CERTFILE 來指定密鑰文件和證書文件厢破。
-
啟動OpenAI API Serve(API)
- 示例
# 直接啟動
python -m fastchat.serve.openai_api_server \
--host 0.0.0.0 --port 8001
- 設(shè)置允許的來源、方法和請求頭治拿,以及啟用 API 密鑰驗證
python -m fastchat.serve.openai_api_server \
--host 0.0.0.0 --port 8001 \
--controller-address http://localhost:8001 \ # 指定 Controller 的地址摩泪,Controller 負(fù)責(zé)管理和調(diào)度 Model Worker
--allowed-origins "http://example.com" \ # 指定只有自己的前端訪問,若全部能訪問可用`*`表示
--allowed-methods "GET,POST" \ # 允許get和post
--allowed-headers "Content-Type,Authorization" \ # 設(shè)置請求頭
--api-keys "key1,key2" \ # 訪問key
總結(jié)
假如你已經(jīng)部署一個Llama3.1-8B的模型劫谅,以啟動OpenAI API服務(wù)為例,各個組件之間的關(guān)系
- Controller負(fù)責(zé)管理分布式模型實例
# 默認(rèn)端口21001
python3 -m fastchat.serve.controller
- Model Worker是大模型服務(wù)實例见坑,它在啟動時向Controller注冊
# 默認(rèn)端口21002
python3 -m fastchat.serve.vllm_worker --model-path /path/to/model
- OpenAI API提供OpenAI兼容的API服務(wù)嚷掠,接受請求后,先向Controller獲取Model Worker地址荞驴,再向Model Worker實例發(fā)送請求不皆,最后返回OpenAI兼容的報文。
# 默認(rèn)端口8000
python -m fastchat.serve.openai_api_server
完成上述操作熊楼,我們使用Fastchat已經(jīng)部署大模型霹娄,同時提供了API服務(wù),代碼示例如下
安裝 FastChat & vLLM & 下載大模型 & 更多測試用例 鲫骗,詳見作者其他文章犬耻。
import os
from openai import OpenAI
# 設(shè)置API密鑰和API基地址
os.environ["OPENAI_API_KEY"] = "na" # 在啟動 OpenAI API Server 的時候可通過參數(shù) `--api-keys` 指定 API Key 的列表,在不指定的情況下在客戶端填入任意值皆可执泰。
os.environ["OPENAI_BASE_URL"] = "http://localhost:8000/v1" # 本地地址
# 創(chuàng)建OpenAI客戶端實例
client = OpenAI()
# 定義模型名稱和消息
model_name = "Meta-Llama-3.1-8B-Instruct" # 請根據(jù)實際使用的模型名稱進(jìn)行替換
prompt = "Once upon a time"
completion = client.completions.create(
model=model_name,
prompt=prompt,
max_tokens=64
)
print(prompt + completion.choices[0].text)
綜上所述枕磁,F(xiàn)astChat的各個組件協(xié)同工作,共同構(gòu)成了一個高效术吝、可擴(kuò)展且易于使用的聊天機器人平臺计济。