AI大模型探索之路-训练篇16:大语言模型预训练-微调技术之LoRA

news2024/11/25 20:47:22

系列篇章💥

AI大模型探索之路-训练篇1:大语言模型微调基础认知
AI大模型探索之路-训练篇2:大语言模型预训练基础认知
AI大模型探索之路-训练篇3:大语言模型全景解读
AI大模型探索之路-训练篇4:大语言模型训练数据集概览
AI大模型探索之路-训练篇5:大语言模型预训练数据准备-词元化
AI大模型探索之路-训练篇6:大语言模型预训练数据准备-预处理
AI大模型探索之路-训练篇7:大语言模型Transformer库之HuggingFace介绍
AI大模型探索之路-训练篇8:大语言模型Transformer库-预训练流程编码体验
AI大模型探索之路-训练篇9:大语言模型Transformer库-Pipeline组件实践
AI大模型探索之路-训练篇10:大语言模型Transformer库-Tokenizer组件实践
AI大模型探索之路-训练篇11:大语言模型Transformer库-Model组件实践
AI大模型探索之路-训练篇12:语言模型Transformer库-Datasets组件实践
AI大模型探索之路-训练篇13:大语言模型Transformer库-Evaluate组件实践
AI大模型探索之路-训练篇14:大语言模型Transformer库-Trainer组件实践
AI大模型探索之路-训练篇15:大语言模型预训练之全量参数微调


目录

  • 系列篇章💥
  • 前言
  • 一、微调技术分类
  • 二、LoRA原理
  • 三、在哪儿增加旁路
  • 四、为什么微调少量参数就可以
  • 五、如何对A和B进行初始化
  • 六、增加旁路会增加推理时间吗?
  • 七、R值为多少合适
  • 八、如何注入LoRA
  • 九、LoRA代码实践
    • 学术资源加速
    • 步骤1 导入相关包
    • 步骤2 加载数据集
    • 步骤3 数据集预处理
    • 步骤4 创建模型
      • 1、PEFT 步骤1 配置文件
      • 2、PEFT 步骤2 创建模型
    • 步骤5 配置训练参数
    • 步骤6 创建训练器
    • 步骤7 模型训练
    • 步骤8 模型推理
  • 十、主路合并旁路
    • 1、加载基础模型
    • 2、加载LoRA模型
    • 3、模型推理
    • 4、模型合并
    • 5、模型推理
    • 6、完整模型保存
  • 总结


前言

在自然语言处理领域,大语言模型的预训练-微调技术已经成为一种常见的方法。其中,LoRA(Low-Rank Adaptation)是一种新颖的微调技术,通过引入低秩矩阵来调整模型的行为,以提高模型在新任务上的表现。本文将对LoRA的原理、优势以及应用进行详细介绍。

一、微调技术分类

微调技术主要分为以下几类:
1)增加额外参数(A):这种方法是在原有的预训练模型的基础上增加一些额外的参数,以改变模型的行为。
2)选取一部分参数更新(S):这种方法是在微调过程中只更新模型的一部分参数,而不是所有参数。这可以减少计算量,提高微调效率。
3)引入重参数化(R):这种方法是在模型的参数空间中引入一些新的变化,通常是一些线性变换或非线性变换,以改变模型的行为。这种方法可以使模型在新任务上有更好的表现。

常见的参数高效微调技术有Prefix Tuning、Prompt Tuning、P-Tuning、Adapter Tuning、LoRA等
在这里插入图片描述

二、LoRA原理

LoRA(Low-Rank Adaptation:低秩的适配器)是一种新颖的微调技术,它通过引入低秩矩阵来调整模型的行为,以提高模型在新任务上的表现。具体来说,LoRA在原有的预训练模型中增加了两个旁路矩阵A和B,这两个矩阵的维度远小于原始模型的输入输出维度,从而实现了参数的高效微调。
在这里插入图片描述

三、在哪儿增加旁路

在原有的预训练模型中,可以选择在任意两个相邻层之间增加旁路矩阵A和B。这样,模型在前向传播过程中,可以通过这两个旁路矩阵来引入新的信息,从而改变模型的行为。
在这里插入图片描述

四、为什么微调少量参数就可以

在这里插入图片描述
A的输入维度和B的输出维度分别与原始模型的输入输出维度相同,而A的输出维度和B的输入维度是一个远小于原始模型输入输出维度的值,这就是low-rank的体现,可以极大地减少待训练的参数
在这里插入图片描述

表示的是矩阵的信息量,这里的“”特指引入的旁路矩阵的规模,即它们的行数和列数。
在这里插入图片描述

在LoRA技术中,我们通过引入低秩矩阵来调整预训练模型的行为,同时保留大部分原有的参数不变。这样做可以在不牺牲太多性能的前提下,显著降低模型微调时的计算成本和内存需求。

通俗化解释:“秩”:
想象一下你有一个很大的包裹,你需要通过一个小门把它送出去。但是门太小了,你必须把包裹拆成几个小包裹才能通过。在这个比喻中,大包裹就像模型的权重矩阵,小门就像我们新增的低秩矩阵,而“秩”就是这些小包裹的数量。在LoRA中,我们通过创建一些小的(低秩)矩阵来传递信息,而不是使用原始的大矩阵。这样做的好处是我们可以只关注那些最重要的信息,忽略掉不重要的信息,从而减少计算量和内存需求。

五、如何对A和B进行初始化

