大模型实战--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
© 著作权归作者所有,转载或内容合作请联系作者

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

相关推荐
WaaTong18 分钟前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
m0_7430484418 分钟前
初识Java EE和Spring Boot
java·java-ee
AskHarries20 分钟前
Java字节码增强库ByteBuddy
java·后端
荒Huang23 分钟前
Linux挖矿病毒(kswapd0进程使cpu爆满)
linux·运维·服务器
海阔天空_201333 分钟前
Python pyautogui库:自动化操作的强大工具
运维·开发语言·python·青少年编程·自动化
佳佳_34 分钟前
Spring Boot 应用启动时打印配置类信息
spring boot·后端
桥田智能35 分钟前
气爪在自动化装配线中是如何应用的?
运维·自动化
小灰灰__40 分钟前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
夜雨翦春韭44 分钟前
Java中的动态代理
java·开发语言·aop·动态代理
程序媛小果1 小时前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot