大模型实战--FastChat一行代码实现部署和各个组件详解

本文重点介绍Fastchat是什么,各个组件的作用和关系,如何使用Fastchat框架部署大模型

使用FastChat快速部署LLM服务

Fastchat是什么?

FastChat是一个用于训练、部署和评估大模型的开源框架,支持一行代码部署大语言模型,支持Web UI和OpenAI兼容的RESTful API。其核心功能:

  • 模型训练与评估:提供模型的权重、训练代码和评估代码(例如Vicuna、FastChat-T5)
  • 分布式多模型服务系统:支持大量并发连接,并允许多个Worker(模型工作者)注册到单个Controller(控制器)。
  • 兼容OpenAI的API:提供OpenAI的API,方便开发集成到项目。

Fastchat各个组件详解

为了能够通过 Web 和 SDK/API 访问 LLM 服务,我们需要在服务器上部署以下 FastChat 的组件:

  • Controller(控制器)
  • Worker(工作者)
  • Gradio Web Server(Web服务器)
  • OpenAI API Server(API服务器)

前提是大模型已经部署,详见安装 FastChat & vLLM & 下载大模型 ,若已安装,请跳过。

1. Controller(控制器)

  • 作用:Controller负责管理分布式模型实例。它监控所有Worker的状态,并调度Worker,以保证各个同名Worker之间的负载均衡,确保请求被合理地分配到各个Worker。
#  查看Controller的参数
python3 -m fastchat.serve.controller --help
  • 命令行参数及其用途
    • 基本配置
      • --host--port:指定控制器服务监听的主机地址和端口号。
      • --ssl:启用SSL加密,需要设置SSL密钥文件和证书文件的环境变量。
    • 调度配置
      • --dispatch-method:指定请求的分发方法,可以是lottery(随机选择工作者)或shortest_queue(选择任务队列最短的工作者)。

启动Controller(控制器)

  • 示例
python -m fastchat.serve.controller --host 0.0.0.0

默认端口为21001,可通过--port指定。--host参数是设置服务的主机地址,这里设置为0.0.0.0,表示可以通过任何地址访问,让Controller监听所有网络接口。

2. Worker(工作者)

  • 作用:Worker是大模型的服务实例,负责加载大语言模型的权重、tokenizer、对话模板等,并对来自OpenAI API Server的请求生成模型推断结果。

  • 两种类型

    • VLLM Worker基于vllm框架进行推理加速,本文选择vllm
    • 普通Model Worker。

VLLM Worker 参数

# 查看vllm worker参数
python -m fastchat.serve.vllm_worker --help
  • 基本配置

    • --host--port:指定工作者服务监听的主机地址和端口号。
    • --worker-address--controller-address:指定工作者和控制器的地址,用于内部通信。
  • 模型配置

    • --model-path--model-names(可选)--tokenizer--model 等:指定模型权重、模型和分词器的路径或名称。
    • --load-format:指定模型权重的加载格式。
    • --quantization:指定模型的量化方法,有助于减少内存占用和提高推理速度。
  • 并行和性能优化

    • --num-gpus:指定使用的GPU数量。
    • --pipeline-parallel-size--tensor-parallel-size:指定流水线并行和张量并行的规模,用于分布式模型训练或推理。
    • --gpu-memory-utilization:指定GPU内存的利用率。
    • --cpu-offload-gb:指定从GPU卸载到CPU的内存量(以GiB为单位),有助于处理大型模型。
  • 高级配置

    • --guided-decoding-backend:指定引导解码的后端引擎。
    • --quantization-param-path:指定量化参数的路径,对于使用FP8等低精度量化时特别重要。
    • --lora-related 参数:配置LoRA(Low-Rank Adaptation)适配器,允许在不重新训练整个模型的情况下进行微调。
  • 监控和日志

    • --disable-log-stats:禁用日志统计信息的记录。
    • --otlp-traces-endpoint:指定OpenTelemetry跟踪的端点URL,用于发送跟踪数据。

启动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  # 替换自己的地址

默认端口为21002,可通过--port指定。FastChat 的 Worker 会向 Controller 注册自身。--worker-address http://localhost:21002 用于指定端口和地址,以便 Controller 能够找到 Model Worker。

--worker-address:用于指定Model Worker自身的地址。如果你需要手动指定Worker在网络中的监听地址(而不是默认值),可以通过这个参数来设置。Controller和Worker的通信是完成任务的关键

  • 多Worker示例

假设一个聊天服务需要处理大量的用户请求,需要部署了多个Model Worker来分担负载。

在同一机器上启动多个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进行处理。在Controller启动后,它可以自动发现所有注册的Model Worker,并为用户提供模型推理服务。

在不同的机器上运行多个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的监听地址。

若没有安装vLLM,可通过下面的命令直接启model_work:

python -m fastchat.serve.model_worker \  
--model-path /path/to/local_model \ 
--host 0.0.0.0

与vLLM区别只在命令行vllm_worker换成model_worker ,其余是一样的。

