华为云 ModelArts 部署中文文本分类服务:从标注到在线推理的工程化实践
中文工单的意图分类长期靠关键词规则维护。这次我把一套 12 类工单意图分类模型迁到华为云 ModelArts,完整跑通了标注到在线推理,下面按步骤记录,代码可直接复用。
一、选型与整体链路
链路是:OBS 存数据 → ModelArts 数据集标注 → 训练作业(BERT 微调)→ 模型注册为资产 → 在线服务 → API 调用。理由很直接:训练和推理共用一套模型版本管理,不必自己搭 Kubernetes 和推理网关。
二、数据准备:先看清分布
在 OBS 建桶,按 train/val/test 分目录上传 JSONL 样本,每行一条:{"text": "...", "label": "退款"}。最容易翻车的是类别不均衡,退款类占比接近 45%。我合并了近似类目(“退款”与“退货”并为“售后”),再对长尾类做同义改写增强。训练前先看分布:
from collections import Counter
import json
rows = [json.loads(l) for l in open("train.jsonl", encoding="utf-8")]
print(Counter(r["label"] for r in rows).most_common())
三、训练作业:三个关键参数
用 ModelArts 预置的 PyTorch 镜像起训练作业,数据与模型输出都挂 OBS。影响最大的是学习率、batch size 与最大序列长度。中文工单大多在 60 字以内,把 max_length 从 512 降到 128,单轮训练从 40 分钟压到 11 分钟;学习率取 2e-5 并加线性预热,训练曲线最稳。
四、注册模型与部署在线服务
训练产出的模型目录直接注册为 ModelArts 模型资产;推理脚本实现 preprocess 与 postprocess 两个钩子,前者做分词与截断,后者把 logits 映射成标签和置信度。选 1 个 CPU 规格即可,实测单实例 QPS 约 28,平均延迟 35ms。
五、上线后暴露的三个坑
第一,标签顺序不一致。训练时的 label2id 与推理脚本里的映射表顺序不同,线上结果整体错位,务必把映射表随模型一起打包。第二,超长文本静默截断。超过 max_length 的工单被切掉尾部,后来改为截断后追加摘要。第三,OBS 权限。推理实例访问 OBS 需委托授权,漏配时服务启动正常但首个请求就报 403,日志只有一行 AccessDenied。
六、效果与后续
上线两周,12 类意图加权 F1 为 0.91,比规则方案高 27 个百分点,人工转派率降约三分之一。后续打算把置信度低于 0.6 的样本回流成增量训练集。ModelArts 的价值不在于模型本身,而在把训练、版本、部署、调用标准化,省下的是运维精力。
- 点赞
- 收藏
- 关注作者
评论(0)