Unsloth + colab 微调llama3

Unsloth + colab 微调llama3

并且使用ollama调用微调好的量化模型

因为llama3推出,大模型市场引来新的强力性能成员,并且带来的也是安全和自由定制,为了适应我们自己的场景,我们可以微调训练它来适应我们的特定任务和问题。比如llama3不支持中文,我们可以微调它支持中文。

1.访问Unsloth

地址: https://github.com/unslothai/unsloth

进入unsloth仓库,找到llama3并点击start on colab选项.

[注意] 最好是跟着下面的流程自己单独保存一份笔记
在这里插入图片描述

我们便进入了谷歌的colab界面.

[注意] google colab是一个免费的云服务并支持gpu,对于我们学习和调试很方便
在这里插入图片描述

下面的代码我们都在colab里面执行。

2. 添加谷歌云硬盘的授权

方便我们保存,需要连接Google Drive,以便将训练好的模型保存到云端。

from google.colab import drive
drive.mount('/content/drive')

连接T4 GPU
在这里插入图片描述

在这里插入图片描述

3.安装unsloth

%%capture
import torch!pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
!pip install --no-deps "xformers<0.0.26" trl peft accelerate bitsandbytes

4.下载预训练模型

下载要微调的模型,支持16位LoRA或4位QLoRA。
max_seq_length可以设置为任何值,因为我们通过kaiokendev的方法自动进行RoPE缩放。

通过PR 26037,支持下载4位模型快4倍!

在unsloth仓库有Llama、Mistral 等4位模型。

from unsloth import FastLanguageModel
import torch
max_seq_length = 2048
dtype = None 
load_in_4bit = Truefourbit_models = ["unsloth/mistral-7b-bnb-4bit","unsloth/mistral-7b-instruct-v0.2-bnb-4bit","unsloth/llama-2-7b-bnb-4bit","unsloth/gemma-7b-bnb-4bit","unsloth/gemma-7b-it-bnb-4bit", "unsloth/gemma-2b-bnb-4bit","unsloth/gemma-2b-it-bnb-4bit","unsloth/llama-3-8b-bnb-4bit",
] model, tokenizer = FastLanguageModel.from_pretrained(model_name = "unsloth/llama-3-8b-bnb-4bit",max_seq_length = max_seq_length,dtype = dtype,load_in_4bit = load_in_4bit,# token = "hf_...", 
)

5.设置LoRA训练参数

我们现在添加LoRA适配器,所以我们只需要更新所有参数的1%到10% !

model = FastLanguageModel.get_peft_model(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 = "none",   use_gradient_checkpointing = "unsloth",random_state = 3407,use_rslora = False,loftq_config = None,
)

6.数据准备

我们现在使用来自yahma的Alpaca数据集,也可以用我们自己的数据准备替换此代码部分。

alpaca_prompt = """Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.### Instruction:
{}### Input:
{}### Response:
{}"""EOS_TOKEN = tokenizer.eos_token
def formatting_prompts_func(examples):instructions = examples["instruction"]inputs       = examples["input"]outputs      = examples["output"]texts = []for instruction, input, output in zip(instructions, inputs, outputs):text = alpaca_prompt.format(instruction, input, output) + EOS_TOKENtexts.append(text)return { "text" : texts, }
passfrom datasets import load_dataset
dataset = load_dataset("yahma/alpaca-cleaned", split = "train")
dataset = dataset.map(formatting_prompts_func, batched = True,)

如果你想加载自己的数据集,使用下列代码


### json格式,path="json"
### csv格式, path="csv"
### 纯文本格式, path="text"
### dataframe格式, path="panda"
### 图片,path="imagefolder"from datasets import load_dataset
dataset = load_dataset('csv', data_files='my_file.csv')dataset = load_dataset('json', data_files='my_file.json')dataset = load_dataset(path="imagefolder", data_dir="D:\Desktop\workspace\code\loaddataset\data\images")dataset = load_dataset('text', data_files={'train': ['my_text_1.txt', 'my_text_2.txt'], 'test': 'my_test_file.txt'})

7.训练模型

现在使用Huggingface TRL的SFTTrainer,我们执行 max_steps = 60 来加快速度,但您可以设置num_train_epochs=1进行完整运行,并关闭max_steps=None。当然还支持TRL的DPOTrainer!更多文档请查看:TRL SFT文档!

from trl import SFTTrainer
from transformers import TrainingArgumentstrainer = SFTTrainer(model = model,tokenizer = tokenizer,train_dataset = dataset,dataset_text_field = "text",max_seq_length = max_seq_length,dataset_num_proc = 2,packing = False, args = TrainingArguments(per_device_train_batch_size = 2,gradient_accumulation_steps = 4,warmup_steps = 5,max_steps = 60,learning_rate = 2e-4,fp16 = not torch.cuda.is_bf16_supported(),bf16 = torch.cuda.is_bf16_supported(),logging_steps = 1,optim = "adamw_8bit",weight_decay = 0.01,lr_scheduler_type = "linear",seed = 3407,output_dir = "outputs",),
)

