冲鸭~~!10分钟部署清华ChatGLM2-6B,效果测试:不愧是中文榜单第一

来源: AINLPer公众号(每日干货分享!!)
编辑: ShuYini
校稿: ShuYini
时间: 2023-9-25

引言

 今年6月份清华大学发布了ChatGLM2,相比前一版本推理速度提升42%。最近,终于有时间部署测试看看了,部署过程中遇到了一些坑,也查了很多博文终于完成了。本文详细整理了ChatGLM2-6B的部署步骤,同时也记录了安装过程中遇到的一些坑和心得,希望能帮助大家快速部署测试。

另外:作者已经把模型以及安装依赖全部整理好了,如需,关注 AINLPer公众号 直接回复:chatglm2-6b

 本文主要分为七个部分,分别为:显卡驱动安装、Python虚拟环境、ChatGLM2依赖安装、模型文件准备、模型加载Demo测试、模型API部署、OpenAI接口适配,具体如下图所示。只要机器显卡驱动已装,按步骤20分钟即可完成安装测试!

说在前面

 本文主要安装环境为:Centos7(8C24G)、T4(16G)显卡,由于实验室的电脑不能联网,本文主要是离线安装。所以这里将整个安装包分为了三个部分:ChatGLM2依赖文件、ChatGLM2模型文件、ChatGLM2 Demo展示文件、其它依赖包,如下图所示。注:不论您是离线安装,还是在线安装,直接拷贝下面几个文件至对应的目录下面,直接启动Demo测试就能运行此程序,那么现在开始!!!在这里插入图片描述

一、显卡驱动安装

 跑模型少不了了显卡驱动,这部分主要内容包括:显卡驱动型号对齐、驱动依赖安装、显卡安装等三个部分。如果安装过了显卡驱动可以跳过这一步。

:对应Linux机器来说,显卡的安装需要用到root用户,不能使用应用用户。如果是自己安装测试,直接root用户一套下来也没有问题,如果涉及企业级应用或者对机器权限有限制,需要联系系统管理员要服务器root权限。

1、查看服务器型号

cat /etc/redhat-release

2、查看服务器显卡型号

sudo lshw -numeric -C display  或  lspci | grep -i vga

3、下载显卡驱动

 访问英伟达官网:https://www.nvidia.cn/Download/index.aspx?lang=cn,根据自己显卡的系列型号,选择对应的版本,进行下载。 如下图所示:
 我使用的显卡是T4,操作系统是Centos7.9,所以选择这个版本。这里又一点需要注意,CUDA Toolkit的版本需要和使用的Pytorch、Tensorflow等框架版本一致。目前我看Pytorch最高可以支持11.8的CUDA版本。如果您的显卡驱动和我一样,可以直接在我的资源包里面获取,具体为:./packages/NVIDIA-Linux-x86_64-515.105.01.run

4、安装GCC、kernal组件、dkms等相关依赖

yum install gcc
yum install gcc-c++
yum -y install kernel-devel
yum -y install kernel-headers
yum -y install epel-release
yum -y install dkms

5、关闭nouveau

 其中Nouveau 是由第三方为 NVIDIA 显卡开发的一个开源 3D 驱动,也没能得到 NVIDIA 的认可与支持。虽然 Nouveau Gallium3D 在游戏速度上还远远无法和 NVIDIA 官方私有驱动相提并论,不过却让 Linux 更容易的应对各种复杂的 NVIDIA 显卡环境,让用户安装完系统即可进入桌面并且有不错的显示效果,所以,很多 Linux 发行版默认集成了 Nouveau 驱动,在遇到 NVIDIA 显卡时默认安装。企业版的Linux 更是如此,几乎所有支持图形界面的企业 Linux 发行版都将 Nouveau 收入其中。

 对于个人桌面用户来说,处于成长阶段的 Nouveau 并不完美,与企业版不一样,个人用户除了想让正常显示图形界面外很多时候还需要一些 3D 特效,Nouveau 多数时候并不能完成,而用户在安装 NVIDIA 官方私有驱动的时候 Nouveau 又成为了阻碍,不禁用 Nouveau 安装时总是报错, 错误如下:ERROR: The Nouveau kernel driver is currently in use by your system. This driver is incompatible with the NVIDIA driver……

  • 1)查看是否有nouveau在运行
