类ChatGPT开源项目的部署与微调:从LLaMA到ChatGLM-6B

前言

近期,除了研究ChatGPT背后的各种技术细节 不断看论文(至少100篇,100篇目录见此:ChatGPT相关技术必读论文100篇),还开始研究一系列开源模型(包括各自对应的模型架构、训练方法、训练数据、本地私有化部署、硬件配置要求、微调等细节) 

本文一开始是作为此文《ChatGPT技术原理解析:从RL之PPO算法、RLHF到GPT4、instructGPT》的第4部分,但随着研究深入 为避免该文篇幅又过长,将把『第4部分 开源项目』抽取出来 独立成本文,然后不断续写本文到最终2万字左右(3.22日6000余字)

毕竟我上半年的目标之一,便是把ChatGPT涉及的所有一切关键技术细节,以及相关的开源项目都研究的透透的,故过程中会不断产出一篇篇新文章出来,比如:

  1. 微积分和概率统计极简入门
  2. 一文通透优化算法
  3. 强化学习极简入门:通俗理解MDP、DP MC TC和Q学习、策略梯度、PPO
  4. ChatGPT技术原理解析(本系列核心主体,也是同类解读里最清晰、全面、细致的一篇)
  5. ChatGPT相关技术论文100篇
  6. 类ChatGPT开源项目
  7. CV多模态模型发展史(23年4月发布),详述GPT4背后多模态的能力起源与发展历史,包括但不限于DTER、DDPM、Vision Transformer、CLIP、Swin Transformer、DALL·E 2、Stable Diffusion、BEiT-3、Visual ChatGPT、GPT4等.

第一部分 Colossal-AI、PaLM-rlhf-pytorch、Open-Assistant等

 虽说GPT3在2020年就出来了,但OpenAI并未开源,所以直到一年半后以后才有国内外各个团队比如DeepMind等陆续复现出来,这些大厂的复现代码我们自然无法窥知一二,毕竟人家也未开源出来

再到后来基于GPT3的InstructGPT、基于GPT3.5ChatGPT初版(GPT3.5的参数规模也尚无准确定论)、GPT4均未开源,OpenAI不再open,好在Meta等公司或研究者开源出了一系列类ChatGPT项目,本部分针对其中部分做下简要推荐(根据发布顺序排序)

1.1 基于Colossal-AI低成本实现类ChatGPT迷你版的训练过程

2.15,很多朋友在GitHub上发现了一个基于Colossal-AI低成本实现类ChatGPT迷你版训练过程的开源项目(基于OPT + RLHF + PPO),虽是类似GPT3的开源项目与RLHF的结合,但可以增进我们对ChatGPT的理解,该项目有几个不错的特点

  1. 很多同学一看到DL,便会想到大数据,而数据量一大,还用CPU处理的话很可能训练一个小任务都得半天,而如果用GPU跑,可能一两分钟就出来了。于此,在深度学习大火的那几年,特别是AlphaGo出来的16年起,我司七月在线便分别为VIP、AI系统大课、在职提升大课、求职/论文/申博/留学1V1辅导提供GPU云平台进行实战训练

    但如果想训练那种千亿参数规模的开源模型,就不只是有GPU就完事了,比如1750亿参数规模这种得用64张AI 100(即便经过一系列内存开销上的优化,也得至少32张AI 100,单张AI 100售价10万以上,且现在还经常没货),这样的硬件要求是大部分个人是无法具备的,所以该开源项目提供了单GPU、独立4/8-GPUs 的版本
  2. 如下代码所示,启动简单
    from chatgpt.nn import GPTActor, GPTCritic, RewardModel
    from chatgpt.trainer import PPOTrainer
    from chatgpt.trainer.strategies import ColossalAIStrategy
    
    strategy = ColossalAIStrategy(stage=3, placement_policy='cuda')
    
    with strategy.model_init_context():
        actor = GPTActor().cuda()
        critic = GPTCritic().cuda()
        initial_model = deepcopy(actor).cuda()
        reward_model = RewardModel(deepcopy(critic.model)).cuda()
    
    trainer = PPOTrainer(strategy, actor, critic, reward_model, initial_model, ...)
    trainer.fit(prompts)
  3. 训练过程明确清晰,如下图(由于上文已经详细介绍过ChatGPT的训练步骤,故不再赘述)