显示当前内存状态

gpu_stats = torch.cuda.get_device_properties(0)
start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)
max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)
print(f"GPU = {gpu_stats.name}. 最大内存 = {max_memory} GB.")
print(f"{start_gpu_memory} GB of 内存剩余。")

开始训练

trainer_stats = trainer.train()

8.测试模型效果

开始运行模型!更改指令(instruction)和输入(input),将输出(output)留空。

FastLanguageModel.for_inference(model) 
inputs = tokenizer(
[alpaca_prompt.format("Continue the fibonnaci sequence.","1, 1, 2, 3, 5, 8","", )
], return_tensors = "pt").to("cuda")outputs = model.generate(**inputs, max_new_tokens = 64, use_cache = True)
tokenizer.batch_decode(outputs)

还可以使用TextStreamer进行流式推断 ,这样就可以逐个标记地查看生成过程,而不必等待答案全部生成完成!

# alpaca_prompt = 从上面复制
FastLanguageModel.for_inference(model)
inputs = tokenizer(
[alpaca_prompt.format("Continue the fibonnaci sequence.", "1, 1, 2, 3, 5, 8", "", )
], return_tensors = "pt").to("cuda")from transformers import TextStreamer
text_streamer = TextStreamer(tokenizer)
_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128)

9.保存、加载新模型

要将最终模型保存为 LoRA 适配器,使用 save_pretrained 进行本地保存。
[注意] 这仅保存 LoRA 适配器,而不是完整模型。要保存为16位或GGUF。

import os
current_path = os.getcwd()
model.save_pretrained("lora_model") 
print(f"保存地址 {current_path}/lora_model")

测试LoRA模型:如果您想加载我们刚刚保存的 LoRA 适配器用于推断,请将 False 设置为 True:

if True:from unsloth import FastLanguageModelmodel, tokenizer = FastLanguageModel.from_pretrained(model_name = "lora_model",max_seq_length = max_seq_length,dtype = dtype,load_in_4bit = load_in_4bit,)FastLanguageModel.for_inference(model) # Enable native 2x faster inference# alpaca_prompt = You MUST copy from above!inputs = tokenizer(
[alpaca_prompt.format("What is a famous tall tower in Paris?", "", "",)
], return_tensors = "pt").to("cuda")outputs = model.generate(**inputs, max_new_tokens = 64, use_cache = True)
tokenizer.batch_decode(outputs)

GGUF/llama.cpp转换,现在我们原生支持保存为GGUF/llama.cpp!我们克隆llama.cpp,并默认保存为q8_0。我们允许所有方法,如q4_k_m。使用save_pretrained_gguf进行本地保存,使用push_to_hub_gguf上传至HF。
还有一些支持的量化方法(完整列表请查看unslothai的Wiki页面):

if True: model.save_pretrained_gguf("model", tokenizer, quantization_method = "q4_k_m")if False: model.save_pretrained_gguf("model", tokenizer, quantization_method = "f16")

F16模型量化成Q8,减少模型体积(如果是Q4可以不用)

![ -d "llama.cpp" ] || git clone https://github.com/ggerganov/llama.cpp.git
!cd llama.cpp && make
#!./quantize /content/model-unsloth.F16.gguf /content/model-unsloth.q8_0.gguf q8_0

将刚刚生成的模型移动到谷歌云


import shutilsource_path = '/content/model-unsloth.Q4_K_M.gguf'
destination_path = '/content/drive/MyDrive/'shutil.move(source_path, destination_path)

然后我们微调后的模型到此就完全保存到我们的谷歌云盘了,然后到谷歌云MyDrive中下载。

10.ollama调用微调之后的gguf格式模型

导入方式:导入方式页面

创建modelfile文件到ollama下面的models目录,并且写入下面内容:

FROM ./model.uslouth.Q8_0.gguf

用下面命令创建model:

ollama create example -f Modelfile

查看model:

ollama list

运行model:

ollama run example "What is your favourite condiment?"

11:总结

unsloth 对于我们微调模型是最便利的工具,我们平常使用当中,特别是前期,尽量使用成熟且方便快捷的工具,可以极大节省我们训练微调对显存的使用。

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

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

相关文章

Spring MVC(建立连接 + 请求)

文章目录 一、建立客户端和服务器的连接二、如何构造请求&#xff08;传参&#xff09;2.1 构造请求方式 参数通用注解2.2 传递单个参数2.3 传递多个参数2.4 传递数组/集合2.5 传递对象2.6 传递JSON 三、相关的其他请求操作3.1 获取URL中的参数 PathVariable3.2 上传文件 Requ…