lsmod | grep nouveau
  • 2)修改系统黑名单配置文件
     进入到/etc/modprobe.d文件夹下面,找到具有blacklist.conf字样的文件。通过vim修改该配置文件,在文件中新增以下内容,最后通过!wq保存。
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
  • 3)更新内核服务器参数(如果第一个命令不行,可以尝试第二个)
update-initramfs -u  或者  dracut --force
  • 4)重启服务器
reboot
  • 5)再次查看是否有nouveau在运行,如果没有,则表示nouveau完全关闭了。
lsmod | grep nouveau

5、安装显卡驱动

 将驱动拷贝到服务器上,执行以下命令,(如果安装报错,请看下面第6条):

chmod +x NVIDIA-Linux-x86_64-515.105.01.run
sh NVIDIA-Linux-x86_64-515.105.01.run

6、显卡安装报错排查

 在安装过程中,我主要遇到的报错为:ERROR:Unable to find the kernel source tree for the currently running kernel…

 遇到这个问题的时候,网上看了很多的例子,这里再做一下整理。这个报错意思是说操作系统运行的内核版本与kernel-devel不一致。这里将两者版本对齐就可以了。具体操作如下:

  • 1)查看系统运行版本的内核编号
cat /proc/version
  • 2)列出目前系统所有内核相关资源
rpm -qa | grep kernel
  • 或者直接列出安装的kernel-devel、kernel-headers的版本
yum info kernel-devel、kernel-headers

如下图所示:

 可以发现,服务器运行的内核编号和kernel-devel、kernel-headers的版本编号并不一样。这个时候有两种做法,一种是让服务器的内核版本编号与kernel-devel、kernel-headers版本编号对齐,另外一种是让kernel-devel、kernel-headers的版本编号与服务器系统运行的内核编号对齐。

  • 1)系统内核编号与kernel-devel等编号对齐
# 根据kernel-devel编号安装对应的系统内核
yum install kernel-3.10.0-1160.95.1.el7.x86_64
# 设置系统默认启动内核版本
grub2-set-default kernel-3.10.0-1160.95.1.el7.x86_64
# 重启服务器
reboot
# 再次进入服务器,查看系统运行内核编号
cat /proc/version
  • 2)kernel-devel等编号与系统内核编号对齐(这里假如系统内核编号为:kernel-3.10.0-1160.95.1.el7.x86_64)
# 根据系统内核编号安装对应的kernel-devel、kernel-headers
yum install kernel-headers-3.10.0-1160.95.1.el7.x86_64
yum install kernel-devel-3.10.0-1160.95.1.el7.x86_64

以上不管是按照哪种方式,得到的结果如下图所示,此时按照上面第5步的命令,安装显卡驱动就可以了。

另外,如果有其它的服务,需要之前的内核,那么就需要给服务器切换内核。具体操作如下:

# 进入到/boot/grub2或者/etc目录下面,其中:/etc/grub2.cfg文件是一个文件链接,实际链接到/boot/grub2/grub.cfg
#看一下是否有:grub.cfg,如果没有需要创建。
grub2-mkconfig -o /boot/grub2/grub.cfg#查看当前内核
grub2-editenv list#查看已安装内核
awk -F' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg# 设置默认启动版本
grub2-set-default xx #xx为你看到的内核编号
# 重建内核配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
# 重启生效
reboot

按照以上方式解决了报错问题之后,再按照第 5) 步执行显卡安装命令,最后通过nvidia-smi查看显卡安装是否成功。具体命令如下所示:

# 执行显卡安装命令
chmod +x NVIDIA-Linux-x86_64-515.105.01.run
sh NVIDIA-Linux-x86_64-515.105.01.run
# 按照以上命令完成安装,通过以下命令查看是否安装成功。
nvidia-smi

最后截图如下所示:

二、Python虚拟环境创建

1、为什么要安装Python虚拟机环境?

 答:一台服务器上面,可能需要跑多个模型,每个模型所依赖的python版本或者依赖包的版本不同,比如:模型A依赖的python2.7版本、transformers4.30.2,模型B依赖的是python3.8的版本、transformers4.26.1;这就需要做python虚拟机环境的隔离。如果您这台服务器未来就单独跑这一个模型,可以忽略这一步,也没有问题。

2、创建Python虚拟环境方法

 python虚拟机环境创建大概有两个主流的方法:一个是安装virtualenv库,实现python虚拟机环境管理;另外一个是通过conda。因为自己一开始就用的conda,所以对virtualenv不是很熟悉,所以这里主要介绍通过conda的方式创建Python虚拟环境。如果有小伙伴对virtualenv感兴趣,百度一下应该有很多教程。

3、Miniconda介绍

 个人比较喜欢Miniconda,自己需要什么库就自己下载安装。以下是Miniconda和Anaconda的对比。它们两个非常流行的Python发行版。Miniconda只包含最基本的工具和库,需要手动安装其他工具;Anaconda是一个完整的发行版,包含许多重要工具和库。相对于Anaconda,Miniconda更加轻量级和灵活,适合具有需要在不同的环境中切换.

4、Miniconda的安装

  • 1)获取Miniconda安装包:因为chatglm2用到了pytorch框架,按照官网的建议,这里选择了python3.8版本。

方法一 直接拉到文章最后,获取方式放在最后,在others文件包中。

方法二 因为Miniconda自带python,所以要在官网下载python版本为3.8的Miniconda版本。下载地址为:https://docs.conda.io/en/latest/miniconda.html#linux-installers,具体截图如下。

  • 2)安装Miniconda

 将Miniconda下载安装包放到你要放的目录,这里我放在:/home/work/miniconda 中,然后执行sh Miniconda3-latest-Linux-x86_64.sh 如下图所示:执行完之后按照提示进行回车(enter)就好了,注意:最后选择“yes”,这样每次启动,它都会自动给你切换到conda的base环境中。

  • 3) 创建虚拟机环境

 miniconda支持创建多个虚拟环境,用来支撑不同版本(python)版本的代码,这里就为chatglm2-6b创建一个单独的python虚拟机环境,名字叫:chatglm2,后面会在该环境中安装跑chatglm-6b模型的所有依赖。下面是命令及截图:

conda create -n chatglm2 # 如果能连网,可以直接执行该命令,如果不能安装执行下面带‘clone’的命令
或conda create -n chatglm2 --clone base # 注:因为是离线安装这里选择clone的方式创建,直接创建会报错,因为这里是离线安装
conda env list # 获取环境列表
conda activate chatglm2 # 切换chatglm2环境
  • 4) 默认python虚拟机环境设置

 如果需要每次进入机器都默认使用chatglm2的环境,可以通过以下方式进行配置。(这一步不是必须的!)

vi ~/.bashrc
# 在最后面添加:conda activate chatglm  
# 执行以下命令就可以了
source ~/.bashrc

三、Chatglm2-6B依赖安装

1、将chatglm2的依赖包:chatglm2-dependence,拷贝到:/home/work/chatglm2/下面。(这里work可以是你自己用户名)如下图所示:

2、通过pip进行安装,命令如下:

pip install --no-index --find-links=/home/work/chatglm2/chatglm2-dependence -r requirements.txt

3、授之以渔(非必须)
 chatglm2-dependence中的所有依赖,主要通过https://github.com/THUDM/ChatGLM2-6B的requirment.txt进行下载得到的。相关依赖包的下载命令为:

pip download -d ./chatglm2-dependence -r requirements.txt

四、模型文件准备

1、将chatglm2的模型文件:chatglm2-model,拷贝到:/home/work/chatglm2/下面。如下图所示

2、授之以渔(非必须)
模型文件是在https://huggingface.co/THUDM/chatglm2-6b/tree/main下载得到,具体截图如下:

五、模型加载Demo测试

 关于模型加载Demo的展示,目前官网给出了三种方式:分别为命令行、基于 Gradio 的网页版、基于 Streamlit 的网页版。下面是具体的操作方法。

1、首先,将chatglm-web,拷贝到:/home/work/chatglm2/下面。如下图所示

2、方法1:命令行模型Demo测试:进入到chatglm-web文件夹中,修改cli_demo.py文件中的模型路径地址,如下图所示

具体地,将上面的“THUDM/chatglm2-6b”修改成自己的模型文件路径,我们这里模型路径是在:/home/work/chatglm2/chatglm2-model,修改之后结果如下:

最后,wq!保存修改信息。这里有一个需要注意点:尽可能地用绝对路径,之前看有人部署的时候用的相对路径,在加载模型的时候找不到。
修改完配置文件,执行以下命令,直接就可以启动该脚本了。

python cli_demo.py

运行起来的截图如下所示:

3、方法2,通过基于Gradio的网页版运行模型加载测试Demo。

和方法1类似,这里也主要是修改web_demo.py配置文件,将“THUDM/chatglm2-6b”修改成自己的模型文件路径。然后执行以下命令,直接就可以启动该脚本了。

python web_demo.py

另外,如果要指定服务运行的IP和端口port可以按照以下方式修改。

4、方法3,通过基于 Streamlit 的网页版运行模型加载测试Demo。

和方法1类似,这里也主要是修改web_demo2.py配置文件,将“THUDM/chatglm2-6b”修改成自己的模型文件路径。然后执行以下命令,直接就可以启动该脚本了。另外,该种方式可以直接通过命令指定服务的端口、IP地址。

streamlit run web_demo2.py --server.address='0.0.0.0' --server.port=8099

六、模型API部署

 对模型进行API接口封装,可以实现模型的联机调用,具体操作方法如下:

1、文件放置
 进入到/home/work/chatglm2/chatglm2-web下面,修改api.py的文件,更改模型文件路径,如若要修改服务端口,可以在下面修改port参数,这里修改成了8099端口。

2、安装相关依赖:fastapi、uvicorn。

pip install fastapi uvicorn

:如果前面直接把chatglm2-dependence相关依赖都安装了,这一步可以忽略。我把这部分的依赖也都放到chatglm2-dependence里面了。
3、启动模型api服务

python api.py

4、测试。通过Postman、或者curl命令测试api接口是否正常。

# 通过命令行进行测试
curl -X POST "http://xxx.xxx.xxx.xxx:8099" \-H 'Content-Type: application/json' \-d '{"prompt": "猪为什么能够上树吃苹果", "history": []}'

七、OpenAI接口适配

 实现了OpenAI格式的流式API部署。即如果您之前调用的是ChatGPT的接口,可以实现缝切换chatglm2-6b。具体实现方式如下:

1、进入到/home/work/chatglm2/chatglm2-web下面,修改openai_api.py的文件,更改模型文件路径,如若要修改服务端口,可以在下面修改port参数,这里修改成了8099端口。

2、然后启动服务

python openai_api.py

3、测试服务的可用性, API 调用的示例代码为:

import openai
if __name__ == "__main__":openai.api_base = "http://xxx.xxx.xxx.xxx:8099/v1"openai.api_key = "none"for chunk in openai.ChatCompletion.create(model="chatglm2-6b",messages=[{"role": "user", "content": "你好"}],stream=True):if hasattr(chunk.choices[0].delta, "content"):print(chunk.choices[0].delta.content, end="", flush=True)

总结

 以上就是作者部署的整个过程了,其实当时自己花的时间较多的是显卡报错和模型文件问题。尤其是模型文件问题,模型下载下来和官网大小一致,没有对比MD5,结果有一个模型文件MD5不对导致模型一致不输出结果,搞了一天才发现这个问题。如有问题,关注 AINLPer 公众号,加群交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/87311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

次时代摸鱼骚操作:人在办公室轻松观看家里电脑上的4k电影(移动端公网访问本地群辉存储视频文件)

如何使用iPhone15在办公室观看家里电脑上的4k电影? 文章目录 如何使用iPhone15在办公室观看家里电脑上的4k电影?1.使用环境要求:2.下载群晖videostation:3.公网访问本地群晖videostation中的电影:4.公网条件下使用电脑…

适用于初学者,毕业设计的5个c语言项目,代码已开源

C语言项目集 项目介绍 该项目适用于初学者学习c语言,也适用于高校学生课程设计,毕业设计参考。 项目并不能满足所有人的需求,可进行项目指导,定制开发。 开源地址 c语言项目代码地址 项目列表 该项目包含如下5个管理系统&am…

在线安装qt5.15之后任意版本

下载qt现在安装包: window安装包链接 进入cmd,用命令行打开安装包,并指定组件下载地址(这个是关键,之前用的是腾讯镜像,出现了版本灰色无法选中问题) .\qt-unified-windows-x64-4.6.1-online…

git的基本操作

git的基本操作 一般思路: 新建个人分支加粗样式–克隆远程仓库代码—编辑本地分支代码–合入master分支(先切换到master分支)–master分支代码push到远程仓库 1、安装好git之后必须设置用户和邮箱信息之后才能提交代码到缓存区、本地库 git …

[C++随笔录] list使用

list使用 构造函数insert && 迭代器push_back && pop_back && push_front && pop_fronterasesort && find && reverse list的底层结构就是 带头双向循环链表 构造函数 // 默认构造 list<int> lt; cout << "l…

SolidJs节点级响应性

前言 随着组件化、响应式、虚拟DOM等技术思想引领着前端开发的潮流&#xff0c;相关的技术框架大行其道&#xff0c;就以目前主流的Vue、React框架来说&#xff0c;它们都基于组件化、响应式、虚拟DOM等技术思想的实现&#xff0c;但是具有不同开发使用方式以及实现原理&#…

基于win32实现TB登陆滑动验证

这里写目录标题 滑动验证触发条件&#xff1a;失败条件&#xff1a;解决方法:清除cooKie 滑动验证方式一&#xff1a;win32 api获取窗口句柄&#xff0c;选择固定位置 成功率高方式二&#xff1a; 原自动化滑动&#xff0c;成功率中 案例 先谈理论&#xff0c;淘宝 taobao.com …

ChatGPT详细搭建教程+支持AI绘画

一、AI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&#x…

人才测评系统在企业招聘中的应用

人才测评作为招聘工具&#xff0c;已经频繁应用在各大企业中&#xff0c;如今的社会中&#xff0c;人才对于企业而言&#xff0c;可谓是创造产值的基础。换句话说&#xff0c;”企业得人才者、才能得天下”&#xff0c;有了人才之后&#xff0c;企业在行业中才有竞争力。 目前…

ES修改字段的数据类型

-- mysql修改字段数据类型语句 ALTER TABLE 表名 MODIFY COLUMN 列名 修改的字段类型;-- hive 修改字段数据类型语句 ALTER TABLE 表名 CHANGE COLUMN 列名 修改的字段类型;--es修改字段数据类型语句无法通过一个语句进行修改。思路&#xff1a; 1、对修改字段重新建修改类型的…

【Redis】Redis做为缓存,MySQL如何与Redis保持数据一致

