Yi icon indicating copy to clipboard operation
Yi copied to clipboard

用 VLLM 加载 Yi-34B-Chat-4bits-GPTQ, 模型有时不停地输出空字串而不停止

Open zhanghx0905 opened this issue 1 year ago • 7 comments

sampling params: SamplingParams(n=1, best_of=1, presence_penalty=0.0, frequency_penalty=0.0, repetition_penalty=1.0, temperature=0.7, top_p=1.0, top_k=-1, min_p=0.0, use_beam_search=False, length_penalty=1.0, early_stopping=False, stop=[], stop_token_ids=[7], include_stop_str_in_output=False, ignore_eos=False, max_tokens=3736, logprobs=None, prompt_logprobs=None, skip_special_tokens=True, spaces_between_special_tokens=True)

在v100 32GB上运行,启动脚本为

CUDA_VISIBLE_DEVICES=2,3 python \
    -m vllm.entrypoints.openai.api_server \
    --model="../models/Yi-34B-Chat-4bits-GPTQ" \
    --dtype half --port 8080 --served-model-name Yi-34B-Chat-4bits-GPTQ

image 在多轮对话之后出现,服务端不停输出token而不正常停止

zhanghx0905 avatar Dec 27 '23 02:12 zhanghx0905

这是某次引发问题的prompt:

<|im_start|>system\n你的使命是协助公司员工高效完成工作。现在,请开始你的工作。\n<|im_end|>\n<|im_start|>user\n为什么你有时会卡住<|im_end|>\n<|im_start|>assistant\n作为一个人工智能,我有时可能会遇到以下情况导致"卡住":\n\n1. 数据限制:我处理问题的能力受到训练数据集的限制。如果我在某个话题上训练的数据不足,那么我在回答相关问题时可能会遇到困难。\n\n2. 计算资源不足:处理复杂的任务需要大量的计算资源。如果我的服务器资源不足,可能会导致我在处理某些请求时速度变慢或者无法及时响应。\n\n3. 算法限制:我的算法本身可能存在一些限制,这可能会影响我在某些情况下提供准确或完整答案的能力。\n\n4. 网络问题:我依赖于网络连接与用户进行交互。如果网络连接不稳定或速度慢,那么用户的体验可能会受到影响,出现卡顿现象。\n\n5. 用户输入问题:如果用户的问题不清楚或需要更详细的信息,我可能需要更多的时间来理解并提供准确的答案,这可能会导致看起来像是"卡住"的情况。\n\n为了减少这些情况的发生,我的研发团队不断地进行算法优化、数据扩充和资源扩充,以确保我能够更加流畅和准确地回答用户的问题。<|im_end|>\n<|im_start|>user\n你是谁<|im_end|>\n<|im_start|>assistant\n

zhanghx0905 avatar Dec 27 '23 02:12 zhanghx0905

在多轮对话之后出现,服务端不停输出token而不正常停止

在多轮对话之后出现,可以稳定复现吗?

我觉得我们可以先尝试排除是否是 vllm 的问题,建议使用 https://huggingface.co/TheBloke/Yi-34B-Chat-GPTQ#example-python-code 这种推理方式复现这个问题

xffxff avatar Dec 27 '23 06:12 xffxff

在多轮对话之后出现,服务端不停输出token而不正常停止

在多轮对话之后出现,可以稳定复现吗?

我觉得我们可以先尝试排除是否是 vllm 的问题,建议使用 https://huggingface.co/TheBloke/Yi-34B-Chat-GPTQ#example-python-code 这种推理方式复现这个问题

用 https://huggingface.co/TheBloke/Yi-34B-Chat-GPTQ#example-python-code 这种推理方式回答效果正常。但对vllm的openai server发请求,几次就能试出问题。

