大模型實戰(zhàn)--FastChat一行代碼實現(xiàn)部署和各個組件詳解

本文重點介紹Fastchat是什么,各個組件的作用和關(guān)系,如何使用Fastchat框架部署大模型

使用FastChat快速部署LLM服務(wù)

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 參數(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 處理每個請求州丹。

  1. 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é)

使用FastChat部署大模型流程圖

假如你已經(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ò)展且易于使用的聊天機器人平臺计济。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市排苍,隨后出現(xiàn)的幾起案子沦寂,更是在濱河造成了極大的恐慌,老刑警劉巖淘衙,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件传藏,死亡現(xiàn)場離奇詭異,居然都是意外死亡幔翰,警方通過查閱死者的電腦和手機漩氨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門西壮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遗增,“玉大人,你說我怎么就攤上這事款青∽鲂蓿” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵抡草,是天一觀的道長饰及。 經(jīng)常有香客問我,道長康震,這世上最難降的妖魔是什么燎含? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮腿短,結(jié)果婚禮上屏箍,老公的妹妹穿的比我還像新娘绘梦。我一直安慰自己,他們只是感情好赴魁,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布卸奉。 她就那樣靜靜地躺著,像睡著了一般颖御。 火紅的嫁衣襯著肌膚如雪榄棵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天潘拱,我揣著相機與錄音疹鳄,去河邊找鬼。 笑死泽铛,一個胖子當(dāng)著我的面吹牛尚辑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盔腔,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼杠茬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弛随?” 一聲冷哼從身側(cè)響起瓢喉,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舀透,沒想到半個月后栓票,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡愕够,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年走贪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惑芭。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡坠狡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出遂跟,到底是詐尸還是另有隱情逃沿,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布幻锁,位于F島的核電站凯亮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哄尔。R本人自食惡果不足惜假消,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岭接。 院中可真熱鬧富拗,春花似錦堂鲤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谅阿,卻和暖如春半哟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背签餐。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工寓涨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人氯檐。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓戒良,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冠摄。 傳聞我的和親對象是個殘疾皇子糯崎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容