A和B如何初始化?
对A采用高斯初始化,对B采用零初始化的目的是,让训练刚开始时的值为0,这样不会给模型带来额外的噪声。

在这里插入图片描述

六、增加旁路会增加推理时间吗?

虽然增加了旁路矩阵A和B,但是由于它们的维度远小于原始模型的输入输出维度,因此在推理过程中,计算量的增加是非常有限的。
在这里插入图片描述

七、R值为多少合适

R值表示的是旁路矩阵A和B的秩。一般来说,R值的选择需要根据具体任务和模型结构来确定。在实际应用中,可以尝试不同的R值,以找到最佳的设置。

在这里插入图片描述

八、如何注入LoRA

要将LoRA应用于现有的预训练模型中,首先需要在相邻层之间插入旁路矩阵A和B。然后,在微调过程中,只需要调整这两个旁路矩阵的参数即可。这样,就可以实现模型行为的高效调整。
在这里插入图片描述

如上图中定义一个简单的3层的神经网络,在第1层增加旁路后效果如下:
在这里插入图片描述

九、LoRA代码实践

PEFT文档资料地址
1)文档地址:https://huggingface.co/docs/peft/index
2)Github地址:https://github.com/huggingface/peft
PEFT(Parameter-Efficient Fine-Tuning)库是一个用于参数高效微调预训练语言模型的库,旨在降低大规模模型微调的计算和存储成本。
PEFT库的核心优势在于它能够仅通过微调少量额外模型参数来适应各种下游任务,避免了对整个大模型参数进行微调的需求。这种方法不仅降低了资源消耗,而且在很多情况下能达到与完全微调相当的性能
在这里插入图片描述

PEFT技术的支持:
在这里插入图片描述

学术资源加速

方便从huggingface下载模型,这云平台autodl提供的,仅适用于autodl。

import subprocess
import os

result = subprocess.run('bash -c "source /etc/network_turbo && env | grep proxy"', shell=True, capture_output=True, text=True)
output = result.stdout
for line in output.splitlines():
    if '=' in line:
        var, value = line.split('=', 1)
        os.environ[var] = value

步骤1 导入相关包

开始之前,我们需要导入适用于模型训练和推理的必要库,如transformers。

from datasets import Dataset
from transformers import AutoTokenizer, AutoModelForCausalLM, DataCollatorForSeq2Seq, TrainingArguments, Trainer

步骤2 加载数据集

使用适当的数据加载器,例如datasets库,来加载预处理过的指令遵循性任务数据集。

ds = Dataset.load_from_disk("/root/tuning/lesson01/data/alpaca_data_zh/")
ds

输出

Dataset({
    features: ['output', 'input', 'instruction'],
    num_rows: 26858
})

数据查看

ds[:1]

输出

{'output': ['以下是保持健康的三个提示:\n\n1. 保持身体活动。每天做适当的身体运动,如散步、跑步或游泳,能促进心血管健康,增强肌肉力量,并有助于减少体重。\n\n2. 均衡饮食。每天食用新鲜的蔬菜、水果、全谷物和脂肪含量低的蛋白质食物,避免高糖、高脂肪和加工食品,以保持健康的饮食习惯。\n\n3. 睡眠充足。睡眠对人体健康至关重要,成年人每天应保证 7-8 小时的睡眠。良好的睡眠有助于减轻压力,促进身体恢复,并提高注意力和记忆力。'],
 'input': [''],
 'instruction': ['保持健康的三个提示。']}

步骤3 数据集预处理

利用预训练模型的分词器(Tokenizer)对原始文本进行编码,并生成相应的输入ID、注意力掩码和标签。
1)获取分词器

tokenizer = AutoTokenizer.from_pretrained("Langboat/bloom-1b4-zh")
tokenizer

在这里插入图片描述

输出:

