大模型权重文件解析
1、模型文件
以Qwen1.5-32B-Chat-AWQ模型文件列表为例:
shengping.mo@y108p30:/data2/huggingface/Qwen/Qwen1.5-32B-Chat-AWQ$ ls -lh
total 20G
-rw-r--r-- 1 xd xd 839 Jun 27 22:30 config.json
-rw-r--r-- 1 xd xd 243 Jun 27 22:30 generation_config.json
-rw-r--r-- 1 xd xd 6.8K Jun 27 22:30 LICENSE
-rw-r--r-- 1 xd xd 1.6M Jun 27 22:30 merges.txt
-rw-r--r-- 1 xd xd 4.7G Jun 27 22:28 model-00001-of-00005.safetensors
-rw-r--r-- 1 xd xd 4.7G Jun 27 22:29 model-00002-of-00005.safetensors
-rw-r--r-- 1 xd xd 4.7G Jun 27 22:29 model-00003-of-00005.safetensors
-rw-r--r-- 1 xd xd 4.3G Jun 27 22:30 model-00004-of-00005.safetensors
-rw-r--r-- 1 xd xd 1.5G Jun 27 22:30 model-00005-of-00005.safetensors
-rw-r--r-- 1 xd xd 140K Jun 27 22:30 model.safetensors.index.json
-rw-r--r-- 1 xd xd 4.0K Jun 27 22:30 README.md
-rw-r--r-- 1 xd xd 1.3K Jun 27 22:30 tokenizer_config.json
-rw-r--r-- 1 xd xd 6.8M Jun 27 22:30 tokenizer.json
-rw-r--r-- 1 xd xd 2.7M Jun 27 22:30 vocab.json
shengping.mo@y108p30:/data2/huggingface/Qwen/Qwen1.5-32B-Chat-AWQ$
2、整体分析
config.json
- 存储模型架构元数据,包括网络层数,隐藏维度,注意力头数,词表大小,激活函数类型等参数
- 存储模型架构元数据,包括网络层数,隐藏维度,注意力头数,词表大小,激活函数类型等参数
模型权重文件:torch 和 hf 权重文件
pytroch_model.pth: 用于保存模型权重参数的二进制文件,以字典的形式保存,键为层名称,值为对应的权重张量数据。
model.safetensor:和pth权重文件的功能相同,区别是采用了安全序列化格式,避免反序列化漏洞风险。
分片权重文件:对于超大型的模型权重,会被分割成多个文件,解决单个文件体积限制问题。
分词器相关
tokenizer_config.json: 分词器类型、特殊标记的定义
tokenizer.json: 将分词器的所有配置信息,包括词汇表,合并规则,归一化,预分词,后处理等打包在一起,目的是让训练和推理过程中的分词行为完全一致。
文本生成参数配置文件
- generation_config.json:定义文本生成策略,包括温度,top-p等超参数。
- generation_config.json:定义文本生成策略,包括温度,top-p等超参数。
tokenizer.json
文件定义了分词器的所有配置
added_tokens: 原有词汇表基础上额外添加的特殊token([PAD] [CLS])
post_processor: 后处理模板,设置单句,双句对输入时输入时自动添加[cls] 和 [sep]
decoder:解码器类型
model:底层分词器模型 的类型及其参数。
Vocab: 定义了词汇表,其中key为token的字符串,value为对应的id。
merges:定义了子token合并成更长token的规则。
special_tokens_map.json
文件定义了与文本序列处理相关的特殊token
bos_token (Beginning of Sentence Token): 序列开始标记,文本序列的起始位置
eos_token (End of Sentence Token): 序列结束标记,表示文本序列的结束位置。
eop_token (End of Paragraph Token): 段落结束标记,表示段落结束的特殊标记
pad_token (Padding Token): 填充标记,它将用于文本序列填充到相同长度时使用的特殊token。tokenizer.json 文件解析。
3、具体分析
3.1 config.json
作用:用于描述模型的结构、超参数、训练方式、特殊行为等信息,在加载模型时自动解析并构建模型实例。
{
// 使用的模型架构名称
"architectures": [
"Qwen2ForCausalLM"
],
// 注意力层的dropout比例
"attention_dropout": 0.0,
// 句子起始(BOS)token的ID
"bos_token_id": 151643,
// 句子结束(EOS)token的ID
"eos_token_id": 151645,
// 隐藏层激活函数
"hidden_act": "silu",
// 隐藏层维度
"hidden_size": 5120,
// 参数初始化范围
"initializer_range": 0.02,
// 前馈网络中间层的维度
"intermediate_size": 27392,
// 最大位置编码长度
"max_position_embeddings": 32768,
// 支持滑动窗口的最大层数
"max_window_layers": 35,
// 模型类型标识
"model_type": "qwen2",
// 注意力头的数量
"num_attention_heads": 40,
// Transformer层的数量
"num_hidden_layers": 64,
// key-value注意力头的数量(用于分组注意力等)
"num_key_value_heads": 8,
// 量化相关配置
"quantization_config": {
// 量化位数
"bits": 4,
// 量化分组大小
"group_size": 32,
// 不进行量化的模块
"modules_to_not_convert": null,
// 量化方法
"quant_method": "awq",
// 量化版本
"version": "gemm",
// 是否使用零点
"zero_point": true
},
// RMSNorm的epsilon值
"rms_norm_eps": 1e-06,
// ROPE位置编码的theta参数
"rope_theta": 1000000.0,
// 滑动窗口长度
"sliding_window": 32768,
// 是否共享词嵌入权重
"tie_word_embeddings": false,
// PyTorch中使用的数据类型
"torch_dtype": "float16",
// transformers库的版本
"transformers_version": "4.38.2",
// 是否使用缓存(加速推理)
"use_cache": true,
// 是否启用滑动窗口机制
"use_sliding_window": false,
// 词表大小
"vocab_size": 152064
}
🧠 一、基本模型规格
| 参数 | 含义 | 说明 |
|---|---|---|
model_type: "qwen2" |
模型类型 | 来自阿里达摩院的 Qwen2 系列 |
architectures: "Qwen2ForCausalLM" |
架构 | 自回归语言模型(Causal Language Model) |
hidden_size: 5120 |
每层维度 | 大型模型(估算 20B 参数级别) |
num_hidden_layers: 64 |
Transformer 层数 | 层数非常深 |
num_attention_heads: 40 |
注意力头数 | |
num_key_value_heads: 8 |
KV 分组数量 | 表明采用了 Grouped Query Attention (GQA) |
intermediate_size: 27392 |
FFN 层维度 | |
vocab_size: 152064 |
词表大小 | 包含中文/英文等多语言词表 |
🧠 二、上下文和位置处理
| 参数 | 含义 |
|---|---|
max_position_embeddings: 32768 |
最大位置嵌入(理论最大上下文长度) |
sliding_window: 32768 |
实际窗口大小 |
max_window_layers: 35 |
可支持滑动窗口的层数 |
rope_theta: 1e6 |
用于 RoPE(旋转位置编码)的频率参数(适配长上下文) |
📌 说明:这是一个支持超长上下文(32K token)的模型,适合:
读大文档(PDF/合同/代码)
长对话历史保持上下文连贯
文本审校、知识提取
⚙️ 三、优化与量化配置
| 参数 | 含义 |
|---|---|
quantization_config.bits: 4 |
4-bit 量化 |
quant_method: awq |
使用 AWQ(Activation-aware Weight Quantization) |
group_size: 32 |
每组参数量化块大小 |
version: gemm |
量化内核类型,基于 GEMM |
zero_point: true |
使用 Zero-point 对称量化 |
torch_dtype: "float16" |
半精度 float16 运算 |
📌 说明:这说明这个模型是经过 4bit AWQ 量化优化的版本,意味着你可以:
在消费级显卡(比如 24G 显存)运行
延迟更低,推理速度快
部署成本降低
3.2 generation_config.json
推理参数(生成策略)配置文件, 用于控制模型生成文本时的行为(例如采样策略、终止符号、重复惩罚等), 这段 JSON 是模型的“生成策略说明书”,控制模型如何从输入中“说出”下一句话。
{
// 起始标记的token id
"bos_token_id": 151643,
// 是否使用采样生成
"do_sample": true,
// 结束标记的token id列表
"eos_token_id": [
151645,
151643
],
// 填充token的id
"pad_token_id": 151643,
// 重复惩罚系数
"repetition_penalty": 1.05,
// 采样温度
"temperature": 0.7,
// top-k采样参数
"top_k": 20,
// top-p采样参数
"top_p": 0.8,
// transformers库的版本
"transformers_version": "4.38.2"
}
🔍 字段解析与作用
| 参数名 | 示例值 | 含义与作用 |
|---|---|---|
bos_token_id |
151643 |
Begin Of Sequence,生成起始标记 token ID |
eos_token_id |
[151645, 151643] |
End Of Sequence,遇到这些 token ID 时停止生成 |
pad_token_id |
151643 |
用于 padding(对齐序列)时使用的 token ID |
do_sample |
true |
启用采样(否则是贪婪/beam search) |
temperature |
0.7 |
控制采样随机性(值越低越确定) |
top_k |
20 |
限制每一步采样时最多考虑前 20 个概率最高的 token |
top_p |
0.8 |
nucleus sampling(只考虑累积概率 ≥ 0.8 的 token) |
repetition_penalty |
1.05 |
惩罚重复词语(>1 会降低重复出现 token 的概率) |
transformers_version |
"4.38.2" |
指明此配置兼容的 HuggingFace Transformers 版本 |
🧠 实际生成中它怎么用?
你加载模型后,如果该文件存在,Transformers 会自动读取这些参数并应用到 generate() 调用中:
from transformers import AutoTokenizer, AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-7B")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-7B")
input_ids = tokenizer("你好,请帮我总结一下这段话:", return_tensors="pt").input_ids
outputs = model.generate(input_ids)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
如果目录下存在
generation_config.json,model.generate()会默认读取其中的设置(如top_k,temperature等)。
你也可以手动覆盖它:
outputs = model.generate(
input_ids,
temperature=0.7,
top_k=20,
top_p=0.8,
repetition_penalty=1.05,
do_sample=True,
max_new_tokens=256
)
✅ 你可以用它做什么?
自定义生成风格:更随机或更确定、控制重复
优化对话流畅性:结合
eos_token_id,能更自然地中止输出自动化部署:多个模型可统一读取生成策略文件
3.3 merges.txt
merges.txt 是 Hugging Face 模型中的一个 分词器(Tokenizer)文件,它是 Byte Pair Encoding(BPE) 分词算法的核心组成部分之一,配合 vocab.json 使用,决定了如何将文本分割成 token。

