vllm-project / vllm

A high-throughput and memory-efficient inference and serving engine for LLMs
https://docs.vllm.ai
Apache License 2.0
26.09k stars 3.82k forks source link

[Bug]: VLLM's output is unstable when handling requests CONCURRENTLY. #4112

Open zhengwei-gao opened 4 months ago

zhengwei-gao commented 4 months ago

Your current environment

using lastest docker images: command: docker run --runtime nvidia --gpus all -v /mnt_1/models:/models -p 8000:8000 --ipc=host vllm/vllm-openai:latest --model /models/Qwen/Qwen1.5-14B-Chat --served-model-name Qwen --gpu-memory-utilization 0.99 --max-model-len 8192 --tensor-parallel-size 1 --seed 42

🐛 Describe the bug

I generated 10 results concurrently by following code. But I got different results with temperate= 0 eventhough most of them are the same.

from langchain.llms.openai import OpenAI
import multiprocessing

llm = OpenAI(
    openai_api_key="EMPTY",
    openai_api_base="http://127.0.0.1:8000/v1",
    model_name="Qwen",
    temperature=0,
    max_tokens=1024,
    stop=['<|im_end|>', '<|im_start|>', '<|endoftext|>'],
)

prompt_template = \
"""<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
{query}<|im_end|>
<|im_start|>assistant
"""

def main(prompt):
    return llm(prompt)

if __name__ == '__main__':
    # results from concurrent requests are unstable
    prompt = prompt_template.format_map({'query': '写500字关于富春山居图的文章。'})
    with multiprocessing.Pool(10) as pool:
        res = pool.map(main, [prompt]*10)
    for i, x in enumerate(res):
        print(f'==={i}===')
        print(x)

following are the printed results:

===0===
《富春山居图》,是中国十大传世名画之一,是元代大画家黄公望的代表作,堪称中国绘画史上的瑰宝。这幅画作以其独特的艺术魅力,跨越了近七百年的历史长河,至今仍熠熠生辉。

富春山居图以浙江富春江两岸的秀美山水为背景,展现了黄公望晚年隐居生活的恬淡与宁静。画面中,山峦叠嶂,江水潺潺,云雾缭绕,仿佛将人带入一个世外桃源。黄公望以精细的笔触,描绘出山石的肌理,树木的疏密,以及水波的荡漾,展现了他对自然的深刻理解和精湛的绘画技艺。每一道线条,每一片色彩,都蕴含着他对生活的感悟和对自然的敬畏。

这幅画不仅是地理的写照,更是精神的寄托。它承载了黄公望的隐逸情怀,以及对人与自然和谐共生的哲学思考。它以艺术的形式,传递出一种超脱世俗的宁静之美,让人在欣赏中感受到一种心灵的净化和升华。

富春山居图的流失与回归,更增添了其历史的厚重感。历经战火与沧桑,它最终在两岸人民的共同努力下重归故土,象征着民族团结与文化认同的力量。如今,它静静地陈列在博物馆中,成为连接过去与现在,艺术与历史的桥梁,继续讲述着中国传统文化的故事,激发着人们对美的追求和对和谐生活的向往。

===1===
《富春山居图》,是中国十大传世名画之一,是元代大画家黄公望的代表作,堪称中国绘画史上的瑰宝。这幅画作以其独特的艺术魅力,跨越了近七百年的历史长河,至今仍熠熠生辉。

富春山居图以浙江富春江两岸的秀美山水为背景,展现了黄公望晚年隐居生活的恬淡与宁静。画面中,山峦叠嶂,江水潺潺,云雾缭绕,仿佛将人带入一个世外桃源。黄公望以精细的笔触,描绘出山石的肌理,树木的疏密,以及水波的荡漾,展现了他对自然的深刻理解和精湛的绘画技艺。每一道线条,每一片色彩,都蕴含着他对生活的感悟和对自然的敬畏。

这幅画不仅是地理的写照,更是精神的寄托。它承载了黄公望的隐逸情怀,以及对人与自然和谐共生的哲学思考。它以艺术的形式,传递出一种超脱世俗的宁静之美,让人在欣赏中感受到一种心灵的净化和升华。

富春山居图的流失与回归,更增添了其历史的厚重感。历经战火与沧桑,它最终在两岸人民的共同努力下重归故土,象征着民族团结与文化认同的力量。如今,它静静地陈列在博物馆中,成为连接过去与现在,艺术与历史的桥梁,继续讲述着中国传统文化的故事,激发着人们对美的追求和对和谐生活的向往。

