llm的inference(二)

文章目录

  • Tokenizer
    • 分词
    • 1.单词分词法
    • 2.单字符分词法
    • 3.子词分词法
      • BPE(字节对编码,Byte Pair Encoding)
      • WordPiece
      • Unigram Language Model(ULM)
  • embedding的本质
  • 推理时的一些指标
  • 参考链接

Tokenizer

在使用模型前,都需要将sequence过一遍Tokenizer,进去的是word序列(句子级),出来的是number序列。事实上,HuggingFace的tokenizer总体上做了三件事情:

  1. 分词。将字符串分为一些sub-word token string。再将token string映射到ID,并保留来回映射的mapping。从string映射到ID为tokenizer encode过程,从ID映射回token string 为tokenizer decode过程。映射方法有很多,如BERT用的是WordPiece,GPT-2和RoERTa用的是BPE。
  2. 扩展词汇表。部分tokenizer会用一种统一的方法将训练语料中出现的但是词汇表中本来没有的token加入词汇表
  3. 识别并处理特殊token。特殊token包括[MASK],等。tokenzier会将它们加入词汇表中,并且保证它们在模型中不被切成sub-word,而是完整保留。

分词

从本质来说,文本数据整体上先是文档集合,然后是每一篇文档,然后是每一个段落,然后是每一个句子,然后是每一个短语,然后是每一个词,然后是每一个子词,最后是每一个字符

不同的分词粒度,会导致分词的结果不同,当然也就影响了网络最终的输出结果。下面我们一一介绍。

1.单词分词法

最直观的分词是单词级分词法。单词分词法将一个word作为最小单元,也就是根据空格或者标点分词。
例如Today is Sunday.使用word-base来进行分词会变成['Today','is','Sunday','.']。这种分词方法简单容易理解,每个word都分配一个ID,则所需要的Vocabulary根据语料大小而不同,而且这种分词方式,会将两个本身意思一致的词分成两个毫不相同的ID,例如:cat,cats。

2.单字符分词法

最细粒度的分词方法是单字符分词法(character-base)。它会穷举所有出现的字符,所以是最完整的。在上面的例子中,单字符分词法会生成['T','o','d','a','y',...,'a','y','.']
这种分词方式会导致Vocabulary相对小的多,但分词后的每个字符是毫无意义的,而且输出长度变长不少,只有组装后才有意义。这种分词在模型的初始character embedding是毫无意义的。英文中尤为明显,但是中文却是较为合理,中文中用此种方式较多。

3.子词分词法

这是一种最常用的,介于以上两种方法之间的分词方法,我们称为子词分词法
子词分词法会把上面的句子分成最小可分的子词['To','day','is','S','un','day','.']。子词分词法有很多种取得最小可分子词的方法,例如BPE,WordPiece,SentencePiece,Unigram等等。

BPE(字节对编码,Byte Pair Encoding)

这是目前应用最多的分词方法,GPT以及Llama系列都在使用这种分词方法。具体过程请参考这篇博客。
完成了上述的BPE训练过程,我们就会得到一个词表(vocabulary),但是如何对输入语句进行编码(也就是BPE分词)呢?

  1. 将词表按照其中token的长度,从长到短进行排列;
    例如排序好之后的词表为:
[“errrr</w>”, “tain</w>”, “moun”, “est</w>”, “high”, “the</w>”, “a</w>]
  1. 对输入语句word-level的分词结果进行转化,例如输入语句为:
[“the</w>”, “highest</w>”, “mountain</w>]

则转化为:

"the</w>" -> ["the</w>"]
"highest</w>" -> ["high", "est</w>"]
"mountain</w>" -> ["moun", "tain</w>"]

注:在编码过程结束后,如果输入语句中仍然有子字符串没被替但是词表中的所有token都已经迭代完毕,则将剩余的子词替换为特殊的token,如< unk >。原则上< unk >这个token出现的越少越好,我们也往往用< unk >的数量来评价一个tokenizer的好坏程度,这个token出现的越少,tokenizer的效果往往越好。

