FastChat工作原理解析

news2024/11/19 1:27:06

  在了解FastChat如何完成大模型部署前,先了解下Huggingface提供的Transformer库。
Hugggingface提供的Transformer库

  Hugging Face 的 Transformers 库是一个用于自然语言处理(NLP)任务的 Python 库,旨在简化和加速使用预训练语言模型(如BERT、GPT-2等)的开发和应用。这个库的主要作用包括:
预训练模型的加载和使用: Transformers 库提供了易于使用的接口,允许用户加载各种预训练语言模型,如BERT、GPT-2、T5等。这些模型在大规模文本数据上进行了预训练,并可以用于各种自然语言处理任务,如文本分类、命名实体识别、文本生成等。
文本编码和解码: Transformers 库提供了文本编码和解码功能,可以将文本数据转换为模型可以理解的输入,并将生成的输出转换回文本。这对于处理不同任务的输入和输出数据非常有用。
支持多种任务: 该库支持多种自然语言处理任务,并提供了预训练模型的封装,以便用户可以轻松地在这些任务上进行微调和应用。这些任务包括文本分类、情感分析、命名实体识别、机器翻译等。
模型微调: Transformers 库允许用户对预训练模型进行微调,以适应特定的任务或领域。这使得用户可以在有限的数据集上实现高性能的自然语言处理应用。
模型交流和共享: Hugging Face 的 Transformers Hub 提供了一个平台,允许用户分享、发布和发现预训练模型和相关资源。这有助于加速 NLP 社区的发展和合作。
支持多种深度学习框架 Transformers 库支持多种深度学习框架,包括PyTorch、TensorFlow和JAX,以满足不同用户的需求。

  以通过HuggingFace提供的Tranformer加载和使用预训练大模型为例,下面的代码加载了Bert模型,首先是加载了Bert模型的BertTokennizer用户后面对输入输出新的encode和decode,接着是通过model_name来加载大模型。

# 安装 Transformers 库(如果尚未安装)
# pip install transformers

from transformers import BertTokenizer, BertForSequenceClassification
import torch

# 1. 加载预训练的BERT模型和标记器
model_name = "bert-base-uncased"  # 预训练模型的名称
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name)

# 2. 准备输入文本
text = "Hugging Face Transformers库使自然语言处理变得非常容易。"

# 3. 使用标记器对文本进行编码
inputs = tokenizer(text, return_tensors="pt")

# 4. 使用模型进行文本分类
outputs = model(**inputs)
logits = outputs.logits

# 5. 打印分类结果
print(logits)

  再看国内开源大模型的部署加载命令,以ChatGLM大模型为例。通过下面的代码可以看到,实际也是通过Huggingface提供的transformer库完成的模型下载和使用。即先将大模型相关信息上传到huggingface,后续任何人要下载启动大模型,就可以通过下面的两行代码完成大模型的下载和部署。

AutoTokenizer.from_pretrained 是 Hugging Face Transformers 库中的一个方法,用于从预训练模型的名称或路径加载适当的标记器(Tokenizer)。
AutoModel.from_pretrained 是 Hugging Face Transformers 库中的一个方法,用于从预训练模型的名称或路径加载适当的模型。

from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
model = model.eval()
response, history = model.chat(tokenizer, "你好", history=[])
print(response)

  查看HuggingFace上面的ChatGLM大模型上传的信息,可以看到大模型的参数文件都可以在Huggingface上查询到,具体如下图所示:

理解了前面的信息后,再来看FastChat如何完成各种开源大模型的部署,本质上就是对原来的开源模型部署命令进行了二次封装。FastChat是通过执行“python3 -m fastchat.serve.model_worker --model-path lmsys/vicuna-7b-v1.3”命令部署模型的,所以先来看一下model_worker这个文件的大致内容。

查看model_worker.py中的内容,部分内容如下图所示,可以看到在接口/v1/chat/completions里面又继续进行的请求调用。

按照调用的方法一层一层往下看,会发现model_work.py中的代码调用了controller文件中的代码。controller.py文件中的部分代码内容如下图所示:

在查看controller.py中的代码时,会发现该文件中方法调用了model_adapter.py文件中的方法,而model_adapter又调用了model_chatglm.py文件中方法。以初始化model为例子,层层往下看后,会发现最终load_model方法中的内容,和直接编写脚本load model的方式一样,具体内容如下图红框所示,红框中的内容和大模型官网本身提供的部署命令相同。

除了初始化加载启动大模型,FastChat还封装了api,如果从model_work中查看,一层层往下看,最终会看到如下的代码,下面的代码通过调用model.chat()方法与大模型交互。FastChat提供了兼容OpenAPI的接口,本质上也是进行了二次封装而已。

查看FastChat官网给出的架构图,可以知道,当有用户的请求发送过来时,首先到Gradio Server,也就是前端UI服务,再通过Controller与Worker交互。

从源代码层面来看,主要的代码集中在controller.py,model_worker.py,model_adapter.py,model_xxx.py几个文件中。

  通过上面的分析可以看到,FastChat在支持大模型部署和提供兼容OpenAPI的接口方面,主要是对原有的开源大模型进行了二次封装,让用户在通过FastChat进行大模型部署和使用时更加方便。

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

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

相关文章

Vue3 中的几个坑,你都见过吗?

Vue3 目前已经趋于稳定,不少代码库都已经开始使用它,很多项目未来也必然要迁移至 Vue3。本文记录我在使用 Vue3 时遇到的一些问题,希望能为其他开发者提供帮助。 1. 使用 reactive 封装基础数据类型 传统开发模式中,数据声明很简…

[论文阅读]Visual Attention Network原文翻译

[论文链接]https://arxiv.org/abs/2202.09741 摘要 虽然一开始是被设计用于自然语言处理任务的,但是自注意力机制在多个计算机视觉领域掀起了风暴。然而,图像的二维特性给自注意力用于计算机视觉带来了三个挑战。(1)将图像视作一…

怎样获取字符串数组的长度_使用sizeof(array) / sizeof(array[0])

使用sizeof() C、C中没有提供直接获取数组长度的函数,对于存放字符串的字符数组提供了一个strlen函数获取长度,那么对于其他类型的数组如何获取他们的长度呢? 其中一种方法是使用sizeof(array) / sizeof(array[0]), 在C语言中习惯上在使用时…

Unity 性能优化之Shader分析处理函数ShaderUtil.HasProceduralInstancing: 深入解析与实用案例

Unity 性能优化之Shader分析处理函数ShaderUtil.HasProceduralInstancing: 深入解析与实用案例 点击封面跳转到Unity国际版下载页面 简介 在Unity中,性能优化是游戏开发过程中非常重要的一环。其中,Shader的优化对于游戏的性能提升起着至关重要的作用。…

redis缓存详解

一、Redisson分布式锁存在问题 1、基于redis实现的分布式锁,如果redis集群出现master宕机,而从节点没有接收到锁对应的key,被选举成新的master就可能存在被其它线程加锁成功则存在加锁问题 2、 基于上面的问题,可以把redis分为多…

SpringBoot国际化配置组件支持本地配置和数据库配置

文章目录 0. 前言i18n-spring-boot-starter1. 使用方式0.引入依赖1.配置项2.初始化国际化配置表3.如何使用 2. 核心源码实现一个拦截器I18nInterceptorI18nMessageResource 加载国际化配置 3.源码地址 0. 前言 写个了原生的SpringBoot国际化配置组件支持本地配置和数据库配置 背…

口袋参谋:99.99%商家都学的防骗技巧!

​99%的淘宝天猫商家,必然都要解决一个问题!!! 如何让自己不被敲诈勒索且骗钱! 直接看真实案例 看这个骗子,是如何赤裸裸诈骗商家的! 如果你不想再当冤大头,告诉你一个99.99%有效…

SSM - Springboot - MyBatis-Plus 全栈体系(六)

