ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MLX-VLM 中的 IBM Granite 4.0 Vision:DeepStack 多层特征注入与 WindowQFormer 投影器解析

MLX-VLM 中的 IBM Granite 4.0 Vision:DeepStack 多层特征注入与 WindowQFormer 投影器解析 MLX-VLM 中的 IBM Granite 4.0 VisionDeepStack 多层特征注入与 WindowQFormer 投影器解析【免费下载链接】mlx-vlmMLX-VLM is a package for inference and fine-tuning of Vision Language Models (VLMs) on your Mac using MLX.项目地址: https://gitcode.com/GitHub_Trending/ml/mlx-vlmIBM 的 Granite 4.0 Vision 是一款约 3B 参数的开源视觉语言模型VLM其核心特点是采用 DeepStack 多层视觉特征注入机制与 WindowQFormer 投影器将 SigLIP 视觉编码器与 GraniteMoeHybrid 语言模型结合面向文档理解、VQA、图像描述、表格与图表分析等场景。本文以 mlx_vlm/models/granite4_vision/README.md 为主线结合该模型的 MLX 源码实现granite4_vision.py、config.py、downsampling.py 等完整讲解如何在 Mac 上通过 MLX-VLM 运行该模型并深入剖析其架构设计、关键配置项与底层实现原理帮助读者既能直接上手推理又能理解这一新颖的多层特征注入架构。模型速览Granite 4.0 Vision 由 IBM 发布模型标识为ibm-granite/granite-4.0-3b-vision在 MLX-VLM 中被封装为granite4_vision模型类型mlx_vlm/utils.py 中完成了granite4-vision/granite4_vision到该实现模块的映射。其核心规格如下项目说明Model IDibm-granite/granite-4.0-3b-vision架构GraniteMoeHybrid LM SigLIP视觉 WindowQFormer 投影器 DeepStack参数量约 3B视觉编码器SigLIP27 层hidden 1152384pxpatch 16投影器4 个 DeepStack 4 个 Spatial WindowQFormerDownsampler 模块任务文档理解、VQA、图像描述、表格/图表分析从 config.py 的默认配置可以进一步确认视觉与文本侧的细节视觉编码器VisionConfigmodel_typesiglip_vision_model27 层、hidden_size 1152、intermediate 4304、16 个注意力头、输入图像 384×384、patch 16、3 通道。语言模型TextConfigmodel_typegranitemoehybrid40 层、hidden_size 2560、intermediate 8192、40 个 Q 头 / 8 个 KV 头、词表 100353、最大位置 131072RoPE theta 为 1e7非传统模式并启用 MUPMaximal Update Parameterization风格乘子embedding_multiplier12.0、attention_multiplier0.015625、residual_multiplier0.22、logits_scaling10.0且tie_word_embeddingsTrue词嵌入与 lm_head 权重绑定。环境准备与模型加载MLX-VLM 的安装与通用方式一致确保 Python 环境满足 requirements.txt 与 pyproject.toml 中的依赖mlx、transformers、huggingface-hub 等。模型权重会在首次加载时自动从 Hugging Face Hub 下载并缓存。加载模型与处理器只需一行from mlx_vlm import load, generate model, processor load(ibm-granite/granite-4.0-3b-vision)处理器Granite4VisionProcessor定义在 processing_granite4_vision.py其from_pretrained会依次加载 AutoTokenizer、AutoImageProcessor并从processor_config.json与config.json中读取patch_size、vision_feature_select_strategy、downsample_rate等关键参数随后通过install_auto_processor_patch(granite4_vision, Granite4VisionProcessor)同文件末尾注册进自动处理器补丁使load能按模型类型自动选择正确的处理器。CLI 推理使用mlx_vlm.generate模块即可完成单图推理python -m mlx_vlm.generate \ --model ibm-granite/granite-4.0-3b-vision \ --image path/to/image.jpg \ --prompt Describe this image in detail.该命令入口位于 mlx_vlm/generate/cli.py。常用附加参数包括--max-tokens限制生成长度--temperature控制采样温度--quantize加载时量化模型权重以降低内存占用--vision-cache/--reuse-vision-cache配合 vision_cache.py 复用已计算的视觉特征多轮对话或多次运行时可显著提速。Python 推理接口在脚本中使用apply_chat_template构造对话式 prompt再调用generatefrom mlx_vlm import load, generate model, processor load(ibm-granite/granite-4.0-3b-vision) image path/to/image.jpg messages [ {role: user, content: [ {type: image}, {type: text, text: Describe this image.} ]} ] prompt processor.tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptTrue ) output generate(model, processor, imageimage, promptprompt, max_tokens512) print(output)处理器在__call__中会自动完成两件关键事情见 processing_granite4_vision.py通过 AutoImageProcessor 对图像做 AnyRes 切分与do_pad填充输出pixel_values与image_sizes依据downsample_rate默认4/8与图像长宽比将文本中的image占位符展开为实际的视觉 token 数量_get_number_of_features使嵌入拼接位置严格对齐。架构深度解析Granite 4.0 Vision 的整体结构可以概括为SigLIP 视觉编码器 4 路 DeepStack 层间投影 4 路空间采样投影 GraniteMoeHybrid 语言模型。以下逐层拆解。视觉编码器SigLIPVisionModel定义在 vision.py内部是标准的 SigLIP 视觉 TransformerVisionEmbeddingspatch embedding 用步长 16 的 Conv2d 将 384×384 图像切成 24×24576 个 patch叠加可学习的位置编码Encoder27 个EncoderLayer每个包含 LayerNorm→自注意力→残差、LayerNorm→MLP→残差注意力通过mx.fast.scaled_dot_product_attention实现末尾的SigLipMultiheadAttentionPoolingHead用单个 probe 做池化产出池化向量。前向时output_hidden_statesTrue会返回全部 27 层的中间状态这是 DeepStack 多层特征注入的数据来源granite4_vision.py。语言模型GraniteMoeHybrid 与 MUP 乘子LanguageModel定义在 language.py采用 GraniteMoeHybrid 结构共享 MLPSharedMLP当shared_intermediate_size非空时启用输入线性层直接输出2 * intermediate_size用mx.split拆出 gate 与 up再经 SiLU 门控融合fused gateup MLP与 README 中提到的特性一致残差乘子每个 TransformerBlock 在注意力与 MLP 残差上乘以residual_multiplier0.22嵌入乘子Granite.__call__中对嵌入乘以embedding_multiplier12.0logits 缩放lm_head 输出除以logits_scaling10.0language.py。注意力模块使用 GQA40 Q 头 / 8 KV 头RoPE 由initialize_rope依据rope_theta、max_position_embeddings等初始化。DeepStack多层视觉特征注入DeepStack 是 Granite 4.0 Vision 最核心的创新点不再像传统 VLM 那样只在输入层注入一次视觉特征而是把多层视觉特征分别注入语言模型的不同层。默认配置下的注入映射来自 README 与 config.py 的deepstack_layer_map/spatial_target_layers字段投影器视觉特征来源层注入的 LLM 层DeepStack ×4视觉层 [-19, -13, -7, -1]LLM 层 [9, 6, 3, 0]空间采样 ×4最后一个视觉层spatial_vision_layer-14 个 offset 组TL/TR/BL/BRLLM 层 [12, 15, 18, 21]负索引从视觉编码器最后一层向前数以上为 README 给出的模型默认映射。实现上Model.get_input_embeddingsgranite4_vision.py先运行一次视觉塔拿到全部隐藏状态然后对每个deepstack_layer_map条目取出对应视觉层特征过layerwise_projectorsWindowQFormerDownsampler投影对空间采样分支取spatial_vision_layer层的特征交给 4 个spatial_projectorsoffset 0~3处理所有投影结果通过_pack_and_unpad_image_features做 AnyRes 打包与去填充含image_newline行尾向量通过vision_mask定位文本中的imagetoken 位置用mx.cumsum构造特征索引映射将投影特征 scatter 到对应位置得到deepstack_visual_embeds把目标层列表挂到language_model.model._deepstack_target_layers。在语言模型前向时language.py每个 TransformerBlock 执行前检查当前层是否命中目标层命中则用mx.where(pos_mask[..., None], h features, h)把视觉特征加到该层的隐藏状态上实现逐层注入。注意这一注入只在 prefill含inputs_embeds阶段发生后续自回归 token 步不再重复注入。仓库测试 test_models.py 中的test_granite4_vision_chunked_prefill_aligns_deepstack专门验证了分块 prefill 场景下deepstack 特征与visual_pos_masks通过prefill_offset对齐的正确性。空间采样Spatial Offset Downsampler空间采样分支使用 stride-2 的SpatialOffsetDownsamplerdownsampling.py把特征网格重排成 2×2 块每个块只取一个角——offset 0/1/2/3 分别对应左上、右上、左下、右下——从而把特征分辨率降为 1/2。4 个不同 offset 的组合相当于从同一视觉层采样出 4 份互补的空间特征分别注入 LLM 的 [12, 15, 18, 21] 层增强模型对图像空间结构的利用。WindowQFormer 投影器所有投影器共享WindowQFormerDownsampler主模块downsampling.py其工作流程为窗口化把特征按downsample_rateq/w中的窗口边w切成不重叠的w×w窗口_win下采样InterpolateDownsamplerDeepStack 分支按面积插值把特征降到q/w比例SpatialOffsetDownsampler空间分支按 offset 采样QFormer 交叉注意力每个窗口内q×q个可学习 query 加上下采样后的特征作为 query 嵌入原始窗口特征加可学习位置嵌入作为 key/value送入 Blip2QFormerModelqformer.py单层自注意力→交叉注意力→FFN18 头、hidden 1152、intermediate 3072做窗口化交叉注意力反窗口化_unwin还原序列顺序最后经out_linear投影到 LLM hidden size 2560。窗口化的价值在于把 QFormer 的注意力限制在局部窗口内将复杂度从全局二次方降为局部可控同时保留空间对应关系。READ MEO 提到的 area interpolation downsampling (4/8 rate) 即指downsample_rate4/8query 边 4、窗口边 8即每个 8×8 窗口由 4×416 个 query 汇总。LoRA 适配器自动合并该模型发布时带有 LoRA 适配器r256alpha256。Model.sanitizegranite4_vision.py在加载权重时自动完成合并收集所有lora_A.weight/lora_B.weight剥离base_model.model.前缀得到目标权重 key由于alpha / r 256 / 256 1.0缩放系数恒为 1.0直接执行W W (B A)随后移除 LoRA 相关 key并把model.language_model.X统一重命名到language_model.model.X、lm_head.weight归位、缺失的 lm_head 用绑定的词嵌入补全。因此用户在load时无需手动处理适配器权重加载即完成合并。该流程同样覆盖文本侧LanguageModel.sanitize仅过滤掉 rotary 的inv_freq。关键配置项参考以下配置均定义在 config.py 的ModelConfig含默认值加载真实权重时会被config.json覆盖配置项默认值作用image_token_index100352文本中图像占位 token 的 ID用于定位注入位置vision_feature_select_strategyfull特征选择策略default时丢弃 CLS tokenselected[:, 1:]image_grid_pinpointsNoneAnyRes 网格候选分辨率列表处理器据此选择最优切分downsample_rate4/8WindowQFormer 的 query 边 / 窗口边同时用于 token 数计算与面积插值deepstack_layer_mapNoneDeepStack 注入映射[[视觉层, LLM层], ...]use_spatial_samplingTrue是否启用 4 路空间采样投影spatial_stride2空间采样步长spatial_vision_layer-1空间采样使用的视觉层-1 即最后一层spatial_target_layersNone空间特征注入的 LLM 层列表use_image_newline_parameterTrue是否为每行图像特征追加可学习的 newline 向量projector_hidden_act/projector_dropoutgelu/ 0.1投影器激活与 dropout默认配置保留其中deepstack_layer_map是 DeepStack 机制的核心开关置为None即关闭层间注入。spatial_target_layers与use_spatial_sampling共同控制 4 路空间采样分支。测试与验证仓库对 Granite 4.0 Vision 提供了多组自动化测试mlx_vlm/tests/test_models.pytest_granite4_visionL10068用小规模配置hidden 64、2 层等实例化完整模型验证语言模型前向正常test_granite4_vision_chunked_prefill_aligns_deepstackL10117验证分块 prefill 下 deepstack 特征与位置掩码的偏移对齐test_granite4_1_visionL10172验证 text_config 为纯granite非 hybrid时的兼容路径test_granite4_vision_input_embeddingsL13728直接验证get_input_embeddings的输入嵌入产出。此外test_vision_cache.py 也覆盖了该模型的视觉缓存路径说明其支持视觉特征缓存复用。小结Granite 4.0 Vision 是 IBM 在 VLM 架构上的一次创新实践DeepStack 把视觉特征分层注入语言模型的多个深度位置空间采样分支用 4 个 offset 组互补地保留空间细节WindowQFormer 则以窗口化交叉注意力高效完成特征压缩与投影LoRA 适配器在加载时自动合并。MLX-VLM 在 mlx_vlm/models/granite4_vision/ 下完整实现了上述机制读者既可通过 CLI 或 Python 接口在 Mac 上直接运行该模型完成文档理解、VQA、图表分析等任务也可深入get_input_embeddings与Granite.__call__的注入逻辑理解这种多层特征融合架构的工程实现细节。【免费下载链接】mlx-vlmMLX-VLM is a package for inference and fine-tuning of Vision Language Models (VLMs) on your Mac using MLX.项目地址: https://gitcode.com/GitHub_Trending/ml/mlx-vlm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表