merges.txt 是 Hugging Face 模型中的一个 分词器(Tokenizer)文件,它是 Byte Pair Encoding(BPE) 分词算法的核心组成部分之一,配合 vocab.json 使用,决定了如何将文本分割成 token。
🧠 BPE 分词算法背景简述
Byte Pair Encoding (BPE) 是一种基于频率的子词(subword)分词方法,常用于:
GPT 系列(包括 OpenAI 模型)
RoBERTa、DistilBERT、Qwen、LLaMA、BLOOM 等 HuggingFace 模型
适用于多语言、中文、代码等
📂 **merges.txt** 文件作用
定义每一步合并哪些子词,形成新的词片段(token),即:
从原始字符逐步构建更大的常见子词
保留高频组合、减少词表大小、提升表示能力
🧾 文件内容格式示例
#version: 0.2
t h
th e
he r
re s
es t
...
每一行是一个 合并规则(merge rule),格式为两个空格分隔的子词(symbol):
A B
表示 A B → AB 的合并操作。模型在分词时会按这些规则顺序地将字符对合并成 token,直到无法合并为止。
🔄 与 vocab.json 的关系
| 文件 | 作用 |
|---|---|
vocab.json |
保存最终的 token → id 映射(所有可用 token) |
merges.txt |
保存 BPE 合并规则(从字符构造这些 token 的路径) |
二者共同定义了分词器的行为,缺一不可。
📦 应用举例:GPT 分词过程
假设原始文本是 "there"
初始字符序列:
["t", "h", "e", "r", "e"]第一次匹配合并规则:
t h → th变为:
["th", "e", "r", "e"]然后:
th e → the然后:
the r → ther然后:
ther e → there→ ✅ 完整 token
最终就是一个 token:there,对应 vocab.json 中的某个 ID。
🔍 怎么查看?
使用 HuggingFace Tokenizer API 查看分词器:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-7B")
print(tokenizer.tokenize("there"))
🛠️ 常见用途
| 作用 | 示例 |
|---|---|
| ✅ 自定义分词器 | 用你自己的 merges.txt + vocab.json 创建分词器 |
| 🧪 分析模型分词习惯 | 看哪些词被拆了,比如中文 数据处理 → 数, 据, 处理 |
| 📦 微调 tokenizer | 用 HuggingFace tokenizers 工具重新训练 tokenizer |
🧰 实战示例:创建自定义 BPE 分词器
from tokenizers import Tokenizer, models, trainers, pre_tokenizers
tokenizer = Tokenizer(models.BPE())
tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()
trainer = trainers.BpeTrainer(vocab_size=10000, special_tokens=["<pad>", "<unk>"])
tokenizer.train(["your_corpus.txt"], trainer)
tokenizer.save("tokenizer.json") # 里面包含 vocab 和 merges
✅ 总结一句话
merges.txt是 HuggingFace BPE 分词器的“合并规则表”,告诉模型如何从字符组合成 token,它是vocab.json的构造过程记录,二者配合用于模型输入的分词处理。
3.4 model-00001-of-000XX.safetensors
model-00001-of-000XX.safetensors 是 Hugging Face 或类似框架在保存大型模型权重时生成的文件之一。其中XX值代表有多少个类似的权重文件,这个文件的 作用是保存模型的实际权重(参数)数据,是推理或训练时真正加载到模型中的核心内容。
📦 一句话概括
model-00001-of-000XX.safetensors是保存 Transformer 模型参数的分片化 safetensors 文件,它是.bin的安全高效替代,用于多文件分布式加载大型模型。
🔍 文件组成与命名结构
比如你看到这样的目录结构:
model-00001-of-00007.safetensors
model-00002-of-00007.safetensors
...
model-00007-of-00007.safetensors
model.safetensors.index.json
config.json
tokenizer.json
generation_config.json
...
含义如下:
| 文件名 | 含义 |
|---|---|
model-00001-of-00007.safetensors |
模型参数的第 1 个分片,共 7 个 |
model.safetensors.index.json |
记录每个权重张量存储在哪个分片中(索引文件) |
config.json |
模型结构描述 |
tokenizer.json / merges.txt |
分词器文件 |
generation_config.json |
文本生成策略配置 |
🧠 safetensors 格式简析
safetensors 是一种由 Hugging Face 社区主导开发的安全、快速、零拷贝的模型权重保存格式,用于替代早期的 .bin(PyTorch pickle)格式。
✅ 相比 **.bin** 格式的优势:
| 特性 | .bin |
.safetensors |
|---|---|---|
| 安全性(避免执行 pickle) | ❌ 可能执行恶意代码 | ✅ 完全静态数据 |
| 加载速度(零拷贝 mmap) | 较慢 | ✅ 极快 |
| 分片支持 | ✅ | ✅ |
| 通用性(兼容 PyTorch) | ✅ | ✅(HuggingFace 专用) |
🔍 文件内部结构
你不能直接打开 .safetensors 文件,但可以用 safetensors 官方库读取其中内容:
from safetensors import safe_open
with safe_open("model-00001-of-00007.safetensors", framework="pt") as f:
for name in f.keys():
tensor = f.get_tensor(name)
print(name, tensor.shape)
这些 name 就是模型的权重名(如:transformer.h.0.attn.q_proj.weight),对应模型层。
📦 **model.safetensors.index.json** 作用
这个 JSON 文件告诉框架:
所有参数都有哪些
每个参数在哪个
.safetensors分片中每个 tensor 的形状与数据类型
示例结构如下:
{
"metadata": {
"total_size": 54123342123
},
"weight_map": {
"transformer.h.0.attn.q_proj.weight": "model-00001-of-00007.safetensors",
"transformer.h.0.attn.k_proj.weight": "model-00001-of-00007.safetensors",
...
}
}
这样框架就能在多个分片中找到每个参数的位置。
🛠️ 如何加载含 **.safetensors** 的模型?
使用 Hugging Face Transformers 会自动识别:
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("your_model_dir", trust_remote_code=True)
框架会:
加载
config.json构建模型结构加载
safetensors.index.json映射文件从多个
.safetensors分片中加载权重
📤 如果你要保存为 **.safetensors**
from transformers import AutoModelForCausalLM
model.save_pretrained("your_dir", safe_serialization=True)
它会自动生成:
分片的
model-xxxx-of-yyyy.safetensorsmodel.safetensors.index.json
你也可以设置 max_shard_size 控制分片大小(如 "2GB")。
✅ 总结
| 项目 | 内容 |
|---|---|
| 文件名 | model-00001-of-000XX.safetensors |
| 作用 | 存储 Transformer 模型参数的分片(权重) |
| 搭配使用 | model.safetensors.index.json 提供索引 |
| 加载方式 | 自动由 Hugging Face Transformers 识别 |
| 替代格式 | 更快、更安全的 .bin 替代品 |
| 应用场景 | 大模型分布式权重管理,私有部署,安全模型分发 |
3.5 model.safetensors.index.json
model.safetensors.index.json 是 Hugging Face Transformers 在使用 .safetensors 格式保存大模型权重时生成的 索引文件,用于记录 每个模型参数(tensor)在哪个分片文件中,让模型加载器能正确分布式加载多个 .safetensors 文件。
🧠 一句话总结
model.safetensors.index.json是多分片.safetensors权重文件的目录映射表,记录了每个权重张量的文件位置。
📦 为什么需要它?
当模型很大(例如 7B/14B/70B),所有参数无法放进一个 .safetensors 文件时,会被拆成多片,比如:
model-00001-of-00007.safetensors
model-00002-of-00007.safetensors
...
model-00007-of-00007.safetensors
这时就需要一个索引文件告诉你:
每个 tensor 存在哪个分片文件里
所有权重一共多大
📄 文件结构详解
{
"metadata": {
// 总大小(字节)
"total_size": 21011769344
},
"weight_map": {
// 嵌入层权重文件
"model.embed_tokens.weight": "model-00001-of-00005.safetensors",
// 第0层自注意力q_proj的权重文件
"model.layers.0.self_attn.q_proj.qweight": "model-00001-of-00005.safetensors",
"model.layers.0.self_attn.q_proj.qzeros": "model-00001-of-00005.safetensors",
"model.layers.0.self_attn.q_proj.scales": "model-00001-of-00005.safetensors",
"model.layers.0.self_attn.q_proj.bias": "model-00001-of-00005.safetensors",
一个典型的 model.safetensors.index.json 文件内容如下(已格式化):
{
"metadata": {
"total_size": 13789162534 // 所有分片的总大小(字节数)
},
"weight_map": {
"model.embed_tokens.weight": "model-00001-of-00007.safetensors",
"model.layers.0.self_attn.q_proj.weight": "model-00001-of-00007.safetensors",
"model.layers.0.self_attn.k_proj.weight": "model-00001-of-00007.safetensors",
...
"lm_head.weight": "model-00007-of-00007.safetensors"
}
}
🧩 字段解释
| 字段 | 类型 | 含义 |
|---|---|---|
metadata.total_size |
int | 所有权重总大小(字节数) |
weight_map |
dict | key 为参数名,value 为对应的分片文件名 |
例如:
"model.layers.42.mlp.down_proj.weight": "model-00006-of-00007.safetensors"
表示这一层的参数在第 6 个权重分片中。
🛠️ 使用方式
当你用 Transformers 的 .from_pretrained() 加载 safetensors 权重时,它会:
读取
config.json建好模型结构检查是否有
model.safetensors.index.json根据
weight_map去每个分片.safetensors文件加载参数
你无需手动操作。
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("path/to/model", trust_remote_code=True)
✏️ 自定义用法(高级)
你可以修改或生成自己的 model.safetensors.index.json,例如:
加载部分权重:比如只加载 encoder 层用于微调
重新分片:将一个大文件拆成多个分片
工具包支持:
from safetensors.torch import load_file
from transformers import PreTrainedModel
# 可读取特定 safetensors 文件
tensors = load_file("model-00001-of-00007.safetensors")
📌 补充说明
.index.json是 只读辅助文件,不包含参数值本身不可缺失:如果有多个分片,必须存在此文件,否则加载会报错
对应
.bin的同类文件叫pytorch_model.bin.index.json
✅ 总结
| 项目 | 内容 |
|---|---|
| 文件名 | model.safetensors.index.json |
| 作用 | 记录每个模型参数在哪个 .safetensors 分片中 |
| 用于 | 自动多分片加载、分布式部署、节省内存 |
| 典型配套文件 | model-00001-of-00007.safetensors 等多个分片 |
| 自动处理 | Transformers 框架会自动解析并加载 |
3.6 README.md
在 Hugging Face 模型目录中(如 huggingface.co/你的模型名/),README.md 的作用非常重要,它不仅是模型介绍文档,还直接影响你在 Hugging Face 网页上看到的模型主页内容。
🧠 一句话总结
README.md是 Hugging Face 模型仓库的可视化主页说明文档,用于展示模型的介绍、用法、性能、许可证等信息。
📄 典型结构与作用
一个标准的 README.md 通常包含如下部分:
---
license: other
license_name: tongyi-qianwen
license_link: >-
https://huggingface.co/Qwen/Qwen1.5-32B-Chat-AWQ/blob/main/LICENSE
language:
- en
pipeline_tag: text-generation
tags:
- chat
---
# Qwen1.5-32B-Chat-AWQ
## Introduction
Qwen1.5 is the beta version of Qwen2, a transformer-based decoder-only language model pretrained on a large amount of data. In comparison with the previous released Qwen, the improvements include:
* 8 model sizes, including 0.5B, 1.8B, 4B, 7B, 14B, 32B and 72B dense models, and an MoE model of 14B with 2.7B activated;
* Significant performance improvement in human preference for chat models;
* Multilingual support of both base and chat models;
* Stable support of 32K context length for models of all sizes
* No need of `trust_remote_code`.
For more details, please refer to our [blog post](https://qwenlm.github.io/blog/qwen1.5/) and [GitHub repo](https://github.com/QwenLM/Qwen1.5).
<br>
## Model Details
Qwen1.5 is a language model series including decoder language models of different model sizes. For each size, we release the base language model and the aligned chat model. It is based on the Transformer architecture with SwiGLU activation, attention QKV bias, group query attention, mixture of sliding window attention and full attention, etc. Additionally, we have an improved tokenizer adaptive to multiple natural languages and codes. For the beta version, temporarily we did not include GQA (except for 32B) and the mixture of SWA and full attention.
## Training details
We pretrained the models with a large amount of data, and we post-trained the models with both supervised finetuning and direct preference optimization.
## Requirements
The code of Qwen1.5 has been in the latest Hugging face transformers and we advise you to install `transformers>=4.37.0`, or you might encounter the following error:
KeyError: ‘qwen2’
## Quickstart
Here provides a code snippet with `apply_chat_template` to show you how to load the tokenizer and model and how to generate contents.
```python
from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda" # the device to load the model onto
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen1.5-32B-Chat-AWQ",
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen1.5-32B-Chat-AWQ")
prompt = "Give me a short introduction to large language model."
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(device)
generated_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=512
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
Tips
- If you encounter code switching or other bad cases, we advise you to use our provided hyper-parameters in
generation_config.json.
Citation
If you find our work helpful, feel free to give us a cite.
@article{qwen,
title={Qwen Technical Report},
author={Jinze Bai and Shuai Bai and Yunfei Chu and Zeyu Cui and Kai Dang and Xiaodong Deng and Yang Fan and Wenbin Ge and Yu Han and Fei Huang and Binyuan Hui and Luo Ji and Mei Li and Junyang Lin and Runji Lin and Dayiheng Liu and Gao Liu and Chengqiang Lu and Keming Lu and Jianxin Ma and Rui Men and Xingzhang Ren and Xuancheng Ren and Chuanqi Tan and Sinan Tan and Jianhong Tu and Peng Wang and Shijie Wang and Wei Wang and Shengguang Wu and Benfeng Xu and Jin Xu and An Yang and Hao Yang and Jian Yang and Shusheng Yang and Yang Yao and Bowen Yu and Hongyi Yuan and Zheng Yuan and Jianwei Zhang and Xingxuan Zhang and Yichang Zhang and Zhenru Zhang and Chang Zhou and Jingren Zhou and Xiaohuan Zhou and Tianhang Zhu},
journal={arXiv preprint arXiv:2309.16609},
year={2023}
}
#### 1. 模型简介
```markdown
# Qwen2-7B-Chat
Qwen2 是阿里达摩院发布的新一代大语言模型,支持中英文,具备对话能力。
简明扼要介绍模型名称、来源、能力、适用场景。
2. 模型卡元数据(YAML Header)
---
license: apache-2.0
language:
- zh
- en
tags:
- chat
- qwen2
pipeline_tag: text-generation
---
这段 YAML 元数据是 Hugging Face “模型卡”规范的一部分,供网页渲染和搜索使用。常见字段包括:
| 字段 | 说明 |
|---|---|
license |
模型许可证类型(如 apache-2.0、mit、openrail) |
language |
支持的语言 |
tags |
模型标签,影响推荐和搜索 |
pipeline_tag |
用于展示推理 Widget 的模型类型(如 text-generation, text-classification) |
3. 模型使用方式(代码示例)
## 使用方法
```python
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-7B-Chat")
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-7B-Chat")
inputs = tokenizer("你好,请介绍一下你自己。", return_tensors="pt")
outputs = model.generate(**inputs)
print(tokenizer.decode(outputs[0]))
> 展示如何加载和使用模型,通常使用 `transformers` 接口,帮助用户快速上手。
---
### 4. 模型细节(结构、训练语料、推理设置)
```markdown
## 模型结构
- 参数量:7B
- 层数:32
- 支持上下文长度:32K
- 训练数据:中英混合、网络文本、代码等
有助于用户了解模型能力与边界。
5. 性能评估 / Benchmark(可选)
## Benchmark
| Dataset | Score |
|---------|-------|
| MMLU | 68.3 |
| CMMLU | 56.1 |
6. 许可与责任声明
## 许可证
本模型采用 Apache 2.0 协议,可商用使用。
## 注意事项
本模型为研究用途,不对生成内容负责。请勿用于违法行为。
💻 如何影响 Hugging Face 页面?
上传的 README.md 会被渲染为 Hugging Face 模型页的主要内容部分:
位于模型卡最上方
显示推理示例、标签、语言支持、下载入口等
决定了用户是否信任、理解、使用你的模型
👉 可以理解为:它既是文档,又是营销页!
🛠️ 如何编辑 / 上传?
方法 1:手动创建
将 README.md 放入模型目录中,调用:
huggingface-cli upload ./your_model --repo-id yourname/yourmodel
方法 2:在线编辑
在模型页面右上角点击 ✏️「Edit model card」,在线修改 README.md。
✅ 总结
| 项目 | 内容 |
|---|---|
| 文件名 | README.md |
| 位置 | 模型目录根路径 |
| 作用 | 显示在 Hugging Face 模型主页,提供模型介绍、使用方法、元数据 |
| 类型 | Markdown 文本,支持代码块、表格、图片等 |
| 与谁配套 | config.json(结构)、safetensors(权重)、tokenizer.json(分词器) |
3.7 tokenizer_config.json
tokenizer_config.json 是 Hugging Face Transformers 模型目录中的重要配置文件,它用于描述 tokenizer 的运行时行为和元信息,对加载、兼容性、推理行为等都有影响。
🧠 一句话理解
tokenizer_config.json是告诉AutoTokenizer(或其它 Tokenizer 类)如何正确加载和使用分词器的说明书。
📦 文件位置
在 Hugging Face 模型目录结构中,通常与下列文件位于同一目录下:
- config.json
- tokenizer_config.json
- tokenizer.json
- merges.txt / vocab.json
- special_tokens_map.json
- model.safetensors
- README.md
🧾 典型内容示例
{
// 是否在分词时添加前缀空格
"add_prefix_space": false,
// 特殊token的解码器
"added_tokens_decoder": {
// <|endoftext|> 结束文本的特殊token
"151643": {
"content": "<|endoftext|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
// <|im_start|> 对话开始的特殊token
"151644": {
"content": "<|im_start|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
// <|im_end|> 对话结束的特殊token
"151645": {
"content": "<|im_end|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
}
},
// 额外的特殊token列表
"additional_special_tokens": [],
// 句子起始token(未设置)
"bos_token": null,
// 聊天模板,定义消息格式
"chat_template": "{% for message in messages %}{% if loop.first and messages[0]['role'] != 'system' %}{{ '<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n' }}{% endif %}{{'<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>' + '\n'}}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant\n' }}{% endif %}",
// 是否清理分词空格
"clean_up_tokenization_spaces": false,
// 句子结束token
"eos_token": "<|im_end|>",
// 错误处理方式
"errors": "replace",
// 模型最大长度
"model_max_length": 32768,
// 填充token
"pad_token": "<|endoftext|>",
// 是否分割特殊token
"split_special_tokens": false,
// 分词器类名
"tokenizer_class": "Qwen2Tokenizer",
// 未知token(未设置)
"unk_token": null
}
以一个用于文本生成的 tokenizer 为例:
{
"add_bos_token": true,
"add_eos_token": false,
"bos_token": "<s>",
"eos_token": "</s>",
"unk_token": "<unk>",
"pad_token": "<pad>",
"cls_token": "<s>",
"sep_token": "</s>",
"do_lower_case": false,
"model_max_length": 2048,
"tokenizer_class": "LlamaTokenizer",
"auto_map": {
"AutoTokenizer": ["tokenization_llama.LlamaTokenizer", null]
},
"use_fast": false
}
🔍 字段说明
| 字段名 | 类型 | 说明 |
|---|---|---|
add_bos_token |
bool |
是否在输入前添加 <s> 开头 token(通常用于 decoder-only 模型) |
add_eos_token |
bool |
是否自动在输入后添加 </s>(终止符) |
bos_token, eos_token, unk_token, pad_token, cls_token, sep_token |
string |
特殊标记符定义,影响解码和处理 |
do_lower_case |
bool |
是否将输入强制小写(常用于 BERT) |
model_max_length |
int |
默认支持的最大序列长度(超出时会报错或截断) |
tokenizer_class |
string |
指定用哪个 Tokenizer 类加载(如 LlamaTokenizer, GPT2Tokenizer) |
auto_map |
dict |
自定义 Tokenizer 类映射(用于私有 tokenizer 的注册) |
use_fast |
bool |
是否默认启用 FastTokenizer(Rust 实现,更快) |
🚀 和其它文件的关系
| 文件 | 作用 | 相互关系 |
|---|---|---|
tokenizer.json |
主要的序列化分词器模型 | tokenizer_config.json 指定如何加载它 |
vocab.json, merges.txt |
适用于 BPE tokenizer(如 GPT-2) | 低层词表配置文件 |
special_tokens_map.json |
映射特殊 token 到实际字符串(例如 <pad> 对应 ID) |
可与本文件内容重叠,但也可独立覆盖 |
config.json |
模型结构(层数、头数等) | 和 tokenizer 配套使用,但用途不同 |
✅ 示例:加载方式受 **tokenizer_config.json** 影响
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-7B-Chat")
# 会优先读取 tokenizer_config.json 中的信息
# 决定是否加载 fast tokenizer、默认特殊符号、是否添加 bos_token 等
🛠️ 编辑或自定义使用场景
你可能会想修改它的场景包括:
为 tokenizer 添加 pad_token 或 eos_token
调整
model_max_length以适配 longer context替换 tokenizer 类名(如加载自定义的分词器逻辑)
禁用 fast tokenizer(当 fast 模型存在 bug)
例如:
{
"pad_token": "<|pad|>",
"model_max_length": 4096,
"tokenizer_class": "MyCustomTokenizer",
"use_fast": false
}
总结 ✅
| 功能 | 说明 |
|---|---|
| 核心作用 | 告诉 AutoTokenizer 如何加载、配置、初始化 |
| 关键字段 | 特殊符号、是否 lower-case、最大长度、fast/slow 模式 |
| 和其它文件关系 | 配合 tokenizer.json 和 special_tokens_map.json 等文件共同使用 |
| 是否可选 | 是,但缺失时会采用默认推断逻辑,可能导致不一致行为 |
3.8 tokenizer.json
tokenizer.json 是 Hugging Face Transformers 分词器目录中最核心的文件之一,它是Tokenizer 的完整序列化文件,包括词表、预处理规则、正则、特殊 token 映射、分词算法逻辑等。
🧠 一句话理解
tokenizer.json是 tokenizer 的所有行为和词表信息的统一打包版本,用于快速加载和复现 tokenizer 行为,尤其在使用fast tokenizer时。
🔍 它和其它文件有何区别?
| 文件 | 作用 | 说明 |
|---|---|---|
tokenizer_config.json |
参数设置 | 控制 tokenizer 运行行为(如是否加 bos_token) |
tokenizer.json |
主体 | 保存完整 fast tokenizer 定义,包括词表、merge、pretokenizer 等 |
vocab.json + merges.txt |
GPT/BPE 模型词表 | 用于 slow tokenizer 的构建 |
special_tokens_map.json |
映射 | <pad>、<eos> 这些符号的实际字符串/ID |
tokenizer.json 是 Fast Tokenizer(Rust 实现)专用文件,可以替代 vocab.json 和 merges.txt,因此更快、更便携。
📦 典型结构内容
shengping.mo@y108p30:/data2/huggingface/Qwen/Qwen1.5-32B-Chat-AWQ$ head -n 100 tokenizer.json
{
"version": "1.0",
"truncation": null, // 截断设置
"padding": null, // 填充设置
"added_tokens": [ // 新增的特殊token
{
"id": 151643,
"content": "<|endoftext|>", // 文本结束标记
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
{
"id": 151644,
"content": "<|im_start|>", // 对话开始标记
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
},
{
"id": 151645,
"content": "<|im_end|>", // 对话结束标记
"single_word": false,
"lstrip": false,
"rstrip": false,
"normalized": false,
"special": true
}
],
"normalizer": {
"type": "NFC" // 归一化类型
},
"pre_tokenizer": { // 分词前处理
"type": "Sequence",
"pretokenizers": [
{
"type": "Split",
"pattern": {
"Regex": "(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|\p{N}| ?[^\s\p{L}\p{N}]+[\r\n]*|\s*[\r\n]+|\s+(?!\S)|\s+"
},
"behavior": "Isolated",
"invert": false
},
{
"type": "ByteLevel",
"add_prefix_space": false,
"trim_offsets": false,
"use_regex": false
}
]
},
"post_processor": { // 分词后处理
"type": "ByteLevel",
"add_prefix_space": false,
"trim_offsets": false,
"use_regex": false
},
"decoder": { // 解码器
"type": "ByteLevel",
"add_prefix_space": false,
"trim_offsets": false,
"use_regex": false
},
"model": { // 模型相关配置
"type": "BPE",
"dropout": null,
"unk_token": null,
"continuing_subword_prefix": "",
"end_of_word_suffix": "",
"fuse_unk": false,
"byte_fallback": false,
"vocab": { // 词表
"!": 0,
"\"": 1,
"#": 2,
"$": 3,
"%": 4,
"&": 5,
"'": 6,
"(": 7,
")": 8,
"*": 9,
"+": 10,
",": 11,
"-": 12,
".": 13,
"/": 14,
"0": 15,
"1": 16,
"2": 17,
"3": 18,
"4": 19,
"5": 20,
"6": 21,
"7": 22,
"8": 23,
一个 tokenizer.json 是一个大型 JSON 文件,通常包含以下字段:
{
"version": "1.0",
"truncation": { ... },
"padding": { ... },
"added_tokens": [ ... ],
"normalizer": { ... },
"pre_tokenizer": { ... },
"post_processor": { ... },
"decoder": { ... },
"model": {
"type": "BPE",
"vocab": {
"the": 0,
"a": 1,
...
},
"merges": [
["t", "h"],
["th", "e"],
...
]
}
}
🔧 关键字段解释
| 字段名 | 说明 |
|---|---|
model |
分词模型结构,如 BPE / WordPiece,含词表和合并规则 |
vocab |
单词到 token ID 的映射 |
merges |
合并规则(仅用于 BPE) |
normalizer |
正规化规则,如 Unicode 规范化、lowercasing 等 |
pre_tokenizer |
分词前的处理,如空格拆分、正则 |
post_processor |
分词后的处理,如添加 <bos>、</s> 等特殊 token |
decoder |
将 token ID 序列还原为字符串 |
added_tokens |
用户添加的特殊 token,比如 <user>, <bot> 等 |
padding / truncation |
padding 和截断规则,决定输入对齐策略 |
✅ 加载示例
from transformers import PreTrainedTokenizerFast
tokenizer = PreTrainedTokenizerFast(tokenizer_file="path/to/tokenizer.json")
print(tokenizer.tokenize("你好,世界!"))
你也可以使用:
tokenizer = AutoTokenizer.from_pretrained("模型路径或Hub名")
背后就是调用 tokenizer.json 加载逻辑。
🚀 应用场景
✅ 使用 Rust 实现的 fast tokenizer(默认 Hugging Face 会优先加载 **tokenizer.json**)
更快的批量 tokenization
支持 pretokenizer + postprocessor 全流程定制
更容易部署(打包成 ONNX 或导出)
✅ 自定义 tokenizer 时生成这个文件:
from tokenizers import Tokenizer, trainers, models
# 训练 BPE 模型
tokenizer = Tokenizer(models.BPE())
# ...
tokenizer.train(...) # 自定义训练
tokenizer.save("tokenizer.json")
📝 和 fast tokenizer 的关系
| 特性 | slow tokenizer | fast tokenizer (tokenizer.json) |
|---|---|---|
| 加载速度 | 慢 | 快(Rust 实现) |
| 是否需要 vocab/merges | 是 | 不需要(已合并到 tokenizer.json) |
| 多语言支持 | 有 | 更强 |
| 正则/pipeline 细节可配置性 | 较弱 | 很强(支持 pretokenizer/normalizer/postprocessor) |
总结 ✅
| 属性 | 内容 |
|---|---|
| 文件类型 | JSON |
| 用途 | 描述 tokenizer 全部行为,用于 fast tokenizer 加载 |
| 是否必须 | 不是必须,但存在时优先使用 |
| 和 vocab/merges 的关系 | 可以替代,功能更完整 |
| 修改方式 | 可通过 tokenizers 库创建或修改 |
| 建议 | 模型训练或部署推荐使用 tokenizer.json,尤其在需要高性能时 |
3.9 vocab.json
vocab.json 是 Hugging Face Tokenizer 模型中用于存储**词汇表(vocabulary)**的文件,常见于基于 BPE(Byte Pair Encoding)或 WordPiece 等子词分词算法的模型,例如 GPT、BERT、Roberta、LLaMA 等。
✅ 一句话理解
vocab.json定义了「token 到 ID 的映射关系」,是分词器的核心文件之一。
📦 文件结构示例
{
"the": 0,
"Ġthe": 1,
"a": 2,
"Ġa": 3,
"apple": 1000,
"##ple": 1001,
"<pad>": 50256,
"<eos>": 50257
}
key:token(字符串),可以是单词、子词、符号或特殊 token
value:整型 ID,用于将 token 转为模型可用的输入
Ġ表示前面有空格(在 Roberta/BPE 中常见)##表示这个词是接在前一个词后面的(WordPiece 标记)
🔍 它与其它文件的区别
| 文件 | 作用 | 是否必须 | 快速说明 |
|---|---|---|---|
vocab.json |
token ➜ ID 映射 | 是(slow tokenizer) | 分词后映射成整数 token ID |
merges.txt |
BPE 合并规则 | 是(BPE 模型) | 指定如何从字符对合并出 token |
tokenizer.json |
Fast tokenizer 全部行为 | 否 | 打包了 vocab 和 merges,也更快 |
tokenizer_config.json |
加载 tokenizer 的配置项 | 否 | 控制是否添加特殊 token 等行为 |
special_tokens_map.json |
特殊 token 的 ID/映射 | 否 | 控制 , 等的定义 |
🔧 应用方式
加载模型 tokenizer 时会自动用到:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2") # 会读取 vocab.json + merges.txt
tokens = tokenizer.tokenize("The apple is red.")
ids = tokenizer.convert_tokens_to_ids(tokens)
你也可以手动加载:
import json
with open("vocab.json") as f:
vocab = json.load(f)
print(vocab["apple"]) # 输出对应的 token ID
🏗 如何生成 vocab.json?
通常是通过训练分词器:
from tokenizers import Tokenizer, models, trainers, pre_tokenizers
tokenizer = Tokenizer(models.BPE())
tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()
trainer = trainers.BpeTrainer(vocab_size=10000, special_tokens=["<pad>", "<eos>"])
tokenizer.train(["corpus.txt"], trainer)
tokenizer.model.save(".", "my-tokenizer") # 输出 vocab.json + merges.txt
🚀 在推理中的作用
在推理时,文本输入流程如下:
文本输入 → 分词器 → token 序列 → vocab.json 查 ID → 模型输入
反向输出流程:
模型输出 token ID → vocab.json 反查 token → 拼接成文本
所以它是编码与解码的基础。
✅ 总结
| 属性 | 说明 |
|---|---|
| 文件类型 | JSON(键为字符串 token,值为整数 ID) |
| 用途 | 供 slow tokenizer 使用;token ↔ ID 映射 |
| 依赖 | 通常与 merges.txt 配合使用 |
| 被谁用 | AutoTokenizer, PreTrainedTokenizer 等 |
| 是否可替代 | 若有 tokenizer.json,则可不再使用它 |
4、总结
Hugging Face 模型目录结构是用于保存一个预训练模型(及其 tokenizer、配置等)的完整打包形式,目的是为了方便模型的加载、共享、部署和推理。下面为你总结模型目录的标准构成、每个文件的作用、是否必须、以及它们之间的关系。
✅ 1. 目录结构总览
一个典型的 Hugging Face 模型目录如下:
/your-model-dir/
├── config.json
├── generation_config.json
├── pytorch_model.bin / model.safetensors
├── model.safetensors.index.json (如为分片模型)
├── tokenizer_config.json
├── tokenizer.json
├── vocab.json
├── merges.txt (如为 BPE)
├── special_tokens_map.json
├── README.md
📁 2. 各文件功能详解
| 文件名 | 必须 | 类型 | 作用 |
|---|---|---|---|
| config.json | ✅ 是 | 模型配置 | 定义模型架构参数(层数、隐藏维度、dropout 等) |
| pytorch_model.bin / model.safetensors | ✅ 是 | 模型权重 | 保存模型的预训练参数(PyTorch 格式 / safetensors 更安全) |
| model.safetensors.index.json | 🚫 否 | 权重索引 | 用于分片模型(多块 .safetensors 的索引信息) |
| tokenizer_config.json | ✅ 是 | tokenizer 配置 | 控制 tokenizer 行为,比如是否小写、是否添加 BOS/EOS 等 |
| tokenizer.json | 🚫 否 | Fast tokenizer | Hugging Face 的 Rust 实现 tokenizer,速度快,包含 vocab+merges |
| vocab.json | ✅ 是 | 词表(token → id) | 分词器词典,主要用于 slow tokenizer |
| merges.txt | ⚠️ 视分词器类型 | BPE 合并规则 | 仅用于 BPE(GPT、Roberta 等) |
| special_tokens_map.json | 🚫 否 | 特殊 token 映射 | 映射 、、 等到对应 ID |
| generation_config.json | 🚫 否 | 推理配置 | 定义采样策略(如 temperature, top_k, repetition_penalty 等) |
| README.md | 🚫 否 | 文档 | 模型说明文档(在 Hugging Face hub 上展示) |
🧠 3. 必须 vs 可选文件汇总
✅ 必须文件(用于模型加载)
config.jsonpytorch_model.bin或model.safetensorstokenizer_config.jsonvocab.json
⚠️ 根据模型类型必须
merges.txt:如果使用 BPE tokenizer(如 GPT、Roberta)
🚫 可选但推荐
tokenizer.json:推荐用于 fast tokenizer,加快速度generation_config.json:如模型用于生成任务(文本生成、聊天)special_tokens_map.json:对话模型、翻译、QA 常用README.md:用于模型说明和文档展示model.safetensors.index.json:当模型是分片结构(sharded)时才出现
📦 4. 加载时工作机制
Hugging Face 的 AutoModel 和 AutoTokenizer 会根据目录内容自动判断使用哪种文件:
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("./your-model-dir")
tokenizer = AutoTokenizer.from_pretrained("./your-model-dir")
它会依次尝试加载:
权重:
model.safetensors>pytorch_model.bintokenizer:
tokenizer.json>vocab.json + merges.txt特殊 token:
special_tokens_map.json推理策略:
generation_config.json
🔍 5. 示例应用流程
文本 → tokenizer.json/vocab.json → token ID → 模型(config+权重) → 输出 token ID → 反向 tokenizer → 文本输出
✅ 总结一句话
Hugging Face 模型目录包含了“模型结构(config)+权重+分词器+推理策略”的完整组件,是部署、共享、加载模型的标准打包格式。
作者:mospan
微信关注:墨斯潘園
本文出处:http://mospany.github.io/2025/11/09/hugging-face/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
