baichuan2 chat模型sft指令微调数据格式分析

news2024/12/24 9:55:03

一、前言

百川官网:https://www.baichuan-ai.com/
模型权重:https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat
记录一下 baichuan 2 的 tokenizer 及 chat 数据构建格式。

二、数据处理代码

根据官方 github 的 finetune 代码,将其 preprocessing 方法抽离单独测试。为方便记录,代码中的注释暂时假设每个汉字为一个token,且 input_ids 的注释和实际 id 不保证对应。

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

path = "Baichuan2-13B-Chat"
tokenizer = AutoTokenizer.from_pretrained(path, trust_remote_code=True)

user_tokens = [195]
assistant_tokens=[196]
ignore_index = -100
model_max_length = 10

def preprocessing(example):
    input_ids = []
    labels = []

    for message in example["conversations"]:
        from_ = message["from"]
        value = message["value"]
        value_ids = tokenizer.encode(value)

        if from_ == "human":
            input_ids += user_tokens + value_ids    
            labels += [tokenizer.eos_token_id] + [ignore_index] * len(value_ids)
            # input_ids = <reserved_106>    你   是   谁
            # labels    =       </s>      -100 -100  -100
        else:
            input_ids += assistant_tokens + value_ids
            labels += [ignore_index] + value_ids
            # input_ids = <reserved_106>    你   是   谁    <reserved_107>  我  是  木  尧
            # labels    =       </s>      -100 -100  -100        -100       我  是  木  尧

    input_ids.append(tokenizer.eos_token_id)
    labels.append(tokenizer.eos_token_id)
    # input_ids = <reserved_106>    你   是   谁    <reserved_107>   我  是  木  尧    </s>
    # labels    =       </s>      -100 -100  -100        -100       我  是  木  尧   </s>

    # 切片 截断前 model_max_length 个 token
    input_ids = input_ids[:model_max_length]
    labels = labels[:model_max_length]

    input_ids += [tokenizer.pad_token_id] * (model_max_length - len(input_ids))
    labels += [ignore_index] * (model_max_length - len(labels))
    # input_ids = <reserved_106>    你   是   谁    <reserved_107>   我  是  木  尧    </s>  <unk>  <unk>  <unk> ...  <unk>
    # labels    =       </s>      -100 -100  -100        -100       我  是  木  尧    </s>   -100   -100   -100  ... -100

    input_ids = torch.LongTensor(input_ids)
    labels = torch.LongTensor(labels)

    attention_mask = input_ids.ne(tokenizer.pad_token_id) # ne 即 not equal 不等于,不等于unk则为true即mask掉,等于则为false
    # input_ids         = <reserved_106>    你   是   谁    <reserved_107>   我  是   木  尧    </s>  <unk>  <unk>  <unk> ...  <unk>
    # labels            =       </s>      -100  -100  -100       -100        我  是   木  尧    </s>   -100   -100   -100  ... -100
    # attention_mask    =       True        True True True       True     True True True True True  True    True   True  ...  True
    return {
        "input_ids": input_ids,
        "labels": labels,
        "attention_mask": attention_mask,
    }

example 数据格式及运行测试:

preprocessing({
    "system": "",
    "conversations": [
      {
        "from": "human",
        "value": "你是谁"
      },
      {
        "from": "yayi",
        "value": "我是木尧"
      }
    ]
})

# Output:
# {'input_ids': tensor([  195, 92067,   196,  6461, 93334, 95562,     2,     0,     0,     0]),
# 'labels': tensor([    2,  -100,  -100,  6461, 93334, 95562,     2,  -100,  -100,  -100]),
# 'attention_mask': tensor([ True,  True,  True,  True,  True,  True,  True, False, False, False])}

案例分析:

  • 百川2用预留的 token 表示 human 和 assistant 的内容,上面例子会转化成:<reserved_106>你是谁<reserved_107>我是木尧</s><unk><unk> ... <unk>
    • <reserved_106> (id=195)表示 human 输入。
    • <reserved_107> (id=196)表示 assistant 输出。
  • 首先,遍历 conversations 中的每一轮 human 和 assistant:
    • input_ids:前面拼上各自的标识符(<reserved_106><reserved_107> )之后拼接各自内容对应的 token ids。
    • labels:对于 human 的内容,其标识符对应位置是 </s> (的id),其他位置是 -100,不计算这些 loss 和梯度;对于 assistant 的内容,其标识符对应位置是 -100,其他位置和 input_ids 一致。(为啥开始不是-100而是</s>呢?issue里找到了答案,详见总结部分)
      在这里插入图片描述
  • 然后,分别在 input_ids 和 labels 追加结束符 </s>,并根据 model_max_length 填充 pad token 即 <unk>,或超长截断,并转成 tensor;
  • 最后,构造 attention_mask,非 pad token 的部分全是 true,pad token 部分全是 false,忽略后面这些填充位置的 attention 计算。

三、总结

在这里插入图片描述