curl -X 'POST' \
  'http://10.223.48.160:30002/v1/chat/completions' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "model": "Yi-34B-Chat-4bits-GPTQ",
  "messages": [
    {"role": "system", "content": "你是XXX,由XXX集团的研发团队独立开发的大语言模型,你的使命是协助公司员工高效完成工作。现在,请开始你的工作。"},
    {"role": "user", "content": "你好吗"},
    {"role": "assistant", "content": "我很好,谢谢你的关心。我准备随时协助你解答问题或完成任务。请问你有任何具体的问题或者需要帮助的地方吗?"},
    {"role": "user", "content": "好尼玛"},
    {"role": "assistant", "content": "很好,很高兴听到你状态良好。如果你在工作中遇到问题或者需要帮助,请随时提问。我会尽力提供帮助。"},
    {"role": "user", "content": "哈哈哈"},
    {"role": "assistant", "content": "看起来你似乎很开心。如果你想要分享更多关于你的工作、生活中的积极经历,或者需要建议和指导,请随时告诉我。我会在力所能及的范围内提供帮助。"},
    {"role": "user", "content": "呵呵呵呵呵"}
  ],
  "temperature": 0.7,
  "top_p": 1,
  "n": 1,
  "max_tokens": 1024,
  "stream": true,
  "presence_penalty": 0,
  "frequency_penalty": 0,
  "user": "string",
  "best_of": 1,
  "top_k": -1,
  "ignore_eos": false,
  "use_beam_search": false,
  "stop_token_ids": [
    7
  ],
  "skip_special_tokens": true,
  "spaces_between_special_tokens": true,
  "add_generation_prompt": true,
  "echo": false,
  "repetition_penalty": 1,
  "min_p": 0
}

卡住之后,实际上server在不停的输出空格,直到某一时刻停下。看起来是vllm openai server的问题? image

zhanghx0905 avatar Dec 28 '23 02:12 zhanghx0905

INFO 01-02 07:18:44 llm_engine.py:653] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 4.0 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 1.0%, CPU KV cache usage: 0.0%
INFO 01-02 07:18:49 llm_engine.py:653] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 30.0 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 1.4%, CPU KV cache usage: 0.0%
INFO 01-02 07:18:54 llm_engine.py:653] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 26.4 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 1.8%, CPU KV cache usage: 0.0%
INFO 01-02 07:18:59 llm_engine.py:653] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 24.2 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 2.1%, CPU KV cache usage: 0.0%
INFO 01-02 07:19:04 llm_engine.py:653] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 22.5 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 2.4%, CPU KV cache usage: 0.0%
INFO 01-02 07:19:09 llm_engine.py:653] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 21.7 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 2.7%, CPU KV cache usage: 0.0%
INFO 01-02 07:19:14 llm_engine.py:653] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 20.8 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 3.0%, CPU KV cache usage: 0.0%
INFO 01-02 07:19:19 llm_engine.py:653] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 20.6 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 3.3%, CPU KV cache usage: 0.0%
...

vllm 不断输出标记,但实际上它只输出空字符串,直到达到 max len 的限制。

有没有人在部署Yi或其他LLM时遇到过类似的情况?

我已经把vllm更新到最新了。

vllm==0.2.6
torch==2.1.2
cuda==12.1

zhanghx0905 avatar Jan 02 '24 07:01 zhanghx0905

@zhanghx0905 根据 issue https://github.com/vllm-project/vllm/issues/174. 看起来 vllm 还没有完成对 GPTQ quantization 的支持

xffxff avatar Jan 08 '24 07:01 xffxff

@zhanghx0905 根据 issue vllm-project/vllm#174. 看起来 vllm 还没有完成对 GPTQ quantization 的支持

我现在使用A10 + awq quantization,没有再出现此类问题

zhanghx0905 avatar Jan 17 '24 03:01 zhanghx0905

这个原因应该是这样:虽然在应该停止时模型正确地生成了<|im_end|>这个token,但加载的tokenizer的eos_token是<|endoftext|>,vllm是以这个eos_token_id判断停止的。你可以用这个方法设置正确的停止token_id https://github.com/01-ai/Yi/issues/223#issuecomment-1864015591。

yxdr avatar Feb 04 '24 09:02 yxdr