第二章 SpringFramework 四、SpringIoC 实践和应用 3. 基于 注解 方式管理 Bean 3.1 实验一:Bean 注解标记和扫描 (IoC) 3.1.1 注解理解 和 XML 配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框…

分类预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost多输入分类预测

分类预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于SVM-Adaboost支持向量机结合Ada…

Python 图形化界面基础篇:理解 Tkinter 主事件循环

Python 图形化界面基础篇:理解 Tkinter 主事件循环 引言什么是 Tkinter 主事件循环? Tkinter 主事件循环的使用步骤1:导入 Tkinter 模块步骤2:创建 Tkinter 窗口对象步骤3:设置窗口标题和添加 GUI 元素步骤4&#xff1…

router-link 和 router-view的区别

router-link 实现路由之间的跳转 router-view(路由出口组件 -> 渲染路径匹配到的视图组件) 当你访问的地址与路由path相符时,会将指定的组件替换该router-view router-link router-link 点击实现路由跳转,to属性指向目标地址&…

期权开户需要多长时间?一天可以开好吗?

期权开户一般需要一天到一个月的时间不等。根据不同券商的要求,开户流程和时间可能会有所不同。一些券商会要求客户进行验资,考试,仿真交易等环节,因此需要花费一定的时间来审核和激活账户,下文介绍期权开户需要多长时…

Mybatis-Plus 批量插入数据时报错 java.lang.Object Not Found TableInfoCache

文章目录 前言问题回溯排查过程总结 前言 报错堆栈信息如下,基本是mybatis-plus源码中的一些东西: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: java.lang.Object Not Found TableInfoCache.at com.baomidou.mybatisplus.core.to…

安装wps后,回收站右键菜单出现“恢复误删文件”,通过注册表的方式去掉。

免费的才是最贵的。垃圾流氓软件。 这个东西点开会给你下载一个叫金山数据恢复大师的看起来不知道多少年的老古董。 win R 输入regedit打开注册表按照路径寻找:HKEY_CLASSES_ROOT\CLSID{645FF040-5081-101B-9F08-00AA002F954E}\shellex\ContextMenuHandlers 大功…

黑马JVM总结(五)

(1)方法区 它是所有java虚拟机 线程共享的区,存储着跟类的结构相关的信息,类的成员变量,方法数据,成员方法,构造器方法,特殊方法(类的构造器) 方法区在虚拟机…

makefile之链接静态库

make之链接静态库 (1)方法一: 指定静态库全路径和全名 APP_S_LIBS ./app_lib/libhost.a $(CC) $(CFLAGS) $(SRCOBJ) $(APP_S_LIBS) -o $(TARGET) APP_HEAD_DIR -I./include #APP_LIBS_DIR -L ./app_lib#APP_S_LIBS -lhost APP_S_LIBS ./app_lib/libhost.aCFLAGS $(APP_…

线性代数的本质(一)

文章目录 向量空间向量及其性质基与维数向量的坐标运算 《线性代数的本质》 - 3blue1brown 高中数学A版选修4-2 矩阵与变换 《线性代数及其应用》(第五版) 《高等代数简明教程》- 蓝以中 向量空间 In the beginning Grant created the space. And Grant said, Let there be vec…

ClickHouse进阶(十二):Clickhouse数据字典-2-字典类型

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_大数据OLAP体系技术栈,Apache Doris,Kerberos安全认证-CSDN博客 📌订阅…

buuctf crypto 【[GXYCTF2019]CheckIn】解题记录

1.打开文件,发现密文 2.一眼base64,解密一下 3.解密后的字符串没有什么规律,看了看大佬的wp,是rot47加密,解密一下(ROT5、ROT13、ROT18、ROT47位移编码)

第一章 计算机系统概述 五、中断和异常、系统调用

目录 一、中断的作用 二、中断的类型 1、内中断(异常) 2、外中断 三、中断机制的基本原理 四、系统调用 1、定义: 2、与库函数的区别 3、按功能分类 4、作用 一、中断的作用 1、“中断”是让操作系统内核夺回CPU使用权的唯一途径 …