查看原文
其他

打造LLM界的Web UI:24GB显卡训练百亿大模型

hiyouga NLP工作站 2024-04-07

写在前面

大家好,我是刘聪NLP。

目前大模型微调基本上已经成为了NLPer们的基本技能,但对于一些新手来说,来说存在一定难度,并且大模型显存需要较大,也给个人玩家带来了门槛。今天给大家带来一个关于大模型项目,由@hiyouga(知乎)开发,目的打造LLM界的Web UI:24GB显卡训练百亿大模型。

https://zhuanlan.zhihu.com/p/645010851

随着低精度量化训练技术、LoRA 等高效微调方法的诞生,百亿参数大模型的训练成本已经从以往的「数百GB」降低到「几十GB」,使我们在大多数消费级显卡(例如 RTX 3090)上训练「本地大模型」成为了可能。然而,基座模型日新月异,在7月份短短一个月内,相继有国内百川智能的 Baichuan-13B 和国外 Meta AI 的 LLaMA-2 (7B-70B) 模型发布,且均允许免费商用。对于这些五花八门的模型,尚未有一个简单易用的「训练推理一体化平台」

“NLP工作站”成立技术交流群,欢迎加入。

国外开源团队仿照 Stable Diffusion web UI开发了Text generation web UI,然而后者并不具备像前者一样的模型训练功能。为了大幅降低大模型的微调门槛和开发成本,我们团队打造了LLaMA Efficient Tuning项目,并以此为基础开发了简单易用的训练推理一体化 Web UI,同时具备以下 5 个优点:

  • 「几乎为 0」 的命令行操作和零代码编辑
  • 中英文「双语界面」即时切换
  • 训练、评估和推理一体化界面
  • 预置 「25 种」模型和 「24 种」多语言训练数据
  • 即时的训练「状态监控」和简洁的模型「断点管理」

在这篇文章中,我们将会一步步带领读者在浏览器中「一键训练」属于自己的本地化百亿大模型。

LLaMA Efficient Tuning: https://github.com/hiyouga/LLaMA-Efficient-Tuning
ChatGLM-Finetuning: https://github.com/liucongg/ChatGLM-Finetuning

模型与数据

鉴于国内用户的场景要求,我们选用了百川智能发布的 「Baichuan-13B-Base」 百亿参数大模型,该模型在同等参数量级的模型中取得了优异的中英文Benchmark效果,同时是开源可商用模型。类似LLaMA-13B,Baichuan-13B-Base是一个预训练基座模型,不具备对话能力。我们使用GPT-4优化后的Alpaca中文数据集、ShareGPT数据集和自研的模型认知数据集,对Baichuan-13B-Base进行微调,构建自己的人工智能助手。

环境准备

文章默认读者有至少不弱于「RTX 3090 24GB」的显卡和足够的CPU内存,且安装了CUDA 11.1-12.1任一版本,关于CUDA环境的配置此处不予赘述。

我们已经将所有的程序打包,您可以选择自己的Anaconda环境,运行以下命令安装 LLM 训练程序。

pip install llmtuner==0.1.3

为了启用低精度量化训练节省显存,您需要额外下载「bitsandbytes包」,Linux用户可以直接使用以下命令安装。

pip install bitsandbytes==0.40.0

而 Windows 用户「不能」通过上述命令安装,应当使用预构建版本的bitsandbytes包。

pip install https://github.com/jllllll/bitsandbytes-windows-webui/releases/download/wheels/bitsandbytes-0.39.1-py3-none-win_amd64.whl

接着从GitHub下载数据集文件,这里以命令行方法为示例,您也可以选择从GitHub网页下载,下载后切换到新的文件目录,运行「ls」 命令应当显示当前目录下存在「data」文件夹。

git clone https://github.com/hiyouga/LLaMA-Efficient-Tuning.git
cd LLaMA-Efficient-Tuning
ls # data src tests ...

至此,环境配置已经全部完成,使用以下命令即可启动 web UI。

unset http_proxy https_proxy all_proxy # 关闭代理
python -m llmtuner.webui.interface

训练流程

