THUDM / GLM-4

GLM-4 series: Open Multilingual Multimodal Chat LMs | 开源多语言多模态对话模型
Apache License 2.0
5.28k stars 435 forks source link

用 openai_api_server.py 多卡运行 glm-4-9b-chat 处理长文本的时候可能会胡乱输出 #476

Closed oubeichen closed 3 months ago

oubeichen commented 3 months ago

System Info / 系統信息

Python 3.11 RTX 4090 x 2,用过 535 和 550 驱动,问题依旧 已经使用了当前最新的模型文件(modelscope上)和最新的GLM-4 basic_demo 目录下的 requirements.txt 依赖

Who can help? / 谁可以帮助到您?

No response

Information / 问题信息

Reproduction / 复现过程

我需要做一个长文本提取关键词的应用,所以在 openai_api_server.py 的基础上修改了 MAX_MODEL_LENGTH 为 32000 和这一行 https://github.com/THUDM/GLM-4/blob/6af85cd4003fadbbf05b593ed25f9dd01e8dfe6c/basic_demo/openai_api_server.py#L355

的 1024 更改为 16000,使得可以支持更长上下文和输出。

这一行 https://github.com/THUDM/GLM-4/blob/6af85cd4003fadbbf05b593ed25f9dd01e8dfe6c/basic_demo/openai_api_server.py#L670 修改为 2,使得可以支持两张显卡。另外安装了 requirements.txt 里的 flash-attn 和 peft(因为没有 0.12.2 安装的 0.12.0),用作微调的准备,其他就没有做过多修改了。

然后在调用的时候,发现如果文本稍微长一点,则经常会出现API卡住的情况,其实是在不断输出结果直到上限。 以下是我拼好的 prompt,太长直接上传成 txt。 其中,任务内容:以上部分在 role: system 里面,任务内容:以及以下部分在 role: user 里面。

GLM4Prompt.txt

GLM4_request.txt

以下是结果的前面部分,后面基本上就是铯领柏无限重复。

image

Expected behavior / 期待表现

正常返回结果

我发现部分第三方平台也可以使用 glm-4-9b-chat 这个模型,而且没有这个卡住问题,能正常返回结果。但他们的模型不支持 tool_call,有可能基底并不是用的 vllm。

zRzRzRzRzRzRzR commented 3 months ago

不是,是因为没有做单独判断,tool calll在官方代码是单独实现的,用了规则处理

zRzRzRzRzRzRzR commented 3 months ago

我会在多卡测试一下,你出现这个问题的复现语句是?

oubeichen commented 3 months ago

我会在多卡测试一下,你出现这个问题的复现语句是?

你可以参考我在上面正文发的这两个附件GLM4Prompt.txt GLM4_request.txt,前者是我拼好的 prompt,可能不是很准确但大差不差,后者是 openai 库日志记录的请求信息。

zhipuch commented 3 months ago

你好,我按你的代码改动和prompt复现没发现重复输出的问题

oubeichen commented 3 months ago

你好,我按你的代码改动和prompt复现没发现重复输出的问题

我试了下重新安装了 python 虚拟环境还是有问题

具体修改:

https://github.com/oubeichen/GLM-4/commit/bf2585cbcf6d372cb917caa1204119ef9380991e#diff-f6c09858408807615bba26a40410ec01bc0bcb7ca9cbe37ea14231691948d7a2 这次直接全新环境安装 requirements.txt 。

我的机器是用的 autodl 的

PyTorch / 2.3.0 / 3.12(ubuntu22.04) / 12.1 镜像,用 conda create -n my-env python=3.11 装上了 python 3.11,配置是 RTX 4090 x 2,系统是 ubuntu 22.04, CUDA 是 12.1, Nvidia Driver 我试了两种机器一个是 535 驱动,一个是 550 驱动,都一样。

/v1/chat/completions 请求的 body(我特意设置了max_tokens,避免长时间卡住,另外服务被我映射到本机 localhost:8002 端口):

GLM4_request_body.json

对应的 CURL 请求,供参考(可以修改成后缀 .sh 来执行): GLM4_request_curl.txt

对应的 python 语句,供参考(可以修改成 .py 来执行): GLM4_request_python.txt

