基于自己数据微调LLama3并本地化部署

img

首发网站https://tianfeng.space

准备数据

这是一条数据,格式如下:

{"instruction": "胡女士出现了黄疸、恶心、呕吐等症状,可能患了什么疾病?", "input": "", "output": "胡女士可能患有胆道张力低下综合征。建议尽快到内科进行检查,并进行西医和中医治疗。"}

可以基于自己数据处理为以下格式,也可以下载别人处理好的格式,数据集处理和数据集下载可以看看(github,huggingface),也可以使用ChatGPT生成。

之后在huggingface上传数据集如下

img

准备微调

https://github.com/unslothai/unsloth

这是一个开源免费的微调库,使用unsloth微调大模型,8G显存即可微调大模型,推理速度提升四倍,内存减少80%,在经过llama.cpp可以量化为4bit,不仅GPU,CPU也可本地推理。

img

在线微调

img

使用colab可以白嫖云端服务器进行微调本地大模型

我们来微调Llama3,点击第一个,colab使用教程

大体与官方教程一致,简单改了一下

https://colab.research.google.com/drive/1TqdSFm7qEv8Dh4c04LGV7z3vFjVLqxhR?usp=drive_link

根据新旧GPU安装依赖包

#1安装微调库
%%capture
import torch
major_version, minor_version = torch.cuda.get_device_capability()
# 由于Colab有torch 2.2.1,会破坏软件包,要单独安装
!pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
if major_version >= 8:# 新GPU,如Ampere、Hopper GPU(RTX 30xx、RTX 40xx、A100、H100、L40)。!pip install --no-deps packaging ninja einops flash-attn xformers trl peft accelerate bitsandbytes
else:# 较旧的GPU(V100、Tesla T4、RTX 20xx)!pip install --no-deps trl peft accelerate bitsandbytes!pip install xformers==0.0.25  #最新的0.0.26不兼容
pass

选择大模型基于微调(名字替换即可)

https://huggingface.co/unsloth

img

#2加载模型
from unsloth import FastLanguageModel
import torch
max_seq_length = 2048
dtype = None
load_in_4bit = True
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,
)

加载数据集

#4准备微调数据集
EOS_TOKEN = tokenizer.eos_token # 必须添加 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):# 必须添加EOS_TOKEN,否则无限生成text = alpaca_prompt.format(instruction, input, output) + EOS_TOKENtexts.append(text)return { "text" : texts, }
passfrom datasets import load_dataset
dataset = load_dataset("TianFeng668/Llama3-med-data", split = "train")
dataset = dataset.map(formatting_prompts_func, batched = True,)

设置训练参数(基于lora微调,r为秩,一般越高越好,取决显存大小,学习率看loss适当调整,训练步数60可以适当加大)

#5设置训练参数
from trl import SFTTrainer
from transformers import TrainingArguments
model = FastLanguageModel.get_peft_model(model,r = 16, #  建议 8, 16, 32, 64, 128target_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,
)trainer = SFTTrainer(model = model,tokenizer = tokenizer,train_dataset = dataset,dataset_text_field = "text",max_seq_length = max_seq_length,dataset_num_proc = 2,packing = False, # 可以让短序列的训练速度提高5倍。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",),
)

开始训练

#6开始训练
trainer_stats = trainer.train()

保存lora

#8保存LoRA模型
model.save_pretrained("lora_model") # Local saving
# model.push_to_hub("your_name/lora_model", token = "...") # 在线保存到hugging face,需要token

llama.cpp合并模型并量化成4位gguf保存,分三步:

Unsloth: [0] 安装 llama.cpp。 这将需要 3 分钟…

Unsloth:[1] 将 model 处的模型转换为 f16 GGUF 格式。输出位置将为 ./model-unsloth.F16.gguf
这将需要 3 分钟…

Unsloth:转换完成! 输出位置:./model-unsloth.F16.gguf

