赞
踩
本文介绍在本地环境部署大模型服务的过程,主要介绍依赖的安装、大模型服务的部署、基于gradio的可视化demo。
上图是本文相关的技术内容,可以通过一段话的总结来理解它们的关系:使用了一张RTX3090的显卡,有24GB显存,使用的大模型是Qwen1.5-14B-Chat-GPTQ-Int4,在部署上使用了vllm提升大模型的性能,使用fschat将大模型部署成服务,并基于gradio创建了一个可视化的聊天窗口。
关于环境
大模型服务主要依赖于GPU资源,这次的实验是在一个虚拟机上完成的,分配了一张RTX3090卡,有24G显存,大模型服务启动之后,显存使用在20GB左右。
关于大模型
本次使用的大模型是Qwen1.5-14B-Chat-GPTQ-Int4,这里借用Kimi对这个大模型的名字进行解释:
Qwen1.5-14B-Chat-GPTQ-Int4:这个名称可能表示一个名为Qwen的模型,版本为1.5,具有140亿参数,主要用于聊天应用,采用了GPT架构的某种变种,并使用了4字节整数的数据类型。
Kimi
具体可查看:https://kimi.moonshot.cn/share/cp269sivk6g8dhe16o3g
关于大模型的估算问题
按照我的理解,大模型因为其参数庞大所以需要占用很多的显存。比如大模型动辄上百亿的参数,假如使用16位浮点数存储这些参数值,则大致需要的显存有:
所以,在FP16的精度下,一个10B参数规模的大模型,大概需要20GB的显存。
大模型经过量化之后可以显著降低资源开销,比如Int4量化即使用4bit来存储一个参数,与原来16bit的存储精度相比减少到1/4的资源开销,则10B参数规模的大模型只需要5GB的显存。但是出于某些原因,并无法达成这么协调的换算,根据经验所需要的显存大概缩减到1/3左右。所以一个10B参数规模的Int4量化版本,大概需要的显存是:
这里的某些原因,有一些合理的说法,比如大模型的资源占用不只是用来存参数,其他的开销可能没有通过量化技术得到缩减。
根据上述信息,我所使用的Qwen1.5-14B-Chat-GPTQ-Int4估算应该占用的显存是:
关于大模型量化技术的讨论,可以参考:https://kimi.moonshot.cn/share/cp26kssubms6ha9a3cjg
关于大模型的推理速度
直接加载大模型并部署服务,其性能低的可怜,具体表现在一次请求的答案生成过程很慢,以及多个并发请求需要排队时间较长才能得到结果。
当然我们可以通过堆GPU服务器,部署更多的大模型服务实例来提高其吞吐率,但是鉴于GPU资源的价格昂贵,而大模型对GPU资源的需求较高,更合理的想法是从技术上找提高性能的方案。
比如在实践经验中验证,使用vllm [https://github.com/vllm-project/vllm] 可以将生成速率提高34倍,吞吐率提高45倍,将GPU资源使用率从50%提升到90%左右。这表示它需要使用更多的GPU,但确实带来了很高的回报。
安装依赖
按需安装下面的依赖:
root@train-autogen-0:~# history``pip install transformers``pip install accelerate``pip install optimum``pip install auto-gptq``pip install vllm``pip install fschat``pip install gradio
安装过程中遇到的问题
安装vllm过程遇到的错误:
使用Kimi进行分析:https://kimi.moonshot.cn/share/cour4rgnsmmsr9ubddqg
最后通过手动下载nccl并放置到错误信息中提到的目录,且进行了重命名:
mv /root/.config/vllm/nccl/cu12/cu12-libnccl.so.2.18.1 \``/root/.config/vllm/nccl/cu12/libnccl.so.2.18.1
启动服务
分别启动controller、worker、api服务。
nohup python -u -m fastchat.serve.controller --host='0.0.0.0' \``--port=21001 > ./logs/fastchat_serve_controller.log 2>&1 &``echo 'start controller'`` ``nohup python -m fastchat.serve.vllm_worker --model-path \``~/LLM/Qwen1.5-14B-Chat-GPTQ-Int4 \``--controller-address http://0.0.0.0:21001 \``--port 19000 --host 0.0.0.0 --num-gpus 1 \``--worker-address http://0.0.0.0:19000 \``--gpu-memory-utilization 0.8 --max-model-len 5696 \``--trust-remote-code \``> ./logs/Qwen1.5-14B-Chat-GPTQ-Int4.log 2>&1 &``echo 'start worker'`` ``nohup python -u -m fastchat.serve.openai_api_server \``--host 0.0.0.0 --port 7777 \``--controller-address http://0.0.0.0:21001 \``> ./logs/fastchat_api.log 2>&1 &``echo 'start api'
启动gradio:
nohup python ./gradio_app.py > ./logs/gradio_app.log 2>&1 &
上述脚本内容已经过完善。
启动服务过程中遇到的问题
启动vllm_worker报错:
2024-05-10 11:45:41 | ERROR | stderr | [rank0]:` `raise ValueError(``2024-05-10 11:45:41 | ERROR | stderr | [rank0]: `` ValueError: The model's max seq len (32768) is larger than `` the maximum number of tokens that can be stored in KV cache` ``(5696). Try increasing `gpu_memory_utilization` or````decreasing `max_model_len` when initializing the engine.`
修改指令,添加参数控制:
--max-model-len 5696
这个设置可能会影响到大模型的性能,但是目前我的主要目标是跑通整个流程,所以也就暂时这样了。后面真正落地应用,还需要考虑效果、算力资源、性能等更多因素来给一个综合的设置方案。
Kimi对于该问题的分析:https://kimi.moonshot.cn/share/cour5ui2jko0hi3eb4h0
使用gradio构建聊天窗口
效果:
脚本:
from openai import OpenAI``client = OpenAI(` `api_key="Qwen1.5-14B-Chat-GPTQ-Int4", # 不能不设置,也不能为空` `base_url="http://127.0.0.1:7777/v1" # 注意,这里是base_url,不是具体chat接口的地址``)`` ``system_prompt = "你是 Qwen1.5, Qwen1.5 is the beta version of Qwen2, a transformer-based decoder-only language model pretrained on a large amount of data. 你擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。"`` ``def predict(message, history):` `history_openai_format = [` `{"role": "system", "content": system_prompt}` `]` `for human, assistant in history:` `history_openai_format.append({"role": "user", "content": human })` `history_openai_format.append({"role": "assistant", "content":assistant})` `history_openai_format.append({"role": "user", "content": message})`` ` `response = client.chat.completions.create(` `model="Qwen1.5-14B-Chat-GPTQ-Int4",` `messages=history_openai_format,` `temperature=0.3)`` ` `return response.choices[0].message.content`` `` ``import gradio as gr`` ``gr.ChatInterface(predict, chatbot=gr.Chatbot(height=700)).launch(server_name='0.0.0.0', server_port=9999)
过程中遇到的问题
gradio错误信息无法查看
我原本使用脚本启动app,并在后台执行:
nohup python gradio_app.py > /data1/logs/gradio_app.log 2>&1 &
但是程序报错,且无法看到错误信息。后来我直接把代码放到Jupyter上运行,就可以看到了。暂时没有继续深究里面的原因。
使用openai的client api时遇到的各种错误
在这个过程中出现的错误主要有三个:
api_key 没有设置,或者设置的内容是空
base_url 填写了chat接口的完整地址,如 `http://127.0.0.1:7777/v1/chat/completions`
使用了流式的请求,但当前的服务部署模式可能还不支持流式的
使用API调用大模型服务
下面是通过restful api调用大模型服务,但为了复用代码,模仿了gradio的history结构。
history = []``def chat(message):` `response = predict(message, history)` `item = message, response` `history.append(item)` `return response
结果验证
通过日志确认相关服务已经启动:
验证API访问大模型服务:
验证可以通过gradio访问:
确认GPU资源使用情况:
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2024最新版CSDN大礼包:《AGI大模型学习资源包》免费分享
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2024最新版CSDN大礼包:《AGI大模型学习资源包》免费分享
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2024最新版CSDN大礼包:《AGI大模型学习资源包》免费分享
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2024最新版CSDN大礼包:《AGI大模型学习资源包》免费分享
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2024最新版CSDN大礼包:《AGI大模型学习资源包》免费分享
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。