Qwen3.8-27B 的线性注意力参数:卷积核宽度与 key/value 头数

2026-08-16

在 Hugging Face 仓库 Qwen/Qwen3.8-27B 里翻 config.json,如果你按 linear_ 这个前缀搜一遍,会在文件中段连着搜出五行;再往下一行还有一个 mamba_ 开头的字段。这六行是连续的,占据 config.json:87config.json:92

这一小段容易被跳过,因为它既不像 num_hidden_layers 那样有明确对应的 model card 参数表条目,也不像 layer_types 那样一眼能数出结构。但如果你要照着配置去对 model card 里的 “Gated DeltaNet” 那两行,绕不开它。

以下所有数值都来自我们在 2026-08-16 采集的仓库快照 1d4bf0f我们没有下载权重、没有部署、也没有推理过这个模型,所以这篇只做一件事:把字段名、取值、所在行号照录出来,再和 model card 对一遍,说清哪些对得上、哪些没有对应表述。

六行原文

先把这六个键按文件中的出现顺序照录,都在 text_config 这一层下面:

字段名行号
linear_conv_kernel_dim4config.json:87
linear_key_head_dim128config.json:88
linear_num_key_heads16config.json:89
linear_num_value_heads48config.json:90
linear_value_head_dim128config.json:91
mamba_ssm_dtype"float32"config.json:92

config.json 整个文件是 4,312 字节、140 行,只有三层结构:顶层、text_configvision_config。上面这六个键全都在 text_config 直属层,而 text_config 一共 34 个键,这六个占其中六席。

它们在文件里的位置也值得提一句:layer_types 那个数组从 config.json:21[ 一直排到 config.json:86],中间 64 个元素各占一行。这六行紧跟在数组的收尾之后,所以你在编辑器里从上往下翻 config.json 时,很容易连着 64 行数组一起滚过去,回头再按前缀搜才发现它们。

与 model card 参数表的逐项对照

model card 的 “Model Overview” 节在 README.md:32README.md:53。与线性注意力直接相关的是这两行原文:

- Gated DeltaNet:
    - Number of Linear Attention Heads: 48 for V and 16 for QK
    - Head Dimension: 128

分别位于 README.md:42README.md:43README.md:44。逐项对:

  • README.md:4348 for V 对应 linear_num_value_heads = 48config.json:90),数值一致。
  • 同一行的 16 for QK 对应 linear_num_key_heads = 16config.json:89),数值一致。但要注意 model card 这一行把 Q 与 K 合并写成 “for QK”,而 text_config 的 34 个键里没有任何一个名字里带 query 的 linear_ 字段——配置侧只写了 key 头数这一个数。两处并列陈述,我们不推断这是怎么回事。
  • README.md:44Head Dimension: 128config.json 里被拆成了两个键:linear_key_head_dim = 128config.json:88)与 linear_value_head_dim = 128config.json:91)。model card 给一个数,配置给两个字段,两个字段当前取值相同。

剩下两个字段的处境不一样。linear_conv_kernel_dimmamba_ssm_dtype 在 “Model Overview” 的参数表里没有对应条目。我们把 README.md:36README.md:52 的每一行都拿去和 config.json 对过一遍,参数表覆盖的是隐藏维、层数、词表、两组注意力的头数与头维、FFN 中间维、LM 输出、MTP 这些项,卷积核宽度和 SSM 的 dtype 都不在其中。

另外,model card 里 DeltaNetGated 这两个词只出现在 README.md:41424345 四行,全都在 “Model Overview” 那一小块里;而 config.json一次都没有出现 “Gated DeltaNet” 这个名词,同一位置上写的字符串是 "linear_attention"。把这两组名词对上,是我们按数量(48 / 16)和排布顺序做出的核对结论,不是 config.json 里写明的映射关系。这个边界要说清楚,因为后面你如果照着 model card 的名词去配置里搜,是搜不到的。

顺着 “Gated” 这个词再补一句:text_config 里另外有两个键看上去与门控有关,attn_output_gate 的值是 trueconfig.json:11),output_gate_type 的值是 "swish"config.json:100)。它们和 model card 里 “Gated DeltaNet” / “Gated Attention” 的那个 “Gated” 是不是指同一件事,本仓的文件没有说明,我们不推断。这两个键也不在上面那六行里,位置隔得很远,搜前缀时不会被一起搜出来。

两个 4 别混为一谈

linear_conv_kernel_dim 的值是 4。在同一个 text_config 里,还有一个字段的值也是 4full_attention_intervalconfig.json:15)。

这两个是完全不同的两个键,一个在第 15 行、一个在第 87 行,只是数值碰巧相同。full_attention_intervallayer_types 数组的排布在数值上自洽——layer_types 长度 64,其中 full_attention 16 项、linear_attention 48 项,full_attention 的 0 基下标是 3, 7, 11 … 63,相邻间距恒为 4,而 64 ÷ 4 = 16。而 linear_conv_kernel_dim 与层的排布没有已知关系。

linear_conv_kernel_dim 的确切含义,我们未能从本仓的任何文件中确认。 这是模型权重仓,config.json:3 里那个 Qwen3_5ForConditionalGeneration 类的实现不在本仓,model card 也没有解释这个字段。我们只照录数值 4,不解释它是什么维度上的宽度、也不说改了会怎样。

