使用FastChat部署Baichuan2

news2024/11/24 22:32:38

1. 引言

近来,大型语言模型的市场需求呈现出蓬勃发展的态势。然而,仅仅掌握模型的数据准备和训练是不够的,模型的部署方法也变得至关重要。在这篇文章中,我们将以Baichuan2为例,利用FastChat进行模型部署的实战操作。

2. 提前准备

除了按照FastChat的github给出的安装条件:

还需要安装pytorch:

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

以及其他依赖项:

pip install transformers
pip install acclerate
pip install sentencepiece

另外,也请下载好Baichuan2的模型到本地来:

3. 使用方式

3.1 框架代码解读

既然我们都上手使用FastChat了,如果仅仅是直接运行,那基本上5分钟就过了。我们目的是要了解整个FastChat的运行机制,大家喜欢看源码的,可以直接去github上看一下。

FastChat的推理架构还是比较规范的,用的是FastAPI这个非常简洁方便的python框架,整体架构是一个Controller-Worker的架构,可扩展性更强,可以将框架、模型和用户接口分离开,可以说是非常优秀的设计。(在没有FastChat之前,我们也是这样想的构建。)

在这里插入图片描述
这里借用一个Controller-Worker架构模式图,更容易的展示出整个架构,可以看到在一个程序中,只会有一个Controller用于协调所有worker的工作情况以及与client的交互,因此首先需要将其构建起来,然后就是各个worker的构建,在FastChat中,worker则是模型加载后的实体,它的目的就是将来到的信息进行一个推理,把结果返回给controller。最后粉红色的Client有3种方式可以实现,第一种是最简单的CLI,第二种则是常用的WebGUI, 第三种则是比较高级的API调用。

3.1.1 controller.py解读

整个代码太长,可以看一下源代码。
大致内容如下:

代码中使用了FastAPI框架来搭建Web服务,通过HTTP接口与客户端进行通信。主要的功能模块如下:
DispatchMethod 枚举类定义了两种调度方法:LOTTERY 和 SHORTEST_QUEUE,分别表示抽签法和最短队列法。
WorkerInfo 是一个数据类,用于存储工作节点的相关信息,包括模型名称、速度、队列长度、心跳检测等。
Controller 类是任务调度器的核心类,用于注册和管理工作节点。它包含了注册工作节点、获取工作节点状态、选择工作节点等方法。
heart_beat_controller 函数是一个线程函数,用于定期检测工作节点的心跳信息,并移除超时未发送心跳的节点。
app 是一个 FastAPI 应用实例,定义了各个接口的处理函数。
create_controller 函数用于创建任务调度器的实例,并解析命令行参数。
main 部分,通过调用 create_controller 函数创建了一个 Controller 实例,并根据命令行参数选择是否启用 SSL 加密。最后使用 uvicorn 启动了 Web 服务。

3.1.2 model_worker.py解读

整个代码太长,可以看一下源代码。
大致内容如下:

主要功能模块如下:
BaseModelWorker 类是工作节点的基类,定义了一些共用的方法和属性,包括注册到控制器、发送心跳信息等。
ModelWorker 类继承自 BaseModelWorker,是具体的模型工作节点类。它包含了模型加载、生成文本、获取嵌入向量等方法。在初始化时会加载指定的模型,并根据命令行参数进行配置。
heart_beat_worker 函数是一个线程函数,用于定期发送心跳信息给控制器。
app 是一个 FastAPI 应用实例,定义了各个接口的处理函数。
create_background_tasks 函数用于创建后台任务,用于释放工作节点的信号量。
main 部分,通过调用 create_model_worker 函数创建了一个 ModelWorker 实例,并解析命令行参数。最后使用 uvicorn 启动了 Web 服务。

3.1.3 两个部分如何配合运行

这两个部分是通过网络通信进行协调工作的。
在代码中,控制器 (controller.py) 和工作节点 (worker.py) 都是通过 HTTP 协议进行通信的。工作节点会向控制器注册自己,并定期发送心跳信息告知控制器自己的状态。控制器可以根据工作节点的状态和负载情况,将任务分配给合适的工作节点。
具体的协调过程如下:

  1. 工作节点启动后,会调用 register_to_controller 方法向控制器注册自己,包括工作节点的名称、心跳检测和当前状态等信息。
  2. 工作节点会定期调用 send_heart_beat 方法发送心跳信息给控制器,告知自己的状态。心跳信息中包括工作节点的名称、队列长度等信息。
  3. 控制器会接收到工作节点发送的心跳信息,并根据工作节点的状态和负载情况,决定是否需要重新注册工作节点。
  4. 控制器可以根据需要向工作节点发送任务请求,包括生成文本任务和获取嵌入向量任务等。
  5. 工作节点接收到任务请求后,会执行相应的任务,并将结果返回给控制器。
    通过这样的协调和通信机制,控制器和工作节点可以相互配合,实现任务的分发和执行。控制器负责调度和管理工作节点,而工作节点负责执行具体的模型任务。

因此,无论是使用那种用户接口,首先都要先启动Controller,然后启动Worker,最后再启动各种Client。