Unsloth:[2] 将 GGUF 16bit 转换为 q4_k_m。 这将需要 20 分钟…

#9合并模型并量化成4位gguf保存
model.save_pretrained_gguf("model", tokenizer, quantization_method = "q4_k_m")
#model.save_pretrained_merged("outputs", tokenizer, save_method = "merged_16bit",) #合并模型,保存为16位hf
#model.push_to_hub_gguf("hf/model", tokenizer, quantization_method = "q4_k_m", token = "") #合并4位gguf,上传到hugging face(需要账号token)

挂载谷歌云盘

#10挂载google drive
from google.colab import drive
drive.mount('/content/drive')

复制模型到google drive(Llama3是云盘创建的文件夹)

#11复制模型到google drive
import shutil
source_file = '/content/model-unsloth.Q4_K_M.gguf'
destination_dir = '/content/drive/MyDrive/Llama3'
destination_file = f'{destination_dir}/model-unsloth.Q4_K_M.gguf'
shutil.copy(source_file, destination_file)

本地可视化部署

详看上篇文章

open-webui+ollama本地部署Llama3

选一种就可以,最简单就下载GPT4all,把模型放入C:\Users\admin\AppData\Local\nomic.ai\GPT4All

本地Windows训练

Windows本地部署条件
1、Windows10/Windows11
2、英伟达卡8G显存、16G内存,安装CUDA12.1、cuDNN8.9,C盘剩余空间20GB、unsloth安装盘40GB
3、依赖软件:CUDA12.1+cuDNN8.9(或cuda11.8+8.9)、Python11.9、Git、Visual Studio 2022、llvm(可选)
4、HuggingFace账号,上传训练数据集
5、所需文件网盘:链接: https://pan.baidu.com/s/1AhpOX9MnEjpj88jzvIwUmA 提取码: vhea 
VisualStudioSetup(勾选c++桌面开发) git安装  重启

可以使用anaconda管理包和环境,安装https://tianfeng.space/399.html#23 (cuda安装,cudnn安装)

# 创建虚拟环境 激活虚拟环境
conda create --name unsloth_env python=3.11
conda activate unsloth_env
# 安装依赖包
pip install torch==2.2.2 --index-url https://download.pytorch.org/whl/cu121
pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
pip install --no-deps trl peft accelerate bitsandbytes
pip install xformers
# Windows下triton,deepspeed需要编译,网盘下载在unsloth目录下,切换到unsloth目录
pip install deepspeed-0.13.1+unknown-py3-none-any.whl
pip install triton-2.1.0-cp311-cp311-win_amd64.whl
# 测试安装是否成功(正常返回信息)
nvcc --version
python -m xformers.info
python -m bitsandbytes
# 运行脚本
test-unlora.py 测试微调之前推理
fine-tuning.py 用数据集微调
test-lora.py 测试微调之后推理
save-16bit.py 合并保存模型16位
save-gguf-4bit.py 4位量化gguf格式
# 若本地运行fine-tuning.py出错,出现gcc.exe无法编译,可以尝试下载llvm-windows-x64.zip解压,在系统环境变量path路径里添加llvm下的bin路径

量化

fine-tuning.py修改注释,之前是保存为16位hf格式,现在量化4位gguf

img

4位量化需要安装llama.cpp,步骤如下:
#1、克隆到本地(切换到unsloth目录)
git clone https://github.com/ggerganov/llama.cpp
#2、按官方文档编译
cd llama.cpp
mkdir build
cd build
cmake .. -DLLAMA_CUBLAS=ON
#3、设置Visual Studio 2022中cmake路径到系统环境变量path里
C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin
C:\Program Files\Microsoft Visual Studio\2022\Professional
#4、编译llama.cpp
cmake --build . --config Release
#5、如果上面这句编译命令无法执行,需要做以下操作:
复制这个路径下的C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\extras\visual_studio_integration\MSBuildExtensions
4个文件,粘贴到以下目录里
C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\MSBuild\Microsoft\VC\v170\BuildCustomizations
#6、编译好以后,把llama.cpp\build\bing\release目录下的所有文件复制到llama.cpp目录下
#7、重新运行fine-tuning.py微调保存

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

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

