macbook安装chatglm2-6b

news2024/11/27 6:12:13

1、前言

  chatglm安装环境还是比较简单的,比起Stable diffusion安装轻松不少。
  安装分两部分,一是github的源码,二是Hugging Face上的模型代码;安装过程跟着官方的readme文档就能顺利安装。以下安装内容,绝大部分是官方readme内容

note1:执行默认你在conda环境下运行,我就不累赘了
note2:默认认为你会把里面模型路径改为你本地的路径

2、环境

系统:macOS Ventura(13.4.1)
芯片:m2
内存:16G
python版本:2.10.11
python虚拟环境:anconda

3、代码下载

note:默认各位已经安装好git、brew软件

3.1、下载运行模型的代码

  逐行运行如下命令,克隆(git clone)代码、进入克隆好的目录、安装代码的python依赖

git clone https://github.com/THUDM/ChatGLM2-6B
cd ChatGLM2-6B
pip install -r requirements.txt

3.2、安装 Git Large File Storage

  使用brew包管理软件git lfs,其他方式可参考前面的蓝色超链接

brew install git-lfs

输入如下命令,验证是否安装成功

git lfs install

输出Git LFS initialized.即为安装成功

3.3、下载模型

3.3.1、下载未量化模型

  在运行模型代码以外目录,终端使用以下命令,会下载不包含lfs文件模型文件

GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/THUDM/chatglm2-6b

在这里插入图片描述
这里假定你顺利克隆,不能克隆,你懂的,你可以访问网站THUDM/chatglm2-6b
  克隆完之后,是不包含lfs的实体文件的。此时需要,去chatglm2-6b清华网盘下载模型文件,将文件全部下载,并覆盖到模型下面。

3.3.2、下载int4未量化模型

  在运行模型代码以外目录,终端使用以下命令,会下载不包含lfs文件模型文件

GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/THUDM/chatglm2-6b-int4

  克隆完之后,是不包含lfs的实体文件的。此时需要,去chatglm2-6b-int4清华网盘下载模型文件,将文件全部下载,并覆盖到模型下面。

4、运行模型

4.1、安装mps

curl -O https://mac.r-project.org/openmp/openmp-14.0.6-darwin20-Release.tar.gz
sudo tar fvxz openmp-14.0.6-darwin20-Release.tar.gz -C /

以下为项目FAQ引用

参考https://mac.r-project.org/openmp/
假设: gcc(clang)是14.x版本,其他版本见R-Project提供的表格此时会安装下面几个文件:/usr/local/lib/libomp.dylib, /usr/local/include/ompt.h, /usr/local/include/omp.h, /usr/local/include/omp-tools.h
注意:如果你之前运行ChatGLM项目失败过,最好清一下Hugging Face的缓存,i.e. 默认下是 rm -rf ${HOME}/.cache/huggingface/modules/transformers_modules/chatglm-6b-int4。由于使用了rm命令,请明确知道自己在删除什么。

参考Accelerated PyTorch training on Mac,命令行输入:

python
mps_device = torch.device("mps")
x = torch.ones(1, device=mps_device)
print (x)

进入python命令行,查看输出是否为tensor([1.], device='mps:0')确认是否支持mps,验证完毕关闭终端或者输入quit()退出

4.2、修改运行模型代码

  mac只能使用本地的文件运行,所以我们用前面下载的模型路径,进行加载。加载模型的方式有多种,但是修改方式都是统一的,即修改tokenizer和model变量加载代码。
未修改前:

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()

模型修改后:

