如何给 Colibrì 的 GLM-5.3-Flash 提供图片输入并控制单图 token 上限?
2026/9/14 20:39:50 网站建设 项目流程

如何给 Colibrì 的 GLM-5.3-Flash 提供图片输入并控制单图 token 上限?

【免费下载链接】colibriRun frontier MoE models on hardware you already own — pure C, zero deps, experts streamed from disk. Tiny engine, immense model. 🐦项目地址: https://gitcode.com/GitHub_Trending/colibri3/colibri

Colibrì 的 GLM-5.3-Flash 引擎(c/glm53.c)带有一个 vision tower,但 C 引擎本身不认 JPEG、不做缩放和归一化——图片预处理由 Python 工具完成,引擎只接收预先切好的 patch。这篇文档回答两件事:如何通过coli chat/coli web/ OpenAI 接口把一张图片交给 GLM-5.3-Flash,以及用哪个环境变量控制单张图最多消耗多少 token。

前提:你已经用转换脚本得到模型容器并构建了引擎或coli启动器。引擎读的是转换后的容器,不是 Hugging Face 原始快照。

准备:转换模型容器并构建引擎

模型容器一次命令完成下载和转换(逐分片处理,峰值磁盘占用是输出目录加一个 5 GB 源分片,不会占满原仓库的 328 GB):

python3 tools/convert_glm53.py --outdir /path/glm53_i4 --min-free-gb 30

其中/path/glm53_i4替换为你存放模型容器的本地目录,--min-free-gb 30要求目标盘至少留有 30 GB 空闲。

构建引擎与使用方式(来自 docs/glm53-flash.md):

make glm53 ./glm53 --model <dir> --prompt "Ciao, come stai?" --greedy 32

<dir>是模型容器目录。图片输入只在启动器coli这条路径上可用,它是图片和 chat template 的所在:

coli chat --model <dir> --no-think coli serve --model <dir> coli web --model <dir>

提供图片输入:三种入口

docs/glm53-flash.md 的 Vision 一节说明图片可以从三个面进入:

  1. coli chat:直接在输入里粘贴图片路径。CLI 按扩展名识别图片:.png.jpg.jpeg.webp.bmp.gif.tif.tiff(见 c/coli 中的IMAGE_SUFFIXES)。两点行为需要注意:
    • 每条消息只接受一张图片,给出两个路径时 CLI 直接提示 "una immagine per messaggio"(每条消息一张图)并拒绝发送;
    • 文件不存在时 CLI 会立刻报错并给出它解析到的本地路径,不会带着空图片去等模型回答。在 WSL 里粘贴 Windows 路径(C:\Users\...)时,CLI 会自动翻译成/mnt/c/...形式。
  2. coli web:在页面里 attach 或拖放图片文件。
  3. OpenAI 兼容接口coli serve):消息里用image_urlpart,URL 给 base64 data URI 或本地路径。远程 URL 会被直接拒绝而不是去抓取——服务器不应该按发送方指定的地址发起网络连接。

底层协议是IMAGE帧:图片以独立帧发出,紧跟在它所属的SUBMIT请求之前(见 docs/serve_protocol.md)。提示词中必须已为每个输出 token 放好一个<|image|>占位符,数量是(grid_h/merge) × (grid_w/merge),数量对不上时引擎拒绝而不是答非所图。引擎同时只挂一张待处理图片,新图会直接丢掉旧图。

预处理:tools/glm53_image.py 做了什么

引擎拿到的是已切好的 patch,所以 c/tools/glm53_image.py 负责完整的前处理,顺序与官方Glm5NextImageProcessor一致:解码并转 RGB;smart_resize选出一张对齐到 28 的画布(patch 14 × merge 2),且不超过 checkpoint 的 token 预算;缩放、按 1/255 归一、用 CLIP 均值和方差标准化;最后按 vision tower 要求的顺序(merge 块、通道、时间重复、行、列)切成 patch。

图像保持宽高比缩放并补零,不做拉伸;补零发生在归一化之前。几何参数(patch_sizemerge_sizetemporal_patch_size、均值方差)优先从模型目录的processor_config.jsonconfig.json读取,避免在几何不同的 checkpoint 上切出错误尺寸的 patch。文档说明它与官方 processor 对齐:所有试过的形状几何一致,不发生重采样的位置像素位级一致,发生重采样时最坏差异 0.03(Pillow 与 torchvision 的 bicubic 之差)。

单独运行它查看一张图的网格规模(文档用法):

python3 tools/glm53_image.py foto.jpg --out patches.f32 python3 tools/glm53_image.py foto.jpg --json # 只打印网格

--model <dir>传入 checkpoint 目录以读取其真实参数;--json输出grid_hgrid_wpatchesimage_tokens四个字段,image_tokens就是这张图会占用的 token 数,可直接用来核对预算。

控制单图 token 上限:GLM53_MAX_IMAGE_TOKENS

checkpoint 自身的上限是每图 8000 token。以 1080p 照片为例,8000 的上限对应 2691 个 token——对一个专家从磁盘流式读取的引擎,这是一段没人愿意干等的 prefill。每个 image token 覆盖 28×28 像素:设成 256 还能看清普通文字,设成 64 只剩形状和颜色。图是被缩小而不是裁切,丢的是细节而非局部。

docs/ENVIRONMENT.md 中glm53一节的定义:

变量默认值作用
GLM53_MAX_IMAGE_TOKENScheckpoint 的(8000)单图 token 上限。每个 token 覆盖 28×28 像素,256 保持普通文字可读,64 只保留形状和颜色。图片缩小而非裁剪。

该变量由c/glm53.c读取,tools/glm53_image.py的预处理也读同一个变量,所以在运行coli的 shell 里 export 即可同时约束引擎与预处理:

export GLM53_MAX_IMAGE_TOKENS=256 coli chat --model <dir>

想确认某张图实际落到多少 token,用--jsonimage_tokens;或者设置GLM53_VERBOSE(glm53 专有的调试变量),引擎会把解析出的几何、专家预算和每 token 缓存成本打印到 stderr。

限制与边界

  • 远程图片 URL 一律被拒绝,只能给 base64 data URI 或本地路径;
  • 引擎只保留一张待处理图片,连续发图时旧图会被丢弃,模型不会假装还在回答上一张照片;
  • 图片占位符数量与 IMAGE 帧网格不匹配时,引擎拒绝该请求;
  • GLM53_*变量只被c/glm53.c读取,与其他引擎(colibrikimi_k3等)的变量互不通用,设错引擎不会有任何警告。

进一步的细节见 docs/glm53-flash.md(Vision 与 Environment 节)、docs/ENVIRONMENT.md(GLM53_MAX_IMAGE_TOKENS行)和 docs/serve_protocol.md(IMAGE帧格式)。

【免费下载链接】colibriRun frontier MoE models on hardware you already own — pure C, zero deps, experts streamed from disk. Tiny engine, immense model. 🐦项目地址: https://gitcode.com/GitHub_Trending/colibri3/colibri

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询