3.2 执行步骤

正如刚才所说的,无论哪一种Client,都需要首先启动controller和worker,遵循下面的指令:

启动controller

python3 -m fastchat.serve.controller

然后我们启动worker:

python3 -m fastchat.serve.model_worker --model-path <model_path>

3.2.1 使用CLI

CLI全称是command-line interface,意思是命令行交互,一般都是用于测试使用。当你需要做一个简单的演示的时候,可以使用此命令

python3 -m fastchat.serve.cli --model-path <model_path>

3.2 使用Web GUI

Web GUI作为最方便的接口自然也是不可缺少的:

python3 -m fastchat.serve.gradio_web_server

在这里插入图片描述

3.1 使用RESTful API

如果想把它也作为像ChatGPT一样调用的模型,那么只需要起一个RESTful API Server即可:

python3 -m fastchat.serve.openai_api_server --host localhost --port 8000

执行完后调用的方式也很简单:

import openai
# to get proper authentication, make sure to use a valid key that's listed in
# the --api-keys flag. if no flag value is provided, the `api_key` will be ignored.
openai.api_key = "EMPTY"
openai.api_base = "http://localhost:8000/v1"

model = "Model name"
prompt = "Once upon a time"

# create a completion
completion = openai.Completion.create(model=model, prompt=prompt, max_tokens=64)
# print the completion
print(prompt + completion.choices[0].text)

# create a chat completion
completion = openai.ChatCompletion.create(
  model=model,
  messages=[{"role": "user", "content": "Hello! What is your name?"}]
)
# print the completion
print(completion.choices[0].message.content)

如果需要更加复杂的描述,可以参见一下openai_api。

4. 小结

本文介绍了使用FastChat部署Baichuan2的步骤和使用方式。通过FastChat的Controller-Worker架构和不同的客户端接口,我们可以高效地部署和使用Baichuan2模型。

在使用前,我们需要按照FastChat的安装条件进行准备,并安装pytorch和其他必要的依赖项。同时,还需要下载Baichuan2的模型文件到本地。

通过阅读源代码,我们了解了FastChat的运行机制。Controller负责任务调度和与客户端的交互,而Worker则是具体的模型工作节点,负责加载模型并执行各种任务。

在使用过程中,我们可以选择不同的客户端接口。CLI提供了命令行交互的方式,适用于快速测试和演示。Web GUI则提供了友好的图形界面,方便用户进行交互。而RESTful API则使我们可以像调用ChatGPT一样使用模型。

通过本文所介绍的步骤和方式,我们可以轻松地部署和使用Baichuan2模型,为我们的应用程序和项目增添强大的语言生成能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1036855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA 中 Maven 报错 Cannot resolve xxx【终于解决了】

问题 pom中已经添加相关依赖&#xff0c;maven刷新也没有用&#xff0c;依旧是疯狂报错 解决办法 不断的查询资料&#xff0c;总结一下试过的办法。 解决办法一&#xff1a;清除缓存 File -> Invalidate Caches/Restart -> Invalidate And Restart 试了之后也就报错 …

C# EPPlus 访问 Excel表格

EPPlus是什么&#xff1f; 一个访问Excel表格的库&#xff0c;调用相当简单 怎么访问&#xff1f; 表格可以简单理解成一个二维数组我希望访问表格像二维数组一样简单我希望消耗不算太大 封装一个类 下载DLL以及这个文件&#xff1a;《下载传送门->》 注意需要导入EP…

uniapp iOS离线打包——上传到App Store

uniapp iOS离线打包&#xff0c;如何打包上传到App Store&#xff1f; 文章目录 uniapp iOS离线打包&#xff0c;如何打包上传到App Store&#xff1f;打包上传 App Store App iOS 离线打包 上一篇分享部分工程配置 打包上传 App Store 选中项目工程&#xff1a;点击 工具栏 P…

虚幻4学习笔记(14)界面切换、局域网联机

虚幻4学习笔记 创建游戏加入游戏搜索服务器加入服务器刷新服务器 B站UP谌嘉诚课程&#xff1a;https://www.bilibili.com/video/BV164411Y732 创建游戏 新建三个UI界面 FindServer、JoinServer、MainMenu 打开MainMenu 打开FindServer 添加Scroll Box滚动框 添加Circular T…

【计算机网络】——应用层

// 图片取自王道 仅做交流学习 一、基本概念 应用层概述 协议是 网络层次模型 中多台主机之间 同层之间进行通信的规则。是一个水平概念 垂直空间上&#xff0c;向下屏蔽下层细节&#xff0c;向上提供服务接入&#xff0c;多台主机之间同层之间形成一条逻辑信道。 应用层的…

关于Pandas数据分析

pandas的数据加载与预处理 数据清洗&#xff1a;洗掉脏数据 整理分析&#xff1a;字不如表 数据展现&#xff1a;表不如图 环境搭建 pythonjupyter anaconda Jupyter Notebook Jupyter Notebook可以在网页页面中直接编写代码和运行代码, 代码的运行结果也会直接在代码块下显示…

zabbix学习2--zabbix6.x高可用