相关文章

【Android Studio】开启真机调试

1 打开手机的开发者模式 各种款式的手机进入开发者模式的情况不同,但大致是在 【关于手机】中多次点击系统版本即可进入。这里以小米8为例,记录下流程。 1.1 进入手机开发者模式 【设置】->【我的设备】->【全部参数】->【MIUI版本】连续点击3…

mysql数据库:read_me_recover_tn勒索恢复---惜分飞

最近有客户被MySQL删库勒索,现象如下:1. 删除掉以前的库,并创建一个同名库,并且会创建一个read_me_recover_tn库,类似下图: 2. 在read_me_recover_tn库中有一个readme表,每个被删除然后创建的库里面也有一个readme表 3. 每个readme表内容类似信息类似: mysql> desc read…

乡村振兴的文化旅游融合:整合乡村文化资源与旅游资源,发展文化旅游产业,提升美丽乡村的文化内涵和旅游吸引力

一、引言 随着城市化进程的加速和人们精神文化需求的日益增长,乡村旅游逐渐成为旅游市场的新热点。乡村振兴战略的提出,为乡村旅游的发展提供了新的契机。在这一背景下,如何整合乡村文化资源与旅游资源,发展文化旅游产业&#xf…

SpringBoot中使用RocketMQ实现事务消息来保证分布式事务的一致性(有代码)

前言 分布式事务是分布式系统中非常常见的问题。是非常必要钱常见的。实现的方式也是多种多样。今天这个视频主要来分享一下RocketMQ实现事务消息来保证分布式事务的一致性。不知道大家使用过这种方式没有。这种分布式事务的原理其实和本地消息表一样。 本地消息表实现分布式…

从零开始学习C语言,常用语法一文打尽

C语言常用语法 前言hello world数据类型变量变量的命名规范变量的分类变量的作用域和生命周期 常量字面常量const修饰的常变量#define定义的标识符常量枚举常量 字符串转义字符注释选择语句if循环语句while函数数组 前言 这篇博客旨在帮助零基础的朋友们入门,我会尽…

知名专业定制线缆知名智造品牌品牌推荐-精工电联:如何实现清扫机器人线缆产品的精益求精

在科技日新月异的今天,智能清扫机器人已经融入我们的日常生活。然而,其背后不可或缺的一部分,就是那些被称为机器人血管的精密线缆。精工电联作为高科技智能化产品及自动化设备专用连接线束和连接器配套服务商,致力于通过精益求精…

WINDOWS下zookeeper突然无法启动但是端口未占用的解决办法(用了WSL)

windows下用着用着时候突然zookeeper启动不了了。netstat查也没有找到端口占用,就是起不来。控制台报错 java.lang.reflect.UndeclaredThrowableException: nullat org.springframework.util.ReflectionUtils.rethrowRuntimeException(ReflectionUtils.java:147) ~…

如何使用phpMyAdmin删除数据库中的表?

本周有一个客户,购买Hostease的Linux虚拟主机,询问我们的在线客服,如何使用phpMyAdmin删除数据库中的表?我们为用户提供相关教程,用户很快解决了遇到的问题。在此,我们分享这个操作教程,希望可以…

细说温度测量—热电偶2

