本地部署大模型服务全攻略:从零到一的实战教程

382 篇文章 18 订阅
84 篇文章 0 订阅

本文介绍在本地环境部署大模型服务的过程,主要介绍依赖的安装、大模型服务的部署、基于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资源使用情况:

题外话

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

在这里插入图片描述

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

3.技术文档和电子书
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

在这里插入图片描述

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

在这里插入图片描述

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值