最近在写一个小工具:InferLens

它现在还很早期,目标也不大:我本地起了一个 vLLM,或者手里有一个 OpenAI-compatible API,我想用一个命令确认它到底能不能正常流式返回、首 token 大概有多慢、vLLM 的 metrics 有没有变化。

说白了,它不是平台,也不是监控系统。现在更像一个推理服务的 ping

为什么写它

调 LLM 推理服务的时候,我经常遇到一些不算大、但很烦的问题:

  • 服务能连上,但是 stream 里没有真正的 token
  • 首 token 很慢,但不知道慢在 headers、首 chunk,还是后面的生成
  • vLLM 的 /metrics 接上了,但每次都要自己对照
  • 第三方 API 说兼容 OpenAI,但 stream 字段可能长得不完全一样
  • offline 推理能跑,不过模型加载时间和生成时间混在一起

这些问题都可以手写 curl 或临时 Python 脚本解决,但每次都临时写一遍就很累,而且结果也不太好复现。

所以我想先把最常用的检查动作收进一个 CLI 里。

现在有什么

当前版本是 v0.0.2inferlens ping 现在分成了三个模式。

serve

默认就是 serve

1
inferlens ping --model Qwen/Qwen2.5-0.5B-Instruct --prompt "hello"

等价于:

1
inferlens ping serve --model Qwen/Qwen2.5-0.5B-Instruct --prompt "hello"

这个模式主要测本地或自建的 vLLM server。它会发一次 streaming chat completion 请求,记录 headers、first chunk、first token、总耗时,同时在请求前后读一次 vLLM /metrics

这是目前项目最核心的链路:

1
Go CLI -> vLLM OpenAI API -> streaming response -> metrics diff

api

如果是第三方 API,可以用:

1
2
3
4
5
OPENAI_BASE_URL="https://api.deepseek.com" \
OPENAI_API_KEY="sk-..." \
inferlens ping api \
--model deepseek-v4-flash \
--prompt "hello"

api 模式只看客户端侧时间,不读 vLLM metrics。它适合检查一个 OpenAI-compatible endpoint 的 stream 行为。

这里也踩到了一点真实差异:DeepSeek 有些模型会在 stream 里返回 reasoning_content,不是标准的 content。InferLens 现在会识别这个字段,不会直接误判成“没有 token”。

offline

离线 vLLM 也可以测:

1
2
3
4
inferlens ping offline \
--python python3 \
--model Qwen/Qwen2.5-0.5B-Instruct \
--prompt "hello"

这个模式内部会调用一个 Python helper 去跑 vllm.LLM.generate。Go 这边只负责 CLI、超时和报告。

输出里会把时间拆开:

  • load:模型加载
  • generate:生成
  • total:总耗时

对本地排查 CUDA、Metal、模型下载、chat template 这些问题,离线模式会比每次手写脚本方便一点。

输出大概这样

它会先打印模型返回内容,然后打印一段报告:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--- inferlens ping ---
mode: api
endpoint: https://api.deepseek.com
model: deepseek-v4-flash
auth: bearer
streaming: required
server metrics: not available in api mode
status: 200

client timeline:
total: 3.115s
headers: 110ms
first chunk: 142ms
first token: 180ms
stream: 2.974s
chunks: 130
content deltas: 120
output rate: 40.3 deltas/s

我想要的不是复杂 dashboard,而是先在终端里把一次请求讲清楚。

还没做什么

现在它故意没有做很多东西:

  • 不管理 vLLM 进程
  • 不做 benchmark loop
  • 不接 Kubernetes
  • 不把 API key 写进配置文件
  • 不做长期指标存储

这些以后都可能会做,但不是现在。现在先把单次请求看清楚。

项目地址在这里:github.com/caffe-in/inferlens

如果你也在本地折腾 vLLM、自建推理服务,或者只是想快速检查某个 OpenAI-compatible API 的 stream 行为,可以试一下。现在功能还很小,但这个小工具确实已经开始帮我少写一些一次性的 curl 和临时脚本了。