LLM探索:环境搭建与模型本地部署
前言
最近一直在炼丹(搞AIGC这块),突然发现业务代码都索然无味了…
上次发了篇AI画图的文章,ChatGPT虽然没法自己部署,但现在开源的LLM还是不少的,只要有一块差不多的显卡,要搞个LLM本地部署还是没问题的。
本文将介绍这以下两个国产开源LLM的本地部署
- ChatGLM-6B
- MOSS
本文先简单的把模型跑起来,后续将继续我近期在LLM方向的一些探索记录~
概念
开始之前,先来看看一些基础概念。
AIGC
引用以下 mbalib 的内容
AIGC(AI Generated Content)即人工智能生成内容,又称“生成式AI”(Generative AI),被认为是继专业生产内容(PGC)、用户生产内容(UGC)之后的新型内容创作方式。
互联网内容生产方式经历了PGC——UGC——AIGC的过程。PGC(Professionally Generated Content)是专业生产内容,如Web1.0和广电行业中专业人员生产的文字和视频,其特点是专业、内容质量有保证。UGC(User Generated Content)是用户生产内容,伴随Web2.0概念而产生,特点是用户可以自由上传内容,内容丰富。AIGC(AI Generated Content)是由AI生成的内容,其特点是自动化生产、高效。随着自然语言生成技术NLG和AI模型的成熟,AIGC逐渐受到大家的关注,目前已经可以自动生成文字、图片、音频、视频,甚至3D模型和代码。
最近很多的ChatGPT、AI画图,就都属于这个领域。
LLM
引用以下 wikipedia 的内容
A large language model (LLM) is a language model consisting of a neural network with many parameters (typically billions of weights or more), trained on large quantities of unlabeled text using self-supervised learning or semi-supervised learning. LLMs emerged around 2018 and perform well at a wide variety of tasks. This has shifted the focus of natural language processing research away from the previous paradigm of training specialized supervised models for specific tasks.
中文也就是「大语言模型」,现在很火的ChatGPT就是这个LLM的代表,大模型有一个关键的属性:参数量,参数量的大小决定了大模型的能力(不能说是绝对的,但肯定是正相关)。
以下是常见LLM的参数量:
| LLM名称 | 参数量 |
|---|---|
| ChatGPT 3.5 | 175B |
| ChatGLM | 6B |
| MOSS | 16B |
| LLaMA | 7B/13B/33B/65B |
篇幅关系只列举这几个,更多的可以看文后的参考资料。
搭建环境
硬件
首先要有一台搭载了NVIDIA显卡的Linux系统服务器/电脑。
显存需要达到8G及以上,不然跑不动~
系统推荐使用最新的Ubuntu(22.04)或者其衍生版,以下是我在测试过程中使用的两台服务器配置。
服务器1
- CPU: Intel(R) Core(TM) i9-10940X CPU @ 3.30GHz
- 内存:64G
- 显卡:NVIDIA GeForce RTX 2080 Ti
服务器2
- CPU:Intel(R) Xeon(R) Gold 5318Y CPU @ 2.10GHz x2
- 内存:128G
- 显卡: Tesla T4 x4
软件
说完了硬件,再看看软件。
驱动
首先,需要显卡驱动,Ubuntu系的发行版安装显卡驱动比喝水还容易,这就是为啥推荐炼丹用Ubuntu的理由。
PS:完全可以一键完成,不需要再去网上查什么复制了几百遍的博客然后下载一堆东西又是编译又是卸载nouveau啥的了~
Ubuntu桌面版可以直接用「软件更新」App一键安装显卡驱动。
Ubuntu服务器版本,使用 nvidia-detector 命令检测需要安装的驱动版本,示例:
$ nvidia-detector
nvidia-driver-530
使用 ubuntu-drivers list 获取可安装的驱动列表,示例:
$ ubuntu-drivers list
nvidia-driver-418-server, (kernel modules provided by nvidia-dkms-418-server)
nvidia-driver-530, (kernel modules provided by linux-modules-nvidia-530-generic-hwe-22.04)
nvidia-driver-450-server, (kernel modules provided by linux-modules-nvidia-450-server-generic-hwe-22.04)
nvidia-driver-515, (kernel modules provided by linux-modules-nvidia-515-generic-hwe-22.04)
nvidia-driver-470-server, (kernel modules provided by linux-modules-nvidia-470-server-generic-hwe-22.04)
nvidia-driver-525-server, (kernel modules provided by linux-modules-nvidia-525-server-generic-hwe-22.04)
nvidia-driver-515-server, (kernel modules provided by linux-modules-nvidia-515-server-generic-hwe-22.04)
nvidia-driver-510, (kernel modules provided by linux-modules-nvidia-510-generic-hwe-22.04)
nvidia-driver-525, (kernel modules provided by linux-modules-nvidia-525-generic-hwe-22.04)
nvidia-driver-470, (kernel modules provided by linux-modules-nvidia-470-generic-hwe-22.04)
然后使用 ubuntu-drivers install nvidia-driver-530 来安装驱动,示例:
$ ubuntu-drivers install nvidia-driver-530
All the available drivers are already installed.
就这么简单
PS:当然非要自己去NVIDIA官网下载也可以,具体可以看看参考资料。
Python
搞AI,Python是必备的,但我们不直接使用系统的Python环境,而是使用conda来管理。
推荐使用 miniconda3 比 anaconda 轻量。
按照官网说明按照 miniconda3 之后,只需要使用以下命令即可创建指定版本的python环境
conda create -n 环境名称 python=3.10
如果遇到网络环境问题,可以参考我之前这篇文章,配置一下国内镜像:配置pip国内镜像加快python第三方库安装速度~
ChatGLM-6B
介绍
这是清华和智谱公司搞的开源LLM,截止本文撰写时,其在国产开源LLM里面算是天花板的存在了~
ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。
硬件需求
| 量化等级 | 最低 GPU 显存(推理) | 最低 GPU 显存(高效参数微调) |
|---|---|---|
| FP16(无量化) | 13 GB | 14 GB |
| INT8 | 8 GB | 9 GB |
| INT4 | 6 GB | 7 GB |
本地部署
下载项目代码
git clone https://github.com/THUDM/ChatGLM-6B.git
PS:也可以使用我 fork 魔改的版本,主要做了以下修改:
- 部署和模型微调默认开启多卡加速
- 重写API接口,更直观
创建虚拟环境
建议使用 conda 管理
conda create -n chatglm python==3.8
安装依赖
cd ChatGLM-6B
conda activate chatglm
pip install -r requirements.txt
conda install cudatoolkit=11.7 -c nvidia
PS:没有安装
cudatoolkit的话,会报RuntimeError: Library cudart is not initialized错误但 issues 里也有人说可以通过使用CPU输出量化模型后直接调用的方式解决,暂未尝试。
下载模型和启动
项目代码里有命令行和web界面两种demo,任意选一个运行,程序会自动从 huggingface 下载预训练模型。
PS: huggingface 的模型理论上是可以直接下载的,如果遇到网络问题,请自行使用代理或者从官方提供的某云盘下载模型。
# 命令行 demo
python cli_demo.py
# 使用 Gradio 实现的简单Web界面
python web_demo.py
Gradio 的默认端口是7860,可以通过在 launch() 方法里传入 server_port 参数自定义端口。
使用量化模型
如果显存没有13G以上,则无法运行FP16精度模型,只能运行量化后的模型,需要修改一下代码。
打开上述的 cli_demo.py 或 web_demo.py 代码
找到以下加载模型的代码,修改一下参数
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
将上面的代码修改为下面这样以使用量化模型
# 按需修改,目前只支持 4/8 bit 量化
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).quantize(4).half().cuda()
运行效果

