系列文章目录
文章目录
前言
本文是关于sentence-transformer在TorchServe的应用&如何自定义handler(custom handler)
一、TorchServe必安包&环境
- pip install torchserve torch-model-archiver torch-workflow-archiver
- pip install captum(if you wanna explain your prediction, it’s mandatory)
- JDK version is 11
二、torch-model-archiver将模型转成.mar文件
1.使用torch-model-archiver
首先展示个torch-model-archiver样例,运行了这个代码,就将我的模型.bin文件转成了.mar文件
torch-model-archiver --model-name CrossForControl --version 1.0 --serialized-file Transformer_model/pytorch_model.bin --handler ./Transformer_handler_generalized.py --extra-files "./extra_files" -f --export-path model_store --requirements-file ./requirements.txt
解释下各个参数的含义
先从简单的讲解
-
—model_name 就是指定.mar文件的文件名
-
—version 就是设定模型的版本,后面推理接口的URL里可以指定version
-
—serialized-file 就是我们模型的路径,只需要指定.bin文件即可或者.pth
-
—export-path 就是.mar导出的路径
-
–requirements-file 就是我们要用到一些torchserve不包括的额外的包,比如我的模型是sentence-transformer中的cross-encoder,sentence-transforme包在torchserve默认的安装包目录里是没有的,我需要在requirements.txt里指定sentence-transformer
-
—extra-files 这个参数就有说道了,如果大家理解hugging_face的模型,会知道除了pytorch_model.bin模型外,还有vocab.txt,config.json等等额外的文件,这些文件用来生成模型tokenizer或指定模型architecture,都是我们加载模型时的必要的文件。所以我们要把这些文件都通过这个—extra-files 传给torchserve。有的时候要额外传输的文件很多,可以将额外的文件放在同一个文件夹里,在—extra-files后加-f来循环我们的文件夹。
setup_config.json在我们自定义的handler中负责初始化模型。后面介绍custom handler再说。
index_to_name.json 是推理时,有的模型比如QuestionAnswer,返回了答案库里和问题最接近的前三个答案的索引,返回索引是不够的,通常需要将索引对应的答案字符串返回才是客户想要的。就通过这个文件就可以做到。
- –handler 就是输入我们自定义handler的路径
2.如何自定义使用我们自己的handler
我这个自定义的handler主要是参考的reference中的第二个链接。
Provide a custom script to:
* Initialize the model instance when you run torch-model-archiver
* Pre-process input data before it is sent to the model for inference or Captum explanations when you
* Customize how the model is invoked for inference or explanations
* Post-process output from the model before sending back a response
Following is applicable to all types of custom handlers
* data - The input data from the incoming request
* context - Is the TorchServe context. You can use following information for customization model_name, model_dir, manifest, batch_size, gpu etc.
*
首先custom handler简单的可以一共分为四步(如果需要对模型进行解释,那更复杂一些):
-
初始化阶段-在这一步加载我们的模型,其中需要传入参数context,那什么是context,context怎么设定的
- context - Is the TorchServe context. You can use following information for customization model_name, model_dir, manifest, batch_size, gpu etc
- 我在initial函数里加入的代码,就是简单的加载模型
- context - Is the TorchServe context. You can use following information for customization model_name, model_dir, manifest, batch_size, gpu etc
-
加载模型后,是读取数据,在preprocess函数实现,其中数据通过request传进来,这一步通常还对传入的数据tokenize,但是我并没有tokenize。
-
数据进来后,那么就可以推理了,通过inference函数实现。我得到模型的预测结果,并选取分值前三的答案,其中的self.mapping就是前文index_to_name.json的字典,再将index转成对应的字符串,最终将前三结果转成字符串的格式,放在inferences列表里返回(其实这些步骤可以在postprocess函数里实现更标准),另外要注意返回的话,如果是字典会报错,所以我改成了字符串,并放在列表里。
-
最后就可以跑torch-archiver的命令了,也就是文章一开始那个例子,生成.mar文件
torch-model-archiver --model-name CrossForControl --version 1.0 --serialized-file Transformer_model/pytorch_model.bin --handler ./Transformer_handler_generalized.py --extra-files "./extra_files" -f --export-path model_store --requirements-file ./requirements.txt
3.启动tochserve
-
启动tochserve的命令
torchserve --start --model-store model_store --models my_tc=CrossForControl.mar --ncs
其中–model-store 是the location where your .mar file -
关闭torchserve的命令
torchserve —stop -
访问预测API的命令
curl -X POST http://127.0.0.1:8080/predictions/my_tc -T ./data/sample_text.txt
sample_text是我传入的question和answer bank,我的应用背景类似问答,大家如果场景不同,可以去官网的example里看看,下面有链接。
-
Check if torchserve run successfully
http://localhost:8080/ping -
Management api
http://localhost:8081/models
4.Reference
1.https://github.com/pytorch/serve/tree/master/model-archiver
2.https://github.com/pytorch/serve/blob/master/examples/Huggingface_Transformers/Transformer_handler_generalized.py
3.https://github.com/pytorch/serve/blob/master/docs/custom_service.md
4.https://github.com/pytorch/serve/blob/master/docs/inference_api.md
5.https://github.com/pytorch/serve/blob/master/docs/configuration.md
总结
花了2天研究的torchserve,现在也是刚刚入门,写个文章做个记录,其中踩了个坑,这个坑差不多是bert模型的文件夹里还有个pool池化层的子文件夹,将这个子文件夹作为extra_files上传的时候,池化层的子文件貌似被放到了bert模型的主文件夹路径下,导致torchserve加载这个模型一直失败,现在也没有解决,后续解决了,更新下文章。