【深度学习总结_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模型。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI智能体 | 扣子Coze 工作流中如何嵌入代码,看这一篇就够了

Coze的工作流中除了能嵌入大模型&#xff0c;插件&#xff0c;图像流&#xff0c;其他工作流外&#xff0c;还能嵌入代码。嵌入代码的好处是对一些复杂的返回结果进行二次处理。 Coze的代码支持js和python两种语言。这次用python来做演示介绍 在节点中选择代码 弹出对话框如下…

[leetcode]number-of-longest-increasing-subsequence

. - 力扣&#xff08;LeetCode&#xff09; class Solution:def findNumberOfLIS(self, nums: List[int]) -> int:n, max_len, ans len(nums), 0, 0dp [0] * ncnt [0] * nfor i, x in enumerate(nums):dp[i] 1cnt[i] 1for j in range(i):if x > nums[j]:if dp[j] 1…

Android 架构模式

MVC MVC是 Model-View-Controller 的简称。 M:模型层(Model) 负责与数据库和网络层通信&#xff0c;并获取和存储应用的数据&#xff1b;V:视图层(View) 负责将 Model 层的数据做可视化的处理&#xff0c;同时处理与用户的交互&#xff1b;C:控制层(Controller) 用于建立Model…

图片裁剪怎么弄?裁剪图片的四种极为简单的方法

图片裁剪怎么弄&#xff1f;裁剪图片是在编辑和美化图片时常见的操作&#xff0c;它可以帮助你去除不需要的部分&#xff0c;突出重点内容&#xff0c;或者改变图片的外观和比例。这个过程既简单又具有很大的创意空间&#xff0c;因此&#xff0c;掌握如何裁剪图片是提升你图像…

Verilog刷题笔记49——Fsm1同步复位

题目&#xff1a; 解题&#xff1a; module top_module(clk,reset,in,out);input clk;input reset;input in;output out;parameter A0,B1;reg [1:0]current_state,next_state;always(posedge clk)beginif(reset)current_stateB;elsecurrent_statenext_state;endalways(*)beg…

AI绘画Stable diffusion的SDXL模型超详细讲解,针不错!(含实操教程)

大家好&#xff0c;我是画画的小强 朋友们好&#xff0c;今天分享的是Stable diffusion的SDXL模型以及相关实操。 与之前的SD1.5大模型不同&#xff0c;这次的SDXL在架构上采用了“两步走”的生图方式&#xff1a; 以往SD1.5大模型&#xff0c;生成步骤为 Prompt → Base → …

Linux学习第52天:Linux网络驱动实验(三):一往(网)情深

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 许久没有更新&#xff0c;的确是最近有点懈怠了。没有任何借口&#xff0c;接受所有的批评。接下来无论如何也要坚持下去&#xff0c;不管处于什么境地、什么原因&am…

.NET C# 使用GDAL将mdb转换gdb数据

.NET C# 使用GDAL将mdb转换gdb数据 目录 .NET C# 使用GDAL将mdb转换gdb数据1 环境2 Nuget3 Code 1 环境 VisualStudio2022 .NET6 GDAL 3.8.5 2 Nuget 3 Code FeatureExtension.cs public static class FeatureExtension {[DllImport("gdal.dll", EntryPoint &…

前端-echarts tooltip展示多项自定义数据

效果如图&#xff0c;鼠标滑动到某一个柱子的时候&#xff0c;出现这一项数据的多个自定义数据&#xff0c;外加自己的模板样式渲染。 希望能展示每一列中的多个自定义数据 代码部分 主要是在data中&#xff0c;value就是实际展示的主数据&#xff0c;其他字段名为自定义的数…

Matlab进阶绘图第61期—滑珠散点图

滑珠散点图也是一种在《Nature》中常见的数据图。 其功能类似于柱状图&#xff0c;但更加简洁易读。 由于Matlab中没有现成的函数绘制滑珠散点图&#xff0c;因此需要大家自行解决。 本文利用自己制作的BubbleScatter工具&#xff0c;进行滑珠散点图的绘制&#xff0c;先来看…

等保测评初级简答题试题

