autodl 上 使用 LLaMA-Factory 微调 中文版 llama3

autodl 上 使用 LLaMA-Factory 微调 中文版 llama3

    • 环境准备
    • 创建虚拟环境
    • 下载微调工具 LLaMA-Factory
    • 下载 llama3-8B
    • 开始微调
    • 测试微调结果
    • 模型合并后导出
    • vllm 加速推理

 


环境准备

autodl 服务器:

https://www.autodl.com/console/homepage/personal


基本上充 5 块钱就可以搞完。

强烈建议选 4090(24G),不然微调的显存不够。

我们用 LoRA 微调,至少得 20G(8B模型)。
 

微调工具:

  • https://github.com/hiyouga/LLaMA-Factory.git

模型:

  • https://www.modelscope.cn/LLM-Research/Meta-Llama-3-8B-Instruct.git

 


创建虚拟环境

conda activate yiyiai

上传中文微调 dpo_zh.json 数据:

  • https://www.123pan.com/s/cD4cjv-kvgVh.html
  • 提取码: NpsA

在这里插入图片描述

下载微调工具 LLaMA-Factory

git clone https://github.com/hiyouga/LLaMA-Factory.gitcd LLaMA-Factory pip install -e .[metrics]  # 下载全部依赖

下载 llama3-8B

# pip install modelscope
import torch
from modelscope import snapshot_download, AutoModel, AutoTokenizer
import osmodel_dir = snapshot_download('LLM-Research/Meta-Llama-3-8B-Instruct', cache_dir='/root/autodl-tmp', revision='master')

在这里插入图片描述
模型路径:/root/autodl-tmp/LLM-Research/Meta-Llama-3-8B-Instruct

 

LLaMA-Factory/data 文件夹下找到 dataset_info.json

方法一:设置镜像站

这个数据,ta会去hf官方找,我们可以设置镜像站。

export HF_ENDPOINT=https://hf-mirror.com/

方法二:改成本地文件路径


俩个地方都要改:file_name、本地数据集路径。

更新 transformers 库:

pip install --upgrade transformers

开始微调

CUDA_VISIBLE_DEVICES=0 llamafactory-cli train \--stage orpo \--do_train True \--model_name_or_path /root/autodl-tmp/LLM-Research/Meta-Llama-3-8B-Instruct \--finetuning_type lora \--template default \--flash_attn auto \--dataset_dir LLaMA-Factory/data\--dataset dpo_mix_zh \--cutoff_len 1024 \--learning_rate 1e-05 \--num_train_epochs 5.0 \--max_samples 1 \--per_device_train_batch_size 1 \--gradient_accumulation_steps 8 \--lr_scheduler_type cosine \--max_grad_norm 1.0 \--logging_steps 5 \--save_steps 100 \--warmup_steps 0 \--optim adamw_torch \--report_to none \--output_dir saves/LLaMA3-8B/lora/train_2024-04-25-07-48-56 \--fp16 True \--lora_rank 8 \--lora_alpha 16 \--lora_dropout 0 \--lora_target q_proj,v_proj \--orpo_beta 0.1 \--plot_loss True 


微调后,就找这个路径看一下。

微调上面的参数是自定义的:

  • max_samples 1 只使用一个数据微调,一般越多越好,这步为演示,就1条了
stage	        当前训练的阶段,枚举值,有“sft”,"pt","rw","ppo"等,代表了训练的不同阶段,这里我们是有监督指令微调,所以是sft
do_train	    是否是训练模式
dataset	        使用的数据集列表,所有字段都需要按上文在data_info.json里注册,多个数据集用","分隔
dataset_dir	    数据集所在目录,这里是 data,也就是项目自带的data目录
finetuning_type	微调训练的类型,枚举值,有"lora","full","freeze"等,这里使用lora
lora_target	    如果finetuning_type是lora,那训练的参数目标的定义,这个不同模型不同,请到https://github.com/hiyouga/LLaMA-Factory/tree/main?tab=readme-ov-file#supported-models 获取 不同模型的 可支持module, 比如llama3 默认是 q_proj,v_proj
output_dir	    训练结果保存的位置
cutoff_len	    训练数据集的长度截断
per_device_train_batch_size	    每个设备上的batch size,最小是1,如果GPU 显存够大,可以适当增加
fp16	        使用半精度混合精度训练
max_samples	    每个数据集采样多少数据
val_size	    随机从数据集中抽取多少比例的数据作为验证集