tokenizer = AutoTokenizer.from_pretrained("/Users/hui/data/chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("/Users/hui/data/chatglm2-6b", trust_remote_code=True).half().to('mps')

int4模型修改后【这里增加修复报错的两行代码】:

import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'
tokenizer = AutoTokenizer.from_pretrained("/Users/hui/data/chatglm2-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("/Users/hui/data/chatglm2-6b-int4", trust_remote_code=True).float()

4.3、加载模型的demo种类

  按照readme描述,加载demo的方式有cli_demo.py、web_demo.py、web_demo2.py、api.py、openai_api.py这些方式运行模型并交互,你认真看项目会发现,我列的文件名差不多就项目的全部文件了。
  这里还未调通前,建议使用cli_demo.py来测试,因为这个加载方式是最容易发现错误的模式,调通后,建议改web_demo2.py来玩耍。
加载模型项目的文件下,命令行运行:

python cli_demo.py

在这里插入图片描述
  在用户行,输入问题,耐心等待输出的ChatGLM行输出答案,同时观察到系统是基本都是使用虚拟内存进行运行的,此时你的系统会很卡。这里是使用half方法情况下的内存情况,如果把half方法去掉,那么虚拟内存会到16G,输入问题的时候,你的8个cpu也会都使用率过半。

5、加载模型知识

  加载模型都是方式都是一样,这里区别在于你加载模型在哪里运行,有cpu和gpu两种方式。
这里总结下文档和网上看到一下方式。

5.1、gpu方式

  gpu方式其实就是使用cuda()方法,即加载代码的结尾使用cuda(),使用gpu方式可以指定模型加载的进度,默认模型不指定的时候是16位浮点,可以在cuda()前面再用有参quantize()方法指定为8位或者4位。
note:cuda肯定要求你是英伟达显卡啦,英伟达的技术
例:

# 按需修改,目前只支持 4/8 bit 量化
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).quantize(8).cuda()

5.2、cpu方式

  cpu方式使用float()和to(‘mps’)进行指定,就不能使用quantize()指定了,会报错,可以使用half()进行指定,我也是尝鲜,所以不知道这个方法的用法,但是从表现来看,节省了一半以上的内存,但是只在to(‘mps’)上生效,float()加上没有效果,还是使用了19G虚拟内存。
例:

model = AutoModel.from_pretrained("/Users/hui/data/chatglm2-6b", trust_remote_code=True).half().to('mps')

5.3、使用压缩向量模型

  官方提供4精度模型(即THUDM/chatglm2-6b-int4)运行,使用起来,的确快了不少,但是总体上来也是龟速。
这个只是换了个小模型,同样可以用gpu和cpu加载起来

6、遇到的报错

报错1:

AssertionError: Torch not compiled with CUDA enabled

这事因为用了cuda()方法加载模型,报错意思是你的torch不是适配cuda编译的,但也不用更换,因为我的是mac,只有m2芯片,没有gpu,故不用折腾,使用上面提到的cpu方式加载即可

报错2:

OMP: Error #15: Initializing libomp.dylib, but found libomp.dylib already initialized.

这种情况是在int4模型加载才会出现,出现问题原因是系统中存在多个mps的环境。解决方式是加载时设置环境变量,加载前,加入如下代码:

import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'

看意思就是允许多个动态库加载

报错3

Failed to load cpm_kernels:Unknown platform: darwin

THUDM/ChatGLM-6B/issues/6这里从issue回复看,没用到相关功能,不用理会即可。实际只有int4模型才会提示,而且也不影响使用。

报错4:

cannot import name 'COMMON_SAFE_ASCII_CHARACTERS' from 'charset_normalizer.constant'

是因为缺失了部分东西,重新安装即可。
运行如下命令安装:

pip install chardet

报错5:

AttributeError: 'NoneType' object has no attribute 'int4WeightExtractionHalf'

这个报错int4模型下才会出现,解决方式就是改为float()方式运行解决

参考博客:
1、MAC安装ChatGLM-6B报错:Unknown platform: darwin
2、Python—OMP: Error #15: Initializing libomp.dylib, but found libiomp5.dylib already initialized.
3、cannot import name ‘COMMON_SAFE_ASCII_CHARACTERS‘ from ‘charset_normalizer.constant‘ ,已解决!

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

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

相关文章

自然语言处理:多层感知机MLP和Word2vec

文章目录 多层感知机MLP1.神经网络2.反向传播算法3.激活函数4.损失函数5.神经网络的使用场景 Word2vec参考 多层感知机MLP 1.神经网络 神经网络是一种计算模型,它受到人脑神经元之间连接和信息处理方式的启发。它由许多简单的处理单元(称为神经元或节点…

初始Liunx线程

文章目录 前言1.初始Liunx下线程2.关于虚拟地址的补充知识3.线程的相关特点1.线程的优点2.线程的缺点3.线程异常4.线程和进程的比较 4.线程相关操作接口线程控制相关接口 5.关于线程id的理解 前言 本文主要是对Liunx之下线程的前置知识铺垫,同时也是对之前进程的相…

Spring Boot 中的认证是什么,如何使用

Spring Boot 中的认证是什么,如何使用 在 Web 应用程序中,认证是一项重要的安全措施。Spring Boot 提供了丰富的认证机制,可以帮助我们轻松地实现各种认证需求。本文将介绍 Spring Boot 中的认证是什么,以及如何使用 Spring Boot…

2023上半年软考系统分析师科目一整理-16

2023上半年软考系统分析师科目一整理-16 信息系统的性能评价指标是客观评价信息系统性能的依据,其中,( )是指系统在单位时间内处理请求的数量。 A.系统响应时间 B.吞吐量 C.资源利用率 D.并发用户数 运用互联网技术,在…

软件工程——第7章实现知识点整理

本专栏是博主个人笔记,主要目的是利用碎片化的时间来记忆软工知识点,特此声明! 文章目录 1.实现由哪两个部分组成? 2.编码是什么?所选用的程序设计语言对程序的哪些特性有着深远影响? 3.软件测试在软件生…

旅游卡系统招募城市合伙人

旅游业的不断发展,旅游卡系统作为一种新型的旅游消费模式也逐渐被越来越多的人所认可。现在,许多旅游卡系统开始招募城市合伙人,以进一步拓展其市场。 旅游卡系统是一种可以将不同景区、景点门票进行整合,并提供折扣优惠的旅游…

谈谈mysql——Binlog的复制方式和解析技巧

mysql 我们先来看一下MySQL的基本架构,从大的方面来讲,一个server层,一个引擎层。server层就像一个接口,可以对接任何符合规定的引擎。具体的细节可以参考我之前写过的文章mysql的这些坑你踩过吗?快来看看怎么优化mys…

vue3+pinia用户信息持久缓存(token)的问题

vue3pinia用户信息持久缓存(token)的问题 对博主来说,这是个相当复杂的问题。 当初在使用vue2vuex进行用户信息持久登录时,写了不下3篇博客,确实是解决了问题,博客链接如下 vue存储和使用后端传递过来的tokenvue中对…

动态规划之 509斐波那契数(第1道)

目录 题目:斐波那契数 (通常用 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。 解法: 动态规划法: 题目:斐波那契数 (通常用…

大象机器人人工智能套装2023版深度学习协作机器人、先进机器视觉与应用场景

引言: 介绍当前的版本 今天我们要介绍的是aikit2023,aikit2023是aikit的全新升级版。 AIkit 2023 是一套集视觉,定位抓取、自动分拣模块为一体的入门级人工智能套装。 该套装基于python平台,可通过开发软件实现机械臂的控制&am…

gitee提交项目失败记录:remote:error:hook declined to update refs/heads/master

问题描述; 今天修改了项目里面一些文件内容,结果提交的时候报错了,可以提交到本地仓库,但提交到中央仓库报如下异常,因此记录下,防止后面再遇到…… 解决办法: 登录gitee账号,在设置…

自定义MVC的进阶使用

文章目录 前言一、环境配置1.1 将框架打包成jar包1.2 将Jar包导入新项目1.3 将分页标签相关文件、及相关助手类导入1.4 配置文件 二、前后台编写2.1 实体类2.2 dao2.3 Servlet2.4 配置mvc.xml2.5 JSP2.6 运行结果 前言 通用增删改查、通用分页、XML解析反射建模,包…

【网络安全带你练爬虫-100练】第6练:内嵌发包提取数据

目录 一、分析目标: 二、代码实现 目标1:对于捕获的URL内嵌发包 目标2:找到电话和邮箱的位置 目标3:提取电话和邮箱 三、完整代码 四、网络安全小圈子 (注:需要带上登录成功后的cookie发包&#xff…

Nginx部署前后端分离项目

dev.env.js解释 //此文件时开发环境配置文件 use strice//使用严格模式 const merge require(webpacl-merge)//合并对象 const prodEnv require(./prod.env)//导出 module.exports merge(prodEnv,{//合并两个配置文件对象并生成一个新的配置文件,如果合并的过程…

使用Postman做接口测试并生成接口测试报告

学习目标 1、录制脚本或使用手写url进行抓包 2、微信api接口(可录制可手写) 3、添加多 个标签,获取多个标签,编辑多个标签,删除多个标签!!!(csv格式) 4、通过…

Java JDK 安装及环境配置教程

一、安装 1、安装包 jdk1.8安装包下载路径 2、创建一个英文的文件夹 注意:整个路径不要有中文、建议文件夹直接命名为JDK。 3、在该文件夹下创建两个空文件夹,分别为:jdk1.8 和 jre 其中jdk1.8 是我的JDK版本,这个可以自行改变。…

宝塔 安装/使用Jenkins-图文小白教程

一、Jenkins包下载 大家可以从Jenkins官网(https://www.jenkins.io/)根据自己的需要下载最新的版本。 但Jenkins官网下载较慢,容易造成下载失败。可以去国内的开源镜像网站下载Jenkins最新版本。目前博主使用的是清华大学的开源镜像网站&…

【spring创建对象方式】 and 【Java创建对象方式】

Spring创建对象方式 通过构造函数创建对象,通过静态工厂方式创建对象,通过实例工厂方式创建对象 1、通过构造函数创建对象 无参构造函数: 最基本的对象创建方式,只需要有一个无参构造函数(类中没有写任何的构造函数…

excel 复制出来的数据内容自动带上空格

在excel中批量处理完了公式,想复制到navicat 或者文本编辑框里,发现都会自动带上双引号,但是excel 里是没有,查找了半天。 在excel里的文本如下所示 拷贝出来的结果如下所示: 经过检查发现原文中只要带有回车或者换行…

A40i Linux3.10开发板移植高精度定时器hrtimer驱动

目录 整编内核 修改Makefile文件 编译内核 生成.ko文件 应用层调用 这里使用整个编译内核的方式编译.ko文件。 整编内核 编写一个hrtimer_demo.c的驱动程序源码如下&#xff1a; #include <linux/module.h> #include <linux/kernel.h> #include <linux/i…