google发布的大规模预训练模型bert在nlp诸多任务fine-tune后刷新了SOTA,后续有许多工作跟随着bert进行开展。其中roberta以更大规模的训练语料,更久的训练时间,并在预训练阶段取消了NSP(Next Sentence Predict),进一步提高了模型的准确度。但是无论是bert还是roberta,它们的参数量巨大(110M),对服务器gpu的资源占用率很高,模型推理速度欠佳。因此我们考虑采用更轻量级的roberta-tiny模型,开源自https://github.com/ZhuiyiTechnology/pretrained-modelsarrow-up-right .
roberta-tiny预训练结束后,我们将其参数固定,利用语言模型对句子进行向量化编码。客户端输入一段小说内容,返回一个维度为384的向量,该向量能够表征句子段落信息。通过bert-as-servicearrow-up-right 可以方便地将模型部署在服务器上,而且提供了友好的客户端访问方式。
Copy from bert_serving . client import BertClient
bc = BertClient ( ip = ' xx.xx.xx.xx ' ) # ip address of the GPU machine
bc . encode ([ ' First do it ' , ' then do it right ' , ' then do it better ' ]) 在对模型进行压缩后,将模型部署在生产的机器上,请求响应的速度还是十分可观的,差不多10ms/it。由于模型比较小巧,占用的显存空间不大,gpu的利用率不高,为了提高单gpu的利用率,我查阅了bert-as-service手册,结合自己的实践 (踩坑)经历,总结出几点我认为比较有用的经验。
通过这个项目的实践,从采集预训练语料,配置模型参数,到最后预训练模型都撸了一遍,并且针对我们的应用场景,做了一些优化。从模型理解、工程能力、代码实现上都有了些许的提高。
最后要感谢bert4keras、bert-as-service的作者们的开源精神,为NLP在工业落地上起到了很大的推动作用。希望日后自己也能够为开源社区贡献一份微薄力量。