此外,据钟博士在我所维护的『Machine Learning读书会群』里所说,Colossal-AI的并行效率确实不错,是新加坡的一个初创团队推出的,但目前尚没有团队采用Colossal-AI框架来做主训练框架训练175b级别的超大模型,可以再了解下Meta家训练OPT用的Metaseq

1.2 PaLM-rlhf-pytorch、Open-Assistant等项目

此外,GitHub上还有这些项目

  • PaLM-rlhf-pytorch
    该项目是在PaLM架构之上实现RLHF,可以理解为基于PaLM的ChatGPT
  • Open-Assistant
    它旨在让每一个人都可以访问基于聊天的大语言模型,项目作者希望借此在语言创新方面掀起一场革命,就像 stable diffusion 帮助世界以新的方式创造艺术和图像一样
    项目作者计划收集高质量人工生成指令执行样本(指示 + 响应),目标大于 50k,对于收集到的每个指示,他们将采样多个补全结果,之后进入基于指示和奖励模型的RLHF训练阶段

第二部分 从Meta发布的LLaMA到基于LLaMA微调的斯坦福Alpaca

2.1 Meta发布大语言模型LLaMA:参数少但多数任务的效果好于GPT3

一直致力于LLM模型研究的国外TOP 3大厂除了OpenAI、Google,便是Meta(原来的Facebook)

Meta曾第一个发布了基于LLM的聊天机器人——BlenderBot 3,但输出不够安全,很快下线。再后来,Meta发布一个专门为科学研究设计的模型Galactica,但用户期望过高,发布三天后又下线

2.24日,Meta通过论文《LLaMA: Open and Efficient Foundation Language Models》发布了自家的大型语言模型LLaMA,有多个参数规模的版本(7B 13B 33B 65B)

LLaMA只使用公开的数据(CommonCrawl的数据占比67%,C4数据占比15%,Github Wikipedia Books这三项数据均各自占比4.5%,ArXiv占比2.5%,StackExchange占比2%),论文中提到

When training a 65B-parameter model, our code processes around 380 tokens/sec/GPU on 2048 A100 GPU with 80GB of RAM.

This means that training over our dataset containing 1.4T tokens takes approximately 21 days

且试图证明小模型在足够多的的数据上训练后,也能达到甚至超过大模型的效果

  • 比如130亿参数的版本在多项基准上测试的效果好于2020年的参数规模达1750亿的GPT-3
  • 而对于650亿参数的LLaMA,则可与DeepMind的Chinchilla(700亿参数)和谷歌的PaLM(5400亿参数)旗鼓相当
  • 且Meta还尝试使用了论文「Scaling Instruction-Finetuned Language Models」中介绍的指令微调方法,由此产生的模型LLaMA-I,在MMLU(Massive Multitask Language Understanding,大型多任务语言理解)上要优于Google的指令微调模型Flan-PaLM-cont(620亿)

模型结构上,除了继续基于Transformer这个架构外

  • 为了提高训练的稳定性,对每个transformer子层的输入进行归一化,而不是对输出进行归一化
    且使用由Zhang和Sennrich(2019)提出的RMSNorm归一化函数
  • 用Shazeer(2020)提出的SwiGLU替代ReLU
  • 删除absolute positional embeddings, 在网络的每一层添加RoPE

