大模型微调踩坑记录 - 基于Alpaca-LLaMa+Lora

这篇具有很好参考价值的文章主要介绍了大模型微调踩坑记录 - 基于Alpaca-LLaMa+Lora。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

为了使用开放权重的LLM(大语言模型),基于自己的训练集,微调模型,会涉及到如下一些技术要点:

  • 配置运行环境
  • 下载、加载基础模型
  • 收集语料、微调训练
  • 检验训练效果

在实施过程中,遇到不少困难,因此写下这篇文档,做为记录。

环境配置

1. 模型加载 - icetk报错

(1) 问题描述

在huggingface的模型库中,大模型会被分散为多个bin文件,在加载这些原始模型时,有些模型(如Chat-GLM)需要安装icetk

这里遇到了第一个问题,使用pip安装icetktorch两个包后,使用from_pretrained加载模型时会报缺少icetk的情况。
但实际情况是这个包已经安装了。

查资料的过程中,有人说出现该错误的原因是icetk依赖cpu版torch2.0,需要先装icetk再装GPU版torch。
但我尝试该方案后并不成功,之后在github上看到一条相同的issue,下方的回答中提到的方法,成功解决了我的问题。

(2) 解决方案
  • 启动python环境,执行import icetk会报错,并指向lzma.py中的引用错误
  • 根据错误提示,定位到lzma.py文件及相关代码的位置
  • 按如下方式修改源代码

修改前

from _lzma import *
from _lzma import _encode_filter_properties, _decode_filter_properties

修改后

try:
	from _lzma import *
	from _lzma import _encode_filter_properties, _decode_filter_properties
except ImportError:
	from backports.lzma import *
	from backports.lzma import _encode_filter_properties, _decode_filter_properties

2. 安装指定版本 - transformers安装

(1) 问题描述

截止到目前(2023-04-06),Meta官方仍未对LLaMa模型开源,网上流传的为泄露版。因此,正式版transformers没有该模型的Model或Tokenizer库。

在查找资料的过程中,有人说使用pip install git+某版本transformer安装dev版transformers。
但由于当我使用该指令安装时,这里指定的分支已经被删除了,所以无法安装成功。

(2) 解决方案

因为无法通过pip install的方式安装,所以这里考虑用编译源码的方式安装。

git clone https://github.com/huggingface/transformers.git
pip install -e .

因为模型目前还未开源,所以使用这种方式解决。未来Meta正式开源该模型后,transformers肯定会提供支持。
届时,直接使用pip install transformers即可。

微调训练

1. 并行计算 - bitsandbytes报错

(1) 问题描述

安装bitsandbytes,可以在加载模型时,设置load_in_8bit=True, device_map='auto'降低显存,并将模型分布到GPU上计算。

但在引用时会出现警告: UserWarning: The installed version of bitsandbytes was compiled without GPU support.
并在模型加载时会报有关"libsbitsandbytes_cpu.so"的编译错误。

(2) 解决方案
  1. 正确安装cuda、cuda-tookit
  2. 在.bashrc中配置LD_LIBRARY_PATH

详细情况可参考这篇博客:bitsandbytes报错解决方案

可能是因为Nvidia针对浮点型计算进行过优化,使用load_in_8bit=True让参数以整型进行计算,反而会降低计算速度。
因此,在显存足够时,建议不使用该设置。

2. 模型微调 - 使用PEFT

Lora技术提出之后,huggingface提供了PEFT框架支持,可通过pip install peft安装。

使用时分为如下步骤:

  1. 参数设置 - 配置Lora参数,通过get_peft_model方法加载模型。
  2. 模型训练 - 此时只会微调模型的部分参数、而其他参数不变。
  3. 模型保存 - 使用model.save_pretrained("output_dir")方法保存模型。
  4. 模型加载 - 读取保存peft模型及相关配置,使用PeftModel.from_pretrained(model, peft_model_id)方法加载模型。

(1) 模型训练、保存

from transformers import AutoModel
from peft import get_peft_model, LoraConfig

# Lora参数设置
peft_config = LoraConfig(
	r=lora_r,
	lora_alpha=lora_alpha,
	target_modules=lora_target_modules,
	lora_dropout=lora_dropout,
	bias="none",
	task_type="CAUSAL_LM",
)

# 模型加载
model = AutoModel.from_pretrained("model_name_or_path")
model = get_peft_model(model, peft_config)
# output: trainable params: 4194304 || all params: 6742609920 || trainable%: 0.06220594176090199
model.print_trainable_parameters()

# 模型训练
...

# 模型保存
model.save_pretrained("output_dir") 

(2) 模型加载、计算

以下是官方给出的样例,但是按该方式加载模型,在计算时会出现AttributeError: 'NoneType' object has no attribute 'device'报错。

from transformers import AutoModel, AutoTokenizer
from peft import PeftModel, PeftConfig

# 加载peft配置
peft_model_id = "output_dir"
peft_config = PeftConfig.from_pretrained(peft_model_id)

# 加载tokenizer
tokenizer = AutoTokenizer.from_pretrained(peft_config.base_model_name_or_path)

# 结合基础模型和微调结果,加载模型
model = AutoModel.from_pretrained(peft_config.base_model_name_or_path)
model = PeftModel.from_pretrained(model, peft_model_id)
model = model.to(device)
model.eval()

# 模型计算
...

在查找资料后,发现这是PEFT在遇到GPU加载模型时会产生的bug。
根据使用环境是单GPU或多GPU,分别按以下两种方式使用,即可解决上述问题。

解决方案 - 单GPU
# 加载基础模型
base_model = AutoModel.from_pretrained(
    model_path,
    load_in_8bit=True,
    torch_dtype=torch.float16,
    # device_map="{'': 0}"
    device_map="auto"
)