那么如何对网络的输出进行解码呢?将所有的tokens拼在一起即可,例如:

# 网络输出
["the</w>", "high", "est</w>", "moun", "tain</w>"]# 解码序列
"the</w> highest</w> mountain</w>" 

BPE是一种贪婪算法,因为它一直在搜索,知道遇到终止条件才会停止。

WordPiece

WordPiece是BERT使用的分词方法,可以看作是BPE的变种。两者很重要的区别是如何选择两个子词进行合并:WordPiece选择能够提升语言模型概率最大的相邻子词构造词表,但是BPE选择频数最高的相邻子词合并。大致的数学原理请参考这篇博客。

Unigram Language Model(ULM)

ULM与上面的两种分词方法相比,不同之处在于BPE和WordPiece算法的词表都是从小到大变化,属于增量法,而ULM则是减量法,即先初始化一个大词表,根据评估准则不断丢弃词汇,直到满足限定条件。

embedding的本质

我们知道tokenization后就要进行embedding,它的表象是将one-hot的高维向量转为更密集的低维向量的过程,数学上就是对one-hot向量乘以一个矩阵。参考这篇博客,在其中说明了embedding矩阵的本质是什么。在其中指出,Embedding矩阵的本质是一个查找表,由于输入向量是one-hot的,embedding矩阵中有且仅有一行被激活。 博客中作者给出的图如下所示:
在这里插入图片描述
对于第一个单词"I",one-hot编码为[0,0,1,0,0],将其与embedding矩阵相乘,相当于去除embedding矩阵的第3行(index为2),其他的同理。每个单词会定位这个表中的每一行,而这一行就是这个单词学习到的在**嵌入空间(低维密集空间)**的语义。

推理时的一些指标

  1. First Token Latency(首字延迟):指的是当一批用户进入推理系统之后,用户完成prefill阶段(有关prefill的内容参考这篇博客)的过程需要花费多长时间,也称为首个词元生成时间(Time To First Token,简称TTFT)。这也是系统生成第一个字符所需要的响应时间,希望用户在系统上输入问题后得到回答的时间小于2~3秒。
  2. Throughput(吞吐量):当系统的负载达到最大的时候,单位时间内,能够执行多少个Decode,即生成多少个字符。
  3. 单个输出词元的生成时间(Time Per Output Token,简称TOPT):为每个用户生成一个输出词元所需要的时间。
  4. 时延:系统为用户生成完整相应的总时间。整体 相应时延可使用下面的计算方式:时延=TTFT + TPOT*待生成的词元数。

参考链接

  1. https://zhuanlan.zhihu.com/p/360290118
  2. https://martinlwx.github.io/zh-cn/the-bpe-tokenizer/
  3. https://zhuanlan.zhihu.com/p/631463712
  4. https://zhuanlan.zhihu.com/p/198964217
  5. https://www.zhihu.com/question/595001160/answer/3401487634
  6. https://zhuanlan.zhihu.com/p/663282469

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯省赛真题25】python密室逃脱游戏 青少年组蓝桥杯比赛python编程省赛真题解析

目录 python密室逃脱游戏 一、题目要求 1、编程实现 2、输入输出

FL Studio21升级至国际完整版详细步骤准备工作

一、准备工作 备份项目文件&#xff1a;在升级之前&#xff0c;请务必备份您在FL Studio中的所有项目和重要数据。这可以通过将项目文件夹复制到外部存储设备或云存储中来实现。检查系统要求&#xff1a;确保您的计算机满足FL Studio国际完整版的系统要求。这包括操作系统版本…

xss-跨站脚本攻击漏洞

前备知识&#xff1a; Cookie和Session是Web开发中用于维持用户状态、跟踪用户会话的核心技术&#xff0c;它们的主要目的是在无状态的HTTP协议基础上实现有状态的用户交互。 **Cookie**&#xff1a; - Cookie是一种由服务器发送到客户端&#xff08;通常是用户的浏览器&#x…

