乐趣区

关于人工智能:精进语言模型探索LLM-Training微调与奖励模型技术的新途径

精进语言模型:摸索 LLM Training 微调与处分模型技术的新途径

LLMs Trainer 是一个旨在帮忙人们从零开始训练大模型的仓库,该仓库最早参考自 Open-Llama,并在其根底上进行裁减。

无关 LLM 训练流程的更多细节能够参考【LLM】从零开始训练大模型。

应用仓库之前,请先装置所有须要的依赖:

pip install -r requirements.txt

1. 持续预训练(Continue Pretraining)

持续预训练是指,在一个已有的模型上持续进行预训练加强,通常用于 英文模型的中文加强 或是 畛域数据加强

咱们这里以英文模型 OpenLlama 在中文数据集 MNBVC 中的 大量数据 为例来演示整个流程。

1.1 数据压缩

因为预训练数据集通常比拟宏大,因而先将训练数据进行压缩并流氏读取。

首先,进入到 data 目录:

cd data

找到目录下的 compress_data.py, 在该文件中批改须要压缩的数据门路:

SHARD_SIZE = 10      # 单个文件寄存样本的数量, 示例中应用很小,实在训练能够酌情增大
...

def batch_compress_preatrain_data():
    """批量压缩预训练数据。"""
    source_path = 'shuffled_data/pretrain'                  # 源数据文件
    target_path = 'pretrain_data'                           # 压缩后寄存地址

    files = [                                               # 这三个文件是示例数据
        'MNBVC_news',
        'MNBVC_qa',
        'MNBVC_wiki'
    ]
    ...

if __name__ == '__main__':
    batch_compress_preatrain_data()
    # batch_compress_sft_data()

Notes: 上述的 files 能够在 shuffled_data/pretrain/ 中找到,是咱们筹备的大量示例数据,实在训练中请替换为残缺数据。

data 门路中执行 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 中找到对应的 .jsonl.zst 压缩文件(该门路将在之后的训练中应用)。

1.2 数据源采样比例(可选)

为了更好的进行不同数据源的采样,咱们提供了依照预设比例进行数据采样的性能。

咱们提供了一个可视化工具用于调整不同数据源之间的散布,在 根目录 下应用以下命令启动:

streamlit run utils/sampler_viewer/web.py --server.port 8001

随后在浏览器中拜访 机器 IP:8001 即可关上平台。

咱们查看 data/shuffled_data/pretrain 下各数据的原始文件大小:

-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

并将文件大小依照格局贴到平台中:

调整结束后,复制上图右下角的最终比例,便于后续训练应用。

1.3 词表裁减(可选)

因为原始 Llama 的中文 token 很少,因而咱们能够抉择对原有的 tokenizer 进行词表裁减。

进入到 utils 目录:

cd utils

批改文件 train_tokenizer.py 中的训练数据(咱们应用正式预训练训练数据集作为训练词表的数据集):

...
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",
}

执行完 train_tokenizer.py 后,门路下会呈现训练好的模型 test_tokenizer.model

随后,咱们将训练好的 model 和本来的 llama model 做交融:

python merge_tokenizer.py

你能够应用 这个工具 很不便的对合并好后的 tokenizer 进行可视化。

1.4 均匀初始化 extend token embedding(可选)

为了减小扩大的 token embedding 随机初始化带来模型性能的影响,咱们提供应用将新 token 在原 tokenizer 中的 sub-token embedding 的平均值做为初始化 embedding 的办法。

具体应用办法在 utils/extend_model_token_embeddings.py

1.5 正式训练

当实现上述步骤后就能够开始正式进行训练,应用以下命令启动训练:

sh train_llms.sh configs/accelerate_configs/ds_stage1.yaml \
    configs/pretrain_configs/llama.yaml \
    openlm-research/open_llama_7b_v2

多机多卡则启动:

sh train_multi_node_reward_model.sh configs/accelerate_configs/ds_stage1.yaml \
    configs/pretrain_configs/llama.yaml \
    openlm-research/open_llama_7b_v2

留神,所有的训练配置都放在了第 2 个参数 configs/pretrain_configs/llama.yaml 中,咱们挑几个重要的参数介绍。

  • tokenizer_path (str):tokenizer 加载门路。
  • ckpt (str):初始 model 加载门路。
  • sample_policy_file (str):数据源采样配置文件,若不蕴含这一项则不进行数据源采样。
  • train_and_eval (bool):该参数决定了是否在训练中执行评估函数。
  • img_log_dir (str):训练过程中的 log 图寄存目录。
  • eval_methods (list):应用哪些评估函数,包含:

    • single_choice_eval: 单选题正确率测试(如: C-Eval),评估数据格式参考 eval_data/knowledge/knowledge_and_reasoning.jsonl
    • generation_eval: 生成测试,给定 prompt,测试模型生成能力,评估数据格式参考 eval_data/pretrain/generation_test.jsonl
  • work_dir (str):训练模型寄存门路。
  • save_total_limit (int):最多保留的模型个数(超过数目则删除旧的模型)

2. 指令微调(Instruction Tuning)

咱们筹备了局部 ShareGPT 的数据作为示例数据,咱们仍旧应用 OpenLlama 作为训练的基座模型。

2.1 数据压缩

同预训练一样,咱们先进入到 data 目录:

cd data

找到目录下的 compress_data.py, 在该文件中批改须要压缩的数据门路:

SHARD_SIZE = 10      # 单个文件寄存样本的数量, 示例中应用很小,实在训练能够酌情增大
...

def batch_compress_sft_data():
    """批量压缩 SFT 数据。"""
    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/ 中找到,是咱们筹备的大量示例数据,实在训练中请替换为残缺数据。

data 门路中执行 python compress_data.py, 终端将显示:

processed shuffled_data/sft/sharegpt.jsonl...
total line: 9637
total files: 964

随后可在 sft_data 中找到对应的 .jsonl.zst 压缩文件(该门路将在之后的训练中应用)。

2.2 非凡 token 裁减

受到 ChatML 的启发,咱们须要在原有的 tokenizer 中增加一些 special token 用于对话零碎。

一种最简略的形式是在 tokenizer 门路中找到 special_tokens_map.json 文件,并增加以下内容:

{
    ...                                         # 须要增加的非凡 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 微调训练

当实现上述步骤后就能够开始正式进行训练,应用以下命令启动训练:

sh train_llms.sh configs/accelerate_configs/ds_stage1.yaml \
    configs/sft_configs/llama.yaml \
    openlm-research/open_llama_7b_v2

多机多卡则启动:

sh train_multi_node_reward_model.sh configs/accelerate_configs/ds_stage1.yaml \
    configs/sft_configs/llama.yaml \
    openlm-research/open_llama_7b_v2

留神,所有的训练配置都放在了第 2 个参数 configs/sft_configs/llama.yaml 中,咱们挑几个重要的参数介绍。

  • tokenizer_path (str):tokenizer 加载门路。
  • ckpt (str):初始 model 加载门路。
  • train_and_eval (bool):该参数决定了是否在训练中执行评估函数。
  • img_log_dir (str):训练过程中的 log 图寄存目录。
  • eval_methods (list):应用哪些评估函数,包含:

    • generation_eval: 生成测试,给定 prompt,测试模型生成能力,评估数据格式参考 eval_data/sft/share_gpt_test.jsonl
    • 暂无。
  • work_dir (str):训练模型寄存门路。
  • save_total_limit (int):最多保留的模型个数(超过数目则删除旧的模型)

3. 处分模型(Reward Model)

3.1 数据集筹备

咱们筹备 1000 条偏序对作为示例训练数据,其中 selected 为劣势样本,rejected 为劣势样本:

{
    "prompt": "上面是一条侧面的评论:",
    "selected": "很好用,一瓶都用完了才来评估。",
    "rejected": "找了很久大小包装都没找到生产日期。受骗了。"
}

这个步骤不再须要数据压缩,因而筹备好上述构造的 .jsonl 文件即可。

3.2 RM 训练

当实现上述步骤后就能够开始正式进行训练,应用以下命令启动训练:

sh train_multi_node_reward_model.sh \
    configs/accelerate_configs/ds_stage1.yaml \
    configs/reward_model_configs/llama7b.yaml

留神,所有的训练配置都放在了第 2 个参数 configs/reward_model_configs/llama.yaml 中,咱们挑几个重要的参数介绍。

  • tokenizer_path (str):tokenizer 加载门路。
  • ckpt (str):初始 model 加载门路。
  • train_and_eval (bool):该参数决定了是否在训练中执行评估函数。
  • img_log_dir (str):训练过程中的 log 图寄存目录。
  • test_reward_model_acc_files (list):acc 测试文件列表。
  • work_dir (str):训练模型寄存门路。
  • save_total_limit (int):最多保留的模型个数(超过数目则删除旧的模型)

我的项目链接:https://github.com/HarderThenHarder/transformers_tasks/blob/main/LLM/LLMsTrainer/readme.md

更多优质内容请关注公号:汀丶人工智能;会提供一些相干的资源和优质文章,收费获取浏览。

退出移动版