本文重点介绍Fastchat是什么,各个组件的作用和关系,如何使用Fastchat框架部署大模型。
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框架进行推理加速,
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 处理每个请求。
-
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
总结
假如你已经部署一个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的各个组件协同工作,共同构成了一个高效、可扩展且易于使用的聊天机器人平台。