LangChain+LLM实战---私有化部署RAG大模型,ChatGLM2-6B、Baichuan2-13B

news2025/1/18 20:26:18

rag

图1:RAG的架构流程

经过之前一段时间的捣腾,个人感觉我们的RAG应用已经来到了一个全新的层面,在语义理解(相关度)和准确度上都有了长足进步。

但是问题来了。之前和菊厂的业务交流中,对方明确提出一些客户的私有化部署意愿是很明确,主要原因是数据安全。这段时间和一些销售人员、潜在客户交流的时候也收到了类似信息。而我们现在的整套技术栈中,唯一还不能私有化的是LLM。而这也是最终客户最担心的问题——他们的数据被送进云上的公共LLM,不管这些LLM在数据安全上如何申明,对于一些数据就是资产的客户来说依然存在忧虑。所以我们最近就在开始做LLM的本地化测试。

LLM选择标准

在选本地化的LLM之前,我们先根据实际情况定义一些选择标准:

  • 归纳优先:我们不需要LLM在各个方面都很优秀,不需要它们会很强的coding和复杂逻辑推理能力,RAG最重要的还是出色的归纳能力;
  • 体量考虑:不要太大,最好在13B及以下,因为再大就需要一张A100等专业显卡,或者要多张消费级显卡。我们的目标是一张RTX 4090可以解决问题,对很多客户来说,A卡很难买,而且价格太高了;
  • 中文能力:我们主要面对的还是中文业务,所以Llama对我们还是成本太高,如果自己做大量训练的话。

大模型试用选择

定义了选择标准之后,我们就来实际试用了。待选的其实也不多,我们自己有一个全量训练的BLOOM-7B,然后另外两个待选是ChatGLM2-6B和Baichuan2-13B。如果您还有其他更好的选择,可以私信我,哈。

试用自训练的BLOOM-7B

部署在公司内网的自训练BLOOM-7B是今年3月份就训练好的,当时也算是走在比较前面的,至少在我们文旅数字化行业,好像当时是没有的。BLOOM-7B在问答方面能力还是可以的,在文旅方面因为有我们自己多年的语料沉淀,在我们覆盖的客户景区的问答上,在当时效果超过ChatGPT。

bloom7b

图2:自训练的BLOOM-7B,没有使用原始权重,从CLM开始训练,使用了8块A100

但是,接入到RAG之后,发现归纳能力不太行。而且近期因为新的开源大模型出来很多,所以暂时也没有打算再去优化这个7B的大模型。所以,首先试用和淘汰的就是我们自己训练的BLOOM-7B,这个行业,真的一日千里啊,3月份训练的大模型,当时是小甜甜,现在已经是牛夫人了。

试用ChatGLM2-6B

目前我们使用的是智谱的标准版(API,在线版),效果应该说很棒,所以我们首先想到的是ChatGLM2-6B的开源版本。

chatglmapi

图3:智谱大模型的在线API,能力还是非常不错的。

ChatGLM2-6B因为已经有商业许可,所以两个月前就做了部署,把AutoModel.from_pretrained的指向从本地改成Hugging Face的模型地址让它更新到最新版本,然后接上我们的RAG做测试。说实话,使用同样的Prompt,ChatGLM2-6B的归纳能力只能说是复读机级别的(⊙o⊙)。LLM的归纳能力,太简单了可以通过Prompt优化改成复杂的,但是已经让它按最简单的方式去归纳了,依然是复读机的结果,那就不适用了。

chatglm2-6b

图4:ChatGLM2-6B的归纳能力就是复读机级别的,哪怕我们硬性规定用20个字归纳也不行。

因为ChatGLM2目前开放的就是6B和130B两个版本,但是130B的对于我们来说已经远超定义的选择范围,所以就放弃ChatGLM2了。

试用Baichuan2-13B

百川大模型选型

百川大模型是我们一个在老牌中厂的小伙伴给我们推荐的,据说他们内部已经在实用,而且效果不错,于是我就开始转向Baichuan2-13B。

baichuan2types

