222、【AI】【模型部署】模型的影子:解剖 Qwen2.5-0.5B 模型目录

发布时间:2026/9/15 8:34:20
222、【AI】【模型部署】模型的影子:解剖 Qwen2.5-0.5B 模型目录 【声明】本博客所有内容均为个人业余时间创作所述技术案例均来自公开开源项目如GithubApache基金会不涉及任何企业机密或未公开技术如有侵权请联系删除标题222、【AI】【模型部署】模型的影子解剖 Qwen2.5-0.5B 模型目录背景上篇 blog【AI】【模型部署】跑起第一个模型(下)Notebook 里首次推理在 Notebook 里三格跑通了推理from_pretrained(本地目录)0.4s 加载分词器与模型apply_chat_template把一句中文渲染成 35 个 tokengenerate贪心生成 52 tokens3.1s、16.9 tok/s还提到词表 151936、config 声明qwen2、24 层、hidden 896。本篇停下手动推理回头解剖那个约 1GB 的模型目录config.json 怎么决定网络结构、model.safetensors 里那 290 个张量是谁、词表文件怎么把文字变成数字——搞清一个开源模型到底由什么组成模型部署221 里一行from_pretrained就把模型用了起来但目录里那 11 个文件各司何职还不透明。本篇逐个拆开这 1GB 本质上是三样东西——一组怎么搭的声明、一堆是多少的权重、一张文字↔数字的词表。目录全景1GB 被分给谁缓存目录实测ls -lhconfig.json 659 B 架构与超参声明 generation_config.json 242 B 生成参数默认值 model.safetensors 943 MB 全部权重 tokenizer.json 6.8 MB 分词器可执行定义 vocab.json 2.7 MB 词表token → id merges.txt 1.6 MB BPE 合并规则 tokenizer_config.json 7.2 KB 特殊 token 配置 README.md / LICENSE / … 说明与许可目录共 11 个文件、约 954MB。除了 model.safetensors 占 943MB其余全是 KB/MB 级文本/JSON——权重是绝对大头这与参数 × 每参数字节 文件体积220 验算过一致。好处是除了那个二进制大文件其余都能直接打开人读调试时不必上专用工具。config.json一份怎么搭网络的图纸全文 659 字节展开后是几十个键值对关键字段实测值字段值含义architecturesQwen2ForCausalLM用哪个实现类搭网络model_typeqwen2架构族num_hidden_layers24Transformer 层数hidden_size896每层向量宽度num_attention_heads/num_key_value_heads14 / 2GQAKV 头远少于 Q 头省显存intermediate_size4864FFN 中间扩宽维度vocab_size151936词表大小max_position_embeddings32768最长支持 32K tokentorch_dtypebfloat16权重的存储精度tie_word_embeddingstrue输入/输出词嵌入共享一份{model_type:qwen2,num_hidden_layers:24,hidden_size:896,vocab_size:151936,torch_dtype:bfloat16}221 里from_pretrained加载只需 0.4s 的答案就在这模型代码是通用的读到这份图纸才现场决定搭 24 层、每层宽 896。换一个 config同样的代码就搭出另一个模型。把这些数字拼起来能画出数据流的骨架一个词查embed_tokens得到 896 维向量 → 依次流过24 层每层做自注意力 经 4864 宽度的 MLP→ 最后一层输出与词嵌入共享的lm_head比对词表得到下一个词的概率。前向路径的每一步都能在上文的张量清单里找到对应的那一坨参数。另外 config 里还记着transformers_version: 4.43.1模型用的库版本——实测在本机transformers 5.16.1下仍能正常加载说明新版本库对旧模型保持向后兼容这也是下载后直接 from_pretrained能成立的原因。model.safetensors943MB、290 个张量用 safetensors 打开这个单文件能看到 290 个命名的张量实测统计按家族归并总参数量 494,032,768 0.494 B model.embed_tokens.weight x1 136,134,656 # 151936 × 896 model.layers.n.input_layernorm x24 21,504 model.layers.n.self_attn.q/k/v/o… x24 注意力四投影 model.layers.n.mlp.gate/up/down_proj x24×3 104,595,456 # 每层各 ~104M model.norm.weight x1 896几个值得注意的规律名字即路径model.layers.5.mlp.gate_proj.weight表示第 5 层、MLP、gate 投影、权重——从张量名能反推出网络接线图词嵌入 136M 151936 × 896正好是每个 token 一个 896 维向量24 层的 MLP 三个投影每层各 ~1 亿参数加起来是大头——解码时最重的计算就发生在这里14 个 Q 头共享 2 个 KV 头GQA分组查询注意力多头注意力里只有少量 KV 投影生成长文本时省下大量 KV 缓存内存总参数0.494B与0.5B的命名吻合佐证 943MB ≈ 0.494B × 2 字节bf16清单里没有独立的 lm_headtie_word_embeddingstrue表示输出词表投影与输入词嵌入共享同一张embed_tokens 权重省下 136M 参数——这也是 222 前一张 config 表里那个布尔字段的直接体现。safetensors相对早年的.binpickle更安全不带可执行序列化、带校验和已是主流新格式。词表三件套文字怎么变成数字模型不认识汉字只认数字 id。这层翻译由三个文件完成文件角色vocab.json词表子词 token → id实测 151643 条基础词条加上特殊 token 补满 vocab_size 151936merges.txtBPE 合并规则首几行如Ġ Ġ、i n决定生词如何拆成子词tokenizer.json完整可执行的分词器定义含特殊 token、模板# vocab.json 形如 !: 0 \: 1 # merges.txt 形如空格表示词内部位置 Ġ Ġ ĠĠ ĠĠ i n221 那句 20 字中文被切成 35 个 token就是先经 merges/vocab 拆成子词、再映射成 id 序列|im_end|这类特殊符号则占 vocab_size 尾部的号段。词表是模型与文字世界之间的字典随模型一起发布、不能换用别的模型的。补两个实测细节tokenizer_config.json里eos_token为|im_end|对话结束符221 生成到它就停、pad_token为|endoftext|model_max_length131072是分词器侧声明的上限与 config.json 的max_position_embeddings32768并存——实际按哪个截断取决于运行时读取的配置。部署视角一句话目录整体就是模型把三块合起来看——config怎么搭 safetensors是多少 词表怎么读文字——一个开源模型的全部就在这个目录里。这也解释了部署的本质想部署这个模型本质是把这个目录搬到目标机器或放进 OSS 后由平台拉取再让目标机的 transformers 用 config 搭网、灌权重、配词表GPU 服务器/DLC/EAS 做的事情第一步永远是先把模型文件就位——与 220 在本机做的下载是同一件事只是机器换成了云端内存账也由此可算0.494B 参数按 bf162 字节/参需约 1GB 内存、按 fp324 字节/参约 2GB——0.5B 本机能跑换 7B 就约 14GBbf16只能上 GPU/分布式。三种视角就此对齐文档视角看 config.json 知道怎么搭数据视角看 290 个张量知道是多少语言视角看词表知道怎么读文字。目录理解透了部署只剩最后一道工序——让这台会说话的文件堆对外提供接口。下一篇把它从 Notebook 里搬出来包成一个能被 HTTP 调用的推理服务。一句话记忆一个开源模型目录 ≈ 1GB 三样东西config.json怎么搭qwen2、24 层、hidden 896、14/2 头、vocab 151936、bf16 model.safetensors是多少单文件 290 个张量、共 0.494B 参数、名字即网络接线 词表三件套文字↔数字字典vocab.json/merges.txt/tokenizer.json部署模型的本质就是把这三样图纸权重字典整体搬到目标机器让 transformers 照图重装。OK本篇先到这里如有疑问欢迎评论区留言讨论祝各位功力大涨技术更上一层楼更多内容见下篇 blog【AI】【模型部署】从 Notebook 到接口把模型包成 HTTP 推理服务