官网代码链接:
安装torchveser
1.安装合适的jdk,特别重要!!
yum install openjdk-11-jdk
踩坑记录:(1)jdk版本不对。
(2)安装正确的jdk后发现还是报一样的错误,这个时候是因为jdk的路径还是系统指定的路径,并不是自己新下载的jdk。解决方案如下方代码行所示。切换后执行java -version测试是否切换成功。
update-alternatives --config java
2.其他需要安装的包
captum==0.5.0
transformer==4.6.0
torch==1.8.0
torch-model-archiver==0.6.0
torch-workflow-archiver==0.2.4
torchserve==0.6.0
torchvision=0.9.0
nvgpu==0.9.0
scipy==1.9.1
pynvml==8.0.4
torch serve部署
1.文件准备:serve/examples/Huggingface_Transformers at master · pytorch/serve · GitHub
配置handle.py文件
import logging
from abc import ABC
from pynvml.smi import nvidia_smi
import numpy as np
import torch
import transformers
fromharvesttext import HarvestText
from sentence_transformers import SentenceTransformer
from ts.torch_handler.base_handler import BaseHandler
logger = logging.getLogger(__name__)
class t_hander(BaseHandler,ABC):
def __init__(self):
super(TransformersSeqClassifierHandler,self).__init__()
self.initialized=False
def initialize(self,ctx):
# 1. 获取模型地址
self.manifest = ctx.manifest
properties = ctx.system_properties
model_dir = properties.get("model_dir")
# 2. 导入模型
self.model = SentenceTransformer(model_dir,device="cpu")
self.model.eval()
logger.info("model from path %s loaded successfully", model_dir)
# 3. 启动服务
self.initialized=True
def preprocess(self,requests):
ht = HarvestText()
# 1. 获取数据
preprocessed_data = requests[0].get("body").get("data")
# 2.清洗数据
input_batch = []
for i in preprocessed_data:
input_batch.append(ht.clean_text(i,remove_url=True))
return input_batch
def inference(self,input_batch):
#1. 模型编码数据。输出embedding list
inference_output = self.model.encode(input_batch)
#2. 将tensor格式转为numpy中的格式
inference_output = [np.array(embeds).tolist for embeds in inference_output]
return inference_output
def postprocess(self,inference_output):
return [inference_output]
2.模型准备:如pytorch_model.bin等,个人建议将生成的文件全部捎带上。在这里,我是用的sentencetransformer,链接:uer/sbert-base-chinese-nli at main
然后执行以下命令,启动服务:
mkdir Transformer_model
mv pytorch_model.bin vocab.txt config.json Transformer_model/
torch-model-archiver --model-name BERTSeqClassification --version 1.0 --serialized-file Transformer_model/pytorch_model.bin --handler ./Transformer_handler_generalized.py --extra-files "Transformer_model/config.json,./setup_config.json,./Seq_classification_artifacts/index_to_name.json"
mkdir model_store
mv BERTSeqClassification.mar model_store/
torchserve --start --model-store model_store --models my_tc=BERTSeqClassification.mar --ncs
3.使用Inference API 进行推理,默认端口8080
curl -X POST http://127.0.0.1:8080/predictions/my_tc -T data
或
import requests
res=requests.post("http://127.0.0.1:8080/predictions/my_tc",json=data)
4.停止torchserve,可以使用torchserve --stop
5. 配置Torchserve 提供远程服务(这部分参考torchserve使用教程(踩坑记录))
为 TorchServe 创建一个配置文件,取名为 config.properties(默认名称)。
此文件定义要加载的模型,并设置远程服务,在这里将该服务器与所有公有 IP 地址绑定,但如有需要,可以将其限制为特定地址。我需要确保在安全组中打开端口 8080 和 8081
model_store=model_store
load_models=densenet161.mar
inference_address=http://0.0.0.0:8080
management_address=http://0.0.0.0:8081
现在可以在相同的目录中启动 TorchServe 了,不再需要传递任何命令行参数。
torchserve --start --ts-config config.properties