基于 llama-factory进行模型微调

# GLM4-9B-chat Lora 微调.



 

介绍如何基于 llama-factory 框架,对 glm-4-9b-chat 模型进行 Lora 微调。Lora 是一种高效微调方法,深入了解其原理可参见博客:[知乎|深入浅出 Lora](https://zhuanlan.zhihu.com/p/650197598)。

## 环境配置



 

在完成基本环境配置和本地模型部署的情况下,你还需要安装一些第三方库,可以使用以下命令:

```

python -m pip install --upgrade pip

# 更换 pypi 源加速库的安装

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 安装 LLaMA-Factory

git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git

cd LLaMA-Factory

pip install -e ".[torch,metrics]"

#上面这步操作会完成torch、transformers、datasets等相关依赖包的安装

```



 

## 二、模型下载



 

使用 `modelscope` 中的`snapshot_download`函数下载模型,第一个参数为模型名称,参数`cache_dir`为模型的下载路径。

在 `/root/autodl-tmp` 路径下新建 `download.py` 文件并在其中输入以下内容,粘贴代码后记得保存文件,如下图所示。并运行 `python /root/autodl-tmp/download.py`执行下载,模型大小为 14 GB,下载模型大概需要 10~20 分钟

```

import torch

from modelscope import snapshot_download, AutoModel, AutoTokenizer

import os

model_dir = snapshot_download('ZhipuAI/glm-4-9b-chat', cache_dir='/root/autodl-tmp', revision='master')

```



 

## 三、指令集构建 —— Alpaca 格式



 

LLaMA-Factory 支持 alpaca 格式和 sharegpt 格式的数据集,本次微调我们使用 alpaca 格式

### 指令监督微调数据格式说明



 

在指令监督微调时,`instruction` 列对应的内容会与 `input` 列对应的内容拼接后作为人类指令,即人类指令为 `instruction\ninput`。而 `output` 列对应的内容为模型回答。

如果指定,`system` 列对应的内容将被作为系统提示词。

`history` 列是由多个字符串二元组构成的列表,分别代表历史消息中每轮对话的指令和回答。注意在指令监督微调时,历史消息中的回答内容**也会被用于模型学习**。

```

[

{

"instruction": "人类指令(必填)",

"input": "人类输入(选填)",

"output": "模型回答(必填)",

"system": "系统提示词(选填)",

"history": [

["第一轮指令(选填)", "第一轮回答(选填)"],

["第二轮指令(选填)", "第二轮回答(选填)"]

]

}

]

```



 

### 单轮对话数据的格式转换



 

使用以下程序将[数据集](https://github.com/SmartFlowAI/EmoLLM/blob/main/datasets)转换成 alpaca 格式

```

import json

import re

# 选择要格式转换的数据集

file_name = "single_turn_dataset_1.json"

#file_name = "single_turn_dataset_2.json"

system_prompt = "如果要添加系统提示词,请放在这里"

with open(f'../{file_name}', 'rt', encoding='utf-8') as file:

data = json.load(file)

converted_data = [{"instruction": item["prompt"],

"input": "",

"output": item["completion"],

"system": system_prompt

} for item in data]

for i in range(len(converted_data)):

# 数据清洗-去掉特殊符号

if "🐳" in converted_data[i]["output"]:

converted_data[i]["output"] = converted_data[i]["output"].replace("🐳", "")

# 数据清洗-去掉“你好,我是红烧肉”,会影响大模型的自我认知

if '好,我是' in converted_data[i]["output"]:

converted_data[i]["output"] = converted_data[i]["output"].strip()

intro_pattern = r"^[^\n]+\n"

converted_data[i]["output"] = re.sub(intro_pattern, "", converted_data[i]["output"]).strip()

with open(f'./processed/{file_name}', 'w', encoding='utf-8') as f:

json.dump(converted_data, f, ensure_ascii=False, indent=4)

print(f'./processed/{file_name} Done')

```



 

### 多轮对话数据的格式转换



 

使用以下程序将[数据集](https://github.com/SmartFlowAI/EmoLLM/blob/main/datasets)转换成 alpaca 格式

```

from tqdm import tqdm

import json

# 选择要格式转换的数据集

file_name = "data.json"

#file_name = "data_pro.json"

#file_name = "multi_turn_dataset_1.json"

#file_name = "multi_turn_dataset_2.json"

#file_name = "aiwei.json"

system_prompt = "如果要添加系统提示词,请放在这里"

with open(f'../{file_name}', 'rt', encoding='utf-8') as file:

data = json.load(file)

# 遍历原始数据,进行格式转换

# 转换后的数据格式

converted_data = []

for item in tqdm(data):

conversation = item['conversation']

history = [(c['input'], c['output']) for c in conversation[:-1]]

last_item = conversation[-1]

converted_data.append({

"instruction": last_item['input'],

"input": "",

"output": last_item['output'],

"system": system_prompt,

"history": history

})

# 将转换后的数据转换为JSON格式

converted_json = json.dumps(converted_data, ensure_ascii=False, indent=4)

with open(f'./processed/{file_name}', 'w', encoding='utf-8') as f:

json.dump(converted_data, f, ensure_ascii=False, indent=4)

```



 

### 角色扮演数据的格式转换



 

代码同上,根据原数据集是单轮对话还是多轮对话来选择。注意设置各个角色的“system_prompt”。

### 数据集合并



 

为了方便处理(不想在LLaMA-Factory中添加太多的数据集),这里将所有已经处理好的 alpaca 格式的数据集(每一个数据集文件都是一个json字符串)合并成一个文件(一个大的json字符串),合并代码如下:

```

import json

# 初始化一个空列表来存储所有数据

merged_data = []

file_list = [

"single_turn_dataset_1.json",

"single_turn_dataset_2.json",

"self_cognition_EmoLLM.json",

"ruozhiba_raw.json",

"data.json",

"data_pro.json",

"multi_turn_dataset_1.json",

"multi_turn_dataset_2.json",

"aiwei.json",

"tiangou.json",

"SoulStar_data.json",

"mother_v2.json",

"scientist.json"

]

# 遍历所有文件并读取数据

for filename in file_list:

with open(f"./processed/{filename}", 'r', encoding='utf-8') as file:

data = json.load(file)

merged_data.extend(data)

# 将合并后的数据写入新的 JSON 文件

with open('emo_glm4_merged_data.json', 'w', encoding='utf-8') as output_file:

json.dump(merged_data, output_file, ensure_ascii=False, indent=4)

print("合并完成,已保存到 emo_glm4_merged_data.json 文件中。")

```



 

### 将数据集配置到LLaMA-Factory 中



 

修改 LLaMa-Factory 目录中的 data/dataset_info.json 文件,在其中添加:

```

"emo_merged": {

"file_name": "emo_glm4_merged_data.json文件的绝对路径",

}

```



 

## 四、微调模型



 

在 LLaMA-Factory 目录中新建配置文件 emo_glm4_lora_sft.yaml :

```

### model

model_name_or_path: glm-4-9b-chat模型地址的绝对路径

### method

stage: sft

do_train: true

finetuning_type: lora

lora_target: all

### dataset

# dataset 要和 data/dataset_info.json 中添加的信息保持一致

dataset: emo_merged

template: glm4

cutoff_len: 2048

max_samples: 1000

overwrite_cache: true

preprocessing_num_workers: 16

### output

# output_dir是模型训练过程中的checkpoint,训练日志等的保存目录

output_dir: saves/emo-glm4-epoch10/lora/sft

logging_steps: 10

#save_steps: 500

plot_loss: true

overwrite_output_dir: true

save_strategy: epoch

### train

per_device_train_batch_size: 1

gradient_accumulation_steps: 8

learning_rate: 1.0e-4

num_train_epochs: 10.0

lr_scheduler_type: cosine

warmup_ratio: 0.1

fp16: true

### eval

do_eval: false

val_size: 0.1

per_device_eval_batch_size: 1

eval_strategy: steps

eval_steps: 10

```



 

执行以下命令开始微调:

```

cd LLaMA-Factory

llamafactory-cli train glm4_emo_lora_sft.yaml

```



 

训练完成后,在 LLaMA-Factory 目录中新建配置文件 emo_glm4_lora_sft_export.yaml:

```

### model

model_name_or_path: glm-4-9b-chat模型地址的绝对路径

# 刚才emo_glm4_lora_sft.yaml文件中的 output_dir

adapter_name_or_path: saves/emo-glm4-epoch10/lora/sft

template: glm4

finetuning_type: lora

### export

export_dir: models/EmoLLM-glm-4-9b-chat

export_size: 2

export_device: cpu

export_legacy_format: false

```



 

## 五、合并模型



 

执行以下命令开始合并模型:

```

cd LLaMA-Factory

llamafactory-cli export emo_glm4_lora_sft_export.yaml

```



 

在 models/EmoLLM-glm-4-9b-chat 目录中就可以获得经过Lora微调后的完整模型。 

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

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

相关文章

不到 2 个月,OpenAI 火速用 Rust 重写 AI 编程工具。尤雨溪也觉得 Rust 香!

一、OpenAI 用 Rust 重写 Codex CLI OpenAI 已用 Rust 语言重写了其 AI 命令行编程工具 Codex CLI,理由是此举能提升性能和安全性,同时避免对 Node.js 的依赖。他们认为 Node.js “可能让部分用户感到沮丧或成为使用障碍”。 Codex 是一款实验性编程代理…

Go 并发编程深度指南

Go 并发编程深度指南 Go 语言以其内置的并发原语而闻名,通过 goroutine 和 channel 提供了一种高效、安全的并发编程模型。本文将全面解析 Go 的并发机制及其实际应用。 核心概念:Goroutines 和 Channels 1. Goroutines (协程) Go 的轻量级线程实现&…

vue和uniapp聊天页面右侧滚动条自动到底部

1.vue右侧滚动条自动到底部 <div ref"newMessage1"></div> <!-- 定义<div ref"newMessage1"></div>与<div v-for”item in list“>循环同级定义-->定义方法 scrollToBottomCenter(){this.$nextTick(() > {this.$re…

iOS 项目怎么构建稳定性保障机制?一次系统性防错经验分享(含 KeyMob 工具应用)

崩溃、内存飙升、后台任务未释放、页面卡顿、日志丢失——稳定性问题&#xff0c;不一定会立刻崩&#xff0c;但一旦积累&#xff0c;就是“上线后救不回来的代价”。 稳定性保障不是某个工具的功能&#xff0c;而是一套贯穿开发、测试、上线全流程的“观测分析防范”机制。 …

JMeter函数整理

"_csvRead"函数 csvRead函数是从外部读取参数&#xff0c;csvRead函数可以从一个文件中读取多个参数。 下面具体讲一下如何使用csvread函数&#xff1a; 1.新建一个csv或者text文件&#xff0c;里面保存要读取的参数&#xff0c;每个参数间用逗号相隔。每行表示每一组…

深入理解 React Hooks

在当今的 React 开发中,Hooks 已经成为构建函数组件的核心工具。自 React 16.8 版本引入以来,Hooks 彻底改变了开发者编写 React 组件的方式,使得状态管理和副作用处理变得更加简洁和直观。本文将全面介绍 React 提供的各种 Hooks,从基础的 useState 和 useEffect,到高级的…

Doris-2:单虚拟机上非docker化安装Doris实验环境

Doris-2:单虚拟机上非docker化安装Doris实验环境 1.安装1.1.环境说明1.2.基础准备1.2.1.JDK1.2.2.操作系统配置(使用root或者有权账户)1.2.2.1.修改环境变量1.2.2.2.修改虚拟内存区域1.2.2.3.关闭swap1.2.2.4.关闭防火墙1.2.2.5.创建用户和组1.3.安装doris1.3.1.解压1.3.2.配置…

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…

Razor编程中@Helper的用法大全

文章目录 第一章&#xff1a;Helper基础概念1.1 Helper的定义与作用1.2 Helper的基本语法结构1.3 Helper与HtmlHelper的区别 第二章&#xff1a;基础Helper用法2.1 无参数Helper2.2 带简单参数的Helper2.3 带默认值的参数2.4 使用模型作为参数 第三章&#xff1a;高级Helper用法…

Python-正则表达式(re 模块)

目录 一、re 模块的使用过程二、正则表达式的字符匹配1. 匹配开头结尾2. 匹配单个字符3. 匹配多个字符4. 匹配分组5. Python 代码示例 三、re 模块的函数1. 函数一览表2. Python 代码示例1&#xff09;search 与 finditer2&#xff09;findall3&#xff09;sub4&#xff09;spl…

前端知识导图

前端知识导图 参考&#xff1a;字节标准 前端知识导图 通用基础 1、编程语言 HTML CSS JS TS 2、计算机基础 计算机网略 数据结构 算法&#xff1a;二分查找、十大排序、二叉树先中后和层次遍历、集合交并集、leetcode刷题经验 编译构建 webpack & vite 应用基础 开…

moon游戏服务器-demo运行

下载地址 https://github.com/sniper00/MoonDemo redis安装 Redis-x64-3.0.504.msi 服务器配置文件 D:\gitee\moon_server_demo\serverconf.lua 貌似不修改也可以的&#xff0c;redis不要设置密码 windows编译 安装VS2022 Community 下载premake5.exe放MoonDemo\server\moon 双…

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…

ajax学习手册

Ajax 通俗易懂学习手册 目录 Ajax 基础概念XMLHttpRequest 详解Fetch API (现代方式)处理不同数据格式错误处理和状态码Ajax 高级技巧实战项目案例最佳实践 Ajax 基础概念 什么是 Ajax&#xff1f; Ajax Asynchronous JavaScript And XML 通俗解释&#xff1a; Ajax 就像…

人工智能学习02-安装环境

人工智能学习概述—快手视频 人工智能学习02-安装—快手视频 Python安装 Python安装分为两种方法&#xff0c;一是从官网(https://www.python.org/)下载Python工具(比如python-2.7.msi)进行安装&#xff0c;并设置Path环境变量&#xff1b;二是下载工具Anaconda集成环境进行安…

电脑开不了机,主板显示67码解决过程

文章目录 现象分析内存条问题BIOS设置问题其它问题 解决清理内存条金手指所需工具操作步骤注意事项 电脑在运行过程中&#xff0c;显示内存不足&#xff0c;重启电脑却无法启动。 现象 System Initialization 主板风扇是转的&#xff0c;也有灯光显示&#xff0c;插上屏幕&am…

在ubuntu等linux系统上申请https证书

使用 Certbot 自动申请 安装 Certbot Certbot 是 Let’s Encrypt 官方推荐的自动化工具&#xff0c;支持多种操作系统和服务器环境。 在 Ubuntu/Debian 上&#xff1a; sudo apt update sudo apt install certbot申请证书 纯手动方式&#xff08;不自动配置&#xff09;&…

springboot的test模块使用Autowired注入失败

springboot的test模块使用Autowired注入失败的原因&#xff1a; 注入失败的原因可能是用了junit4的包的Test注解 import org.junit.Test;解决方法&#xff1a;再加上RunWith(SpringRunner.class)注解即可 或者把Test由junit4改成junit5的注解&#xff0c;就不用加上RunWith&…

Cursor Rules 使用

前言 最近在使用 Cursor 进行编程辅助时&#xff0c;发现 AI 生成的代码风格和当前的代码风格大相径庭。而且有时它会输出很奇怪的代码&#xff0c;总是不符合预期。 遂引出本篇&#xff0c;介绍一下 Rules &#xff0c;它就可以做一些规范约束之类的事情。 什么是 Cursor R…

项目任务,修改svip用户的存储空间。

修改存储空间 3GB->5GB&#xff0c;这是项目任务&#xff0c;首先有人任务就要去思考实现思路&#xff0c;首先存储空间&#xff0c;也就是说不只是前端样式3GB改一下就可以了&#xff0c;那用户实际还是3GB&#xff0c;所以我们去网站看后端谁返回给我们了3GB&#xff0c;我…