图5:百川大模型2目前的几个版本,7B、13B,以及Base和Chat版

我们首先选择的是13B,因为7B/6B这个级别的我们上面已经试用了,在技术层面没有碾压式的升级之前,参数体量有时候就决定了能力。对于Base和Chat,因为我们现在更多考察的还是归纳能力,所以为了方面考虑,选择了Chat版本。所以目前选择的就是Baichuan2-13B-Chat

接下来就是考虑量化版本,官方给出了资源表:

PrecisionBaichuan2-7BBaichuan2-13B
bf16 / fp1615.3 GB27.5 GB
8bits8.0 GB16.1 GB
4bits5.1 GB8.6 GB

表1:量化效果,来源于Baichuan2的Github说明

按一张RTX 4090(24GB)来算的话,最佳的应该是Baichuan2-13B的8bits版本。但是官方只提供了fp16和4bits两个版本,唯独没有8bits量化版本。

安装和运行fp16版本

我的做法是先部署fp16,先试试效果呗。

第一步是git clone代码,然后在Hugging Face上,models的过程是比较痛苦的,三个bin文件近28GB,最近几个月我发现直接下载(wget)总是无法成功,而我的Ubuntu服务器是没有科学上网的。所以只能在家里的Mac上先下载,直到今天凌晨2点才完成(好困~),然后传到Ubuntu上。

baichuan2models

图6:Baichuan2-13B的权重文件

先用fp16先安装,把cli_demo.py里面的model地址改成本地的,这样不用每次运行的时候都会查询并下载最新版权重文件,主要是等待时间太长了。

cli_demo.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
print("init model ...")
    model = AutoModelForCausalLM.from_pretrained(
        "baichuan-inc/Baichuan2-13B-Chat",  // 这里改成你自己的本地模型地址
        torch_dtype=torch.float16,
        device_map="auto",
        trust_remote_code=True
    )
    model.generation_config = GenerationConfig.from_pretrained(
        "baichuan-inc/Baichuan2-13B-Chat" // 这里改成你自己的本地模型地址
    )
    tokenizer = AutoTokenizer.from_pretrained(
        "baichuan-inc/Baichuan2-13B-Chat", // 这里改成你自己的本地模型地址
        use_fast=False,
        trust_remote_code=True
    )

运行程序:

1
python cli_demo.py

居然跑起来了,但是,推理的速度跟乌龟爬一样慢!

视频1:fp16,在我的RTX4090服务器上推理速度非常感人....

两个回合之后,直接就OutOfMemoryError了。

手工量化int8

那现在只能把fp16量化为8bits,还好,官网有提到量化的方法。

我们需要先安装两个lib:

1
2
3
pip install xformers

conda install bitsandbytes  //也可以使用pip

然后在原来的models平级目录mkdir一个models_8,然后我用了一个比较偷懒的做法,直接把cli_demo.py复制为quan8.py。

ls

图7:新增models_8文件夹,用来存放离线量化之后的int8权重,quan8.py就是转化脚本

下面修改这个新复制的quan8.py。

quan8.py

1
2
3
4
5
6
7
8
9
10
11
12
13
def init_model():
    print("quant8int model ...")
    model = AutoModelForCausalLM.from_pretrained(
        "/home/tumeng/llm/Baichuan2/models",
        load_in_8bit=True,
        device_map="auto",
        trust_remote_code=True
    )
    model.save_pretrained(
        "/home/tumeng/llm/Baichuan2/models_8"
    )

    return model

我是比较偷懒的方式,因为当时太困了!

其他的代码我不管(运行的时候会报错,但不影响),就修改了init_model()函数。AutoModelForCausalLM.from_pretrained里面的第一个参数是原权重文件,save_pretrained里面是量化出来的int8权重文件保存的目录。

运行成功

再次修改cli_demo.py,将model指向到int8的模型

cli_demo.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def init_model():
    print("init model ...")
    model = AutoModelForCausalLM.from_pretrained(
        "/home/tumeng/llm/Baichuan2/models_8",
        torch_dtype=torch.float16,
        device_map="auto",
        trust_remote_code=True
    )
    model.generation_config = GenerationConfig.from_pretrained(
        "/home/tumeng/llm/Baichuan2/models_8"
    )
    tokenizer = AutoTokenizer.from_pretrained(
        "/home/tumeng/llm/Baichuan2/models_8",
        use_fast=False,
        trust_remote_code=True
    )
    return model, tokenizer

再次运行cli_demp.py,这次运行成功了,而且推理速度满足要求,棒!

然后就到了检验Baichuan2-13B的归纳能力的时候了,我直接复制了小明给我的Prompt。

视频2:Baichuan2-13B(8ints)的推理速度还可以,归纳能力过关。

guina2

图8:基本上归纳的还是比较准确和简洁的。

速度、归纳效果,都还可以!那私有化,暂时就先选型Baichuan2-13B了。

对了,其实Baichuan2-13B的逻辑能力是有短板的,我经常用的一道测试题,它答得不好。

suanshu

图9:龙凤胎的逻辑推理题,Baichuan2-13B答错了

结论

这次大模型的选型测试主要还是为了私有化的需要,如果没有私有化(甚至完全断网)需求的话,个人感觉智谱的API还是挺好用的。本次选择除了最开始定义的三个过滤条件外,其实还有一个就是可商用,ChatGLM2-6B、BLOOM-7B和Baichuan2-13B都是符合这一条件的。

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

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

相关文章

Android 扩大View可点击区域范围

有时候会遇到这种需求:本身控件显示在很小的范围内,但是要求扩大可点击的区域。根据官方文档https://developer.android.com/develop/ui/views/touch-and-input/gestures/viewgroup?hlzh-cn#delegate可以得知通过 TouchDelegate 类,让父视图…

Qt 各种数据类型

目录 1. 基础类型 2. log 输出 3. 字符串类型 3.2 QByteArray 构造函数 数据操作 子字符串查找和判断 遍历 查看字节数 类型转换 3.3 QString 4. QVariant 4.1 标准类型 4.2 自定义类型 5. 位置和尺寸 5.1 QPoint 5.2 QLine 5.3 QSize 5.4 QRect 6. 日期和…

Halcon WPF 开发学习笔记(0):开篇介绍

