解读开源模型 config.json 文件字段

内容纲要

bos、eos、pad符号解释

"bos_token_id": 163584, 序列起始符号所在token在词表中的id位置
"eos_token_id": 163586, 序列结束符号所在token在词表中的id位置
"pad_token_id": 163839, 填充符号所在token在词表中的id位置

bos = Beginning Of Sequence,意思是序列起始符/文本开头标记。
bos_token:一个特殊的 token,用来标记一段序列(文本/多模态输入)的开始。
bos_token_id = 163584:这个起始符在词表里的编号是 163584。
模型在编码输入时,通常会在序列最前面加上这个 token,告诉模型“从这里开始”。与之对应的是:"eos_token_id": 163586
eos = End Of Sequence,序列结束符,编号 163586,标记序列的结尾。
pad = Padding,填充符,用于把不同长度的序列补齐到同一长度。

"dtype": "bfloat16"

"dtype": "bfloat16" 的意思是:这个模型(或这部分配置)的数值精度类型是 bfloat16。
dtype = data type,数据类型/数值精度。
bfloat16 = Brain Floating Point 16,一种 16 位浮点数格式。

BF16 确实常被称作“大脑浮点数”格式,其全称就是 Brain Floating Point。
名称与来源:BF16 中的 “BF” 是 Brain Floating Point 的缩写。它由 Google Brain(谷歌大脑)团队开发,专为机器学习加速设计。
它本质上是一种 16 位浮点数,可以看作是对标准 32 位浮点数(FP32)的截断版本。,虽然“大脑浮点”是中文对英文全称的直译,但在技术语境中,它指的就是 BF16 这种为神经网络训练优化的 16 位浮点数格式。

计算机存储的格式:(数值型、字符与文本型、复合与多媒体型)
数值型家族:BF、FP、int 都属于数值型,它们主要是位宽和精度的不同变体:
浮点数(FP 系列):除了标准的 FP32(单精度)、FP64(双精度),还有为了节省空间或特定场景设计的变体,例如 FP16(半精度,精度高但范围小)、FP8(极低精度,用于 AI 推理),以及你了解的 BF16(范围与 FP32 相同,但精度较低)。

整数(Int 系列):除了常见的 int32、int64,在 AI 和嵌入式领域,还有 int8、int4 甚至 int1(布尔值),它们被用来极度压缩模型体积,以换取更快的计算速度。

BF16在内存中的存储格式

记住计算机的存储逻辑中,没有特殊符号,没有负号,只有0和1的二元。所有的负数都要加偏移量成正数,或者用正负的0和1表示。
实例:正数的156.235(十进制数字)

第一步:转二进制

整数:156 = 10011100
小数:0.235 = .001111…
拼接:10011100.001111…

第二步:算二进制科学计数法

小数点向左移 7 位:1.0011100001111… × 2^7
此时:真实指数 = 7。指数位也要从十进制转二进制,但是考虑到指数可能有负数。所以存在一个偏移量,BF和
计算机真正存指数的时候,不能存负数(因为浮点数指数有正有负),所以它发明了一个“偏移量(Bias)”,让所有的指数都变成正数再存。
偏移量的大小,完全取决于分配给指数的“格子数(位数)”有多少。
偏移量的计算公式非常简单:
2^(指数位数−1)−1
FP16:指数有 5 位。公式:2^(5−1)−1 = 2^4−1 = 16-1 = 15

为什么要这么算?
因为 5 个比特(00000 到 11111)最多能表示 32 个数字(0~31)。为了把正数和负数公平地“劈开”,0~15 留给负数(实际指数 -15 到 -1),16~31 留给正数(实际指数 0 到 15)。
但为了让 0 刚好对应中间的那个“基准点”,所以偏移量取 15。(实际指数 0 存进去就是 15,即 01111)。
同理,8 个比特有 256 个数字,劈成两半,中间点就是 127。

第三步:存入 FP16(半精度)

