代码级拆解:mlx-community/LFM2.5-8B-A1B-MLX-8bit短卷积+分组注意力混合架构的独特之处
【免费下载链接】LFM2.5-8B-A1B-MLX-8bit项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/LFM2.5-8B-A1B-MLX-8bit
mlx-community/LFM2.5-8B-A1B-MLX-8bit 是 Liquid AI 推出的 LFM2.5 大模型在 MLX 生态下的 8bit 量化版本,它最特别的地方在于采用了短卷积 + 分组注意力混合架构:24 层网络中竟有 18 层是"短卷积"算子、仅 6 层是 GQA 分组注意力,配合 32 专家 top-4 的稀疏 MoE,做到了 8.3B 总参数、仅 1.5B 激活参数,并支持 128K 超长上下文。今天我们就翻开它的 config.json 和 model.safetensors.index.json,从代码和权重层面一层层拆开这套独特架构。
一张表看懂:24 层混合架构的排列规律
打开 config.json,layer_types数组直接写明了每一层的算子类型,这是最直观的"代码级"证据:
"layer_types": ["conv", "conv", "full_attention", "conv", "conv", "conv", "full_attention", "conv", "conv", "conv", "full_attention", "conv", "conv", "conv", "full_attention", "conv", "conv", "conv", "full_attention", "conv", "conv", "full_attention", "conv", "conv"]我用脚本统计后的结果是:
| 项目 | 数量 | 分布位置 |
|---|---|---|
| 短卷积层(conv) | 18 层 | 第 0、1、3、4、5、7、8、9、11、12、13、15、16、17、19、20、22、23 层 |
| 分组注意力层(full_attention) | 6 层 | 第 2、6、10、14、18、21 层 |
规律非常清晰:大约每 4 层就插入 1 层全局注意力,其余全部用卷积。这与主流"注意力为主、偶插卷积"的混合模型思路完全相反,卷积在这里不是配角,而是绝对主力。这种排列的目的很直接:注意力负责全局信息建模,卷积负责高效的局部特征提取,两者各司其职。
从权重命名看双门控短卷积:in_proj → conv → out_proj 三段式
在 model.safetensors.index.json 的权重映射里,每个卷积层都挂了 3 组权重,例如第 12 层:
model.layers.12.conv.conv.weight—— 一维卷积核本体model.layers.12.conv.in_proj.weight—— 输入投影model.layers.12.conv.out_proj.weight—— 输出投影
这就是 README 中 "double-gated short-conv(双门控短卷积)" 的代码来源。它的结构可以理解为:输入先经过in_proj做一次带门控的投影变换,送入一维卷积提取局部特征,再经out_proj投影回模型维度。相比普通 Transformer 里"QKV 三件套"式的注意力,这套卷积算子把门控、局部卷积、残差投影封装在一起,既能捕捉局部依赖,又几乎没有长序列的内存开销。
conv_L_cache=3:短卷积为什么"短"?省内存的秘密
config.json 中有一个容易被忽略但极其关键的参数:
"conv_L_cache": 3L代表卷积核的感受野长度,这里是 3,即卷积每次只"看"最近的 3 个 token。这就是"短卷积"中"短"字的由来。
这个参数带来的收益是巨大的:
- 注意力层的 KV 缓存随序列长度线性增长,128K 上下文时缓存开销十分可观;
- 而卷积层只需要缓存最近 3 步的状态,无论上下文多长,缓存占用几乎恒定;
- 18 层卷积把整体推理时的缓存需求压到了极低水平,配合 MLX 的 Apple Silicon 加速,长文本对话、代码补全场景下内存表现非常友好。
可以说,conv_L_cache=3是这套架构能在低资源设备上跑 128K 长上下文的底层保障之一。
6 层 GQA 分组注意力:32 个头共享 8 个 KV 头
在注意力层上,LFM2.5 选择了标准的 GQA(Grouped Query Attention)设计,相关配置如下:
| 参数 | 值 | 含义 |
|---|---|---|
| num_attention_heads | 32 | 32 个查询头(Q) |
| num_key_value_heads | 8 | 8 个键值头(KV) |
| rope_theta | 5000000 | RoPE 旋转基频 500 万,支撑长上下文 |
| max_position_embeddings | 128000 | 128K 上下文窗口 |
每 4 个 Q 头共享 1 组 KV 头,KV 缓存直接缩减为原来的 1/4。同时权重表中还能看到self_attn.q_layernorm和self_attn.k_layernorm,说明模型在 Q 和 K 投影后还各做了一次归一化(QK-Norm),这是稳定长上下文训练的经典技巧。128K 上下文 + 5M 的 RoPE 基频 + QK-Norm,三者共同保证了注意力层在超长输入下依然稳定。
每层都有 MoE:32 专家 top-4,8.3B 参数只激活 1.5B
混合架构之外,另一个杀手锏是稀疏专家系统。注意一个容易忽略的细节:24 层中每一层都带有 feed_forward 模块,也就是说 FFN 与算子层是解耦的,卷积层和注意力层后面都各自挂着一份 FFN。权重表里,从第 2 层开始每层都出现了三组 MoE 专属权重:
feed_forward.gate—— 路由门控,负责把 token 分给哪些专家;feed_forward.switch_mlp.gate_proj / up_proj / down_proj—— 专家内部的前馈网络;feed_forward.expert_bias—— 专家偏好偏置,配合use_expert_bias: true引导路由。
对应的超参数为:
| 参数 | 值 | 含义 |
|---|---|---|
| num_experts | 32 | 共 32 个专家 |
| num_experts_per_tok | 4 | 每个 token 只激活 top-4 专家 |
| moe_intermediate_size | 1792 | 单个专家的中间维度 |
| norm_topk_prob | true | 对 top-k 路由概率做归一化 |
每生成一个 token,模型只在 32 个专家中挑选 4 个干活,因此虽然总参数量高达 8.3B(实测 84.7 亿参数,见 model.safetensors.index.json 的total_parameters字段),实际激活参数只有约 1.5B,兼顾了容量与速度。
8bit 量化配置:MLX 版本在 Apple Silicon 上的加速密码
作为 MLX 生态的镜像版本,本仓库最大的落地价值在于量化。config.json 中的quantization_config表明:
- 位宽 8bit,模式为
affine(仿射量化); - 分组大小 group_size = 64,即每 64 个权重共享一组缩放参数,精度损失小;
- 量化范围覆盖所有层的
feed_forward.gate门控权重以及各线性投影。
8bit 量化后,全部权重(含 embedding 的 biases/scales)合计约 8.4GB(model.safetensors.index.json 的total_size字段),相比 16bit 版本直接减半。对 8GB 起步的 Apple Silicon 设备来说,这意味着可以真正本地跑起一个 8B 级、128K 上下文的稀疏 MoE 模型,这在半年前几乎不可想象。
组合起来有多独特?三张王牌缺一不可
把上面的细节汇总,这套架构的独特性可以概括为三个"反常识":
| 维度 | 主流做法 | LFM2.5-8B-A1B 的做法 |
|---|---|---|
| 算力主力 | 注意力为主 | 18/24 层是短卷积,注意力只占 1/4 |
| 长上下文 | 堆 KV 缓存 | 卷积缓存固定 3 步,注意力 KV 仅 1/4 |
| 模型容量 | 全量激活 | 8.3B 参数只激活 1.5B |
短卷积解决局部建模与缓存开销,GQA 注意力补足全局推理能力,MoE 在有限算力下放大模型容量——三者各守一摊、互相补位,这正是 LFM2.5 被评价为"高效混合架构代表作"的根本原因。
快速上手:如何本地跑起这个混合架构模型
想亲自体验的话,先克隆仓库:
git clone https://gitcode.com/hf_mirrors/mlx-community/LFM2.5-8B-A1B-MLX-8bit然后安装推理依赖并加载模型(参考 README.md 的用法):
pip install mlx-lmfrom mlx_lm import load, generate model, tokenizer = load("本地模型目录路径") prompt = "用三句话介绍混合架构大模型" if tokenizer.chat_template is not None: prompt = tokenizer.apply_chat_template( [{"role": "user", "content": prompt}], add_generation_prompt=True) response = generate(model, tokenizer, prompt=prompt, verbose=True) print(response)模型自带的 chat_template.jinja 已适配 mlx-lm 的对话模板与工具调用格式,开箱即用。如果你手头正好是 Apple Silicon 设备,不妨亲自感受一下这套"短卷积 + 分组注意力 + 稀疏专家"组合拳在本地推理时的速度与内存表现,相信你会对"混合架构"这四个字有全新的理解。
【免费下载链接】LFM2.5-8B-A1B-MLX-8bit项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/LFM2.5-8B-A1B-MLX-8bit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考