===2===
《富春山居图》,是中国十大传世名画之一,是元代大画家黄公望的代表作,堪称中国绘画史上的瑰宝。这幅画作以其独特的艺术魅力,跨越了近七百年的历史长河,至今仍熠熠生辉。

富春山居图以浙江富春江两岸的秀美山水为背景,展现了黄公望晚年隐居生活的恬淡与宁静。画面中,山峦叠嶂,江水潺潺,云雾缭绕,仿佛将人带入一个世外桃源。黄公望以精细的笔触,描绘出山石的肌理,树木的疏密,以及水波的荡漾,展现了他对自然的深刻理解和精湛的绘画技艺。每一道线条,每一片色彩,都蕴含着他对生活的感悟和对自然的敬畏。

这幅画不仅是地理的写照,更是精神的寄托。它承载了黄公望的隐逸情怀,以及对人与自然和谐共处的理想。它以艺术的形式,传递出一种超脱世俗的宁静之美,让人在欣赏中感受到一种心灵的净化和升华。

然而,富春山居图的命运也颇为坎坷。原作《无用师卷》和《剩山图》曾因战乱而分离,历经磨难,如今虽已合璧,但其背后的故事更增添了这幅画作的历史厚重感。它提醒我们,艺术不仅是视觉的享受,更是历史的见证,文化的传承。

富春山居图,以其独特的艺术价值和深远的历史意义,成为中国乃至世界艺术宝库中的一颗璀璨明珠,激发着后人对传统艺术的热爱与传承,也让我们对生活、对自然有了更深的思考。

===3===
《富春山居图》,是中国十大传世名画之一,是元代大画家黄公望的代表作,堪称中国绘画史上的瑰宝。这幅画作以其独特的艺术魅力,跨越了近七百年的历史长河,至今仍熠熠生辉。

富春山居图以浙江富春江两岸的秀美山水为背景,展现了黄公望晚年隐居生活的恬淡与宁静。画面中,山峦叠嶂,江水潺潺,云雾缭绕,仿佛将人带入一个世外桃源。黄公望以精细的笔触,描绘出山石的肌理,树木的疏密,以及水波的荡漾,展现了他对自然的深刻理解和精湛的绘画技艺。每一道线条,每一片色彩,都蕴含着他对生活的感悟和对自然的敬畏。

这幅画不仅是地理的写照,更是精神的寄托。它承载了黄公望的隐逸情怀,以及对人与自然和谐共生的哲学思考。它以艺术的形式,传递出一种超脱世俗的宁静之美,让人在欣赏中感受到一种心灵的净化和升华。

富春山居图的流失与回归,更增添了其历史的厚重感。历经战火与沧桑,它最终在两岸人民的共同努力下重归故土,象征着民族团结与文化认同的力量。如今,它静静地陈列在博物馆中,成为连接过去与现在,艺术与历史的桥梁,继续讲述着中国传统文化的故事,激发着人们对美的追求和对和谐生活的向往。

===4===
《富春山居图》,是中国十大传世名画之一,是元代大画家黄公望的代表作,堪称中国绘画史上的瑰宝。这幅画作以其独特的艺术魅力,跨越了近七百年的历史长河,至今仍熠熠生辉。

富春山居图以浙江富春江两岸的秀美山水为背景,展现了黄公望晚年隐居生活的恬淡与宁静。画面中,山峦叠嶂,江水潺潺,云雾缭绕,仿佛将人带入一个世外桃源。黄公望以精细的笔触,描绘出山石的肌理,树木的疏密,以及水波的荡漾,展现了他对自然的深刻理解和精湛的绘画技艺。每一道线条,每一片色彩,都蕴含着他对生活的感悟和对自然的敬畏。

这幅画不仅是地理的写照,更是精神的寄托。它承载了黄公望的隐逸情怀,以及对人与自然和谐共生的哲学思考。它以艺术的形式,传递出一种超脱世俗的宁静之美,让人在欣赏中感受到一种心灵的净化和升华。

富春山居图的流失与回归,更增添了其历史的厚重感。历经战火与沧桑,它最终在两岸人民的共同努力下重归故土,象征着民族团结与文化认同的力量。如今,它静静地陈列在博物馆中,成为连接过去与现在,艺术与历史的桥梁,继续讲述着中国传统文化的故事,激发着人们对美的追求和对和谐生活的向往。

===5===
《富春山居图》,是中国十大传世名画之一,是元代大画家黄公望的代表作,堪称中国绘画史上的瑰宝。这幅画作以其独特的艺术魅力,跨越了近七百年的历史长河,至今仍熠熠生辉。

