Meta Llama 3 文本编码为 token

2024-06-05 04:44
文章标签 meta llama token 文本 编码

本文主要是介绍Meta Llama 3 文本编码为 token,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Meta Llama 3 文本编码为 token

flyfish

tiktoken 是一个用于 OpenAI 模型的快速 BPE 分词器,这里用在Meta Llama 3上。主要功能包括将文本编码为token,以及将token解码回文本。这个过程通常使用BPE(Byte Pair Encoding)算法或其他类似的子词分割方法。

参考网址

https://github.com/openai/tiktoken
https://github.com/karpathy/minbpe

什么是BPE(Byte Pair Encoding)?
BPE(Byte Pair Encoding)是一种用于文本分词的子词(subword)分割算法。它通过逐步合并最常见的字符或字符序列来减少词汇表的大小,从而能够更高效地处理和表示文本数据。

BPE在tiktoken中的应用

简单的应用

import tiktoken# 获取GPT-2编码器
enc = tiktoken.get_encoding("gpt2")# 示例文本
text = "This is an example text."# 将文本编码为tokens
tokens = enc.encode(text)
print(f"Encoded tokens: {tokens}")# 将tokens解码为原文本
decoded_text = enc.decode(tokens)
print(f"Decoded text: {decoded_text}")

Meta Llama 3的使用方式 - load_tiktoken_bpe函数

在tiktoken库中,BPE用于将文本编码成模型可以处理的tokens。load_tiktoken_bpe函数会加载BPE编码的词汇表和规则,以便将文本分解成子词单位。

代码示例

import os
from logging import getLogger
from pathlib import Path
from typing import (AbstractSet,cast,Collection,Dict,Iterator,List,Literal,Sequence,TypedDict,Union,
)import tiktoken
from tiktoken.load import load_tiktoken_bpelogger = getLogger(__name__)Role = Literal["system", "user", "assistant"]class Message(TypedDict):role: Rolecontent: strDialog = Sequence[Message]class Tokenizer:"""Tokenizing and encoding/decoding text using the Tiktoken tokenizer."""special_tokens: Dict[str, int]num_reserved_special_tokens = 256pat_str = r"(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|\p{N}{1,3}| ?[^\s\p{L}\p{N}]+[\r\n]*|\s*[\r\n]+|\s+(?!\S)|\s+"  # noqa: E501def __init__(self, model_path: str):"""Initializes the Tokenizer with a Tiktoken model.Args:model_path (str): The path to the Tiktoken model file."""assert os.path.isfile(model_path), model_pathmergeable_ranks = load_tiktoken_bpe(model_path)num_base_tokens = len(mergeable_ranks)special_tokens = ["<|begin_of_text|>","<|end_of_text|>","<|reserved_special_token_0|>","<|reserved_special_token_1|>","<|reserved_special_token_2|>","<|reserved_special_token_3|>","<|start_header_id|>","<|end_header_id|>","<|reserved_special_token_4|>","<|eot_id|>",  # end of turn] + [f"<|reserved_special_token_{i}|>"for i in range(5, self.num_reserved_special_tokens - 5)]self.special_tokens = {token: num_base_tokens + i for i, token in enumerate(special_tokens)}self.model = tiktoken.Encoding(name=Path(model_path).name,pat_str=self.pat_str,mergeable_ranks=mergeable_ranks,special_tokens=self.special_tokens,)logger.info(f"Reloaded tiktoken model from {model_path}")self.n_words: int = self.model.n_vocab# BOS / EOS token IDsself.bos_id: int = self.special_tokens["<|begin_of_text|>"]self.eos_id: int = self.special_tokens["<|end_of_text|>"]self.pad_id: int = -1self.stop_tokens = {self.special_tokens["<|end_of_text|>"],self.special_tokens["<|eot_id|>"],}logger.info(f"#words: {self.n_words} - BOS ID: {self.bos_id} - EOS ID: {self.eos_id}")def encode(self,s: str,*,bos: bool,eos: bool,allowed_special: Union[Literal["all"], AbstractSet[str]] = set(),disallowed_special: Union[Literal["all"], Collection[str]] = (),) -> List[int]:assert type(s) is strTIKTOKEN_MAX_ENCODE_CHARS = 400_000MAX_NO_WHITESPACES_CHARS = 25_000substrs = (substrfor i in range(0, len(s), TIKTOKEN_MAX_ENCODE_CHARS)for substr in self._split_whitespaces_or_nonwhitespaces(s[i : i + TIKTOKEN_MAX_ENCODE_CHARS], MAX_NO_WHITESPACES_CHARS))t: List[int] = []for substr in substrs:t.extend(self.model.encode(substr,allowed_special=allowed_special,disallowed_special=disallowed_special,))if bos:t.insert(0, self.bos_id)if eos:t.append(self.eos_id)return tdef decode(self, t: Sequence[int]) -> str:return self.model.decode(cast(List[int], t))@staticmethoddef _split_whitespaces_or_nonwhitespaces(s: str, max_consecutive_slice_len: int) -> Iterator[str]:current_slice_len = 0current_slice_is_space = s[0].isspace() if len(s) > 0 else Falseslice_start = 0for i in range(len(s)):is_now_space = s[i].isspace()if current_slice_is_space ^ is_now_space:current_slice_len = 1current_slice_is_space = is_now_spaceelse:current_slice_len += 1if current_slice_len > max_consecutive_slice_len:yield s[slice_start:i]slice_start = icurrent_slice_len = 1yield s[slice_start:]model_path = "Meta-Llama-3-8B-Instruct/tokenizer.model"
tokenizer = Tokenizer(model_path)print(tokenizer.encode( "This is a test sentence.", bos=True,eos=True))print(tokenizer.decode( [128000, 2028, 374, 264, 1296, 11914, 13, 128001]))输出[128000, 2028, 374, 264, 1296, 11914, 13, 128001]
<|begin_of_text|>This is a test sentence.<|end_of_text|>

