拆解p-MoD-LLaVA-v1.5-7B模型权重:734个张量与safetensors分片结构逐个讲
- 人工智能
- 大模型
- 多模态
【免费下载链接】p-MoD-LLaVA-v1.5-7B
p-MoD-LLaVA-v1.5-7B 是一个采用 Mixture-of-Depths(MoD,深度混合)架构的多模态大语言模型官方权重包。本文将带你逐个拆解它的 734 个张量、3 个 safetensors 分片以及索引文件model.safetensors.index.json的结构,帮助新手快速看懂"一个多模态模型权重包到底装了什么"。
📦 仓库文件一览:权重包由哪些文件组成
这个仓库是一个"纯模型权重包",没有训练代码,文件分工非常清晰:
| 文件 | 作用 |
|---|---|
| model-00001-of-00003.safetensors | 权重分片 1:词嵌入 + LLM 前 12 层 |
| model-00002-of-00003.safetensors | 权重分片 2:LLM 中间层 |
| model-00003-of-00003.safetensors | 权重分片 3:LLM 后段 + 视觉塔 + 投影层 |
| model.safetensors.index.json | 分片索引:734 个张量 → 分片文件的映射表 |
| config.json | 模型结构配置,含全部 MoD 专属参数 |
| tokenizer.model / tokenizer_config.json | 分词器本体与配置(SentencePiece 格式) |
| generation_config.json | 默认生成参数(temperature 0.9、top_p 0.6 等) |
| README.md | 模型说明:基于 Vicuna-7B-v1.5 + CLIP ViT-L/14@336 |
🗺️ 总览:734 个张量的完整分类
对weight_map逐一归类后,734 个张量正好可以拆成 6 大块,一个不多一个不少:
| 权重区块 | 张量数 | 说明 |
|---|---|---|
词嵌入model.embed_tokens.weight | 1 | 词表大小 32000 |
| LLM 普通解码层(第 0~7 层) | 72 | 8 层 × 9 个张量 |
| LLM MoD 解码层(第 8~31 层) | 264 | 24 层 × 9 个张量 + 48 个 router 张量 |
| 视觉塔(CLIP ViT) | 391 | 24 层 × 16 个张量 + 3 个嵌入 + 4 个 LayerNorm |
多模态投影model.mm_projector | 4 | 两层 MLP(mlp2x_gelu)的 weight + bias |
输出头:lm_head.weight+model.norm.weight | 2 | 语言模型输出投影 + 最终归一化 |
| 合计 | 734 | 总参数量约 13.16 GiB(bfloat16) |
其中metadata.total_size记录的总字节数为14,126,002,224(约 14.1 GB),见 model.safetensors.index.json。
🔍 索引文件 model.safetensors.index.json 结构讲解
多分片模型的核心在于这份索引 JSON,它只有两部分(见 model.safetensors.index.json):
{ "metadata": { "total_size": 14126002224 }, "weight_map": { "lm_head.weight": "model-00003-of-00003.safetensors", "model.embed_tokens.weight": "model-00001-of-00003.safetensors" } }metadata.total_size:所有张量字节数总和,可用于下载完整性校验;weight_map:以"张量全名"为键、"所在分片文件名"为值,共 734 条映射。加载器就是靠它决定每个张量该去哪个分片文件里读取。
🧩 三大权重区逐个拆解
1️⃣ LLM 主干:32 层,前 8 层"普通"、后 24 层"MoD"
这是本模型最有特色的地方。从张量命名就能直接看出来:
普通层(第 0~7 层),每层 9 个张量,是标准 LLaMA 结构:
model.layers.0.input_layernorm.weight model.layers.0.self_attn.q_proj.weight # Q/K/V/O 四个投影 model.layers.0.self_attn.k_proj.weight model.layers.0.self_attn.v_proj.weight model.layers.0.self_attn.o_proj.weight model.layers.0.mlp.gate_proj.weight # SwiGLU 的 gate/up/down model.layers.0.mlp.up_proj.weight model.layers.0.mlp.down_proj.weight model.layers.0.post_attention_layernorm.weightMoD 层(第 8~31 层),计算部分被包在decoder_layer子模块里,并且每层多出 2 个 router 张量(如 model.safetensors.index.json):
model.layers.10.decoder_layer.self_attn.q_proj.weight # 共 9 个,与普通层相同 model.layers.10.router.router.weight # MoD 路由器:决定视觉 token 是否跳过本层 model.layers.10.router.router.bias也就是说,24 个 MoD 层 = 24 × 11 =264 个张量,其中 48 个就是 router 的权重和偏置。这正是 p-MoD 论文里"渐进式比例衰减"(Progressive Ratio Decay)的落点:越深的层,路由给视觉 token 的比例越低,从而把算力集中到文本 token 上。
2️⃣ 视觉塔:完整嵌入 CLIP,391 个张量
张量名前缀model.vision_tower.vision_tower.vision_model很长,但结构很规整:
- 24 个编码器层(
encoder.layers.0~23),每层 16 个张量:注意力 4 组投影(Q/K/V/out,各含 weight + bias)、MLP 2 个全连接(fc1/fc2,各含 weight + bias)、2 个 LayerNorm(layer_norm1/2,各含 weight + bias); - 3 个嵌入张量:
patch_embedding.weight(图像切块投影)、position_embedding.weight、class_embedding; - 4 个归一化张量:
pre_layernorm与post_layernorm的 weight + bias。
对应 config.json 中的mm_vision_tower为openai/clip-vit-large-patch14-336,且 config.json 中unfreeze_mm_vision_tower: true说明视觉塔在训练中被联合微调过。
3️⃣ 多模态投影层:只有 4 个张量
model.mm_projector是一个两层 MLP(config.json 中mm_projector_type: mlp2x_gelu),负责把 CLIP 输出的 1024 维视觉特征映射到 4096 维的 LLM 隐空间,全部家当就是:
model.mm_projector.0.weight / model.mm_projector.0.bias # 第 1 层 model.mm_projector.2.weight / model.mm_projector.2.bias # 第 2 层📐 三个 safetensors 分片各自装了什么
按weight_map统计,三个分片的张量分布如下:
| 分片 | 张量数 | 主要内容 |
|---|---|---|
| model-00001-of-00003.safetensors | 111 | 词嵌入 + LLM 第 0~11 层 |
| model-00002-of-00003.safetensors | 133 | LLM 第 11~23 层 |
| model-00003-of-00003.safetensors | 490 | LLM 第 23~31 层 + 全部 391 个视觉塔张量 + 投影层 +lm_head+ 最终 norm |
两个值得注意的细节:
- 第 11 层和第 23 层是"跨片"的——同一个层的不同张量被拆到了相邻两个分片里(例如第 11 层的
k_proj在分片 1,down_proj却在分片 2)。这说明分片是按"文件大小顺序"切的,而不是按层对齐的。 - 分片 3 最大,因为视觉塔(CLIP ViT-L 约 3.5 亿参数)+ 投影层 + 输出头都放在了一起。
⚙️ 从 config.json 读懂 MoD 关键参数
MoD 的全部"超开关"都写在 config.json 里:
| 参数 | 值 | 含义 |
|---|---|---|
| mod_target_layers | shiftedcos_decay_0.85_0.15 | 路由比例随深度按余弦曲线从 0.85 衰减到 0.15,即"渐进式比例衰减" |
| mod_target_layer_indices | [8, 9, ..., 31] | 只有第 8~31 层启用 MoD 路由,共 24 层 |
| mod_target_token_type | vision_all | 路由决策只针对视觉 token |
| mod_weight_norm | tanh_0.2_1 | 跳过层的输出用 tanh 归一化(缩放范围 0.2~1) |
| mod_router_factor | 0.5 | 路由器打分系数 |
| mod_bias_enabled / mod_special_init | true/true | 启用 router bias,并做特殊初始化 |
其余是标准 7B 配置:hidden_size 4096、num_hidden_layers 32、num_attention_heads 32、vocab_size 32000,精度为 bfloat16,架构名为 PmodLlavaLlamaForCausalLM。
💡 新手上手:下载、校验与加载
- 下载:
git clone https://gitcode.com/MCG-NJU/p-MoD-LLaVA-v1.5-7B(约 14.1 GB),或从模型平台直接下载同名权重文件; - 校验:加载完成后,总字节数应等于
metadata.total_size(14,126,002,224),张量总数应为 734,缺一个都说明文件不完整; - 加载:用
transformers的from_pretrained指向模型目录即可,加载器会自动读取 model.safetensors.index.json 并按weight_map分片取数,无需手动合并分片; - 生成参数:默认 generation_config.json 已给出 temperature 0.9、top_p 0.6、max_length 4096,推理时可直接沿用。
📌 总结:一张表记住 734 个张量
| 区块 | 张量数 | 记住一句话 |
|---|---|---|
| 词嵌入 / 输出头 / 最终 norm | 3 | 一进一出加一次收尾 |
| LLM 普通层 0~7 | 72 | 标准 LLaMA 结构,每层 9 张量 |
| LLM MoD 层 8~31 | 264 | 每层多 2 个 router 张量,共 48 个 |
| CLIP 视觉塔 | 391 | 24 层 × 16 + 嵌入与归一化 |
| 多模态投影 | 4 | 两层小 MLP |
看懂了这个"目录结构",你再去拆解任何多分片 safetensors 模型包,都只需三步:读config.json看架构 → 读model.safetensors.index.json数张量 → 按前缀分区理解职责。
- 人工智能
- 大模型
- 多模态
【免费下载链接】p-MoD-LLaVA-v1.5-7B
相关推荐
深度拆解p-MoD-LLaVA-v1.5-7B架构:32层Transformer+24个Router如何让模型学会"跳层"
深度拆解p MoD LLaVA v1.5 7B架构:32层Transformer+24个Router如何让模型学会"跳层" p MoD LLaVA v1.5 7
人工智能大模型多模态PIIP-LLaVA模型文件全解析:6个safetensors分片与27GB权重结构速查
PIIP LLaVA模型文件全解析:6个safetensors分片与27GB权重结构速查 PIIP LLaVA_ConvNeXt B_CLIP L_1024 3
config.json逐行解读:p-MoD-LLaVA-v1.5-7B控制深度混合策略的7个关键参数
config.json逐行解读:p MoD LLaVA v1.5 7B控制深度混合策略的7个关键参数 p MoD LLaVA v1.5 7B 是一个基于深度混合
人工智能大模型多模态
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考