合肥網(wǎng)站搭建鄭州網(wǎng)絡推廣代理顧問
LLaMA-Factory 模型 微調(diào)基礎教程
- LLaMA-Factory
- LLaMA-Factory 下載
- Anaconda
- Anaconda 環(huán)境創(chuàng)建
- 軟硬件依賴 詳情
- LLaMA-Factory 依賴安裝
- CUDA 安裝
- 量化 BitsAndBytes 安裝
- 可視化微調(diào)啟動
- 數(shù)據(jù)集準備
- 所需工具下載
- 使用教程
- 所需數(shù)據(jù)合并
- 數(shù)據(jù)集預處理
- DeepSeek-R1 可視化微調(diào)
- 數(shù)據(jù)集處理
- 數(shù)據(jù)詳解
- LLaMA-Factory 基礎設置
- 模型評估與預測
- 訓練模型對話
- 訓練模型導出
LLaMA-Factory 模型 微調(diào) 概述
使用LLaMA-Factory進行模型微調(diào)具有多方面的好處。首先,它簡化了大模型微調(diào)的過程,使得即使是沒有深厚技術功底的用戶也能輕松進行模型的優(yōu)化和改進。此外,LLaMA-Factory支持多種訓練方法,如全量調(diào)參、LoRA等,以及不同的對齊方案,如DPO、PPO等。這為用戶提供了靈活性,可以根據(jù)具體需求選擇合適的微調(diào)策略。
LLaMA-Factory還提供了一站式服務,從模型微調(diào)到量化處理,再到運行,整個過程一氣呵成,無需在不同的工具和流程之間來回切換。此外,它支持多種流行的語言模型,如LLaMA、BLOOM、Mistral、Baichuan等,涵蓋了廣泛的應用場景。
在模型量化方面,LLaMA-Factory能夠有效地壓縮模型規(guī)模,減少模型運行所需的計算量和存儲空間,使得模型能夠在性能稍弱的設備上也能流暢運行。這不僅提高了模型的可訪問性,也降低了運行成本。
此外,LLaMA-Factory的訓練過程中記錄的內(nèi)容比較全面,除了同步輸出loss曲線圖以外,還自帶BLEU等評測指標,這有助于用戶更好地監(jiān)控和評估模型的性能。
LLaMA-Factory
LLaMA-Factory 下載
GitHub: LLaMA-Factory
1. 進到 LLaMA-Factory 后點擊code 下載就行,我這邊選擇的是下載 zip.
2. 這里也有中文的資料以及詳情,感興趣的可以看看。
3. 解壓完成之后記錄一下解壓路徑。
Anaconda
Anaconda 環(huán)境創(chuàng)建
軟硬件依賴 詳情
軟硬件依賴
1. 創(chuàng)建虛擬環(huán)境:官方給出的是 python 至少 3.9 推薦 3.10
2. 打開終端。
3. 導航到 剛才解壓的地址,我的是:E:\Model\LLaMA-Factory-main\LLaMA-Factory-main命令:E: (導航到E盤)cd E:\Model\LLaMA-Factory-main\LLaMA-Factory-main (導航到具體文件夾)
LLaMA-Factory 依賴安裝
1. 依賴下載:pip install -r requirements.txt
2. 這個也是安裝依賴最好都執(zhí)行一遍: pip install -e ".[torch,metrics]"
CUDA 安裝
1. CUDA 安裝:conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
記得輸入 y 繼續(xù)安裝
量化 BitsAndBytes 安裝
1. 安裝 BitsAndBytes
如果要在 Windows 平臺上開啟量化 LoRA(QLoRA),需要安裝預編譯的 bitsandbytes 庫
支持 CUDA 11.1 到 12.2, 請根據(jù)您的 CUDA 版本情況選擇適合的發(fā)布版本。
pip install https://github.com/jllllll/bitsandbytes-windows-webui/releases/download/wheels/bitsandbytes-0.41.2.post2-py3-none-win_amd64.whl
可視化微調(diào)啟動
1. 啟動命令:llamafactory-cli webui
2. 如果出現(xiàn)這個錯誤就說明:無法訪問 localhost,因此需要創(chuàng)建一個可分享的鏈接,但是又因為分享 Gradio share 為false 而無法正確響應,所以我們需要更改一下 interface.py 代碼。
3. 找到 interface.py 存在路徑,我的是:LLaMA-Factory-main\src\llamafactory\webui
4. 找到 run_web_ui() 和 run_web_demo() 方法,把 “share=gradio_share” 修改成:“share=True”如下圖所示:
4. 然后再次運行,就成功了。對了有一點需要注意的是,這個時候不要搭梯子不然界面會一直加載不出來。
數(shù)據(jù)集準備
所需工具下載
微信風格化工具: 留痕
因為我創(chuàng)建的自己的風格化模型所以就用這個了,其他的也可以
例如:finetune_dataset_maker或者自己寫一個,抽時間我自己寫一個也行,到時候寫出來再分享吧
如果大家想了解更多這邊有幾個論文呢可以參考一下。
T2D:從文本自動生成虛擬代理之間的對話
個性化對話生成的最新趨勢:數(shù)據(jù)集、方法和評估綜述
LLaMA-Factory:100多種語言模型的統(tǒng)一高效微調(diào)
1. 回到正題哈,點擊下載,然后解壓。
2. 下載第一個就行
使用教程
1. 點擊 教程跳轉官方使用說明
2. 點擊導出數(shù)據(jù),跟著步驟來就行。
不想看的可以跟著我的來弄:
3. 解壓之后,找到 MemoTrace.exe 雙擊執(zhí)行就可以。
4. 點擊我的登陸賬號,然后在工具點擊解析數(shù)據(jù)
5. 我這邊選擇的是AI 對話txt 和 json,大家按需導出就行。
6. 因為這邊需要的數(shù)據(jù)就只是文本數(shù)據(jù),所以就只勾選了文本。
7. 記一下目錄哈,我這邊是在:D:\軟件\留痕\data\聊天記錄,找相對路徑就行。
8. 導出完畢之后就相對路徑文件夾會有這三個文件,因為我選擇導出txt和json 所以會有三個文件如果只是json會有兩個文件。
所需數(shù)據(jù)合并
1. 在聊天記錄文件夾 建立一個 merge.py 的文件
2. 把下面的代碼復制進去,這個代碼的主要作用就是合并所有的聊天記錄。
import os
import json# 設置目標文件夾路徑
folder_path = r'D:\軟件\留痕\data\聊天記錄'# 獲取文件夾及其所有子文件夾中的所有 .json 文件
json_files = []
for root, dirs, files in os.walk(folder_path):for file in files:if file.endswith('.json'):json_files.append(os.path.join(root, file))# 合并所有 .json 文件
merged_data = []
for file in json_files:with open(file, 'r', encoding='utf-8') as f:try:data = json.load(f)merged_data.append(data)except json.JSONDecodeError:print(f"Error decoding {file}. Skipping.")# 保存合并后的數(shù)據(jù)到一個新的 .json 文件
merged_file_path = os.path.join(folder_path, 'merged_data.json')
with open(merged_file_path, 'w', encoding='utf-8') as merged_file:json.dump(merged_data, merged_file, indent=4, ensure_ascii=False)print(f"合并后的文件已保存至: {merged_file_path}")
3. 直接在地址欄前面加上 cmd 回車之后就會打開當前路徑的命令提示符。
4. 鍵入 python merge.py 執(zhí)行
5. 顯示這個就表示執(zhí)行完畢,數(shù)據(jù)已經(jīng)合并了。
6. 內(nèi)容大概就是這樣
數(shù)據(jù)集預處理
數(shù)據(jù)集預處理是機器學習和人工智能中不可或缺的環(huán)節(jié),其重要性體現(xiàn)在多個方面。
首先,預處理能夠提升數(shù)據(jù)質量,通過清洗噪聲、去除重復和無關信息,以及標準化格式,為模型訓練提供純凈
且一致的輸入。其次,它有助于優(yōu)化模型性能,例如通過分詞、去除停用詞等操作,讓模型更容易理解和學習數(shù)
據(jù)中的關鍵信息,同時減少過擬合的風險。此外,預處理還能增強數(shù)據(jù)多樣性,通過數(shù)據(jù)增強技術如文本擴充、
同義詞替換等,提升模型的泛化能力。在對話系統(tǒng)中,預處理尤為重要,因為它需要處理多輪對話的上下文一致
性以及用戶意圖的多樣性。通過格式化對話數(shù)據(jù)和增強對話內(nèi)容,可以顯著提升對話系統(tǒng)的自然性和流暢性???之,數(shù)據(jù)集預處理不僅提高了模型的訓練效率,還為模型的最終性能奠定了堅實基礎,是實現(xiàn)高質量人工智能應
用的關鍵步驟。
1. 在聊天記錄文件夾 建立一個 Data_Preprocessing.py 的文件
2. 把下面的代碼復制進去,這個代碼的主要作用就是數(shù)據(jù)清洗、脫敏、去重以及規(guī)則化成sharegpt格式。這個等會解釋為什么要用 sharegpt 格式。
import json
import re# 讀取 merged_data.json 文件
with open('merged_data.json', 'r', encoding='utf-8') as file:data = json.load(file)# 轉換后的數(shù)據(jù)格式
converted_data = []# 數(shù)據(jù)清洗:去除空消息,清除特殊字符,統(tǒng)一格式
def clean_data(dataset):cleaned_data = []for example in dataset:messages = example['messages']cleaned_messages = []for message in messages:# 去除內(nèi)容為空的消息if not message['content'].strip():continue# 清除多余的空格、換行符等message['content'] = message['content'].replace("\n", " ").strip()cleaned_messages.append(message)if cleaned_messages:cleaned_data.append({'messages': cleaned_messages})return cleaned_data# 脫敏處理:替換敏感信息
def replace_sensitive_info(text):# 匹配手機號、郵箱等敏感信息text = re.sub(r'\d{3}[-]?\d{4}[-]?\d{4}', '[PHONE_NUMBER]', text) # 替換手機號text = re.sub(r'\S+@\S+', '[EMAIL]', text) # 替換郵箱text = re.sub(r'\d{4}-\d{2}-\d{2}', '[DATE]', text) # 替換日期return text# 匿名化數(shù)據(jù):替換用戶角色
def anonymize_data(dataset):anonymized_data = []for example in dataset:messages = example['messages']anonymized_messages = []for message in messages:# 匿名化用戶角色if message['role'] == 'user':message['content'] = message['content'].replace("用戶", "用戶X")# 替換敏感信息message['content'] = replace_sensitive_info(message['content'])anonymized_messages.append(message)anonymized_data.append({'messages': anonymized_messages})return anonymized_data# 處理每一條對話
for item_list in data:for item in item_list:# 確保每個條目中包含 'messages' 字段if 'messages' not in item:print("跳過:沒有找到 'messages' 字段")continue # 如果沒有 'messages' 字段,跳過當前數(shù)據(jù)項print(f"正在處理數(shù)據(jù)項: {item}") # 打印當前處理的項conversation = {"conversations": []}# 處理消息數(shù)據(jù)for message in item['messages']:role = message['role']content = message['content']print(f"處理消息:role={role}, content={content}") # 打印消息內(nèi)容# 清洗和脫敏處理content = replace_sensitive_info(content)# 映射 role 到 from 字段if role == "system":continue # 忽略 system 消息elif role == "user":from_role = "human"elif role == "assistant":from_role = "gpt"# 添加轉換后的消息conversation['conversations'].append({"from": from_role,"value": content})# 將轉換后的會話添加到最終結果中converted_data.append(conversation)# 保存轉換后的數(shù)據(jù)為新的文件
with open('converted_data.json', 'w', encoding='utf-8') as file:json.dump(converted_data, file, ensure_ascii=False, indent=2)print("數(shù)據(jù)轉換完成,結果已保存為 converted_data.json")
3. 直接在地址欄前面加上 cmd 回車之后就會打開當前路徑的命令提示符。
4. 鍵入 python merge.py 執(zhí)行
5. 顯示這個就表示執(zhí)行完畢,數(shù)據(jù)已清洗和修改完畢。
DeepSeek-R1 可視化微調(diào)
數(shù)據(jù)集處理
1. 把 converted_data.json 數(shù)據(jù)集存放在,LLaMA-Factory 相對路徑,我的是:E:\Model\LLaMA-Factory-main\LLaMA-Factory-main\data
2. 編輯 dataset_info.json 文件。
3. 更改 dataset_info.json 文件,以便LLaMA-Factory 識別訓練。下面是需要添加的內(nèi)容。
"converted_data": {"file_name": "converted_data.json","formatting": "sharegpt","columns": {"messages": "conversations"}},
數(shù)據(jù)詳解
1. 在data 文件夾有個 README_zh.md 的文件打開它它記錄的就是 alpaca 和 sharegpt 格式 數(shù)據(jù)集如何配置。
2. 我這邊使用的是 sharegpt 數(shù)據(jù)集,所以在 dataset_info.json 文件需要填充的內(nèi)容就如下圖所示。又因為我不需要: tools(工具描述) 所以直接刪除也行當然你有需求也可以加上,只要把數(shù)據(jù)集修改一下就行了。如果還不知道怎么修改就看一下樣例數(shù)據(jù)集 glaive_toolcall_zh_demo.json 也在 data 文件夾下。
LLaMA-Factory 基礎設置
模型下載地址: deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
1. LLaMA-Factory 運行起來之后把語言更改成中文、模型更改為:DeepSeek-R1-1.5B-Distill模型路徑就是你下載好存放的模型路徑。
2. 選擇我們添加的數(shù)據(jù)集。
2. 簡單預覽一下看看有沒有錯誤,然后關閉就行了。
3. 你如果不是很了解這些參數(shù)什么意思的話,按照我的填就行。
4. 點擊預覽命令,可以看到訓練參數(shù)配置詳情。
5. 開始訓練
5. 訓練詳情可以在 Gradio UI 查看損失函數(shù),也可以后臺查看詳細信息。
命令行輸出
6. 訓練完畢之后會輸出 訓練完畢字符 。
7. 后臺也會輸出當前模型訓練基礎指標,簡單解釋一下吧。epoch:表示訓練過程中數(shù)據(jù)集被完整地通過模型一次的次數(shù)。num_input_tokens_seen:表示在訓練過程中模型已經(jīng)看到的輸入標記(例如單詞或字)的總數(shù)。total_flos:表示訓練過程中執(zhí)行的浮點運算次數(shù),單位是 GF。train_loss:表示訓練集上的損失函數(shù)值,損失越低通常意味著模型性能越好。train_runtime:表示訓練過程的總運行時間。train_samples_per_second:表示模型每秒可以處理的樣本數(shù)。train_steps_per_second:表示模型每秒可以執(zhí)行的訓練步驟數(shù)。
8. 模型存放位置,我的地址是:LLaMA-Factory-main\saves\DeepSeek-R1-1.5B-Distill\lora如果沒更改存放位置的話,應該都在 saves 文件夾下。
模型評估與預測
1. 點擊 Evaluate&Predict
2. 選擇需要使用到的數(shù)據(jù)集。
3. 預覽一下評估命令,我使用的是 RTX4080,大概需要跑 50 多分鐘。
4. 評估結束之后會給一個評估指標,簡單解釋一下都是什么意思。
這些數(shù)據(jù)是機器學習模型的評估指標,通常用于評估文本生成模型(如機器翻譯、文本摘要等)的性能。predict_bleu-4:用于評估機器翻譯模型輸出質量的一個指標。bleu-4 計算的是 4-gram(四個連續(xù)單詞)之間的匹配程度。它用于衡量生成文本與參考文本之間的相似度。predict_model_preparation_time:模型準備時間,即加載模型并進行初始化所花費的時間,單位是秒。predict_rouge-1:ROUGE 用于評估自動摘要質量的一個指標。rouge-1 衡量的是1-gram(單個詞)的召回率即生成文本與參考文本中單個詞的匹配程度。predict_rouge-2:rouge-2 衡量的是2-gram(由兩個連續(xù)單詞組成的詞組)之間的匹配度。它反映了生成文本和參考文本中連續(xù)兩個詞的相似性。predict_rouge-l:rouge-l 衡量的是最長公共子序列(LCS)的召回率。LCS考慮了單詞的順序因此更能反映生成文本和參考文本之間的結構相似度。predict_runtime:模型運行的總時間,通常是指模型在預測或推理過程中所花費的總時間,單位為秒。predict_samples_per_second:每秒處理的樣本數(shù)量,表示模型每秒鐘可以處理多少個輸入樣本。predict_steps_per_second:每秒執(zhí)行的推理步驟數(shù),表示模型在推理過程中每秒執(zhí)行多少次推理步驟。
5. 這個是模型評估具體信息,感興趣的可以點擊去具體查看。
訓練模型對話
1. 選擇你想要對話并訓練好的模型。
2. 點擊加載模型,模型加載完畢之后會提示:模型已加載,可以開始聊天了!
3. 然后就可以開始對話了,這個對話就是根據(jù)你的風格進行訓練出來的,相當于第二個你。
訓練模型導出
1. 點擊 Export 切換到模型導出界面。
2. 這些參數(shù)按需調(diào)節(jié)吧,導出設備最好選擇自動,不然CUDA 執(zhí)行會有一點問題,導出目錄需要填寫一下。
3. 模型正在導出和導出成功都有提示,如下圖所示。
4. 所有模型文件就是在你填寫的導出路徑文件夾內(nèi)。我的是:LLaMA-Factory-main\model\DeepSeek-R1-1.5B-Distill 微調(diào)
5. 一般都出完畢之后我都會寫一個 requirements.txt 文件,也就是依賴安裝文件,方便后期快速部署。里面也沒什么東西就是當前模型所需依賴,一般使用原本的依賴文件就行,我這里面就是下面的內(nèi)容。
transformers>=4.41.2,<=4.48.3,!=4.46.*,!=4.47.*,!=4.48.0,!=4.48.1,!=4.48.2;python_version<'3.10'
transformers>=4.41.2,<=4.48.3,!=4.46.*,!=4.47.*,!=4.48.0;python_version>='3.10'
datasets>=2.16.0,<=3.2.0
accelerate>=0.34.0,<=1.2.1
peft>=0.11.1,<=0.12.0
trl>=0.8.6,<=0.9.6
tokenizers>=0.19.0,<=0.21.0
gradio>=4.38.0,<=5.12.0
pandas>=2.0.0
scipy
einops
sentencepiece
tiktoken
protobuf
uvicorn
pydantic
fastapi
sse-starlette
matplotlib>=3.7.0
fire
packaging
pyyaml
numpy<2.0.0
av
librosa
tyro<0.9.0
暫時先這樣吧,如果實在看不明白就留言,看到我會回復的。希望這個教程對您有幫助!
路漫漫其修遠兮,與君共勉。