如何将普通Tokenizer变成Fast Tokenizer
现在的huggingface库里面Tokenizer有两种,一种就是普通的,另一种是fast的。fast和普通的区别就是fast使用rust语言编写,在处理大量文本的时候会更快。我自己测试的时候单一一句的话fast要比普通的慢一些,当量叠上来,到100个句子,1000个句子的时候,fast要成倍数的更快。
下面使用构建自己模型的Tokenizer-CSDN博客中构造的自己的Tokenizer,把它变成TokenizerFast。
首先要导入对sentencepiece模型进行转换的包:
from transformers.convert_slow_tokenizer import SpmConverter
from tokenizers import processors
from transformers import T5TokenizerFast, PreTrainedTokenizerBase
其实主要的转换就是对分词模型的转换。processors用来规定tokenize之后的句子之后是否要加“</s>”之类的special token。
接下来,要定义一个用来convert的类。这个类会将普通Tokenizer的instance,变成fast的Tokenizer的instance。
class MyTokenizerConvertor(SpmConverter):def vocab(self, proto):vocab = [(piece.piece, piece.score) for piece in proto.pieces]loc_extra_ids = self.original_tokenizer._loc_extra_idsvocab = vocab + [("<loc_{}>".format(i), 0.0) for i in range(0, loc_extra_ids)]return vocabdef post_processor(self):return processors.TemplateProcessing(single=["$A", "</s>"],pair=["$A", "</s>", "$B", "</s>"],special_tokens=[("</s>", self.original_tokenizer.convert_tokens_to_ids("</s>")),])
其中vocab将新的词表进行了更新,使得词表长度是原来的词表长度加上我们额外定义的special token的长度。
post_processor定义了,当我们使用.encode方法时候,单句和两句的分词行为:

有post_processor定义,在使用的时候会自动添加special token,这里post_processor最多处理两句,多句就报错了。
定义一个进行转换的函数:
def convert_slow_to_fast(MyTokenizer):return MyTokenizerConvertor(MyTokenizer).converted()
接下来就可以定义我们的TokenizerFast了:
class MyTokenizerFast(T5TokenizerFast):slow_tokenizer_class = MyTokenizerdef __init__(self,vocab_file,tokenizer_file=None,eos_token="</s>",unk_token="<unk>",pad_token="<pad>",loc_extra_ids=100,sp_model_kwargs=None,additional_special_tokens=[],**kwargs):self.vocab_file = vocab_fileself._loc_extra_ids = loc_extra_ids# self.sp_model_kwargs = {} if sp_model_kwargs is None else sp_model_kwargs# self.sp_model = spm.SentencePieceProcessor(**self.sp_model_kwargs)# self.sp_model.Load(self.vocab_file)additional_special_tokens.extend(["<loc_{}>".format(i) for i in range(0, self._loc_extra_ids)])self.additional_special_tokens = additional_special_tokensslow_tokenizer = self.slow_tokenizer_class(vocab_file,tokenizer_file=tokenizer_file,eos_token=eos_token,unk_token=unk_token,pad_token=pad_token,loc_extra_ids=loc_extra_ids,additional_special_tokens=self.additional_special_tokens,**kwargs)fast_tokenizer = convert_slow_to_fast(slow_tokenizer)self._tokenizer = fast_tokenizerPreTrainedTokenizerBase.__init__(self,tokenizer_file=tokenizer_file,eos_token=eos_token,unk_token=unk_token,pad_token=pad_token,additional_special_tokens=self.additional_special_tokens,**kwargs,)
上面就大功告成了,可以分别初始化一个普通的和一个fast的看看效果:
mytokenizer = MyTokenizer("path/to/spiece.model")
mytokenizerfast = MyTokenizerFast("path/to/spiece.model")
import timetexts = ["This is a test sentence to tokenize." for _ in range(1000)] # 100 个句子# 修改计时函数以处理多个句子
def measure_time_batch(tokenizer, texts, iterations=100):start_time = time.time()for _ in range(iterations):_ = tokenizer.batch_encode_plus(texts)end_time = time.time()return end_time - start_timeslow_tokenizer_time = measure_time_batch(mytokenizer, texts)
print(f"Slow tokenizer time for batch: {slow_tokenizer_time:.4f} seconds")fast_tokenizer_time = measure_time_batch(mytokenizerfast, texts)
print(f"Fast tokenizer time for batch: {fast_tokenizer_time:.4f} seconds")

