小记一下在wenda上使用通义千问

@
前几天阿里发布了他们的开源大语言模型通义千问(qwen),根据介绍,这个模型不仅在多项评分中排名靠前,而且支持长对话、对api使用能力也有较大进步。而闻达作为一个LLM调用平台,就十分适合qwen。

wenda其实可以直接运行未量化的通义千问qwen-7b模型,只是速度实在感人。每秒只能生成0.2字,难称可用。

究其原因,通过电脑性能监测发现,运行的时候,不仅调用了外接的显卡(跑LLM的主力,12g显存)还同时调用的内置显卡(1650,凑数的,我是笔记本外接显卡)同时cpu也有负荷。推测是自动进行了多卡推理,但是巨大的性能差异和雷电3的小水管严重拖慢了速度。于是进行int8(只有10g多的显存占用)量化运行

首先说一下,这里面的坑还挺多的,但是也没那么多。简简单单就能搞定。

首先量化,我懒,找的别人在h站上量化好的,感谢发布者的工作。链接:https://huggingface.co/AironHeart/Qwen-7B-Chat-8bit

然后,一定仔细看qwen-7b的readme,你遇到的全部问题里面都记录了,给个好评。然后记得遇到缺啥就安装啥,除了bitsandbytes。

首先在环境中安装必要组件

transformers==4.31.0
accelerate
tiktoken
einops
transformers_stream_generator==0.0.4
scipy

这只是能保证可用,想能用(18g显存以下的),就得量化。

PrecisionMMLUMemory
BF1656.716.2G
Int852.810.1G
NF448.97.4G

此时由于闻达没有在config文件中提供修改的配置,需要到llm文件夹下更改“llm_qwen.py”文件,改这个地方:

def load_model():
    global model, tokenizer

    tokenizer = AutoTokenizer.from_pretrained(
        settings.llm.path, trust_remote_code=True)
    
    quantization_config = BitsAndBytesConfig(load_in_8bit=True)
#我的电脑int8
    model = AutoModelForCausalLM.from_pretrained(
    settings.llm.path,
    device_map="cuda:0",
    quantization_config=quantization_config,
    max_memory = torch.cuda.get_device_properties(0).total_memory,
    trust_remote_code=True,
    ).eval()

完成int8的配置

之后不出意外,会提示缺少bitsandbytes,这时候一定要注意版本,Windows需要特定版本才能运行。

我用的这个:

pip install https://github.com/jllllll/bitsandbytes-windows-webui/raw/main/bitsandbytes-0.39.0-py3-none-any.whl

安装完成后就可用正常运行了。这个就是成功的标志

知识库加载完成
The model is automatically converting to fp16 for faster inference. If you want to disable the automatic precision, please manually add bf16/fp16/fp32=True to "AutoModelForCausalLM.from_pretrained".
Try importing flash-attention for faster inference...
Warning: import flash_attn rotary fail, please install FlashAttention rotary to get higher efficiency https://github.com/Dao-AILab/flash-attention/tree/main/csrc/rotary
Warning: import flash_attn rms_norm fail, please install FlashAttention layer_norm to get higher efficiency https://github.com/Dao-AILab/flash-attention/tree/main/csrc/layer_norm
Warning: import flash_attn fail, please install FlashAttention to get higher efficiency https://github.com/Dao-AILab/flash-attention

===================================BUG REPORT===================================
Welcome to bitsandbytes. For bug reports, please run

python -m bitsandbytes

 and submit this information together with your error trace to: https://github.com/TimDettmers/bitsandbytes/issues
================================================================================
bin D:\wenda\WPy64-31110\python-3.11.1.amd64\Lib\site-packages\bitsandbytes\libbitsandbytes_cuda118.dll
CUDA SETUP: CUDA runtime path found: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin\cudart64_110.dll
CUDA SETUP: Highest compute capability among GPUs detected: 7.5
CUDA SETUP: Detected CUDA version 118
CUDA SETUP: Loading binary D:\wenda\WPy64-31110\python-3.11.1.amd64\Lib\site-packages\bitsandbytes\libbitsandbytes_cuda118.dll...
模型加载完成

另外发现一个有意思的现象,运行qwen时候,显卡功耗非常低,180w tdp只能跑到24w,速度每秒2字。看项目反馈,有人是提到运行速度慢的问题,目前qwen项目人员也在找问题所在。希望可以找到提高速度的方法。(超长对话显存会来到11g多,长对话时还是要注意)

显存占用

qwen-7b感觉比glm2-6b聪明点,但是我问的问题不多,实际上差别不大,还需要进一步测试
对话
(顺带一提,问通义千问网页版的时候的回答错的离谱)

我遇到的坑:readme中是max_memory = max_memory忘改,直接pip install bitsandbytes-windows,其他的记不清了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件中,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.java的Java类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程中,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值