BloomTokenizerFast(name_or_path='Langboat/bloom-1b4-zh', vocab_size=46145, model_max_length=1000000000000000019884624838656, is_fast=True, padding_side='left', truncation_side='right', special_tokens={'bos_token': '<s>', 'eos_token': '</s>', 'unk_token': '<unk>', 'pad_token': '<pad>'}, clean_up_tokenization_spaces=False),  added_tokens_decoder={
	0: AddedToken("<unk>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
	1: AddedToken("<s>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
	2: AddedToken("</s>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
	3: AddedToken("<pad>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
}

2)定义数据处理函数

def process_func(example):
    # 设置最大长度为256
    MAX_LENGTH = 256
    # 初始化输入ID、注意力掩码和标签列表
    input_ids, attention_mask, labels = [], [], []
    # 对指令和输入进行编码
    instruction = tokenizer("\n".join(["Human: " + example["instruction"], example["input"]]).strip() + "\n\nAssistant: ")
    # 对输出进行编码,并添加结束符
    response = tokenizer(example["output"] + tokenizer.eos_token)
    # 将指令和响应的输入ID拼接起来
    input_ids = instruction["input_ids"] + response["input_ids"]
    # 将指令和响应的注意力掩码拼接起来
    attention_mask = instruction["attention_mask"] + response["attention_mask"]
    # 将指令的标签设置为-100,表示不计算损失;将响应的输入ID作为标签
    labels = [-100] * len(instruction["input_ids"]) + response["input_ids"]
    # 如果输入ID的长度超过最大长度,截断输入ID、注意力掩码和标签
    if len(input_ids) > MAX_LENGTH:
        input_ids = input_ids[:MAX_LENGTH]
        attention_mask = attention_mask[:MAX_LENGTH]
        labels = labels[:MAX_LENGTH]
    # 返回处理后的数据
    return {
        "input_ids": input_ids,
        "attention_mask": attention_mask,
        "labels": labels
    }

3)对数据进行预处理

tokenized_ds = ds.map(process_func, remove_columns=ds.column_names)
tokenized_ds

输出:

Dataset({
    features: ['input_ids', 'attention_mask', 'labels'],
    num_rows: 26858
})

步骤4 创建模型

然后,我们实例化一个预训练模型,这个模型将作为微调的基础。对于大型模型,我们可能还需要进行一些特定的配置,以适应可用的计算资源。

#这行代码从Hugging Face Model Hub加载了一个预训练的Bloom模型,模型名称为"Langboat/bloom-1b4-zh",并且设置了low_cpu_mem_usage=True以减少CPU内存使用。
model = AutoModelForCausalLM.from_pretrained("Langboat/bloom-1b4-zh", low_cpu_mem_usage=True)

查看总共有哪些层,可以基于这些层添加LoRA

for name, parameter in model.named_parameters():
    print(name)

输出

base_model.model.transformer.word_embeddings.weight
base_model.model.transformer.word_embeddings_layernorm.weight
base_model.model.transformer.word_embeddings_layernorm.bias
base_model.model.transformer.h.0.input_layernorm.weight
base_model.model.transformer.h.0.input_layernorm.bias
base_model.model.transformer.h.0.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.0.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.0.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.0.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.0.self_attention.dense.weight
base_model.model.transformer.h.0.self_attention.dense.bias
base_model.model.transformer.h.0.post_attention_layernorm.weight
base_model.model.transformer.h.0.post_attention_layernorm.bias
base_model.model.transformer.h.0.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.0.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.0.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.0.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.1.input_layernorm.weight
base_model.model.transformer.h.1.input_layernorm.bias
base_model.model.transformer.h.1.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.1.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.1.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.1.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.1.self_attention.dense.weight
base_model.model.transformer.h.1.self_attention.dense.bias
base_model.model.transformer.h.1.post_attention_layernorm.weight
base_model.model.transformer.h.1.post_attention_layernorm.bias
base_model.model.transformer.h.1.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.1.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.1.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.1.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.2.input_layernorm.weight
base_model.model.transformer.h.2.input_layernorm.bias
base_model.model.transformer.h.2.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.2.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.2.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.2.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.2.self_attention.dense.weight
base_model.model.transformer.h.2.self_attention.dense.bias
base_model.model.transformer.h.2.post_attention_layernorm.weight
base_model.model.transformer.h.2.post_attention_layernorm.bias
base_model.model.transformer.h.2.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.2.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.2.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.2.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.3.input_layernorm.weight
base_model.model.transformer.h.3.input_layernorm.bias
base_model.model.transformer.h.3.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.3.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.3.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.3.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.3.self_attention.dense.weight
base_model.model.transformer.h.3.self_attention.dense.bias
base_model.model.transformer.h.3.post_attention_layernorm.weight
base_model.model.transformer.h.3.post_attention_layernorm.bias
base_model.model.transformer.h.3.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.3.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.3.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.3.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.4.input_layernorm.weight
base_model.model.transformer.h.4.input_layernorm.bias
base_model.model.transformer.h.4.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.4.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.4.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.4.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.4.self_attention.dense.weight
base_model.model.transformer.h.4.self_attention.dense.bias
base_model.model.transformer.h.4.post_attention_layernorm.weight
base_model.model.transformer.h.4.post_attention_layernorm.bias
base_model.model.transformer.h.4.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.4.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.4.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.4.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.5.input_layernorm.weight
base_model.model.transformer.h.5.input_layernorm.bias
base_model.model.transformer.h.5.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.5.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.5.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.5.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.5.self_attention.dense.weight
base_model.model.transformer.h.5.self_attention.dense.bias
base_model.model.transformer.h.5.post_attention_layernorm.weight
base_model.model.transformer.h.5.post_attention_layernorm.bias
base_model.model.transformer.h.5.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.5.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.5.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.5.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.6.input_layernorm.weight
base_model.model.transformer.h.6.input_layernorm.bias
base_model.model.transformer.h.6.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.6.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.6.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.6.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.6.self_attention.dense.weight
base_model.model.transformer.h.6.self_attention.dense.bias
base_model.model.transformer.h.6.post_attention_layernorm.weight
base_model.model.transformer.h.6.post_attention_layernorm.bias
base_model.model.transformer.h.6.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.6.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.6.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.6.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.7.input_layernorm.weight
base_model.model.transformer.h.7.input_layernorm.bias
base_model.model.transformer.h.7.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.7.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.7.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.7.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.7.self_attention.dense.weight
base_model.model.transformer.h.7.self_attention.dense.bias
base_model.model.transformer.h.7.post_attention_layernorm.weight
base_model.model.transformer.h.7.post_attention_layernorm.bias
base_model.model.transformer.h.7.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.7.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.7.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.7.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.8.input_layernorm.weight
base_model.model.transformer.h.8.input_layernorm.bias
base_model.model.transformer.h.8.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.8.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.8.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.8.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.8.self_attention.dense.weight
base_model.model.transformer.h.8.self_attention.dense.bias
base_model.model.transformer.h.8.post_attention_layernorm.weight
base_model.model.transformer.h.8.post_attention_layernorm.bias
base_model.model.transformer.h.8.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.8.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.8.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.8.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.9.input_layernorm.weight
base_model.model.transformer.h.9.input_layernorm.bias
base_model.model.transformer.h.9.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.9.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.9.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.9.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.9.self_attention.dense.weight
base_model.model.transformer.h.9.self_attention.dense.bias
base_model.model.transformer.h.9.post_attention_layernorm.weight
base_model.model.transformer.h.9.post_attention_layernorm.bias
base_model.model.transformer.h.9.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.9.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.9.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.9.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.10.input_layernorm.weight
base_model.model.transformer.h.10.input_layernorm.bias
base_model.model.transformer.h.10.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.10.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.10.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.10.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.10.self_attention.dense.weight
base_model.model.transformer.h.10.self_attention.dense.bias
base_model.model.transformer.h.10.post_attention_layernorm.weight
base_model.model.transformer.h.10.post_attention_layernorm.bias
base_model.model.transformer.h.10.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.10.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.10.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.10.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.11.input_layernorm.weight
base_model.model.transformer.h.11.input_layernorm.bias
base_model.model.transformer.h.11.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.11.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.11.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.11.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.11.self_attention.dense.weight
base_model.model.transformer.h.11.self_attention.dense.bias
base_model.model.transformer.h.11.post_attention_layernorm.weight
base_model.model.transformer.h.11.post_attention_layernorm.bias
base_model.model.transformer.h.11.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.11.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.11.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.11.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.12.input_layernorm.weight
base_model.model.transformer.h.12.input_layernorm.bias
base_model.model.transformer.h.12.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.12.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.12.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.12.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.12.self_attention.dense.weight
base_model.model.transformer.h.12.self_attention.dense.bias
base_model.model.transformer.h.12.post_attention_layernorm.weight
base_model.model.transformer.h.12.post_attention_layernorm.bias
base_model.model.transformer.h.12.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.12.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.12.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.12.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.13.input_layernorm.weight
base_model.model.transformer.h.13.input_layernorm.bias
base_model.model.transformer.h.13.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.13.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.13.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.13.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.13.self_attention.dense.weight
base_model.model.transformer.h.13.self_attention.dense.bias
base_model.model.transformer.h.13.post_attention_layernorm.weight
base_model.model.transformer.h.13.post_attention_layernorm.bias
base_model.model.transformer.h.13.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.13.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.13.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.13.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.14.input_layernorm.weight
base_model.model.transformer.h.14.input_layernorm.bias
base_model.model.transformer.h.14.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.14.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.14.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.14.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.14.self_attention.dense.weight
base_model.model.transformer.h.14.self_attention.dense.bias
base_model.model.transformer.h.14.post_attention_layernorm.weight
base_model.model.transformer.h.14.post_attention_layernorm.bias
base_model.model.transformer.h.14.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.14.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.14.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.14.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.15.input_layernorm.weight
base_model.model.transformer.h.15.input_layernorm.bias
base_model.model.transformer.h.15.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.15.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.15.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.15.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.15.self_attention.dense.weight
base_model.model.transformer.h.15.self_attention.dense.bias
base_model.model.transformer.h.15.post_attention_layernorm.weight
base_model.model.transformer.h.15.post_attention_layernorm.bias
base_model.model.transformer.h.15.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.15.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.15.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.15.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.16.input_layernorm.weight
base_model.model.transformer.h.16.input_layernorm.bias
base_model.model.transformer.h.16.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.16.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.16.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.16.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.16.self_attention.dense.weight
base_model.model.transformer.h.16.self_attention.dense.bias
base_model.model.transformer.h.16.post_attention_layernorm.weight
base_model.model.transformer.h.16.post_attention_layernorm.bias
base_model.model.transformer.h.16.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.16.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.16.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.16.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.17.input_layernorm.weight
base_model.model.transformer.h.17.input_layernorm.bias
base_model.model.transformer.h.17.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.17.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.17.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.17.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.17.self_attention.dense.weight
base_model.model.transformer.h.17.self_attention.dense.bias
base_model.model.transformer.h.17.post_attention_layernorm.weight
base_model.model.transformer.h.17.post_attention_layernorm.bias
base_model.model.transformer.h.17.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.17.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.17.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.17.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.18.input_layernorm.weight
base_model.model.transformer.h.18.input_layernorm.bias
base_model.model.transformer.h.18.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.18.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.18.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.18.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.18.self_attention.dense.weight
base_model.model.transformer.h.18.self_attention.dense.bias
base_model.model.transformer.h.18.post_attention_layernorm.weight
base_model.model.transformer.h.18.post_attention_layernorm.bias
base_model.model.transformer.h.18.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.18.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.18.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.18.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.19.input_layernorm.weight
base_model.model.transformer.h.19.input_layernorm.bias
base_model.model.transformer.h.19.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.19.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.19.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.19.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.19.self_attention.dense.weight
base_model.model.transformer.h.19.self_attention.dense.bias
base_model.model.transformer.h.19.post_attention_layernorm.weight
base_model.model.transformer.h.19.post_attention_layernorm.bias
base_model.model.transformer.h.19.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.19.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.19.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.19.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.20.input_layernorm.weight
base_model.model.transformer.h.20.input_layernorm.bias
base_model.model.transformer.h.20.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.20.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.20.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.20.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.20.self_attention.dense.weight
base_model.model.transformer.h.20.self_attention.dense.bias
base_model.model.transformer.h.20.post_attention_layernorm.weight
base_model.model.transformer.h.20.post_attention_layernorm.bias
base_model.model.transformer.h.20.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.20.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.20.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.20.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.21.input_layernorm.weight
base_model.model.transformer.h.21.input_layernorm.bias
base_model.model.transformer.h.21.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.21.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.21.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.21.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.21.self_attention.dense.weight
base_model.model.transformer.h.21.self_attention.dense.bias
base_model.model.transformer.h.21.post_attention_layernorm.weight
base_model.model.transformer.h.21.post_attention_layernorm.bias
base_model.model.transformer.h.21.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.21.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.21.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.21.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.22.input_layernorm.weight
base_model.model.transformer.h.22.input_layernorm.bias
base_model.model.transformer.h.22.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.22.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.22.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.22.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.22.self_attention.dense.weight
base_model.model.transformer.h.22.self_attention.dense.bias
base_model.model.transformer.h.22.post_attention_layernorm.weight
base_model.model.transformer.h.22.post_attention_layernorm.bias
base_model.model.transformer.h.22.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.22.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.22.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.22.mlp.dense_4h_to_h.bias
base_model.model.transformer.h.23.input_layernorm.weight
base_model.model.transformer.h.23.input_layernorm.bias
base_model.model.transformer.h.23.self_attention.query_key_value.base_layer.weight
base_model.model.transformer.h.23.self_attention.query_key_value.base_layer.bias
base_model.model.transformer.h.23.self_attention.query_key_value.lora_A.default.weight
base_model.model.transformer.h.23.self_attention.query_key_value.lora_B.default.weight
base_model.model.transformer.h.23.self_attention.dense.weight
base_model.model.transformer.h.23.self_attention.dense.bias
base_model.model.transformer.h.23.post_attention_layernorm.weight
base_model.model.transformer.h.23.post_attention_layernorm.bias
base_model.model.transformer.h.23.mlp.dense_h_to_4h.weight
base_model.model.transformer.h.23.mlp.dense_h_to_4h.bias
base_model.model.transformer.h.23.mlp.dense_4h_to_h.weight
base_model.model.transformer.h.23.mlp.dense_4h_to_h.bias
base_model.model.transformer.ln_f.weight
base_model.model.transformer.ln_f.bias

LoRA相关的配置(下面2个部分是LoRA相关的配置,其他的和全量微调代码一样)。

1、PEFT 步骤1 配置文件

在使用PEFT进行微调时,我们首先需要创建一个配置文件,该文件定义了微调过程中的各种设置,如学习率调度、优化器选择等。

from peft import LoraConfig, TaskType, get_peft_model
config = LoraConfig(task_type=TaskType.CAUSAL_LM)
##也可以不使用默认的,自己指定, 目标层 target_modules=["query_key_value"],秩 r=8
#config = LoraConfig(task_type=TaskType.CAUSAL_LM,r=8, target_modules=['query_key_value','dense_4h_to_h'])
config

2、PEFT 步骤2 创建模型

接下来,我们使用PEFT和预训练模型来创建一个微调模型。这个模型将包含原始的预训练模型以及由PEFT引入的低秩参数。

model = get_peft_model(model, config)
model

输出:

PeftModelForCausalLM(
  (base_model): LoraModel(
    (model): PeftModelForCausalLM(
      (base_model): LoraModel(
        (model): BloomForCausalLM(
          (transformer): BloomModel(
            (word_embeddings): Embedding(46145, 2048)
            (word_embeddings_layernorm): LayerNorm((2048,), eps=1e-05, elementwise_affine=True)
            (h): ModuleList(
              (0-23): 24 x BloomBlock(
                (input_layernorm): LayerNorm((2048,), eps=1e-05, elementwise_affine=True)
                (self_attention): BloomAttention(
                  (query_key_value): lora.Linear(
                    (base_layer): Linear(in_features=2048, out_features=6144, bias=True)
                    (lora_dropout): ModuleDict(
                      (default): Identity()
                    )
                    (lora_A): ModuleDict(
                      (default): Linear(in_features=2048, out_features=8, bias=False)
                    )
                    (lora_B): ModuleDict(
                      (default): Linear(in_features=8, out_features=6144, bias=False)
                    )
                    (lora_embedding_A): ParameterDict()
                    (lora_embedding_B): ParameterDict()
                  )
                  (dense): Linear(in_features=2048, out_features=2048, bias=True)
                  (attention_dropout): Dropout(p=0.0, inplace=False)
                )
                (post_attention_layernorm): LayerNorm((2048,), eps=1e-05, elementwise_affine=True)
                (mlp): BloomMLP(
                  (dense_h_to_4h): Linear(in_features=2048, out_features=8192, bias=True)
                  (gelu_impl): BloomGelu()
                  (dense_4h_to_h): lora.Linear(
                    (base_layer): Linear(in_features=8192, out_features=2048, bias=True)
                    (lora_dropout): ModuleDict(
                      (default): Identity()
                    )
                    (lora_A): ModuleDict(
                      (default): Linear(in_features=8192, out_features=8, bias=False)
                    )
                    (lora_B): ModuleDict(
                      (default): Linear(in_features=8, out_features=2048, bias=False)
                    )
                    (lora_embedding_A): ParameterDict()
                    (lora_embedding_B): ParameterDict()
                  )
                )
              )
            )
            (ln_f): LayerNorm((2048,), eps=1e-05, elementwise_affine=True)
          )
          (lm_head): Linear(in_features=2048, out_features=46145, bias=False)
        )
      )
    )
  )
)

查看配置

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={'query_key_value', 'dense_4h_to_h'}, lora_alpha=8, lora_dropout=0.0, fan_in_fan_out=False, bias='none', 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={})

步骤5 配置训练参数

定义训练参数,包括输出目录、学习率、批次大小、梯度累积步数、优化器选择等。

args = TrainingArguments(
    output_dir="/root/autodl-tmp/tuningdata/lora",# 指定模型训练结果的输出目录。
    per_device_train_batch_size=4, # 指定每个设备(如GPU)上的批次大小
    gradient_accumulation_steps=8,# 指定梯度累积步数。在本例子中,每8个步骤进行一次梯度更新。
    logging_steps=20, #指定日志记录的频率。在本例子中,每20个步骤记录一次日志
    num_train_epochs=4 #指定训练的总轮数
)

步骤6 创建训练器

最后,我们创建一个训练器实例,它封装了训练循环。训练器将负责运行训练过程,并根据我们之前定义的参数进行优化。

trainer = Trainer(
    model=model,#指定训练模型
    args=args, #指定训练参数
    train_dataset=tokenized_ds, #指定数据集
    data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer, padding=True) #指定数据收集器。其中tokenizer是分词器,padding=True表示对输入进行填充以保持批次大小一致。
)