富春山居图以浙江富春江两岸的秀美山水为背景,展现了黄公望晚年隐居生活的恬淡与宁静。画面中,山峦叠嶂,江水潺潺,云雾缭绕,仿佛将人带入一个世外桃源。黄公望以精细的笔触,描绘出山石的肌理,树木的疏密,以及水波的荡漾,展现了他对自然的深刻理解和精湛的绘画技艺。每一道线条,每一片色彩,都蕴含着他对生活的感悟和对自然的敬畏。

这幅画不仅是地理的写照,更是精神的寄托。它承载了黄公望的隐逸情怀,以及对人与自然和谐共生的哲学思考。它以艺术的形式,传递出一种超脱世俗的宁静之美,让人在欣赏中感受到一种心灵的净化和升华。

富春山居图的流失与回归,更增添了其历史的厚重感。历经战火与沧桑,它最终在两岸人民的共同努力下重归故土,象征着民族团结与文化认同的力量。如今,它静静地陈列在博物馆中,成为连接过去与现在,艺术与历史的桥梁,继续讲述着中国传统文化的故事,激发着人们对美的追求和对和谐生活的向往。

===6===
《富春山居图》,是中国十大传世名画之一,是元代大画家黄公望的代表作,堪称中国绘画史上的瑰宝。这幅画作以其独特的艺术魅力,跨越了近七百年的历史长河,至今仍熠熠生辉。

富春山居图以浙江富春江两岸的秀美山水为背景,展现了黄公望晚年隐居生活的恬淡与宁静。画面中,山峦叠嶂,江水潺潺,云雾缭绕,仿佛将人带入一个世外桃源。黄公望以精细的笔触,描绘出山石的肌理,树木的疏密,以及水波的荡漾,展现了他对自然的深刻理解和精湛的绘画技艺。每一道线条,每一片色彩,都蕴含着他对生活的感悟和对自然的敬畏。

这幅画不仅是地理的写照,更是精神的寄托。它承载了黄公望的隐逸情怀,以及对人与自然和谐共处的理想。它以艺术的形式,传递出一种超脱世俗的宁静之美,让人在欣赏中感受到一种心灵的净化和升华。

然而,富春山居图的命运也颇为坎坷。原作《无用师卷》和《剩山图》曾因战乱而分离,历经磨难,如今虽已合璧,但其背后的故事更增添了这幅画作的历史厚重感。它提醒我们,艺术不仅是视觉的享受,更是历史的见证,文化的传承。

富春山居图,以其独特的艺术价值和深远的历史意义,成为中国乃至世界艺术宝库中的一颗璀璨明珠,激发着后人对传统艺术的热爱与传承,也让我们对生活、对自然有了更深的思考。

===7===
《富春山居图》,是中国十大传世名画之一,是元代大画家黄公望的代表作,堪称中国绘画史上的瑰宝。这幅画作以其独特的艺术魅力,跨越了近七百年的历史长河,至今仍熠熠生辉。

富春山居图以浙江富春江两岸的秀美山水为背景,展现了黄公望晚年隐居生活的恬淡与宁静。画面中,山峦叠嶂,江水潺潺,云雾缭绕,仿佛将人带入一个世外桃源。黄公望以精细的笔触,描绘出山石的肌理,树木的疏密,以及水波的荡漾,展现了他对自然的深刻理解和精湛的绘画技艺。每一道线条,每一片色彩,都蕴含着他对生活的感悟和对自然的敬畏。

这幅画不仅是地理的写照,更是精神的寄托。它承载了黄公望的隐逸情怀,以及对人与自然和谐共生的哲学思考。它以艺术的形式,传递出一种超脱世俗的宁静之美,让人在欣赏中感受到一种心灵的净化和升华。

富春山居图的流失与回归,更增添了其历史的厚重感。历经战火与沧桑,它最终在两岸人民的共同努力下重归故土,象征着民族团结与文化认同的力量。如今,它静静地陈列在博物馆中,成为连接过去与现在,艺术与历史的桥梁,继续讲述着中国传统文化的故事,激发着人们对美的追求和对和谐生活的向往。

===8===
《富春山居图》,是中国十大传世名画之一,是元代大画家黄公望的代表作,堪称中国绘画史上的瑰宝。这幅画作以其独特的艺术魅力,跨越了近七百年的历史长河,至今仍熠熠生辉。