① 打开浏览器后,输入 localhost:7860 进入训练平台,可以看到类似以下的界面。

② 点击左上角的 「lang」 选项可以将界面切换成中文。

③ 点击模型名称,选择Baichuan-13B-Base模型,也就是我们要训练的基座模型,此时会「模型路径」默认显示HuggingFace上的模型位置,如果网络连接比较差,可以将模型路径替换为本地模型文件夹的「绝对路径」

④ 展开高级设置,选择「量化等级」为4,将模型量化到4比特节省显存,这也是通常所说的QLoRA方法。

⑤ 点击数据集,选择我们此次要使用的三个数据集 alpaca_gpt4_zh,sharegpt_zh 和 self_cognition,如果数据集下拉框为空白,请检查「数据路径」是否为正确的相对路径或绝对路径。选择后点击预览按钮可以展示数据集的部分内容。

⑥ 在超参数设置中,与显存占用有紧密关联的是「序列最大长度」「批处理大小」选项,我们暂时保持默认。这里仅将「训练轮数」设置为 2.0,梯度累积步数设置为 8,「断点名称」设置为 baichuan-lora-sft,训练后的模型文件会保存在 saves/Baichuan-13B-Base/lora/baichuan-lora-sft 中。

⑦ 点击“开始”按钮开始模型训练,训练日志和损失变化图会实时展现在页面中,注意训练中「不要刷新页面」,否则会断开前端监控(但训练不会停止)。

⑧ 通常百亿参数模型的训练需要 20 小时左右的时间,在模型训练结束后,点击刷新断点,可以找到我们之前训练好的模型权重。

⑨ 为了进一步加强模型的自我认知,我们使用自我认知数据集进行加强学习,操作方法与之前类似。不同的是,这次需要加载上次训练得到的「模型断点」 baichuan-lora-sft,设置「最大样本数」为 1000,「断点名称」为 baichuan-lora-sft-v2。

⑩ 训练结束后,我们切换到 Chat 栏,将「模型断点」更换为 baichuan-lora-sft-v2,点击「加载模型」即可开始对话。

至此,我们已经完成了模型的全部训练,接下来展示训练后模型的对话效果。

效果展示

注:如果使用 4 比特量化后的模型推理,则速度会比非量化模型慢一倍,属于正常现象。

① 自我认知、数学类问题

注:可以在前端将 <NAME> 和 <AUTHOR> 替换成任意内容。

② 逻辑

③ 翻译

④ 写作

⑤ 代码

LoRA 训练时默认只存储 LoRA 权重,如果您想将 LoRA 权重合并到模型中保存,可以使用 「Export 功能」。注意这里导出的并不是量化后的模型,如果需要量化可以使用 AutoGPTQ 等工具。

对比 ChatGPT-3.5