步骤7 模型训练

通过调用训练器的train()方法,我们启动模型的训练过程。

trainer.train()

步骤8 模型推理

训练完成后,我们可以使用训练好的模型进行推理。这通常涉及到使用模型的inference方法,输入经过适当处理的问题,并得到模型的输出。

from transformers import pipeline

pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device=0)

ipt = "Human: {}\n{}".format("如何写好一个简历?", "").strip() + "\n\nAssistant: "
pipe(ipt, max_length=256, do_sample=True, )

输出

[{'generated_text': 'Human: 如何写好一个简历?\n\nAssistant: 一篇好的简历应包含以下内容:个人信息(姓名,出生日期,出生地,教育经历,工作经历)、求职理由、个人能力(如语言能力,英语水平,操作技能,编程能力,市场营销能力,分析归纳能力等)、学习经历、实践经历和经验、荣誉奖项、相关证书和荣誉、个人兴趣爱好以及在工作中遇到的瓶颈和障碍。\n\n在书写时,应注意文字简洁、条理清晰,突出重点,语言流畅。您也可以在简历中附上一些相关的个人照片或照片资料以供他人参考。如果您有任何疑问,请随时与我联系。'}]

十、主路合并旁路

1、加载基础模型

from transformers import AutoModelForCausalLM, AutoTokenizer

