#!/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 示例,从正文处开始,并剥掉开头的 残留 # (视觉提示词里没有 <|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