Deep Java Library(四)使用DJL Serving部署JAVA模型 For Windows

1.下载Windows版DJL Serving

Windows版DJL Serving下载地址:
https://publish.djl.ai/djl-serving/serving-0.23.0.zip
下载下来是一个zip压缩包,大约50M左右,目前最新版本为0.23.0

2.安装DJL Serving

解压serving-0.23.0.zip后目录如下
在这里插入图片描述
(1)bin目录是DJL Serving的主目录,里面serving.bat是启动脚本
(2)conf目录是DJL Serving的配置目录,里面我们主要看一下config.properties
这是初始化的config.properties配置

# debug=false
# inference_address=http://127.0.0.1:8080
# management_address=http://127.0.0.1:8080
# management_address=unix:/tmp/management.sock
model_store=models
load_models=ALL
# model_url_pattern=.*
# number_of_netty_threads=0
# job_queue_size=1000
# cors_allowed_origin=*
# cors_allowed_methods=*
# cors_allowed_headers=*
# keystore=conf/keystore.p12
# keystore_pass=changeit
# keystore_type=PKCS12
# private_key_file=conf/key.pem
# certificate_file=conf/certs.pem
# max_request_size=2000485760
# batch_size=1
# max_batch_delay=100

debug=false : 配置debug模式是否开启
inference_address:配置服务API接口访问地址
management_address:配置服务UI界面的访问地址
model_store:配置模型加载位置
load_models:配置模型具体加载路径,具体格式为如下:

[EndpointData]=modelUrl
其中[EndpointData]格式支持四种
1,[modelName]只配置一个模型名称
2,[modelName:version]配置模型名称,模型版本
3,[modelName:version:engine]配置模型名称,模型版本,模型引擎
4,[modelName:version:engine:deviceNames]配置模型名称,模型版本,模型引擎,模型驱动GPU或者CPU
例如:
load_models=[person:v1:MXNet:*]=file:///D:/LIHAOWORK/serving-0.23.0/person.zip
多个模型之间用逗号隔开

本次demo只应用的上述几个配置,剩余的配置说明可以具体查看官网:
https://docs.djl.ai/docs/serving/serving/docs/configuration.html
(3)lib目录是DJL Serving的类包目录
(4)plugins目录是DJL Serving是插件目录
由于DJL Serving默认启动加载插件的位置为bin目录下的plugins目录里面的插件文件,我们可以直接将plugins目录以及里面的插件直接复制到bin目录下
在这里插入图片描述plugins目录里面
在这里插入图片描述

3.启动DJL Serving

Windows下打开cmd
在这里插入图片描述
切换到DJL Serving的bin目录下
在这里插入图片描述
使用serving 启动DJL Serving
在这里插入图片描述
启动日志里面会显示所有的插件已经加载,并且API和UI的地址都是
http://127.0.0.1:8080

4.访问DJL Serving

打开浏览器访问http://127.0.0.1:8080
在这里插入图片描述

5.添加模型引擎依赖jar包

点击系统—>依赖
在这里插入图片描述
点击添加依赖
在这里插入图片描述
选择类型为JAR,方式是file或者maven
在这里插入图片描述
由于本次测试的模型为OnnxRuntime引擎,需要两个依赖包
onnxruntime-1.15.0.jar
onnxruntime-engine-0.23.0.jar
maven的具体依赖为

<dependency><groupId>ai.djl.onnxruntime</groupId><artifactId>onnxruntime-engine</artifactId><version>0.23.0</version><scope>runtime</scope>
</dependency>
<dependency><groupId>com.microsoft.onnxruntime</groupId><artifactId>onnxruntime</artifactId><version>1.15.1</version>
</dependency>

由于公司的网络非常的烂,并且好像这个UI插件的上传对于较大点的jar包有问题,可以直接将需要的jar包拷贝到bin目录下的deps目录,如果没有deps目录就新建一个。
在这里插入图片描述
刷新查看
在这里插入图片描述

6.添加模型包zip文件

在这里插入图片描述
synset文件是模型的ArtifactName文件具体内容如下

person

person.onnx是训练好的模型文件
libs目录里面是包含classes目录最里面是自定义的translator和translatorFactory
在这里插入图片描述

PersonTranslatorFactory类代码如下

