小秦哥 发表于 2024-9-23 09:52:32

DB-GPT使用vLLM报错 ValueError: mutable default <class ‘list‘> for

        本篇文章主要记录本人debug的过程,该问题已经办理,可以直接看最下方的办理方式。
https://i-blog.csdnimg.cn/direct/b0e8178a69f94c94a5478e12e22379de.png

        在使用DB-GPT项目过程中由于默认使用的推理框架推理速度较慢,选择更换成vLLM框架,在DB-GPT项目文档中有使用vLLM推理的部门,但是写的极为简短,在使用过程中会发上上图的报错,为了debug于是先尝试在当地用pycharm进行调试。
https://i-blog.csdnimg.cn/direct/59184a02d2aa4be9bc99d7c71e73d0b5.png
在当地重新摆设进行调试

        重新构建虚拟环境dbgpt_env
conda create -n dbgpt_env python=3.10         然后安装依靠,分别是默认依靠,openai依靠和vllm依靠,由于是在当地调试,以是必要使用openai的api来调用chatgpt.
pip install -e "." -i https://pypi.tuna.tsinghua.edu.cn/simple requests

pip install  -e "." -i https://pypi.tuna.tsinghua.edu.cn/simple requests

pip install -e "." -i https://pypi.tuna.tsinghua.edu.cn/simple requests         其中vllm依靠中由于torch安装的是最新版本,现在截止2024.8.25日,torch最新版本是2.4.0,但是某些torch相干的组件用的并不是搭配的版本,安装之后可能会出现如下报错。
https://i-blog.csdnimg.cn/direct/5b96bf8063e04b35b175799776231e75.png
        必要修改setup.py第322行代码重新下载,或者使用pip直接卸载原来的torchaudio然后指定2.4.0重新安装。
https://i-blog.csdnimg.cn/direct/122be725aa65452cb089b0de70d8895d.png
        运行webserver出现报错
https://i-blog.csdnimg.cn/direct/ea6c7e6af2c64cc8b31040541b777ae8.png
        应该是impot torch过程中堕落,可以尝试在命令行中import torch
https://i-blog.csdnimg.cn/direct/16e5f9926a6e49ac8ab09c95ce2a493a.png
        根据博客https://blog.csdn.net/Lahzylj/article/details/140934691
        安装libomp140.x86_64.dll并放入图中所指示的文件夹内,重新import torch可以看到正常运行。
https://i-blog.csdnimg.cn/direct/c4188cbbfbd54b4daf1b5c4060fcb22e.png
        此时如果不在.env文件中设定MODEL_TYPE直接启动webserver是可以正常使用,如果设定为vllm的推理框架的话会产生报错。
https://i-blog.csdnimg.cn/direct/f43fa1029a3440fa9970213b420c78ef.png
https://i-blog.csdnimg.cn/direct/ad6cd63249bb4b82a31dd1b1d6b99264.png
        这里有个提示是说Trition没有安装,一些GPU相干的功能会无法使用,不过由于本机用的是署理模型不必要用到GPU以是可以不管,而且trition现在只支持Linux体系,Win10体系摆设起来比较麻烦。
https://i-blog.csdnimg.cn/direct/700785dd41914615aba4fb4601b5b8af.png
        然后最后的报错和我在A6000的长途主机中报的错一样,开始debug。
当地debug过程

        可以看到,最后在dataclass创建一个新的数据类型时堕落,代码如下。​​​​​​
​https://i-blog.csdnimg.cn/direct/7f39cc22806d458aa073a8c42ee12709.png
        这里是在传入VLLM的参数
        这里出现了type函数的另一种使用方式,一般type函数输入一个参数时是用来查看该参数的数据类型的,如果输入三个参数,就是便利地构建一个新的数据类型,其中第一个参数表示该数据类型的名字,第二个参数表示该数据类型继承的父类,第三个参数表示该数据类型的属性,然后去查看第三个数据类型,这里表示的输入VLLM的一些参数,共85个,加上最后一个annotations的数据类型字典(85个),以是一共是输入了86个参数。
https://i-blog.csdnimg.cn/direct/0f41f7decd774923a6db81be662929d8.png
https://i-blog.csdnimg.cn/direct/2cb7d4715dc846358ffcb09782729455.png
        其中新的疑问是Field数据类型是什么意思,在调试过程中,是出现在该函数的一开始https://i-blog.csdnimg.cn/direct/82b36eea209b444196a0569c9bb593aa.pnghttps://i-blog.csdnimg.cn/direct/202a0e4186cf4ee4acc90575fa0cf5e5.png
        颠末查询,field是python3.7之后参加的dataclass中的一个函数,该函数答应为数据类的字段指定默认值和元数据。field()可以替换默认的字段值,支持默认值和默认工厂函数,同时在初始化、表示、比较和哈希方法中发挥作用。元数据功能为第三方扩展提供了空间,确保了数据类的灵活性和定制性。

        其中涉及到isinstance()函数
        isinstance() 函数是 Python 中的 内置函数,该函数用于检查一个对象是否是 指定类 或 其子类 的 实例。如果对象是给定类型的实例,则返回 True;如果不是,则始终返回 False。
        isinstance(object, classinfo)
        其中:
        object 为必要进行类型检查的对象,isinstance() 函数将判断 object 是否是指定类型或指定类型的子类的实例。
        classinfo 的值答应为一个类型对象、多个类型对象组成的 元组 或 Union 类型。

在field_dict中的第74个参数,ignore_pattern的default值为[]导致报错
https://i-blog.csdnimg.cn/direct/8bf96984436446979227944ca218fd3b.png
        同时,可能也影响了后面的参数无法精确获取,以是猜测更改ignore_pattern的默认值可能会乐成,由于自己ignore_pattern的类型也是str

        而field_dict是从desc中转过来的,以是必要追溯desc,可以看到在序号为73的参数中(由于List是从00开始计数的),default_value就是[],别的参数的默认值都是None
https://i-blog.csdnimg.cn/direct/67cac3b55f1e4d3387fb346314c2b416.png
        追溯desc必要回到上一层调用也就是vllm_adapter.model_param_class
https://i-blog.csdnimg.cn/direct/88d67a51eab74f9085d6267a5d3b3be9.png
        最终发现是在AsyncEngineArgs的add_cli_args函数中获得的参数,由于这部门代码无法修改,以是没有在深入研究。
办理方式

        其实想要办理上面的错误,焦点问题就是把ignore_patterns的默认值修改,以是可以在构建fields_dict的过程中完成修改,只必要将原来的构建过程中通过if语句获取ignore_patterns键值对的获取过程然后复制默认值为None即可。
        进入DB-GPT\dbgpt\util\parameter_utils.py文件中,在约637行处注释掉原来的fields_dict的赋值语句,改为下图中的if语句保存即可。
https://i-blog.csdnimg.cn/direct/63c3b1a7db6745128284fc844a8960e8.png
后记

        现在看来,使用vllm推理框架对于显存的使用水平提升的很大,本来使用默认推理框架(应该是fastchat)跑10b以内的大模型一般都只必要20G左右的显存,但是用vllm会提到40G,而使用glm4-9b-chat在运行过程中会报错,现在用Qwen2-7B-Instruct效果最佳。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: DB-GPT使用vLLM报错 ValueError: mutable default <class ‘list‘> for