尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

MLX-VLM 中的 Phi-4 Multimodal(phi4mm):文本 / 图像 / 音频三模态推理与量化实战

发布时间:2026/9/18 16:32:09

资讯中心
01
ARTICLE

MLX-VLM 中的 Phi-4 Multimodal(phi4mm):文本 / 图像 / 音频三模态推理与量化实战

MLX-VLM 中的 Phi-4 Multimodal(phi4mm):文本 / 图像 / 音频三模态推理与量化实战
MLX-VLM 中的 Phi-4 Multimodalphi4mm文本 / 图像 / 音频三模态推理与量化实战【免费下载链接】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本文基于 mlx-vlm 仓库中 phi4mm 模型文档 及其配套源码系统讲解 Phi-4 Multimodal 三模态架构文本 图像 音频在 Apple Silicon / MLX 上的加载、推理、LoRA 模态切换与量化流程。读完本文你将掌握通过mlx_vlm.generate命令行处理纯文本、图像、音频及「图像 音频」混合输入的方法理解set_modality()自动切换 Vision / Speech LoRA 的底层机制并能用mlx_vlm.convert产出 4-bit 量化模型。模型概述Phi-4 Multimodal 是一个三模态tri-modal模型同时支持文本、图像与音频理解。它在 MLX-VLM 中的实现位于 mlx_vlm/models/phi4mm/模块内部结构如下phi4mm.py顶层Model组装语言模型 视觉塔 音频编码器 双投影器与 LoRA 切换逻辑language.pyPhi-4 语言模型主干含 partial rotary、KV cachevision.pySigLIP-2 视觉编码器支持 NaFlex 变长 patchaudio.pyCascades Conformer 音频编码器与双分支音频投影processing_phi4mm.pyNaFlex 图像处理器 Mel 频谱音频特征提取器 统一 Processorconfig.py文本 / 视觉 / 音频三套配置 dataclass。原始 checkpoint 的远程 processor 代码已被移植到仓库内见 processing_phi4mm.py因此加载模型时--trust-remote-code变为可选参数而非必需。架构组成组件明细组件细节语言模型Phi-432 层hidden 307224 头8 个 KV 头视觉编码器SigLIP-227 层hidden 115216 头音频编码器Cascades Conformer24 个 blockdim 102416 头视觉投影器2 层 MLP1152 → 3072 → 3072GELU音频投影器2 层 MLP带 speech / vision 两种模式以上参数与 config.py 中的默认值一一对应TextConfig的max_position_embeddings131072VisionConfig的hidden_size1152、num_hidden_layers27、num_attention_heads16、patch_size14、image_size448ModelConfig的hidden_size3072、num_hidden_layers32、num_attention_heads24、num_key_value_heads8、vocab_size200064、mm_projector_typemlp2x_gelu。从源码看各子模块视觉塔SigLIP-2 NaFlexvision.py 中的VisionTower包装了SigLip2VisionModel通过select_layer -2选取倒数第二层 hidden states 作为图像特征NaFlex 路径会根据每张图的spatial_shapespatch 高度/宽度动态 resize 二维位置编码再去除 padding token返回每张图长度可变的特征列表。这一设计让小图不会被强行放大详见下文图像处理器。音频编码器Cascades Conformeraudio.py 中的ConformerEncoder完整复刻了 NeMo 风格的流水线MeanVarianceNormLayer全局均值/方差归一化NemoConvSubsampling卷积下采样time_reduction8深度可分离卷积AbsolutePositionalEncoding正弦绝对位置编码T5RelativeAttentionLogitBias非对称 T5 相对注意力偏置24 个ConformerEncoderLayer前馈 多头注意力 卷积模块每层遵循x 0.5*FFN_in; x Attn; x Conv; x 0.5*FFN_out的残差结构。对超过 500 帧的长序列编码器会自动按 chunk 展开计算再折叠回原长度max_seq_len 500分块逻辑见 audio.py。音频投影器双分支audio.py 中的AudioProjection包含speech与vision两个独立的AudioProjectionBranch每个分支都是Linear(audio_dim, hidden) → GELU → Linear(hidden, hidden)通过mode参数在运行时选择。视觉投影器build_mm_projector见 phi4mm.py结构与之一致均为「Linear GELU Linear」两层 MLP 且带 bias与 checkpoint 中img_projection.0 / .2的权重布局吻合。LoRA 模态切换机制双 LoRA 适配器原始 checkpoint 在 LLM 主干上自带两个 LoRA 适配器Vision LoRAr256alpha512——加载时默认合并进主干权重Speech LoRAr320alpha640——保留原始权重供运行时切换。在 phi4mm.py 的sanitize()中加载权重时会解析vision_lora/speech_lora配置按scale alpha / r计算合并系数Vision LoRA 被立即合并merged base_w vision_lora_scale * (lora_b lora_a)而 Speech LoRA 的 A/B 矩阵与 base 权重被存入模型实例_speech_lora_a、_speech_lora_b、_base_weights_active_lora默认置为vision。set_modality() 自动切换set_modality()会根据输入类型自动选择正确的 LoRA见 phi4mm.py输入类型目标 LoRA调用的方法仅文本无base 权重apply_base_weights()仅图像visionapply_vision_lora()仅音频speechapply_speech_lora()图像 音频两者同时apply_both_loras()切换采用「惰性」策略只有当目标模态与当前_active_lora不同时才真正改写 LLM 权重。该自动切换由 phi4mm.py 中的get_input_embeddings()触发——只要检测到pixel_values有图或input_audio_embeds有音频就会先调用set_modality()随后才把图像/音频特征与文本 embedding 在特殊 token 位置拼接。仓库测试 test_phi4mm_sanitize_lora_keys 验证了默认合并 Vision LoRA、Speech LoRA 保留待切换的行为。命令行推理使用前请确认已安装 mlx-vlm 及其依赖参考 安装文档 与 使用文档。纯文本理解mlx_vlm.generate \ --model microsoft/Phi-4-multimodal-instruct \ --prompt Explain the theory of relativity in simple terms. \ --max-tokens 256图像理解mlx_vlm.generate \ --model microsoft/Phi-4-multimodal-instruct \ --image /path/to/image.jpg \ --prompt Describe this image. \ --max-tokens 256音频理解mlx_vlm.generate \ --model microsoft/Phi-4-multimodal-instruct \ --audio /path/to/audio.wav \ --prompt \ --max-tokens 256多模态图像 音频mlx_vlm.generate \ --model microsoft/Phi-4-multimodal-instruct \ --image /path/to/image.jpg \ --audio /path/to/audio.wav \ --prompt \ --max-tokens 256音频输入约定为16 kHz 单声道波形处理器会自动完成重采样详见「处理器细节」一节--max-tokens可自行调整以控制生成长度。Python API 推理在脚本中按如下方式组合load、apply_chat_template与generatefrom mlx_vlm import load, generate from mlx_vlm.prompt_utils import apply_chat_template model, processor load(microsoft/Phi-4-multimodal-instruct) image [/path/to/image.jpg] audio [/path/to/audio.wav] prompt What animals are in the image? formatted_prompt apply_chat_template( processor, model.config, prompt, num_imageslen(image), num_audioslen(audio), ) result generate( modelmodel, processorprocessor, promptformatted_prompt, imageimage, audioaudio, max_tokens256, temperature0.0, ) print(result.text)几个关键点num_images/num_audios必须与实际传入的文件数量一致apply_chat_template会据此插入|image_1|/|audio_1|占位符相关实现见 prompt_utils.py 中apply_chat_template的num_audios参数流phi4mm 属于NUMBERED_IMAGE_TOKENS格式占位符随后由 processing_phi4mm.py 中的正则替换为内部 token|image_N|→imageIMAGE_TOKEN_INDEX -200|audio_N|→|endoftext11|AUDIO_TOKEN_INDEX 200011并在送入模型前按音频实际 token 数展开纯文本输入走常规 tokenization 分支无需占位符。处理器细节NaFlex 图像 Mel 音频Phi4MMProcessor 由三部分组成Phi4MMImageProcessorNaFlex 风格不做小图放大。图像先按 patch 大小默认 14计算实际 patch 数若低于min_num_patches默认 256或高于max_num_patches默认 3600才调整目标尺寸随后裁剪到 patch 对齐、归一化mean/std 均为 0.5、切 patch 并按max_num_patches补齐同时产出pixel_attention_mask与spatial_shapes。因此每张图的 patch 数可变这正是视觉塔需要按spatial_shapes动态 resize 位置编码的原因。Phi4MMAudioFeatureExtractor将任意采样率音频重采样到 16 kHz8 kHz 会先升采样经过预加重与 Hamming 窗分帧后用与 SpeechLib 一致的 80 维 Mel 滤波器组n_fft512fmax7690提取 log-Mel 频谱特征并按time_reduction8估算编码后的音频 token 数audio_embed_sizes。统一调度Phi4MMProcessor.__call__同时接受images、text、audios三个入口也兼容框架侧的audio单数参数最终返回input_ids、attention_mask、pixel_values、pixel_attention_mask、spatial_shapes、input_audio_embeds、audio_embed_sizes等字段组成的BatchFeature。量化mlx_vlm.convert \ --model microsoft/Phi-4-multimodal-instruct \ -q \ --mlx-path Phi-4-multimodal-instruct-4bit量化行为与 LoRA 机制密切相关源码层面的执行顺序如下预合并双 LoRA访问quant_predicate属性时见 phi4mm.py模型会先调用apply_both_loras()把 Vision 与 Speech 两套 LoRA 增量同时烘焙进 LLM 权重随后清空所有 LoRA 缓存_base_weights、_speech_lora_a/b、_vision_lora_a/b因为量化权重上无法再做 LoRA 切换。只量化语言模型quant_predicate返回的谓词对audio_encoder、audio_projection、mm_projector、vision_tower路径一律返回False跳过其余即 Phi-4 LLM 主干返回True参与量化。多模态模块保持 bfloat16视觉编码器、音频编码器、双投影器均以 bfloat16 精度保留。仓库测试 test_phi4mm_quant_predicate_skips_multimodal 与 test_phi4mm_quant_predicate_clears_lora 分别验证了「多模态子模块不被量化」与「访问 quant_predicate 会合并并清空 LoRA」这两条行为。因此量化完成后LoRA 切换被禁用两套适配器已烘焙进权重无需也不再可能切换推理时set_modality()会因_base_weights为空而直接跳过 LoRA 逻辑自动退化为纯权重推理见 phi4mm.py 的保护判断。注意事项音频输入约定输入为 16 kHz 单声道波形若提供其他采样率如 44.1 kHz处理器会利用scipy.signal.resample_poly自动重采样低于 8 kHz 的输入会直接报错见 processing_phi4mm.py。占位符处理|image_1|/|audio_1|这类带编号的占位符由apply_chat_template插入并在 Processor 内部转换为模型可识别的内部 token无需手动书写。长上下文TextConfig.max_position_embeddings131072且language.py中 Phi-4 注意力采用partial_rotary_factor0.75仅 75% 的头维度做 RoPE相关长上下文行为有专门测试覆盖见 test_phi4mm_longrope_uses_top_level_original_context_length。远程代码可选远程 processor 已移植进仓库并由install_auto_processor_patch注册到phi4mm模型类型见 processing_phi4mm.py因此--trust-remote-code非必需。小结Phi-4 Multimodal 在 mlx-vlm 中的实现覆盖了「三模态架构移植 双 LoRA 运行时切换 定制量化策略」三块核心工程SigLIP-2NaFlex 变长 patch负责视觉Cascades Conformer 负责音频set_modality()按输入模态自动装配最合适的 LoRA 权重mlx_vlm.convert -q则把双 LoRA 预合并后仅量化 LLM 主干。对需要在 Apple Silicon 上同时处理文本、图像与语音的开发者和研究者而言这是一个开箱即用的三模态推理与量化参考实现。【免费下载链接】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),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。