上图是简单做了页PPT,以多轮数据为例。把 user_token_id 对应位置的 label 设置为结束符 </s>,推理时拼接多轮时就不用拼接结束符了。因为 human 的第一个token(位于’user_token_id’位置)实际上是与 assistant 部分中最后一个token(‘assistant_token_id’)对应的’next_token_label’。

附上 baichuan2 词表的前 2000 个token(从101: <reserved_12> 到 1088: <reserved_999> 都是预留的 token):

0 <unk>
1 <s>
2 </s>
3 <SEP>
4 <CLS>
5 \n
6 \t
7 <img>
8 <img/>
9 </img>
10 <h2>
11 <h2/>
12 </h2>
13 <td>
14 <td/>
15 </td>
16 <strong>
17 <strong/>
18 </strong>
19 <table>
20 <table/>
21 </table>
22 <tr>
23 <tr/>
24 </tr>
25 <li>
26 <li/>
27 </li>
28 <b>
29 <b/>
30 </b>
31 <h3>
32 <h3/>
33 </h3>
34 <br>
35 <br/>
36 </br>
37 <h4>
38 <h4/>
39 </h4>
40 <h5>
41 <h5/>
42 </h5>
43 <p>
44 <p/>
45 </p>
46 <h1>
47 <h1/>
48 </h1>
49 <tbody>
50 <tbody/>
51 </tbody>
5253545556575859606162 +
63 -
64 =
6566676869707172 .
73 !
74 ?
75 ...
76 。。。
77 。。。。。。
78798081828384 ```
85 <!--
86 -->
87 ---
88 <!DOCTYPE>
8990919293949596979899100101 <reserved_12>
102 <reserved_13>
103 <reserved_14>
104 <reserved_15>
......
1085 <reserved_996>
1086 <reserved_997>
1087 <reserved_998>
1088 <reserved_999>
1089 <0x00>
1090 <0x01>
1091 <0x02>
1092 <0x03>
......
1341 <0xFC>
1342 <0xFD>
1343 <0xFE>
1344 <0xFF>
1345 ▁t
1346 ▁a
1347 in
......
1996 ▁know
1997 ▁sec
1998 研究
1999 ▁these

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

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

相关文章

民企再续“助学故事”,恒昌公益两所“云杉校园”如何聚木成林?

撰稿|多客 来源|贝多财经 “生物世界丰富多彩、五花八门、琳琅满目&#xff0c;可谓大千世界芸芸众生”……这是遵义市正安县安场镇光明完全小学图书馆收藏的一本名为《闯入生物世界》书中所写景象。 在这所学校&#xff0c;课外书籍按照年级及类别进行划分&#xff0c;如一…

M1/M2 Parallels Desktop 19虚拟机安装Windows11教程(超详细)

引言 在Window上VMware最强&#xff0c;在Mac上毫无疑问Parallels Desktop为最强&#xff01; 今天带来的是最新版Parallels Desktop 19虚拟机安装Windows11的教程。 1. 安装Parallels Desktop 19虚拟机 https://blog.csdn.net/weixin_52799373/article/details/133316608 …

RocketMQ 事务消息发送

目录 事务消息介绍 应用场景 功能原理 使用限制 使用示例 使用建议​ 事务消息介绍 在一些对数据一致性有强需求的场景&#xff0c;可以用 RocketMQ 事务消息来解决&#xff0c;从而保证上下游数据的一致性。 应用场景 分布式事务的诉求 分布式系统调用的特点为一个核…

【数据结构】深度剖析最优建堆及堆的经典应用 - 堆排列与topk问题

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;数据结构 &#x1f525;该文章分别探讨了向上建堆和向下建堆的复杂度和一些堆的经典应用 - 堆排列与topk问题。 ❗️该文章内的思想需要用到…

排序学习总结

取每个对象的内接矩形框&#xff0c;然后再排序&#xff0c;根据排序的结果确定原对象顺序。 inner_rectangle1(RegionAffineTrans1, Row1, Column1, Row2, Column2) gen_rectangle1(Rect,Row1, Column1, Row2, Column2) sort_region(Rect,RectSort,character,true, row)count…

Oracle物化视图(Materialized View)

与Oracle普通视图仅存储查询定义不同&#xff0c;物化视图&#xff08;Materialized View&#xff09;会将查询结果"物化"并保存下来&#xff0c;这意味着物化视图会消耗存储空间&#xff0c;物化的数据需要一定的刷新策略才能和基表同步&#xff0c;在使用和管理上比…

【嵌入式】使用嵌入式芯片唯一ID进行程序加密实现

目录 一 背景说明 二 原理介绍 三 设计实现 四 参考资料 一 背景说明 项目程序需要进行加密处理。 考虑利用嵌入式芯片的唯一UID&#xff0c;结合Flash读写来实现。 加密后的程序&#xff0c;可以使得从芯片Flash中读取出来的文件&#xff08;一般为HEX格式&#xff09;不能…

C#WPF命令Command使用实例

本文实例演示C#WPF命令使用实例 定义: 命令(Command):命令表示一个任务单元,并且可跟踪该任务的状态,实际上是实现了ICommand接口的类。然而,命令实际上可以包括任务执行的逻辑代码,也可以不包括从而仅作为联系命令源与命令目标的媒介。比如,WPF 默认的接口实现类Ro…

el-collapse 嵌套中 el-checkbox作为标题,选中复选框与el-tree联动

<el-drawertitle"应用授权":visible.sync"menuDrawer"><el-collapse accordion style"padding: 15px"><el-collapse-item v-for"item in platList"><template slot"title"><el-checkbox v-model…

PostMan、ApiFox等工具Post请求中@RequestParam和@RequestBody的混合使用如何传参

方法签名 PostMapping("/mms/sendAudit")public R sendAudit(RequestParam("mmsId") Long mmsId,RequestParam("ecId") Long ecId,RequestBody(required false) SignMatchRule signMatchRule) {以ApiFox为例子 RequestParam的Params的参数正常…

基于51单片机0.001s精度秒表9.999s仿真设计(源码+仿真+原理图+PCB+报告+器件清单+讲解)

基于51单片机0.001s精度秒表9.999s仿真设计&#xff08;源码仿真原理图PCB报告器件清单讲解 讲解视频1 功能说明&#xff1a;2 仿真电路&#xff1a;3 原理图&#xff1a;4 PCB&#xff1a;5 程序&#xff1a;6 资料清单&&下载链接&#xff1a; 基于51单片机0.001s精度…

2023年【煤气】报名考试及煤气免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 煤气报名考试根据新煤气考试大纲要求&#xff0c;安全生产模拟考试一点通将煤气模拟考试试题进行汇编&#xff0c;组成一套煤气全真模拟考试试题&#xff0c;学员可通过煤气免费试题全真模拟&#xff0c;进行煤气自测…

什么是图像翻译

域(Domain)&#xff1a;一系列具有相同风格的图像集合。 图像翻译(Image Translation)&#xff1a;从一张图像到另一张图像的变换&#xff0c;也是域迁移。 &#xff08;风格迁移、图像上色、图像分割...&#xff09; 图像翻译GAN模型分类 根据作用区域&#xff1a;…

Qt学习_13_可执行文件.exe添加图标/logo

本文简单记录一下如何给Qt生成的exe&#xff08;可执行&#xff09;文件&#xff0c;添加图标/logo 第一步 去选一个你喜欢的图标&#xff0c;下载下来 ByteDance IconPark (oceanengine.com) iconfont-阿里巴巴矢量图标库 第二步 用第一步下载的图片&#xff0c;在线生成一…

python 绘制 graphviz

dot 绘图 python 绘制 graphviz 环境 上一节中在本地安装了 graphviz&#xff0c; python 要想使用还需安装 pip 包 pip install graphvizpython 使用 dot Digraph(comment"My Graph") # 添加一些节点 dot.node("A", "Node A") dot.node(&q…

杭州亚运会开幕式惊现数字人火炬手,动捕设备迸发动画制作新动能

在第十九届亚运会开幕式上&#xff0c;首次出现了“数字人”点火形式&#xff0c;打造了亚运史上首个数字点火仪式&#xff0c;这种点火方式是一种颠覆性创作的同时&#xff0c;这也是裸眼3D技术、现实增强和AI人工智能技术的完美结合。 此次数字火炬手的背后是采用了动捕设备&…

九、完整打印立方体贴图的一个面

从上一节可以看出&#xff0c;打印出来的图片是有背景色的&#xff0c;也就是摄像机位置不对。那应该放在哪里呢&#xff1f; 答案是&#xff1a;给定投影矩阵的 fov 为 90 度以捕捉整个面&#xff0c;且摄像机距离该面的距离是立方体边长的一半。 即、 这里我用的立方体是长度…

it运维监控运维方案主要应用在哪些场景

公司越来越依赖IT基础设施。为了保证业务的高效运行&#xff0c;IT运维监控已经成为公司不可或缺的一部分。本文将详细介绍IT运维监控方案&#xff0c;以及如何优化运维效率&#xff0c;并将其应用于各种场景。 IT运维监控方案 监视系统 监控系统是IT运维监控的基础&#xff…

代码随想录 Day6 哈希 LeetcodeT454 四数之和II T383赎金信 T15 三数之和 T18 四数之和

本文代码思路来源于: 代码随想录 前言 希望大家在刷这部分题的时候先熟悉熟悉哈希结构的基本常用api,比较方便理解. LeetCode T454 四数之和 题目链接:454. 四数相加 II - 力扣&#xff08;LeetCode&#xff09; 题目思路 暴力解法仍然是遍历四个数组解决此题, 哈希的思路有…

干货分享 | TSMaster—CCP/XCP标定功能详解

众所周知&#xff0c;CCP是CAN Calibration Protocol CAN 标定协议的缩写&#xff0c;XCP是Universal Measurement and Calibration Protocol 通用测量与标定协议的缩写。二者都普遍使用于开发、测试和车载标定&#xff0c;由ASAM&#xff08;自动化和测量系统标准化协会&#…