前言
总体步骤介绍,执行整个流程,每个步骤可能会出现很多小问题
自己的模型,是用LSTM 模型进行预测,前12个数据预测下一个数据,
参考文章 https://blog.csdn.net/weixin_45492560/article/details/121316540
一、总体步骤
1、保存模型为.pt 或者.pth 格式
import torch
from ... import
# 训练模型
model
model.fit()
# 转换模型
model.eval()
traced_script_module = torch.jit.script(model)
# 保存 TorchScript model
traced_script_module.save("xxx.pt")
2、转为.mar 格式
在serve/model-archiver 下输入
torch-model-archiver -f --model-name xxx \ # mar格式的模型名称xxx
--version 1.0 \ # 版本
--serialized-file xxx.pt \ # pt文件
--handler handlers/xxx_handler.py \ # 模型输入前数据预处理,输出结果处理,展示处理等功能,这块很重要
--export-path targets/ # 输出mar 文件的位置 ,一般是serve/model-archiver/model-store 下
3、docker 启动
在serve/model-archiver 下输入
docker run --rm -it -p 8080:8080 -p 8081:8081 --name mar -v $(pwd)/model-store:/home/model-server/model-store -v $(pwd)/examples:/home/model-server/examples pytorch/torchserve:latest
-v 目录映射
4、注册一个模型
curl --location --request POST 'http://localhost:8081/models' \
--header 'Content-Type: application/json' \
--data-raw '{
"url": "xxx.mar",
"batch_size": 64,
"initial_workers": 1
}'
注册后, curl http://127.0.0.1:8081/models ,查询是否注册成功
5、预测数据
curl --location --request POST 'http://localhost:8080/predictions/xxx -T # 要预测的数据
展示预测数据
二、坑指南
保存模型这块基本不会出错。
1、遇到 OSError: [Errno 13] Permission denied:
ERROR: Could not install packages due to an OSError: [Errno 13] Permission denied: ‘/home/venv/lib/python3.8/site-packages/threadpoolctl.py’
Check the permissions.
应该是遇到了不能安装的包
解决方法:
1、 加个–requirements-file ,加上依赖 ,参考链接 https://pip.pypa.io/en/stable/user_guide/#requirements-files
2、根据这个包信息,不调用,自己写代码
2、第二步中,handle文件编写。至关重要
2.1 preprocess ,数据预处理
首先数据data 是list格式,需要获取data、body数据信息,我采用的是csv 文件
def preprocess(self, data):
# processed = []
print("data原数据",data)
for row in data:
print("row:",row)
values_ori = row.get("data") or row.get("body") # 字节数组
values_str = values_ori.decode('utf-8') # str
values_str_split = values_str.split("\r\n") # split
values_str_split.pop() # 删除最后一个空字符串
values = list(map(float, values_str_split))
print("values数据:",values)
print("values数据类型",type(values))
tensor = super().preprocess(values) # 转为Tensor 类型
print("tensor 数据:",tensor)
# 归一化处理
max_values = torch.max(tensor)
min_values = torch.min(tensor)
normalized_values = (tensor - min_values) / \
(max_values - min_values + EPSILON)
# 处理后,数据格式变换,输入到模型中
expanded_values = torch.unsqueeze(normalized_values, dim=0).t()
print("expanded_values全部数据:", expanded_values)
print("expanded_valuesshape:", (np.array(expanded_values)).shape)
# processed.append(expanded_values) # 获取数据
return expanded_values
2.2 postprocess,预测后的数据处理
def postprocess(self, data):
pred = []
with torch.no_grad():
print("data:",data)
print("data type:",type(data))
# tensor 转为 numpy
data_num = data.numpy()
print("data_num:", data_num)
print("data_num type:", type(data_num))
data_num = data_num * 100
pred.append(data_num.tolist())
print("pred:",pred)
return pred # 转为 list