大模型实战--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的各个组件协同工作,共同构成了一个高效、可扩展且易于使用的聊天机器人平台。
最后编辑于:2024-09-25 20:56:57
© 著作权归作者所有,转载或内容合作请联系作者

喜欢的朋友记得点赞、收藏、关注哦!!!

相关推荐
吾日三省吾码4 小时前
JVM 性能调优
java
弗拉唐5 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
sun0077005 小时前
ubuntu dpkg 删除安装包
运维·服务器·ubuntu
oi776 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
mqiqe6 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
工业甲酰苯胺6 小时前
MySQL 主从复制之多线程复制
android·mysql·adb
BestandW1shEs6 小时前
谈谈Mysql的常见基础问题
数据库·mysql
贰十六6 小时前
笔记:Centos Nginx Jdk Mysql OpenOffce KkFile Minio安装部署
笔记·nginx·centos
重生之Java开发工程师6 小时前
MySQL中的CAST类型转换函数
数据库·sql·mysql