相关文章:
如何将普通Tokenizer变成Fast Tokenizer
现在的huggingface库里面Tokenizer有两种,一种就是普通的,另一种是fast的。fast和普通的区别就是fast使用rust语言编写,在处理大量文本的时候会更快。我自己测试的时候单一一句的话fast要比普通的慢一些,当量叠上来,到…...
联合复现!考虑最优弃能率的风光火储联合系统分层优化经济调度!
前言 目前,尽管不断地追逐可再生能源全额消纳方式,大幅减小弃风弃光电量,但是若考虑风电、光伏发电的随机属性,全额消纳可能造成电网峰谷差、调峰难度及调峰调频等辅助服务费用的剧增,引起电网潜在运行风险。因此&…...
Vue开发前端图片上传给java后端
前端效果图 图片上传演示 1 前端代码 <template><div><!-- 页面标题 --><h1 class"page-title">图片上传演示</h1><div class"upload-container"><!-- 使用 van-uploader 组件进行文件上传,v-model 绑…...
react hooks--useCallback
概述 useCallback缓存的是一个函数,主要用于性能优化!!! 基本用法 如何进行性能的优化呢? useCallback会返回一个函数的 memoized(记忆的) 值;在依赖不变的情况下,多次定义的时候,返回的值是…...
828华为云征文|华为云Flexus X实例docker部署最新Appsmith社区版,搭建自己的低代码平台
828华为云征文|华为云Flexus X实例docker部署最新Appsmith社区版,搭建自己的低代码平台 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Ng…...
webservice cxf框架 jaxrs jaxws spring整合 接口测试方法 wsdl报文详解 springboot整合 拦截器 复杂参数类型
webservice cxf框架 jaxrs jaxws spring整合 【java进阶教程之webservice深入浅出【黑马程序员】】 webservice接口测试方法 【SoapUI让你轻松玩转WebService接口测试【特斯汀学院】】 webservice wsdl报文详解 【webservice - 尚硅谷周阳新视频】 webservice springbo…...
2024AI做PPT软件如何重塑演示文稿的创作
现在AI技术的发展已经可以帮我们写作、绘画,最近我发现了不少ai做ppt的工具!不体验不知道,原来合理使用AI工具可以有效的帮我们进行一些办公文件的编写,提高了不少工作效率。如果你也有这方面的需求就接着往下看吧。 1.笔灵AIPPT…...
谷神后端list转map
list转map /*** list2map* list转map:支持全量映射、单字段映射。* * param $list:list:列表。* param $key:string:键。* param $field:string:值字段域。** return map**/ #function list2map($list, $key, $field)#if ($vs.util.isList($list) and $vs.util.is…...
Java集合(Map篇)
一.Map a.使用Map i.键值(key-value)映射表的数据结构,能高效通过key快速查找value(元素)。 ii.Map是一个接口,最常用的实现类是HashMap。 iii.重复放入k-v不会有问题,但是一个…...
VUE3配置路由(超级详细)
第一步创建vue3的项目...
【笔记】机器学习算法在异常网络流量监测中的应用
先从一些相对简单的综述类看起,顺便学学怎么写摘要相关工作的,边译边学 机器学习算法在异常网络流量监测中的应用 原文:Detecting Network Anomalies in NetFlow Traffic with Machine Learning Algorithms Authors: Quc Vo, Philippe Ea, Os…...
江协科技STM32学习- P15 TIM输出比较
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...
使用python-pptx批量删除备注:清除PPT文档中的所有备注信息
哈喽,大家好,我是木头左! 在制作和分享PPT时,经常需要添加一些注释或备注来帮助观众更好地理解内容。然而,有时候需要将这些备注从PPT中移除,以保持演示的简洁性。幸运的是,可以使用python-pptx库来实现这一目标。本文将详细介绍如何使用python-pptx批量删除PPT中的备注…...
RTX NVIDIA 3090卡配置对应pytorch,CUDA版本,NVIDIA驱动过程及问题整理
买了两块3090卡闲置很长时间了,之前tf 1.12.0版本用习惯了不想转工具。这段时间闲下来转了之后有些环境不适配,在雷神帮助下安装完毕,虽然出了点怪东西,整体还好。 原环境CUDA为11.4 其他配置如下 之前conda install的pytorch实为…...
【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL21
根据状态转移表实现时序电路 描述 某同步时序电路转换表如下,请使用D触发器和必要的逻辑门实现此同步时序电路,用Verilog语言描述。 电路的接口如下图所示。 输入描述: input A , input clk , …...
【深度】为GPT-5而生的「草莓」模型!从快思考—慢思考到Self-play RL的强化学习框架
原创 超 超的闲思世界 2024年09月11日 19:17 北京 9月11日消息,据外媒The Information昨晚报道,OpenAI的新模型「草莓」(Strawberry),将在未来两周内作为ChatGPT服务的一部分发布。 「草莓」项目是OpenAI盛传已久的…...
【编程底层原理】Java常用读写锁的使用和原理
一、引言 在Java的并发世界中,合理地管理对共享资源的访问是至关重要的。读写锁(ReadWriteLock)正是一种能让多个线程同时读取共享资源,而写入资源时需要独占访问的同步工具。本文将带你了解读写锁的使用方法、原理以及它如何提高…...
自恢复保险丝SMD1206B005TF在电路中起什么作用
自恢复保险丝SMD1206B005TF在电路中起到过流保护的作用。 自恢复保险丝,也称为正温度系数(PTC)热敏电阻,是一种能够在电流超过预设值时自动断开电路,并在故障排除后自动恢复的元件。这种保险丝的核心材料是高分子聚合…...
2024年躺平,花大半年的时间,就弄了这一件事儿:《C++面试真题宝典》
今年,是我的第3个躺平年,躺得我四肢都快蜕化了... 为了让一切都变得舒服,我决定主动地去做些什。 在我生命的一个不起眼却意义非凡的角落,我与C结下了不解之缘。这份热爱,如同一位老友,陪伴我度过了无数个…...
PHP基础语法讲解
大家好,我是程序员小羊! 前言: PHP(Hypertext Preprocessor)是一种常用于网页开发的服务器端脚本语言,易于学习并且与 HTML 紧密结合。以下是 PHP 的基础语法详细讲解。 1. PHP 基础结构 1.1 PHP 脚本结…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
阻止除自定义标签之外的所有标签 先输入一些标签测试,说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时(如通过点击或键盘导航&…...