import ai.djl.modality.Input;
import ai.djl.modality.Output;
import ai.djl.translate.TranslatorFactory;
import ai.djl.Model;
import ai.djl.translate.Translator;
import ai.djl.util.Pair;
import java.io.Serializable;
import java.lang.reflect.Type;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;public class PersonTranslatorFactory implements TranslatorFactory, Serializable {private static final long serialVersionUID = 1L;private static final Set<Pair<Type, Type>> SUPPORTED_TYPES = new HashSet<>();static {SUPPORTED_TYPES.add(new Pair<>(Input.class, Output.class));}/** {@inheritDoc} */@Overridepublic Set<Pair<Type, Type>> getSupportedTypes() {return SUPPORTED_TYPES;}/** {@inheritDoc} */@Override@SuppressWarnings("unchecked")public <I, O> Translator<I, O> newInstance(Class<I> input, Class<O> output, Model model, Map<String, ?> arguments) {if (isSupported(input, output)) {System.out.println("1");return (Translator<I, O>) new PersonTranslator();}throw new IllegalArgumentException("Unsupported input/output types.");}
}

PersonTranslator类代码如下

import ai.djl.modality.Input;
import ai.djl.modality.Output;
import ai.djl.modality.cv.Image;
import ai.djl.modality.cv.ImageFactory;
import ai.djl.modality.cv.output.BoundingBox;
import ai.djl.modality.cv.output.DetectedObjects;
import ai.djl.modality.cv.output.Rectangle;
import ai.djl.modality.cv.transform.CenterCrop;
import ai.djl.modality.cv.transform.Resize;
import ai.djl.modality.cv.transform.ToTensor;
import ai.djl.modality.cv.translator.YoloV5Translator;
import ai.djl.ndarray.NDArray;
import ai.djl.ndarray.NDList;
import ai.djl.translate.*;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class PersonTranslator implements ServingTranslator {private final Integer width = 640;private final Integer height = 640;private  final float threshold = 0.2f;//初始化转换器private Translator<Image, DetectedObjects> translator = YoloV5Translator.builder().optThreshold(threshold).optSynsetArtifactName("synset.txt").build();@Overridepublic NDList processInput(TranslatorContext ctx, Input input) throws Exception {byte[] data = input.getAsBytes(0);ImageFactory factory = ImageFactory.getInstance();Image image = factory.fromInputStream(new ByteArrayInputStream(data));NDArray array = image.toNDArray(ctx.getNDManager());Pipeline pipeline = new Pipeline();pipeline.add(new CenterCrop());pipeline.add(new Resize(width, height));pipeline.add(new ToTensor());return pipeline.transform(new NDList(array));}@Overridepublic Output processOutput(TranslatorContext ctx, NDList list) throws Exception {DetectedObjects output = translator.processOutput(ctx, list);List<String> classList = new ArrayList<>();List<Double> probList = new ArrayList<>();List<BoundingBox> rectList = new ArrayList<>();final List<DetectedObjects.DetectedObject> items = output.items();items.forEach(item -> {classList.add(item.getClassName());probList.add(item.getProbability());Rectangle b = item.getBoundingBox().getBounds();Rectangle newBox = new Rectangle(b.getX() / width, b.getY() / height, b.getWidth() / width, b.getHeight() / height);rectList.add(newBox);});Output out = new Output(200, "OK");out.add(new DetectedObjects(classList, probList, rectList).toJson());return out;}@Overridepublic void prepare(TranslatorContext ctx) throws Exception {translator.prepare(ctx);}@Overridepublic Batchifier getBatchifier() {return translator.getBatchifier();}@Overridepublic void setArguments(Map<String, ?> arguments) {}
}

在PersonTranslator中主要是实现ServingTranslator接口,里面我们重写了
processInput和processOutput,其中processInput我们将image处理为NDList,processOutput中我们将结果转为DetectedObjects。
后面我们会专门总结写一下自定义模型上传的形式和种类以及注意事项。
最后将person文件打包成zip包

7.指定自定义模型启动

具体命令如下:
serving -m “person::OnnxRuntime=file:///D:/LIHAOWORK/serving-0.23.0/person.zip”
在这里插入图片描述
在这里插入图片描述
其中标红的地方显示使用我们自定义的工厂。

8.模型测试

点击model
在这里插入图片描述
我们自定义的模型已经READY就绪,点击READY下面三角图标测试,
Data type选择raw,点击上传图片,点击推理
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

测试图片如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/101757.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【嵌入式开发 Linux 常用命令系列 7.1 -- awk 过滤列中含有特定字符的行】

