GPT-3 SFT微调模型-中文-1.3B

我要开发同款
匿名用户2024年07月31日
66阅读

技术信息

开源地址
https://modelscope.cn/models/iic/nlp_gpt3_sft_text-generation_1.3B
授权协议
Apache License 2.0

作品详情

GPT3 SFT微调中文1.3B参数量文本生成模型

本模型在中文GPT-3 1.3B预训练模型的基础上,通过有监督的sft数据训练得到,具备更强的通用生成能力,对话能力等。目前模型可以支持单轮对话,多轮对话,知识增强等不同输入模式。

模型描述

GPT-3模型使用Trasformer的Decoder结构,并对Trasformer Decoder进行了一些改动,原本的Decoder包含了两个 Multi-Head Attetio 结构,GPT-3只保留了 Mask Multi-Head Attetio,利用常规的语言建模优化,从左到右的自回归预训练。本模型是基于GPT-3的代码结合大量中文无监督数据和下游任务数据预训练得到,我们训练了多种不同参数的模型 ,GPT-3模型介绍,详见:Laguage Models are Few-Shot Learers

本项目我们复现了一系列不同规模的中文GPT3模型,包括base/large/1.3B/2.7B/13B/30B/175B等,以及推出基于不同规模模型训练得到的sft微调版本模型,本模型是其中1.3B的版本。全部版本如下表所示:

Model Layers Heads d_model LR Batch
base 12 12 768 6.0e-4 0.5M
large 24 16 1024 3.0e-4 0.5M
1.3B 24 32 2048 2.0e-4 2M
2.7B 32 32 2560 1.6e-4 2M
13B 40 40 5120 1.0e-4 6M
30B 48 56 7168 1.0e-4 6M
175B(work i process) 96 96 12288 1.2e-4 6M

期望模型使用方式以及适用范围

本模型可直接用于文本生成,也可以通过fietue用于各类文本理解的任务。用户可以自行尝试各种输入文档。具体调用方式请参考代码示例。

如何使用

在安装完成ModelScope library之后即可使用GPT-3的text-geeratio的能力。目前我们免费提供试用的Notebook环境,使用的是单卡GPU,由于显存限制仅可以运行pipelie推理,如果用户在使用Notebook环境时想要运行训练,推荐使用更小规模的large/base版本

代码范例

from modelscope.pipelies import pipelie
from modelscope.utils.costat import Tasks

if __ame__ == '__mai__':
    model_id = 'damo/lp_gpt3_sft_text-geeratio_1.3B'
    pipe = pipelie(Tasks.text_geeratio, model=model_id, model_revisio='v1.0.2')

    # 可以在 pipe 中输入 max_legth, top_k, top_p, temperature 等生成参数

    # 不包含对话历史输入
    iput = '当前输入:以AIGC技术未来有广阔的应用场景为题写一篇文章\当前输出:'
    prit(pipe(iput, max_legth=1024, top_k=10, temperature=0.7, top_p=0.0))

    # 包含对话历史输入,支持3轮历史
    iput = '输入:你叫什么名字?\输出:我的名字是AliceMid</s>\输入:你能做什么\输出:我能写作文,写小说等一系列生成能力</s>\当前输入:以AIGC技术未来有广阔的应用场景为题写一篇文章\当前输出:'
    prit(pipe(iput, max_legth=1024, top_k=10, temperature=0.7, top_p=0.0))

    # 支持增加检索知识提升性能
    kow_list = [
    '《狂飙》由徐纪周执导的。《狂飙》的导演徐纪周也是编剧之一,代表作品有《永不磨灭的番号》《特战荣耀》《心理罪之城市之光》《杀虎口》《胭脂》等',
    '《狂飙》(The Kockout)是一部由 张译、张颂文、李一桐、张志坚 领衔主演,韩童生 特邀主演,吴健、郝平 友情出演,高叶、贾冰、李健 主演,徐纪周 执导,朱俊懿、徐纪周 担任总编剧的 刑侦',
    ' 狂飙是由中央政法委宣传教育局,中央政法委政法信息中心指导,爱奇艺,留白影视出品,徐纪周执导,张译,李一桐,张志坚领衔主演的刑侦剧。不是。是徐纪周,1976年12月19日出生,毕业于中央戏剧'
    ]
    iput = '检索知识:' + '\'.joi(kow_list) + '\当前输入:狂飙的导演是谁\当前输出:'
    prit(pipe(iput, max_legth=1024, top_k=10, temperature=0.7, top_p=0.0))

模型局限性以及可能的偏差

模型训练数据来源于网络,生成结果可能存在一定偏差。

训练数据介绍

训练数据包括中文维基百科、网络上公开文本数据。

模型训练流程

本模型的预训练分为两个阶段。第一阶段严格按照原始GPT3的参数设置进行:在中文wiki/ Commo crawl等无监督数据上,通过自回归的训练任务训练了约300B字得到。第二阶段中,我们加入了多种有监督数据继续训练,使得模型具备多种任务的zero-shot的处理能力。