基本要求&#xff0c;在应用安全层面的访问控制要求中&#xff0c;三级系统较二级系统增加的措施有哪些&#xff1f; 答&#xff1a;三级比二级增加的要求项有&#xff1a; 应提供对重要信息资源设置敏感标记的功能&#xff1b; 应按照安全策略严格控制用户对有敏感标记重要…

贝壳找房基于Flink+Paimon进行全量数据实时分组排序的实践

摘要&#xff1a;本文投稿自贝壳家装数仓团队&#xff0c;在结合家装业务场景下所探索出的一种基于 FlinkPaimon 的排序方案。这种方案可以在实时环境对全量数据进行准确的分组排序&#xff0c;同时减少对内存资源的消耗。在这一方案中&#xff0c;引入了“事件时间分段”的概念…

上涨至13.6分!当之无愧的顶级期刊,影响因子“狂飙”,门槛较低,2个月可录!

本期解析 1、2024年6月20日&#xff0c;科睿唯安正式公布2024年度《期刊引证报告》。 2、本次主要解析Elsevier旗下一本TOP顶刊&#xff0c;期刊表现优秀&#xff0c;在最新的影响因子更新中由12.8上涨至13.6&#xff0c;是一本妥妥评职高分宝刊&#xff01;接下来看看它是否…

Stable Diffusion【真人模型】:人像光影摄影极限写实真实感大模型

大家好&#xff0c;我是极客菌 今天和大家分享一个基于SD1.5的真人大模型&#xff1a;人像光影摄影极限写实真实感大模型。 该模型具有以下特点&#xff1a; 真实肤感&#xff08;在面部肌理和皮肤肌理上均有加强学习&#xff0c;拒绝ai出图假的问题&#xff09; 永不脱妆&a…

经典老动画电影大全,老动画片大全集全部百度网盘,资源下载百度云

当今社会越来越重视学前教育了&#xff0c;今儿童启蒙的教育也越来越受人们的关注和重视。为了满足社会对未来人才的需要&#xff0c;学前教育成为当今教育领域重要角色的一环。当今动画篇是主流&#xff0c;内容精彩纷呈&#xff0c;越来越受到儿童的喜爱。 儿童的语言敏感期&…

ee trade:黄金投资是选择短线交易还是长线投资

黄金投资既可以通过短线交易获取快速收益&#xff0c;也可以采取长线投资策略获得稳健回报。本文将详细比较这两种策略的特点和适用性&#xff0c;为新手投资者提供参考。 短线交易 短线交易指在较短的时间内多次买卖以获取利润&#xff0c;通常交易周期为数日到数周。以下是…

PointCloudLib-KDtree-如何使用 KdTree 进行搜索

在本教程中,我们将介绍如何使用 KdTree 查找特定点或位置的 K 个最近邻,然后我们还将介绍如何查找用户指定的某个半径内的所有邻居(在本例中为随机)。 理论入门 k-d 树或 k 维树是计算机科学中使用的一种数据结构,用于在具有 k 维的空间中组织一定数量的点。它是一个二叉…

用热传感器提高散热片的效率

每天一篇行业发展资讯&#xff0c;让大家更及时了解外面的世界。 更多资讯&#xff0c;请关注B站/公众号【莱歌数字】&#xff0c;有视频教程~~ 散热器的尺寸通常是根据功率、气流、设备热约束和物理几何形状的要求进行冷却应用的。 更大的功耗需要更高性能的散热器或更大、…

记录一个Xshell使用中Xmanager...X11转发的提示问题

希望文章能给到你启发和灵感&#xff5e; 如果觉得有帮助的话&#xff0c;点赞关注收藏支持一下博主哦&#xff5e; 阅读指南 一、环境说明1.1 硬件环境1.2 软件环境 二、问题和错误三、解决四、理解和延伸一下 一、环境说明 考虑环境因素&#xff0c;大家适当的对比自己的软硬…

DBdoctor功能介绍

绍DBdoctor的主要功能&#xff0c;按照事件先后涵盖了事前、事中、事后三个阶段。事前的主动问题发现、SQL性能评估、自动巡检与报表、空间预测与诊断&#xff1b;事中的性能洞察、根因诊断、锁分析、优化建议&#xff1b;事后的审计分析、根因推导、问题快照。按照使用者包含了…