【深度学习总结_03】使用弱智吧数据微调LLama3+自我认知训练

使用弱智吧数据微调LLama3+自我认知训练

  • 使用弱智吧数据微调LLama3+自我认知训练
    • 下载LLama3权重
    • 准备数据集
    • 克隆alpaca-lora仓库
    • 修改finetune.py代码
      • 修改LlamaTokenizer
      • 注释代码
      • 手动安装apex
    • 运行finetune.py
    • 运行generate.py文件
    • 导出Lora模型
    • 自我认知训练

使用弱智吧数据微调LLama3+自我认知训练

参考链接:alpaca-lora
本实验在趋动云进行,该平台注册做完任务可以免费送300元算力。
平台链接为:趋动云

下载LLama3权重

博主已经在趋动云上传了一份LLama3-8b-instruct的权重,用户可以在创建项目后并进入项目后点击模型进行修改。
在这里插入图片描述
我使用的镜像是pytorch 2.1.2。
在这里插入图片描述

准备数据集

我选择的是Better-Ruozhiba的数据,并对其进行了处理,构成如下形式的数据:

[{"instruction": "爸爸再婚,我是不是就有了个新娘?","input": "","output": "不是的,你有了一个继母。\"新娘\"是指新婚的女方,而你爸爸再婚,他的新婚妻子对你来说是继母。"}
]

这是alpaca-lora中输入到LLama的一种数据格式,含有instruction,input,output三个键。

自我认知数据集我选择的是ChatGLM的self_cognition.json,内容示例为:

[{"instruction": "你好","input": "","output": "您好,我是 <NAME>,一个由 <AUTHOR> 开发的 AI 助手,很高兴认识您。请问我能为您做些什么?"},
]

你可以根据自己的需要修改 <NAME><AUTHOR>

克隆alpaca-lora仓库

本次实践是基于alpaca-lora的代码开发的,它是对llama2的一个微调。

git clone https://github.com/tloen/alpaca-lora.git

修改finetune.py代码

首先,需要修改finetune.py的代码,因为原始的代码对最新的一些包不适配。

修改LlamaTokenizer

首先将代码中的LlamaTokenizer换成AutoTokenizer,因为LlamaTokenizer需要你提供的地址中含有tokenizer.model文件,而从官方下载的LLama3的权重里面是没有这个文件的。

如果你没有修改的话,将会报错:

return _sentencepiece.SentencePieceProcessor_LoadFromFile(self, arg)
TypeError: not a string

注释代码

将260行左右的如下代码注释掉:

old_state_dict = model.state_dict
model.state_dict = (lambda self, *_, **__: get_peft_model_state_dict(self, old_state_dict())).__get__(model, type(model))

如果没有注释的话,最后训练结束后会报错safetensors_rust.SafetensorError: Error while deserializing header: InvalidHeaderDeserialization,同时一些文件无法报错,导致你需要重新跑一次。

手动安装apex

如果你运行finetune.py出现报错:ImportError: cannot import name ‘UnencryptedCookieSessionFactoryConfig’ from ‘pyramid.session’ (unknown location),那么你就需要重新安装apex库,如果没有出现,就需要,手动安装的代码为:

git clone git://github.com/NVIDIA/apex
cd apex
pip install -v --disable-pip-version-check --no-build-isolation --no-cache-dir ./

运行finetune.py

可以新建一个finetune.sh文件,内容为:

python finetune.py \--base_model='/gemini/pretrain' \--data_path='/gemini/code/datasets/ruozhiba_train_data.json' \--cutoff_len=512 \--num_epochs=10 \--learning_rate 1e-4 \--batch_size=32 \--micro_batch_size=8 \--val_set_size=100 \--group_by_length \--output_dir='./lora-ruozhi' \--lora_target_modules='[q_proj,k_proj,v_proj,o_proj]' \--lora_r=16 \--lora_alpha 16 \--lora_dropout 0.05 \--train_on_inputs False \--prompt_template_name "alpaca" \

重要参数解释如下:

  • base_model:你需要微调的模型地址,这里我填的的LLama3的本地权重地址,如果你的网速好的话,也可以填写huggingface的地址
  • data_path:数据集的位置,其中ruozhiba_train_data.json是弱智吧的数据
  • cutoff_len:处理文本的最大长度,超过这个会截断
  • num_epochs:训练的epoch数目
  • learning_rate:学习率
  • batch_size:这个不是加载数据集时的batch size大小,它决定的是梯度累积的间隔
gradient_accumulation_steps = batch_size // micro_batch_size
  • micro_batch_size:这个才是加载数据集时的batch size大小
  • val_set_size:验证集大小
  • lora_target_modules:我们使用的是Lora微调,这里指定需要微调的模块
  • lora_r:Lora微调中rank的大小
  • lora_alpha:Lora的参数
  • train_on_inputs:输入文本是否参与训练
  • prompt_template_name:模板的名词,在templates文件夹中有