二.基础篇: 面向对象进阶

1. 基础篇语法篇&#xff1a;一.基础篇&#xff1a;基础语法-CSDN博客 面向对象进阶 本章主要学习内容&#xff1a; static继承包&#xff0c;final&#xff0c;权限修饰符&#xff0c;代码块抽象类接口多态内部类 1. static static翻译过来就是静态的意思static表示静态&am…

智慧公厕:数据驱动的公共厕所智慧化管理

公共厕所作为城市基础设施的重要组成部分&#xff0c;对于城市居民的生活质量和城市形象有着不可忽视的影响。然而&#xff0c;传统的公共厕所管理模式存在诸多问题&#xff0c;如设施老化、卫生状况不佳等&#xff0c;严重限制了公众对于公共厕所的使用体验。随着大数据和智能…

前端AJAX与后台交互技术知识点及案例(续2)

以下笔记均为学习哔站黑马程序员AJAX视频所得&#xff01;&#xff01;&#xff01; AJAX作用&#xff1a;浏览器和服务器之间通信&#xff0c;动态数据交互 axios函数 先引入axios库&#xff0c;可在bootcdn中寻找相关js文件或者对应的script标签 axios({url:http://hmajax…

厉害了!12秒将百万数据通过EasyExcel导入MySQL数据库中

一、写在开头 我们在上一篇文章中提到了通过EasyExcel处理Mysql百万数据的导入功能&#xff08;一键看原文&#xff09;&#xff0c;当时我们经过测试数据的反复测验&#xff0c;100万条放在excel中的数据&#xff0c;4个字段的情况下&#xff0c;导入数据库&#xff0c;平均耗…

树莓派点亮FPGA小灯

树莓派点亮FPGA小灯 引言&#xff1a; ​ 本次实验的目的是通过树莓派和FPGA之间的串口通信&#xff0c;控制FPGA开发板上的小灯。实验将展示如何使用树莓派发送特定的字符信号&#xff0c;通过串口传输至FPGA&#xff0c;并在FPGA上实现逻辑解析&#xff0c;以点亮指定的小灯。…

[240512] x-cmd 发布 v0.3.6: (se,wkp,ddgo...)x( kimi,gemini,gpt...)

目录 x-cmd 发布 v0.3.6新增了 jina 模块新增了 ddgo 模块新增了 se 模块wkp 模块新增了 writer 模块cosmo 模块 x-cmd 发布 v0.3.6 本次版本的最新引入的功能都是目的为了进一步探索 LLM 的使用。 本版本的改进分为两类&#xff1a;资讯类模块&#xff08;Wikipedia&#xf…

李廉洋:5.12黄金原油下周一行情分析,必看策略。

黄金消息面分析&#xff1a;美国4月份潜在通胀可能出现6个月来的首次放缓&#xff0c;在一系列意外上涨之后&#xff0c;物价压力有望再次开始缓解。核心CPI预计环比上涨0.3%&#xff0c;此前三个月的涨幅均为0.4%&#xff0c;同比预计将上涨3.6%&#xff0c;尽管这一增幅将是三…

rust开发web服务器框架,github排名对比

Rocket Star最多的框架 github仓库地址&#xff1a;GitHub - rwf2/Rocket: A web framework for Rust. Rocket 是一个针对 Rust 的异步 Web 框架&#xff0c;重点关注可用性、安全性、可扩展性和速度。 Axum 异步运行时 githuh仓库地址&#xff1a;GitHub - tokio-rs/axum: …

能源效率:未来可持续发展的全球当务之急

当前全球正面临着严重的能源与气候危机&#xff0c;能源消耗不断增长导致环境污染、气候变化等问题日益严重。在这一背景下&#xff0c;提高能源效率成为了当务之急。今天&#xff0c;我们来简要探讨一下能源效率在全球可持续发展中的重要性&#xff0c;重点关注建筑物能源效率…

C语言——文件相关操作补充

一、文件读取结束的判定 当我们使用例如fgetc、fgets、fscanf、fread等函数来读取文件内容时&#xff0c;我们可能遇到需要判断文件读取的结束&#xff0c;一般情况下都是通过这些函数的返回值来判断文件读取是否结束。 1、fgetc 返回读取的字符的ASCII值&#xff0c;如果读…

微信授权登录02-移动端

目录 ## 前言 1.准备工作 1.1 网站域名 1.2 微信公众号 2.授权登录开发 2.1 前端开发 2.1.1 调起微信授权页面 ## 调起微信授权页面效果图 2.1.2 用户允许授权后回调处理 2.2 后端开发 2.2.1 根据code查询用户信息 2.2.2 自动注册登录 ## 后记 ## 前言 上一篇写…