Redis的作用 一般情况下Redis是用来实现应用和数据库之间的一个读操作的缓存层&#xff0c;主要目的是减少数据库的io&#xff0c;还可以提升数据库io性能 方法一&#xff1a; 先更新MySQL数据库&#xff0c;再删除缓存&#xff0c;再从数据库查询到的最新的数据同步到redis…

Unity实现角色受到攻击后屏幕抖动的效果

文章目录 实现效果摄像机抖动脚本 玩家受伤其他文章 实现效果 首先看一下实现效果。 摄像机 我们要使用屏幕抖动&#xff0c;使用的是CinemachineVirtualCamera这个组件&#xff0c;这个组件需要在包管理器中进行导入。 导入这个组件之后&#xff0c;创建一个Chinemachine-…

CH2--x86系统架构概览

2.1 OVERVIEW OF THE SYSTEM-LEVEL ARCHITECTURE 图中的实线箭头表示线性地址&#xff0c;虚线表示段选择器&#xff0c;虚线箭头表示物理地址 2.1.1 Global and Local Descriptor Tables 全局描述符表 (GDT) GDT是一个全局的段描述符表&#xff0c;它存储在系统内存中的一个固…

MYSQL逻辑架构

文章目录 MYSQL逻辑架构1. 逻辑架构剖析1.1.1 MYSQL的逻辑架构---三层1.1.2 连接层---第一层1.1.3 服务层---第二层1.1.4 引擎层---第三层 2 服务器处理客户端请求---三部分3. SQL执行流程3.0 SQL语法顺序3.1 MYSQL中的SQL执行流程3.1.1 查询缓存3.1.2. 解析器3.1.3. 优化器3.1…

虹科方案 | LIN/CAN总线汽车零部件测试方案

文章目录 摘要一、汽车零部件测试的重要性&#xff1f;二、虹科的测试仿真工具如何在汽车零部件测试展露头角&#xff1f;三、应用场景**应用场景1&#xff1a;方向盘开关的功能测试****应用场景2&#xff1a;各类型电机的控制测试****应用场景3&#xff1a;RGB氛围灯的功能测试…

详解MySQL索引+面试题

前言: 📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年! 📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。 😇😇😇有兴趣的话关注博主一起学习,一起进步吧! 一、索引概述…

芯片SoC设计你了解吗?

数字IC设计根据岗位性质一般包含SOC设计&#xff0c;前端设计&#xff0c;ASIC设计&#xff0c;逻辑设计&#xff0c;IP设计&#xff0c;CPU设计等。 有人说&#xff1a;做IP设计就是翻译官&#xff0c;做SOC设计就是连连看。 SoC设计是做什么的&#xff1f;与IP设计有什么不同…

docker系列(7) - Dockerfile

文章目录 7. Dockerfile7.1 Dockerfile介绍7.2 指令规则7.3 指令说明7.3.1 RUN命令的两种格式7.3.1 CMD命令覆盖问题7.3.2 ENTRYPOINT命令使用7.3.3 ENV的使用 7.4 构建tomcat Dockerfile案例7.4.1 准备原始文件7.4.2 编写Dockerfile7.4.3 构建镜像7.4.4 验证镜像 7.5 构建jdk基…

【深度学习】ONNX模型多线程快速部署【基础】

【深度学习】ONNX模型CPU多线程快速部署【基础】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】ONNX模型CPU多线程快速部署【基础】前言搭建打包环境python多线程并发简单教程基本教程ONNX模型多线程并发 打包成可执行文件总结 前…

springboot实战(七)之jackson配置前后端交互下划线转驼峰对象序列化与反序列化

目录 环境&#xff1a; 1.驼峰转下划线配置 1.1单个字段命名转化使用JsonProperty注解 1.2单个类进行命名转化 3.全局命名策略配置 2. 序列化以及反序列化 2.1序列化 2.2反序列化 3.自定义序列化与反序列化 在Web开发中&#xff0c;JSON&#xff08;JavaScript Obje…