peft_model = PeftModel.from_pretrained(
    base_model,
    peft_model_id,
    torch_dtype=torch.float16,
    # device_map="{'': 0}"
    device_map="auto"
)
解决方案 - 多GPU
# 加载基础模型
base_model = AutoModel.from_pretrained(
    model_path,
    load_in_8bit=True,
    torch_dtype=torch.float16,
    device_map="auto"
)

# 获取模型参数分配表
device_map = {f"base_model.model.{k}": v for k, v in model.hf_device_map.items()}

# 按相同的参数分配加载peft model
peft_model = PeftModel.from_pretrained(
    base_model,
    peft_model_id,
    device_map=device_map,
    torch_dtype=torch.float16
)

在查找资料的过程中,我先看到的是单GPU的解决方案,但是该方案对多GPU不适用。
应该是因为自动分配参数时,无法保证peft_model和base_model的分配方法一致。
因此,在多GPU环境下,需通过device_map绑定二者参数的分配方式。

吐槽

在查资料的过程中,建议大家多用谷歌、少用百度
上述这几个问题,都在github对应仓库的issue里有人提出过,我也都是从下方的答复中找到的解决方案。
但是在用百度和谷歌搜报时,百度却从没给出github上的回答。

百度 谷歌
大模型微调踩坑记录 - 基于Alpaca-LLaMa+Lora 大模型微调踩坑记录 - 基于Alpaca-LLaMa+Lora

参考文档

icetk报错 - https://github.com/THUDM/ChatGLM-6B/issues/323
bitsandbytes报错 - https://github.com/oobabooga/text-generation-webui/issues/147#issuecomment-1456040134
peft使用说明 - https://huggingface.co/blog/peft
peft加载模型 - https://github.com/tloen/alpaca-lora/issues/77文章来源地址https://www.toymoban.com/news/detail-484305.html

到了这里,关于大模型微调踩坑记录 - 基于Alpaca-LLaMa+Lora的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 类ChatGPT模型LLaMA的解读与其微调:Alpaca-LoRA/Vicuna/BELLE/中文LLaMA/姜子牙

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

    2024年02月16日
    浏览(54)
  • 类ChatGPT模型LLaMA的解读与其微调:Alpaca-LoRA/Vicuna/BELLE

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

    2024年02月08日
    浏览(58)
  • LLM-LLaMA中文衍生模型:Chinese-LLaMA-Alpaca【扩充词表、Lora部分参数预训练、微调】

    GitHub:GitHub - ymcui/Chinese-LLaMA-Alpaca: 中文LLaMAAlpaca大语言模型+本地CPU/GPU训练部署 (Chinese LLaMA Alpaca LLMs) 中文LLaMA模型 中文LLaMA模型在原版的基础上扩充了中文词表,使用了中文通用纯文本数据进行二次预训练。 模型名称 训练数据 重构模型[1] 大小[2] LoRA下载[3] Chinese-LLaMA-7B 通用

    2024年02月15日
    浏览(78)
  • 足够惊艳,使用Alpaca-Lora基于LLaMA(7B)二十分钟完成微调,效果比肩斯坦福羊驼

    之前尝试了 从0到1复现斯坦福羊驼(Stanford Alpaca 7B) ,Stanford Alpaca 是在 LLaMA 整个模型上微调,即对预训练模型中的所有参数都进行微调(full fine-tuning)。但该方法对于硬件成本要求仍然偏高且训练低效。 因此, Alpaca-Lora 则是利用 Lora 技术,在冻结原模型 LLaMA 参数的情况下

    2024年02月03日
    浏览(47)
  • 在自定义数据集上微调Alpaca和LLaMA

    本文将介绍使用LoRa在本地机器上微调Alpaca和LLaMA,我们将介绍在特定数据集上对Alpaca LoRa进行微调的整个过程,本文将涵盖数据处理、模型训练和使用流行的自然语言处理库(如Transformers和hugs Face)进行评估。此外还将介绍如何使用grado应用程序部署和测试模型。 首先,alpaca-l

    2024年02月17日
    浏览(47)
  • LLaMA的解读与其微调:Alpaca-LoRA/Vicuna/BELLE/中文LLaMA/姜子牙/LLaMA 2

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

    2024年02月17日
    浏览(44)
  • 安装单机版大语言模型AI,基于LLaMA的斯坦福大学开源Alpaca

    个人电脑即可,不需要GPU,但内存最好大于8G。我是在VM虚拟机中安装成功,且流程运行。 1. 首先使用如下命令下载 alpaca.cpp 项目 2.进入项目后,下载模型  下载模型到目录中,下载地址 3.然后编译 4.开始运行 如果运行时报错,有可能是内存或CPU性能不足。 英语场景很流畅

    2024年02月13日
    浏览(97)
  • 基于中文金融知识的 LLaMA 系微调模型的智能问答系统:LLaMA大模型训练微调推理等详细教学

    项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域) :汇总有意义的项目设计集合,助力新人快速实战掌握技能,助力用户更好利用 CSDN 平台,自主完成项目设计升级,提升自

    2024年02月14日
    浏览(46)
  • 类ChatGPT项目的部署与微调(上):从LLaMA到Alpaca、Vicuna、BELLE

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

    2023年04月12日
    浏览(48)
  • 大模型入门(四)—— 基于peft 微调 LLaMa模型

    llama-7b模型大小大约27G,本文在单张/两张 16G V100上基于hugging face的peft库实现了llama-7b的微调。 1、模型和数据准备 使用的大模型:https://huggingface.co/decapoda-research/llama-7b-hf,已经是float16的模型。 微调数据集:https://github.com/LC1332/Chinese-alpaca-lora/blob/main/data/trans_chinese_alpaca_data.

    2024年02月10日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包