🍎 torchserve调试
# Handler程序的独立调试
开发过程中,朴素的调试过程是:
1. 修改源代码
2. 重新使用torch-model-archiver进行打包
3. 重启torchserve服务
4. 重新调用查看结果
过程繁琐,耗时较长,Handler独立调试程序可以做到在python程序内进行调试,模拟torchserve的启动过程。
## Handler.py
Handler.py程序是以torchserve框架部署必不可少的关键。
在torchserve运行时,Handler.py的内容只有一个类,不允许出现在class之外出现额外的代码,比如说`argparse`, `__name__=="__main__"`, 等调试代码。
下面是Handler.py的大致框架
```python
class ExampleHandler(BaseHandler):
def initialize(self, context):
# 各种各样的准备工作,核心就是将模型加载进来
...
self.model = model
def preprocess(self, video_lists:list):
# 前处理
...
return video_arrays
def inference(self, video_arrays:list, *args, **kwargs):
# 推理过程
results = []
for video_array in video_arrays:
result = self.model(video_array)
results.append(result)
return results
def postprocess(self, results:list):
# 后处理
...
return {"type":"...",
"results":...}
def handle(self, input, context):
# 前处理,推理,后处理的组合
...
return results
```
## 调试程序
在Handler.py里面的类下,可以加上下面的代码,模拟torchserve的过程。
>i 使用此方法需要以pip的方式安装torchserve
为了统一效果,`pip install torchserve==0.4.2`,如果安装过高版本的,会出现nvgpu这个包,然后出现奇奇怪怪不了解的错误。
```python
if __name__ == '__main__':
from ts.torch_handler.unit_tests.test_utils.mock_context import MockContext
# =====和torch-model-archiver类似=====
context = MockContext(model_pt_file='best.pth',
model_dir='./',
model_file='model.py',
gpu_id='0',
model_name="model")
handler = PlantHandler()
handler.initialize(context)
# =====设置输入数据=====
with open('a.jpg', 'rb') as f:
image_bytes = fin.read()
# =====torchserve要求以[{"":"",...},...]的形式传入=====
test_data = [{'data': image_bytes}] * 2
results = handler.handle(test_data, context)
print(results)
```