关于LLaMA Tokenizer的一些坑...

这篇具有很好参考价值的文章主要介绍了关于LLaMA Tokenizer的一些坑...。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用LLaMA Tokenizer对 jsonl 文件进行分词,并将分词结果保存到 txt 文件中,分词代码如下:

import jsonlines
import sentencepiece as spm
from tqdm import tqdm

jsonl_file = '/path/to/jsonl_file'
txt_file = '/path/to/txt_file'

tokenizer = spm.SentencePieceProcessor('./tokenizer.model')
w = open(txt_file, mode='w', encoding='utf-8')

with jsonlines.open(jsonl_file, mode='r') as r:
    for line in tqdm(r):
        ids = tokenizer.Encode(line['text'])
        tokenized_text = ' '.join(tokenizer.IdToPiece(i) for i in ids)
        w.write(f"{tokenized_text}\n")

w.close()

从以上代码可以看出,txt 文件中的每行内容实际上是 jsonl 文件对应行的文档的分词结果,分词之间以空格分隔。理论上,这意味着 txt 文件的行数应与 jsonl 文件的行数相匹配均等同于文档数量。然而,实际情况可能出现 txt 文件的行数显著超过 jsonl 文件的行数。

既然行数对不上,那自然就需要找到第一个出现问题的行。为此,我们重新执行分词过程,并在每行的开头添加该行的索引(从 1 1 1 开始)以便追踪。

with jsonlines.open(jsonl_file, mode='r') as r:
    for idx, line in tqdm(enumerate(r, start=1)):
        ids = tokenizer.Encode(line['text'])
        tokenized_text = ' '.join(tokenizer.IdToPiece(i) for i in ids)
        w.write(f"{idx} {tokenized_text}\n")

然后遍历 txt 文件,找到第一个出现问题的行:

with open(txt_file, mode='r') as r:
    for cnt, line in tqdm(enumerate(r, start=1)):
        idx = line[:line.index(' ')]
        if str(cnt) != idx:
            print(cnt)
            break

打开 txt 文件,发现出现问题的行的开头压根没有数字,这说明分词结果被某种特殊字符换行了。要注意LLaMA词表是没有换行符 \n 的(被映射到 <unk> 了),那还能是什么字符导致换行的呢?

jsonl 文件中对应的行抽取出来,单独对它进行分词,然后将分词结果打印到终端上,发现并没有换行,然而将这个分词结果单独写入到一个新的文件中时,换行出现了。通过对每一个token单独进行分析,发现其中有一个token含有 \r,而这个字符正是导致换行的罪魁祸首!

📝 \r 字符是回车符(Carriage Return, CR),在ASCII表中的位置是十进制的13或者十六进制的0x0D。这个字符最初设计用于打字机和早期计算机,指的是将打印头移动到一行的开始位置而不换到下一行,这样新的文本就会覆盖掉同一行上旧的文本。

  • 在Python中使用 print('\r') 时,并不会导致在控制台上换行,因为 \r 只是将光标移回行首,而没有执行换到新行的操作。例如 print('aaa\rbb') 会输出 bba
  • 而在文本文件中写入 \r 字符时,文本编辑器可能会将其解释为换行符,因此会触发换行效果。

接下来,我们就可以找出LLaMA词表中所有可能会导致换行的token了:

tokenizer = spm.SentencePieceProcessor('./tokenizer.model')
vocab_size = tokenizer.GetPieceSize()
for i in range(vocab_size):
    piece = tokenizer.IdToPiece(i)
    if '\r' in piece:
        print(f"{i}: {list(piece)}")

一共有 24 24 24 个:

2104: [';', '\r']
3238: ['>', '\r']
3336: ['▁', '{', '\r']
4970: ['▁', '}', '\r']
6075: [')', ';', '\r']
6756: ['▁', '\r']
8117: ['}', '\r']
8443: [')', '\r']
10175: ['"', '>', '\r']
11167: [',', '\r']
14078: ['(', ')', ';', '\r']
14626: ['{', '\r']
15231: ['"', ',', '\r']
16737: ['%', ';', '\r']
17822: ["'", ')', ';', '\r']
18584: ['"', ')', ';', '\r']
19451: ['"', '\r']
22993: ['.', '\r']
23592: ["'", ',', '\r']
24426: ['▁', '}', ')', ';', '\r']
25982: ['"', ';', '\r']
26471: ['(', ')', '\r']
29722: ['▁', '*', '/', '\r']
30004: ['\r']

可以看出,位于索引 30004 处的token刚好就是 \r,而其他token则均是以 \r 结尾。


很多场景下,我们可能需要保证 jsonltxt 的行数一致才能进行下一步,为此有两种选择方案:

  • 在生成 jsonl 文件的时候做一个预处理,判断其中是否有token包含在上述24个token之一(该方案可保持 jsonl 行数不变)。
  • 对生成的 jsonl 文件按照上述的24个token进行过滤(该方案会导致 jsonl 行数减少)。

无论是哪种方案,都涉及到对是否包含的判断。设24个token构成的列表为 a,某个文档的分词结果为 b,于是问题便归结为判断 a 中是否有元素出现在了 b 中(反之亦然)。根据这篇博客的结论,我们可以用集合法来快速判断。文章来源地址https://www.toymoban.com/news/detail-828203.html