文章目录 1. server高可用-默认HA2. 访问高可用 1. server高可用-默认HA 1.部署zabbix单节点后&#xff0c;配置添加HANodeName和NodeAddress即为HA架构 2.zabbix1故障后切换zabbix2使用 3.浏览器访问主机1&#xff0c;使用主机1php前端连接mysql后zabbix2提供后台服务--------…

Linux:进程的本质和fork初识

文章目录 回顾进程查看进程的方式fork 回顾进程 前面对进程进行了一些初步的认知&#xff0c;比如进程可执行程序内核数据结构PCB&#xff0c;再比如可以通过ps命令搭配管道寻找进程&#xff0c;通过/proc系统文件夹查看进程的信息&#xff0c;这些都是前面对进程建立起来的一…

【数据结构】list.h 常用函数实现详解

目录 一、概述二、基础函数✨2.1 INIT_LIST_HEAD✨2.2 list_empty 三、添加结点的函数✨3.1 __list_add✨3.2 list_add✨3.3 list_add_tail 四、删除结点的函数✨4.1 __list_del✨4.2 list_del 五、获取结构体指针、遍历链表✨5.1 list_entry✨5.2 list_for_each✨5.3 list_for…

如何让异步序列(AsyncSequence)优雅的感知被取消(Cancel)

概览 自  从 Swift 5.5 推出新的 async/await 并发模型以来&#xff0c;异步队列&#xff08;AsyncSequence&#xff09;就成为其中不可或缺的重要一员。 不同于普通的序列&#xff0c;异步序列有着特殊的“惰性”和并发性&#xff0c;若序列中的元素还未准备好&#xff0c…

BGP选路的十一条原则(第八课)

华为官网:有详细的BGP11条选路原则介绍 NetEngine AR 产品文档 (huawei.com) 第一 BGP 属性 第二 BGP 十一条选路原则 实操部分

5个小功能掌握正则表达式的使用

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ 这篇文章通过实现5个小功能&#xff0c;来讲述在Java中如何使用正则。 Java中如何使用正则 Java中正则相关类位于java.util.regex包下&#xff0c;主要使用2个类&#xff0…

【Maven入门篇】(1)详细讲解Maven的安装报错解决

&#x1f38a;专栏【Maven入门篇】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【The truth that you leave】 &#x1f970;欢迎并且感谢大家指出我的问题 文章目录 &#x1f33a;Maven介绍⭐作用⭐官网 &#x1f384;maven安…

mysql 5.7 修改密码

为了提高安全性 mysql5.7中user表的password字段已被取消&#xff0c;取而代之的事 authentication_string 字段&#xff0c;当然我们更改用户密码也不可以用原来的修改user表来实现了。下面简绍几种mysql5.7下修改root密码的方法&#xff08;其他用户也大同小异&#xff09;。…

整洁架构能有多整洁?

前段时间&#xff0c;我将一个中大型后端项目顺利地从Spring Boot 2.5 迁移到了Spring Boot 3&#xff0c;整个过程仅花了一天左右时间&#xff0c;在小酌庆祝之余&#xff0c;我开始思考此次迁移之所以能够顺利进行的原因&#xff0c;此时一个概念立即闪现脑海——整洁架构。 …

ARM Cortex-M内核中系统堆栈

文章目录 有无OS的栈结构区别&#xff1a;裸机的任务栈结构带FreeRTOS操作系统的任务栈 ARM的寄存器有哪些特殊寄存器有哪些 关于FreeRTOS中的SP寄存器栈操作【压栈与弹栈的操作】一般函数嵌套调用时sp指针的变化Cortex-M内核的MSP与PSP作用 有无OS的栈结构区别&#xff1a; 裸…

雷达设备问题(从另一个角度看待区间合并 + 贪心思路 + 未发现关键的错误样例)

雷达设备问题 文章目录 雷达设备问题前言题目描述题目分析代码详解错误案例分析&#xff1a;思路代码&#xff1a; 前言 对于区间合并问题&#xff0c;我们一般会将区间按照左端点或者是右端点进行排序&#xff0c;至于其中的选择要依据题目的分析&#xff0c;这里给大家用贪心…

Nginx 设置禁用 OPTIONS 请求

1、修改 nginx 配置 在 nginx.conf 配置文件中&#xff0c;增加如下内容&#xff1a; if ($request_method ~* OPTIONS) {return 403; }效果如下&#xff1a; 2、重启 nginx 服务 systemctl restart nginx或者 service nginx restart3、功能验证 使用如下命令&#xff…

【Java毕设项目】基于SpringBoot+Vue教务管理系统的开发与实现

博主主页&#xff1a;一季春秋博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容&#xff1a;毕业设计(Java项目、小程序、安卓等)、简历模板、学习资料、…

提升群辉AudioStation音乐体验,实现公网音乐播放

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是本教程使用环境&#xff1a;1 群晖系统安装audiostation套件2 下载移动端app3 内网穿透&#xff0c;映射至公网 很多老铁想在上班路上听点喜欢的歌或者相声解解闷儿&#xff0c;于是打开手…