大模型推理性能优化之KV Cache解读

本文介绍了KV Cache在大模型推理性能优化中的作用,解释了其原理和实现细节,指出KV Cache能减少Self-Attention层的计算量,不影响MLP层,并降低了block间的数据传输。通过对Transformer模型的分析,展示了KV Cache如何通过缓存重复计算结果提升推理速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 引言

做大模型性能优化的一定对KV Cache不陌生,那么我们对这个技术了解到什么程度呢?请尝试回答如下问题:

  • KV Cache节省了Self-Attention层中哪部分的计算?

  • KV Cache对MLP层的计算量有影响吗?

  • KV Cache对block间的数据传输量有影响吗?本文打算剖析该技术并给出上面问题的答案。

1. KV Cache是啥

大模型推理性能优化的一个常用技术是KV Cache,该技术可以在不影响任何计算精度的前提下,通过空间换时间思想,提高推理性能。网上有一些关于该技术的分析博客,但读过后仍然会很迷糊,甚至可能会被带偏,认为这个Cache过程和数据库读取或CPU Cache加速类似的荒谬结论。刚开始我也有类似误解,直到逐行查阅并运行源码,才清楚了解到其Cache了啥,以及如何节省计算的。

2. 背景

生成式generative模型的推理过程很有特点,我们给一个输入文本,模型会输出一个回答(长度为N),其实该过程中执行了N次推理过程。即GPT类模型一次推理只输出一个token,输出token会与输入tokens 拼接在一起,然后作为下一次推理的输入,这样不断反复直到遇到终止符。

如上描述是我们通常认知的GPT推理过程。代码描述如下:

import torch
from transformers import GPT2LMHeadModel, GPT2Tokenizer


model = GPT2LMHeadModel.from_pretrained("gpt2", torchscript=True).eval()

# tokenizer
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
in_text = "Lionel Messi is a"
in_tokens = torch.tensor(tokenizer.encode(in_text))

# inference
token_eos = torch.tensor([198]) # line break symbol
out_token = None
i = 0
with torch.no_grad():
    while out_token != token_eos:
        logits, _ = model(in_tokens)
        out_token = torch.argmax(logits[-1, :], dim=0, keepdim=True)
        in_tokens = torch.cat((in_tokens, out_token), 0)
        text = tokenizer.decode(in_tokens)
        print(f'step {i} input: {text}', flush=True)
      
<think>嗯,用户让我介绍一下vllm的压测命令,特别是用random和sharegpt的情况。首先,我需要确认自己是否了解这两个压测工具的具体用法。vllm是一个高性能的推理服务框架,对吧?压测通常指的是压力测试,用来评估系统在高负载下的表现。 然后,用户提到的random和sharegpt可能是两种不同的压测方式。random可能是指生成随机的请求来模拟不同的输入,而sharegpt可能是指使用ShareGPT数据集中的真实对话数据进行测试。需要确认这两个参数在vllm中的具体使用方式。 接下来,我应该回忆一下vllm的文档或者官方资料,看是否有关于压测的命令示例。记得vllm可能提供了benchmarking的工具或者脚本,比如使用Python的requests库发送并发请求,或者使用像locust这样的压测工具。但用户可能希望直接用vllm自带的命令,所以可能需要查看是否有相关的命令行参数。 对于random压测,可能的命令是使用--request-rate或者指定输入为随机生成的数据。例如,使用vllm的generate命令,并指定输入为随机生成的token,调整参数如并发数、请求速率等。而sharegpt压测可能需要加载ShareGPT格式的数据集,转换成适合vllm输入的格式,比如JSON,然后通过工具进行并发请求。 需要确保命令中的参数正确,比如模型路径、tensor并行度、端口号等。另外,要提醒用户注意数据集路径的正确性,以及调整并发数、请求速率等参数以适应不同的硬件环境。可能还需要提到如何监控性能指标,如吞吐量、延迟等。 还有,用户可能对具体的示例命令比较感兴趣,需要给出两个具体的例子,分别对应random和sharegpt的情况。例如,对于random,可能使用--input-lens参数指定输入长度范围,而sharegpt则使用--dataset参数指定数据集路径。 最后,要检查是否有常见的注意事项,比如依赖安装、数据格式处理、性能调优建议等,确保用户能够顺利执行压测命令并获取有效结果。同时,需要确认是否所有提到的命令和参数在最新版本的vllm中仍然适用,避免给出过时的信息。</think>以下是对vLLM压测中random模式与ShareGPT数据集压测的详细介绍及操作指南: --- ### **一、vLLM压测核心逻辑** vLLM压测主要通过模拟多用户并发请求,测试服务端的吞吐量(tokens/s)和延迟(latency)指标。关键参数包括: - 并发数(`--concurrency`) - 请求速率(`--request-rate`) - 输入/输出长度(`--input-lens`/`--output-lens`) --- ### **二、Random模式压测** **场景**:生成随机输入内容,测试模型基础性能 **命令示例**: ```bash python -m vllm.entrypoints.openai.api_server \ --model <模型路径> \ --tensor-parallel-size <GPU数量> \ --port 8000 # 启动压测 python benchmarks/benchmark_serving.py \ --backend vllm \ --random \ --input-lens 128,512 \ # 输入长度范围 --output-lens 64,256 \ # 输出长度范围 --concurrency 50 \ # 并发请求数 --request-rate 100 # 每秒请求数 ``` **关键参数说明**: - `--random`:启用随机内容生成 - `--input-lens`:随机选择输入长度(最小值,最大值) - `--output-lens`:随机限制输出长度(最小值,最大值) --- ### **三、ShareGPT数据集压测** **场景**:使用真实对话数据测试模型性能 **数据集准备**: 1. 下载ShareGPT格式数据集(JSONL文件) 2. 转换为vLLM兼容格式: ```python import json with open("sharegpt_data.json", "w") as f: for dialog in original_data: f.write(json.dumps({"messages": dialog}) + "\n") ``` **压测命令**: ```bash python benchmarks/benchmark_serving.py \ --backend vllm \ --dataset sharegpt_data.json \ # 数据集路径 --concurrency 100 \ --request-rate 200 \ --max-num-completed-requests 5000 # 最大测试请求量 ``` --- ### **四、性能指标解读** | 指标 | 计算公式 | 优化方向 | |------|----------|----------| | 吞吐量 | $\frac{\text{总生成token数}}{\text{测试时间}}$ | 增加batch_size | | 延迟 | $\text{请求完成时间} - \text{请求发起时间}$ | 优化KV cache | --- ### **五、注意事项** 1. GPU显存建议:至少预留20%显存余量 2. 数据预处理:ShareGPT数据集需过滤过长对话(可设置`--max-prompt-length 2048`) 3. 压测结果保存:添加`--result-file output.json`参数保存测试结果 通过调整并发数和请求速率,可以绘制出系统的吞吐量-延迟曲线,找到最佳负载平衡点。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux基金会AI&Data基金会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值