使用OpenAI客户端对vLLM进行pytest并行攻击。在A100上运行这些模型,70b和cabybara ares在4A100 80GB上,Mixtral在2A100 80GB上。
例如,对于70b,我们运行:
python -m vllm.entrypoints.openai.api_server \
--port=5000 \
--host=0.0.0.0 \
--model=h2oai/h2ogpt-4096-llama2-70b-chat \
--tokenizer=hf-internal-testing/llama-tokenizer \
--tensor-parallel-size=4 \
--seed 1234 \
--trust-remote-code \
--max-num-batched-tokens 8192 \
--download-dir=/workspace/.cache/huggingface/hub
或者对于Mistral 7b v0.2:
python -m vllm.entrypoints.openai.api_server \
--port=5004 \
--host=0.0.0.0 \
--model=mistralai/Mistral-7B-Instruct-v0.2 \
--tensor-parallel-size=1 \
--seed 1234 \
--trust-remote-code \
--max-num-batched-tokens 131072 \
--download-dir=/workspace/.cache/huggingface/hub
也就是说,高批量。
或者对于Mixtral:
python -m vllm.entrypoints.openai.api_server \
--port=5002 \
--host=0.0.0.0 \
--model mistralai/Mixtral-8x7B-Instruct-v0.1 \
--seed 1234 \
--tensor-parallel-size=2 \
--max-num-batched-tokens=163840 \
--max-log-len=100
同样具有很高的批量大小。
然而,尽管并发增加导致每秒的令牌数降低是可以理解的,但最令人担忧的是首次获得令牌所需的时间以及有多少请求“不幸”地需要花费甚至长达250秒才能获得第一个令牌。
能否修改vLLM以便我们可以在吞吐量与公平性之间取得平衡?一般来说,我认为在高并发情况下,公平性比总吞吐量更为重要。
以下是一些结果。代码不太好看,但我可以在请求时分享。
vllmstress2_0_1000_0_4096.csv.final.clean.csv
代码丑陋且提示并不完全适用于该模型,但您可以得到大致的想法。我已删除实际IP地址:
stress_vllm_github.py.zip
8条答案
按热度按时间j9per5c41#
这是一个关于$31744$个令牌进入Mixtral的另一个例子。对于一些"用户"来说,第一个令牌到达的时间相当糟糕。
$x_1^{c_0}d_1^x$
nhhxz33t2#
FYI @sh1ng
rkttyhzu3#
你好,@pseudotensor。
我还没有检查你的代码,但想先添加一些小建议。
我得到了以下结果:
js5cn81o4#
你能帮我理解这些结果吗?它们与我分享的内容有什么比较?对于12或200个"请求速率",你得到的大约最坏的情况是TTFT在256秒到382秒之间,这真的很糟糕,对吧?
P99可能不是最好的度量标准,因为如果它主要是顺序回填,那么它根本不是一个统计问题,而是一个固定的问题,后面的请求会滞后。
vbkedwbf5#
@pseudotensor 添加了
request-rate=3
,这是可以处理我的2个 RTX 3090 的最大值。--request-rate
仅控制我们发送负载的速度有多快。request-rate
增加时,性能没有降低(通过请求/秒、令牌/秒衡量)。vLLM不会堵塞,可以在某个时刻处理所有请求。gets increased. If we send 1k requests almost instantly (
--request-rate=200`),当以2.3 req/sec的速度处理它时,总时间为约434秒(与TTFT相同顺序)。我注意到有时GPU负载不足。
这令人担忧。
我同意,从最终用户的Angular 来看,TTFT是一个非常重要的指标,尤其是当我们将要处理超长的提示时。
von4xj4u6#
如何使用vllm计算每秒的第一个标记和生成标记的时间?
mwngjboj7#
如果我的请求速率是x,这意味着我一次发送了x个请求。LML服务器是否会接收到一批x个请求?
如果不是这样,那么我如何以异步方式发送一批请求?
pgpifvop8#
@rbgo404 这个
--scheduler-delay-factor
功能对于确保更多请求作为一批处理非常有用,通过在调度中添加一个小的延迟。我不确定这是否对收到的第一个请求有效,因为延迟与之前请求的延迟成正比,但即使它在第一个请求上无效,对于一个长时间运行的服务器来说,可以摊销掉,不会有影响。