react中修改state中的值无效?

// 初始化state state {personArr:[{name:张三,id:1},{name:李四,id:2},{name:王五,id:3}] }componentDidMount(){const newName 赵六const indexUpdate 1const newArr this.state.personArr.map((item,index)>{if(indexUpdate index){return {...item,name:newName}}e…

开发知识点-.netC#图形用户界面开发之WPF

C#图形用户界面开发 框架简介WinForms(Windows Forms):WPF(Windows Presentation Foundation):UWP(Universal Windows Platform):MAUI(Multi-platform App UI):选择控件参考文章随笔分类 - WPF入门基础教程系列基于C#语言的GUI开发,主要介绍WPF框架

常见的音频与视频格式

本专栏是汇集了一些HTML常常被遗忘的知识&#xff0c;这里算是温故而知新&#xff0c;往往这些零碎的知识点&#xff0c;在你开发中能起到炸惊效果。我们每个人都没有过目不忘&#xff0c;过久不忘的本事&#xff0c;就让这一点点知识慢慢渗透你的脑海。 本专栏的风格是力求简洁…

vue + koa + 阿里云部署 + 宝塔—阿里云宝塔配置使用说明

一直想着构建自己的网站&#xff0c;最近还有点时间&#xff0c;就开始琢磨着搞一下&#xff0c;学习心得正好记录下&#xff1a; 首先构建自己的网站第一步肯定是选择 云服务 供应商&#xff0c;现在普遍公知的也就是&#xff1a;百度云、阿里云、华为云等等&#xff0c;我用的…

《C++ Primer Plus》《9、内存模型和名称空间》

文章目录 前言1 单独编译2 存储持续性、作用域和链接性2.1作用域和链接2.2自动存储连续性2.3静态持续变量2.4静态持续性、外部链接性2.5静态持续性、内部链接性2.6静态存储连续性、无链接性2.7说明符和限定符2.8函数和链接性2.9语言链接性(了解)2.10存储方案和动态分配 3 名称空…

基于SpringBoot+Apache ECharts的前后端分离外卖项目-苍穹外卖(十八)

数据展示 1. Apache ECharts1.1 介绍1.2 入门案例 2. 营业额统计2.1 需求分析和设计2.1.1 产品原型2.1.2 接口设计 2.2 代码开发2.2.1 VO设计2.2.2 Controller层2.2.3 Service层接口2.2.4 Service层实现类2.2.5 Mapper层 2.3 功能测试 3. 用户统计3.1 需求分析和设计3.1.1 产品…

Linux的进程

在Linux中&#xff0c;可以使用多种方式来结束进程。以下是8种常见的方式&#xff1a; 终端中断&#xff08;Ctrl C&#xff09;&#xff1a;在终端中运行的程序可以通过按下Ctrl C组合键来发送SIGINT信号&#xff0c;终止该进程的执行。 kill命令&#xff1a;使用kill命令可…

【大数据】Flink SQL 语法篇(四):Group 聚合、Over 聚合

Flink SQL 语法篇&#xff08;四&#xff09;&#xff1a;Group 聚合、Over 聚合 1.Group 聚合1.1 基础概念1.2 窗口聚合和 Group 聚合1.3 SQL 语义1.4 Group 聚合支持 Grouping sets、Rollup、Cube 2.Over 聚合2.1 时间区间聚合2.2 行数聚合 1.Group 聚合 1.1 基础概念 Grou…

设计模式浅析(六) ·命令模式

设计模式浅析(六) 命令模式 日常叨逼叨 java设计模式浅析&#xff0c;如果觉得对你有帮助&#xff0c;记得一键三连&#xff0c;谢谢各位观众老爷&#x1f601;&#x1f601; 命令模式 概念 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c…