《大模型的文件形态:Qwen3 文件结构与计算流程深度拆解》

《大模型的文件形态:Qwen3 文件结构与计算流程深度拆解》

作者:吴佳浩

撰稿时间:2026-2-26

最后更新:2026-2-27

测试模型: Qwen3-8B

mindmap root((Qwen3 模型目录)) 架构说明书 config.json 网络层数 维度 注意力头数 决定模型结构 参数张量 safetensors 注意力权重 QKV FFN 权重 gate/up/down Embedding 和 LM Head 存储所有学习到的知识 编解码规则 tokenizer.json vocab.json + merges.txt 文字与 token id 双向转换 BPE 分词 151936词表 生成控制 generation_config.json temperature top_p top_k 控制输出的随机性

引言:

不知道有多少同学在使用大模型时,认真思考过一个问题:

大模型,究竟是由什么组成的?

我们每天调用接口,输入一段文字,几秒钟后得到一段看似"聪明"的回答。 它能写代码、能分析问题、能推理、能翻译,甚至能模拟人的思考方式。

但当我们把视角从"使用者"切换到"工程师",问题就变了:

  • 模型真的"会思考"吗?
  • 那些参数到底存在哪里?
  • 为什么一个文件夹可以装下 80 亿个参数?
  • 一堆 .safetensors 文件,是如何变成智能行为的?

如果把模型下载到本地,你会发现------ 它并不是一个"神秘黑盒"。

它只是:

  • 一份结构描述文件
  • 一堆巨大的矩阵权重
  • 以及一条固定的计算路径

当输入经过这条路径时,输出自然出现。

换句话说:

大模型不是魔法,它只是被高度工程化的数学。

这篇文章,我们就以 Qwen3 为例,拆开模型目录, 从文件结构、参数分布,到推理流程与数学本质, 彻底看看------

大模型,究竟是如何"被装进一个文件夹里的"。

前置说明:

本文以 Qwen3 系列模型为例,系统讲解大语言模型目录结构、参数本质与推理原理。


1.Qwen3?

Qwen3 是阿里巴巴通义实验室发布的大语言模型系列,涵盖从 0.6B 到 235B 的多个规模版本,支持文本生成、代码、数学推理等任务。(其实国内的开源狂魔他比较有代表性,我个人用的他家的系列也比较多 所以就以它举例了!)

典型型号:

  • Qwen3-0.6B
  • Qwen3-1.7B
  • Qwen3-4B
  • Qwen3-8B
  • Qwen3-14B
  • Qwen3-32B
  • Qwen3-30B-A3B(MoE 架构)
  • Qwen3-235B-A22B(MoE 架构)

2. 模型目录结构

当你从 HuggingFace 或 ModelScope 下载 Qwen3 模型后,会得到一个目录,结构如下:

bash 复制代码
Qwen3-8B/
├── config.json
├── generation_config.json
├── tokenizer.json
├── tokenizer_config.json
├── vocab.json
├── merges.txt
├── model.safetensors.index.json
├── model-00001-of-00005.safetensors   (4 GB)
├── model-00002-of-00005.safetensors   (3.99 GB)
├── model-00003-of-00005.safetensors   (3.96 GB)
├── model-00004-of-00005.safetensors   (3.19 GB)
├── model-00005-of-00005.safetensors   (1.24 GB)
├── README.md
└── LICENSE

这些文件从功能上可以归为四类:

graph TD A[Qwen3-8B 模型目录] --> B[架构说明书
config.json] A --> C[参数张量文件
*.safetensors] A --> D[输入编码规则
tokenizer.*] A --> E[生成控制参数
generation_config.json] B --> B1["隐藏层维度: 4096
层数: 32
注意力头数: 32"] C --> C1["权重矩阵
约 16GB(float16)"] D --> D1["文字 → token id
token id → 文字"] E --> E1["temperature
top_p / top_k
max_new_tokens"]

3. 核心文件详解

3.1 config.json --- 架构说明书

这个文件告诉框架(如 Transformers)如何把参数矩阵拼装成完整的神经网络。

json 复制代码
{
  "model_type": "qwen3",
  "hidden_size": 4096,
  "num_hidden_layers": 32,
  "num_attention_heads": 32,
  "num_key_value_heads": 8,
  "intermediate_size": 22016,
  "max_position_embeddings": 32768,
  "vocab_size": 151936,
  "rms_norm_eps": 1e-06,
  "rope_theta": 1000000.0,
  "torch_dtype": "bfloat16"
}

关键字段解读:

  • hidden_size: 每个 token 经过模型后的向量维度,8B 模型为 4096
  • num_hidden_layers: Transformer 层数,8B 模型为 32 层
  • num_attention_heads: 多头注意力的头数
  • num_key_value_heads: GQA(分组查询注意力)中 KV 头数,8 表示用了 GQA 压缩
  • vocab_size: 词表大小,Qwen3 约 15 万词
  • rope_theta: RoPE 位置编码的基础频率

没有 config.json,你只有一堆无法解读的数字矩阵。


3.2 safetensors --- 参数张量集合

这是模型的"真正内容",存储了所有可学习参数的数值。

什么是 Tensor(张量)?
graph LR A[标量 Scalar] -->|0维| A1["3.14"] B[向量 Vector] -->|1维| B1["[1, 2, 3, 4]"] C[矩阵 Matrix] -->|2维| C1["4096 x 4096"] D[张量 Tensor] -->|N维| D1["任意维度"]

在 Qwen3 中,safetensors 存储的主要参数类型:

graph TD W[safetensors 文件] --> E[Embedding 层
token嵌入矩阵
151936 x 4096] W --> ATT[Attention 层 x32] W --> MLP[MLP 层 x32] W --> N[LayerNorm 参数] W --> LM[LM Head
输出词表映射] ATT --> Q["q_proj.weight
[4096 x 4096]"] ATT --> K["k_proj.weight
[1024 x 4096](GQA)"] ATT --> V["v_proj.weight
[1024 x 4096](GQA)"] ATT --> O["o_proj.weight
[4096 x 4096]"] MLP --> G["gate_proj.weight
[22016 x 4096]"] MLP --> UP["up_proj.weight
[22016 x 4096]"] MLP --> DN["down_proj.weight
[4096 x 22016]"]
为什么文件这么大?

以 Qwen3-8B 为例:

bash 复制代码
参数量:约 80 亿(8B)
每个参数精度:bfloat16 = 2 字节
磁盘大小:80亿 × 2 字节 ≈ 16 GB

文件分片原因:单个文件超过 4-5GB 时,HuggingFace 会自动分片为多个 .safetensors 文件,由 model.safetensors.index.json 记录每个参数在哪个分片里。

safetensors vs pytorch_model.bin
bash 复制代码
pytorch_model.bin   →  Python pickle 格式,存在安全风险,加载慢
safetensors         →  专为 ML 设计,内存映射,加载快,安全

Qwen3 默认使用 safetensors 格式。


3.3 Tokenizer --- 语言编解码规则

Tokenizer 不是模型参数,它是一套独立的文字与 token id 双向转换规则。

sequenceDiagram participant U as 用户输入 participant T as Tokenizer participant M as 模型 participant D as Detokenizer U->>T: "Qwen3很强" T->>M: [14364, 19, 17, 42, 185, 209, 16714] M->>D: [36894, 12, 88, 209, ...] D->>U: "Qwen3确实非常出色"

Qwen3 使用的是基于 BPE(字节对编码)的分词方案,词表大小约 151,936。

主要文件:

  • tokenizer.json:完整的词表和合并规则,核心文件
  • vocab.json:token 到 id 的映射表
  • merges.txt:BPE 合并规则
  • tokenizer_config.json:tokenizer 类型、特殊配置及特殊 token 定义(如 <|im_start|><|im_end|>,Qwen3 将其合并在此文件中)

Qwen3 的 ChatML 格式模板:

bash 复制代码
<|im_start|>system
你是一个有帮助的助手。<|im_end|>
<|im_start|>user
你好<|im_end|>
<|im_start|>assistant
你好!有什么可以帮你的?<|im_end|>

3.4 generation_config.json --- 生成控制

这个文件控制模型如何"采样"输出:

json 复制代码
{
  "temperature": 0.7,
  "top_p": 0.8,
  "top_k": 20,
  "repetition_penalty": 1.05,
  "max_new_tokens": 8192
}
  • temperature:值越低输出越确定,值越高越随机;0 表示完全贪心解码
  • top_p:核采样,只从累积概率达到 p 的 token 中采样
  • top_k:只从概率最高的 k 个 token 中采样
  • repetition_penalty:惩罚重复出现的 token

Qwen3 支持 Thinking 模式(类似 o1),可通过 enable_thinking=True 开启,此时模型会在 <think>...</think> 标签内输出推理过程。


4. 模型推理的完整流程

flowchart TD A[用户输入文本] --> B[Tokenizer 编码] B --> C["token id 序列\n[1, 9668, 11, ...]"] C --> D["Embedding 层\nid -> 4096维向量"] D --> E[第1层 Transformer Block] E --> F[第2层 Transformer Block] F --> G[...] G --> H[第32层 Transformer Block] H --> I[RMS Norm 归一化] I --> J["LM Head 线性层\n4096 -> 151936"] J --> K[Softmax 得到概率分布] K --> L{采样策略} L -->|贪心/top-k/top-p| M[选出下一个 token] M --> N[Detokenizer 解码] N --> O[输出文字] M -->|未结束| C

每个 Transformer Block 的内部结构:

graph TD IN["输入 x\nshape: seq_len x 4096"] --> RN1[RMS Norm] RN1 --> ATT["Multi-Head Attention\nGQA + RoPE"] ATT --> ADD1["残差连接\nx + Attn"] ADD1 --> RN2[RMS Norm] RN2 --> MLP["SwiGLU FFN\n4096 -> 22016 -> 4096"] MLP --> ADD2["残差连接\n+ FFN"] ADD2 --> OUT["输出\nshape: seq_len x 4096"]

5. Qwen3 的关键技术特性

5.1 GQA(分组查询注意力)

标准 MHA 与 GQA 的对比:

graph LR subgraph MHA["标准 MHA(旧方式)"] Q1[32个Q头] K1[32个K头] V1[32个V头] end subgraph GQA["GQA(Qwen3方式)"] Q2[32个Q头] K2[8个K头] V2[8个V头] Q2 -->|4个Q共享1个KV| K2 end

GQA 的好处:显著减少 KV Cache 内存占用,推理速度更快。


5.2 RoPE(旋转位置编码)

Qwen3 使用 RoPE 而非传统的绝对位置编码:

arduino 复制代码
传统位置编码:position 1 → 固定向量加到 embedding 上
RoPE:通过旋转矩阵编码相对位置关系,天然支持长上下文外推

Qwen3 的 rope_theta = 1,000,000,支持最长 32,768 token 上下文(部分版本支持 131,072)。


5.3 MoE 架构(Qwen3-30B-A3B / 235B-A22B)

混合专家模型(Mixture of Experts):

graph TD IN[输入 token] --> R[Router 路由器] R -->|激活 3B 参数| E1[Expert 1] R -->|激活 3B 参数| E2[Expert 2] R -->|跳过| E3[Expert 3 ... N] E1 --> OUT[输出] E2 --> OUT style E3 fill:#ddd,stroke:#aaa

Qwen3-235B-A22B 表示:总参数 235B,但每次推理只激活 22B,计算量大幅降低,推理效率接近 22B 模型。


6. 参数规模与资源需求

不同版本 Qwen3 的资源对照:

bash 复制代码
Qwen3-0.6B   →  约 1.2 GB   →  CPU 或入门 GPU
Qwen3-1.7B   →  约 3.4 GB   →  4GB 显存 GPU
Qwen3-4B     →  约 8 GB     →  8GB 显存 GPU
Qwen3-8B     →  约 16 GB    →  24GB 显存 GPU(如 RTX 3090)
Qwen3-14B    →  约 28 GB    →  2x A100 40G 或量化后单卡
Qwen3-32B    →  约 64 GB    →  4x A100 40G
Qwen3-235B   →  约 470 GB   →  多节点推理 / 量化压缩

计算公式:

bash 复制代码
磁盘大小(GB)= 参数量(B)× 精度字节数
  bfloat16:每参数 2 字节 → 8B × 2 = 16 GB
  int8:    每参数 1 字节 → 8B × 1 = 8 GB
  int4:    每参数 0.5字节 → 8B × 0.5 = 4 GB

7. 从数学角度的本质

整个推理过程可以用一个公式概括:

bash 复制代码
y = f(x; θ)

其中:

  • x:输入的 token id 序列
  • θ:所有参数矩阵(存储在 safetensors 中)
  • f:网络结构(由 config.json 定义)
  • y:输出的概率分布

参数 θ 在推理阶段是完全冻结的,不会更新。所有的"智能"都已经被编码在这些数值中,通过训练阶段的梯度下降学习而来。


8. 总结

mindmap root((Qwen3 模型目录)) 架构说明书 config.json 网络层数 维度 注意力头数 决定模型结构 参数张量 safetensors 注意力权重 QKV FFN 权重 gate/up/down Embedding 和 LM Head 存储所有学习到的知识 编解码规则 tokenizer.json vocab.json + merges.txt 文字与 token id 双向转换 BPE 分词 151936词表 生成控制 generation_config.json temperature top_p top_k 控制输出的随机性

一句话总结:

模型目录 = 架构说明书(config) + 神经网络参数张量集合(safetensors) + 输入编解码规则(tokenizer) + 生成采样配置(generation_config)

模型的"智能"本质上是数十亿个参数矩阵中数值的精确组合,通过海量数据训练后冻结在 safetensors 文件里,推理时按照 config 定义的结构依次执行矩阵乘法,最终产生输出。

相关推荐
程序员陆业聪10 小时前
Android 平台 AI Agent 技术架构深度解析
android·人工智能
牛奶12 小时前
AI辅助开发实战:会问问题比会写代码更重要
人工智能·ai编程·全栈
阿星AI工作室12 小时前
10分钟安装claudecode和ccswitch,国产模型随意切,想用哪个用哪个
人工智能
牛奶12 小时前
为什么2026年还要学全栈?
人工智能·ai编程·全栈
冬奇Lab13 小时前
Anthropic 十大企业插件深度剖析:AI 正式进入白领工作腹地
人工智能·claude
DianSan_ERP15 小时前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
在人间耕耘15 小时前
HarmonyOS Vision Kit 视觉AI实战:把官方 Demo 改造成一套能长期复用的组件库
人工智能·深度学习·harmonyos
够快云库15 小时前
能源行业非结构化数据治理实战:从数据沼泽到智能资产
大数据·人工智能·机器学习·企业文件安全