news 2026/10/23 2:30:48

Tess-4-27B-8bit 视觉塔拆解:27层 ViT 如何看懂图像与视频帧(原理图解)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Tess-4-27B-8bit 视觉塔拆解:27层 ViT 如何看懂图像与视频帧(原理图解)

【免费下载链接】Tess-4-27B-8bit

项目地址:https://ai.gitcode.com/hf_mirrors/mlx-community/Tess-4-27B-8bit
点击查看免费下载

Tess-4-27B-8bit是 mlx-community 提供的 8bit 量化多模态大模型,由 27 层 ViT 视觉塔(vision tower)负责"看懂"图像与视频帧,再把视觉信息交给 27B 语言模型生成回答。本文拆解这条视觉通路:图片如何被切成 16×16 的 patch、27 层 Transformer 如何融合局部细节、Merger 又如何把视觉特征压缩成语言模型能理解的 token。

一张图看懂整体结构:从像素到文字

整个模型的"看图说话"流程可以概括为三步:

图片/视频帧 ──▶ 预处理(切patch) ──▶ ViT视觉塔(27层) ──▶ Merger压缩 ──▶ 语言模型(64层) ──▶ 文字回答
  • 视觉塔(vision_tower):27 层 ViT 编码器,只负责"看",输出纯视觉特征;
  • Merger:把 2×2 相邻的 patch 特征两两合并,token 数量直接减到 1/4;
  • 语言模型:64 层、hidden_size 5120 的 Qwen3_5 架构,支持线性注意力 + 全注意力混合,负责理解并回答。

三者全部打包在 config.json 的architectures、text_config、vision_config三段配置里。

视觉塔核心参数:27 层 ViT 的"身材"

打开 config.json,vision_config字段就是视觉塔的"体检报告":

参数值含义
depth27Transformer 层数(blocks.0 ~ blocks.26)
hidden_size1152每个视觉 token 的向量维度
num_heads16多头注意力头数
patch_size16每块 16×16 像素
temporal_patch_size2视频按 2 帧为一组处理
spatial_merge_size22×2 空间合并
out_hidden_size5120对齐语言模型的 hidden_size
num_position_embeddings2304位置编码容量上限
hidden_actgelu_pytorch_tanh激活函数

为什么是 27 层?层数越多,ViT 能从"局部纹理"逐步抽象到"全局语义"。第 0 层只认识边缘和色块,越靠后的层越接近"这是一只猫坐在沙发上"这种概念级理解。27 层是在识别精度与推理速度之间的平衡点。

ViT 原理图解:图像是如何被"读"懂的

第一步:切 Patch —— 把图片撕成小方块

ViT(Vision Transformer)的核心思想是:把图像当成"句子"来处理。

图片先按patch_size: 16切成 16×16 像素的小方块,每个方块通过vision_tower.patch_embed(3D 卷积投影)变成一个 1152 维向量,即一个"视觉 token"。权重文件对应 model-00001-of-00006.safetensors 中的:

  • vision_tower.patch_embed.proj.weight
  • vision_tower.pos_embed.weight(位置编码,让模型知道每个 patch 在图中的位置)

第二步:动态分辨率 —— 大图不糊,小图不浪费

和传统 ViT 固定输入尺寸不同,本模型采用动态分辨率策略。查看 preprocessor_config.json 可知:

  • min_pixels: 65536(约 256×256):小图至少补到这个分辨率;
  • max_pixels: 16777216(约 4096×4096):大图最多切这么多 patch。

也就是说,一张高清图会被切成更多 patch,模型就"看得更仔细";一张小图则不会强行放大糊掉。像素范围约束在 processor_config.json 的max_pixels/min_pixels中同样可以找到。

第三步:27 层注意力 —— 局部细节如何变成全局语义

每一层 block 的结构在 model.safetensors.index.json 中可以清晰看到(以 blocks.0 为例):

norm1 ──▶ attn(qkv + proj) ──▶ 残差 norm2 ──▶ mlp(fc1 + fc2) ──▶ 残差
  • attn.qkv:把每个 patch 向量拆成 Query / Key / Value,做 16 头自注意力——每个 patch 都会"参考"图中所有其他 patch;
  • attn.proj:注意力结果投影回 1152 维;
  • mlp.linear_fc1 / fc2:两层前馈网络(中间维度 4304),做非线性变换。

27 层反复堆叠后,早期层的"局部纹理特征"逐层整合为高层的"物体、空间关系、场景"表示。这是 ViT 相比卷积网络最本质的差异:全局上下文从第一层就开始参与计算。

第四步:Merger —— 视觉 token 的四压缩

27 层输出的 patch token 数量太大(一张大图可能有上万个),直接塞给语言模型会撑爆上下文。于是vision_tower.merger登场:

  1. 把 2×2 相邻的 4 个 patch token 拼接(hidden 维度 1152 → 4608);
  2. 经linear_fc1→ 激活 →linear_fc2,投影到out_hidden_size: 5120,与语言模型对齐。