我们为GPT3模型支持了续写训练与输入输出形式的训练,训练方式不需要额外指定,训练数据集仅包含 srctxt 时会进行续写训练,同时包含 srctxt 和 tgt_txt 时会进行输入输出形式的训练。以下将为两种训练方式提供示例代码。

训练准备(重要)

目前对于GPT3 1.3B/2.7B 两个模型我们在训练阶段支持了运行时的模型自动拆分功能,因此不需要使用与训练tesor并行度匹配的checkpoit即可开始训练。需要注意的是,当使用并行训练时,务必提前在cofiguratio.jso中确认以下参数配置正确:

"megatro": {
    "checkpoit_tesor_model_parallel_size": 1, # 对应checkpoit的并行片数,在1.3B/2.7B模型中为1
    "world_size": 1, # 全局的并行进程数
    "tesor_model_parallel_size": 1 # tesor 并行度
}

以单机8卡训练,2的数据并行度和4的tesor并行度(2dp+4tp)为例:

# 训练启动命令
torchru --proc_per_ode 8 fietue_dureader.py # 这里的8是启动进程数,为dp*tp的值(2*4=8),单机训练时对应配置文件中的world_size
# 无需配置数据并行度,会根据`world_size/tesor_model_parallel_size`计算
# 此时的正确配置
"megatro": {
    "checkpoit_tesor_model_parallel_size": 1, # 使用modelscope上传的checkpoit时无需修改
    "world_size": 8, # 此处对应上文的启动进程数proc_per_ode,如果使用其他方式启动多进程训练同理
    "tesor_model_parallel_size": 2 # 训练使用的 tesor 并行度
}

输入输出形式训练

下面是基于GPT-3中文1.3B模型在Dureader问题生成数据集上二次开发训练

# fietue_dureader.py
from torch.utils.tesorboard import SummaryWriter
from modelscope.msdatasets import MsDataset
from modelscope.traiers import build_traier
from modelscope.metaifo import Traiers


dataset_dict = MsDataset.load('DuReader_robust-QG')

trai_dataset = dataset_dict['trai'].remap_colums({'text1': 'src_txt', 'text2': 'tgt_txt'}) \
    .map(lambda example: {'src_txt': example['src_txt'] + '\'})
eval_dataset = dataset_dict['validatio'].remap_colums({'text1': 'src_txt', 'text2': 'tgt_txt'}) \
    .map(lambda example: {'src_txt': example['src_txt'] + '\'})

# 用户自己数据集构造
# trai_dataset_dict = {"src_txt": ["iput1", "iput2"], "tgt_txt": ["output1", "output2"]}
# eval_dataset_dict = {"src_txt": ["iput1", "iput2"], "tgt_txt": ["output1", "output2"]}
# trai_dataset = MsDataset(Dataset.from_dict(trai_dataset_dict))
# eval_dataset = MsDataset(Dataset.from_dict(eval_dataset_dict))

max_epochs = 10

tmp_dir = './gpt3_dureader'

um_warmup_steps = 200

def oam_lambda(curret_step: it):
    curret_step += 1
    retur mi(curret_step**(-0.5),
               curret_step * um_warmup_steps**(-1.5))

def cfg_modify_f(cfg):
    cfg.trai.lr_scheduler = {
        'type': 'LambdaLR',
        'lr_lambda': oam_lambda,
        'optios': {
            'by_epoch': False
        }
    }
    cfg.trai.optimizer = {'type': 'AdamW', 'lr': 1e-4}
    cfg.trai.dataloader = {
        'batch_size_per_gpu': 4,
        'workers_per_gpu': 1
    }
    cfg.trai.hooks.apped({
        'type': 'MegatroHook'
    })
    cfg.preprocessor.sequece_legth = 1024
    cfg.model.checkpoit_model_parallel_size = 1
    retur cfg

kwargs = dict(
    model='damo/lp_gpt3_sft_text-geeratio_1.3B',
    trai_dataset=trai_dataset,
    eval_dataset=eval_dataset,
    max_epochs=max_epochs,
    work_dir=tmp_dir,
    cfg_modify_f=cfg_modify_f)

traier = build_traier(
    ame=Traiers.gpt3_traier, default_args=kwargs)
traier.trai()

以上为数据并行度为1的训练脚本,我们推荐使用 torchru 拉起训练

单机单卡或单机多卡运行时,可以通过以下命令运行训练:

# N 为模型并行度
torchru --proc_per_ode $N fietue_dureader.py

需要注意,目前1.3B参数量的GPT-3模型训练至少需要32G显存的gpu(如V100)才能进行单卡训练,或至少需要两张16G显存的gpu进行张量并行训练

推理加速

我们对大规模生成模型的推理速度进行了极致优化,13B模型128字的文本生成可以在1秒左右完成。

数据评估及结果

相关引用

我们将尽快推出本项目的技术报告,敬请期待!

功能介绍

GPT3 SFT微调中文1.3B参数量文本生成模型 本模型在中文GPT-3 1.3B预训练模型的基础上,通过有监督的sft数据训练得到,具备更强的通用生成能力,对话能力等。目前模型可以支持单轮对话,多

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论