[Bug]: topk=1 and temperature=0 在 vllm 中导致不同的输出

j13ufse2  于 6个月前  发布在  其他
关注(0)|答案(8)|浏览(51)

🐛 描述bug

在使用不同的生成配置时,例如 top_k=1 或 temperature=0(同时保持其他设置不变),为什么生成的结果会发生变化?它们应该都对应于确定性贪婪解码。
vllm 0.4.3
补充:
在这里遇到的主要问题是,将温度系数设置为0或topk设置为1产生的结果不同。我理解这是由于算子优化以及浮点数中缺乏传统算术属性,矩阵操作具有一定的随机性。然而,采样过程发生在隐藏状态生成之后,此时不涉及任何计算。因此,两个采样参数的采样结果应该是相同的。

nzrxty8p

nzrxty8p1#

你好,
我看到即使将温度设置为0,对于相同的提示也会出现不同的结果。完整的采样参数是:

SamplingParams(n=1, best_of=1, presence_penalty=0.0, frequency_penalty=0.0, repetition_penalty=1.0, temperature=0.0, top_p=0, top_
k=1, min_p=0.0, seed=None, use_beam_search=False, length_penalty=1.0, early_stopping=False, stop=[], stop_token_ids=[], include_stop_str_in_output=False, ignore_eos=False, max_tokens=128, min_tokens=0, logprobs=1, prompt_logp
robs=1, skip_special_tokens=True, spaces_between_special_tokens=True, truncate_prompt_tokens=None)

版本刚刚更新到v0.4.3。

a11xaf1n

a11xaf1n2#

我正在调查这个问题。通过运行examples/offline_inference.py并使用以下输入:
sampling_params = SamplingParams(temperature=0.0, max_tokens=10)
llm = LLM(model="meta-llama/Meta-Llama-3-8B")
发现了bug,但只有在向输入批次中添加/删除提示时才会出现bug。在较旧的版本(v0.3.3、v0.4.2、v0.4.3)中也看到了相同的行为。
参考输出:
来自第一批次的提示:'Hello, my name is',生成的文本:" and I'm writing you today to learn more about"
来自第一批次的提示:'The capital of France is',生成的文本:' Paris, which is located in the north of the'
VS
来自第二批次的提示:'Hello, my name is',生成的文本:" and I'm writing you today to learn more about"
来自第二批次的提示:'The capital of France is',生成的文本:' Paris. It is located in the north of the'
来自第二批次的提示:'The future of AI is',生成的文本:' here, and it’s already changing the way we'

first_sampling_result = [
   [([323], [0]), ([12366], [0])],
   [([358], [0]), ([11], [0])],
   [([2846], [0]), ([902], [0])],
   [([4477], [0]), ([374], [0])],
   [([499], [0]), ([7559], [0])],
   [([3432], [0]), ([304], [0])],
   [([311], [0]), ([279], [0])],
   [([4048], [0]), ([10411], [0])],
   [([810], [0]), ([315], [0])], 
   [([922], [0]), ([279], [0])]
]

second_sampling_resuilt = [
   [([323], [0]), ([12366], [0]), ([1618], [0])],
   [([358], [0]), ([13], [0]), ([11], [0])],
   [([2846], [0]), ([1102], [0]), ([323], [0])],
   [([4477], [0]), ([374], [0]), ([433], [0])],
   [([499], [0]), ([7559], [0]), ([753], [0])],
   [([3432], [0]), ([304], [0]), ([2736], [0])],
   [([311], [0]), ([279], [0]), ([10223], [0])],
   [([4048], [0]), ([10411], [0]), ([279], [0])],
   [([810], [0]), ([315], [0]), ([1648], [0])],
   [([922], [0]), ([279], [0]), ([584], [0])]
]
mspsb9vt

mspsb9vt3#

当我进入$x_{1m0n1}^{x}$代码并检查$x_{1m1n1}^{x}$时,所有字段看起来都如预期。在采样阶段之前,将进一步调查模型输出。

$x_{1a0b1}^{x}$

2eafrhcq

2eafrhcq4#

是否有任何脚本可以用于重现此问题?
我已调查了 #5607,它似乎与之相关,但经过一些挖掘后,该错误似乎与某些请求中存在 repetition_penalty 有关,而其他请求则没有。在这种情况下似乎并非如此。

wwodge7n

wwodge7n5#

我认为 #5607 解决了另一个问题。在比较温度缩放前后的logits之后,我意识到零温度错误地被重新分配给了1.0。它应该是 temperature = _SAMPLING_EPS 而不是。
https://github.com/vllm-project/vllm/blob/main/vllm/model_executor/sampling_metadata.py#L359-L363

mftmpeh8

mftmpeh86#

我认为 #5607 解决了另一个问题。在比较温度缩放前后的logits后,我发现零温度错误地被重新分配给了1.0。它应该是 temperature = _SAMPLING_EPS 而不是。
https://github.com/vllm-project/vllm/blob/main/vllm/model_executor/sampling_metadata.py#L359-L363
我认为这几行代码很可能与这个问题有关,但是否应该将温度设置为 _SAMPLING_EPS 还有待解决。我很快测试了这个修改,不幸的是,发现解码结果变成了无意义的输出。

o7jaxewo

o7jaxewo7#

🐛 描述bug

在使用不同的生成配置时,例如 top_k=1 或 temperature=0(同时保持其他设置不变),为什么生成的结果会发生变化?它们应该都对应于确定性贪婪解码。vllm 0.4.3
补充:
这里遇到的主要问题是,将温度系数设置为0或topk设置为1所产生的结果不同。我理解这是由于算子优化以及浮点数中缺乏传统算术属性所导致的,矩阵操作具有一定的随机性。然而,采样过程发生在生成隐藏状态之后,此时不涉及任何计算。因此,两个采样参数的采样结果应该是相同的。
你好,@rangehow,请问你使用哪个模型产生了这个bug?
最近,当我为一个GPTQ量化模型设置 top_k=1(或 temperature=0)时,遇到了相同的不一致行为。我深入研究了中间输出,发现与 sampling_metadata 无关,而是与 hidden_state 有关。对于相同的提示,logits_procesorhidden_state 输入已经略有不同。
然而,当我使用非量化的 fp16(bf16)模型时,无法重现这个bug。

kqqjbcuj

kqqjbcuj8#

🐛 描述bug

在使用不同的生成配置时,例如 top_k=1 或 temperature=0(同时保持其他设置不变),为什么生成的结果会发生变化?它们应该都对应于确定性贪婪解码。vllm 0.4.3
补充:
这里遇到的主要问题是,将温度系数设置为0或topk设置为1所产生的结果不同。我理解这是由于算子优化以及浮点数中缺乏传统算术属性所导致的,矩阵操作具有一定的随机性。然而,采样过程发生在隐藏状态生成之后,此时不涉及任何计算。因此,两个采样参数的采样结果应该是相同的。
你好,@rangehow,请问你使用哪个模型产生了这个bug?
最近,当我为一个GPTQ量化模型设置 top_k=1(或 temperature=0)时,遇到了相同的不一致行为。我深入研究了中间输出,发现与 sampling_metadata 无关,而是与 hidden_state 有关。对于相同的提示,logits_procesorhidden_state 输入已经略有不同。
然而,当我使用非量化的 fp16(bf16)模型时,无法重现这个bug。
gemma-2b 😃

相关问题