基于 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.pswp.cn/web/83061.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83061.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83061.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋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;我…