tokenizer = spm.SentencePieceProcessor('./tokenizer.model')
stop = {2104, 3238, 3336, 4970, 6075, 6756, 8117, 8443, 10175, 11167, 14078, 14626, 15231, 16737, 17822, 18584, 19451, 22993, 23592, 24426, 25982, 26471, 29722, 30004}

def valid(ids):
    return not bool(set(ids).intersection(stop))

with jsonlines.open(jsonl_file, mode='r') as r:
    for idx, line in tqdm(enumerate(r, start=1)):
        ids = tokenizer.Encode(line['text'])
        if not valid(ids):
            print(f"Line {idx} is invalid data!")

到了这里,关于关于LLaMA Tokenizer的一些坑...的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【人工智能】关于人类大脑模型的一些数学公式

    关于人类大脑建模的数学公式主要涉及到神经元网络、激活函数、学习算法等方面。这里是一些常见的数学公式(使用Markdown和LaTeX语法)。 神经网络的万能逼近定理(Universal Approximation Theorem)是关于在一定条件下神经网络能够逼近任意连续函数的定理。有多个版本的定理针

    2024年02月07日
    浏览(68)
  • 上海人工智能实验室发布LLaMA-Adapter | 如何1小时训练你的多模态大模型用于下游任务

    本文首发于微信公众号 CVHub,未经授权不得以任何形式售卖或私自转载到其它平台,违者必究! Title: LLaMA-Adapter: Efficient Fine-tuning of Language Models with Zero-init Attention Code: https://github.com/zrrskywalker/llama-adapter PDF: https://arxiv.org/pdf/2303.16199.pdf Instruction-Following 指令跟随方法:是指通过

    2024年02月09日
    浏览(70)
  • LLaMA加载时遇见:ValueError: Tokenizer class LLaMATokenizer does not exist or is not currently imported.

    在加载LLaMA模型时遇到到的问题及解决方法。 解决方法: 找到llama模型中的tokenizer_config.json文件,把“tokenizer_class”对应的“LLaMATokenizer”改为“LlamaTokenizer”。 在解决问题1后,继续运行可能会遇到下面的问题: 解决方法: !pip install transformers[sentencepiece]

    2024年02月08日
    浏览(44)
  • 【NLP】Llama & Alpaca大模型

      🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】 ​​  🖍foreword

    2024年02月09日
    浏览(46)
  • [NLP]LLaMA与LLamMA2解读

    摘要 Meta最近提出了LLaMA(开放和高效的基础语言模型)模型参数包括从7B到65B等多个版本。最值得注意的是,LLaMA-13B的性能优于GPT-3,而体积却小了10倍以上,LLaMA-65B与Chinchilla-70B和PaLM-540B具有竞争性。 一般而言,模型越大,效果越好。然而有文献指出[1],当给定计算量的预算之

    2024年02月15日
    浏览(34)
  • NLP实践——使用Llama-2进行中文对话

    在之前的博客 NLP实践——Llama-2 多轮对话prompt构建中,介绍了如何构建多轮对话的prompt,本文将介绍如何使用Llama-2进行中文对话。 现有的很多项目,在开源的Llama-2基础上,进行了中文场景的训练,然而Llama-2本身就具有多语种的能力,理论上是可以直接运用于中文场景的。

    2024年02月14日
    浏览(37)
  • NLP实践——Llama-2 多轮对话prompt构建

    最近,META开源了Llama-2模型,受到了广泛的关注和好评,然而,在官方给的使用说明中,并没有对使用方法进行特别细节的介绍,尤其是对于对话任务,这就给我们在使用时带来了很多困扰。 以ChatGLM为例,在执行多轮对话时,需要将历史信息拼接到输入中,以供模型在生成时

    2024年02月15日
    浏览(40)
  • [NLP] Llama2模型运行在Mac机器

    本文将介绍如何使用llama.cpp在MacBook Pro本地部署运行量化版本的Llama2模型推理,并基于LangChain在本地构建一个简单的文档QA应用。本文实验环境为Apple M1 芯片 + 8GB内存。 Llama2是 Meta AI开发的Llama大语言模型的迭代版本,提供了7B,13B,70B参数的规格。Llama2和Llama相比在对话场景中

    2024年01月16日
    浏览(49)
  • [NLP]LLM---FineTune自己的Llama2模型

    Let’s talk a bit about the parameters we can tune here. First, we want to load a  llama-2-7b-hf  model and train it on the  mlabonne/guanaco-llama2-1k  (1,000 samples), which will produce our fine-tuned model  llama-2-7b-miniguanaco . If you’re interested in how this dataset was created, you can check this notebook. Feel free to change it: there ar

    2024年02月09日
    浏览(52)
  • 聊聊拉长LLaMA的一些经验

    Sequence Length是指LLM能够处理的文本的最大长度,越长,自然越有优势: 更强的记忆性。更多轮的历史对话被拼接到对话中,减少出现遗忘现象 长文本场景下体验更佳。比如文档问答、小说续写等 当今开源LLM中的当红炸子鸡——LLaMA,第一版上下文长度是2048,第二版长度是

    2024年02月14日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包