顺带一个同样属于「数值巧合,别混」的点:线性注意力的 value 头数是 48、key 头数是 16;而 layer_typeslinear_attention 恰好是 48 层、full_attention 恰好是 16 层。头数和层数是两码事,数字撞在一起只是巧合,看表时别把这两组 48 / 16 读串了。

和全注意力那一组字段的对照

同一个 text_config 里还有另一组头数字段,对应 model card 的 “Gated Attention”:

头数字段头维字段
线性侧linear_num_value_headsconfig.json:9048linear_value_head_dimconfig.json:91128
线性侧linear_num_key_headsconfig.json:8916linear_key_head_dimconfig.json:88128
全注意力侧num_attention_headsconfig.json:9724head_dimconfig.json:16256
全注意力侧num_key_value_headsconfig.json:994同上256

有三点值得单独标出来:

  1. 命名不对称。 线性侧的头维是两个带前缀的独立字段(linear_key_head_dim / linear_value_head_dim),全注意力侧则共用一个不带前缀的 head_dim。你在文件里搜 head_dim 会同时命中三处,别以为是同一个东西。同样容易看串的还有两个都带 key 字样的键:linear_num_key_heads16config.json:89),num_key_value_heads4config.json:99),一个在第 89 行、一个在第 99 行,字段名不同、取值不同,引用时把行号一起写上比只写字段名更保险。
  2. 头维数值不同。 线性侧是 128,全注意力侧是 256。model card 的 README.md:44README.md:47 也是分别写 128 与 256,两侧口径一致。
  3. 乘积。 我们用 Python 乘了一下:linear_num_value_heads × linear_value_head_dim = 48 × 128 = 6144linear_num_key_heads × linear_key_head_dim = 16 × 128 = 2048;全注意力侧 num_attention_heads × head_dim = 24 × 256 = 6144num_key_value_heads × head_dim = 4 × 256 = 1024。两侧的「大头」乘积都是 6144,而 hidden_size5120config.json:18),与 6144 不等。这些乘积是我们自己算的,config.json 里并没有直接写出来,这里只作为数值关系记录,不用它推导参数量、显存或任何性能结论。

mamba_ssm_dtypedtype 并存

config.json:92mamba_ssm_dtype"float32",而同一个 text_configconfig.json:13dtype"bfloat16"。两个字段并存,取值不同。

这两个 dtype 各自作用在什么地方,本仓文件没有说明,我们不推断。 也要说清楚:我们没有打开过任何一个 safetensors 分片,权重实际以什么类型存储,没有核实过。配置里写着什么,就只是配置里写着什么。

自己核一遍

这几个数不用相信任何二手转述,config.json 是纯文本,几行 Python 就能读出来:

python -c "
import json
d = json.load(open('config.json', encoding='utf-8'))
t = d['text_config']
for k in ['linear_conv_kernel_dim','linear_key_head_dim','linear_num_key_heads',
          'linear_num_value_heads','linear_value_head_dim','mamba_ssm_dtype',
          'full_attention_interval','head_dim','num_attention_heads','num_key_value_heads']:
    print(k, '=', t[k])
print('query-side linear field?', [k for k in t if 'linear' in k])
"

在 Windows 上用 PowerShell 或 CMD 跑同样这条命令时,把外层的双引号与内层引号换个位置更省事:把整段脚本写进一个 .py 文件再 python 文件名.py,可以避开引号转义的麻烦。Linux 与 macOS 侧则可直接照抄上面这条。以上是按仓库中的字段名组合的读取示例,我们没有运行过它,取值以你手上那份 config.json 为准。

最后一行 print 是用来确认「线性侧没有 query 头数字段」的:截至 2026-08-16 的快照,它会把 text_config 里所有含 linear 的键列出来,也就是上面表里那五个。

边界

写到这里得把话说死:

  • 这六个字段改成别的值会牵动什么,我们没有依据说。本仓只有权重与配置,没有建模源码;model card 也没有给出任何调参说明。该调成多少取决于你的用法,项目没给通用值。
  • linear_conv_kernel_dimmamba_ssm_dtype 这两个字段的确切语义,我们未能在本仓任何文件里找到定义,只记录取值。
  • 线性侧与全注意力侧是不同的架构选择,效果如何我们没有依据评价,也不做任何两侧之间的优劣判断。
  • model card 里那句 Number of Parameters: 27BREADME.md:37)是 model card 自述;config.json 里没有任何参数量字段,我们无法从配置核对它。

延伸阅读


本文依据 Hugging Face 仓库 Qwen/Qwen3.8-27B 的 model card 与随仓配置文件 (config.jsongeneration_config.jsonpreprocessor_config.jsonchat_template.jinja 等)整理, 核对日 2026-08-16,对应仓库快照 1d4bf0f。 本文内容为 model card 与配置文件口径,我们没有下载权重、没有部署、也没有推理过这个模型, 因此不涉及生成质量、推理速度与显存占用的任何描述;文中所有评测数字均为 model card 自述,我们没有复现。 模型仓库内容随上游更新而变动,请以官方最新说明为准。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。