pytorch部署新利器TorchServer

2023-11-02

pytorch的爬坑指南

排坑不易转载请注明出处!
参考文档 https://github.com/pytorch/serve
由于本地下载pytorch==1.7有问题【刚又瞅一眼现在是需要1.6?】,所以采用了docker部署

上干货:

1.docker版本不能太低,我装的19.03.13
2.下载项目文件
git clone https://github.com/pytorch/serve.git
cd serve/docker
3.构建docker image(cpu版本)
DOCKER_BUILDKIT=1 docker build --file Dockerfile -t torchserve:latest .

或者

docker pull pytorch/torchserve:latest

可用所有tags https://hub.docker.com/r/pytorch/torchserve/tags

4.将训练好的模型及环境打包
# 加载模型
checkpoint = torch.load(checkpoint_dir)
bertconfig = BertConfig(vocab_size=int(vocab_size), num_hidden_layers=3)
model = Bert_Sentiment_Analysis(config=bertconfig)
# 校验
model.eval()
# 加载参数
model.load_state_dict(checkpoint["model_state_dict"])
# model input sample
texts_tokens_ = torch.randint(0, 100, (1,127))
positional_enc = torch.randn((1, 127, 384), dtype=torch.float32)
# 打包并保存
traced_script_module = torch.jit.trace(model, (texts_tokens_, positional_enc))
traced_script_module.save("sentiment_test.pt")
5.完成handle.py文件对接torchServer

注意 preprocess方法接收的data[0].get(“data”)数据类型为bytes

# 模板
class ModelHandler(BaseHandler):
    """
    A custom model handler implementation.
    """

    def __init__(self):
        self._context = None
        self.initialized = False

    def initialize(self, context):
        """
        Initialize model. This will be called during model loading time
        :param context: Initial context contains model server system properties.
        :return:
        """
        self._context = context
        self.initialized = True
        properties = context.system_properties
        
        #  load the model
        self.manifest = context.manifest
        model_dir = properties.get("model_dir")
        self.device = torch.device("cuda:" + str(properties.get("gpu_id")) if torch.cuda.is_available() else "cpu")

        # Read model serialize/pt file
        serialized_file = self.manifest['model']['serializedFile']
        model_pt_path = os.path.join(model_dir, serialized_file)
        if not os.path.isfile(model_pt_path):
            raise RuntimeError("Missing the model.pt file")

        self.model = torch.jit.load(model_pt_path)
        self.model.to(self.device)
		
		...
		
        self.initialized = True

    def preprocess(self, data: list):
        """
        Transform raw input into model input data.
        :param batch: list of raw requests, should match batch size
        :return: list of preprocessed model input data
        """
        # Take the input data and make it inference ready
        text = data[0].get("data") or data[0].get("body")
        # 异常判断
        if text is None:
            warnings.warn("data params is none")
            raise Exception("no data")
        else:
	        text = text.decode()
        # 预处理, 获取batch
        ...

    def inference(self, texts_tokens_, positional_enc):
        """
        Internal inference methods
        :param model_input: transformed model input data
        :return: list of inference output in NDArray
        """
        # Do some inference call to engine here and return output
        predictions = self.model.forward(texts_tokens_, positional_enc)
		...

    def postprocess(self, inference_output):
        """
        Return inference result.
        :param inference_output: list of inference output
        :return: list of predict results
        """
        # Take output from network and post-process to desired format
        postprocess_output = inference_output
        return postprocess_output

    def handle(self, data, context):
        """
        Invoke by TorchServe for prediction request.
        Do pre-processing of data, prediction using model and postprocessing of prediciton output
        :param data: Input data for prediction
        :param context: Initial context contains model server system properties.
        :return: prediction output
        """
        self.preprocess(data)
        self.inference()
		self.postprocess(model_output)
		...


service = ModelHandler()

def handle(data, context):
    if not service.initialized:
        service.initialize(context)
    if data is None:
        return None
    return service.handle(data, context)
