解剖18.5GB的模型文件:flint-oQ3e的safetensors结构与affine量化存储格式全景解析
- 大模型
- 模型量化
- 本地部署
- 人工智能
- 代码模型
【免费下载链接】flint-oQ3e
本文带你逐层解剖flint-oQ3e—— 一款面向 Apple Silicon 优化的 MoE 语言模型——它的 18.5 GB safetensors 模型文件:从分片布局、权重索引,到 affine 量化存储格式与 3/6/8 位混合精度分配策略,一次讲清"每个字节都去了哪里"。
flint-oQ3e 是 Recursive Flint(40B 总参数、每 token 激活约 2.5B)在 Apple Silicon 上的量化版本,采用 oMLX 的oQ3e方案:数据驱动的混合精度 + imatrix 校准裁剪,平均位宽仅3.71 bits/weight,把 79.6 GB 的 bf16 原权重压进了 18.5 GB。🍎
一、目录速览:模型仓库里都有什么文件?
整个仓库非常"干净",12 个文件各司其职:
| 文件 | 大小 | 作用 |
|---|---|---|
| model-00001-of-00004.safetensors | ≈5.05 GB | 权重分片 1(lm_head、embed、第 0 层起) |
| model-00002-of-00004.safetensors | ≈5.05 GB | 权重分片 2 |
| model-00003-of-00004.safetensors | ≈5.05 GB | 权重分片 3 |
| model-00004-of-00004.safetensors | ≈3.29 GB | 权重分片 4(尾部层 + 最终 norm) |
| model.safetensors.index.json | 179 KB | 权重索引:1798 个张量 → 分片映射 |
| config.json | 92 KB | 模型结构 + 逐模块量化配置 |
| oq_imatrix_report.json | 34 KB | imatrix 校准报告(敏感度数据) |
| chat_template.jinja | 2.3 KB | 对话模板 |
| tokenizer.json / tokenizer_config.json | — | 词表与分词配置(vocab 150144) |
| generation_config.json | 202 B | 推荐采样参数(temperature 1.0 / top-p 0.95 / top-k 20) |
💡 4 个分片合计18 439 679 184 字节 ≈ 18.44 GB,与索引中记录的总大小完全一致。
二、总目录:model.safetensors.index.json 如何组织 1798 个张量
多分片 safetensors 模型靠一个 index 文件做"总目录"。打开 model.safetensors.index.json 可以看到两类信息:
"metadata": { "total_size": 18439679184 }, "weight_map": { "language_model.lm_head.weight": "model-00001-of-00004.safetensors", ... }total_size:全部权重数据的总字节数(18.44 GB);weight_map:1798 个张量逐一映射到 4 个分片(分片 1 承载 1417 个,其余分片各 94~144 个)。
按张量后缀统计,整个模型的"家当"可以分成 5 类:
| 张量后缀 | 数量 | 含义 |
|---|---|---|
.weight | 730 | 主权重(其中 486 个是被量化的 int 打包数据) |
.scales | 486 | 量化缩放因子(每组一个) |
.biases | 486 | 量化偏置项(affine 模式特有) |
.softmax_offset | 49 | 可学习 softmax 偏移(每层注意力一个) |
.expert_bias | 47 | MoE 路由专家偏置(每个 MoE 层一个) |
注意 486 = 730 − 244:486 个线性层被量化(每层拆成 weight/scales/biases 三件套),244 个张量保留全精度(49 层 × 4 个 RMSNorm + 47 个 MoE 路由器 + 1 个最终 norm)。
📌 所有张量名都带
language_model.前缀——因为该模型通过 mlx-vlm 的视觉语言架构量化,纯文本运行时 oMLX / mlx-vlm 会按原样加载,无需改名。
三、一个量化线性层内部:weight + scales + biases 三件套
以第 0 层为例,索引文件 中layers.0.self_attn.q_proj对应三个张量:
q_proj.weight:不是浮点数!而是3-bit 打包的整型数据(多个权重挤进一个 32-bit 整数);q_proj.scales:每个64 个权重一组(group_size=64),组内一个缩放因子;q_proj.biases:每组的偏置项。
这就是affine(仿射)量化存储格式:
还原公式:
原始权重 ≈ scale × (量化值) + bias,对每个 64 元素的组独立成立。
相比只有 scale 的"对称量化",affine 多存一份 biases,能表达每组的非对称分布,是保真度的重要来源。486 个被量化线性层的构成:
| 模块 | 数量 | 位宽 |
|---|---|---|
| 49 层注意力的 q/k/v/o 投影 | 196 | 6 或 8 bit(逐层不同) |
| 前 2 个稠密层的 gate/up/down_proj | 6 | 8 bit |
| 47 个 MoE 层的 shared_expert(3 个投影) | 141 | 8 bit |
| 47 个 MoE 层的 switch_mlp(256 个路由专家,3 个投影) | 141 | 3 bit |
| embed_tokens + lm_head | 2 | 8 bit / 6 bit |
四、混合精度的"脑图":3 位打底,按敏感度加码
config.json 的quantization字段是这套文件最精彩的部分——默认值 + 345 条逐模块覆盖:
"quantization": { "group_size": 64, "bits": 3, "mode": "affine", "language_model.lm_head": { "bits": 6, "group_size": 64, "mode": "affine" }, "language_model.model.embed_tokens": { "bits": 8, ... }, ... }分配逻辑一句话总结:"能省的省到极致,不能省的一分不少":
| 模块 | 位宽 | 原因 |
|---|---|---|
| 路由专家 switch_mlp | 3 bit | 占体积大头,但对单 token 只激活 6/256 个,压缩空间最大 |
| 共享专家 shared_expert | 8 bit(组 128) | 每个 token 都经过,质量敏感 |
| 稠密层(0/1 层)MLP | 8 bit | 每层必走 |
| embed_tokens | 8 bit | 词表入口,压缩伤根基 |
| lm_head | 6 bit | 输出层折中 |
| 注意力投影 | 6/8 bit 混合 | 由敏感度实测决定:25 层全 6 位、28 层全 8 位、4 层按 q/k/v 拆分 |
敏感度从哪来?imatrix 校准报告
"e"(enhanced)的含义:量化前用128 条代码语料样本过一遍 bf16 模型,逐组按激活重要性选裁剪范围。oq_imatrix_report.json 完整记录了这一过程:
- 采样计划:自适应从 128 条加到 256 条,直到全部36096 个专家(141 个 SwitchLinear 模块 × 256 专家)都被覆盖;
- 专家覆盖率:
active_ratio: 1.0,零激活专家为 0——没有"漏网"的专家; - 逐层敏感度:第 0 层高达 0.0496,而第 47 层只有 1.5e-06——差了近5 万倍。这正是为什么 47/48 层注意力的投影可以大胆压到 6 bit,而第 0~11 层必须保留 8 bit。
⚠️ 作者还专门验证过:把 group_size 全改成 128 能省 1.2 GB,但平均 KL 从 0.222 涨到 0.263(oQ4e 场景),且没有提速——所以全部张量统一 64(共享专家为 128)。
五、为什么恰好是 18.5 GB?
粗算一下账:40B 参数 × 16 bit = 79.6 GB(bf16)。oQ3e 的平均位宽 3.71 bit,理论体积 ≈ 79.6 × 3.71/16 ≈18.4 GB,加上 scales/biases 等元数据略增,实测 18.44 GB,严丝合缝。✅
代价与收益(相对 bf16,64 段 × 2048 token 评测):
| 指标 | bf16 | oQ4e | oQ3e(本仓库) |
|---|---|---|---|
| 体积 / 平均位宽 | 79.6 GB / 16 | 23.4 GB / 4.70 | 18.5 GB / 3.71 |
| 平均 KL ↓ | 0(基准) | 0.222 | 0.650 |
| 困惑度 ↓ | 14.30 | 14.86 | 16.92 |
| top-1 一致率 ↑ | 100% | 78.3% | 64.6% |
| 生成速度(短上下文) | — | 120 tok/s | 109 tok/s |
| 峰值内存(16k 上下文) | — | 25.0 GB | 20.0 GB |
定位很明确:它是 24~32 GB 内存 Mac 上"装得下" Flint 的主力档位。比 oQ4e 更损(KL 约 3 倍)、并不更快,但把内存门槛砍到了 20 GB 以内。
六、如何加载这个模型
模型由标准 MLX affine 量化输出,无需任何自定义 kernel:
- oMLX(推荐):
pip install -U omlx后执行omlx serve,自动识别为mlx-community--flint-oQ3e,提供 OpenAI 兼容 API(含工具调用与 reasoning 输出); - mlx-vlm:需
pip install -U "mlx-vlm>=0.7.10",然后mlx_vlm.generate --model mlx-community/flint-oQ3e ...。
采样建议沿用 generation_config.json:temperature 1.0 / top_p 0.95 / top_k 20,难题建议输出预算 ≥ 32k tokens。
七、总结:一张图看懂 18.5 GB 的"解剖报告"
- 结构层:4 个 safetensors 分片 + 1 个 index(1798 张量)+ config/imatrix/tokenizer 等元数据;
- 存储层:486 个量化线性层 =
weight(3bit 打包) + scales + biases三件套,affine 仿射还原,group_size 64; - 精度层:3 bit 打底(路由专家)→ 6 bit(lm_head、不敏感层注意力)→ 8 bit(共享专家、稠密层、敏感层注意力)的阶梯,全部由 imatrix 实测敏感度驱动;
- 效果层:3.71 bpw、KL 0.650、18.5~20 GB 峰值内存、109 tok/s——小内存 Mac 运行 40B MoE 的务实之选。
下次再看到.safetensors+index.json+ 一堆.scales/.biases后缀,你就知道它们各自扮演什么角色了。🔍
- 大模型
- 模型量化
- 本地部署
- 人工智能
- 代码模型
【免费下载链接】flint-oQ3e
相关推荐
Qwen-Image-Edit模型文件结构:safetensors格式的存储与加载
Qwen Image Edit模型文件结构:safetensors格式的存储与加载 引言:大模型存储的技术挑战 在AI模型规模不断增长的今天,如何高效存储和加载
基础模型计算机视觉flint-oQ5e 权重文件与模型结构完全揭秘:safetensors 布局与量化参数开发者指南
flint oQ5e 权重文件与模型结构完全揭秘:safetensors 布局与量化参数开发者指南 flint oQ5e 是 Recursive 开源 40B
人工智能大模型模型量化本地部署代码模型PEFT Checkpoint 格式完全指南:文件结构、格式转换与模型存储
PEFT Checkpoint 格式完全指南:文件结构、格式转换与模型存储 本指南以 PEFT 官方开发者文档《PEFT checkpoint format》为
人工智能大模型微调LoRA
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考