再测试一个

print(tokenizer.encode( "This is Ji'nan in the winter", bos=True,eos=True))
print(tokenizer.decode( [128000, 2028, 374, 55551, 6, 19285, 304, 279, 12688, 128001]))

输出

[128000, 2028, 374, 55551, 6, 19285, 304, 279, 12688, 128001]
<|begin_of_text|>This is Ji'nan in the winter<|end_of_text|>

在这个例子中,load_tiktoken_bpe函数加载了一个预训练的BPE词汇表和规则,然后使用这些规则将输入的文本分割成tokens。之后,这些tokens可以被解码回原文本。

扩展

import tiktoken
cl100k_base = tiktoken.get_encoding("cl100k_base")# In production, load the arguments directly instead of accessing private attributes
# See openai_public.py for examples of arguments for specific encodings
enc = tiktoken.Encoding(# If you're changing the set of special tokens, make sure to use a different name# It should be clear from the name what behaviour to expect.name="cl100k_im",pat_str=cl100k_base._pat_str,mergeable_ranks=cl100k_base._mergeable_ranks,special_tokens={**cl100k_base._special_tokens,"<|im_start|>": 100264,"<|im_end|>": 100265,}
)print(enc)#<Encoding 'cl100k_im'>

这篇关于Meta Llama 3 文本编码为 token的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032108

相关文章

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别

转发来源:https://swift.ctolib.com/ooooverflow-chinese-ocr.html chinese-ocr 基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别 环境部署 sh setup.sh 使用环境: python 3.6 + tensorflow 1.10 +pytorch 0.4.1 注:CPU环境

Linux文本三剑客sed

sed和awk grep就是查找文本当中的内容,最强大的功能就是使用扩展正则表达式 sed sed是一种流编辑器,一次处理一行内容。 如果只是展示,会放在缓冲区(模式空间),展示结束后,会从模式空间把结果删除 一行行处理,处理完当前行,才会处理下一行。直到文件的末尾。 sed的命令格式和操作选项: sed -e '操作符 ' -e '操作符' 文件1 文件2 -e表示可以跟多个操作

完整的申请邓白氏编码的流程(手把手教你申请邓白氏编码

完整的申请邓白氏编码的流程(手把手教你申请邓白氏编码)  标签: 编码邓白氏编码申请流程苹果开发者账号申请 2016-07-08 16:13  2274人阅读  评论(2)  收藏  举报   分类: 技术  苹果开发  邓白氏编码申请 版权声明:本文为博主原创文章,未经博主允许不得转载。     申请公司的苹果开发者账号和企业级的苹

Unity Meta Quest 开发:关闭 MR 应用的安全边界

社区链接: SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 📕教程说明 这期教程我将介绍如何在应用中关闭 Quest 系统的安全边界。 视频讲解: https://www.bilibili.com/video/BV1Gm42157Zi 在 Unity 中导入 Meta XR SDK,进行环境配置后,打开 Assets > Plugins > An

nlp基础-文本预处理及循环神经网络

1 认识文本预处理 1 文本预处理及其作用 定义:文本送给模型之前,提前要做的工作 作用:指导模型超参数的选择 、提升模型的评估指标 举个例子: 思路常识,打造成 X Y关于Y:10分类标签是否均衡关于X:数据有没有脏数据 数据长度(512)样本不够! 文本预处理 工作 结束 的标志:准备出来X和Y 能送给模型 2 文本预处理的主要环节 1 文本处理的基本方法 分词:按照一定规

文本三剑客—sed命令

sed命令 一、概念 sed是一种流编辑器,一次处理一行内容。 处理方式:一行一行处理,处理完当前行,才会处理下一行,直到文件末尾。 如果只是展示,会放在缓冲区(模式空间),展示结束之后,会从模式空间把操作结果删除。 二、sed的命令格式和操作选项 1、命令格式 sed -e ‘操作符1;操作符2’ 文件1 文件2 sed -e ‘操作符’ -e ‘操作符’ 文件1 文件2 -e

NLP中文本的嵌入层

在自然语言处理(NLP)任务中,模型学习的不是原始的文本字符串,而是这些字符串通过分词和索引化过程转换成的单词索引。实际学习的内容是这些单词索引对应的嵌入向量及其在模型中的权重。 原始文本到模型输入的过程 原始文本: 例如:“hello world” 分词(Tokenization): 将文本字符串分割成单词、子词或字符。例如:["hello", "world"] 构建词汇表(Voc

解析PDF文件中的图片为文本

解析PDF文件中的图片为文本 1 介绍 解析PDF文件中的图片,由两种思路,一种是自己读取PDF文件中的图片,然后用OCR解析,例如:使用PyMuPDF读取pdf文件,再用PaddleOCR或者Tesseract-OCR识别文字。另一种使用第三方框架,直接读取文字,例如:OCRmyPDF。 读取pdf的包PyMuPDF可以获取PDF中的文本、布局和图片等,并且内嵌了Tesseract-OCR

PDF 文本复制自动去换行符,去格式

一、参考内容 GitHub:PDF 文本复制自动去换行符,去格式