6.打包模型预测需要的文件
torch-model-archiver --model-name sentiment_test --version 1.0 --serialized-file /home/model-server/model-store/sentiment_test.pt \
--export-path /home/model-server/model-store \
--extra-files  /home/model-server/model-store/bert_word2idx.json \
--handler model_handler:handle -f
--model-name: 模型的名称,后来的接口名称和管理的模型名称都是这个
--serialized-file: 模型环境及代码及参数的打包文件
--export-path: 本次打包文件存放位置
--extra-files: handle.py中需要使用到的其他文件
--handler: 指定handler函数。(模型名:函数名)
-f 覆盖之前导出的同名打包文件

执行完会发现在/home/model-server/model-store目下多了一个以.mar结尾的文件,这个就是我们要在模型服务中使用的最终的打包文件

7.启动docker服务

将.mar文件放到宿主机的/home/model-server/model-store目录下

docker run --rm -it -p 3000:8080 -p 3001:8081 --name sentiment_test \
 -v /home/model-server/model-store:/home/model-server/model-store \
 torchserve:latest
# docker 可选参数 --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 \
# 切换到后台
ctrl + p 
8.torchserver接口
8.1模型管理相关接口
# 注冊模型并为模型分配资源
curl -v -X POST "http://localhost:3001/models?initial_workers=1&synchronous=false&url=sentiment_test.mar&batch_size=8&max_batch_delay=200"

# 修改分配worker数量
curl -v -X PUT "http://localhost:3001/models/sentiment_test?min_worker=3"

# 查看指定模型当前状态
curl http://192.168.5.135:3001/models/sentiment_test
8.2模型预测接口(handler.py文件中的逻辑)
curl -X POST http://localhost:3000/predictions/sentiment_test -d "data=这也太难吃了把?再也不来了"
9.进入docker 镜像停止或运行程序
# 进入docker容器
docker exec -it [容器名称] /bin/bash

# 停止服务
torchserve --stop

# 启动服务
torchserve --start --ncs --model-store /home/model-server/model-store --models sentiment_test.mar
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pytorch部署新利器TorchServer 的相关文章

随机推荐

  • 刷脸支付生物技术提升支付效率

    移动支付具有数据营销服务功能 移动支付免去了收 找零等问题 有完整的数据报表方便店铺管理人员对账单进行整理 更重要的是可以收集海量消费者的消费数据 对消费者进行人群画像特征 消费习惯 消费偏好等进行数据分析 也有助于店铺经营者实现数字化营销
  • ToLua框架下C#与Lua代码的互调

    本篇文章转自 https www jianshu com p f083bbaa048a 感谢作者的分享 Lua是目前国内使用最多的热更语言 基于Lua的热更框架也非常多 最近学习了一下ToLua的热更框架 主要使用的问题在于C 和Lua之间
  • 华为机试岛屿问题c语言代码,力扣(LeetCode)刷题,简单题(第13期)

    目录 力扣 LeetCode 定期刷题 每期10道题 业务繁重的同志可以看看我分享的思路 不是最高效解决方案 只求互相提升 第1题 字符的最短距离 试题要求如下 解答思路 从左向右遍历 记录上一个字符 C 出现的位置 prev 那么答案就是
  • 软件测试原则的6个基本原则

    文章目录 1 测试应基于客户需求 2 测试要尽早进行 3 穷尽测试是不可能的 4 遵循GoodEnough原则 5 测试缺陷要符合 二八 定理 6 避免缺陷免疫 软件测试经过几十年的发展 人们提出了很多测试的基本原则用于指导软件测试工作 制
  • 腾讯云DNSPod域名解析全面支持IPv6-only

    自2016年6月1日起 苹果要求所有提交App Store的iOS应用必须支持IPv6 only环境 根据苹果开发者网站的声明 大部分现有应用程序已经通过NSURLSession和CFNetwork APIs兼容该协议 依然使用IPv4 A
  • 个人关于模块化的理解

    个人对于模块化的探索 前一段时间我们前端的项目组有一个分兴趣小组的计划 因为那时候整个小组只有9个人 所以就分了三个小组 分别是 性能优化 模块化 新技术 三个小组 而我那进了 模块化研究 小组 所以嘞 研究模块化以及如何让项目的模块化更加
  • Cocos2dx-OpenGL ES2.0教程:初识MVP(3)

    在上一篇文章中 我在介绍vertex shader的时候挖了一个坑 CC MVPMatrix 它其实是一个uniform 每一个cocos2d x预定义的shader都包含有这个uniform 但是如果你在shader里面不使用这个变量的话
  • 认识区块链,认知区块链— —区块链开发

    区块链应用形态不同 对应的开发技术也会略有不同 比如中心化的钱包 交易所 APP应用等等 可以认为跟区块链关系不大 完全可以采用互联网技术完成 只有做一些真正贴合区块链概念特征的才会使用到对应的技术 当然区块链中本身也没有新的技术 都是些老
  • 时序预测

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 内容介绍 一种基于LSTM模型的股票预测方法和系统 属于股票预测技术领域 本发明技术方法通过搭
  • python笔记

    1 函数的多个返回值 2 交换两个变量 使用中间变量 c a a b b c 不用中间变量 a a b b a b a a b python专用 用元组 a b b a 3 函数内部使用赋值语句修改参数 不会修改外部的实参 4 函数内部调用
  • 怎么通过通过 p 名称空间配置 bean以及怎么去引用/注入其它 bean 对象--ref和怎么去引用/注入内部 bean 对象-内部 bean 对象

    前言 本章是spring基于XML 配置bean系类中第2篇讲解怎么通过通过 p 名称空间配置 bean以及怎么去引用 注入其它 bean 对象 ref和怎么去引用 注入内部 bean 对象 个人主页 尘觉主页 个人简介 大家好 我是尘觉
  • Fragment里面加一个轮播图

    首先先在Fragment中加入banner
  • Eclipse中创建的新项目没src和JRE System Library

    src JRE System Library 因为现有的JRE System Library不是适合的版本 这时更改版本 方法一 项目右键 Build Path Configure Build path remove删去原有JRE Syst
  • adb connect不成功,提示由于目标计算机积极拒绝,无法连接。

    在Windows的命令窗口敲命令 adb connect 192 168 2 X 连接Android电视adb的时候 出现下面的错误提示 unable to connect to 192 168 2 X 5555 cannot connec
  • 量化投资学习-2:股票与美女2-美女的类型

    人生 股票 的起点差不多 人生 股票 的终点差不多 人生 股票 的过程却大相径庭 你会选择哪个 美女 还是普通女 还是丑女 还是妖艳头牌 大家闺秀美女 还是网红美女 几天的邂逅激情 还是一段美好的旅程的 还是天长地久 关注的人多 价格就高
  • GO基础知识总结

    一 GO关键字25个 引导程序整体结构8个关键字 package import const var func defer go return 声明复合数据结构的4个关键字 struct interface map chan 控制程序结构的1
  • log4cplus源码分析

    1 引题 虽然从本科起就学的C 然后在工作的2年时间中也不断的在用C 写代码 虽然基本的语法和一些常用的库函数已经滚瓜烂熟 可是总觉得自己写的代码还不是很专业 特别是看到那些老外们写得代码 从设计 到编码风格 再到各种编程技法的使用有很多都
  • opencv-python图像处理 ---图像轮廓检测与代码实现

    一 轮廓检测 边缘检测虽然能够检测边缘 但是其边缘并不是连续的 图像轮廓用于检测一个整体 来用于后续进行其他处理 opencv提供了两个函数来完成这些操作 findContours 该函数可以查找轮廓 drawContours 绘制轮廓 轮
  • 用keil的时候没有安装对应MCU的库,以STM32F103F为例

    安装keil的时候没有用到这个芯片就没有安装对应的库 重新安装之后遇到的几个坑 打开keil显示没有这个型号 解决方法是安装对应的库 STM32F103F要安装Keil STM32F1xx DFP 2 4 1 pack 安装完库之后 点击O
  • pytorch部署新利器TorchServer

    pytorch的爬坑指南 排坑不易转载请注明出处 参考文档 https github com pytorch serve 由于本地下载pytorch 1 7有问题 刚又瞅一眼现在是需要1 6 所以采用了docker部署 上干货 1 dock