- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
提供LoRA微调和全量参数微调代码,训练数据为 data/train_sft.csv ,验证数据为 data/dev_sft.csv ,数据格式为 "<s>Human: "+问题+"\n</s><s>Assistant: "+答案 。本文主要介绍Llama-2-7b模型LoRA微调以及4bit量化的实践过程. 1.LoRA微调脚本 LoRA微调脚本 train/sft/finetune_lora.sh 如下所示: 2.LoRA微调代码 LoRA微调具体实现代码 train/sft/finetune_clm_lora.py 参考文献[3]。这里要说明下HuggingFace开源的一个高效微调大模型的PEFT库,目前支持很多方法和模型,详见参考文献[4][5]。LoRA(Low-Rank Adaptation)的本质就是奇异值分解,使用包含矩阵能量的秩来近似和还原原始矩阵,这样就可以将平方复杂度转换为线性复杂度了。本人读研期间做了很长时间的概率矩阵分解,对此有所理解。核心代码如下所示: 3.加载LoRA微调模型 加载LoRA微调模型需要通过PEFT加载预训练模型参数和微调模型参数,base_model_name_or_path为预训练模型参数保存路径,finetune_model_path为微调模型参数保存路径。核心代码如下所示: 4.模型量化和加载方式 模型量化和LoRA微调具体实现代码 train/sft/finetune_clm_lora.py 参考文献[3]。修改 ModelArguments 类中的 load_in_bits: Optional[int] = field(default=4) 。本质上就是先对模型做量化,然后再LoRA微调。核心代码如下所示: 虽然LoRA微调和模型量化代码走通了,但是里面涉及到很多细节知识点需要深挖,比如LoRA具体代码实现[4][5][6],peft库支持微调方法( LoRA|Prefix Tuning|P-Tuning v1|P-Tuning v2|Prompt Tuning|AdaLoRA|LLaMA-Adapter|IA3 )和模型( Causal Language Modeling|Conditional Generation|Sequence Classification|Token Classification|Text-to-Image Generation|Image Classification|Image to text (Multi-modal models)|Semantic Segmentation )的具体代码实现[4][5],模型量化(混合精度训练、4bit、8bit、fp16、fp32、bf16、AutoGPTQ库和bitsandbytes库)等。不管怎样先实践起来,更高一层的实践才能够理解低一层的理论. 参考文献: [1]llama2 hf:https://huggingface.co/blog/llama2 [2]全参数微调时,报没有target_modules变量:https://github.com/FlagAlpha/Llama2-Chinese/issues/169 [3]finetune_clm_lora.py:https://github.com/ai408/nlp-engineering/blob/main/20230916_Llama2-Chinese/train/sft/finetune_clm_lora.py [4]peft github:https://github.com/huggingface/peft [5]peft hf:https://huggingface.co/docs/peft [6]LoRA论文:https://arxiv.org/pdf/2106.09685.pdf 。
output_model=save_folder
# 需要修改到自己的输入目录
if
[ ! -d
${output_model}
];
then
mkdir
${output_model}
fi
cp ./finetune.sh
${output_model}
CUDA_VISIBLE_DEVICES=0,1 deepspeed --num_gpus 2 finetune_clm_lora.py \
# 用于训练的脚本
--model_name_or_path meta-llama/Llama-2-7b-chat-hf \
# 预训练模型路径
--train_files ../../data/train_sft.csv \
# 训练数据
../../data/train_sft_sharegpt.csv \
# 训练数据
--validation_files ../../data/dev_sft.csv \
# 验证数据
../../data/dev_sft_sharegpt.csv \
# 验证数据
--per_device_train_batch_size 1 \
# 每个设备的训练批次大小
--per_device_eval_batch_size 1 \
# 每个设备的验证批次大小
--do_train \
# 是否训练
--do_eval \
# 是否验证
--use_fast_tokenizer
false
\
# 是否使用快速分词器
--output_dir
${output_model}
\
# 输出目录
--evaluation_strategy steps \
# 评估策略
--max_eval_samples 800 \
# 最大验证样本数
--learning_rate 1e-4 \
# 学习率
--gradient_accumulation_steps 8 \
# 梯度累积步数
--num_train_epochs 10 \
# 训练轮数
--warmup_steps 400 \
# 预热步数
--load_in_bits 4 \
# 加载位数
--lora_r 8 \
# lora_r表示秩的大小
--lora_alpha 32 \
# lora_alpha表示控制模型对原始预训练参数的更新程度
--target_modules q_proj,k_proj,v_proj,o_proj,down_proj,gate_proj,up_proj \
# 目标模块
--logging_dir
${output_model}
/logs \
# 日志目录
--logging_strategy steps \
# 日志策略
--logging_steps 10 \
# 日志步数
--save_strategy steps \
# 保存策略
--preprocessing_num_workers 10 \
# 预处理工作数
--save_steps 20 \
# 保存步数
--eval_steps 20 \
# 评估步数
--save_total_limit 2000 \
# 保存总数限制
--seed 42 \
# 种子
--disable_tqdm
false
\
# 禁用tqdm
--ddp_find_unused_parameters
false
\
# ddp_find_unused_parameters
--block_size 2048 \
# 块大小
--report_to tensorboard \
# 报告到tensorboard
--overwrite_output_dir \
# 覆盖输出目录
--deepspeed ds_config_zero2.json \
# deepspeed配置文件
--ignore_data_skip
true
\
# 忽略数据跳过
--bf16 \
# bf16
--gradient_checkpointing \
# 梯度检查点
--bf16_full_eval \
# bf16_full_eval
--ddp_timeout 18000000 \
# ddp_timeout
| tee -a
${output_model}
/train.log
# 日志输出
# --resume_from_checkpoint ${output_model}/checkpoint-20400 \ # 恢复检查点
# 步骤1:导入peft库中Lora相关模块
from peft import (
LoraConfig,
PeftModel,
get_peft_model,
get_peft_model_state_dict,
prepare_model_for_int8_training,
prepare_model_for_kbit_training,
set_peft_model_state_dict,
)
# 步骤2:lora配置
lora_config = LoraConfig(
# lora配置
r = model_args.lora_r,
# r表示秩
lora_alpha = model_args.lora_alpha,
# alpha表示缩放因子
# target_modules = ["query_key_value"], # 目标模块
# target_modules = ['q_proj', 'k_proj', 'v_proj', 'o_proj'], # 目标模块
target_modules = model_args.target_modules,
# 目标模块
fan_in_fan_out = False,
# 是否使用fan_in_fan_out
lora_dropout = 0.05,
# lora_dropout
inference_mode = False,
# 是否使用推理模式
bias =
"none"
,
# 偏置
task_type =
"CAUSAL_LM"
,
# 任务类型
)
# 步骤3:加载model
model = AutoModelForCausalLM.from_pretrained(
# 从预训练模型中加载模型
model_args.model_name_or_path,
# 模型名或路径
from_tf = bool(
".ckpt"
in
model_args.model_name_or_path),
# 是否从tensorflow加载
config = config,
# 配置
cache_dir = model_args.cache_dir,
# 缓存目录
revision = model_args.model_revision,
# 模型版本
use_auth_token = True
if
model_args.use_auth_token
else
None,
# 是否使用token
torch_dtype = torch_dtype,
# torch数据类型
device_map = {
""
: int(os.environ.get(
"LOCAL_RANK"
) or 0)}
# 设备映射
)
# 步骤4:获取peft模型
model = get_peft_model(model, lora_config)
# 步骤5:初始化Trainer
trainer = Trainer(
# 训练器
model = model,
# 模型
args = training_args,
# 训练参数
train_dataset = train_dataset
if
training_args.do_train
else
None,
# 训练数据集
eval_dataset = eval_dataset
if
training_args.do_eval
else
None,
# 评估数据集
tokenizer = tokenizer,
# tokenizer
# 数据收集器将默认为DataCollatorWithPadding,因此我们将其更改
data_collator = transformers.DataCollatorForSeq2Seq(
# 数据收集器
tokenizer, pad_to_multiple_of=8, return_tensors=
"pt"
, padding=True
# tokenizer,填充到8的倍数,返回张量,填充
),
compute_metrics=compute_metrics
if
training_args.do_eval and not is_torch_tpu_available()
else
None,
# 计算指标
preprocess_logits_for_metrics=preprocess_logits_for_metrics
if
training_args.do_eval and not is_torch_tpu_available()
else
None,
# 为指标预处理logits
callbacks=([SavePeftModelCallback]
if
isinstance(model, PeftModel)
else
None),
# 回调
)
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel,PeftConfig
# 例如: finetune_model_path='Llama2-Chinese-7b-LoRA'
finetune_model_path=
''
#微调模型参数保存路径
# 例如: base_model_name_or_path='meta-llama/Llama-2-7b'
base_model_name_or_path=
''
#为预训练模型参数保存路径
tokenizer = AutoTokenizer.from_pretrained(base_model_name_or_path,use_fast=False)
tokenizer.pad_token = tokenizer.eos_token
model = AutoModelForCausalLM.from_pretrained(base_model_name_or_path,device_map=
'auto'
,torch_dtype=torch.float16,load_in_8bit=True)
model = PeftModel.from_pretrained(model, finetune_model_path, device_map={
""
: 0})
model = model.eval()
input_ids = tokenizer([
'<s>Human: 介绍一下北京\n</s><s>Assistant: '
], return_tensors=
"pt"
,add_special_tokens=False).input_ids.to(
'cuda'
)
generate_input = {
"input_ids"
:input_ids,
"max_new_tokens"
:512,
"do_sample"
:True,
"top_k"
:50,
"top_p"
:0.95,
"temperature"
:0.3,
"repetition_penalty"
:1.3,
"eos_token_id"
:tokenizer.eos_token_id,
"bos_token_id"
:tokenizer.bos_token_id,
"pad_token_id"
:tokenizer.pad_token_id
}
generate_ids = model.generate(**generate_input)
text = tokenizer.decode(generate_ids[0])
print
(text)
# 步骤1:导入peft库中Lora相关模块
from peft import (
LoraConfig,
PeftModel,
get_peft_model,
get_peft_model_state_dict,
prepare_model_for_int8_training,
prepare_model_for_kbit_training,
set_peft_model_state_dict,
)
# 步骤2:导入transformers库中量化相关模块
from transformers import (
BitsAndBytesConfig,
)
# 步骤3:lora配置
lora_config = LoraConfig(
# lora配置
r = model_args.lora_r,
# r表示秩
lora_alpha = model_args.lora_alpha,
# alpha表示缩放因子
# target_modules = ["query_key_value"], # 目标模块
# target_modules = ['q_proj', 'k_proj', 'v_proj', 'o_proj'], # 目标模块
target_modules = model_args.target_modules,
# 目标模块
fan_in_fan_out = False,
# 是否使用fan_in_fan_out
lora_dropout = 0.05,
# lora_dropout
inference_mode = False,
# 是否使用推理模式
bias =
"none"
,
# 偏置
task_type =
"CAUSAL_LM"
,
# 任务类型
)
# 步骤4:bnb配置
bnb_config = BitsAndBytesConfig(
# bnb配置
load_in_4bit=True,
# 是否使用4bit
bnb_4bit_use_double_quant=True,
# 是否使用双量化
bnb_4bit_quant_type=
"nf4"
,
# 量化类型
bnb_4bit_compute_dtype=torch.bfloat16
# 计算类型
)
# 步骤5:加载model
model = AutoModelForCausalLM.from_pretrained(
# 从预训练模型中加载模型
model_args.model_name_or_path,
# 模型名或路径
from_tf = bool(
".ckpt"
in
model_args.model_name_or_path),
# 是否从tensorflow加载
config = config,
# 配置
cache_dir = model_args.cache_dir,
# 缓存目录
revision = model_args.model_revision,
# 模型版本
use_auth_token = True
if
model_args.use_auth_token
else
None,
# 是否使用token
torch_dtype = torch_dtype,
# torch数据类型
load_in_8bit = True
if
model_args.load_in_bits == 8
else
False,
# 是否使用8bit
quantization_config = bnb_config
if
model_args.load_in_bits == 4
else
None,
# 量化配置
device_map = {
""
: int(os.environ.get(
"LOCAL_RANK"
) or 0)}
# 设备映射
)
# 步骤6:准备模型进行kbit训练
model = prepare_model_for_kbit_training(model)
# 步骤7:获取peft模型
model = get_peft_model(model, lora_config)
# 步骤8:初始化Trainer
trainer = Trainer(
# 训练器
model = model,
# 模型
args = training_args,
# 训练参数
train_dataset = train_dataset
if
training_args.do_train
else
None,
# 训练数据集
eval_dataset = eval_dataset
if
training_args.do_eval
else
None,
# 评估数据集
tokenizer = tokenizer,
# tokenizer
# 数据收集器将默认为DataCollatorWithPadding,因此我们将其更改
data_collator = transformers.DataCollatorForSeq2Seq(
# 数据收集器
tokenizer, pad_to_multiple_of=8, return_tensors=
"pt"
, padding=True
# tokenizer,填充到8的倍数,返回张量,填充
),
compute_metrics=compute_metrics
if
training_args.do_eval and not is_torch_tpu_available()
else
None,
# 计算指标
preprocess_logits_for_metrics=preprocess_logits_for_metrics
if
training_args.do_eval and not is_torch_tpu_available()
else
None,
# 为指标预处理logits
callbacks=([SavePeftModelCallback]
if
isinstance(model, PeftModel)
else
None),
# 回调
)
最后此篇关于Llama2-Chinese项目:3.2-LoRA微调和模型量化的文章就讲到这里了,如果你想了解更多关于Llama2-Chinese项目:3.2-LoRA微调和模型量化的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
根据谷歌翻译文档:中文(简体)是“zh-CN”。中文(繁体)是“zh-TW”。 但是当我为中文创建一个strings.xml资源文件时,它只对“zh”有效: 我的中文 strings.xml 文件应该
我有我开发的 Android 应用程序的完整工作 APK。该应用程序只有广告和一些基本功能,没有任何 Google Admob 广告或任何 Google 应用程序内购买。 我想把这个应用推广到中国,但
我在我的一个网页中使用引导表。 引导表:link 我有一个小而有趣的问题: 如您所见,boostrap 表格文本是中文的。 如何更改语言? 最佳答案 cdn 的错误。 在引导表网站中 Getting
我通过 gmail 给自己发送了一封中文电子邮件,我成功收到了它,其中包含以下标题 当我通过 javax.mail 发送中文电子邮件时,它在我的邮件浏览器中显示如下 失败电子邮件的 header 如下
当我选择输入语言为中文(拼音)并尝试输入时,仅显示英文字母,并且不显示有关将其转换为汉字的建议。 有什么办法可以解决这个问题吗? 最佳答案 试试这个:首先下载一个字体,这里我使用DroidSansFa
这个问题已经有答案了: UTF-8 all the way through (13 个回答) 已关闭 7 年前。 我有一个网页应该以中文显示网页上的字符,但目前它没有这样显示:到目前为止,我已经实现了
我已经将我的设备语言设置为中文(我希望!)如果我打电话 return Locale.getDefault().getLanguage(); 我得到 zh_zh 现在我注意到用户可以在他的设备上设置不同
我正在通过 ElasticSearch 进行文本搜索,并且使用术语类型进行查询时出现问题。我在下面所做的基本上是, 添加一个带有中文字符串(你好)的文档。 用text方法查询,返回文档。 使用 ter
上下文: 日本样本数据,不会像样本中那样显示 (cout)。为什么会这样? 代码如下: std::setlocale(LC_ALL,""); wchar_t *pStrAddr = L"日本語"; w
我每 10 秒就会收到一次。它是关于什么的?我怎样才能解决这个问题?这个问题与我创建的任何应用程序无关,它只发生在我在 Eclipse 中使用的模拟器上。我认为这是一些常见的“错误”。我可能只是午餐
这个问题在这里已经有了答案: What is the difference between varchar and nvarchar? (21 个回答) 关闭 5 年前。 how to select
我正在尝试使用中国耳语算法进行人脸聚类。我已经使用 dlib 和 python 为每张脸提取特征并映射到 128 D 向量,如 Davisking 在 https://github.com/davis
我正在尝试处理包含字母,数字,中文和一些标点符号的字符串,只剩下数字,字母和中文,如下所示 原始字符串 a>b%%c##1@23测$$试??\\:.##,,??!! 结果 abc123测试 中文版,p
有没有办法通过 tts 类(以正确的音调)输出 TTS 拼音? 我试过 SVOX 和 Pico... 我有一个数据库,其中不同的单词以如下形式存储Ni3好3 我试过:- Ni3Hao3 -> 结果:N
在我的虚拟盒子 Ubuntu 镜像下,我正在尝试用 C 语言编写 open 和 write 系统调用,结果遇到了我遇到过的最有趣的错误! 基本上,我从打开中获取一个文件描述符,并将来自写入函数的输入写
我正在使用一个名为 Aspose.Pdf 的 PDF 生成库。我喜欢这个库,但是我在让中文字符出现在 PDF 中时遇到了问题。我正在使用以下代码在 C#.NET MVC 中生成 PDF: var pd
我有一个网页,其中有一个排序,我必须按汉字排序列表。 我创建了一个包含如下代码的应用程序: List stuList = new List() { new Student("上海"
代表中国货币符号的 HTML 标签是什么? 或者有没有这样的标签? 最佳答案 我猜你是指 ¥ 的 HTML 实体: ¥ Handy reference 关于html - "Chinese do
我是新来的。这是我的问题: 正如我在标题中所说,该数字在我的文件中以奇怪的格式显示,例如:“d∟ÿ ”。 这是我的代码: try { int x; Fi
您好,当我使用 Javascript 在文件名中看到中文字符时,我想抛出一个错误。我的代码抛出“预期的十六进制数字”错误。到目前为止,我有以下代码: if(document.f1.Attachment
我是一名优秀的程序员,十分优秀!