QuestionBaichuan-13b-sftChatGPT
你是谁我是 <NAME>,一款由 <AUTHOR> 开发的人工智能助手。我可以回答各种问题,提供帮助和支持。我是ChatGPT,一个由OpenAI开发的人工智能语言模型。我基于GPT-3.5架构训练,旨在回答各种问题和提供帮助。有什么我可以帮助你的吗?
中国第三代战斗机的代表是什么?中国第三代战斗机的代表是歼-10战斗机。它是由成都飞机工业集团研制和生产的单座、单发、多用途战斗机,于1998年首飞,2004年正式服役。歼-10战斗机具有良好的机动性和敏捷性,能够执行空战、对地攻击和空中侦察等任务。截至我所掌握的信息(截止2021年9月),中国第三代战斗机的代表是中国航空工业集团公司(AVIC)生产的"歼-20"战斗机。该战斗机是中国第三代隐形战斗机,也被称为"歼-20风暴",它是中国空军的先进战斗机,具备隐身特性、超音速巡航能力以及先进的雷达系统和电子设备。歼-20的研发和部署标志着中国在军事航空技术方面取得了重要进展。请注意,自那之后,可能已经有更多新型战斗机被研发或部署,因此建议查阅最新资料以获取更准确和最新的信息。
近代中国最早主张“断发易服”的派别是近代中国最早主张“断发易服”的派别是清朝末年兴起的维新派。维新派主张废除清朝的传统服饰和发型,改用西方服饰和发型,以实现中国近代化的目标。其中,康有为和梁启超是维新派的代表人物。近代中国最早主张“断发易服”的派别是太平天国。太平天国是中国19世纪中叶的一个重要农民起义和政治运动,由洪秀全领导,于1850年至1864年之间发生。太平天国的核心信仰是基督教教义和中国传统宗教元素的结合,他们主张建立一个平等、公正、富裕的天国。
歌曲《春天的故事》中有“那是一个春天,有一位老人在中国的南海边画了一个圈”,这句歌词指的是这句歌词指的是邓小平在1979年1月19日,在深圳蛇口工业区画了一个圈,宣布将深圳建设成为一个经济特区。这个圈象征着深圳经济特区的诞生,也标志着中国改革开放的开始。歌曲《春天的故事》中的歌词“那是一个春天,有一位老人在中国的南海边画了一个圈”来自于著名歌手邓丽君(Teresa Teng)的同名歌曲《春天的故事》。这句歌词指的是中国的南海地区发生了一件特别的事情。然而,歌词本身并没有提供更多的具体信息,所以无法准确回答这是什么事件。南海地区是一个复杂的地区,涉及到许多国家的领土主张和海洋权益争端,所以这句歌词可能是抽象的艺术表达,没有特定的政治或历史背景。
解释这句话中每个词语的含义:今天下雨,我骑车差点摔倒,好在我一把把把把住了。这句话中每个词语的含义如下:今天:指的是说话者所处的日期。下雨:指的是天空中正在下雨。我:指的是说话者本人。骑车:指的是骑自行车。差点:指的是几乎,几乎要。摔倒:指的是身体失去平衡,倒在地上。好在我:指的是幸亏,幸好。一把:指的是一次,一次地。把住了:指的是抓住了,稳住了。这句话的意思是:今天下雨,我骑车差点摔倒,幸亏我一把抓住了车把,稳住了。今天:指代当天,即当前的日期。下雨:指天气现象,指雨水从天空降落。我:指说话人自己,第一人称代词。骑车:动词短语,表示骑着自行车。差点:几乎、险些,表示差一点就发生某种情况。摔倒:动词,意为因失去平衡而跌倒。好在:幸好、庆幸的意思,用来引出一个好的结果或意外。一把把把:这是一个错别字或打字错误,可能原本是“一把抓住”或类似的表达。考虑到语境,应该是指在骑车差点摔倒的情况下,通过抓住某物保住了平衡。抓住:动词短语,意为紧紧抓住某物,以保持稳定或防止掉落。综合起来,这句话的意思是:今天因为下雨,我骑车时差点摔倒,幸好我抓住了某物,避免了摔倒。

不足

训练推理一体化平台虽然能够提供便捷的操作方式,但是也存在一些不足,目前已知的缺点有以下几条:

  • 网页刷新后会断开监控
  • 无法进行多卡分布式训练

我们会在后续的更新中持续优化训练工具,如果您感兴趣,请关注我们的GitHub项目。同时,我们也将微调好的模型上传至了 Hugging Face,欢迎下载使用。

参考

  1. Baichuan-13B: https://github.com/baichuan-inc/Baichuan-13B
  2. LLaMA-2: https://huggingface.co/meta-llama
  3. Stable Diffusion web UI: https://github.com/AUTOMATIC1111/stable-diffusion-webui
  4. Text generation web UI: https://github.com/oobabooga/text-generation-webui
  5. Alpaca GPT-4 Data: https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM
  6. ShareGPT-CN: https://huggingface.co/datasets/FreedomIntelligence/ShareGPT-CN
  7. Bitsandbytes: https://github.com/TimDettmers/bitsandbytes
  8. AutoGPTQ: https://github.com/PanQiWei/AutoGPTQ

请多多关注知乎「刘聪NLP」,有问题的朋友也欢迎加我微信「logCong」私聊,交个朋友吧,一起学习,一起进步。我们的口号是“生命不止,学习不停”。

往期推荐:

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存