Featured image of post 【LLaMA-Factory】開源語言模型微調專案 方便微調各種大型語言模型|內建WebUI 方便使用|內建多種訓練方式讓使用者選擇

【LLaMA-Factory】開源語言模型微調專案 方便微調各種大型語言模型|內建WebUI 方便使用|內建多種訓練方式讓使用者選擇

最近在GitHub上看到了一個專案,可以方便的微調LLM,正好最近要做的東西會需要用到,所以就研究了一下,今天拿出來跟大家介紹。

現在各種大型語言模型可以說是百花齊放

大多數人的電腦硬體,也應該足夠跑動一些參數較少的語言模型了

但如果說要將這些開源的語言模型,實際應用在專案上,可能還是需要先經過一些微調

但是微調的方法並不是每個人都可以輕易掌握,對於大部分人來說應該會比較麻煩

而最近,我在 GitHub 上看到一個,用來微調語言模型的專案,名為 LLaMA-Factory,它裡面包含常見的各種微調方式,像是整個模型直接訓練微調,或使用 LoRa 來微調,在裡面都可以輕鬆做到

今天就來跟大家介紹一下

llama factory

LLaMA-Factory 介紹

LLaMA-Factory 這個專案提供了一個方便的 WebUI 介面,並且整合了各種常見的訓練方式,讓使用者可以方便的調整參數便開始為條屬於自己的語言模型。

LLaMA-Factory UI

接下來,就讓我們來看看如何使用這個專案

硬體需求

在使用這個專案前,這邊還是要讓大家知道一下,要 Fine Tune 一個模型需要的基本硬體需求

這邊作者有提供一個不同的參數量,大約會需要多少的 VRAM,才能 Fine Tune 的一張表

VRAM需求表

我們可以看到 7B 參數的模型,即便開啟 4bit 量化,使用 QLoRa 來 Fine Tune,也會需要 6GB 的 VRAM,13B 參數的模型更是要吃到 12GB 的 VRAM。基本上想要玩語言模型微調,可能還是得要有張稍微好一點的顯卡。

Colab 限制

看到這張 VRAM 需求的表格後,許多人可能會想到是否可以使用 Colab 來進行訓練

但這邊我要很可惜的告訴大家,算是一半做得到一半做不到

我們確實可以在 Colab 裡面載入 7B 以上的模型,也確實可以進行訓練

但是在導出的時候,可能是因為 LLaMA-Factory 的輸出,會將 LoRa 層壓進模型內,這個步驟會需要將整個模型載入到記憶體

免費版的 Colab 僅有提供 12GB 左右的系統記憶體,所以基本上在最後輸出的步驟,一定會報錯(付費版有更多記憶體所以應該沒差)

導出模型時 Colab 系統記憶體不足1 導出模型時 Colab 系統記憶體不足2

要說可以的部分,當然是在訓練的時候,它也會將 LoRa 層獨立保存下來,所以其實我們也可以直接把 LoRa 層下載下來,也一樣是可以使用

LoRa會被保存

所以我還是有簡單的做個 Colab 記事本,讓大家可以方便使用 Colab 進行訓練

Colab Demo

LLaMA-Factory使用教學

那麼接下來,就讓我們從如何在本機上安裝這個專案,開始說起

本機安裝

首先要在本機上安裝這個專案,我們需要先將這個專案下載下來,然後解壓縮

下載專案 將專案解壓縮

接著我們需要創建一個虛擬環境,並將它開啟

1
2
python -m venv .\venv
.\venv\Scripts\activate

接下來安裝 PyTorch、requirements.txt 等必要套件。

之所以將 PyTorch 獨立出來安裝,是因為如果不加上後面的指定版本以及 --extra-index-url,可能會安裝到只能使用 CPU 版的 PyTorch。

1
2
pip install torch==1.13.1 torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116
pip install -r requirements.txt

如果不小心安裝了只有 CPU 版的 PyTorch,我們可以先將他解安裝,然後清除快取後再重新安裝一次即可:

1
2
3
4
5
6
7
8
#解安裝原本的PyTorch:
pip uninstall torch

#清除快取:
pip cache purge

#安裝支援 CUDA 的 PyTorch
pip install torch==1.13.1 torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116

最後則是 bitsandbytes 函式庫,Windows 系統上需要安裝預編譯的函式庫。如果是 Linux 系統,則是只需要輸入 pip install bitsandbytes>=0.39.0 即可

1
2
3
4
5
# Windows 需要安裝預編譯版
pip install https://github.com/jllllll/bitsandbytes-windows-webui/releases/download/wheels/bitsandbytes-0.39.1-py3-none-win_amd64.whl

# Linux 系統上使用以下指令即可
pip install bitsandbytes>=0.39.0

啟動 Web UI

安裝完成後,我們就可以啟動 LLaMA Factory 的 Web UI 介面,我們輸入以下指令:

1
python .\src\train_web.py

稍等一下,WebUI 就會自動打開(如果未開啟可以在瀏覽器手動輸入 localhost:7860)

LLaMA-Factory WebUI

到了這一步,我們其實已經可以開始訓練了,但是要把語言模型微調成自己想要的樣子,我們現在還缺一項東西,就是 訓練資料集

導入訓練資料集

作者在專案的 data 資料夾內有提供資料集的格式,我們需要按照這個格式,才能讓我們自己準備的訓練資料,能夠被用來訓練。

新增自己的訓練資料集有指定格式

以下簡單跟大家介紹 2 種數據集的導入方式

數據集導入方式1 - JSON檔

在專案的 data 資料夾內,有內建一些資料集,我們可以根據這些資料及的 JSON 檔,來製作屬於自己的資料集。

以下是製作 JSON 資料集的格式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
[
  {
    "instruction": "用戶指令(必填)",
    "input": "用戶輸入(選填)",
    "output": "模型回答(必填)",
    "history": [
      ["第一輪指令(選填)", "第一輪回答(選填)"],
      ["第二輪指令(選填)", "第二輪回答(選填)"]
    ]
  },
  {
    "instruction": "用户指令(必填)",
    "input": "用戶輸入(選填)",
    "output": "模型回答(必填)",
    "history": [
      ["第一輪指令(選填)", "第一輪回答(選填)"],
      ["第二輪指令(選填)", "第二輪回答(選填)"]
    ]
  }, //後面可以繼續接下去
]

在製作玩 JSON 資料集後,我們需要在 dataset_info.json 裡面填寫該資料集的欄位對應資料,它的格式如下:

1
2
3
4
5
6
7
8
"資料集名稱": {
  "columns": {
    "prompt": "instruction",
    "query": "input",
    "response": "output",
    "history": "history"
  }
}

數據集導入方式2 - 直接讀取 Hugging Face

除了製作 JSON 資料及外,LLaMA-Factory 還支援可以直接從 Hugging Face 上抓取資料集,我們只需要在 dataset_info.json 填入該資料集的 Hugging Face 路徑,以及資料集的欄位對應就可以。

它的格式如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
"資料集名稱":{
  "hf_hub_url": "HF路徑",
  "columns": {
    "prompt": "用戶指令所對應的欄位(必填)",
    "input": "用户输入所對應的欄位(選填)",
    "response": "回覆所對應的欄位(必填)",
    "history": [
      ["第一輪指令(選填)", "第一輪回答(選填)"],
      ["第二輪指令(選填)", "第二輪回答(選填)"]
    ]
  }
}

HF上的資料集 可以只填入必填的欄位

調整參數開始訓練

有了訓練資料集,我們就可以開始選擇要 Fine Tune 的模型,設定各種參數。

像我這邊就可以設定 4bit 量化來節省 VRAM,然後如果只是要微調對話,選擇「監督式微調」的訓練方式即可

在高級設置裡設定量化等級 設定訓練參數(僅作示範使用,所以Epoch設成1,訓練樣本數也只設成100)

資料集的部分這邊還有一點可以注意一下,就是 LLaMA-Factory 是支援可以同時選擇多個資料集一起訓練的,下方設定的最大樣本數設定,是每個資料集最多使用的樣本數。

可選多個資料集一起訓練

同時如果是使用 JSON 檔來做為資料集,那麼在 WebUI 裡我們可以簡單的預覽一下訓練資料。但如果是使用 HF 上的資料集,便無法預覽,這邊可以稍微留意一下。

JSON資料集可預覽 使用 HF 路徑來載入的資料集不可預覽

設定好參數後我們就可以按下開始訓練「開始訓練」

訓練中右側會顯示Loss值的圖表,方便我們監控訓練狀況

測試微調好的模型

等到模型訓練完成,我們可以在「Chat」分頁中測試效果

模型訓練完成 Chat分頁可以測試目前微調的效果

切換到該分頁後,我們在上方刷新一下 checkpoint 的列表,選擇剛剛訓練的 checkpoint,在點擊下方的加載模型,稍等一下下方就會出現聊天框讓我們測試。

載入模型的步驟

聊天測試

導出模型

如果經過測試覺得結果滿意的話,便可以導出模型,切換到export的分頁後,我們可以設定模型要導出到哪個資料夾內,也可以設定模型要以多大的大小分塊。

這邊基本上不太需要去調整,只要填好導出模型的資料夾即可按開始導出,稍等一下就可以在填寫的導出資料夾中看到道出的模型了!

導出模型 導出的模型

在 Colab 使用

這邊我有簡單的做個 Colab 記事本,讓大家可以方便使用 Colab 進行訓練

記事本連結:
https://colab.research.google.com/github/ADT109119/LLaMA-Factory-Colab/blob/main/LLaMA-Factory-Colab.ipynb

簡單做的Colab版

!!!這邊要提醒大家一點!!!,如果使用 Colab 免費版,直接使用預設的 Hugging Face 路徑載入 7B 以上的模型,基本上一定會爆系統記憶體。

直接載入 7B 模型時 Colab 系統記憶體不足1 直接載入 7B 模型時 Colab 系統記憶體不足2

所以我們需要在 Hugging Face 上找一下,有沒有分成更多 Shard 版本的該模型,將其路徑複製下來替換預設的模型下載路徑。

HF上切成較小 Shard 的模型 替換右上角的模型路徑

至於輸出的部分,目前我是無能為力,因為 LLaMA-Factory 在導出時,會合併 LoRa 權重,這個步驟會需要將整個模型載入到記憶體中,所以免費版的 Colab 基本上一定會爆系統記憶體。

我們能做的,就只有只保存 LoRa 權重了,因為每次的訓練,LLaMA-Factory 都會在 saves 資料夾中的基底模型名稱的資料夾內,新增一個資料夾,裡面儲存著該次訓練的 LoRa 權重,所以如果使用 Colab 免費版訓練,我們只能選擇保存 LoRa 權重了。

這邊我有簡單的製作了 2 個程式區塊,讓大家可以選擇是要將模型上傳到 Hugging Face 上,亦或是存到 Google Drive 內。至於要用哪個大家可以自行選擇

上傳到 HF 保存到 Google Drive

提醒一下

如果要上傳到 Hugging Face 的話,需要有一個具有 Write 權限的 Hugging Face Token。

上傳到 HF 需要輸入具有寫入權限的 HF Token

結語

LLaMA-Factory 提供了非常便利的介面,讓我們可以很輕鬆的對大型語言模型進行客製化微調

如果大家對於微調自己的語言模型有興趣,或是有想要依據此製作的專案的話,LLaMA-Factory 應該會是一個相當方便的工具!

(P.S.如果文中有任何地方錯誤,歡迎指正,我會盡速修改)

影片介紹