接上一篇《细说温度测量——热电偶1》 目录 1、硬件补偿 2、电压到温度转换 3、实用热电偶测量 (1)噪声抑制 (2)不良连接点连接 (3)标定降级 (4)并联阻抗 (5&am…

GUI-图形化的用户界面

一、概述 所谓GUI,即图形化的用户界面/接口(Graphical User Interface),实现了采用图形方式显示的计算机操作用户界面。比如下面的QQ登录界面: 为了不被落下,Java依旧稳定发挥,它也提供了一套…

WebRtc 视频通话,语音通话实现方案

先了解一下流程 和 流程图(chatGpt的回答) 实现 (底层代码实现, 可作为demo熟悉) 小demo <template><div><video ref"localVideo" autoplay muted></video> <!-- 本地视频元素&#xff0c;用于显示本地视频 --><video ref"r…

基于Springboot的线上教学平台

基于SpringbootVue的线上教学平台设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 学习资料 交流论坛 试卷列表 公告信息 后台登录 后台首页 学员管理 资料类型…

实习报告怎么写?笔灵AI实习体验报告模版分享:AI产品前端实习生

实习报告怎么写&#xff1f;笔灵AI实习体验报告模版可以帮你 点击即可使用&#xff1a;https://ibiling.cn/scene/inex?fromcsdnsx 下面分享AI产品前端实习生的实习报告 尊敬的导师和领导们&#xff1a;首先&#xff0c;我想对你们表达我的诚挚感谢&#xff0c;感谢你们给我…

FPGA OSD 方案,应用于XBOX游戏机收费等领域

FPGA方案&#xff0c;HDMI IN接收原始HDMI 信号&#xff0c;HDMI OUT输出叠加字符/图片后的HDMI信号 客户应用&#xff1a;XBOX游戏机收费 主要特性&#xff1a; 1.支持多分辨率格式显示 2.支持OSD 叠加多个图层 3.支持字体大小随意配置 4.支持字体格式随意配置 5.零延时&…

多线程典型例子(4)——线程池

文章目录 一、线程池的基本情况1.1、使用线程池的必要性1.2、线程池为什么比直接在系统中创建线程更高效&#xff1f;1.2.1、纯内核态操作1.2.2、纯用户态操作 1.3、那为什么用户态操作比内核态操作更高效&#xff1f;二、如何在Java中使用线程池2.1、ExecutorService2.1、Thre…

OBS插件--自定义着色器

自定义着色器 自定义着色器是一个滤镜插件&#xff0c;可以用于源和场景。插件自带一百多款滤镜效果&#xff0c;支持自己编写效果代码。 下面截图演示下操作步骤&#xff1a; 首先&#xff0c;打开 OBS直播助手 在插件中心左侧导航栏&#xff0c;选择 滤镜 项&#xff0c;然…

【Linux】深浅睡眠状态超详解!!!

1.浅度睡眠状态【S】&#xff08;挂起&#xff09; ——S (sleeping)可中断睡眠状态 进程因等待某个条件&#xff08;如 I/O 完成、互斥锁释放或某个事件发生&#xff09;而无法继续执行。在这种情况下&#xff0c;进程会进入阻塞状态&#xff0c;在阻塞状态下&#xff0c;进程…

C++从入门到入土(二)——初步认识类与对象

目录 前言 类与对象的引入 类的定义 类的访问限定符及封装 访问限定符&#xff1a; 封装&#xff1a; 类的作用域 类的实例化 类的大小 this指针 this指针的特性 前言 各位佬们&#xff0c;在开始本篇文章的内容之前&#xff0c;我想先向大家道个歉&#xff0c;由于…

linux中进程相关概念(一)

什么是程序&#xff0c;什么是进程&#xff0c;有什么区别&#xff1f; 程序是静态的概念&#xff0c;当我们使用gcc xxx.c -o pro进行编译时&#xff0c;产生的pro文件&#xff0c;就是一个程序。 进程是程序的一次运行活动&#xff0c;通俗点就是说程序跑起来了就是进程。 …

利用智能私信软件,快速拓展潜在客户群体

在数字化营销的浪潮中&#xff0c;企业如何快速而有效地触及并吸引潜在客户&#xff0c;已成为一个不可忽视的挑战。随着人工智能技术的不断进步&#xff0c;智能私信软件作为一种新型工具&#xff0c;正逐渐改变着企业的市场拓展方式。本文将探讨如何通过这类软件&#xff0c;…