多卡加速
如果显卡多,可以使用多卡运行以加速推理。
依然是打开上述的 cli_demo.py 或 web_demo.py 代码。
找到以下加载模型的代码
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
修改为
from utils import load_model_on_gpus
model = load_model_on_gpus("THUDM/chatglm-6b", num_gpus=4)
num_gpus 参数为要使用的显卡数量
我看了 load_model_on_gpus 这个方法的代码,它是通过 auto_configure_device_map 方法把 transformer分成30层,然后再分配到指定数量的显卡上,没法像 CUDA_VISIBLE_DEVICES 环境变量一样通过显卡编号来指定,只能按顺序来分配。
如果机器上同时要运行其他模型,可以考虑先运行这个ChatGLM,再运行其他的,或者重写 auto_configure_device_map 方法,让其可以灵活指定显卡。
授权
模型不可以直接商用,据说商用需要购买一年180w的许可证。
MOSS
介绍
这个是复旦开源的大模型,使用下来和ChatGLM最大的区别是推理速度特别慢
MOSS是一个支持中英双语和多种插件的开源对话语言模型,
moss-moon系列模型具有160亿参数,在FP16精度下可在单张A100/A800或两张3090显卡运行,在INT4/8精度下可在单张3090显卡运行。MOSS基座语言模型在约七千亿中英文以及代码单词上预训练得到,后续经过对话指令微调、插件增强学习和人类偏好训练具备多轮对话能力及使用多种插件的能力。
硬件需求
| 量化等级 | 加载模型 | 完成一轮对话(估计值) | 达到最大对话长度2048 |
|---|---|---|---|
| FP16 | 31GB | 42GB | 81GB |
| Int8 | 16GB | 24GB | 46GB |
| Int4 | 7.8GB | 12GB | 26GB |
本地部署
下载代码
git clone https://github.com/OpenLMLab/MOSS.git
创建虚拟环境
建议使用 conda 管理
conda create -n moss python==3.8
安装依赖
cd MOSS
conda activate moss
pip install -r requirements.txt
conda install cudatoolkit=11.7 -c nvidia
下载模型和启动
项目代码里有命令行和web界面两种demo,任意选一个运行,程序会自动从 huggingface 下载预训练模型。
# 命令行 demo
python moss_cli_demo.py
# 使用 Gradio 实现的简单Web界面
python moss_web_demo_gradio.py
修改默认模型和多卡加速
因为MOSS对显存的要求比较高,因此默认用的是4位量化的模型,这里我使用一台4块T4的服务器来部署,所以直接使用FP16模型。
修改 moss_web_demo_gradio.py,找到以下代码
parser.add_argument("--model_name", default="fnlp/moss-moon-003-sft-int4",
...)
把 default 参数改为 fnlp/moss-moon-003-sft
然后再设置一下多卡加速,把GPU参数设置为四个显卡的编号
parser.add_argument("--gpu", default="0,1,2,3", type=str)
然后启动,就可以看到四张显卡都吃满了

