大語(yǔ)言模型訓(xùn)練(LLM Training)
LLMs Trainer 是一個(gè)旨在幫助人們從零開始訓(xùn)練大模型的倉(cāng)庫(kù),該倉(cāng)庫(kù)最早參考自 Open-Llama,并在其基礎(chǔ)上進(jìn)行擴(kuò)充。
有關(guān) LLM 訓(xùn)練流程的更多細(xì)節(jié)可以參考 【LLM】從零開始訓(xùn)練大模型。
使用倉(cāng)庫(kù)之前,請(qǐng)先安裝所有需要的依賴:
pip install -r requirements.txt
1. 繼續(xù)預(yù)訓(xùn)練(Continue Pretraining)
繼續(xù)預(yù)訓(xùn)練是指,在一個(gè)已有的模型上繼續(xù)進(jìn)行預(yù)訓(xùn)練增強(qiáng),通常用于 英文模型的中文增強(qiáng)
或是 領(lǐng)域數(shù)據(jù)增強(qiáng)
。
我們這里以英文模型 OpenLlama 在中文數(shù)據(jù)集 MNBVC 中的 少量數(shù)據(jù) 為例來(lái)演示整個(gè)流程。
1.1 數(shù)據(jù)壓縮
由于預(yù)訓(xùn)練數(shù)據(jù)集通常比較龐大,因此先將訓(xùn)練數(shù)據(jù)進(jìn)行壓縮并流氏讀取。
首先,進(jìn)入到 data
目錄:
cd data
找到目錄下的 compress_data.py
, 在該文件中修改需要壓縮的數(shù)據(jù)路徑:
SHARD_SIZE = 10 # 單個(gè)文件存放樣本的數(shù)量, 示例中使用很小,真實(shí)訓(xùn)練可以酌情增大
...
def batch_compress_preatrain_data():
"""
批量壓縮預(yù)訓(xùn)練數(shù)據(jù)。
"""
source_path = 'shuffled_data/pretrain' # 源數(shù)據(jù)文件
target_path = 'pretrain_data' # 壓縮后存放地址
files = [ # 這三個(gè)文件是示例數(shù)據(jù)
'MNBVC_news',
'MNBVC_qa',
'MNBVC_wiki'
]
...
if __name__ == '__main__':
batch_compress_preatrain_data()
# batch_compress_sft_data()
Notes: 上述的 files 可以在 shuffled_data/pretrain/ 中找到,是我們準(zhǔn)備的少量示例數(shù)據(jù),真實(shí)訓(xùn)練中請(qǐng)?zhí)鎿Q為完整數(shù)據(jù)。
在 data
路徑中執(zhí)行 python compress_data.py
, 終端將顯示:
processed shuffled_data/pretrain/MNBVC_news.jsonl...
total line: 100
total files: 10
processed shuffled_data/pretrain/MNBVC_qa.jsonl...
total line: 50
total files: 5
processed shuffled_data/pretrain/MNBVC_wiki.jsonl...
total line: 100
total files: 10
隨后可在 pretrain_data
中找到對(duì)應(yīng)的 .jsonl.zst
壓縮文件(該路徑將在之后的訓(xùn)練中使用)。
1.2 數(shù)據(jù)源采樣比例(可選)
為了更好的進(jìn)行不同數(shù)據(jù)源的采樣,我們提供了按照預(yù)設(shè)比例進(jìn)行數(shù)據(jù)采樣的功能。
我們提供了一個(gè)可視化工具用于調(diào)整不同數(shù)據(jù)源之間的分布,在 根目錄
下使用以下命令啟動(dòng):
streamlit run utils/sampler_viewer/web.py --server.port 8001
隨后在瀏覽器中訪問(wèn) 機(jī)器IP:8001
即可打開平臺(tái)。
我們查看 data/shuffled_data/pretrain
下各數(shù)據(jù)的原始文件大?。?/p>
-rw-r--r--@ 1 xx staff 253K Aug 2 16:38 MNBVC_news.jsonl
-rw-r--r--@ 1 xx staff 121K Aug 2 16:38 MNBVC_qa.jsonl
-rw-r--r--@ 1 xx staff 130K Aug 2 16:37 MNBVC_wiki.jsonl
并將文件大小按照格式貼到平臺(tái)中:
調(diào)整完畢后,復(fù)制上圖右下角的最終比例,便于后續(xù)訓(xùn)練使用。
1.3 詞表擴(kuò)充(可選)
由于原始 Llama 的中文 token 很少,因此我們可以選擇對(duì)原有的 tokenizer 進(jìn)行詞表擴(kuò)充。
進(jìn)入到 utils
目錄:
cd utils
修改文件 train_tokenizer.py
中的訓(xùn)練數(shù)據(jù)(我們使用正式預(yù)訓(xùn)練訓(xùn)練數(shù)據(jù)集作為訓(xùn)練詞表的數(shù)據(jù)集):
...
dataset = {
"MNBVC_news": "../data/pretrain_data/MNBVC_news/*.jsonl.zst",
"MNBVC_qa": "../data/pretrain_data/MNBVC_qa/*.jsonl.zst",
"MNBVC_wiki": "../data/pretrain_data/MNBVC_wiki/*.jsonl.zst",
}
執(zhí)行完 train_tokenizer.py
后,路徑下會(huì)出現(xiàn)訓(xùn)練好的模型 test_tokenizer.model
。
隨后,我們將訓(xùn)練好的 model 和原本的 llama model 做融合:
python merge_tokenizer.py
你可以使用 這個(gè)工具 很方便的對(duì)合并好后的 tokenizer 進(jìn)行可視化。
1.4 平均初始化 extend token embedding(可選)
為了減小擴(kuò)展的 token embedding 隨機(jī)初始化帶來(lái)模型性能的影響,我們提供使用將新 token 在原 tokenizer 中的 sub-token embedding 的平均值做為初始化 embedding 的方法。
具體使用方法在 utils/extend_model_token_embeddings.py
。
1.5 正式訓(xùn)練
當(dāng)完成上述步驟后就可以開始正式進(jìn)行訓(xùn)練,使用以下命令啟動(dòng)訓(xùn)練:
sh train_llms.sh configs/accelerate_configs/ds_stage1.yaml \
configs/pretrain_configs/llama.yaml \
openlm-research/open_llama_7b_v2
多機(jī)多卡則啟動(dòng):
sh train_multi_node_reward_model.sh configs/accelerate_configs/ds_stage1.yaml \
configs/pretrain_configs/llama.yaml \
openlm-research/open_llama_7b_v2
注意,所有的訓(xùn)練配置都放在了第 2 個(gè)參數(shù) configs/pretrain_configs/llama.yaml
中,我們挑幾個(gè)重要的參數(shù)介紹。
-
tokenizer_path (str)
:tokenizer 加載路徑。 -
ckpt (str)
:初始 model 加載路徑。 -
sample_policy_file (str)
:數(shù)據(jù)源采樣配置文件,若不包含這一項(xiàng)則不進(jìn)行數(shù)據(jù)源采樣。 -
train_and_eval (bool)
:該參數(shù)決定了是否在訓(xùn)練中執(zhí)行評(píng)估函數(shù)。 -
img_log_dir (str)
:訓(xùn)練過(guò)程中的 log 圖存放目錄。 -
eval_methods (list)
:使用哪些評(píng)估函數(shù),包括:-
single_choice_eval: 單選題正確率測(cè)試(如: C-Eval),評(píng)估數(shù)據(jù)格式參考
eval_data/knowledge/knowledge_and_reasoning.jsonl
。 -
generation_eval: 生成測(cè)試,給定 prompt,測(cè)試模型生成能力,評(píng)估數(shù)據(jù)格式參考
eval_data/pretrain/generation_test.jsonl
。
-
-
work_dir (str)
:訓(xùn)練模型存放路徑。 -
save_total_limit (int)
:最多保存的模型個(gè)數(shù)(超過(guò)數(shù)目則刪除舊的模型)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-668699.html
2. 指令微調(diào)(Instruction Tuning)
我們準(zhǔn)備了部分 ShareGPT
的數(shù)據(jù)作為示例數(shù)據(jù),我們?nèi)耘f使用 OpenLlama 作為訓(xùn)練的基座模型。
2.1 數(shù)據(jù)壓縮
同預(yù)訓(xùn)練一樣,我們先進(jìn)入到 data
目錄:
cd data
找到目錄下的 compress_data.py
, 在該文件中修改需要壓縮的數(shù)據(jù)路徑:
SHARD_SIZE = 10 # 單個(gè)文件存放樣本的數(shù)量, 示例中使用很小,真實(shí)訓(xùn)練可以酌情增大
...
def batch_compress_sft_data():
"""
批量壓縮SFT數(shù)據(jù)。
"""
source_path = 'shuffled_data/sft'
target_path = 'sft_data'
files = [
'sharegpt'
]
...
if __name__ == '__main__':
# batch_compress_preatrain_data()
batch_compress_sft_data()
Notes: 上述的 files 可以在 shuffled_data/sft/ 中找到,是我們準(zhǔn)備的少量示例數(shù)據(jù),真實(shí)訓(xùn)練中請(qǐng)?zhí)鎿Q為完整數(shù)據(jù)。
在 data
路徑中執(zhí)行 python compress_data.py
, 終端將顯示:
processed shuffled_data/sft/sharegpt.jsonl...
total line: 9637
total files: 964
隨后可在 sft_data
中找到對(duì)應(yīng)的 .jsonl.zst
壓縮文件(該路徑將在之后的訓(xùn)練中使用)。
2.2 特殊 token 擴(kuò)充
受到 ChatML 的啟發(fā),我們需要在原有的 tokenizer 中添加一些 special token 用于對(duì)話系統(tǒng)。
一種最簡(jiǎn)單的方式是在 tokenizer 路徑中找到 special_tokens_map.json
文件,并添加以下內(nèi)容:
{
... # 需要添加的特殊 token
"system_token": "<|system|>", # system prompt
"user_token": "<|user|>", # user token
"assistant_token": "<|assistant|>", # chat-bot token
"chat_end_token": "<|endofchat|>" # chat end token
}
2.3 微調(diào)訓(xùn)練
當(dāng)完成上述步驟后就可以開始正式進(jìn)行訓(xùn)練,使用以下命令啟動(dòng)訓(xùn)練:
sh train_llms.sh configs/accelerate_configs/ds_stage1.yaml \
configs/sft_configs/llama.yaml \
openlm-research/open_llama_7b_v2
多機(jī)多卡則啟動(dòng):
sh train_multi_node_reward_model.sh configs/accelerate_configs/ds_stage1.yaml \
configs/sft_configs/llama.yaml \
openlm-research/open_llama_7b_v2
注意,所有的訓(xùn)練配置都放在了第 2 個(gè)參數(shù) configs/sft_configs/llama.yaml
中,我們挑幾個(gè)重要的參數(shù)介紹。
-
tokenizer_path (str)
:tokenizer 加載路徑。 -
ckpt (str)
:初始 model 加載路徑。 -
train_and_eval (bool)
:該參數(shù)決定了是否在訓(xùn)練中執(zhí)行評(píng)估函數(shù)。 -
img_log_dir (str)
:訓(xùn)練過(guò)程中的 log 圖存放目錄。 -
eval_methods (list)
:使用哪些評(píng)估函數(shù),包括:-
generation_eval: 生成測(cè)試,給定 prompt,測(cè)試模型生成能力,評(píng)估數(shù)據(jù)格式參考
eval_data/sft/share_gpt_test.jsonl
。 -
暫無(wú)。
-
-
work_dir (str)
:訓(xùn)練模型存放路徑。 -
save_total_limit (int)
:最多保存的模型個(gè)數(shù)(超過(guò)數(shù)目則刪除舊的模型)
3. 獎(jiǎng)勵(lì)模型(Reward Model)
3.1 數(shù)據(jù)集準(zhǔn)備
我們準(zhǔn)備 1000 條偏序?qū)ψ鳛槭纠?xùn)練數(shù)據(jù),其中 selected
為優(yōu)勢(shì)樣本,rejected
為劣勢(shì)樣本:
{
"prompt": "下面是一條正面的評(píng)論:",
"selected": "很好用,一瓶都用完了才來(lái)評(píng)價(jià)。",
"rejected": "找了很久大小包裝都沒(méi)找到生產(chǎn)日期。上當(dāng)了。"
}
這個(gè)步驟不再需要數(shù)據(jù)壓縮,因此準(zhǔn)備好上述結(jié)構(gòu)的 .jsonl
文件即可。
3.2 RM 訓(xùn)練
當(dāng)完成上述步驟后就可以開始正式進(jìn)行訓(xùn)練,使用以下命令啟動(dòng)訓(xùn)練:
sh train_multi_node_reward_model.sh \
configs/accelerate_configs/ds_stage1.yaml \
configs/reward_model_configs/llama7b.yaml
注意,所有的訓(xùn)練配置都放在了第 2 個(gè)參數(shù) configs/reward_model_configs/llama.yaml
中,我們挑幾個(gè)重要的參數(shù)介紹。
-
tokenizer_path (str)
:tokenizer 加載路徑。 -
ckpt (str)
:初始 model 加載路徑。 -
train_and_eval (bool)
:該參數(shù)決定了是否在訓(xùn)練中執(zhí)行評(píng)估函數(shù)。 -
img_log_dir (str)
:訓(xùn)練過(guò)程中的 log 圖存放目錄。 -
test_reward_model_acc_files (list)
:acc 測(cè)試文件列表。 -
work_dir (str)
:訓(xùn)練模型存放路徑。 -
save_total_limit (int)
:最多保存的模型個(gè)數(shù)(超過(guò)數(shù)目則刪除舊的模型)
項(xiàng)目鏈接:https://github.com/HarderThenHarder/transformers_tasks/blob/main/LLM/LLMsTrainer/readme.md文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-668699.html
到了這里,關(guān)于精進(jìn)語(yǔ)言模型:探索LLM Training微調(diào)與獎(jiǎng)勵(lì)模型技術(shù)的新途徑的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!