测试微调结果

微调后,还可以马上测试微调结果。

  • 调不好!重新调整参数和数据。
  • 调得好!马上合并权重。

训练完后就可以在设置的output_dir下看到:

  • adapter开头的就是 LoRA 保存的结果了,后续用于模型推理融合

  • training_loss 和trainer_log等记录了训练的过程指标

  • 其他是训练当时各种参数的备份

模型合并后导出

如果想把训练的LoRA和原始的大模型进行融合,输出一个完整的模型文件的话:

CUDA_VISIBLE_DEVICES=0 llamafactory-cli export \--model_name_or_path /root/autodl-tmp/LLM-Research/Meta-Llama-3-8B-Instruct \--adapter_name_or_path ./saves/LLaMA3-8B/lora/sft  \--template llama3 \--finetuning_type lora \--export_dir megred-model-path \--export_size 2 \--export_device cpu \--export_legacy_format False

vllm 加速推理

需要提前将LoRA 模型进行merge,使用merge后的完整版模型目录:

CUDA_VISIBLE_DEVICES=0 API_PORT=8000 llamafactory-cli api \--model_name_or_path megred-model-path \--template llama3 \--infer_backend vllm \--vllm_enforce_eager

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

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

相关文章

美团二面:SpringBoot读取配置优先级顺序是什么?

引言 Spring Boot作为一种轻量级的Java应用程序框架,以其开箱即用、快速搭建新项目的特性赢得了广大开发者的青睐。其核心理念之一就是简化配置过程,使开发者能够快速响应复杂多变的生产环境需求。为了实现这一点,Spring Boot支持丰富的外部…

接口加密解决方案:Python的各种加密实现

01 前言 在现代软件开发中,接口测试已经成为了不可或缺的一部分。随着互联网的普及,越来越多的应用程序都采用了接口作为数据传输的方式。接口测试的目的是确保接口的正确性、稳定性和安全性,从而保障系统的正常运行。 在接口测试中&#…

Spring Security初探

url说明方法/login/oauth/authorize无登录态时跳转到/authentication/require,有登录态时跳转到/loginorg.springframework.security.oauth2.provider.endpoint.AuthorizationEndpoint#authorize/authentication/require自己写的用于重定向到登录页面的urlcn.merryy…

市场公关人的日常工作是什么?

作为一个从事多年的市场公关人,每到别人放假的时候就是我们最忙的时候,手上几个KOL项目安排探店,同时还要筹备品牌VIP活动。扎堆的事情每天忙得睁眼就是工作。 基本上来说,公关人是挺苦逼的,并没有大家看上去那么光鲜…

Julia编程语言基本语法

1、Julia读取/保存csv数据 读取: using CSV df CSV.read("mydata.csv")保存为csv格式: # 创建 DataFrame df DataFrame(height h, discharge q) # 将 DataFrame 写入 CSV 文件 CSV.write("output.csv", df)报错:Un…

Ruby中的字符串转换方法

在Ruby中,你可以使用各种方法来转换字符串。下面是一些常用的方法,当然选择哪种适用的方法还得更具具体项目来做调整。日常使用中下面的错误也是比较常见的,看看我们怎么处理哈。 1、问题背景 在Python中,内置的数据结构都有一个…

成功解决:Could not install packages due to an OSError

成功解决:Could not install packages due to an OSError: 错误: ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory: C:\Users\XIAODA~1\AppData\Local\Temp\pip-install-yeyhod79\opencv-contribpython_fb…

C++:位图和布隆过滤器

