InferLens:给自建 LLM 推理服务的一次轻量体检
最近在写一个小工具: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.2,inferlens 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 | OPENAI_BASE_URL="https://api.deepseek.com" \ |
api 模式只看客户端侧时间,不读 vLLM metrics。它适合检查一个 OpenAI-compatible endpoint 的 stream 行为。
这里也踩到了一点真实差异:DeepSeek 有些模型会在 stream 里返回 reasoning_content,不是标准的 content。InferLens 现在会识别这个字段,不会直接误判成“没有 token”。
offline
离线 vLLM 也可以测:
1 | inferlens ping offline \ |
这个模式内部会调用一个 Python helper 去跑 vllm.LLM.generate。Go 这边只负责 CLI、超时和报告。
输出里会把时间拆开:
- load:模型加载
- generate:生成
- total:总耗时
对本地排查 CUDA、Metal、模型下载、chat template 这些问题,离线模式会比每次手写脚本方便一点。
输出大概这样
它会先打印模型返回内容,然后打印一段报告:
1 | --- inferlens ping --- |
我想要的不是复杂 dashboard,而是先在终端里把一次请求讲清楚。
还没做什么
现在它故意没有做很多东西:
- 不管理 vLLM 进程
- 不做 benchmark loop
- 不接 Kubernetes
- 不把 API key 写进配置文件
- 不做长期指标存储
这些以后都可能会做,但不是现在。现在先把单次请求看清楚。
项目地址在这里:github.com/caffe-in/inferlens。
如果你也在本地折腾 vLLM、自建推理服务,或者只是想快速检查某个 OpenAI-compatible API 的 stream 行为,可以试一下。现在功能还很小,但这个小工具确实已经开始帮我少写一些一次性的 curl 和临时脚本了。





