File size: 1,953 Bytes
7e0a8c6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #!/usr/bin/env bash
# Youtu-LLM-A7B-Base 视觉(图文)冒烟测试
#
# 用法:
# bash test_vision.sh # 用内置报纸图
# bash test_vision.sh /path/to/img.jpg # 用指定图片
#
# 前置:models/youtu-moe-a7b-Q4_K_M.gguf + models/youtu-vl-mmproj-f16.gguf
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CLI="$ROOT/llama.cpp/build/bin/llama-mtmd-cli"
MODEL="$ROOT/models/youtu-moe-a7b-Q4_K_M.gguf"
MMPROJ="$ROOT/models/youtu-vl-mmproj-f16.gguf"
IMG="${1:-$ROOT/llama.cpp/tools/mtmd/test-1.jpeg}"
for f in "$CLI" "$MODEL" "$MMPROJ" "$IMG"; do
[ -e "$f" ] || { echo "缺少 $f" >&2; exit 1; }
done
# 提示词里的 <|vision_start|>/<|vision_end|> 是必须的:官方 processor 用它们包裹
# 图像占位(image_token_id=128017)。<__media__> 会被 mtmd 替换成视觉 embedding 块,
# 因此不要在提示词里再写 <|image_pad|>。chat_template.jinja 本身不含图像分支,
# 所以这里不走 --jinja,直接给裸提示词。
PROMPT="<|vision_start|><__media__><|vision_end|>描述这张图片的内容。"
echo "图片: $IMG"
# 默认关闭逐批次模态诊断(会插在输出流里);需要时用
# YOUTU_DEBUG_MODALITY=1 bash test_vision.sh
# 打开后应看到图像批次 vision 数 == 图像 token 数、其余批次 vision=0。
#
# 输出过滤分两步:
# 1. 去掉带 4 段时间戳的日志行(格式 0.05.132.418 I ...)
# 2. strip_think.py --from-first-think:跳过 llama-mtmd-cli 夹带的 3 行
# chat template 示例,从正文处开始,并剥掉开头的 </think> 残留
# (视觉提示词里没有 <|Assistant|>,但模型仍会先吐 1~2 个)
YOUTU_DEBUG_MODALITY="${YOUTU_DEBUG_MODALITY:-0}" "$CLI" \
-m "$MODEL" --mmproj "$MMPROJ" --image "$IMG" \
-p "$PROMPT" -n 200 -c 4096 --temp 0.2 -ngl 99 2>&1 \
| grep -vE "^[0-9]+(\.[0-9]+)+ [A-Z] " \
| python3 "$ROOT/strip_think.py" --from-first-think
|