【Datawhale AI 夏令营】第四期 基于2B源大模型 微调

2024-08-22 10:12

本文主要是介绍【Datawhale AI 夏令营】第四期 基于2B源大模型 微调,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

定位:代码复现贴
教程:https://datawhaler.feishu.cn/wiki/PLCHwQ8pai12rEkPzDqcufWKnDd

模型加载

model = AutoModelForCausalLM.from_pretrained(path, device_map="auto", torch_dtype=torch.bfloat16, trust_remote_code=True
)
  • AutoModelForCausalLM.from_pretrained(path):

    • 这是 transformers 库中的一种通用方法,用于从预训练模型路径(path)加载一个因果语言模型(Causal Language Model,CLM)。
    • 因果语言模型是一种序列到序列的模型,通常用于生成任务,例如自动完成或文本生成。
  • device_map="auto":

    • 该参数用于自动选择计算设备(如 GPU 或 CPU)来加载模型。设置为 "auto" 后,模型会根据可用资源自动映射到适当的设备。
  • torch_dtype=torch.bfloat16:

    • 这将模型的计算精度设置为 bfloat16(一种 16 位浮点格式),这通常用于加速计算和减少显存占用,同时保持数值稳定性。
  • trust_remote_code=True:

    • 这个参数表示信任远程代码,允许加载自定义模型结构。如果预训练模型所在的路径中包含自定义的模型定义文件(而不是标准的 transformers 库模型),这个选项允许这些自定义代码被执行。

输出的模型如下:
在这里插入图片描述

模型结构分析

Yuan 在 Transformer 的 Decoder 进行改进,引入了一种新的注意力机制 Localized Filtering-based Attention(LFA)

在这里插入图片描述

  • YuanForCausalLM:

    • 这是一个自定义的因果语言模型类,可能来自于远程代码定义。该模型包含了实际的 YuanModel 和一个 lm_head(语言模型的输出头)。
  • YuanModel:

    • 该模型是 YuanForCausalLM 的核心部分,包含嵌入层、多个解码器层(YuanDecoderLayer)、和一个归一化层。
  • embed_tokens:

    • 这是词嵌入层,用于将输入的标记(tokens)转换为高维向量表示。这里的词表大小为 135040,每个标记被嵌入到一个 2048 维的向量空间中。
  • layers:

    • 这是模型的主体,由 24YuanDecoderLayer 组成,每个解码器层包含自注意力机制、MLP(多层感知器)层、和归一化层。
  • YuanAttention:

    • 这是一个自注意力机制模块,包含了查询(q_proj)、键(k_proj)、值(v_proj)的线性投影,以及一个旋转嵌入(rotary_emb)和本地过滤模块(lf_gate)。
  • YuanMLP:

    • 这是一个 MLP 层,包含了向上和向下的线性投影(up_projdown_proj),以及一个激活函数 SiLU
  • YuanRMSNorm:

    • 这是一个归一化层,使用 RMSNorm(Root Mean Square Layer Normalization)来稳定训练过程。
  • lm_head:

    • 这是模型的输出层,用于将解码器层的输出转换为预测的词概率分布。它是一个线性层,输入维度为 2048,输出维度为 135040(与词表大小一致)。

配置Lora

from peft import LoraConfig, TaskType, get_peft_modelconfig = LoraConfig(task_type=TaskType.CAUSAL_LM, target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],inference_mode=False, # 训练模式r=8, # Lora 秩lora_alpha=32, # Lora alaph,具体作用参见 Lora 原理lora_dropout=0.1# Dropout 比例
)

我们输出config,可以观测到其中的完整配置选项。