对应权重见 model.safetensors.index.json 中的vision_tower.merger.linear_fc1.weight等条目。token 数量除以 4 之后,才以特殊 token 的形式进入语言模型:

特殊 tokenID作用
vision_start_token_id248053标记视觉内容开始
image_token_id248056图像 patch 占位符
video_token_id248057视频帧 patch 占位符
vision_end_token_id248054标记视觉内容结束

这些占位符规则也可以从对话模板 chat_template.jinja 中看到:遇到图片插入 ,遇到视频插入 。

视频理解:帧如何变成"时间 token"

视频与图片走的是同一座 ViT,区别在时间维度:

  • temporal_patch_size: 2:每 2 帧叠成一组,卷积核在时间轴上做投影,让相邻帧共享特征,从而"看懂运动"而不是只看静态画面;
  • 抽帧策略见 processor_config.json:默认fps: 2.0(每秒抽 2 帧),最少min_frames: 4帧、最多max_frames: 768帧;
  • 单帧分辨率在 video_preprocessor_config.json 中约束,max_pixels放宽到约 2516 万像素,因为视频帧数多、单帧可以更省。

一句话概括:2 帧打包 + 2×2 空间合并 + 2×2 时间合并,让一段视频最终变成语言模型可以逐 token 阅读的"视觉句子"。

权重落在哪里:视觉塔文件定位

本仓库采用 6 分片的 safetensors 存储,全模型总大小 29,500,938,720 字节(约 29.5 GB,见 model.safetensors.index.json 的total_size)。

视觉塔的全部权重集中在第一个分片:

  • model-00001-of-00006.safetensors —— 包含vision_tower.blocks.0~26、merger、patch_embed、pos_embed,以及语言模型第 0~9 层;
  • model-00002-of-00006.safetensors ~ model-00006-of-00006.safetensors —— 语言模型其余层与 lm_head。

按 8bit 量化估算(8bit 权重 + 每 64 个元素一组缩放因子,见 config.json 的group_size: 64),27 层 ViT 约占 4 GB 出头,仅占整个模型的 1/7 左右——这正是"用 27B 大脑 + 轻量视觉塔"的典型设计。

快速上手:3 步验证视觉塔

仓库 README.md 给出了最小验证方式,跑一次"图片描述"即可确认视觉通路完整:

pip install -U mlx-vlm
python -m mlx_vlm.generate --model mlx-community/Tess-4-27B-8bit --max-tokens 100 --temperature 0.0 --prompt "Describe this image." --image <path_to_image>

如果模型能准确描述图片内容,说明 patch_embed → 27 层 ViT → merger → 语言模型这条链路都工作正常。

总结:27 层 ViT 的设计取舍

  • 看得准:27 层自注意力让全局上下文从第一层就参与,配合动态分辨率,大图细节不丢;
  • 进得去:Merger 四压缩 + 5120 维对齐,视觉 token 数量可控,语言模型吃得住;
  • 看得动:temporal_patch_size: 2让同一座 ViT 既能读图片也能读视频帧;
  • 跑得动:8bit 亲和量化把 27B 多模态模型压到约 29.5 GB,在 Apple Silicon 的 MLX 生态里可直接本地推理。

下次当你问它"图里有什么"时,这 27 层 ViT 已经默默完成了切块、融合、压缩的全部工作——这正是 Tess-4-27B-8bit 多模态能力的核心所在。

【免费下载链接】Tess-4-27B-8bit

项目地址:https://ai.gitcode.com/hf_mirrors/mlx-community/Tess-4-27B-8bit
点击查看免费下载
上一篇:怎样完全免费解锁WeMod专业版功能:Wand-Enhancer完整指南
下一篇:闲鱼APP数据采集终极实战指南:5步构建高效自动化工具

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 2:28:20

Step-5-Preview 3 层 MTP 预测加速推理:投机解码机制完全解析

人工智能大模型基础模型多模态模型量化推理模型 【免费下载链接】Step-5-Preview-NVFP4 项目地址&#xff1a; https://ai.gitcode.com/StepFun/Step-5-Preview-NVFP4 点击查看 免费下载 Step-5-Preview-NVFP4 是阶跃星辰 Step-5-Preview 多模态旗舰大模型&#xff08;600B 总…

作者头像 李华
网站建设 2026/10/23 2:26:40

PCL2启动器内存分配显示异常:为何24GB内存仅显示1GB可用?

PCL2启动器内存分配显示异常&#xff1a;为何24GB内存仅显示1GB可用&#xff1f; 如果你在使用PCL2启动器时发现一个奇怪的现象&#xff1a;明明电脑有24GB物理内存&#xff0c;启动器却只显示1GB可用内存&#xff0c;这并非软件bug&#xff0c;而是启动器为了保护系统稳定性的…

作者头像 李华