文章目录 awk 过滤列中字符串 上篇文章:嵌入式开发 Linux 常用命令系列 7 – awk 常用方法详细介绍 awk 过滤列中字符串 cat test.log | awk -F $31 {print $0}说明&#xff1a; -F 以什么分隔列&#xff0c;这里是以空格为分隔符&#xff1b;$3代表第3列&#xff1b;$3…

go的iris框架进行本地资源映射到服务端

我这里使用的是HandleDirapi,有其他的请补充 package mainimport ("github.com/kataras/iris/v12" )type Hello struct{Status int json:"status"Message string json:"message" }func main(){app : iris.New()//第一个api:相当于首页app.Get(&q…

文件包含漏洞及漏洞复现

文件包含漏洞 1. 文件包含概述 程序开发人员通常会把可重复使用函数或语句写到单个文件中&#xff0c;形成“封装”。在使用某个功能的时候&#xff0c;直接调用此文件&#xff0c;无需再次编写&#xff0c;提高代码重用性&#xff0c;减少代码量。这种调用文件的过程通常称为…

如何查看MySQL的安装位置

MySQL的安装位置 1、查看安装目录 参数 路径 解释 备注 --basedir /usr/bin 相关命令目录 mysqladmin mysqldump等命令 --datadir /var/lib/mysql/ mysql 数据库文件的存放路径 --plugin-dir /usr/lib64/mysql/plugin mysql插件存放路径 --log-error …

投稿指南【NO.12_8】【极易投中】核心期刊投稿(组合机床与自动化加工技术)

近期有不少同学咨询投稿期刊的问题&#xff0c;大部分院校的研究生都有发学术论文的要求&#xff0c;少部分要求高的甚至需要SCI或者多篇核心期刊论文才可以毕业&#xff0c;但是核心期刊要求论文质量高且审稿周期长&#xff0c;所以本博客梳理一些计算机特别是人工智能相关的期…

pip cryptography 遇到的 OpenSSL 问题

pip install -r requirements.txt 遇到 bug Collecting cryptography2.7Downloading cryptography-2.7.tar.gz (495 kB)------------------------------------- 495.9/495.9 kB 15.7 MB/s eta 0:00:00Installing build dependencies: startedInstalling build dependencies:…

深入探讨Kubernetes(K8s)在云原生架构中的关键作用和应用

文章目录 1. 容器化的应用程序管理2. 自动化扩展和负载均衡3. 容器编排和调度4. 存储管理5. 自动化滚动更新6. 多云和混合云部署7. 监控和日志8. 安全9. 社区支持和生态系统10. 未来展望案例 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1…

[刷题记录]牛客面试笔刷TOP101

牛客笔试算法必刷TOP101系列,每日更新中~ 1.合并有序链表2023.9.3 合并两个排序的链表_牛客题霸_牛客网 (nowcoder.com) 题意大致为: 将两个链表中的元素按照从小到大的顺序合并成为一个链表. 所给予的条件: 给出的所要合并的链表都是从小到大顺序排列的. 思路: 创建一…

python报错ModuleNotFoundError: No module named ‘XXX‘

记录一下改神经网络过程中遇到的小bug 在对网络结构进行更改时&#xff0c;不可避免要把别人的文件copy到自己的项目里。这时可能会遇到包导入的错误。正常情况下&#xff0c;导入的包应该大致包括三种方式&#xff1a; 1、导入外部包&#xff0c;如果这里错了就自己去pip ins…

2023高教社杯数学建模C题思路模型 - 蔬菜类商品的自动定价与补货决策

# 1 赛题 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c; 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…

认识doubbo和rpc

开个新坑&#xff0c;和大家一起学习Dubbo 3.X。我们按照一个由浅入深顺序来学习&#xff0c;先从使用Dubbo开始&#xff0c;再深入Dubbo的核心原理。 今天我们就从认识Dubbo开始&#xff0c;整体的内容可以分为3个部分&#xff1a; Dubbo是什么RPC是什么Dubbo的架构 正式开…

欧洲云巨头OVHcloud收购边缘计算专家 gridscale

边缘计算社区近日获悉&#xff0c;欧洲云巨头OVHcloud已进入全面收购德国公司 gridscale 的谈判&#xff0c;该公司是一家专门从事超融合基础设施的软件提供商。 此次战略收购将标志着 OVHcloud 的另一个重要里程碑&#xff0c;使该集团能够显着加速其地理部署&#xff0c;并进…