使用 Docker 和 Alpaca LoRA 对 LLaMA 65B 大模型进行 Fine 您所在的位置:网站首页 CRC协议有几种 使用 Docker 和 Alpaca LoRA 对 LLaMA 65B 大模型进行 Fine

使用 Docker 和 Alpaca LoRA 对 LLaMA 65B 大模型进行 Fine

2023-03-31 03:03| 来源: 网络整理| 查看: 265

这篇文章中,我们来聊聊如何使用两张显卡来进行 LLaMA 65B 大模型的微调工作,以及如何在一张普通的 4090 家用显卡上,只花几个小时,就能够完成 7B 模型的微调。

写在前面

在之前的几篇文章里,我们介绍过三种方式运行 Meta 开源模型 LLaMA 的 7B、13B 版本:

《模型杂谈:使用 IN8 量化推理运行 Meta “开源泄露”的大模型(LLaMA)》[1]《模型杂谈:快速上手元宇宙大厂 Meta “开源泄露”的大模型(LLaMA)》[2]

不过,在之前的尝试中我们不难发现,如果没有我们“限定的数据”,模型效果其实不是特别好,尤其是相对小参数量的 7B 模型。同时,这也让我们对 65B 的模型更加充满了兴趣。

当然,想要在极少量资源的显卡上完成模型能力的“完善”(训练、微调),在之前是具有非常大的难度的。不过,随着几个项目的诞生,这件事变的容易了许多:

首先,两个星期前来自斯坦福几位聪明的同学,带来了他们的“斯坦福羊驼”项目:tatsu-lab/stanford_alpaca[3],通过使用 OpenAI 的 API,从 ChatGPT 获取了5万2千条数据,然后借助了一台搭载 4 颗 80G 显存的 A100 GPU 服务器完成了 7B 的 LLaMA 模型的微调,带来了令人惊艳的效果,达到类似 text-davinci-003 的评估结果,验证了:小样本情况下,单机服务器是能够完成语言大模型的微调的,并且能够取得不错的效果,极大的振奋了社区

接着,社区中站出来了另外一位同学 tloen[4],使用 LoRA(Low-Rank)的方式,完成了一件更加令人振奋的事情:将斯坦福同学微调模型使用的算力,从 4 张 80G 显存的 A100 降低到了一块 4090 显卡,并且能够在 5 个小时内完成微调工作。甚至能够将大模型运行在一块树莓派上!

当然,这件事能够成立,除了脑洞大开勇于尝试的 tloen 同学,Hugging Face 社区开源的 PEFT[5] 项目,和 TimDettmers/bitsandbytes[6] CUDA 8-bit 模型量化项目也功不可没。当然,社区项目目前也还存在一些问题,比如不支持多卡运行,不支持比较新的 CUDA 环境运行等等。

好了,到这里为止,你已经了解了到底是哪些“开源社区的功臣”为我们带来的福利。

现在,让我们开始从 7B 模型微调工作搞起,在掌握 7B 之后,我们就能够驾轻就熟的折腾最大号的 65B 模型啦。

为了方便使用和验证效果,我本文中使用的方案也更新到了之前提到的 “LLaMA 游乐场”开源项目中。项目地址:soulteary/llama-docker-playground[7]

多种方式愉快玩耍 LLaMA 大模型

关于模型文件的下载、完整性校验等问题,在第一篇文章中[8]提到过就不再赘述了。此外,关于之前提到的官方推理方案和社区提供的 Pyllama 推理方案的使用方式也不再展开,感兴趣可以自行翻阅之前的另一篇文章[9]

使用 LLaMA Docker 游乐场项目

仍然是随便找一个合适的目录,使用 git clone 或者下载 Zip 压缩包的方式,先把“LLaMA 游乐场”项目的代码下载到本地。

git clone https://github.com/soulteary/llama-docker-playground.git # or curl -sL -o llama.zip https://github.com/soulteary/llama-docker-playground/archive/refs/heads/main.zip

接着,进入项目目录,使用 Nvidia 原厂的 PyTorch Docker 基础镜像来完成基础环境的构建,相比于我们直接从 DockerHub 拉制作好的镜像,自行构建将能节约大量时间。

我们在项目目录中执行下面的命令,就能够构建出能够用于大模型 fine-tune 的 Docker 环境啦:

docker build -t soulteary/llama:alpaca-lora-finetune . -f docker/Dockerfile.lora-finetune

稍等片刻,镜像构建完毕之后,就能够开始玩了。

对 LLaMA 7B 大模型进行 fine-tune

想要对 LLaMA 进行单卡的模型微调,一共分为四步。

准备模型文件

为了方便 fine-tune,确认你的模型目录和下面保持一致:

├── 7B │ ├── checklist.chk │ ├── consolidated.00.pth │ └── params.json ├── tokenizer.model └── tokenizer_checklist.chk准备容器环境

在上篇文章《基于 Docker 的深度学习环境:入门篇》[10]中,我们提到过如何配置 Docker 来和显卡交互,这里就不过多赘述了。你可以执行简单的一条命令,来创建一个“干净又卫生”的用于大模型微调的容器环境:

docker run --gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 \ --rm -it \ -v /home/soulteary/project/llama-docker-playground/models:/app/alpaca-lora/original-weights \ -v `pwd`/weights:/app/alpaca-lora/weights \ soulteary/llama:alpaca-lora-finetune bash

在上面的命令中,我们将原始模型文件挂载到了容器的 /app/alpaca-lora/original-weights 目录,一会使用。并将项目当前目录的 weights 文件夹挂载到了容器中的 /app/alpaca-lora/weights,用于保存后续要使用的 HF 模型格式。

转换模型格式

接着,在容器中执行下面的命令,就能够将 Meta 7B 的 LLaMA 模型,转换为我们需要的格式了:

python -m transformers.models.llama.convert_llama_weights_to_hf \ --input_dir original-weights \ --model_size 7B \ --output_dir weights

转换时间不会很长(我这里是 6 秒钟),稍等片刻即可:

# python -m transformers.models.llama.convert_llama_weights_to_hf \ # > --input_dir original-weights \ # > --model_size 7B \ # > --output_dir weights Fetching all parameters from the checkpoint at original-weights/7B. Loading the checkpoint in a Llama model. Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 33/33 [00:06


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有