一,位图 1.1 位图的概念 究竟什么是位图呢??我们用一道问题来引入 问题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在 这40亿个数中。【腾讯】 根据这个问题&#x…

通俗易懂讲解 nginx-rtmp-module 是干嘛的?

文章目录 概述安装 nginx 和 nginx-rtmp-module配置 Nginx启动 Nginx使用示例推流拉流转码鉴权与安全自动录制 概述 nginx-rtmp-module 是一个用于 Nginx 的第三方模块,它扩展了 Nginx 服务器的功能,使其能够处理实时流媒体数据,特别是支持 …

【LeetCode】环形链表I 环形链表II

一、环形链表I 题目 思路 该题使用快慢指针 slow、 fast slow 走一步 ,fast 走两步 当fast 走到空 或者 fast的下一个结点为空, 则无环 fast若追上slow , 则有环 结论证明 该思路默认了 : 若存在环形链表 , 无论…

代码随想录算法训练营第二十一天:树树树

代码随想录算法训练营第二十一天:树树树 ‍ 513.找树左下角的值 力扣题目链接​**(打开新窗口)** 给定一个二叉树,在树的最后一行找到最左边的值。 示例 1: ​​ 示例 2: ​​ #算法公开课 《代码随想录》算法视频公开课…

领域驱动设计架构演进

领域驱动设计由于其强调对领域的深入理解和关注业务价值,其架构演进依赖于领域的变化和特定领域中的技术实践。 初始阶段 一个单体架构,所有的功能都集成在一个应用程序中,领域模型可能还不完全清晰,甚至并未形成。这个阶段主要是为了验证产品的可行性,快速迭代并尽快推…

OpenCV单窗口并排显示多张图片

OpenCV单窗口并排显示多张图片 效果代码 PS:本例的代码适合图片的宽度和高度都相同。 效果 原始三张图片: 合并显示: 代码 import cv2 import numpy as npdef opencv_multi_img():# 读取图片img1 cv2.imread(saw_1.jpeg)img2 cv2.im…

【爬虫】爬取A股数据写入数据库(二)

前几天有写过一篇 【爬虫】爬取A股数据写入数据库(一),现在继续完善下,将已有数据通过ORM形式批量写入数据库。 2024/05,本文主要内容如下: 对东方财富官网进行分析,并作数据爬取,使…

【高阶数据结构(二)】初识图论

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:高阶数据结构专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多Go语言知识   🔝🔝 高阶数据结构 1. 前言2. 图的基…

LED显示屏控制器5个问题和解答

在LED电子显示屏的使用和维护过程中,用户经常会遇到各种技术问题。以下是五个关于LED电子显示屏控制器的常见问题及其解答,由专业LED显示屏生产厂家提供,旨在帮助用户更好地理解和使用LED显示屏。 1. 嵌入式实时脱机二合一控制器的工作原理 嵌…

SpringCloud Alibaba Sentinel 修改Dashboard用户名和密码

目录 一、下载Sentinel的Jar包 二、在启动时修改用户名和密码的命令 三、测试登录成功 在网上找到了一大堆文章,没一个有用的,最终还是通过不断测试找到了这个方法。 一、下载Sentinel的Jar包 Releases alibaba/Sentinel GitHub 二、在启动时修改…

并发问题系统学习(更新中)

进程、线程 进程:进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。可以理解为一个java应用。 线程:线程是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。…

C++笔试强训day15

目录 1.平方数 2.分组 Check函数的具体实现&#xff1a; 3.拓扑排序 1.平方数 链接 数学找规律&#xff0c;找离 x 最近的完全平方数 y。 先开平方根再利用四舍五入进位即可。 详细代码&#xff1a; #include <cmath> #include <iostream> using namespac…

【吊打面试官系列】Java高并发篇 - 你对线程优先级的理解是什么?

大家好&#xff0c;我是锋哥。今天分享关于 【你对线程优先级的理解是什么&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 你对线程优先级的理解是什么&#xff1f; 每一个线程都是有优先级的&#xff0c;一般来说&#xff0c;高优先级的线程在运行时会具有优先…