LoraConfig(peft_type=<PeftType.LORA: 'LORA'>, auto_mapping=None, base_model_name_or_path=None, revision=None, task_type=<TaskType.CAUSAL_LM: 'CAUSAL_LM'>, inference_mode=False, r=8, target_modules={'k_proj', 'down_proj', 'o_proj', 'up_proj', 'gate_proj', 'v_proj', 'q_proj'},lora_alpha=32, lora_dropout=0.1, fan_in_fan_out=False, bias='none', use_rslora=False, modules_to_save=None, init_lora_weights=True, layers_to_transform=None, layers_pattern=None, rank_pattern={}, alpha_pattern={}, megatron_config=None, megatron_core='megatron.core', loftq_config={}, use_dora=False, # <=== doralayer_replication=None, runtime_config=LoraRuntimeConfig(ephemeral_gpu_offload=False)) 

没想到后面还有一个use_dora的选项,碰巧之前浏览过这块,可以分享一下:

DoRA

首先对预训练模型的权重进行分解,将每个权重矩阵分解为幅度(magnitude)向量和方向(direction)矩阵

在微调过程中,DoRA使用LoRA进行方向性更新,只调整方向部分的参数,而保持幅度部分不变。这种方式可以减少需要调整的参数数量,提高微调的效率。

在这里插入图片描述

后面,我们构建一个 PeftModel并且查看对应的训练参数量占比:

# 构建PeftModel
model = get_peft_model(model, config)
model.print_trainable_parameters()

输出如下:

trainable params: 9,043,968 || all params: 2,097,768,448 || trainable%: 0.4311

总参数量为 2,097,768,448(~ 21亿参数),使用LoRA后只需要微调的参数量为 9,043,968(~904万参数),约占总参数量的0.4311%

但是后面微调还是爆了,所以稍微去除一点不太重要的微调目标模块(个人观点),但是肯定会损耗微调性能的。

config = LoraConfig(task_type=TaskType.CAUSAL_LM, target_modules=["q_proj", "k_proj", "v_proj"],inference_mode=False, # 训练模式r=4, # Lora 秩lora_alpha=32, # Lora alaph,具体作用参见 Lora 原理lora_dropout=0.1# Dropout 比例
)

后续输出微调的参数占比为:

trainable params: 2,359,296 || all params: 2,091,083,776 || trainable%: 0.1128

当然,也降低了批处理大小 (牺牲速度):

# 设置训练参数
args = TrainingArguments(output_dir="./output/Yuan2.0-2B_lora_bf16",per_device_train_batch_size=6, # <===== 12gradient_accumulation_steps=1,logging_steps=1,save_strategy="epoch",num_train_epochs=3,learning_rate=5e-5,save_on_each_node=True,gradient_checkpointing=True,bf16=True
)

微调成功之后效果如下,即便增加了一些其他信息,也能保持相关的抽取。

在这里插入图片描述
(但是多次几次依旧容易翻车,会输出极其符合数据集分布的答案。)

数据集中的组织名和姓名是互斥的,且中国难识别归类到国籍。

在这里插入图片描述

关于更多的微调知识,感觉可以参考这篇知乎大佬的笔记:https://zhuanlan.zhihu.com/p/696837567

这篇关于【Datawhale AI 夏令营】第四期 基于2B源大模型 微调的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095981

相关文章

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

SpringBoot整合DeepSeek实现AI对话功能

《SpringBoot整合DeepSeek实现AI对话功能》本文介绍了如何在SpringBoot项目中整合DeepSeekAPI和本地私有化部署DeepSeekR1模型,通过SpringAI框架简化了... 目录Spring AI版本依赖整合DeepSeek API key整合本地化部署的DeepSeek

如何在本地部署 DeepSeek Janus Pro 文生图大模型

《如何在本地部署DeepSeekJanusPro文生图大模型》DeepSeekJanusPro模型在本地成功部署,支持图片理解和文生图功能,通过Gradio界面进行交互,展示了其强大的多模态处... 目录什么是 Janus Pro1. 安装 conda2. 创建 python 虚拟环境3. 克隆 janus

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

DeepSeek模型本地部署的详细教程

《DeepSeek模型本地部署的详细教程》DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,在本地成功部署DeepSe... 目录一、环境准备(一)硬件需求(二)软件依赖二、安装Ollama三、下载并部署DeepSeek模型选

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe