一、LoRA微調的基本原理
1、基本概念
- LoRA(Low-Rank Adaptation)是一種用于大模型微調的技術,通過引入低秩矩陣來減少微調時的參數量。在預訓練的模型中,LoRA通過添加兩個小矩陣B和A來近似原始的大矩陣ΔW,從而減少需要更新的參數數量。具體來說,LoRA通過將全參微調的增量參數矩陣ΔW表示為兩個參數量更小的矩陣B和A的低秩近似來實現:
- [ W_0 + \Delta W = W_0 + BA ]
- 其中,B和A的秩遠小于原始矩陣的秩,從而大大減少了需要更新的參數數量。
2、思想
- 預訓練模型中存在一個極小的內在維度,這個內在維度是發揮核心作用的地方。在繼續訓練的過程中,權重的更新依然也有如此特點,即也存在一個內在維度(內在秩)
- 權重更新:W=W+^W
? 因此,可以通過矩陣分解的方式,將原本要更新的大的矩陣變為兩個小的矩陣 - 權重更新:W=W+^W=W+BA
- 具體做法,即在矩陣計算中增加一個旁系分支,旁系分支由兩個低秩矩陣A和B組成
3、原理
- 訓練時,輸入分別與原始權重和兩個低秩矩陣進行計算,共同得到最終結果,優化則僅優化A和B
- 訓練完成后,可以將兩個低秩矩陣與原始模型中的權重進行合并,合并后的模型與原始模型無異
4、為什么GPU支持AI訓練,且是最優選
CPU串行運算能力強(計算頻率高,核心數少)
GPU并行運算能力強(計算頻率低,核心數多(CUDA數量))
5、模型之間區別
1、模型預訓練:從頭開始訓練一個全新的模型。(全新的模型是指模型的參數完全隨機,不能處理任何問題。)
2、微調訓練(遷移學習):基于之前訓練好的模型,來繼續學習新的任務。微調的目的往往是讓模型具備新的或者特定的能力。
3、Lora微調屬于局部微調。
二、LLaMA-Factory介紹
github官網地址:https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md
1、基本介紹
LLaMA Factory 是一個簡單易用且高效的大型語言模型(Large Language Model)訓練與微調平臺。通過 LLaMA Factory,可以在無需編寫任何代碼的前提下,在本地完成上百種預訓練模型的微調,框架特性包括:
-
模型種類:LLaMA、LLaVA、Mistral、Mixtral-MoE、Qwen、Yi、Gemma、Baichuan、ChatGLM、Phi 等等。
-
訓練算法:(增量)預訓練、(多模態)指令監督微調、獎勵模型訓練、PPO 訓練、DPO 訓練、KTO 訓練、ORPO 訓練等等。
-
運算精度:16 比特全參數微調、凍結微調、LoRA 微調和基于 AQLM/AWQ/GPTQ/LLM.int8/HQQ/EETQ 的 2/3/4/5/6/8 比特 QLoRA 微調。
-
優化算法:GaLore、BAdam、DoRA、LongLoRA、LLaMA Pro、Mixture-of-Depths、LoRA+、LoftQ 和 PiSSA。
-
加速算子:FlashAttention-2 和 Unsloth。
-
推理引擎:Transformers 和 vLLM。
-
實驗監控:LlamaBoard、TensorBoard(最好推薦)、Wandb、MLflow、SwanLab 等等。
2、安裝 LLaMA Factory(基于windows)
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
1、創建一個conda環境
conda create -n llamaFactory python=3.12 -y
pip install -e .[torch,metrics]
或者pip install -e
上面的似乎沒有安裝cuda,所以訓練時會提示
Warning
CUDA environment was not detected.
因此安一下:
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
2、啟動
llamafactory-cli webui
如果是linux,建議使用vscode做ssh連接,這樣就方便外部訪問web端。
3.使用 LLaMA-Factory 微調 Qwen
選擇自己本地的大模型,記住路徑改為自己的本地路徑,否則會跑去huggingface去下載。
自己的本地路徑
Checkpoint path檢查點路徑就是如果你中途斷網了,比如你訓練了500次了,那么就可以從五百次繼續訓練。如果沒有訓練過,那么此處就不要填。
繼續
Dataset(數據集)
數據集必須放在LLaMA-Factory項目下的data文件夾里,記住是必須。
訓練輪次 最少300
Cutoff length(截斷長度)越大 越耗資源,根據自己的數據量給出相應的長度
Batch size(批次大小,根據自己的GPU決定)
用的啥選啥,我用的lora,所以選LoRA configurations
LoRA alpha設置為LoRA rank的2倍
priview command(預覽命令)
可以復制到自己本地去跑,但是感覺有點多余。
設備數量(device count),當你有幾臺設備就填幾
之前沒有在conda安裝cuda,運行提示Warning
CUDA environment was not detected.
安裝以后不提示。
正常訓練
可以看到一些正常輸出了
如果你中斷訓練,后臺會報錯
raiseValueError("OutputdirectoryalreadyexistsandIsnotempty.Pleasesetovenarite_output_dir.")
ValueError: Output directory already exists and is not empty.
Please set overwrite_output_dir
如果要重新訓練,把LLaMA-Factory文件下的saves目錄下的之前的數據刪除就可以了
這里設置日志打印,和保存批次
填入自己的訓練數據point,就可以聊天了。
**那什么時候可以訓練停止呢**?
loss損失,趨于平衡時。
三、LLaMA-Factory微調數據集制作方法
1、modelscope下載數據集,然后通過代碼轉換成自己想要的格式的數據
比如我用弱智吧數據訓練:https://modelscope.cn/datasets/w10442005/ruozhiba_qa
數據下載下來以后
用如下代碼轉成如下格式的數據:
{"instruction": "計算這些物品的總費用。 ","input": "輸入:汽車 - $3000,衣服 - $100,書 - $20。","output": "汽車、衣服和書的總費用為 $3000 + $100 + $20 = $3120。"
}
代碼
import json# 讀取原始JSON文件
input_file = r"data\ruozhiba_qaswift.json" # 你的JSON文件名
output_file = r"\data\ruozhiba_qaswift_train.json" # 輸出的JSON文件名with open(input_file, "r", encoding="utf-8") as f:data = json.load(f)# 轉換后的數據
converted_data = []for item in data:converted_item = {"instruction": item["query"],"input": "","output": item["response"]}converted_data.append(converted_item)# 保存為JSON文件(最外層是列表)
with open(output_file, "w", encoding="utf-8") as f:json.dump(converted_data, f, ensure_ascii=False, indent=4)print(f"轉換完成,數據已保存為 {output_file}")
然后將轉換的數據放入LLaMA-Factory項目下的data下,同時更改dataset_info.json.
然后就可以訓練了。
四、訓練評估
箭頭所指的地方為自己需要填的訓練checkpoint最終的批次路徑,和數據集
需要安裝以下包,才可評估。
pip install jieba
pip install nltk
pip install rouge_chinese
五、量化導出
量化導出,默認為none,不用安裝包。如果量化到4,或者8,需要安裝一些包.不建議量化2和3,因為量化2和3,模型可能不好用或者不太能用。同時模型越小,越不建議量化,比如0.5B 不建議導出,因為0.5已經是最小的模型了,繼續量化反而效果不理想,能不量化 盡量不量化
0.5B 不建議導出,因為0.5已經是最小的模型了,繼續量化反而效果不理想,如圖
模型路徑為合并后的路徑,保存路徑自己定義
量化安裝包
pip install optimum
pip install outo_gptq
pip install rouge_chinese
安裝out_gptq會報錯,它會與cuda環境不兼容,因此需要新建一個環境安裝
根據您的CUDA 12.1環境,安裝AutoGPTQ
(可能您指的outo_gptq
是該工具的舊稱或筆誤)需要特殊處理。以下是詳細步驟:
方法:創建一個conda,建議3.10虛擬環境
1. 源碼安裝(兼容CUDA 12.1)
直接通過pip
安裝可能無法獲取兼容版本,需從源碼安裝:
conda create -n llama python==3.10 -y
然后安裝
# 克隆倉庫
git clone https://github.com/PanQiWei/AutoGPTQ.git
cd AutoGPTQ
pip install outo_gptq
pip install auto-gptq -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install optimum -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install scipy -i https://pypi.tuna.tsinghua.edu.cn/simplecd LLaMA-Factory
pip install -e .
或者
pip install -e
llamafactory-cli webui
2. 驗證安裝
安裝后運行以下Python代碼測試:
from autogptq import AutoGPTQ# 初始化量化器(無需實際量化,僅驗證加載)
quantizer = AutoGPTQ(model_path="your_model_path", device="cuda")
print("AutoGPTQ初始化成功!")
3. 常見問題處理
- 依賴沖突:在虛擬環境中重新安裝
numpy
和transformers
:pip uninstall numpy transformers -y pip install numpy==1.24.3 transformers==4.32.0
- CUDA驅動問題:確保NVIDIA驅動版本 ≥ 530.30(CUDA 12.1最低要求)。
4. 備選方案
如果仍報錯,嘗試指定舊版AutoGPTQ
:
pip install git+https://github.com/PanQiWei/AutoGPTQ.git@v1.0.0
請按步驟操作后觀察是否解決兼容性問題。若遇到其他錯誤,請提供完整報錯日志以便進一步排查。
訓練圖分析
y軸 loss為損失率
step為步數
original”(原始)和“smoothed”(平滑)
“original”(原始)和“smoothed”(平滑)。這種選項通常用于圖像處理或數據可視化中,允許用戶在原始數據或經過平滑處理的數據之間進行選擇。
- Original(原始):選擇這個選項將顯示未經過任何處理的原始數據或圖像。
- Smoothed(平滑):選擇這個選項將顯示經過平滑處理的數據或圖像,平滑處理通常用于減少噪聲或使數據更易于分析。
兩者趨于重合且在一條線時,訓練可停止。Smoothed越高噪聲越大,通常需要增加訓練輪次來減少噪聲。
通常情況下,平滑處理是為了減少噪聲,而不是增加噪聲。以下是一些可能的解釋:
-
平滑處理的目的:
- 平滑處理通常用于減少數據中的噪聲,使數據更加平滑和易于分析。
- 在圖像處理和信號處理中,平滑處理可以幫助去除高頻噪聲,保留重要的低頻信息。
-
增加訓練輪次:
- 增加訓練輪次(epochs)通常是為了讓模型更好地學習數據中的模式,從而提高模型的性能。
- 如果模型在訓練過程中表現出過擬合或欠擬合,增加訓練輪次可能有助于改善這些問題。
-
噪聲與平滑處理的關系:
- 如果平滑處理后噪聲反而增加,可能是因為平滑處理的方法或參數選擇不當。
- 在某些情況下,過度的平滑處理可能會導致重要信息的丟失,反而使數據看起來更加嘈雜。
-
實際應用中的建議:
- 在進行平滑處理時,應選擇合適的平滑方法和參數,以確保既能有效減少噪聲,又能保留數據中的重要信息。
- 如果增加訓練輪次是為了降低噪聲,可能需要同時調整其他超參數,如學習率、正則化參數等,以達到最佳效果。
總之,平滑處理通常是為了減少噪聲,而不是增加噪聲。如果在實際應用中遇到噪聲增加的問題,建議檢查平滑處理的方法和參數,或者考慮其他可能的因素。