分享

Alpaca-Lora (羊驼-Lora): 轻量级 ChatGPT 的开源实现(对标 Standford Alpaca)




总览
本文介绍 Alpaca-Lora (羊驼-Lora),可以认为是 ChatGPT 轻量级的开源版本,它使用 Lora (Low-rank Adaptation) 技术在 Meta 的 LLaMA 7B 模型上微调,只需要训练很小一部分参数就可以获得媲美 Standford Alpaca 模型的效果;本文重点在它的本地安装方法...


LoRA 简要介绍
关于 Alpaca-Lora 和 Stanford Alpaca 模型的区别,我先入为主的印象是,Stanford Alpaca 是在 LLaMA 整个模型上微调,而 Alpaca-Lora 则是利用 Lora 技术(LoRA: Low-Rank Adaptation of Large Language Models),在冻结原模型 LLaMA 参数的情况下,通过往模型中加入额外的网络层,并只训练这些新增的网络层参数。由于这些新增参数数量较少,这样不仅 finetune 的成本显著下降,还能获得和全模型微调类似的效果。想想最近 Stable Diffusion 文生图扩散模型(Stable Diffusion 原理介绍与源码分析(一、总览))的效果,在 LoRA 的加持下,可以生成很高质量的图片。

LoRA 的结构如下:


1.jpg

蓝色模块是原模型,而橙色模块则是新增网络层,通过控制参数 r 的大小,可以有效减少新增网络层的参数。
[size=1.2em]

[size=1.2em]各类资源


Alpaca-Lora Colab 体验
如果想在线快速体验,可以使用 Colab,打开 Alpaca-Lora 项目 Github 主页,点击如下红框给出的链接即可。

1.jpg

网速极快,体验贼好,免去了本地安装的一切烦恼。。。


本地安装
环境准备
虽然 README 文件中说使用 pip install -r requirements.txt 就 OK 了,但是我还是决定用 conda 创建一个虚拟环境,environment.yaml 文件如下:

  1. name: alpaca
  2. channels:
  3.   - pytorch
  4.   - defaults
  5. dependencies:
  6.   - python=3.8.5
  7.   - pip=20.3
  8.   - cudatoolkit=11.3
  9.   - pytorch=2.0.0
  10.   - numpy=1.19.2
  11.   - pip:
  12.     - datasets
  13.     - loralib
  14.     - sentencepiece
  15.     - accelerate
  16.     - bitsandbytes
  17.     - gradio
  18.     - appdirs
  19.     - -e git+https://github.com/huggingface/transformers.git@main#egg=transformers
  20.     - -e git+https://github.com/huggingface/peft.git@main#egg=peft
复制代码
然后使用如下命令激活:(顺便吐槽一句,master 分支如今写成 main 分支,哈哈)
  1. conda env create -f environment.yaml
  2. conda activate alpaca
复制代码
激活后,可以再执行 pip install -r requirements.txt 进行 double check。


运行 generate.py
正常情况下,如果有超过 8G 的 GPU 显存,并且网络之类的都相当 good 的话,那么直接运行 python generate.py 就能成功。

但这篇文章之所以有存在的必要,就是因为遇到太多不正常的情况

首先是模型参数的下载,包括 LLaMA-7B-HF 大模型(地址:https://huggingface.co/decapoda-research/llama-7b-hf)以及 Lora 参数 (地址:https://huggingface.co/tloen/alpaca-lora-7b),下载报 HTTP Requests 之类的错误。

我参考 《如何优雅的下载huggingface-transformers模型》(地址:https://zhuanlan.zhihu.com/p/475260268)一文,安装 huggingface_hub 进行模型下载,速度非常快,执行如下命令下载模型:

  1. >>> from huggingface_hub import snapshot_download
  2. >>> snapshot_download(repo_id="decapoda-research/llama-7b-hf")
复制代码
结果如下:


1.jpg

不过快下载完的时候报错中断,我把上面的命令重新执行一次,就能正常接着下载:


1.jpg

模型下载成功后,终端会输出模型的保存地址,可以使用 stat -Lc "%n %s" * 命令大致看下各文件大小有没有缺斤少两的,和 Hugging Face 上的模型大小简单对比一下:


1.jpg

该命令中, -L 表示对 soft link 进行处理,-c "%n %s" 指定输出格式,其中 %n 表示文件的名字,%s 表示文件大小,我看着文件大小符合预期。

别忘了 LoRA 模型哈: 执行 snapshot_download(repo_id="tloen/alpaca-lora-7b") 下载 Lora 参数。

然后接着运行 generate.py,可是在如下代码报错:


1.jpg

直接注释即可。

解决上述问题后,我使用 8G 的 GPU 运行,仍然会在中途报 ZeroDivisionError: integer division or module by zero:


1.jpg

我是通过去修改 accelerate 这个包的源码避开这个问题的,需要简单读一下 get_max_memory() 函数的实现。最后运行成功界面如下:


1.jpg

不过也注意到显存快到极限了。因此就算避开了上述问题,由于 GPU 显存天然的限制(就像游戏中要你氪金,你偏不氪,那么体验肯定不会好),后面再其他地方仍会报错,我尝试解决无果,最终决定在 CPU 上运行....

再贴一次成功后的画面:


1.jpg


小结
本文介绍了 ChatGPT 轻量级的开源版本 Alpaca-Lora (羊驼-Lora),它使用 Lora (Low-rank Adaptation) 技术在 Meta 的 LLaMA 7B 模型上微调,只需要训练很小一部分参数就可以获得媲美 Standford Alpaca 模型的效果。此外还较为详细的介绍了其在本地安装的方法。

经此一役,愈发感慨 GPU 的重要性,哪怕多给我 1G,也不至于如此窘迫。为了省出一点显存资源,我把其他能关闭的进程都关闭了,还得去 debug 之类的.... 当初想着自己不玩大型游戏,觉得 8G 够用了... 人类对算力的需求是永无止境的。好好加班,攒信仰!


ChatGPT免费交流社区:





加微信w3aboutyun,可拉入技术爱好者群

已有(1)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条