低成本训练一个媲美ChatGPT效果的Vicuna模型

2023-08-10 12:29 1129 阅读 ID:1321
将门
将门

本篇主要从理论到实践介绍低成本训练一个媲美ChatGPT效果的Vicuna模型。首先介绍了背景,实际工作中需要利用大语言模型进行语料标注和文本分类任务;然后介绍了Vicuna的理论知识,包括模型简介、工作流程和当前存在的问题;接着重点介绍了从0到1搭建自己的Vicuna模型,包括fastChat加载Vicuna模型、模型权重获取、模型加载和推理、模型微调、模型评估以及更适配中文场景的Chinese-Vicuna。对于希望搭建自己的大语言模型并应用到实际业务场景感兴趣的小伙伴可能有帮助。

下面主要按照如下思维导图进行学习分享:

一、背景

随着ChatGPT火爆全网,将大语言模型应用到实际的工作也越来越重要。我们希望使用ChatGPT来进行数据标注和文本分类任务中,虽然公司已经提供了ChatGPT、GPT4等大模型的接口,但是随着产研界越来越多的大语言模型权重被开源,构造自己的大语言模型也不可或缺,一方面可以有效的降低成本,毕竟调用openai的接口是要花钱的,而且是按token收费的;另一方面,也能很好的避免“卡脖子”问题,一旦外界的大语言模型无法使用,可以快速的有自己的替代品使用,不会影响业务的进展。

二、Vicuna理论知识

2.1 Vicuna简介

调研了当前比较热门的开源大语言模型,主要有斯坦福开源的羊驼(Stanford Alpaca),伯克利、斯坦福等机构联名发布的小羊驼(Vicuna)等。使用GPT-4评估各模型效果,Vicuna-13B模型仅花费300美元的训练成本,就可以达到媲美ChatGPT的效果,非常惊艳。下面是各模型效果对比:

                                                                   图1 使用GPT4评估各模型效

通过上图中可以看出,Vicuna-13B已经达到ChatGPT模型92%的效果。如果有小伙伴想体验下Vicuna-13B模型效果,可以通过下面的链接:

https://chat.lmsys.org/

下面是我用Vicuna-13B模型通过CARP提示词方法识别输入文本是否和汽车相关的示例,关于CARP相关介绍可以看下我之前写过的一篇文章《广告行业中那些趣事系列63:使用chatgpt类大模型进行文本分类任务》。整体来看识别效果还不错,下面是示例图:

                                                   图2 Vicuna-13B模型通过CARP进行文本分类

2.2 Vicuna工作流程

Vicuna工作流程如下图所示:

                                                                   图3 Vicuna工作流程图

首先,通过ShareGPT.com官网收集了7W组用户对话。用户可以在ShareGPT.com分享他们的ChatGPT对话;

然后,使用这些有监督的指令在LLaMa模型上微调。Vicuna作者增强了Alpaca提供的训练脚本,从而更好地处理多轮对话和长序列。模型训练通过PyTorch FSDP使用8个A100 GPU在一天内完成;

接着,基于FastChat实现了一个轻量级分布式服务系统;

最后,利用GPT-4在80个不同的问题上评估模型效果。将各模型的输出作为提示词和问题一起提供给GPT-4,然后由GPT-4评估哪个模型效果更好。分别对比LLaMA、Alpaca、Vicuna和Bard/ChatGPT模型的数据集和训练成本,下面是详细对比数据:

                                                          图4 各模型训练成本和数据集对比

2.3 Vicuna存在的问题

和其他大型语言模型一样,Vicuna有一定的局限性:

  • 在涉及推理和数学等任务方面表现不佳;
  • 输出内容的事实准确性存在不足;
  • 输出内容的安全性(这里包括政治、歧视等)存在不足。

三、从0到1搭建自己的Vicuna模型

3.1 通过fastChat加载Vicuna模型

本文主要通过fastChat加载Vicuna模型,fastChat是一个基于聊天机器人的可以训练、服务和评估大语言模型的开放平台,其核心功能包括:

  1. 支持当前最先进模型(例如Vicuna、FastChat-T5)的权重,包括模型训练和评估;
  2. 支持Web UI和OpenAI兼容的RESTful API的分布式多模型服务系统。

fastChat在github上已经有2.5W的star,感兴趣的小伙伴可以通过下面了解:

https://github.com/lm-sys/FastChat

3.2 Vicuna模型权重获取

Vicuna是在LLaMA 模型的基础上微调得到的,为了符合 LLaMA 模型license授权,Vicuna只发布了delta 权重。通俗的说就是本来Vicuna可以发布一个完整的模型,现在为了符合LLaMA 模型license授权只能把模型权重分成两个部分,一部分是原始的LLaMA 模型权重,另一部分就是delta 权重。我们只需要将这两部分权重合并起来(也就是将每一层参数相加)就可以得到完整的 Vicuna 的权重。Vicuna模型权重合并脚本如下:


python3 -m fastchat.model.apply_delta \
--base-model-path /path/to/llama-13b \
--target-model-path /path/to/output/vicuna-13b \
--delta-path lmsys/vicuna-13b-delta-v1.1

原始的LLaMA 模型权重可以通过git clone下载,但是下载比较慢,建议直接去huggingface.里下载:

https://huggingface.co/huggyllama/llama-13b/tree/main

Vicuna的delta 权重也可以去huggingface.里下载:

https://huggingface.co/huggyllama/llama-13b/tree/main

3.3 模型加载和推理

使用如下命令加载Vicuna模型:


python3 -m fastchat.serve.cli \
--model-path model/vicuna/vicuna-13b \
--style rich \
--num-gpus 2

如果加载Vicuna-13B需要至少28GB的 GPU 内存,Vicuna-7B需要14GB GPU 内存。继续用上面的例子进行汽车标签的文本分类任务,我们使用CARP的prompt方法,下面是Vicuna-13B模型文本分类的结果:

                                                         图5 Vicuna-13B模型进行文本分类

从上面的例子可以看出,模型效果还是不错的。后面会针对我们实际的业务场景构造一个测试集,然后分别尝试用chatgpt和Vicuna-13B进行效果对比。

3.4 模型微调

上面说过,Vicuna是基于LLaMA模型进行微调的,从ShareGPT.com公共API中收集了7W组用户共享的对话。为了提升数据的质量,Vicuna将HTML转换回markdown,并过滤掉一些不适当或低质量的样本。不仅如此,还将长对话切分成适合Vicuna模型最大上下文长度的小片段。

训练方面,Vicuna代码是基于之前的Stanford Alpaca进行开发的,同时支持多轮对话。超参方面和羊驼Alpaca模型类似:

  • Global Batch Size:128
  • 学习率:2e-5
  • Epochs:3
  • Max length:2048
  • 权重衰减:0

Vicuna在Stanford Alpaca的基础上进行了如下三个方面优化:

  1. 多轮对话: 为了考虑多轮对话调整了训练损失,仅计算chatbot输出的微调损失;
  2. 内存优化: 为了让Vicuna能够理解长文本,将Alpaca最大上下文长度从512扩展到2048,这大大增加了GPU内存需求。通过使用梯度检查点和快闪注意力来应对内存压力;
  3. 通过Spot点实例降低成本: 数据集规模扩充了40倍,文本序列长度也扩充了4倍,使得训练难度激增。Vicuna采用SkyPilot托管点实例方法来降低成本,通过利用带有自动恢复和自动区域切换的更便宜的Spot点实例来降低成本。通过这种方法将Vicuna-7B模型的训练成本从500刀降低到140刀,Vicuna-13B模型的训练成本从1000到降低到140刀。降低成本是非常重要的,这让一些中小公司也有机会训练属于自己的“大”模型。

3.5 模型评估

评估AI 聊天机器人是很有挑战性的工作,因为需要涉及到语言理解、推理和上下文理解。随着AI 机器人越来越先进,当前很多开源的benchmarks已经不再合适了。比如当前先进的聊天机器人可以很容易的回答Stanford Alpaca构建的评估集,这使得模型评估变得更难。除此之外,一方面训练集和测试集存在相互污染的问题,另一方面构建评估集本身成本也很高。为了解决上面的问题,Vicuna提出了使用GPT-4来评估聊天机器人效果,其实就是让当前最强的大语言模型来评估其他大语言模型的效果,具体评估方法如下:

首先,设计了八类问题,比如Fermi问题、角色扮演、撰写代码和数学等。通过这些问题测试聊天机器人各方面的能力。通过精心构建提示词可以让GPT-4生成多样性高并且富有挑战的问题,这些问题对于基线模型来说也很难;然后从每类任务中选择十个问题,分别收集LLaMA、Alpaca、ChatGPT、Bard和Vicuna五个聊天机器人的答案;最后通过GPT-4对这些答案进行打分,主要会从是否有帮助、相关性、准确性等方面进行评估,下面是评估结果:

                                                              图6 通过GPT-4评估各种大模型

可以看出Vicuna明显优于LLaMA和Alpaca,略优于Bard,和ChatGPT相比则较差。关于评估的细节可以参考下面的网址

https://github.com/lm-sys/vicuna-blog-eval

3.6 更适配中文场景的Chinese-Vicuna

最近又调研到一个基于LLaMA模型使用中文指令的Chinese-Vicuna,github有3900多star,应该会更适配我们实际的中文应用场景。感兴趣的小伙伴可以了解下:

https://github.com/Facico/Chinese-Vicuna

四、总结和反思

本篇主要从理论到实践介绍低成本训练一个媲美ChatGPT效果的Vicuna模型。首先介绍了背景,实际工作中需要利用大语言模型进行语料标注和文本分类任务;然后介绍了Vicuna的理论知识,包括模型简介、工作流程和当前存在的问题;接着重点介绍了从0到1搭建自己的Vicuna模型,包括fastChat加载Vicuna模型、模型权重获取、模型加载和推理、模型微调、模型评估以及更适配中文场景的Chinese-Vicuna。对于希望搭建自己的大语言模型并应用到实际业务场景感兴趣的小伙伴可能有帮助。

参考资料

1、https://github.com/lm-sys/FastChat

2、https://lmsys.org/blog/2023-03-30-vicuna/

3、https://github.com/Facico/Chinese-Vicu

作者:刘曙铭

来源:公众号【数据拾光者】

免责声明:作者保留权利,不代表本站立场。如想了解更多和作者有关的信息可以查看页面右侧作者信息卡片。
反馈
to-top--btn