- 人工智能
- 大模型
- 微调
- 模型推理服务
【免费下载链接】PaddleFormers
PaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.
导读
本文以 PaddleFormers 仓库中的 ernie_tiny 模型文档 为核心,结合其 module.py 源码实现,系统讲解基于 PaddlePaddle/PaddleHub 的 ERNIE-Tiny 语义理解模型的完整使用链路:环境安装、模型加载与预测 API、三类下游任务(文本分类、序列标注、文本匹配)的 Fine-tuning、Embedding 特征抽取,以及基于 PaddleHub Serving 的在线服务化部署。读完本文,你将能独立完成从"hub 安装一个预训练模型"到"训练自己的分类器并对外提供 HTTP 预测服务"的完整闭环。
一、ERNIE-Tiny 模型概述
1.1 模型基本信息
| 模型名称 | ernie_tiny |
|---|---|
| 类别 | 文本-语义模型 |
| 网络 | ernie_tiny |
| 数据集 | 百度自建数据集 |
| 是否支持 Fine-tuning | 是 |
| 模型大小 | 346MB |
| 最新更新日期 | 2021-02-26 |
| 数据指标 | - |
ERNIE(Enhanced Representation through kNowledge IntEgration)是百度提出的基于知识增强的持续学习语义理解模型。其核心思路是把大数据预训练与多源丰富知识相结合,通过持续学习技术不断吸收海量文本数据中词汇、结构、语义等方面的知识,使模型效果持续进化。ERNIE-Tiny 是其中的轻量级版本,在保持语义理解能力的同时减小了模型体积(约 346MB),并支持max_seq_len=512的输入序列长度(见 module.py 中 moduleinfo 的 summary 字段),更适合在资源受限场景下进行微调与推理。
1.2 在仓库中的实现位置
本模块在仓库中的代码结构为:
- modules/text/language_model/ernie_tiny/README.md:模型使用文档(本文主体)
- modules/text/language_model/ernie_tiny/module.py:模块核心实现,定义了
ErnieTiny(nn.Layer)类 - modules/text/language_model/ernie_tiny/init.py:包初始化文件
从源码看,ErnieTiny类通过@moduleinfo装饰器注册到 PaddleHub 模块系统中,meta=TransformerModule表明它继承 paddlehub/module/nlp_module.py 中TransformerModule(RunModule+TextServing)的能力,因此天然支持predict、get_embedding、Fine-tuning 训练步骤(training_step/validation_step)以及 Serving 服务化。
模型底层基于 PaddleNLP 的预训练实现:
from paddlenlp.transformers.ernie.modeling import ErnieModel, ErnieForSequenceClassification, ErnieForTokenClassification from paddlenlp.transformers.ernie.tokenizer import ErnieTinyTokenizer对应地,get_tokenizer静态方法返回的是ErnieTinyTokenizer.from_pretrained(pretrained_model_name_or_path='ernie-tiny'),这是 ERNIE-Tiny 专属的轻量化分词器。
二、环境准备与模型安装
2.1 环境依赖
使用 ernie_tiny 模块前,需要满足以下版本要求:
paddlepaddle >= 2.0.0(动态图版本)paddlehub >= 2.0.0
PaddleHub 的完整安装指引见 安装文档;若在安装或运行中遇到问题,可分别参考 零基础 Windows 安装、零基础 Linux 安装、零基础 MacOS 安装。
2.2 安装模型模块
$ hub install ernie_tiny如果需要指定版本安装(例如文档中 2.0.2 版本新增了文本匹配任务text-matching),可以使用:
$ hub install ernie_tiny==2.0.2hub install会从 PaddleHub 模型仓库拉取该模块的代码与预训练权重并注册到本地环境,之后即可在 Python 中以hub.Module(name='ernie_tiny', ...)方式加载。
提示:ERNIE-Tiny 属于 Transformer 类 NLP 模块,实际推理时的权重与分词器资源由 PaddleNLP 的
from_pretrained机制统一管理,首次使用时会在~/.paddlehub与 PaddleNLP 缓存目录中自动下载,可参考 nlp_module.py 中 PretrainedModel.from_pretrained 的下载与缓存逻辑。
三、模型 API 预测
3.1 预测代码示例
ERNIE-Tiny 模块既可以加载预训练参数直接做特征抽取,也可以加载 Fine-tuning 得到的模型参数做下游任务预测。以下示例演示用文本分类任务(情感二分类)进行预测:
import paddlehub as hub data = [ ['这个宾馆比较陈旧了,特价的房间也很一般。总体来说一般'], ['怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片'], ['作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间。'], ] label_map = {0: 'negative', 1: 'positive'} model = hub.Module( name='ernie_tiny', version='2.0.2', task='seq-cls', load_checkpoint='/path/to/parameters', label_map=label_map) results = model.predict(data, max_seq_len=50, batch_size=1, use_gpu=False) for idx, text in enumerate(data): print('Data: {} \t Lable: {}'.format(text, results[idx]))对应的完整可运行示例代码位于仓库的 demo/text_classification/train.py(训练侧)与 demo/text_classification/predict.py(预测侧),序列标注场景可参考 demo/sequence_labeling/train.py 与 demo/sequence_labeling/predict.py。
3.2 构造参数详解:__init__
def __init__( task=None, load_checkpoint=None, label_map=None, num_classes=2, suffix=False, **kwargs, )创建 Module 对象(动态图组网版本),各参数含义如下:
task:任务名称,支持seq-cls(文本分类)、token-cls(序列标注)、text-matching(文本匹配),或传None仅用于获取 Embedding。load_checkpoint:使用 PaddleHub Fine-tune API 训练保存的模型参数文件路径。label_map:预测时的类别映射表(字典形式,如{0: 'negative', 1: 'positive'})。num_classes:分类任务的类别数,如果指定了label_map,此参数可不传,默认 2 分类。suffix:序列标注任务的标签格式,若设为True,标签以-B、-I、-E或-S结尾,默认False。**kwargs:用户额外指定的关键字字典类型参数,会透传给 PaddleNLP 的from_pretrained。
结合 module.py 的源码,可以进一步理解这些参数的底层行为:
- 若传入
label_map,则self.num_classes = len(label_map),即类别数由映射表长度自动推导; task='seq-cls'时组网ErnieForSequenceClassification(预训练名ernie-tiny),损失函数为CrossEntropyLoss,评估指标为paddle.metric.Accuracy;task='token-cls'时组网ErnieForTokenClassification,评估指标为ChunkEvaluator(来自paddlenlp.metrics),它会根据label_map与suffix参数计算序列标注的 F1;task='text-matching'时加载裸ErnieModel,并额外构造Dropout(0.1)与Linear(hidden_size * 3, 2)分类头,实现文本对二分类匹配判断;task=None时只加载ErnieModel,用于输出 Embedding;- 未知任务名会抛出
RuntimeError并提示支持的任务列表; - 若
load_checkpoint指向存在的文件,则用paddle.load读取并set_state_dict恢复参数,随后打印加载日志。
3.3 推理方法详解:predict
def predict( data, max_seq_len=128, batch_size=1, use_gpu=False )参数说明:
data:待预测数据,格式为[[sample_a_text_a, sample_a_text_b], [sample_b_text_a, sample_b_text_b], ...],其中每个元素都是一个样例,每个样例可包含text_a与text_b。每个样例文本数量(1 个或 2 个)需和训练时保持一致。max_seq_len:模型处理文本的最大长度。batch_size:模型批处理大小。use_gpu:是否使用 GPU,默认为False。对于 GPU 用户,建议开启use_gpu。
返回结果results(list 类型),不同任务类型的返回格式不同:
- 文本分类(seq-cls):列表包含每个句子的预测标签,格式为
[label_1, label_2, ...]; - 序列标注(token-cls):列表包含每个句子每个 token 的预测标签,格式为
[[token_1, token_2, ...], [token_1, token_2, ...], ...]。
从 TransformerModule.predict 的实现 可以看到,predict内部会按use_gpu调用paddle.set_device('gpu'/'cpu'),通过_batchify完成分词、编码与按batch_size切批(_convert_text_to_input内部对 token-cls 任务会用reseg_token_label处理切分标签),前向计算后取softmax概率的argmax,再经label_map映射为可读标签;TransformerModule还额外支持split_char(默认'\002',用于 token-cls 输入 token 切分)与return_prob(为True时同时返回标签与概率)两个参数。
3.4 Embedding 特征抽取:get_embedding
def get_embedding( data, use_gpu=False )用于获取输入文本的句子粒度特征与字粒度特征。
data:输入文本列表,格式同上(每个元素为一个样例,可含text_a与text_b)。use_gpu:是否使用 GPU,默认为False。
返回results(list 类型),格式为[[sample_a_pooled_feature, sample_a_seq_feature], [sample_b_pooled_feature, sample_b_seq_feature], ...],其中每个元素是对应样例的特征输出:pooled_feature为句子粒度特征,seq_feature为字粒度特征。
在源码中,get_embedding由 TransformerModule 提供:它要求task is None(否则抛出RuntimeError),内部等价于执行一次predict(data=data, use_gpu=use_gpu);模型前向返回(sequence_output, pooled_output)二元组(见 ErnieTiny.forward),其中sequence_output是每个 token 的字粒度输出、pooled_output是句子粒度的池化输出。
四、下游任务 Fine-tuning 实战
ERNIE-Tiny 支持三类常见 NLP 下游任务的 Fine-tuning,仓库 demo 目录下提供了对应的完整训练脚本,均采用「hub.Module组网 +hub.Trainer训练」的标准流程。
4.1 文本分类(seq-cls)
对应脚本 demo/text_classification/train.py,使用 ChnSentiCorp 中文情感分类数据集:
import paddle import paddlehub as hub from paddlehub.datasets import ChnSentiCorp model = hub.Module(name='ernie_tiny', version='2.0.1', task='seq-cls') train_dataset = ChnSentiCorp(tokenizer=model.get_tokenizer(), max_seq_len=args.max_seq_len, mode='train') dev_dataset = ChnSentiCorp(tokenizer=model.get_tokenizer(), max_seq_len=args.max_seq_len, mode='dev') test_dataset = ChnSentiCorp(tokenizer=model.get_tokenizer(), max_seq_len=args.max_seq_len, mode='test') optimizer = paddle.optimizer.AdamW(learning_rate=args.learning_rate, parameters=model.parameters()) trainer = hub.Trainer(model, optimizer, checkpoint_dir=args.checkpoint_dir, use_gpu=args.use_gpu) trainer.train( train_dataset, epochs=args.num_epoch, batch_size=args.batch_size, eval_dataset=dev_dataset, save_interval=args.save_interval, ) trainer.evaluate(test_dataset, batch_size=args.batch_size)脚本默认超参数为:num_epoch=3、learning_rate=5e-5(配合 warmup 使用)、max_seq_len=128、batch_size=32。数据集类ChnSentiCorp定义于 paddlehub/datasets/chnsenticorp.py。
4.2 序列标注(token-cls)
对应脚本 demo/sequence_labeling/train.py,使用 MSRA_NER 命名实体识别数据集。与文本分类的关键差异在于:token-cls 任务必须显式传入label_map(源码 module.py 中ChunkEvaluator依赖label_map构造标签列表):
from paddlehub.datasets import MSRA_NER label_list = MSRA_NER.label_list label_map = {idx: label for idx, label in enumerate(label_list)} model = hub.Module( name='ernie_tiny', version='2.0.1', task='token-cls', label_map=label_map, # Required for token classification task ) tokenizer = model.get_tokenizer() train_dataset = MSRA_NER(tokenizer=tokenizer, max_seq_len=args.max_seq_len, mode='train') dev_dataset = MSRA_NER(tokenizer=tokenizer, max_seq_len=args.max_seq_len, mode='dev') test_dataset = MSRA_NER(tokenizer=tokenizer, max_seq_len=args.max_seq_len, mode='test') optimizer = paddle.optimizer.AdamW(learning_rate=args.learning_rate, parameters=model.parameters()) trainer = hub.Trainer(model, optimizer, checkpoint_dir=args.checkpoint_dir, use_gpu=args.use_gpu) trainer.train( train_dataset, epochs=args.num_epoch, batch_size=args.batch_size, eval_dataset=dev_dataset, save_interval=args.save_interval, ) trainer.evaluate(test_dataset, batch_size=args.batch_size)训练完成后,checkpoint_dir下会保存各 epoch 的参数文件(如epoch_N/),预测时通过load_checkpoint指向该目录下的参数文件即可。训练过程会使用 paddlehub/finetune/trainer.py 中Trainer的 checkpoint 自动续训机制(启动时扫描epoch_*目录恢复current_epoch与最优指标)。
4.3 文本匹配(text-matching)
对应脚本 demo/text_matching/train.py,该任务在 ernie_tiny 2.0.2 版本中加入,使用 LCQMC 中文问句匹配数据集:
from paddlehub.datasets import LCQMC model = hub.Module(name='ernie_tiny', version='2.0.2', task='text-matching') tokenizer = model.get_tokenizer() train_dataset = LCQMC(tokenizer=tokenizer, max_seq_len=args.max_seq_len, mode='train') dev_dataset = LCQMC(tokenizer=tokenizer, max_seq_len=args.max_seq_len, mode='dev') test_dataset = LCQMC(tokenizer=tokenizer, max_seq_len=args.max_seq_len, mode='test') optimizer = paddle.optimizer.AdamW(learning_rate=args.learning_rate, parameters=model.parameters()) trainer = hub.Trainer(model, optimizer, checkpoint_dir=args.checkpoint_dir, use_gpu=args.use_gpu) trainer.train( train_dataset, epochs=args.num_epoch, batch_size=args.batch_size, eval_dataset=dev_dataset, save_interval=args.save_interval, ) trainer.evaluate(test_dataset, batch_size=args.batch_size)脚本默认超参数为:num_epoch=10、max_seq_len=64、batch_size=128。数据集类LCQMC定义于 paddlehub/datasets/lcqmc.py。
从源码看,text-matching 任务的实现思路是:将 query 与 title 分别送入ErnieModel得到各自 token 向量,用pad_token_id构造 attention mask 后做 token 向量加权平均得到句子向量,再将[query_mean, title_mean, |query_mean - title_mean|]拼接成 3 倍 hidden_size 的特征,送入Linear(hidden_size * 3, 2)分类头得到匹配概率(见 ErnieTiny.forward)。该结构类似经典文本匹配模型中对双塔输出的 concat + 绝对差特征组合,可以从源码结构直接观察到这一实现细节。
4.4 Trainer 训练机制
上述三个脚本都基于hub.Trainer完成训练,其核心能力(见 paddlehub/finetune/trainer.py)包括:
- 根据
use_gpu自动paddle.set_device,支持多卡场景下paddle.distributed.init_parallel_env+DataParallel包装; checkpoint_dir自动断点续训:扫描epoch_*目录找到最大 epoch 并恢复模型参数与最优指标;若目录不存在则提示 "start from scratch";use_vdl=True时在checkpoint_dir/visualization下创建 VisualDL 日志;- 通过
compare_metrics回调控制最优模型保存策略(默认取validation_step返回主指标较大者)。
五、PaddleHub Serving 服务化部署
PaddleHub Serving 可以将 ERNIE-Tiny 部署为一个在线获取预训练语义特征(Embedding)的 HTTP 服务。
5.1 第一步:启动 PaddleHub Serving
$ hub serving start -m ernie_tiny执行后即完成一个获取预训练词向量服务化 API 的部署,默认端口号为 8866。从 paddlehub/commands/serving.py 的源码可以看到,port参数的默认值即8866,也可通过--port/-p指定其他端口。Serving 底层基于 Flask/gunicorn 实现(见 paddlehub/serving/http_server.py)。
NOTE:如使用 GPU 预测,需要在启动服务之前设置CUDA_VISIBLE_DEVICES环境变量;仅使用 CPU 时无需设置。
5.2 第二步:发送预测请求
服务端配置好后,以下代码即可发送预测请求并获取结果:
import requests import json # 指定用于获取 embedding 的文本 [[text_1], [text_2], ...] text = [["今天是个好日子"], ["天气预报说今天要下雨"]] # 以 key 的方式指定 text 传入预测方法时的参数,此例中为 "data" # 对应本地部署,则为 module.get_embedding(data=text) data = {"data": text} # 发送 post 请求,content-type 类型应指定 json 方式,url 中的 ip 地址需改为对应机器的 ip url = "http://127.0.0.1:8866/predict/ernie_tiny" # 指定 post 请求的 headers 为 application/json 方式 headers = {"Content-Type": "application/json"} r = requests.post(url=url, headers=headers, data=json.dumps(data)) print(r.json())Serving 的请求处理入口是TransformerModule中带@serving装饰器的predict_method(见 paddlehub/module/nlp_module.py):当task为seq-cls/token-cls时返回预测标签(token-cls 会自动去除[CLS]与 padding token 对应的标签);当task为None时走get_embedding分支返回特征向量。
六、版本更新历史
| 版本 | 更新内容 |
|---|---|
| 1.0.0 | 初始发布 |
| 1.0.1 | 修复 Python 2 的兼容问题 |
| 1.1.0 | 支持get_embedding与get_params_layer |
| 2.0.0 | 全面升级动态图版本,接口有所变化 |
| 2.0.1 | 任务名称调整,增加序列标注任务token-cls |
| 2.0.2 | 增加文本匹配任务text-matching(安装命令:hub install ernie_tiny==2.0.2) |
仓库中 module.py 的moduleinfo声明的当前版本为2.0.2,与文档一致;同时源码中对旧任务名sequence_classification做了兼容处理:仍可传入但会打印废弃警告并自动映射为seq-cls(见 module.py),这也解释了 2.0.1 版本"任务名称调整"的变更背景。
七、总结与使用建议
- 选型建议:ERNIE-Tiny 以 346MB 的体积提供接近完整版 ERNIE 的语义理解能力,适合对模型体积与推理速度有要求的场景;若追求更高精度可选用同仓库中的 ernie 完整版(384MB)或其他更大规模模型。
- 任务匹配:情感/主题分类用
seq-cls,命名实体识别等序列标注用token-cls(记得传label_map),句子对匹配用text-matching,仅需特征则task=None配合get_embedding。 - 预测数据格式:每个样例的文本数量(1 或 2 个)必须与训练时保持一致,否则会因 tokenizer 编码分支不匹配而报错。
- 部署注意:Serving 默认监听 8866 端口;GPU 推理需提前设置
CUDA_VISIBLE_DEVICES;跨机器访问时把 url 中的127.0.0.1替换为服务端实际 IP。
- 人工智能
- 大模型
- 微调
- 模型推理服务
【免费下载链接】PaddleFormers
PaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.
相关推荐
machine-learning-for-trading 的 SEC EDGAR 基本面数据管道:10-K / 10-Q / 8-K 申报文本与 XBRL 财务面板的下载与加载实战
machine learning for trading 的 SEC EDGAR 基本面数据管道:10 K / 10 Q / 8 K 申报文本与 XBRL 财务
人工智能大模型微调模型推理服务PaddleHub 中 ERNIE 2.0 英文预训练模型 ernie_v2_eng_base 的安装、预测与 Fine-tune 实战指南
PaddleHub 中 ERNIE 2.0 英文预训练模型 ernie_v2_eng_base 的安装、预测与 Fine tune 实战指南 本文围绕 Padd
人工智能大模型微调模型推理服务Wekan Planning Poker(规划扑克)卡片功能全解:从卡片入口到源码级数据模型
Wekan Planning Poker(规划扑克)卡片功能全解:从卡片入口到源码级数据模型 本文以 Wekan 仓库中 Planning Poker 功能文档
人工智能大模型微调模型推理服务
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考