from peft import PeftModel

model = AutoModelForCausalLM.from_pretrained("Langboat/bloom-1b4-zh", low_cpu_mem_usage=True)
tokenizer = AutoTokenizer.from_pretrained("Langboat/bloom-1b4-zh")

2、加载LoRA模型

p_model = PeftModel.from_pretrained(model, model_id="/root/autodl-tmp/tuningdata/lora/checkpoint-500")
p_model

输出

PeftModelForCausalLM(
  (base_model): LoraModel(
    (model): BloomForCausalLM(
      (transformer): BloomModel(
        (word_embeddings): Embedding(46145, 2048)
        (word_embeddings_layernorm): LayerNorm((2048,), eps=1e-05, elementwise_affine=True)
        (h): ModuleList(
          (0-23): 24 x BloomBlock(
            (input_layernorm): LayerNorm((2048,), eps=1e-05, elementwise_affine=True)
            (self_attention): BloomAttention(
              (query_key_value): lora.Linear(
                (base_layer): Linear(in_features=2048, out_features=6144, bias=True)
                (lora_dropout): ModuleDict(
                  (default): Identity()
                )
                (lora_A): ModuleDict(
                  (default): Linear(in_features=2048, out_features=8, bias=False)
                )
                (lora_B): ModuleDict(
                  (default): Linear(in_features=8, out_features=6144, bias=False)
                )
                (lora_embedding_A): ParameterDict()
                (lora_embedding_B): ParameterDict()
              )
              (dense): Linear(in_features=2048, out_features=2048, bias=True)
              (attention_dropout): Dropout(p=0.0, inplace=False)
            )
            (post_attention_layernorm): LayerNorm((2048,), eps=1e-05, elementwise_affine=True)
            (mlp): BloomMLP(
              (dense_h_to_4h): Linear(in_features=2048, out_features=8192, bias=True)
              (gelu_impl): BloomGelu()
              (dense_4h_to_h): lora.Linear(
                (base_layer): Linear(in_features=8192, out_features=2048, bias=True)
                (lora_dropout): ModuleDict(
                  (default): Identity()
                )
                (lora_A): ModuleDict(
                  (default): Linear(in_features=8192, out_features=8, bias=False)
                )
                (lora_B): ModuleDict(
                  (default): Linear(in_features=8, out_features=2048, bias=False)
                )
                (lora_embedding_A): ParameterDict()
                (lora_embedding_B): ParameterDict()
              )
            )
          )
        )
        (ln_f): LayerNorm((2048,), eps=1e-05, elementwise_affine=True)
      )
      (lm_head): Linear(in_features=2048, out_features=46145, bias=False)
    )
  )
)