3.Gradio Web Server(Gradio Web服务器)

  • 功能:Gradio Web Server提供了一个用户友好的Web界面,允许用户通过浏览器与聊天机器人进行交互。

  • 命令行参数及其用途

    • 基本配置
    • --host--port:指定控制器服务监听的主机地址和端口号。
    • --share:生成一个公共的、可分享的链接,允许用户通过互联网访问服务。
  • 调度配置

    • --controller-url:指定 Controller 的地址,Controller 负责管理和调度 Model Worker。
    • --concurrency-count:设置 Gradio 队列的并发数,即同时处理的请求数量。
    • --model-list-mode {once,reload}:设置模型列表的加载模式,可以是一次性加载或每次重新加载。
  • 安全配置

    • --moderate:启用内容审查,以阻止不安全的输入。
    • --show-terms-of-use:在加载演示之前显示使用条款。
    • --register-api-endpoint-file:从 JSON 文件注册基于 API 的模型端点。
    • --gradio-auth-path :设置 Gradio 认证文件路径,文件应包含一个或多个用户:密码对。
    • --gradio-root-path :设置 Gradio 的根路径,例如在运行在反向代理后面或自定义 URL 路径前缀时使用。

启动Gradio Web Serve(Web)

  • 示例
# 直接启动
python -m fastchat.serve.gradio_web_server \
    --host 0.0.0.0 --port 8001
  • 配置多并发示例
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 \ # 并发数
--model-list-mode once \ #加载模型方式
--moderate # 启用内容审查

Gradio Web Server 并不直接选择 Worker,它只负责将请求传递给 Controller。Controller 是负责调度的组件,它会根据 Worker 的状态、负载、模型类型等信息,决定哪个 Worker 处理每个请求。

  1. OpenAI API Server(OpenAI API服务器)
    • 功能:OpenAI API Server提供与OpenAI兼容的API服务。它接受用户的HTTP调用请求,并将这些请求分发给相应的Worker进行处理,最后返回处理结果。

    • 命令行参数及其用途

      • --host--port:指定控制器服务监听的主机地址和端口号。
      • --controller-address:指定控制器的地址,控制器负责管理模型和处理请求。
      • --allow-credentials:允许发送凭证(如 cookies)。
      • --allowed-origins :指定允许的请求来源,用于跨域资源共享(CORS)。
      • --allowed-methods :指定允许的 HTTP 方法,如 GET、POST 等。
      • --allowed-headers :指定允许的 HTTP 请求头。
      • --api-keys:可选参数,用于限制访问的 API 密钥列表,多个密钥用逗号分隔。
      • --ssl:启用 SSL 加密。需要设置环境变量 SSL_KEYFILE 和 SSL_CERTFILE 来指定密钥文件和证书文件。

启动OpenAI API Serve(API)

  • 示例
# 直接启动
python -m fastchat.serve.openai_api_server \ 
--host 0.0.0.0 --port 8001
  • 设置允许的来源、方法和请求头,以及启用 API 密钥验证
python -m fastchat.serve.openai_api_server  \ 
  --host 0.0.0.0 --port 8001  \
  --controller-address http://localhost:8001  \  # 指定 Controller 的地址,Controller 负责管理和调度 Model Worker
  --allowed-origins "http://example.com"  \ # 指定只有自己的前端访问,若全部能访问可用`*`表示
  --allowed-methods "GET,POST"  \  # 允许get和post
  --allowed-headers "Content-Type,Authorization"  \  # 设置请求头
  --api-keys "key1,key2"  \  # 访问key

总结

使用FastChat部署大模型流程图

假如你已经部署一个Llama3.1-8B的模型,以启动OpenAI API服务为例,各个组件之间的关系

  • Controller负责管理分布式模型实例
# 默认端口21001
python3 -m fastchat.serve.controller
  • Model Worker是大模型服务实例,它在启动时向Controller注册
# 默认端口21002
python3 -m fastchat.serve.vllm_worker --model-path /path/to/model
  • OpenAI API提供OpenAI兼容的API服务,接受请求后,先向Controller获取Model Worker地址,再向Model Worker实例发送请求,最后返回OpenAI兼容的报文。
# 默认端口8000
python -m fastchat.serve.openai_api_server

完成上述操作,我们使用Fastchat已经部署大模型,同时提供了API服务,代码示例如下
安装 FastChat & vLLM & 下载大模型 & 更多测试用例 ,详见作者其他文章。

import os
from openai import OpenAI

# 设置API密钥和API基地址
os.environ["OPENAI_API_KEY"] = "na" # 在启动 OpenAI API Server 的时候可通过参数 `--api-keys` 指定 API Key 的列表,在不指定的情况下在客户端填入任意值皆可。
os.environ["OPENAI_BASE_URL"] = "http://localhost:8000/v1" # 本地地址

# 创建OpenAI客户端实例
client = OpenAI()

# 定义模型名称和消息
model_name = "Meta-Llama-3.1-8B-Instruct"  # 请根据实际使用的模型名称进行替换
prompt = "Once upon a time"

completion = client.completions.create(
    model=model_name,
    prompt=prompt,
    max_tokens=64
)
print(prompt + completion.choices[0].text)

综上所述,FastChat的各个组件协同工作,共同构成了一个高效、可扩展且易于使用的聊天机器人平台。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容