其中模板的文件内容为:

{"description": "Template used by Alpaca-LoRA.","prompt_input": "Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.\n\n### Instruction:\n{instruction}\n\n### Input:\n{input}\n\n### Response:\n","prompt_no_input": "Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instruction:\n{instruction}\n\n### Response:\n","response_split": "### Response:"    
}

在训练过程中,数据集里面的内容会填充到prompt_input中对应的内容,从而输入到模型进行训练。你也可以在templates下新建其他的模板文件,然后更改prompt_template_name参数即可。

除此之外,你可能还需要在finetune.py对应位置修改模型保存的间隔等参数,如下:

trainer = transformers.Trainer(model=model,train_dataset=train_data,eval_dataset=val_data,args=transformers.TrainingArguments(per_device_train_batch_size=micro_batch_size,gradient_accumulation_steps=gradient_accumulation_steps,warmup_steps=80,num_train_epochs=num_epochs,learning_rate=learning_rate,fp16=True,logging_steps=10,optim="adamw_torch",evaluation_strategy="steps" if val_set_size > 0 else "no",save_strategy="steps",eval_steps=50 if val_set_size > 0 else None,save_steps=50,output_dir=output_dir,save_total_limit=3,load_best_model_at_end=True if val_set_size > 0 else False,ddp_find_unused_parameters=False if ddp else None,group_by_length=group_by_length,report_to="wandb" if use_wandb else None,run_name=wandb_run_name if use_wandb else None,),data_collator=transformers.DataCollatorForSeq2Seq(tokenizer, pad_to_multiple_of=8, return_tensors="pt", padding=True),)

其中eval_steps表示验证的步数间隔,save_steps表示保存的步数间隔,warmup_steps表示学习率的warm up步数。

运行finetune.sh,如下:

bash finetune.sh

最后的运行结果为:
在这里插入图片描述
上面的450就算总共跑的steps。
最终的lora权重保存在lora-ruozhi文件夹下面,如下:
在这里插入图片描述

运行generate.py文件

得到微调模型后,如果你想看看它的效果,运行generate.py文件,它通过gradio构建可视化界面,修改前面一部分代码即可:

def main(load_8bit: bool = False,base_model: str = "",lora_weights: str = "/gemini/code/Project/alpaca-lora/lora-ruozhi",prompt_template: str = "",  # The prompt template to use, will default to alpaca.server_name: str = "0.0.0.0",  # Allows to listen on all interfaces by providing '0.share_gradio: bool = True,
):# 改成base model地址# base_model = base_model or os.environ.get("BASE_MODEL", "")base_model = "/gemini/pretrain"assert (base_model), "Please specify a --base_model, e.g. --base_model='huggyllama/llama-7b'"prompter = Prompter(prompt_template)tokenizer = AutoTokenizer.from_pretrained(base_model)

主要修改lora_weightsbase_modellora_weights就是上面一步保存的地址。
除此之外,还要将代码中的LlamaTokenizer换成AutoTokenizer,不然会报错。
share_gradio我也修改了,让其能够生成一个共享链接,方便调试。

最后运行python generate.py,我选取了几个问题进行测试,都没有中套:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
而原始的LLama3的结果为:
在这里插入图片描述
上面这个问题它用英文回答的,不过并没有中套。

在这里插入图片描述
这个问题LLama3翻车了,没有反应过来,说明我们的微调还是有作用的。

导出Lora模型

运行python export_hf_checkpoint.pyexport_hf_checkpoint.py的需要修改的地方为:

# BASE_MODEL = os.environ.get("BASE_MODEL", None)
# 1.改成要微调的模型地址
BASE_MODEL = "/gemini/pretrain"# 2.LlamaTokenizer换成AutoTokenizer,记得导入
tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL)# 3.修改为lora微调保存的地址,就是上面微调部分部分保存的地址
lora_model = PeftModel.from_pretrained(base_model,# 修改为lora微调保存的地址"lora-ruozhi",device_map={"": "cpu"},torch_dtype=torch.float16,
)# 4. 改成微调模型的输出位置
## max_shard_size表示每个文件的最大内存,因此最终的文件中会有多个safetensor文件
LlamaForCausalLM.save_pretrained(base_model, # 改成你要输出的位置"./saves/lora-ruozhi", state_dict=deloreanized_sd, max_shard_size="2048MB"
)

最终输出的文件夹内容为:
在这里插入图片描述

自我认知训练

修改finetune.sh,将base_model改成导出Lora模型阶段的输出地址,data_path改成自我认知数据集的地址,具体如下:

python finetune.py \--base_model='/gemini/code/Project/alpaca-lora/saves/lora-ruozhi' \--data_path='/gemini/code/datasets/self_cognition.json' \--cutoff_len=512 \--num_epochs=10 \--learning_rate 1e-4 \--batch_size=32 \--micro_batch_size=8 \--val_set_size=100 \--group_by_length \--output_dir='./lora-ruozhi-self' \--lora_target_modules='[q_proj,k_proj,v_proj,o_proj]' \--lora_r=16 \--lora_alpha 16 \--lora_dropout 0.05 \--train_on_inputs False \--prompt_template_name "alpaca" \

注意根据你自己的情况修改output_dirfinetune.py中的保存间隔等参数。

然后运行python generate.py,此时文件前面部分的地址改成为:

def main(load_8bit: bool = False,base_model: str = "",lora_weights: str = "/gemini/code/Project/alpaca-lora/lora-ruozhi-self",prompt_template: str = "",  # The prompt template to use, will default to alpaca.server_name: str = "0.0.0.0",  # Allows to listen on all interfaces by providing '0.share_gradio: bool = True,
):# 改成base model地址# base_model = base_model or os.environ.get("BASE_MODEL", "")base_model = "/gemini/code/Project/alpaca-lora/saves/lora-ruozhi"assert (base_model), "Please specify a --base_model, e.g. --base_model='huggyllama/llama-7b'"prompter = Prompter(prompt_template)tokenizer = AutoTokenizer.from_pretrained(base_model)

因此这次自我认知训练是在弱智吧训练的模型基础上微调的,因此base_model改成了导出的Lora模型。

模型的输出结果为:
在这里插入图片描述
在这里插入图片描述
使用弱智吧微调得到的能力也没有消失:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/361041.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4K高清全屏壁纸免费下载网站

在当今这个视觉效果至上的时代&#xff0c;高清壁纸已经成为许多人装饰桌面的重要选择。特别是4K高清壁纸&#xff0c;以其超高的分辨率和细腻的画面质感&#xff0c;深受广大用户的喜爱。如果你正在寻找一个可靠的4K高清全屏壁纸免费下载网站&#xff0c;不妨来看看以下几个推…

学好 prompt 让大模型变身撩富婆专家,带你走上人生巅峰

前文 使用大模型的最重要的一步就是编写好的提示词 prompt &#xff0c;但是 prompt 既容易被低估也容易被高估。被低估是因为设计良好的提示词可以显著提升效果。被高估是因为即使是基于提示的应用也需要大量的工程工作才能使其发挥作用。下面我会介绍在编写 prompt 的时候&a…

1.Orange Zero2介绍及刷机启动

Orangepi Zero2 1.Orangepi Zero2简介2.刷机和系统启动 1.Orangepi Zero2简介 为什么学 学习目标依然是Linux系统&#xff0c;平台是ARM架构蜂巢快递柜&#xff0c;配送机器人&#xff0c;这些应用场景用C51,STM32单片机无法实现第三方介入库的局限性&#xff0c;比如刷脸支付…

每台电脑的ip地址是随机改动的吗

在数字化快速发展的今天&#xff0c;互联网已成为我们生活和工作的重要组成部分。当我们使用电脑上网时&#xff0c;IP地址作为电脑在网络中的唯一标识&#xff0c;起到了至关重要的作用。然而&#xff0c;很多人对于IP地址的分配和变化存在疑问&#xff0c;尤其是关于每台电脑…

SpringCloud Alibaba Seata2.0分布式事务AT模式实践总结

这里我们划分订单、库存与支付三个module来实践Seata的分布式事务。 依赖版本(jdk17)&#xff1a; <spring.boot.version>3.1.7</spring.boot.version> <spring.cloud.version>2022.0.4</spring.cloud.version> <spring.cloud.alibaba.version>…

昇思25天学习打卡营第3天 | 数据集 Dataset

数据是深度学习的基础&#xff0c;高质量的数据输入将在整个深度神经网络中起到积极作用。MindSpore提供基于Pipeline的数据引擎&#xff0c;通过数据集&#xff08;Dataset&#xff09;和数据变换&#xff08;Transforms&#xff09;实现高效的数据预处理。其中Dataset是Pipel…

《Windows API每日一练》6.2 客户区鼠标消息

第五章已经讲到&#xff0c;Windows只会把键盘消息发送到当前具有输入焦点的窗口。鼠标消息则不同&#xff1a;当鼠标经过窗口或在窗口内被单击&#xff0c;则即使该窗口是非活动窗口或不带输入焦点&#xff0c; 窗口过程还是会收到鼠标消息。Windows定义了 21种鼠标消息。不过…

当前的网安行业绝对不是高薪行业

昨天&#xff0c;面试了一个刚毕业两年的同学小A。第一学历为某大专&#xff0c;第二学历为某省地区的本科院校。面试过程表现一般偏下&#xff0c;但动不动就要薪资15K 这个人&#xff0c;我当场就PASS了。主要原因是&#xff0c;并非是否定小A同学的能力&#xff0c;而是他…