使用下来最大的感受就是慢,往往要一两分钟才能生成一个回答。
我看了下GitHub issues,有很多人也提出了同样的问题。两张A100还需要10s起步,100s左右的生成时间,看来短时间内是无解了,只能等官方优化了~
详见:
授权
模型采用 GNU AFFERO GENERAL PUBLIC LICENSE 许可证,可以免费商用。
参考资料
- https://wiki.mbalib.com/wiki/AIGC
- https://en.wikipedia.org/wiki/Large_language_model
- https://gitee.com/oschina/awesome-llm
- https://github.com/Hannibal046/Awesome-LLM
- 安装 NVIDIA 显卡驱动 - https://www.zhihu.com/tardis/zm/art/59618999?source_id=1003
LLM探索:环境搭建与模型本地部署的更多相关文章
- 第一周博客之二---OA项目环境搭建及开发包部署
OA项目环境搭建 一个项目想要能够在开发人员打包好项目包之后进行测试,就必须进行项目测试环境的搭建,要根据开发工程师的开发环境采用不同的测试环境,以下只是浅谈下Java项目OA(办公自动化平台)的环境 ...
- 腾讯云快速完成python3.6开发环境搭建与django应用部署
[本文出自天外归云的博客园] 部署python3.6.5 腾讯云服务器安装python3竟然要3个多小时!而且一度速度为0…… 于是网查据说是腾讯云服务器连python官网缓慢导致的,所以想找个国内的 ...
- Hadoop环境搭建--Docker完全分布式部署Hadoop环境(菜鸟采坑吐血整理)
系统:Centos 7,内核版本3.10 本文介绍如何从0利用Docker搭建Hadoop环境,制作的镜像文件已经分享,也可以直接使用制作好的镜像文件. 一.宿主机准备工作 0.宿主机(Centos7 ...
- Docker Swarm 集群环境搭建及弹性服务部署
上一篇文章<Docker Swarm 集群管理利器核心概念扫盲>中我们把 Swarm 重要的概念性知识给大家讲解了一波,理论完事就该实战了,这篇文章带大家从零开始,搭建 Docker Sw ...
- Win7环境下Apache+mod_wsgi本地部署Django
django基础已经掌握的同学可以尝试将项目发布已寻找些许成就感,以鼓励自己接下来进行django的进阶学习 以前你总是使用python manage.py runserver进行服务启动,但是却不知 ...
- Pytest单元测试框架:插件-allure-pytest环境搭建并在本地生成一个测试报告
之前写了allure-pytest的官方文档啃的内容,有些交流的朋友,实践起来没什么头绪,所以就有了这篇文章,也给自己填个坑 第一步:搭建Allure.JDK环境 1. 搭建JDK环境 不装jdk你会 ...
- 环境搭建之JAVA项目部署步骤
一.配置java环境 1.linux下安装jdk,在此处安装1.7_x64的jdk,解压缩 tar -zxvf xxxxxxx 2.将jdk移动到/usr下 mv java /user/ 3.配置环 ...
- 使用jenkins自动部署java工程到jboss-eap6.3 -- 1.环境搭建
使用jenkins自动部署java工程到jboss-eap6.3 -- 1.环境搭建 目录 使用jenkins自动部署java工程到jboss-eap6.3 -- 1.环境搭建 使用jenkins自动 ...
- Apache Spark1.1.0部署与开发环境搭建
Spark是Apache公司推出的一种基于Hadoop Distributed File System(HDFS)的并行计算架构.与MapReduce不同,Spark并不局限于编写map和reduce ...
- 用java开发微信公众号:测试公众号与本地测试环境搭建(一)
本文为原创,原始地址为:http://www.cnblogs.com/fengzheng/p/5023678.html 俗话说,工欲善其事,必先利其器.要做微信公众号开发,两样东西不可少,那就是要有一 ...
随机推荐
- Linux & 标准C语言学习 <DAY5>
一.if分支语句 if(表达式) //单分支语句 { //表达式的值为真,则执行此处代码 } if(表达式) //双分支语句 { ...
- 声网推出首个完整实时合唱解决方案 即将上线“咪哒”全国线下K歌房
4月20日,声网Agora宣布对实时合唱技术方案全面升级,帮助国内知名迷你KTV品牌"咪哒"实现国内首个支持多终端.多人合唱.高音质的完整实时合唱解决方案的落地,结束了国内K歌行业 ...
- Cesium官方教程——Fabric
1.简介 Fabric 是Cesium中定义的描述材质Material的JSON 结构体.Material代表了一个物体的外观. 材质Material可以是比较简单的,比如直接将一张图片赋予表面,或者 ...
- Little Snitch 5 - Mac 老牌防火墙安全工具软件小飞贼,监控和组织特定软件的网络连接
一旦连接到Internet,应用程序就可以随时随地发送它们想要的任何东西.通常情况下,他们是为你做的.但有时,例如在跟踪软件.木马或其他恶意软件的情况下,它们不会.但你不会注意到任何东西,因为所有这些 ...
- hyperf协程免费查询快递物流
https://blog.csdn.net/lin5188230/article/details/124920474
- Visual Studio 2022 不支持 .NET Framework 4.5 项目的解决办法
概述 升级到Visual Studio 2022后,打开速度快了很多,开发体验也舒服很多.只是使用过程中遇到了一个比较尴尬的问题:默认Visual Studio 2022 不再支持安装 .NET F ...
- 【Vue原理模拟】模拟Vue实现响应式数据
1. 预期效果 当数据变动时,触发自定义的回调函数. 2. 思路 对对象 object 的 setter 进行设置,使 setter 在赋值之后执行回调函数 callback(). 3.细节 3.1 ...
- [网络]公共网络安全漏洞库: CVE / CNCVE
本文博主的经历与该博文处理绿盟科技安全评估的系统漏洞 - 博客园的经历相同: 处理[第三方网络安全公司]给[公司产品]的[客户的服务器]扫描后生成的[安全漏洞报告]. 1 前言 以网络安全行业中最大的 ...
- Android开发_记事本(1)
一些知识 Textview TextView中有下述几个属性: id:为TextView设置一个组件id,根据id,我们可以在Java代码中通过findViewById()的方法获取到该对象,然后进行 ...
- LeeCode 回溯问题
1 组合问题 LeeCode 39:组合总和 题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 ta ...