3、模型推理

from transformers import pipeline

pipe = pipeline("text-generation", model=p_model, tokenizer=tokenizer, device=0)
ipt = "Human: {}\n{}".format("如何写好一个简历?", "").strip() + "\n\nAssistant: "
pipe(ipt, max_length=256, do_sample=True, )

4、模型合并

merge_model = p_model.merge_and_unload()
merge_model

输出

BloomForCausalLM(
  (transformer): BloomModel(
    (word_embeddings): Embedding(46145, 2048)
    (word_embeddings_layernorm): LayerNorm((2048,), eps=1e-05, elementwise_affine=True)
    (h): ModuleList(
      (0-23): 24 x BloomBlock(
        (input_layernorm): LayerNorm((2048,), eps=1e-05, elementwise_affine=True)
        (self_attention): BloomAttention(
          (query_key_value): Linear(in_features=2048, out_features=6144, bias=True)
          (dense): Linear(in_features=2048, out_features=2048, bias=True)
          (attention_dropout): Dropout(p=0.0, inplace=False)
        )
        (post_attention_layernorm): LayerNorm((2048,), eps=1e-05, elementwise_affine=True)
        (mlp): BloomMLP(
          (dense_h_to_4h): Linear(in_features=2048, out_features=8192, bias=True)
          (gelu_impl): BloomGelu()
          (dense_4h_to_h): Linear(in_features=8192, out_features=2048, bias=True)
        )
      )
    )
    (ln_f): LayerNorm((2048,), eps=1e-05, elementwise_affine=True)
  )
  (lm_head): Linear(in_features=2048, out_features=46145, bias=False)
)

