人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载本文聚焦 PaddleNLP 神经语义检索方案slm/applications/neural_search中的排序Rerank环节完整讲解基于 RocketQA 训练的单塔 CrossEncoder 模型在搜索排序阶段的落地流程从技术选型、数据准备、pairwise 训练到 AUC 评估、文本 Pair 相似度预测再到动转静导出与 Paddle ServingPipeline / C 两种方式生产部署。读完本文你将能够基于rocketqa-base-cross-encoder在自有排序数据集上完成训练微调并把训练出的模型部署为可在线调用的重排服务。背景介绍为什么召回之后还需要 CrossEncoder 重排在经典的“召回Recall→ 排序Rank→ 精排”三段式检索架构中召回阶段往往使用双塔Bi-Encoder / Dual Encoder模型对 query 与 doc 分别编码、用向量内积快速筛选出候选集合。这种结构虽然能支撑大规模检索但双塔模型将 query 和 doc 独立编码两者之间缺乏充分的交互排序精度存在上限。本项目中的 CrossEncoder 正是为了解决这一问题它基于 RocketQA 训练的单塔模型在搜索的排序阶段对召回结果进行重新排序。单塔模型将 query 与 title 拼接后一同送入 Transformer 编码让两者在自注意力层中充分交互从而得到更精细的语义匹配信号显著提升排序效果。在 PaddleNLP 仓库中该示例位于 slm/applications/neural_search/ranking/cross_encoder与同目录下的 ernie_matching基于 ERNIE-Gram 的排序方案共同构成了 PaddleNLP 语义检索的排序模块示例。1. 技术方案与评估指标技术方案加载基于 ERNIE 3.0 训练过的 RocketQA 单塔 CrossEncoder 模型即rocketqa-base-cross-encoder。从实现上看该方案将训练建模为二分类任务通过 AutoModelForSequenceClassification 加载预训练模型并设置num_classes2将文本 Pair 编码为[CLS] query [SEP] title [SEP]的形式详见 data.py 中convert_example的实现二分类的 logits 经F.softmax后取正类概率即作为该 Pair 的语义相似度得分。这也正是 CrossEncoder 与双塔召回模型的核心区别在编码阶段就让 query 与 title 直接交互。评估指标1采用AUC指标来评估排序模型的排序效果。AUCArea Under the ROC Curve衡量的是模型对正负样本排序能力的整体水平与排序任务的“把相关文档排到前面”的目标高度契合。在 evaluate.py 中直接使用paddle.metric.Auc()作为评估指标对 softmax 概率输出与标签做累计更新。效果评估训练方式模型AUCpairwiseERNIE-Gram0.801CrossEncoderrocketqa-base-cross-encoder0.835从对比可以看出在同一排序数据集上CrossEncoder 方案AUC 0.835相比 pairwise 训练的 ERNIE-Gram 排序模型AUC 0.801有约 3.4 个百分点的提升体现了单塔交互式编码在精排任务上的优势。2. 环境依赖和安装说明运行本示例需要以下环境python 3.7paddlepaddle 2.3.7paddlenlp 2.3pandas 0.25.1scipy 1.3.1注scipy主要用于部署环节 Pipeline 服务端 web_service.py 中对模型输出做softmax计算若仅使用单机预测则依赖会更轻。训练与评估代码中主要使用paddle生态paddlenlp.transformers、paddlenlp.data、paddlenlp.datasets。3. 代码结构以下是本项目主要代码结构及说明对应仓库目录 slm/applications/neural_search/ranking/cross_encodercross_encoder/ ├── deploy # 部署 │ ├── cpp │ │ ├── rpc_client.py # RPC 客户端的 bash 脚本 │ │ ├── http_client.py # http 客户端的 bash 文件 │ │ └── start_server.sh # 启动 C 服务的脚本 │ └── python │ ├── deploy.sh # 预测部署 bash 脚本 │ ├── config_nlp.yml # Pipeline 的配置文件 │ ├── web_service.py # Pipeline 服务端的脚本 │ ├── rpc_client.py # Pipeline RPC 客户端的脚本 │ └── predict.py # python 预测部署示例 ├── scripts │ ├── export_model.sh # 动态图参数导出静态图参数的 bash 文件 │ ├── export_to_serving.sh # 导出 Paddle Serving 模型格式的 bash 文件 │ ├── train_ce.sh # 匹配模型训练的 bash 文件 │ ├── evaluate_ce.sh # 评估验证文件 bash 脚本 │ └── predict_ce.sh # 匹配模型预测脚本的 bash 文件 ├── export_model.py # 动态图参数导出静态图参数脚本 ├── export_to_serving.py # 导出 Paddle Serving 模型格式的脚本 ├── data.py # 训练样本的转换逻辑 ├── train_ce.py # 模型训练脚本 ├── evaluate.py # 评估验证文件 └── predict.py # Pair-wise 模型预测脚本输出文本对的相似度其中data.py是整个数据流转的中枢read_data负责读取训练/验证集的 tab 分隔文件并产出{text_a, text_b, label}样本read_text_pair负责读取预测阶段的纯文本 Pair不含标签convert_example完成 tokenizer 编码create_dataloader封装了DistributedBatchSampler训练时支持分布式采样与DataLoader的构建详见 data.py。4. 数据准备数据集说明排序模型的训练数据是 tab 分隔的三列文本每行代表一个query \t title \t label的文本 Pair其中 label 为 0/1表示该 title 是否与 query 相关。样例数据如下(小学数学教材比较) 关键词:新加坡 新加坡与中国数学教材的特色比较数学教材,教材比较,问题解决 0 徐慧新疆肿瘤医院 头颈部非霍奇金淋巴瘤扩散加权成像ADC值与Ki-67表达相关性分析淋巴瘤,非霍奇金,头颈部肿瘤,磁共振成像 1 抗生素关性腹泻 鼠李糖乳杆菌GG防治消化系统疾病的研究进展鼠李糖乳杆菌,腹泻,功能性胃肠病,肝脏疾病,幽门螺杆菌 0 德州市图书馆 图书馆智慧化建设与融合创新服务研究图书馆;智慧化;阅读服务;融合创新 1 维生素c 综述 维生素C防治2型糖尿病研究进展维生素C;2型糖尿病;氧化应激;自由基;抗氧化剂 0 (白藜芦醇) 关键词:2型糖尿病 2型糖尿病大鼠心肌缺血再灌注损伤转录因子E2相关因子2/血红素氧合酶1信号通路的表达及白藜芦醇的干预研究糖尿病,2型,心肌缺血,再灌注损伤,白藜芦醇 1 融资偏好 创新型企业产业风险、融资偏好与融资选择融资偏好;产业风险;融资选择 1 星载激光雷达 星载激光雷达望远镜主镜超轻量化结构设计超轻量化;拓扑优化;集成优化;RMS;有限元仿真 1数据读取逻辑参见 data.py 中的read_data会跳过首行表头按\t切分并校验必须是 3 列将首列作为text_aquery、次列作为text_btitle、末列作为 int 型label。数据集下载下载 literature_search_rank 排序数据集解压后目录结构如下├── data # 排序数据集 ├── test.csv # 测试集 ├── dev_pairwise.csv # 验证集 └── train.csv # 训练集下载数据集并解压到当前目录wget https://bj.bcebos.com/v1/paddlenlp/data/literature_search_data.zip unzip literature_search_data.zip5. 模型训练排序模型下载链接Model训练参数配置硬件MD5ERNIE-Gram-Sortepoch:3 lr:5E-5 bs:64 max_len:644卡 v100-16gd24ece68b7c3626ce6a24baa58dd297d训练环境说明NVIDIA Driver Version: 440.64.00Ubuntu 16.04.6 LTS (Docker)Intel(R) Xeon(R) Gold 6148 CPU 2.40GHz单机单卡训练 / 单机多卡训练这里采用单机多卡方式进行训练通过如下命令指定 GPU 0,1,2,3 四张卡。如果采用单机单卡训练只需要把--gpus参数设置成单卡的卡号即可例如--gpus 0。训练的命令如下unset CUDA_VISIBLE_DEVICES python -u -m paddle.distributed.launch --gpus 0,1,2,3 --log_dirlogs train_ce.py \ --device gpu \ --train_set data/train.csv \ --test_file data/dev_pairwise.csv \ --save_dir ./checkpoints \ --model_name_or_path rocketqa-base-cross-encoder \ --batch_size 32 \ --save_steps 10000 \ --max_seq_len 384 \ --learning_rate 1E-5 \ --weight_decay 0.01 \ --warmup_proportion 0.0 \ --logging_steps 10 \ --seed 1 \ --epochs 3 \ --eval_step 1000也可以运行 bash 脚本sh scripts/train_ce.sh参数名提示上述 README 命令中的--max_seq_len在训练脚本 train_ce.py 的 argparse 定义中实际为--max_seq_length默认值 128执行前请按源码定义统一参数名避免命令行解析报错。训练参数与源码实现解析训练脚本 train_ce.py 中 argparse 定义的核心参数及其默认值如下参数默认值说明--save_dir./checkpoint模型 checkpoint 输出目录--train_set必填训练集文件完整路径--test_file必填验证集文件完整路径用于训练中周期性评估--max_seq_length128tokenize 后的最大输入长度超长截断、不足补齐--batch_size32每张 GPU/CPU 上的 batch 大小--learning_rate5e-5Adam 初始学习率--weight_decay0.0权重衰减系数--epochs3训练总轮数--warmup_proportion0.0训练过程线性 warmup 比例--valid_steps100评估间隔保留参数实际评估步长以--eval_step为准--save_steps100保存 checkpoint 的步数间隔--logging_steps10日志打印步数间隔--init_from_ckptNone预加载的 checkpoint 路径--seed1000随机种子--devicegpu可选 cpu / gpu / xpu / npu--use_ampFalse是否开启混合精度训练--scale_loss2**15fp16 混合精度的 loss 缩放值--model_name_or_pathrocketqa-base-cross-encoder使用的预训练模型--eval_step200训练中执行验证评估的步长间隔从源码可以梳理出训练的完整调用链train_ce.py数据集构建load_dataset(read_data, ...)加载训练/验证集convert_example通过AutoTokenizer将文本 Pair 编码为input_ids与token_type_idsbatchify_fn用Pad做按 batch 对齐填充、Stack堆叠标签模型加载AutoModelForSequenceClassification.from_pretrained(..., num_classes2)加载预训练模型并接 2 分类头分布式训练paddle.distributed.launch拉起多卡进程paddle.DataParallel(model)包装模型DistributedBatchSampler按卡数切分数据max_train_steps epochs * 样本数 // batch_size // 卡数优化器AdamW优化器对 bias 与 LayerNorm 参数不做权重衰减apply_decay_param_fun过滤并叠加ClipGradByGlobalNorm(1.0)全局梯度裁剪这对稳定训练很重要损失与指标CrossEntropyLoss计算分类损失paddle.metric.Auc()在--eval_step间隔对验证集计算 AUC并按--save_steps间隔保存model_state.pdparams与 tokenizer 到save_dir/model_global_step/目录。6. 评估训练完成后使用验证集对 checkpoint 进行 AUC 评估python evaluate.py --model_name_or_path rocketqa-base-cross-encoder \ --init_from_ckpt checkpoints/model_80000/model_state.pdparams \ --test_file data/dev_pairwise.csv也可以运行 bash 脚本sh scripts/evaluate_ce.sh成功运行后会输出下面的指标eval_dev auc:0.829评估脚本 evaluate.py 的实现要点模型加载后调用model.set_dict(state_dict)载入 checkpoint 权重若未指定--init_from_ckpt会直接raise ValueError提示推理在paddle.no_grad()下进行模型输出 logits 经F.softmax转为概率后喂给paddle.metric.Auc()最终打印eval_dev auc:xxx。若想评估自己微调过的模型将--init_from_ckpt指向对应 checkpoint 即可。7. 预测准备预测数据待预测数据为 tab 分隔的 tsv 文件每一行为 1 个文本 Pair 及其语义索引相似度该相似度由召回模型算出仅供参考预测脚本实际只取前两列文本部分示例如下中西方语言与文化的差异 第二语言习得的一大障碍就是文化差异。 0.5160342454910278 中西方语言与文化的差异 跨文化视角下中国文化对外传播路径琐谈跨文化,中国文化,传播,翻译 0.5145505666732788 中西方语言与文化的差异 从中西方民族文化心理的差异看英汉翻译语言,文化,民族文化心理,思维方式,翻译 0.5141439437866211 中西方语言与文化的差异 中英文化差异对翻译的影响中英文化,差异,翻译的影响 0.5138794183731079 中西方语言与文化的差异 浅谈文化与语言习得文化,语言,文化与语言的关系,文化与语言习得意识,跨文化交际 0.5131710171699524预测阶段的数据读取走 data.py 中的read_text_pair按\t切分为 3 列并产出{text_a, text_b}标签列被忽略。开始预测以上述 demo 数据为例运行如下命令基于开源的 rocketqa 模型计算文本 Pair 的语义相似度unset CUDA_VISIBLE_DEVICES python predict.py \ --device gpu \ --params_path checkpoints/model_80000/model_state.pdparams \ --model_name_or_path rocketqa-base-cross-encoder \ --test_set data/test.csv \ --topk 10 \ --batch_size 128 \ --max_seq_length 384也可以直接执行下面的命令sh scripts/predict_ce.sh得到下面的输出分别是 query、title 和对应的预测概率按概率降序取 topk{text_a: 加强科研项目管理有效促进医学科研工作, text_b: 高校\\十四五\\规划中学科建设要处理好五对关系\\十四五\\规划,学科建设,科技创新,人才培养, pred_prob: 0.7076062} {text_a: 加强科研项目管理有效促进医学科研工作, text_b: 校企科研合作项目管理模式创新校企科研合作项目,管理模式,问题,创新, pred_prob: 0.64633846} {text_a: 加强科研项目管理有效促进医学科研工作, text_b: 科研项目管理策略科研项目,项目管理,实施,必要性,策略, pred_prob: 0.63166416} {text_a: 加强科研项目管理有效促进医学科研工作, text_b: 高校科研项目经费管理流程优化研究——以z大学为例高校,科研项目经费\\全流程\\管理,流程优化, pred_prob: 0.60351866} {text_a: 加强科研项目管理有效促进医学科研工作, text_b: 关于推进我院科研发展进程的相关问题研究医院科研,主体,环境,信息化, pred_prob: 0.5688347} {text_a: 加强科研项目管理有效促进医学科研工作, text_b: 医学临床科研选题原则和方法医学临床,科学研究,选题, pred_prob: 0.55190295}预测脚本 predict.py 的核心逻辑通过read_text_pair读取测试 Pairconvert_example(..., is_testTrue)编码为不含标签的输入predict()函数对模型输出的 logits 做F.softmax并取probs[:, 1]正类概率作为相似度分数最后将所有 Pair 按pred_prob降序排列输出前--topk条。这里--topk的作用就是模拟“对召回候选集重排后取前 N 条精排结果”。8. 部署动转静导出首先把动态图模型转换为静态图推理图python export_model.py \ --params_path checkpoints/model_80000/model_state.pdparams \ --model_name_or_path rocketqa-base-cross-encoder \ --output_path./output也可以运行下面的 bash 脚本sh scripts/export_model.sh导出脚本 export_model.py 使用paddle.jit.to_static将动态图模型转换为静态图通过input_spec声明input_ids与segment_ids两个[None, None]的 int64 输入batch 维与序列长度维均不固定转换完成后用paddle.jit.save保存输出目录./output下将生成inference.pdmodel与inference.pdiparams静态图文件。Paddle Inference使用 PaddleInference 进行本地推理部署python deploy/python/predict.py --model_dir ./output \ --input_file data/test.csv \ --model_name_or_path rocketqa-base-cross-encoder也可以运行下面的 bash 脚本sh deploy/python/deploy.sh得到下面的输出输出的是样本的 query、title 以及对应的概率Data: {query: 加强科研项目管理有效促进医学科研工作, title: 科研项目管理策略科研项目,项目管理,实施,必要性,策略} prob: 0.5479063987731934 Data: {query: 加强科研项目管理有效促进医学科研工作, title: 关于推进我院科研发展进程的相关问题研究医院科研,主体,环境,信息化} prob: 0.5151925086975098 Data: {query: 加强科研项目管理有效促进医学科研工作, title: 深圳科技计划对高校科研项目资助现状分析与思考基础研究,高校,科技计划,科技创新} prob: 0.42983829975128174 Data: {query: 加强科研项目管理有效促进医学科研工作, title: 普通高校科研管理模式的优化与创新普通高校,科研,科研管理} prob: 0.465454638004303Paddle Inference 使用静态图模型在进程内完成预测适合离线批量重排或与检索服务同进程集成的场景相比动态图推理延迟更低、吞吐更高。Paddle Serving 部署Paddle Serving 的详细设计文档请参考 Pipeline 与 Serving 设计文档见原 README 的 Reference 说明。部署的第一步是把静态图模型转换成 Serving 的格式python export_to_serving.py \ --dirname output \ --model_filename inference.pdmodel \ --params_filename inference.pdiparams \ --server_path serving_server \ --client_path serving_client \ --fetch_alias_names predict参数含义说明dirname: 需要转换的模型文件存储路径Program 结构文件和参数文件均保存在此目录。model_filename存储需要转换的模型 Inference Program 结构的文件名称。如果设置为 None则使用__model__作为默认的文件名。如果启用了 PIR则有可能为.json文件请注意鉴别。params_filename: 存储需要转换的模型所有参数的文件名称。当且仅当所有模型参数被保存在一个单独的二进制文件中它才需要被指定。如果模型参数是存储在各自分离的文件中设置它的值为 None。server_path: 转换后的模型文件和配置文件的存储路径。默认值为 serving_server。client_path: 转换后的客户端配置文件存储路径。默认值为 serving_client。fetch_alias_names: 模型输出的别名设置比如输入的 input_ids 等都可以指定成其他名字默认不指定。feed_alias_names: 模型输入的别名设置比如输出 pooled_out 等都可以重新指定成其他名字默认不指定。也可以运行下面的 bash 脚本sh scripts/export_to_serving.sh该转换由 export_to_serving.py 调用paddle_serving_client.io.inference_model_to_serving完成会分别产出serving_server服务端模型与配置与serving_client客户端配置两个目录其中通过--fetch_alias_names predict为模型输出取了别名predict后续 Pipeline 服务端的postprocess正是通过fetch_dict[predict]取到模型输出见 web_service.py。Paddle Serving 的部署有两种方式第一种方式是Pipeline 方式Python 图编排灵活易改第二种是C 方式性能更优下面分别介绍。Pipeline 方式修改对应预训练模型的Tokenizerself.tokenizer AutoTokenizer.from_pretrained(rocketqa-base-cross-encoder)启动 Pipeline Serverpython web_service.pyPipeline 服务端 web_service.py 的核心结构ErnieOp在init_op中加载rocketqa-base-cross-encoder的 tokenizerpreprocess阶段解析 JSON 格式的 query/title 输入经convert_example编码并Pad成 batch构造input_ids与token_type_ids的 feed dictpostprocess阶段对模型输出fetch_dict[predict]做scipy.special.softmax并取第 1 列正类概率返回。服务配置见 config_nlp.ymlHTTP 端口8088、RPC 端口8089op.ernie.local_service_conf中client_type: local_predictor表示进程内直接加载serving_server静态图模型预测device_type: 1表示 GPUdevices: 0指定第 0 张卡fetch_list: [predict]指定返回模型的 predict 输出。启动客户端调用 Server。首先修改 rpc_client.py 中需要预测的样本list_data [{query:加强科研项目管理有效促进医学科研工作,title:科研项目管理策略科研项目,项目管理,实施,必要性,策略}]然后运行python rpc_client.py模型的输出为PipelineClient::predict pack_data time:1662354188.422532 PipelineClient::predict before time:1662354188.423034 time to cost :0.016808509826660156 seconds (1,) [0.5479064]可以看到客户端发送了 1 条文本返回该条文本 Pair 的相似概率值。从客户端源码可以看到PipelineClient连接的是127.0.0.1:8089RPC 端口以{str(i): str(item)}的 feed dict 形式提交样本并解析返回数组。C 的方式启动 C 的 Servingpython -m paddle_serving_server.serve --model serving_server --port 8600 --gpu_id 0 --thread 5 --ir_optim True也可以使用脚本sh deploy/cpp/start_server.shClient 可以使用 http 或者 rpc 两种方式rpc 的方式为python deploy/cpp/rpc_client.py运行的输出为I0905 05:38:28.876770 28507 general_model.cpp:490] [client]logid0,client_cost158.124ms,server_cost156.385ms. time to cost :0.15848731994628906 seconds [0.54790646]可以看到服务端返回了相似度结果。或者使用 http 的客户端访问模式python deploy/cpp/http_client.py运行的输出为time to cost :0.13054680824279785 seconds 0.5479064707850817可以看到服务端返回了相似度结果。C Serving 通过paddle_serving_server.serve直接加载serving_server目录启动独立服务进程rpc_client 与 http_client 分别演示了两种客户端调用协议相比 Pipeline 方式C 部署省去了 Python 编排层的开销适合高并发线上环境。参考资料[1] Xiao, Dongling, Yu-Kun Li, Han Zhang, Yu Sun, Hao Tian, Hua Wu, and Haifeng Wang. ERNIE-Gram: Pre-Training with Explicitly N-Gram Masked Language Modeling for Natural Language Understanding. ArXiv:2010.12148 [Cs].[2] Yingqi Qu, Yuchen Ding, Jing Liu, Kai Liu, Ruiyang Ren, Wayne Xin Zhao, Daxiang Dong, Hua Wu, Haifeng Wang: RocketQA: An Optimized Training Approach to Dense Passage Retrieval for Open-Domain Question Answering. NAACL-HLT 2021: 5835-5847赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐游戏 DLSS 版本怎么换、怎么回退DLSS Swapper 完整教程游戏 DLSS 版本怎么换、怎么回退DLSS Swapper 完整教程 游戏更新后塞来一个新 DLSS 版本画面开始闪你又不想动游戏目录里的文件。DLSS桌面应用PaddleNLP 语义召回实践基于 SimCSE 的无监督语义索引模型训练、评估与部署PaddleNLP 语义召回实践基于 SimCSE 的无监督语义索引模型训练、评估与部署 语义索引又称向量索引是搜索引擎、推荐系统、广告系统在召回阶段的核人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPinsightface 基于 PaddlePaddle 的 BlazeFace 人脸检测实战训练、WIDER-FACE 评估与部署全流程解析insightface 基于 PaddlePaddle 的 BlazeFace 人脸检测实战训练、WIDER FACE 评估与部署全流程解析 Arcface人工智能计算机视觉深度学习上一篇终极指南CubiFS元数据一致性修复流程详解下一篇capa 能力识别工具的使用局限与规避指南打包、安装器、包装函数与循环作用域创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考