空天·智目 Zhimu-1.0 遥感多模态大模型学习总结
发布于
一、项目概况
Zhimu-1.0 是中科院 AIR-CAS 发布的遥感多模态大模型,以 Qwen3-VL-8B(约 9.3B 参数)为基座,新增约 673M 参数,支持四种遥感模态的图文理解与对话:
| 模态 | 通道数 | 数据特性 | | --- | --- | --- | | RGB | 3 | 自然彩色图像 | | SAR | 1 | 合成孔径雷达(单通道灰度,噪点回波成像) | | MSI | 12 | 多光谱(12 个波段) | | HSI | 218 | 高光谱(218 个连续波段) |
核心设计:共享骨干 + 模态专属插槽,让通用视觉语言模型”学会”遥感模态,而不破坏原有能力。
学习材料:
- 推理仓库:D:\zhimustudy\AIR-CAS-zhimu(test.py + 四模态示例)
- 模型代码:D:\zhimustudy\Zhimu-1.0-code(HF 下载,无权重)
- 微信推文:模型发布说明(含架构介绍)
二、学习路线(4 阶段)
- 阶段0 背景衔接:遥感数据模态、Qwen3-VL 基座、7 大基础概念
- 阶段1 test.py 精读:推理管线全流程
- 阶段2 模型源码精读:处理器、patch embedding、视觉编码器、视觉 MoE、DeepStack、M-RoPE、LLM 生成
- 阶段3 架构思想提炼 + 复现路径梳理 + 参数账清算
三、基础概念(原理级理解,非只知名词)
- Linear(线性层):y = W·x + b,对输入每个数字做加权求和。
- 深度学习的最小”积木”,所有投影本质都是它。
- 激活函数:给线性变换加非线性(线性叠加再多层还是线性)。
- SiLU(文本 FFN 用)、GELU(视觉用,tanh 近似版)。
- 没有激活,多层网络等价于一层,深层无意义。
- FFN(前馈网络):三明治结构 hidden → 放大 → 压缩。
- 视觉:1152 → 4304 → 1152(约 3.7 倍放大)
- 文本:4096 → 12288 → 4096(3 倍放大)
- 作用:每个 token 独立”深度加工”。
- 注意力(自注意力):
- 每个 token 生成 Q(查询)、K(键)、V(值)
- 注意力分数 = Q·K^T / √d,softmax 归一化后加权 V
- 作用:token 之间按相似度交换信息。
- 文本版:因果掩码,只能看自己和左边(逐字生成不许偷看未来)
- 视觉版:无掩码,看全图所有 token(图像一次给全)
- 多头注意力:一个头 = 一套 QKV + 一张注意力表。
- 单头只有一个”关注分布”,是折中答案;
- 多头(16/32 头)各管一摊(纹理、颜色、对称……),再汇总。
- 视觉:16 头 × 72 维;文本:32 头 × 128 维。
- GQA(分组查询注意力):
- 32 个 Q 头分成 8 组,每组 4 个 Q 头共用 1 份 K/V。
- Q = 问题(必须每头独立),K/V = 记忆内容(可共享)。
- 省 KV cache:2×32×128 → 2×8×128,4 倍省显存,序列越长越省。
- 视觉层无 GQA(图像一次性算完,不存 KV cache)。
- 残差连接:y = x + f(x),梯度恒有一条直路 dy/dx = 1,避免深层梯度消失。每层两次残差(注意力后、FFN 后)。
- LayerNorm / RMSNorm:按维度(不是按 token)归一化。
- LayerNorm:均值/方差归一 + 可学习 γ、β(每个维度一组)
- RMSNorm:只除方差,无 β,参数减半
- 视觉层用 LayerNorm,文本层用 RMSNorm。
- softmax:把任意分数变成 0~1 且和为 1 的概率分布,e^x 放大差异(大者更大)。注意力表的行归一。
- 反向传播:链式法则,从损失逐层回传梯度,用梯度下降(W ← W - lr·∂L/∂W)更新参数。
- Conv3d:三维卷积,当作”特征检测器”。
- 核 (2,16,16),stride = 核大小(不重叠)
- stride = 核时,数学上等价于共享 Linear(y = Wx + b 逐块)
- Embedding 表:151936 × 4096 ≈ 6.2B 参数(最大头之一)。
- 查表得词向量;字节级 BPE 分词(汉字被拆成字节片段)。
四、完整推理管线
输入图像数组 (C, 224, 224)
│
① 图像处理器(image_processing_qwen2_vl.py)
│ - 读通道数 C → 查表得模态:1→SAR, 3→RGB, 12→MSI, 218→HSI
│ - 归一化(3 套方案):
│ RGB:CLIP 均值/方差
│ SAR:固定 [0.39768119] / [0.25429859]
│ MSI/HSI:除以 65535(uint16 满量程,保留谱间物理关系)
│ - 时间折叠:单帧复制成 2 帧(卷积时间维为 2)
│ - 按 2×2 块序切块:flatten 成 (196, C×2×16×16)
▼
② patch embedding(模态专属 Conv3d,C→1152)
│ - 核 (2,16,16) stride=核 = 逐块共享线性变换
│ - 196 个 1152 维视觉 token(空间 50,176 像素 → 196 位置)
│ - 分支:RGB 走基础 proj;SAR/MSI/HSI 走 ch_1/ch_12/ch_218
▼
③ 视觉编码器 27 层
│ - 每层:LayerNorm → 注意力(16头×72,无掩码)→ 残差
│ → LayerNorm → FFN → 残差
│ - 偶数层(14 层):FFN 换成视觉 MoE(4 专家按模态选 1)
│ - 位置:可学习位置表(48×48,双线性插值)+
│ 2 维旋转编码(h,w 坐标)
│ - 层 8/16/24:DeepStack 快照出口
▼
④ merger(主 merger)
│ - 2×2 拼接:196×1152 → 49×4608(块序排好,零搬动)
│ - MLP 投影:4608→4608→4096(对齐 LLM 维度)
│ - DeepStack 快照同样式:每份 49×4096
▼
⑤ LLM 36 层
│ - 视觉 49×4096 + 文本 token 拼接
│ - 3 维 M-RoPE(t,h,w 位置,mrope_section [24,20,20])
│ - DeepStack:前 3 层对视觉 token 位置做残差注入
│ - 每层:RMSNorm → 注意力(32头×128,GQA 8 组,因果)→ 残差
│ → RMSNorm → FFN(SiLU,4096→12288→4096)→ 残差
▼
⑥ 输出:最后 token hidden → lm_head(4096→151936)
→ softmax → 贪心(do_sample=False)→ 自回归生成下一字
五、Zhimu 的三个核心改动(相对 Qwen3-VL)
- 模态专属 patch embedding 分支
- 1/12/218 通道各一个 Conv3d(C→1152),RGB 复用基础分支
- 入口处按模态”分道”,之后全部共享
- 视觉 MoE(偶数层 FFN 替换)
- 4 个专家 FFN(1152→4304→1152),expert_0 = 原装(RGB 用)
- 无 router:num_channels → 查表 → 专家编号(确定性路由) rgb→0, sar→1, hsi→2, msi→3
- warm-start:专家 1/2/3 从 expert_0 权重复制起步 (_load_from_state_dict 自动处理,旧权重无专家时自动复制)
- dummy forward:未激活专家用零输入过一遍乘 0 加回, 保证训练图连通(删了这段,新模态专家永远不更新!)
- DeepStack 早期融合
- 层 8/16/24 各抄一份快照 → merger 压成 49×4096
- 注入 LLM 前 3 层,只加在视觉 token 位置
- 让 LLM 浅层直接接触中层视觉特征(信息抄近道)
六、架构设计思想(6 条可复用范式)
- ① 共享骨干 + 轻量插槽:个性在底层(入口/FFN),共性在高层,主干不动,只加插槽——不破坏通用能力,增量扩展模态。
- ② 确定性路由代替学习路由:模态是先验(通道数自带),能用数据元信息解决的决策就不要用模型学(省 router 训练)。
- ③ Warm-start 专家:从共享权重复制起步,训练稳、收敛快。
- ④ Dummy forward:让未激活模块保持训练连通(复现必留)。
- ⑤ DeepStack 早期融合:信息通路可绕过中间步骤直达下游。
- ⑥ 输入输出两端对齐:入口统一 196×1152,出口统一 49×4096,中间随意多模态,两端必须一致(“即插即用”的关键)。
对比其他路线:
- 从零训遥感模型:数据/算力巨大,遥感数据规模撑不起
- 直接微调通用 VLM:可能灾难性遗忘,每模态污染共享参数
- Zhimu 路线:保留通用能力 + 每模态独立插槽 + 增删互不影响
七、参数账(最终结论)
| 新增模块 | 参数量 | | --- | --- | | SAR 分支 (ch_1) | 0.59M | | MSI 分支 (ch_12) | 7.08M | | HSI 分支 (ch_218) | 128.6M | | MoE 专家 (14层×3个) | 416.7M ← 最大头(62%) | | DeepStack merger (3个) | 120.4M | | 合计 | ≈ 673M ≈ 9.3B 的 7.2% |
文章声称”约 3%“,实测不符——口径差异:只算分支+deepstack(256M)≈ 2.8% ≈ 3%;把 warm-start 专家也算进去则 5.9%~7.2%。对复现的意义:新增大头在专家,只加 1-2 个新模态可以更省。
八、复现/微调准备清单
算力:
- 推理:9.3B bf16 ≈ 19GB 显存(≥24GB 卡,或 4bit 量化 ≈ 5GB)
- 微调:现实方案 = 插槽全参(673M)+ 主干 LoRA → 24GB 单卡可起步
- 本地仅 CPU:只能代码级验证,真训练需云 GPU(按小时租)
框架: transformers 4.57 + PyTorch + accelerate(bf16)+ 可选 deepspeed/peft
数据(最花时间):
- 四模态图像 + 文本指令对(“这片区域有什么?”)
- 公开遥感指令数据做起点 + 自建 MSI/HSI 部分
- 起步每模态几千条指令
训练步骤(两阶段):
- 下载官方 Zhimu-1.0 权重(含专家权重)或 Qwen3-VL-8B 权重(自动 warm-start)
- 阶段一:冻结 LLM+视觉主干,只训插槽(分支+专家+merger)
- 阶段二:LoRA 微调 LLM,插槽继续训
- 评估:各模态验证集 + 通用能力回测(防遗忘)
复现必留的细节(坑):
- dummy-forward 不能删(否则未激活专家无梯度不更新)
- num_channels 必须从 processor 一路传到模型
- 一个 batch 内所有图的 num_channels 必须相同(否则报错)
- 新增模态需同时改 multi_channel_config 等 config 键
九、环境与工具坑记录
- Windows 中文路径坑(已部分消除):huggingface_hub 的 filelock 无法处理含中文路径;pip / import torch 从中文路径也会失败 → 2026-08-27 项目文件夹已改名 D:\zhimustudy(纯 ASCII),本机从此无此坑;云端路径天然无此问题。
- pip 用清华源提速:
--index-url https://pypi.tuna.tsinghua.edu.cn/simple;npm/npx 用 npmmirror:npm_config_registry=https://registry.npmmirror.com - 本机 GPU/torch 复检(2026-08-27,更正早期误判):
- 有独显:RTX 4050 Laptop 6GB(驱动 610.47)
- conda env
pytorch(py3.8.20 + torch 1.10.1 + CUDA)可用,识别 4050,GPU matmul/cuDNN 实测通过(用户 CNN 学习环境) - 但 torch 1.10.1 太老(2021),跑不了 transformers 4.57 / Qwen3-VL(需 torch ≥ 2.1);bf16 权重 18.6GB >> 6GB 显存
- base(py3.13) torch 仍损坏;udaln/hygas 为旧版 DLL 加载失败;py39 无 torch;系统内存 15.2GB,共享显存 7.6GB 杯水车薪
- 本地 4bit(~4.7GB)理论可试(见部署清单方案二),慢
- DeepSeek Harness(dsh v0.1.0-rc.6) 已全局安装,桌面有启动 .bat(注意 .bat 含中文必须 GBK 编码)。
- 云端部署清单已写好:D:\zhimustudy\云端部署清单.txt(租卡规格、四模态完整命令、数据格式、常见报错速查)
十、当前掌握程度与后续
已掌握:
- 完整推理管线(输入到输出每一步的数学与代码位置)
- 注意力/多头/GQA/残差/归一化/卷积/embedding/M-RoPE/DeepStack/视觉MoE 的原理级理解
- 训练机制推演(dummy-forward、warm-start、按模态分批、两阶段配方、数据来源)——2026-08-15 补充
- 共享骨干+插槽范式的可复用思想 + 可落地的复现计划
后续行动:
- 云端租卡跑通 test.py 四模态演示(清单见 D:\zhimustudy\云端部署清单.txt)
- (可选)本机新建 py3.11 环境试 4bit 量化(方案二,实验性)
- 复现规划:模板化生成四模态指令数据、插槽全参 + LLM LoRA
补充一、2026-08-15+08-27 专题:模型怎么训练、数据从哪来
一、代码暴露的训练设计
- dummy forward(训练专用):推理时加都是加 0,纯垃圾操作;它是训练期”图连接保险”——未激活的专家/分支用零输入过一遍、乘 0 加回,意义是让所有插槽参与计算图,避免分布式训练框架跳过未使用参数(DDP/FSDP 要求全参梯度同步)。复现时不能删。
- 确定性路由 + batch 单模态:_normalize_num_channels 强制一个 batch 内通道数一致(不一致直接报错)→ 训练必须按模态分批,每个插槽只被自己模态的数据更新。
- warm-start:_load_from_state_dict 在加载的权重没有专家参数时自动把基础 FFN 权重复制给专家 1/2/3 → 说明从 Qwen3-VL-8B 权重起步训练。专家可复制(FFN 形状相同),分支不可(输入通道 1/12/218 vs 3,形状不同)→ 分支随机初始化起步。
二、训练配方(标准 VLM 两阶段,官方未公开,属推演)
- 阶段1 模态对齐:冻结 LLM + 共享视觉骨干,只训插槽(分支 + 专家 + merger,约 673M);数据 = 图像-文本对;目标 = 让新模态的 token 能被 LLM 读懂(眼睛学会说话)
- 阶段2 指令微调:放开 LLM(全参/LoRA)+ 插槽继续训;数据 = 五类任务指令对(视觉问答、图像描述、场景分类、目标检测、目标定位——推文明确提到)
- 好处:任务层(五类解译)四模态共用——共享 LLM 负责”答题”,插槽只负责”输入翻译”,所以不必每模态各造一套任务数据。
三、数据从哪来(官方未公布,这是通用来源)
- 对齐数据:公开遥感数据集 + 模板化成描述
- RGB:EuroSAT / RESISC45(类别标签即描述)/ RSICD(带描述)
- MSI:BigEarthNet(Sentinel-2 12 波段 + 地物标签)
- HSI:Indian Pines / Salinas / Pavia / Houston 等分类数据集
- SAR:公开带文字标注的少,需自建(Sensor-1 + 目标标注)
- SFT 数据:标注→指令模板(检测框→“输出 JSON 框列表”、标签→“选类别四选一”),模板工程为主
- 量级参考:对齐几万~几十万对起步(增量加模态),SFT 几万指令对
补充二、2026-08-27 答疑录:概念辨析 + 显存计算
1. embedding vs encoder
- embedding = 一对一”翻译”:一个元素(块/字)独立变成向量,元素之间互不通信(patch embed 的卷积、文本查表都是)
- encoder = 上下文”加工”:序列整体过一遍,每个输出都携带了序列中其它成员的信息(靠注意力互相通信)
- 一句话记忆:embedding 不通信,encoder 通信
2. 视觉 27 层 vs 文本 36 层
结构相同(Norm→注意力→残差→Norm→FFN→残差),差异在配置与职责:
- 掩码:视觉无(看全图)/ 文本因果(只看左边)
- 注意力:视觉 16 头×72 无 GQA / 文本 32 头×128 GQA 8 组
- 位置编码:视觉可学习表+2维旋转 / 文本 3 维 M-RoPE
- 归一化:视觉 LayerNorm / 文本 RMSNorm;激活:GELU / SiLU
- 职责:视觉=读图(一次性扫描,特征提取器)/ 文本=写文章(自回归生成,逐字预测)
3. 多头 vs 单头
一个头 = 一套 QKV + 一张注意力表;单头只有一个”关注分布”(折中答案),多头 16/32 个头各关注一类特性再汇总。
4. GQA 为什么能共享 KV
- Q=问题(每头独立,决定”关注哪”);K/V=记忆内容(可共享)
- 共用 1 份 K/V,4 个 Q 头带不同问题各看各的 → 省 4 倍 KV cache
- 视觉层无 GQA:图像一次性算完不存 KV cache,没必要省
5. 可学习位置编码拆解
- 表:nn.Embedding(2304, 1152) = 48×48 个位置 × 1152 维 ≈ 2.65M
- 使用:14×14 token 坐标映射到 48×48 网格,双线性插值取 4 邻加权 → 适配任意分辨率;按 2×2 块序重排与 processor 切块顺序对齐 → 直接逐元素加到 token 上(维度不变)
- 分工:可学习表 = 绝对位置”我在哪”(进塔前加);旋转编码 = 相对位置”离多远”(进注意力时转 Q/K);视觉两者都用,文本只用相对
6. 主 merger(MLP Project)——纠正维度记忆错误
- 是上图注意力的输出端”MLP Project”= 主 merger,本质是个 FFN
- 正确维度:拼接后 4608(=4×1152)→ 4608 → 4096(不是 1152→4096→1152;那是视觉 FFN 的维度,记串了)
- 三个目的:
- 对齐 LLM 的 4096 维(与文本 token 同维才能拼接)
- 学习融合 2×2 的 4 个子 token(拼接保留信息,MLP 学融合)
- 配合 2×2 合并 196→49,LLM 注意力省 4 倍计算
7. 显存计算(推理 vs 训练)
- 推理 ≈ 2B/参数(bf16):9.3B × 2B ≈ 18.6GB(实测文章 17.6GB,推荐 24GB 卡=留余量)
- 训练 ≈ 18B/参数(混合精度 AdamW):权重 2B + fp32 主权重 4B + 梯度 4B + 优化器 8B(m+v)
- 全参微调 9.3B ≈ 170GB+ → 8×A100;只训插槽 673M(冻结其余)≈ 30GB+(冻结权重 17.3GB 常驻省不掉);LoRA ≈ 25GB(24GB 卡紧)
- 省激活技术:梯度检查点(只存分段中间值,反传时重算,用计算换显存,省 70-80% 激活显存)
- 自检题答案记录:① embedding 不通信/encoder 通信;② 只训插槽带的是完整 9.3B 前向路径,冻结部分 2B/参数常驻;③ 梯度检查点