Docker部署VLLM后,如何获取单请求的TTFT与TPOT指标?
获取VLLM单个请求的TTFT和TPOT指标(Docker部署场景)
以下是几种在Docker部署的VLLM中获取单个请求的TTFT(首令牌生成时间)和TPOT(每输出令牌耗时)的可行方案:
方案1:启用DEBUG日志并提取计时信息
VLLM在DEBUG日志级别下会输出每个请求的详细计时数据,无需修改代码,适合快速验证:
- 启动Docker容器时,添加日志级别参数或环境变量:
或者通过环境变量设置:docker run -p 8000:8000 vllm/vllm:latest --model your-model-name --log-level debugdocker run -p 8000:8000 -e LOG_LEVEL=DEBUG vllm/vllm:latest --model your-model-name - 容器日志中会包含每个请求的TTFT(格式类似
First token generated in X seconds),TPOT可通过相邻令牌日志的时间差计算,直接从日志中提取对应请求的数值即可。
方案2:客户端侧计时(OpenAI兼容API场景)
如果使用VLLM的OpenAI兼容API,可在客户端代码中自行记录时间,实现简单但会包含网络延迟:
import time from openai import OpenAI client = OpenAI(base_url="http://localhost:8000/v1", api_key="dummy") prompt = "Your test prompt here" start_time = time.time() first_token_received = False tpot_times = [] # 流式请求模式下捕获每个令牌的时间 stream = client.chat.completions.create( model="your-model-name", messages=[{"role": "user", "content": prompt}], stream=True ) for chunk in stream: if not first_token_received: ttft = time.time() - start_time print(f"TTFT: {ttft:.4f}s") first_token_received = True last_token_time = time.time() else: current_time = time.time() tpot = current_time - last_token_time tpot_times.append(tpot) print(f"TPOT: {tpot:.4f}s") last_token_time = current_time # 可选:计算该请求的平均TPOT if tpot_times: avg_tpot = sum(tpot_times)/len(tpot_times) print(f"Average TPOT: {avg_tpot:.4f}s")
方案3:自定义VLLM服务端代码(最准确)
如果需要服务端原生返回TTFT和TPOT,可修改VLLM的API服务代码并构建自定义Docker镜像:
- 复制官方VLLM的
openai/api_server.py文件,找到处理生成请求的逻辑(如create_chat_completion函数)。 - 在请求处理流程中添加计时逻辑:记录请求开始时间、首令牌生成时间,以及每个后续令牌的生成时间,将这些数据添加到响应JSON中。
- 编写自定义Dockerfile:
FROM vllm/vllm:latest COPY ./modified_api_server.py /usr/local/lib/python3.10/site-packages/vllm/openai/api_server.py - 构建并运行自定义镜像:
此时调用API时,响应结果中会包含该请求的TTFT和每个令牌的TPOT数据。docker build -t custom-vllm . docker run -p 8000:8000 custom-vllm --model your-model-name
内容的提问来源于stack exchange,提问作者Carter Wang
相关产品推荐
相关产品推荐