5、模型推理

from transformers import pipeline

pipe = pipeline("text-generation", model=merge_model, tokenizer=tokenizer, device=0)
ipt = "Human:如何写好一个简历?\n\nAssistant: "
pipe(ipt, max_length=256,)

6、完整模型保存

模型训练完后,可以将合并的模型进行保存到本地,进行备用

merge_model.save_pretrained("/root/autodl-tmp/tuningdata/merge_model")

总结

LoRA是一种新颖的微调技术,通过引入低秩矩阵来调整模型的行为,以提高模型在新任务上的表现。它具有参数高效、计算复杂度低等优点,因此在自然语言处理领域具有广泛的应用前景。

在这里插入图片描述

🎯🔖更多专栏系列文章:AIGC-AI大模型探索之路

如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我,让我们携手同行AI的探索之旅,一起开启智能时代的大门!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新闲鱼小众蓝海虚拟资源,单号日入300+,三天必起店,矩阵放大月入1-2W

详情介绍 本项目售卖的虚拟资源非常小众&#xff0c;宅男的最爱&#xff0c;并且市场一片蓝海&#xff01;只需一步手机&#xff0c;随时随地操作项目&#xff0c;流量巨大&#xff0c;安装教程方法操作三天必起店&#xff0c;消息多到回不过来&#xff0c;一天轻松出个大几十单…

封装Springboot基础框架功能-03

在些模块中汇总了一些web开发常用的配置和功能。 模块源码结构 Restful API常用定义 QueryParam请求参数 Data public class QueryParam {private String key;private String value; }RestfulController实现 RestfulController.java&#xff0c;主要汇总一些常用的restful的…

启明智显分享|国产RISC-V@480MHz“邮票孔”工业级HMI核心板,高品质低成本,仅34.9元!

「Model系列」芯片是启明智显针对工业、行业以及车载产品市场推出的系列HMI芯片&#xff0c;主要应用于工业自动化、智能终端HMI、车载仪表盘、串口屏、智能中控、智能家居、充电桩显示屏、储能显示屏、工业触摸屏等领域。此系列具有高性能、低成本的特点&#xff0c;支持工业宽…

响应式编程Spring Reactor探索

一&#xff0c;介绍 响应式编程&#xff08;Reactive Programming&#xff09;&#xff0c;简单来说是一种生产者只负责生成并发出数据/事件&#xff0c;消费者来监听并负责定义如何处理数据/事件的变化传递方式的编程思想。 响应式编程借鉴了Reactor设计模式&#xff0c;我们…

一文搞懂前端跨页面通信的那些方案们

前端开发逃避不开跨页面通信这项工作&#xff0c;跨页面通信&#xff0c;就好比A页面要和B页面说话&#xff0c;可能只是说一句话&#xff0c;不需要回话&#xff0c;可能是要给一些东西&#xff0c;希望得到回复&#xff0c;并频繁进行沟通&#xff0c;接下来我们说说这些跨页…

图搜索算法 - 拓扑排序

相关文章&#xff1a; 数据结构–图的概念 图搜索算法 - 深度优先搜索法&#xff08;DFS&#xff09; 图搜索算法 - 广度优先搜索法&#xff08;BFS&#xff09; 拓扑排序 概念 几乎所有的工程都可分为若干个称作活动的子工程&#xff0c;而这些子工程之间&#xff0c;通常受…

Figma 高效技巧:设计系统中的图标嵌套

Figma 高效技巧&#xff1a;设计系统中的图标嵌套 在设计中&#xff0c;图标起着不可或缺的作用。一套便捷易用的图标嵌套方法可以有效提高设计效率。 分享一下我在图标嵌套上走过的弯路和经验教训。我的图标嵌套可以分三个阶段&#xff1a; 第一阶段&#xff1a;建立图标库 一…