富春山居图以浙江富春江两岸的秀美山水为背景,展现了黄公望晚年隐居生活的恬淡与宁静。画面中,山峦叠嶂,江水潺潺,云雾缭绕,仿佛将人带入一个世外桃源。黄公望以精细的笔触,描绘出山石的肌理,树木的疏密,以及水波的荡漾,展现了他对自然的深刻理解和精湛的绘画技艺。每一道线条,每一片色彩,都蕴含着他对生活的感悟和对自然的敬畏。

这幅画不仅是地理的写照,更是精神的寄托。它承载了黄公望的隐逸情怀,以及对人与自然和谐共生的哲学思考。它以艺术的形式,传递出一种超脱世俗的宁静之美,让人在欣赏中感受到一种心灵的净化和升华。

富春山居图的流失与回归,更增添了其历史的厚重感。历经战火与沧桑,它最终在两岸人民的共同努力下重归故土,象征着民族团结与文化认同的力量。如今,它静静地陈列在博物馆中,成为连接过去与现在,艺术与历史的桥梁,继续讲述着中国传统文化的故事,激发着人们对美的追求和对和谐生活的向往。

===9===
《富春山居图》,是中国十大传世名画之一,是元代大画家黄公望的代表作,堪称中国绘画史上的瑰宝。这幅画作以其独特的艺术魅力,跨越了近七百年的历史长河,至今仍熠熠生辉。

富春山居图以浙江富春江两岸的秀美山水为背景,展现了黄公望晚年隐居生活的恬淡与宁静。画面中,山峦叠嶂,江水潺潺,云雾缭绕,仿佛将人带入一个世外桃源。黄公望以精细的笔触,描绘出山石的肌理,树木的疏密,以及水波的荡漾,展现了他对自然的深刻理解和精湛的绘画技艺。每一道线条,每一片色彩,都蕴含着他对生活的感悟和对自然的敬畏。

这幅画不仅是地理的写照,更是精神的寄托。它承载了黄公望的隐逸情怀,以及对人与自然和谐共生的哲学思考。它以艺术的形式,传递出一种超脱世俗的宁静之美,让人在欣赏中感受到一种心灵的净化和升华。

富春山居图的流失与回归,更增添了其历史的厚重感。历经战火与沧桑,它最终在两岸人民的共同努力下重归故土,象征着民族团结与文化认同的力量。如今,它静静地陈列在博物馆中,成为连接过去与现在,艺术与历史的桥梁,继续讲述着中国传统文化的故事,激发着人们对美的追求和对和谐生活的向往。
beam-me-up-scotchy commented 4 months ago

This seems to be the same issues as #4091 that I posted yesterday, and #1182 that was previously closed. Any advice or fixes to make results deterministic when doing concurrent API calls would be appreciated!

merlinarer commented 4 months ago

I also met this issue with latest version

Kaotic3 commented 4 months ago

Also seeing this issue.

Can I also add that this is a fundamentally breaking problem.

Not being able to send more than 1 request to vLLM at a time renders it pretty much unusable in almost all circumstances. This is a massive breaking bug and really should be pretty high priority to diagnose and fix.

The whole strength of vLLM is its ability to handle multiple requests that is what makes it pretty damn awesome - but here we are in a position where we can't send it multiple requests.

njhill commented 4 months ago

This is expected behaviour. Effective ordering of floating point operations varies when particular sequences are batched differently. Internally, different algs are used for the matmul operations depending on the batch size, etc. Though mathematically equivalent it causes differences due to the limited precision .. floating point multiplication is not associative. The differences become more likely the more output tokens you generate (because the "errors" accumulate). Once a difference token is chosen it's almost certain to diverge.

You can reduce the variability by using float16 rather than bfloat16 (pass --dtype=float16). You could also try float32 which should be even more stable but will require double the memory and the performance might be worse.

Kaotic3 commented 4 months ago

That doesn't make sense.

I can send the same thing over and over and over again and get exactly the same result, if I do it one at a time.

Why would concurrent change the values but sending at different times doesn't?

If there was a discrepancy built into the mathematical interpretation of floating point numbers - then you would expect non-determinism whenever you made calls - you would just expect some of them to be different.

We have run 100s and they are always 100% the same unless we do it concurrently.

Edit:

Even if you are right - and the answer is, well the 100s of runs you did individually were insufficient to see the floating point discrepancy, but it is there, you would just need to run 1,000s of individual runs....

Great - but why then is it immediately visible when doing concurrency?

If it is a 1/1,000 individually - why is it 1/2 for concurrency?

There must be something else going on.

whyiug commented 4 months ago

Vote for this issue. it's very important. In my case, the input token is very long (let's say 1000) and only one token is output. different results may also be returned in different requests when the concurrency is high.