其他尝试:

  1. gpu_memory_utilization 改回 0.9
  2. 检查模型文件的 sha256,没有异常,我是用 modelscope 官方工具在 8.13 下载的,已经是 8.12 最后修改过的版本。
    modelscope download --model zhipuai/glm-4-9b-chat --local_dir glm-4-9b-chat
    # find . -type f -exec sha256sum {} \;
    d135f1555ed1036be6eda988fc6ae365cdc8a8122aff0bf6d0602c1e1c93bee6  ./config.json
    1830142d07d5ff305266e056e32568af74f0fa52c5edca84dfa72dcf0ed0d713  ./.msc
    9aab662b490910d41e19e7a4599f97f2027f738407ecf35179b0035b6c012d32  ./configuration.json
    db714e8a9f7532eb2b6bfd4df01d24c700b373d2ab76b81eff0fe5a2617edb11  ./configuration_chatglm.py
    1e3ca4066f68268a0e9156fbf67a51fc83adb46d4a1a4fdd51ea814cd6e50b59  ./generation_config.json
    fd0689724426a3adbc3c8866e85a14c63b1c02df220a371e38699cda47ee276e  ./LICENSE
    d0040c9cf0d4d0553c4156dbd890437788ba43237037e1f9c4a3c1a3ddfad1f6  ./model-00001-of-00010.safetensors
    f9163d47c6e1073d68fb03f933122e2ece0b30ce43b5309da15b783e93a34ad4  ./model-00002-of-00010.safetensors
    28031e88b92dc942b47ac4dd0e73b2ce749fc87fc692a3ed72e1bdec74996968  ./model-00003-of-00010.safetensors
    708ef7836140bd1822253cae05f5891ea02cedbe4c8ef8b096f712cdfdc9b01e  ./model-00004-of-00010.safetensors
    c390a67a568f7f3d440a3c3357b4d08c0539435ea6d7a36baa4a4f0274740ae5  ./model-00005-of-00010.safetensors
    32e0d285c514e750e78ae42630a498ec526db4caba993fc2ea7226069410d1e7  ./model-00006-of-00010.safetensors
    165687aa1873e91d13bf404ff91a4d702f79c5301f43c2645eabb45f17808cb2  ./model-00007-of-00010.safetensors
    5388bffb210043271cded04b28a5fae2eeeb31b64b695b62638d9b856e322033  ./model-00008-of-00010.safetensors
    449241babb7ce69a835c121efa26d9fd8823554ed0c8acd2af6666f482dd6809  ./model-00009-of-00010.safetensors
    2544b92fc4f1cb511b31a6b06021a3136de0705436db6731d30ec5b8a2be80f6  ./model-00010-of-00010.safetensors
    d153206225f09b11759dce2b36d32a7d65f36f00818535853bb0e3905038401a  ./model.safetensors.index.json
    4fb2cc3c395409f1dce729d401dfaa905ab031840ab550de01a2da234412842d  ./modeling_chatglm.py
    3e0e87996c46b81e089a16adcbc43704681d5d768cfe0d4d31c2b8c6c10bcaf6  ./README.md
    607860825ff4e4e2037628e9b985bbc83d1823360df6535972e21c4d514b8566  ./README_en.md
    433ac2103c9fec72e70935bf3a9f05054a48aa3805ecd8bdd09f1c209d2ded21  ./tokenization_chatglm.py
    5a493598071550244b2ee7f26118f3edec2150b9dfa967929a99052ac83fe716  ./tokenizer.model
    24fe6f10f57828538ebb6bd313ee619d459ac7f77a00789d7c6b2860038548a2  ./tokenizer_config.json
    a59fa20488a06e382689a00234c21423fcb680d23c2326118caa99baca557166  ./.mv

均无效果

zhipuch commented 3 months ago
  1. 你可以试一下官方提供的request脚本
  2. 我使用你的request脚本进行复现,发现一个比较显著的问题,在拼接message的时候长文本最好用'''content''',单引号和双引号会不小心抵消或者冲突,修改完之后运行成功。 request.txt
oubeichen commented 3 months ago
  1. 你可以试一下官方提供的request脚本
  2. 我使用你的request脚本进行复现,发现一个比较显著的问题,在拼接message的时候长文本最好用'''content''',单引号和双引号会不小心抵消或者冲突,修改完之后运行成功。 request.txt

这个是 RapidAPI 生成的文件,我之前也发现有问题改过,但是上传不知道咋的传错文件了,不好意思。

我看了下主要是在两条 message 的 content 前后有没有换行的区别。你发的文件所有 content 前后都加上了换行,所以运行没有问题。我刚才下载运行,也没有问题。 但是我之前的是 content 前后都没有换行,所以出现了问题。 (删掉 request.txt 里面 content 前后所有换行, 或者执行上面给的 GLM4_request_curl.txt 里面的命令,都可以复现问题)

其实以前用一些早期LLM也遇到过这个问题,输入最后必须带换行,否则没法让LLM知道输入已经结束。现在大部分LLM或者运行的框架都没这个问题。而且这个问题在输入比较短的时候也不会出现,我就没怎么注意了。

感觉我先暂时把所有输入前后都手动带上换行吧。