符号位 (1位):0(正数)
指数位 (5位):真实指数 7 + 偏移量 15 = 22。二进制为 10110。
尾数位 (10位):取小数点后的前 10 位(实际有个四舍五入) 0011100001。
最终 FP16 内存存放的 16 位:0 10110 0011100001

第四步:存入 BF16

符号位 (1位):0(正数)
指数位 (8位):真实指数 7 + 偏移量 127 = 134。二进制为 10000110。
尾数位 (7位):取小数点后的前 7 位 0011100。
最终 BF16 内存存放的 16 位:0 10000110 0011100

总结:
如果指数(实际指二进制的指数)大于尾数的位数,那么小数点后面的数字就会被全部砍掉,这个数字在计算机里就变成了一个纯粹的整数(甚至可能变成一个巨大的近似值)。
实例:
在 FP16(1 个符号,5 个指数,10 个尾数)里,尾数有 10 位。
二进制的 1010.1(十进制的 10.5),写成科学计数法:1.0101 * 2^3。指数是 3。
因为尾数有 10 位,塞下 0101 轻轻松松,所以能完美存下 .5。

但是,假设你输入一个非常大的数:100000000000.5。
转成二进制并标准化后,指数会变得非常大(比如几十)。而你的尾数只有 10 个格子,根本兜不住那么多有效数字。那个代表 .5 的二进制位早被截断扔掉了。
等把内存里的数字读取出来时,它变成了一个巨大的整数。

int类型和fp类型的存储区别

浮点类型系列,我把整数10,存进fp16,也会给我存出很多尾数,哪怕尾数都是0。

  1. 十进制 10 = 二进制 1010。
  2. 变成科学计数法:1.010 * 2^3
  3. 指数位存 3 + 15 = 18(二进制 10010)。
  4. 尾数位(10个格子):存下 010,后面全部用 0 补齐(0100000000)。
  5. 最后就是0 10010 0100000000
    所以,哪怕你输入的是一个纯整数,只要它进了“浮点系列(FP/BF)”的盒子,它就会被强行加上小数点,被拆成指数和尾数,屁股后面永远拖着一长串 0。

整数类型系列,我存浮点数12.789,放进int16,只有符号位和二进制表达,小数点之后的完全不要。

  1. 整数 12 转成二进制:0000 0000 0000 1100。
  2. 后面 .789 的二进制部分,计算机看都不看,直接暴力砍掉(截断)。
  3. 最终内存里只有 12,并没有 FP16 的参与。

在编程(比如 C语言、Python)或者计算机底层,数据是怎么存的,完全取决于你给它指定的“盒子(数据类型)”,而不取决于你输入的到底是整数还是小数:
把它塞进“浮点盒(Float/BF16)”:不管多整的数字,全都要打碎成“尾数+指数+符号”,必定占用尾数空间(哪怕全填0)
只要你把它塞进“整数盒(Int)”:不管多碎的数字,统统只看整数部分,小数点及之后的一律灰飞烟灭。

ignore_index: -100

ignore_index: -100 是一个损失函数计算时的忽略标记。它的作用是告诉模型:在训练(或微调)时,标签(label)里凡是等于 -100 的位置,都不计算损失、不参与梯度更新。

为什么是 -100
这是 PyTorch 中 CrossEntropyLoss 的默认忽略值。Hugging Face 的模型(包括 Kimi 系列)普遍沿用这个约定,所以在 config.json 里把 ignore_index 设为 -100,让模型内部的损失计算直接跳过这些位置。

在训练中具体忽略什么
最常见的是忽略填充(padding)token和不需要模型学习的部分(比如 SFT 微调时的用户指令,只让模型学回答部分)。例如,一段标签可能是 [-100, -100, -100, 5433],前三个 -100 表示不计算损失,只有 5433 这个真实 token 参与训练。

对当前任务的意义
对计算 10 并发部署显存没有直接影响。 这个参数只在训练/微调阶段起作用,部署做推理时模型不会用到它。之前关心的权重显存和 KV Cache,跟 ignore_index 无关。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部
黔ICP备2025064559号 | 贵公网安备52022202000316号