Centos部署清华ChatGLM3-6B详细教程

news2024/11/27 7:41:25

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

引言

 上周末,智谱AI在2023中国计算机大会(CNCC)上推出了全自研的第三代基座大模型ChatGLM3,在各个任务上相比ChatGLM2都有了很大的提升。今天终于下载了模型部署测试,实际效果确实要比ChatGLM2要好。

结合自己实际操作过程,整理一篇关于ChatGLM3的部署的文档分享给大家。本文主要包括显卡驱动安装、Python虚拟环境、ChatGLM3依赖安装、模型文件准备、模型加载Demo测试、OpenAI接口适配等六个部分,如果显卡驱动和python环境都好了,可以直接跳到后面。

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

说在前面

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

1.显卡驱动安装

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

:对应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

最后截图如下所示:

2、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安装包:因为chatglm3用到了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)版本的代码,这里就为chatglm3-6b创建一个单独的python虚拟机环境,名字叫:chatglm3,后面会在该环境中安装跑chatglm3-6b模型的所有依赖。下面是命令及截图:

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

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

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

3、Chatglm3依赖安装

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

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

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

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

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

4、模型文件准备

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

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

5、模型加载Demo测试

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

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

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

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

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

python cli_demo.py

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

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

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

python web_demo.py

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

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

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

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

6、OpenAI接口适配

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

1、进入到/home/work/chatglm3/chatglm3-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="chatglm3-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不对导致模型一致不输出结果,搞了一天才发现这个问题。

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

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

相关文章

芯片封装技术