文章目录 文章专栏Halcon是什么?安装教学视频链接简单来说 Halcon快速开发环境确认新建项目 文章专栏 Halcon开发 Halcon是什么? 史上最全VisionPro和Halcon 的详细对比 Halcon简述 Halcon基础大全(基础算子、高阶算子、数组、分割、字符检测…

AI视频智能分析系统在线监测垃圾满溢/堆放/暴露解决方案

一、背景需求 随着我国城市化进程的加快和居民生活水平的提高,垃圾围城的现象越来越严重。垃圾桶溢满、垃圾长时间暴露等现象,不仅严重污染了生态环境,同时也极大影响了市容市貌,并且对居民的身体健康也构成了威胁,因…

Figma软件的缺点和替代软件推荐

说到Figma软件,相信没有人不知道设计行业的人,尤去年Adobe以200亿美元收购Figma软件的消息,对设计行业影响很大。可想而知,Figma软件在设计行业人士眼中的地位是毋庸置疑的。的确,Figma软件的功能非常强大,…

JavaScript_document对象_方法_创建元素

1、document.createElement() document.createElement方法用来生成元素节点,并返回该节点 2、document.createTextNode() document.createTextNode方法用来生成文本节点(Text实例),并返回该节点。它的参数是文本节点的内容 3、…

Win系统强制删除文件/文件夹

Win系统强制删除文件/文件夹 前言系统磁盘清理360强制删除NPM删除 前言 Win系统的用户删除文件/文件夹时,可能由于权限问题导致文件无法正常删除,下文介绍解决方案。当常规的删除不起作用时,可使用如下方案进行删除,包含系统磁盘…

V-REP和Python的联合仿真

机器人仿真软件 各类免费的的机器人仿真软件优缺点汇总_robot 仿真 软件收费么_dyannacon的博客-CSDN博客 课程地址 https://class.guyuehome.com/p/t_pc/course_pc_detail/column/p_605af87be4b007b4183a42e7 课程资料 guyueclass: 古月学院课程代码 旋转变换 旋转的左乘与…

灵魂拷问:读取 excel 测试数据真的慢吗?

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

64位Office API声明语句第112讲

跟我学VBA,我这里专注VBA, 授人以渔。我98年开始,从源码接触VBA已经20余年了,随着年龄的增长,越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友,都来学习VBA,利用VBA,起码可以提高…

Linux开发工具的使用(vim、gcc/g++ 、make/makefile)

文章目录 一 :vim1:vim基本概念2:vim的常用三种模式3:vim三种模式的相互转换4:vim命令模式下的命令集- 移动光标-删除文字-剪切/删除-复制-替换-撤销和恢复-跳转至指定行 5:vim底行模式下的命令集 二:gcc/g1:gcc/g的作用2:gcc/g的语法3:预处理4:编译5:汇编6:链接7:函…

【ARFoundation学习笔记】ARFoundation基础(下)

写在前面的话 本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。难免出现纰漏,更多详细内容请阅读原文。 文章目录 TrackablesTrackableManager可跟踪对象事件管理可跟踪对象 Session管理 Trackables 在AR Foundation中,平面…

大厂面试题-b树和b+树的理解

为了更清晰的解答这个问题,从三个方面来回答: a.了解二叉树、AVL树、B树的概念 b.B树和B树的应用场景 1.B树是一种多路平衡查找树,为了更形象的理解,我们来看这张图。 二叉树,每个节点支持两个分支的树结构&#xff…

第十五届全国交通运输领域青年学术会议,和鲸 Heywhale 携手龙船科技联合发布科研服务解决方案

2023年10月29日,由中国交通运输协会青年科技工作者工作委员会主办,集美大学承办的“第十五届全国交通运输领域青年学术会议”在一片热烈的氛围中圆满落幕。 本届会议以“低碳•智能•安全•可持续综合交通发展创新”为主题,围绕综合立体交通…

JavaScript_document对象_方法_获取元素

1、document.getElementsByTagName 2、 document.getElementsByClassName() document.getElementsByClassName方法返回一个类似数组的对象(HTMLCollection实例),包括了所有class名字符合指定条件的元素,元素的变化实时反映在返回…

FL Studio21.2中文高级版数字音乐工作站(DAW)

FL Studio是一款功能强大的数字音乐工作站(DAW),软件提供了丰富的功能和工具,使音乐制作变得更加轻松和富有创意性。而在其中,一个关键的功能就是Fruity Wrapper,它在FL Studio中扮演着重要的角色。接下来给…

idea必装插件EditStarters(快速引入依赖)

前言 一般来说我们要向一个 servlet 或者 Spring 项目中引入依赖都需要先到中心仓库找到对应的依赖,选择依赖的版本,把依赖添加到配置文件 pom.xml 中,这其实还是有点麻烦的,而通过 EditStarters 插件我们可以迅速的添加依赖到项目…

计算机网络第4章-IPv6和寻址

IP地址的分配 为了获取一块IP地址用于一个组织的子网内,于是我们向ISP联系,ISP则会从已分给我们的更大 地址块中提供一些地址。 例如,ISP也许已经分配了地址块200.23.16.0/20。 该ISP可以依次将该地址块分成8个长度相等的连续地址块&…

Jakarta-JVM篇

文章目录 一.前言1. 1 JVM-堆常用调参1.2 JVM-方法区常用参数1.3 JVM-codeCache 二.JVM内存结构三. 对象创建四. JVM垃圾回收算法4.1 可达性分析算法4.1.1 对象引用4.1.2 回收方法区. 4.2 分代回收4.3 标记清除4.4 标记复制4.5 标记整理 五.垃圾回收器5.1 根节点枚举5.2 安全点…

2023-11-06今日最大收获:坑爹的 JpaRepository!

1.坑爹的 JpaRepository! org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet 2023-11-06 18:38:53.12…