首页 > 其他分享 >精进语言模型:探索LLM Training微调与奖励模型技术的新途径

精进语言模型:探索LLM Training微调与奖励模型技术的新途径

时间:2023-08-23 17:55:53浏览次数:41  
标签:Training 训练 模型 jsonl MNBVC token LLM configs data

精进语言模型:探索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

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

标签:Training,训练,模型,jsonl,MNBVC,token,LLM,configs,data
From: https://www.cnblogs.com/ting1/p/17652397.html

相关文章

  • 解密Nginx的高性能魔法:事件驱动与异步非阻塞模型
    在现代的Web服务架构中,Nginx已成为不可或缺的一部分,以其出色的性能和高效的事件驱动异步非阻塞模型而闻名。本文将深入探讨Nginx的工作原理,重点介绍其事件驱动与异步非阻塞模型,以及如何利用这些特性来实现高性能的后端服务。Nginx的事件驱动与异步非阻塞模型事件驱动模型Nginx使用......
  • 类和对象(c++对象模型和this指针)
    1.成员变量和成员函数分开储存只有非静态成员变量才属于类的对象上。空对象内存占用空间为1this指针的概念this指针指向被调用的成员函数所属的对象this指针式隐含每个非静态成员函数内的一种指针。this指针不需要定义,直接使用即可。this指针的用途:1.当形参和成员变量同名时,可用thi......
  • 使用 OpenAI GPT 模型的最佳实践
    推荐:使用NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景为了帮助用户获得最佳输出,OpenAI提供了使用GPT模型的最佳实践。这来自体验,因为许多用户不断尝试使用此模型并找到了最有效的方法。在本文中,我将总结使用OpenAIGPT模型应了解的最佳实践。这些做法是什么?让我们进......
  • BFT最前线|字节跳动AI对话产品“豆包”上线!联想集团推出AI大模型训练服务器!雷尼绍推出
    原创|文BFT机器人AI视界TECHNOLOGYNEWS看点1天才少年稚晖君首秀,官宣智元人形机器人!2023年8月18日上午,从华为离职的“天才少年”彭志辉,也是B站硬核科技UP主稚晖君,公布了他所在的智元团队创业半年的成果——名为“远征A1”的人形机器人。它长得像人,身高175cm,重53kg,可以双足行走,......
  • InnoDB 的事务模型
    目录InnoDB事务模型事务隔离级别REPEATABLEREADREADCOMMITTEDREADUNCOMMITTEDSERIALIZABLE不加锁的一致性读取ConsistentNonlockingReads加锁的读取锁定读取示例共享模式读取加锁读取使用NOWAIT和SKIPLOCKED锁定并发读取InnoDB事务模型InnoDB事务模型旨在将多版本(m......
  • Lnton羚通视频算法算力云平台【PyTorch】教程:学习基础知识如何保存和加载模型
    保存和加载模型是指将训练好的神经网络模型保存到文件中,以便在需要时重新加载该模型进行预测、推断或继续训练。保存模型的过程是将模型的参数和其他相关信息(如优化器状态等)保存到文件中。通过保存模型,我们可以在不重新训练的情况下保留模型的状态,方便后续使用。加载模型的过程是从......
  • CUDA -编辑模型
    编程模型可以理解为,我们要用到的语法,内存结构,线程结构等这些我们写程序时我们自己控制的部分,这些部分控制了异构计算设备的工作模式,都是属于编程模型。GPU中大致可以分为:核函数内存管理线程管理流从宏观上我们可以从以下几个环节完成CUDA应用开发:领域层逻辑层硬件层第......
  • 词袋模型、word2vec
    Bag-of-words模型,BOW模型(词袋模型)假定对于一个文档,忽略它的单词顺序和语法、句法等要素,将其仅仅看作是若干个词汇的集合,文档中每个词汇的出现都是独立的,不依赖于其它词汇是否出现。也就是说,文档中任意一个位置出现的任何单词,都不受该文档语意影响而独立选择的。基于词袋模型的文......
  • 轻松玩转70亿参数大模型!借助Walrus在AWS上部署Llama2
    Llama2是Meta的下一代开源大语言模型。它是一系列经过预训练和微调的模型,参数范围从70亿到700亿个。MetaLlama2可免费用于研究和商业用途并且提供了一系列具有不同大小和功能的模型,因此一经发布备受关注。在(之前的文章)中,我们详细地介绍了Llama2的使用和优势以及FAQ。......
  • 轻松玩转70亿参数大模型!借助Walrus在AWS上部署Llama2
    Llama2是Meta的下一代开源大语言模型。它是一系列经过预训练和微调的模型,参数范围从70亿到700亿个。MetaLlama2可免费用于研究和商业用途并且提供了一系列具有不同大小和功能的模型,因此一经发布备受关注。在之前的文章中,我们详细地介绍了Llama2的使用和优势以及FAQ。......