一、概述 封装的作用 1.3 封装类型 1.3.1 打线封装(Wire Bonding) 打线封装是传统的封装方式,具体过程是将晶圆切割为晶粒(Die)后,使晶粒贴合到相应的基板架的小岛(LeadframePad&#xff09…

leetcode:389. 找不同

一、题目 函数原型:char findTheDifference(char * s, char * t) 二、思路 作者原先的思路是先将两个字符串从小到大排序,然后两个字符串依次比较。若出现字符串t中的元素和字符串s不相等,则说明该元素就是被添加的字母。 但是,该…

在Spring中,教你一招优雅的获取国际化语言配置的方法

在Spring中,可以将国际化语言放到HTTP请求头部,以便后端程序能够获取并解析该语言。一种常见的方式是使用Accept-Language标头字段来设置语言。下面是一个示例代码,演示如何从HTTP请求头部获取该字段的值: 在 Spring 中,可以通过 HttpServletRequest 对象获取 HTTP 头部信…

【Spring】SpringWebMVC入门

Spring Web MVC入门 什么是SpringWebMVCMVC定义什么是SpringMVC 学习SpringMVC建立连接RequestMapping注解RequestMapping使用 请求传递单个参数传递多个参数传递对象后端参数重命名传递数组传递集合传递JSON获取URL中参数pathVariable上传文件RequestPart获取Cookie/Session获…

【市场分析】Temu数据采集销售额商品量占比分析数据分析接口Api

引言 temu电商平台是一个充满活力的电商平台,拥有多种商品类别和数万家店铺。在这个项目中我的任务是采集平台上的大量公开数据信息。通过数据采集,我旨在深入了解temu电商平台的产品分布、销售趋势和文本描述,以揭示有趣的见解。 数据采集…

Java web(四):JSP

文章目录 一、JSP1.1 概述1.2 JSP入门1.3 JSP脚本1.4 缺点 二、EI表达式三、JSTL3.1 标签3.2 JSTL使用3.3 代码演示 四、MVC模式和三层架构五、项目实战【完成增删改查】 一、JSP 1.1 概述 JSP(全称:Java Server Pages):Java 服…

【UE 材质】简单的闪闪发光材质

效果 节点 参考视频: https://www.bilibili.com/video/BV1uK411y737/?vd_source36a3e35639c44bb339f59760641390a8

自动化测试--验证邮件内容

场景 业务上有许多发送邮件的场景,发送的邮件基本上都是自动发送的,而且邮件内容是很重要的,对于邮件发没发送,发送的时间点对不对每次回归测试工作量太大了,所以考虑把这部分内容加入到自动化测试中 工具 python g…

精选8款UML图工具,闭眼入!

在现代软件开发领域,UML(统一建模语言)图是不可或缺的工具之一,用于可视化和通信复杂系统的结构和设计。然而,在选择合适的UML图工具时,你需要考虑多个因素,如项目规模、团队协作需求、功能复杂…

【Unity实战】最全面的库存系统(四)

文章目录 先来看看最终效果前言问题新增数据库,自动添加物品唯一ID物品配置唯一的ID替换原来的instanceID丢弃物品每次只丢弃一个物品问题完结先来看看最终效果 前言 本期紧跟着上期,继续来完善我们的库存系统,实现存储物品唯一ID和加载功能,丢弃物品功能 问题 instance…

【方法】如何解压ZIP格式压缩文件?

ZIP是一种常见的压缩文件格式,可以将一个或多个文件和文件夹打包成单个文件,以减少存储空间和传输时间。那想要读取压缩包里的文件,要如何解压呢? 压缩和解压压缩包,都需要用到解压缩软件,下面来分享一下3…

一键翻译,批量重命名,让文件夹名更贴心!

在日常生活和工作中,我们经常需要处理大量的文件夹。有时候,我们需要根据特定的需求对这些文件夹进行重命名。但是,手动重命名每个文件夹不仅耗时且容易出错。现在,我们的文件改名工具为你提供了一键翻译、批量重命名的便捷服务&a…

C语言调试技巧(debug)及程序运行时出现的问题

目录 一、什么是调试 1.介绍调试 2.Debug与Release 3.Debug与Release的对比 二、怎么调试 1.介绍几个调试快捷键 2.调试的时候查看程序当前信息 三、常见编程错误 1.编译型错误(最简单) 2.链接型错误 3.运行时错误(最难&#xff0…

stm32F407系列控制板用户手册

stm32F407系列控制板用户手册 文章目录 stm32F407系列控制板用户手册1.外观和接口标注2.功能3.参数4.应用场景 1.外观和接口标注 2.功能 智能配网远程控制多路舵机接口多路电机接口姿态实时采集ps 接口oled屏OTA固件一键升级语音控制-需借助app语音识别功能预留can接口预留多个…

IPMI接口配置

1.IPMI接口和RJ45的网口外观上一样,一般主板上带有的IPMI接口会和网卡分开放置,具体区分还要看主板的Specification,下面红色部分的即为IPMI接口 2.找到IPMI接口后,我们要接上一根网线。然后开机进入BIOS,具体按那个…

请一个折腾了5个月AI绘画的人来讲讲GPU选择的经验,没入坑的看他这一篇就足够了

一个折腾了5个月AI绘画的人来讲讲经验,基本上入坑只需要看这一篇就可以了。 不说废话,首先,将显卡分成专业级和家用级。然后两个级别里面再各分高中低一共6档,我一档一档说,包括大家关心的移动版显卡以及显存升级问题…

备忘录在电脑里叫什么?Win10系统自带的备忘录在哪打开?

对于每天都需要使用电脑来办公的职场人士来说,能够随手在电脑桌面上记录工作笔记、常用工作资料、工作注意事项等内容是非常有必要的。但是如果想要实现在电脑上随手记录事情,就需要先找到一款类似于备忘录或便签软件那样的记事软件。 那么备忘录在电脑…

datagrip出现 java.net.ConnectException: Connection refused: connect.

出现这样的情况要看一下hadoop有没有启动 start-all.sh nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 & scp -r /export/server/apache-hive-3.1.2-bin/ node3:/export/server/ /export/server/apache-hive-3.1.2-bin/bin/hive show databa…

Linux - 安装Ubuntu虚拟机

1,安装VMware Workstation 16 Player,然后运行。 2,选择安装一个新的虚拟机和之后安装操作系统。 3,选择Linux Ubuntu 64-bit 4,填写虚拟机名字和存放的路径。 5,选择硬盘大小。 6,可以定制硬…

Appium 结合 TestNG 并行执行测试

Appium 测试框架可以让我们使用不同的编程语言(Java、Python、Ruby、JavaScript)测试不同移动端平台的应用(Android、iOS),目前也是最火的移动端测试框架。这篇文章会带着大家学习到如何在不同设备中并行执行测试。 并…