洛谷官方提单——【入门4】数组——python

洛谷官方提单——【入门4】数组 小鱼比可爱题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示代码 小鱼的数字游戏题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据规模与约定 代码 【深基5.例3】冰雹猜想题目描述输入格式输出格式样例 #1样例输入 …

24深圳杯ABCD成品论文47页+各小问代码+图表

A题多个火箭残骸的准确定位&#xff1a; A题已经更新完22页完整版论文&#xff0b;高清无水印照片&#xff0b;Python&#xff08;MATLAB&#xff09;代码简单麦麦https://www.jdmm.cc/file/2710544/ 问题1&#xff1a;单个残骸的音爆位置确定 建模思路&#xff1a; 1. 声波传…

Codeforces Round 942 (Div.1) (Div. 2) 2A~2D

2A.Contest Proposal&#xff08;枚举&#xff09; 题意&#xff1a; 一个竞赛包含 n n n个问题&#xff0c;第 i i i个问题的难度预计最多为 b i b_i bi​。现在已经有 n n n个问题提案&#xff0c;第 i i i个问题的难度为 a i a_i ai​。最初&#xff0c; a 1 , a 2 , … ,…

为什么现在越来越多的人会选择陪诊

现在越来越多的人选择陪诊的原因有多方面。 首先&#xff0c;随着人口老龄化、医疗资源分配不均等问题的日益突出&#xff0c;许多老年人和病患在就医过程中面临诸多困难&#xff0c;如挂号、排队、取药等繁琐的手续和流程。陪诊服务能够为他们提供极大的便利&#xff0c;帮助…

spring模块(六)spring监听器(2)@EventListener

一、介绍 监听器的简化写法 二、原理 三、使用 Slf4j Component public class MyTask {EventListenerpublic void onApplicationEvent(ApplicationEvent event) {if (event instanceof ContextRefreshedEvent) {log.info("监听到 ContextRefreshedEvent...");}if…

[图解]DDD架构好简单我学会了-学会也没啥用

1 00:00:03,720 --> 00:00:05,920 内部共有&#xff0c;首先是内部的 2 00:00:08,150 --> 00:00:09,220 所以不能说什么 3 00:00:09,630 --> 00:00:10,730 不能跟外部连在一起 4 00:00:10,740 --> 00:00:15,280 比如说&#xff0c;功能架构&#xff0c;可以吗 …

使用Linux命令时,前面加sudo和不加有什么区别?

在使用cmake命令编译时&#xff0c;前面加上sudo和不加主要有以下区别&#xff1a; 权限&#xff1a; 使用sudo&#xff1a;当您在命令前加上sudo时&#xff0c;表示您以超级用户的权限执行该命令。这通常用于需要访问受限制的系统文件或执行需要更高权限的操作。不使用sudo&am…

Swift 字符串和字符

字符串和字符 一、字符串字面量1、多行字符串字面量2、字符串字面量的特殊字符3、扩展字符串分隔符 二、初始化空字符串三、字符串可变性四、字符串是值类型五、使用字符六、连接字符串和字符七、字符串插值八、Unicode1、Unicode 标量2、可扩展的字形群集 九、计算字符数量十、…

『ZJUBCA Collaboration』WTF Academy 赞助支持

非常荣幸宣布&#xff0c;浙江大学区块链协会收到WTF Academy的赞助与支持&#xff0c;未来将共同开展更多深度合作。 WTF Academy是开发者的Web3开源大学&#xff0c;旨在通过开源教育让100,000名开发者进入到Web3。截止目前&#xff0c;WTF开源教程在GitHub收获超15,000 ⭐&a…

五一假期Llama 3之魔改不完全攻略(Part 2)

2024年4月18日&#xff0c;Meta AI 正式宣布推出 Llama 3&#xff0c;这标志着开源大型语言模型&#xff08;LLM&#xff09;领域的又一重大进步。如同一颗重磅炸弹&#xff0c; Llama 3 以其卓越的性能和广泛的应用前景&#xff0c;预示着 AI 技术的新时代。 目前开源的是Lla…

H62410A dcdc 24V30V36V48V60V72V100V降压12V/5V1A 恒压电源芯片IC

DCDC 24V-30V-36V-48V-60V-72V-100V降压至12V/5V 1A恒压电源芯片IC的工作原理主要基于开关调节和PWM&#xff08;脉冲宽度调制&#xff09;控制。 首先&#xff0c;芯片内部通常包含一个高速开关&#xff0c;通常是一个MOSFET&#xff08;金属氧化物半导体场效应晶体管&#x…

MySQL·内置函数

目录 函数 日期函数 案例1&#xff1a;创建一张表&#xff0c;记录生日 案例2&#xff1a;创建一个留言表 案例3&#xff1a;请查询在2分钟内发布的帖子 字符串函数 案例1&#xff1a; 获取emp表的ename列的字符集 案例2&#xff1a;要求显示exam_result表中的信息&am…

XShell 无法连上 VirtualBox的系统问题排查

之前一直都是可以正常使用的&#xff0c;过了一段时间之后&#xff0c;我发现无法使用XShell连接我之前安装的Centos 系统了。 我在centos中ping windows的IP地址&#xff0c;是可以 ping 通的&#xff0c; 百度也可以 ping 通&#xff0c;但是在 windows 中 ping centos的IP地…