LLaMA发布不久后,一些研究者基于它做了不少工作

  • 一开始最小参数7B的模型也需要近30GB的GPU才能运行,但通过比特和字节库进行浮点优化,能够让模型在单个NVIDIA RTX 3060上运行
  • 之后,GitHub 上的一名研究人员甚至能够在Ryzen 7900X CPU上运行LLM的7B 版本,每秒能推断出几个单词
  • 再之后,有研究者推出了llama.cpp,无需 GPU,就能运行 LLaMA
    llama.cpp 项目实现了在MacBook上运行 LLaMA,还有开发者成功的在 4GB RAM 的树莓派上运行了 LLaMA 7B,总结而言,即使开发者没有GPU ,也能运行 LLaMA 模型
  • 再之后初创公司 Nebuly AI开源了RLHF版的LLaMA,即ChatLLaMA的训练方法
    由于LLaMA没有使用RLHF方法,因此ChatLLaMA的训练过程类似 ChatGPT,该项目允许基于预训练的 LLaMA 模型构建 ChatGPT 形式的服务
    与 ChatGPT 相比,LLaMA 架构更小,但训练过程和单GPU推理速度更快,成本更低
    且该库还支持所有的 LLaMA 模型架构(7B/13B/33B/65B),因此用户可以根据训练时间和推理性能偏好对模型进行微调

2.2 斯坦福Alpaca:人人都可微调Meta家70亿参数的LLaMA大模型

3月中旬,斯坦福发布Alpaca:号称只花100美元,人人都可微调Meta家70亿参数的LLaMA大模型(即LLaMA 7B),通过52k指令数据、8个80GB A100上训练了3个小时,性能比肩GPT-3.5(text-davinci-003)

  • 论文《Alpaca: A Strong Open-Source Instruction-Following Model》
  • 代码地址:https://github.com/tatsu-lab/stanford_alpaca

而斯坦福团队微调LLaMA 7B的方法,便是来自华盛顿大学Yizhong Wang等22年12月通过这篇论文《SELF-INSTRUCT: Aligning Language Model with Self Generated Instructions》提出的Self-Instruct

具体而言,论文中提出

  1. 人工设计175个任务,每个任务都有对应的{指令 输入 输出/实例}或{指令 输出/实例},将这175个任务数据作为种子集
  2. 然后提示模型比如GPT3对应的text-davinci-001 (不是像某些文章写的用text-davinci-003,because their newer engines are trained with the latest user data and are likely to already see the SUPERNI evaluation set),使用种子集作为上下文示例来生成更多新的指令
  3. 对该模型生成的指令判断是否分类任务
  4. 使用模型生成实例
  5. 对上述模型生成的数据{指令 输入 输出/实例}过滤掉低质量或相似度高的
  6. 将经过过滤和后处理的数据添加到种子池中
    一直重复上述2-6步直到种子池有足够多的数据

而斯坦福的Alpaca,就是花了不到500美元使用OpenAI API生成了5.2万个这样的示例微调LLaMA搞出来的,个人觉得可以取名为 instructLLaMA-7B,^_^

第三部分 国内的GLM与类ChatGPT项目ChatGLM-6B

3.1 GLM:国内为数不多的可比肩GPT3的大模型之一

2022年8月,清华背景的智谱AI推出拥有1300亿参数的中英双语稠密模型 GLM-130B(论文地址),在一些任务上的表现优于GPT3-175B,是国内与GPT3(OpenAI于2020年5月推出)能力差不多的模型之一(即便放到23年年初也并不多)

3.2 类ChatGPT开源项目ChatGLM-6B的训练框架与部署步骤

ChatGLM-6B(介绍页面、代码地址),是智谱 AI 开源、支持中英双语的对话语言模型,其

  • 基于General Language Model(GLM)架构,具有62亿参数,支持在单张 2080Ti 上进行推理使用(且INT4量化级别下最低只需 6GB显存)
  • ChatGLM-6B参考了 ChatGPT 的设计思路,在千亿基座模型GLM-130B中注入了代码预训练,通过监督微调(Supervised Fine-Tuning)、反馈自助(Feedback Bootstrap)、人类反馈强化学习(Reinforcement Learning from Human Feedback) 等方式等技术实现人类意图对齐,并针对中文问答和对话进行优化
  • 最终经过约 1T 标识符的中英双语训练,生成符合人类偏好的回答

虽尚有很多不足(比如因为6B的大小限制,导致模型的记忆能力、编码、推理能力皆有限),但在6B这个参数量级下不错了,部署也非常简单,我七月在线的同事朝阳花了一两个小时即部署好了(主要时间花在模型下载上,实际的部署操作很快)

以下是具体的部署过程(机器用的七月的GPU服务器,显存大小为16G的P100,最终占用13G)

  1. 配置环境:pip install -r requirements.txt(特别注意torch版本大于1.10,transformers大于4.23)
    torch的安装命令参考pytorch官网:https://pytorch.org/
  2. 下载项目仓库:
    git clone https://github.com/THUDM/ChatGLM-6B
    cd ChatGLM-6B
  3. 下载ChatGLM-6B模型文件
    下载地址:https://huggingface.co/THUDM/chatglm-6b
  4. 有两种运行方式,一种是基于Gradio,一种是基于streamlit
    基于Gradio:
    运行web_demo.py即可(注意可以设置share=True,便于公网访问):python web_demo.py(注意运行前确认下模型文件路径)

    基于streamlit:
    pip install streamlit
    pip install streamlit-chat
    streamlit run web_demo2.py --server.port 6006(可以将6006端口放出,便于公网访问)

此外,据介绍,GLM团队正在内测130B参数的ChatGLM,相信从6B到130B,效果应该能提升很多

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java代码是如何被CPU狂飙起来的?

📣📣📣📣📣📣📣 🎍大家好,我是慕枫 🎍前阿里巴巴高级工程师,InfoQ签约作者、阿里云专家博主,一直致力于用大白话讲解技术知识 &#x…

安全防御之防火墙篇(二)

目录 1.防火墙如何处理双通道协议? 2.防火墙如何处理NAT? 3.防火墙支持哪些NAT技术,主要应用的场景是什么? 4.当内网PC通过公网域名解析访问内网服务器的时候,会存在什么问题,如何解决?请详细…

【MySQL】CentOS编译安装MySQL5.7实战

前言 这篇文章是关于MySQL编译安装的,重点掌握的是编译的过程,以及体会排错的痛苦。出错在所难免,最重要的是要有一颗不放弃的心。 本文收录于《数据库入门与精通》专栏, 本专栏写作的过程中,联合了csdn几位DBA大佬,…

SpringBoot整合Kafka(包含Kafka_2.12-3.3.1单节点安装,kafka可视化程序efak v3.0.1安装)

SpringBoot整合Kafka(包含Kafka_2.12-3.3.1单节点安装,kafka可视化程序efka v3.0.1安装)kafka、efak安装包下载kafka安装资源下载:下载tgz安装包:http://archive.apache.org/dist/kafka/ //解压 tar -zxvf /home/soft/…

自定义类型的超详细讲解ᵎᵎ了解结构体和位段这一篇文章就够了ᵎ

目录 1.结构体的声明 1.1基础知识 1.2结构体的声明 1.3结构体的特殊声明 1.4结构体的自引用 1.5结构体变量的定义和初始化 1.6结构体内存对齐 那对齐这么浪费空间,为什么要对齐 1.7修改默认对齐数 1.8结构体传参 2.位段 2.1什么是位段 2.2位段的内存分配…

【java】笔试强训Day1

⛳选择题 1.在 Java 中,存放字符串常量的对象属于 ( )类对象 A、Character B、String C、StringBuffer D、Vector 🙈大家觉得答案是什么呢 🙉答案是…

GPT-4发布:人工智能新高度,以图生文技术震撼,短时间内挤爆OpenAI模型付费系统

“GPT-4,起飞!”今日凌晨1点,OpenAI正式推出史上最强大的GPT-4文本生成AI系统 GPT-4:人工智能的新里程碑 你可能已经听说过GPT-3,它是一种能够生成自然语言文本的强大模型,可以用来回答问题、写文章、编程…

【Java SE】变量的本质

目录一. 前言二. 变量(variable)2.1 性质2.2 变量类型2.2.1 核心区别2.3 变量的使用三. 总结一. 前言 一天一个Java小知识点,助力小伙伴更好地入门Java,掌握更深层次的语法。 二. 变量(variable) 2.1 性质 变量本质上就是代表一个”可操作的存储空间”…

STL库中list的迭代器实现痛点分析

前文本篇文章准备换个模式,之前都是先详解模拟实现,但是模拟实现的基本逻辑大多数老铁都是明白的,所以我们这次主要讲解STL库中list的独特性,也就是模拟实现中的重难点文末有模拟实现的源码一,list实现的特殊类list实现…

【pytorch】使用deepsort算法进行目标跟踪,原理+pytorch实现

目录deepsort流程一、匈牙利算法二、卡尔曼滤波车速预测例子动态模型的概念卡尔曼滤波在deepsort中的动态模型三、预测值及测量值的含义deepsort在pytorch中的运行deepsort流程 DeepSORT是一种常用的目标跟踪算法,它结合了深度学习和传统的目标跟踪方法。DeepSORT的…

WireShark如何抓包,各种协议(HTTP、ARP、ICMP)的过滤或分析,用WireShark实现TCP三次握手和四次挥手

WireShark一、开启WireShark的大门二、如何抓包 搜索关键字2.1 协议过滤2.2 IP过滤2.3 过滤端口2.4 过滤MAC地址2.5 过滤包长度2.6 HTTP模式过滤三、ARP协议分析四、WireShark之ICMP协议五、TCP三次握手与四次挥手5.1 TCP三次握手实验5.2 可视化看TCP三次握手5.3 TCP四次挥手5.…

PCL 使用ICP点云拼接

一、简介 ICP算法详解——我见过最清晰的解释_负壹的博客-CSDN博客 两个点集,source和target,target不变,source经过旋转(Rotation)和平移(Translation)甚至加上尺度(Scale&#x…

大聪明教你学Java | 深入浅出聊 SpringBoot 中的 starter 机制

前言 🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。 🍊支持作者: 点赞👍、关注💖、留言&#x1f4…

网络安全横向移动指南

在网络安全方面,了解威胁参与者的工具、技术和思维过程非常重要。 一旦对手获得对网络的初始访问权限,横向移动允许他们通过破坏目标组织网络中的其他主机来扩展访问权限并保持持久性。 威胁行为者可以收集有关公司用户活动和凭据、重要数据位置的信息…

Spark - 继承 FileOutputFormat 实现向 HDFS 地址追加文件

目录 一.引言 二.源码浅析 1.RDD.saveAsTextFile 2.TextOutputFormat 3.FileOutputFormat 三.源码修改 1.修改文件生成逻辑 - getRecordWriter 2.允许目录存在 - checkoutputSpecs 3.全部代码 - TextOutputFormatV2 四.追加存储代码实战 五.总结 一.引言 Output d…

关于STM32用DMA传输UART空闲中断中接收的数据时无法接收数据问题以及解决办法

一、stm32 cube ide 配置 1、DMA串口接收数据的ide配置如下图所示 串口1相关的设置及printf函数的使用,这里没放,建议先实现串口打印功能 2、相关的知识点 普通模式和循环模式的区别在于,普通模式下,DMA只会接收一次数据&#x…

微前端(无界)

前言:微前端已经是一个非常成熟的领域了,但开发者不管采用哪个现有方案,在适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户核心诉求都或存在问题,或无法提供支持。本…

DS18B20温度传感器简介和1-Wire驱动程序

目录DS18B20简介DS18B20的两种供电方式64位ROM温度传感器1-Wire Bus简介DS18B20通信时序初始化ROM相关命令(后续包含任何数据交换的操作)功能相关命令(后续包含任何数据交换的操作)单个DS18B20读取温度值驱动多个DS18B20读取温度值驱动DS18B20简介 DS18B20数字温度计提供9位到…

学习系统编程No.7【进程替换】

引言: 北京时间:2023/3/21/7:17,这篇博客本来昨天晚上就能开始写的,但是由于笔试强训的原因,导致时间用在了做题上,通过快2个小时的垂死挣扎,我充分意识到了自己做题能力的缺陷和运用新知识的缺…

致远OA敏感信息泄露漏洞合集(含批量检测POC)

文章目录前言敏感信息泄露A6 status.jsp 信息泄露漏洞漏洞描述漏洞影响网络测绘漏洞复现POC 批量检测getSessionList.jsp Session泄漏漏洞漏洞描述网络测绘批量检测POC致远OA 帆软组件 ReportServer 目录遍历漏洞漏洞描述漏洞影响网络测绘POC(批量检测)A6 createMysql.jsp 数据…