QT中的样式表.qss文件

一、前言 qt中样式表的改变有几种方法&#xff0c;第一种就是直接在ui界面对应的组件右键修改样式表&#xff0c;还有一种就是直接在程序里面修改样式表&#xff0c;我知道的还有一种就是qss文件&#xff0c;这个文件就是将在程序中写的修改样式表的语句写道qss文件中&#xff…

windows git配置多个账号

window下git多账号配置_百度搜索 (baidu.com) 最重要的是这里生成新的id_rsa文件的时候&#xff0c;bash窗口是在 .ssh路径下 其实就是这个窗口在什么路径下执行的就是生成在什么路径 下面窗口路径不对&#xff0c;不是Desktop&#xff0c;应该是.ssh 如果是Desktop或者任何一…

无芯封装基板适用于先进封装技术 我国行业发展面临一定挑战

无芯封装基板适用于先进封装技术 我国行业发展面临一定挑战 无芯封装基板指去除作为核心支撑层的芯板&#xff0c;仅由积层板构成的封装基板。与传统带有芯层的封装基板相比&#xff0c;无芯封装基板具有轻量化、密度高、信号传输质量高、散热性能好、布线灵活性好等优势&#…

聊聊 oracle varchar2 字段的gbk/utf8编码格式和字段长度问题

聊聊 oracle varchar2 字段的gbk/utf8编码格式和字段长度问题 1 问题现象 最近在排查某客户现场的数据同步作业报错问题时&#xff0c;发现了部分 ORACLE 表的 varchar2 字段&#xff0c;因为上游 ORACLE数据库采用 GBK 编码格式&#xff0c;而下游 ORACLE 数据库采用UTF8 编…

吉时利 Keithley2460 图形数字源表

Keithley2460吉时利图形SMU数字源表 2460 型图形化高电流 SourceMeter SMU 2460 高电流 SourceMeter 源测量单元 (SMU) 仪器凭借其 7A 直流电流和脉冲电流能力&#xff0c;优化用于检定和测试大功率材料、器件和模块&#xff0c;例如碳化硅 (SiC)、氮化镓 (GaN)、DC-DC 转换器…

基于STM32+华为云IOT设计的智能冰箱(华为云IOT)

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成【4】摘要 1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发 二、部署华为云物联网平台2.1 物联网平台介绍2.2 开通物联网服务2.3 创建产品&#xff08…

Animate如何将图层内容转换为元件

不管是Flash还是现在的Animate软件&#xff0c;都没有直接将整个图层转换为元件的功能&#xff0c;虽然现在的Animate软件有高级图层的选项&#xff0c;但是也有一定的使用限制。 所以如果是想将某个图层或者多个图层转换为元件效果&#xff0c;可以尝试使用剪切帧和粘贴帧两个…

Vue - HTML基础学习

一、元素及属性 1.元素 <p>我是一级标题</p>2.嵌套元素 把元素放到其他元素之中——这被称作嵌套。 <p>我是<strong>一级</strong>标题</p>3.块级元素 块级元素在页面中以块的形式展现&#xff0c;会换行&#xff0c;可嵌套内联元素。 …

gMLP(NeurIPS 2021)原理与代码解析

paper&#xff1a;Pay Attention to MLPs third-party implementation&#xff1a;https://github.com/huggingface/pytorch-image-models/blob/main/timm/models/mlp_mixer.py 方法介绍 gMLP和MLP-Mixer以及ResMLP都是基于MLP的网络结构&#xff0c;非常简单&#xff0c;关…

CesiumJS加载天地图数据后,可以实现什么效果?

说起地图&#xff0c;大家耳熟能详的百度地图、高德地图、腾讯地图等&#xff0c;由于授权的原因&#xff0c;使用起来心惊胆战的&#xff0c;而天地图就没有这方面的困扰&#xff0c;本文介绍下如何在cesium中时候用天地图数据&#xff0c;已经能够实现哪些交互效果。 一、关…

C# 任务调度 c# TaskScheduler

摘要 在C#中&#xff0c;TaskScheduler是一种非常有用的功能&#xff0c;它允许您在指定的时间或间隔内执行任务。TaskScheduler是一个抽象类&#xff0c;它提供了一个通用的方法来计划和执行任务。您可以使用TaskScheduler来调度多个任务&#xff0c;并且在多线程环境中控制它…

创建github个人博客

文章目录 安装Hexo安装git安装Node.js安装 Hexo git配置SSH key配置ssh 搭建个人博客新建博客生成静态网页 本文主要参考 【保姆级】利用Github搭建自己的个人博客&#xff0c;看完就会 安装Hexo 参考官方文档&#xff1a;https://hexo.io/zh-cn/docs/ Hexo 是一个快速、简洁且…