首页 >科技周边 >人工智能 >微调美洲驼3.2 3b用于抹布 - 分析vidhya

微调美洲驼3.2 3b用于抹布 - 分析vidhya

Joseph Gordon-Levitt
Joseph Gordon-Levitt原创
2025-03-13 09:46:23328浏览

小语言模型(SLM)对AI产生了重大影响。它们提供出色的性能,同时有效且具有成本效益。一个杰出的例子是Llama 3.2 3b。它在检索型生成(RAG)任务中表现出色,降低计算成本和内存使用情况,同时保持高精度。本文探讨了如何微调Llama 3.2 3B模型。了解较小的模型如何在抹布任务中表现出色,并突破紧凑的AI解决方案可以实现的边界。

目录

  • 什么是Llama 3.2 3b?
  • Finetuning Llama 3.2 3b
  • 洛拉
  • 需要库
  • 导入库
  • 初始化模型和标记器
  • 初始化PEFT的模型
  • 数据处理
  • 设置教练参数
  • 微调模型
  • 测试并保存模型
  • 结论
  • 常见问题

什么是Llama 3.2 3b?

由Meta开发的Llama 3.2 3B模型是一个多语言SLM,具有30亿个参数,专为问题回答,摘要和对话系统等任务而设计。它的表现优于行业基准的许多开源模型,并支持各种语言。 Llama 3.2有各种尺寸可用,提供有效的计算性能,并包括在移动和边缘环境中更快,存储效率部署的量化版本。

微调美洲驼3.2 3b用于抹布 - 分析vidhya

另请阅读:前13个小语言模型(SLM)

Finetuning Llama 3.2 3b

微调对于将SLM或LLMS调整为特定领域或任务(例如医疗,法律或抹布应用程序)至关重要。虽然预培训使语言模型能够生成跨不同主题的文本,但通过微调对特定于域或特定任务的数据进行微调重新培训,以提高相关性和性能。为了解决微调所有参数的高计算成本,诸如参数有效微调(PEFT)之类的技术专注于训练模型参数的一个子集,在维持性能的同时优化资源使用情况。

洛拉

一种这样的PEFT方法是低级适应(LORA)。

在洛拉(Lora),将SLM或LLM中的重量基质分解为两个低级矩阵的产物。

 W = WA * WB

如果W具有M行和n列,则可以将其分解为M行和R列中的WA,以及带有R行和N列的WB。这里的r远小于m或n。因此,我们只能训练r*(mn)值,而不是训练m*n值。 r称为等级,这是我们可以选择的超参数。

 def lora_linear(x):<br> h = x @ w#常规线性<br> h =比例 *(x @ w_a @ w_b)#低率更新<br> 返回h

结帐:大型语言模型与洛拉和Qlora的高效微调

让我们在Llama 3.2 3B型号上实现Lora。

需要库

  • 不塞 - 2024.12.9
  • 数据集 - 3.1.0

安装上述懒惰版本还将安装兼容的Pytorch,变形金刚和NVIDIA GPU库。我们可以使用Google Colab访问GPU。

让我们现在看一下实施!

导入库

来自Unsploth Import fastlanguageModel,is_bfloat16_supported,train_on_responses_only

从数据集import load_dataset,数据集

来自TRL导入SFTTrainer,apply_chat_template

从变形金刚导入培训量,datacollat​​orforseq2seq,textstreamer

导入火炬

初始化模型和标记器

max_seq_length = 2048 
dtype =无#无用于自动检测。
load_in_4bit = true#使用4bit量化来减少内存使用量。可以是错误的。

型号,tokenizer = fastlanguagemodel.from_pretaining(
	model_name =“ unsploth/llama-3.2-3b-instruct”,
	max_seq_length = max_seq_length,
	dtype = dtype,
	load_in_4bit = load_in_4bit,
	#token =“ hf _...”,#如果使用诸如meta-llama/llama-3.2-11b之类的封闭模型
)

对于由Unsploth支持的其他模型,我们可以参考此文档。

初始化PEFT的模型

model = fastlanguagemodel.get_peft_model(
	模型,
	r = 16,
	target_modules = [“ q_proj”,“ k_proj”,“ v_proj”,“ o_proj”,
                  	“ gate_proj”,“ up_proj”,“ down_proj”,],
	lora_alpha = 16,
	lora_dropout = 0, 
	bias =“无”,
	use_gradient_checkpointing =“ unsploth”,
	Random_State = 42,
	use_rslora = false, 
	loftq_config = none,
)

每个参数的描述

  • R :洛拉等级;更高的值提高了精度,但使用更多的内存(建议:8-128)。
  • target_modules :微调模块;包括全部以获得更好的结果
  • lora_alpha :缩放系数;通常等于或两倍的等级r。
  • lora_dropout :辍学率;设置为0进行优化和更快的培训。
  • 偏见:偏见类型; “无”用于速度和最小拟合的优化。
  • USE_GRADIENT_CHECKPOINT :减少内存的内存培训;强烈建议“不塞”。
  • Random_State :确定性运行的种子,确保可重复的结果(例如,42)。
  • use_rslora :自动选择alpha选择;对稳定的洛拉有用。
  • LoftQ_Config :用顶部R单数向量初始化Lora,以提高准确性,尽管记忆力很强。

数据处理

我们将使用抹布数据来列出。从HuggingFace下载数据。

 dataset = load_dataset(“ neural-bridge/rag-dataset-1200”,split =“ train”)

该数据集的三个键如下:

数据集({功能:['context','问题','答案'],num_rows:960})

数据需要根据语言模型为特定格式。在此处阅读更多详细信息

因此,让我们将数据转换为所需的格式:

 def convert_dataset_to_dict(数据集):
    dataset_dict = {
        “迅速的”: [],
        “完成”:[]
    }

    对于数据集中的行:
        user_content = f“ context:{row ['context']} \ n question:{row ['Question']}”
        Assistion_Content =行['答案']

        dataset_dict [“提示”]。附录([[
            {“角色”:“用户”,“ content”:user_content}
        )))
        dataset_dict [“完成”]。附录([[
            {“角色”:“助手”,“ content”:Assistion_Content}
        )))
    返回dataset_dict
    
    
converted_data = convert_dataset_to_dict(数据集)
dataset = dataset.from_dict(converted_data)
dataset = dataset.map(apply_chat_template,fn_kwargs = {“ tokenizer”:tokenizer})

数据集消息将如下:

微调美洲驼3.2 3b用于抹布 - 分析vidhya

设置教练参数

我们可以初始化培训师以填充SLM:

培训师= sfttrainer(
	模型=模型,
	tokenizer = tokenizer,
	train_dataset =数据集,
	max_seq_length = max_seq_length,
	data_collat​​or = datacollat​​orforseq2seq(tokenizer = tokenizer),
	dataset_num_proc = 2,
	包装= false,#可以使短序列更快地训练5倍。
	args = trainingarguments(
    	per_device_train_batch_size = 2,
    	gradient_accumulation_steps = 4,
    	热身_Steps = 5,
    	#num_train_epochs = 1,#设置此设置为1个完整的训练运行。
    	max_steps = 6,#使用少量进行测试
    	Learning_rate = 2e-4,
    	fp16 = not is_bfloat16_supported(),
    	bf16 = is_bfloat16_supported(),
    	logging_steps = 1,
    	optim =“ adamw_8bit”,
    	weight_decay = 0.01,
    	lr_scheduler_type =“线性”,
    	种子= 3407,
    	output_dir =“输出”,
    	report_to =“无”,#将其用于wandb等
	),
)

某些参数的描述:

  • per_device_train_batch_size:每个设备的批量尺寸;增加以利用更多的GPU内存,但请注意填充效率低下(建议:2)。
  • gradient_accumulation_steps:模拟较大的批量大小而无需额外的内存使用;增加更顺畅的损耗曲线(建议:4)。
  • MAX_STEPS:总培训步骤;设置为更快的运行速度(例如60),或使用`num_train_epochs`用于完整数据集通过(例如,1-3)。
  • Learning_rate:控制训练速度和融合;较低的速率(例如2E-4)提高了准确性,但训练缓慢。

仅通过指定响应模板才能对响应进行模型训练:

培训师= train_on_responses_only(
	教练,
	consition_part =“  user  \ n \ n”,
	response_part =“ 助手 \ n \ n”,
)

微调模型

Trainer_stats = Trainer.Train()

这是培训统计数据:

微调美洲驼3.2 3b用于抹布 - 分析vidhya

测试并保存模型

让我们使用模型进行推理:

 fastlanguagemodel.for_inference(模型)

消息= [
	{“角色”:“用户”,“ content”:“上下文:白天通常清晰的天空。问题:水是什么颜色?”},
这是给出的
inputs = tokenizer.apply_chat_template(
	消息,
	tokenize = true,
	add_generation_prompt = true,
	return_tensors =“ pt”,
).to(“ cuda”)

text_streamer = textstreamer(tokenizer,skip_prompt = true)
_ = model.generate(input_ids = inputs,artermer = text_streamer,max_new_tokens = 128,
               	use_cache = true,温度= 1.5,min_p = 0.1)

为了节省训练的训练,包括洛拉重量,请使用以下代码

model.save_pretratained_merged(“模型”,Tokenizer,save_method =“ merged_16bit”)

结帐:微调大语言模型指南

结论

用于抹布任务的微调骆驼3.2 3b展示了较小模型在降低计算成本下提供高性能的效率。诸如Lora之类的技术在保持准确性的同时优化了资源使用。这种方法赋予了特定于领域的应用程序,使高级AI更容易访问,可扩展性和具有成本效益,并在检索效果的一代中推动了创新,并使AI民主化了现实世界中的挑战。

另请阅读:开始使用Meta Llama 3.2

常见问题

Q1。什么是抹布?

A. RAG将检索系统与生成模型相结合,以通过将其扎根于外部知识来增强回答,从而使其非常适合诸如问答答案和摘要之类的任务。

Q2。为什么选择Llama 3.2 3B进行微调?

A. Llama 3.2 3b提供了性能,效率和可扩展性的平衡,使其适合于抹布任务,同时减少计算和内存需求。

Q3。洛拉是什么,如何改善微调?

答:低秩适应(LORA)通过仅训练低级矩阵而不是所有模型参数来最大程度地减少资源使用情况,从而在约束硬件上有效地进行微调。

Q4。在本文中,哪些数据集用于微调?

答:拥抱面提供包含上下文,问题和答案的抹布数据集,以微调Llama 3.2 3B模型,以提供更好的任务性能。

Q5。可以将微调模型部署在边缘设备上吗?

答:是的,Llama 3.2 3b,尤其是以其量化形式的形式,已针对边缘和移动环境的内存有效部署进行了优化。

以上是微调美洲驼3.2 3b用于抹布 - 分析vidhya的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn