Docker使用tensorflow/serving镜像部署模型

news2024/9/28 5:33:52

Docker使用tensorflow/serving镜像部署模型

环境

简单梳理一下使用tensorflow/serving镜像在服务器上部署模型。
首先要保证在linux环境上已经安装好了docker,之后下载tensorflow/serving镜像:

#下载镜像
docker pull tensorflow/serving
#查看下载的镜像
docker images

下载官方的模型文件

tensorflow-serving源码中有很多官方训练好的模型,git地址:https://github.com/tensorflow/serving

#创建一个文件夹
mkdir tensorflow-test
#在上面的文件下执行clone
git clone https://github.com/tensorflow/serving

单模型部署

这里用官方提供的saved_model_half_plus_two_cpu作为示例,这个模型在/home/tensorflow/serving/tensorflow_serving/servables/tensorflow/testdata这个路径下,前面的地址根据自己的服务器地址改一下。
运行下面的命令:

docker run -p 8501:8501 
--mount type=bind,source=/home/saved_model_half_plus_two_cpu,target=/tensorflow/models/half_plus_two -e MODEL_NAME=half_plus_two -t tensorflow/serving --model_base_path=/tensorflow/models/half_plus_two &

说明:
docker run:这不用多解释,docker运行镜像的命令
-p 8501:8501:-p是绑定端口的参数,第一个8501代表着现在用的这台机器的8501端口,第二个8501代表着通过这个镜像启动的容器的8501端口,所以这里的意思就是将本地的8501端口和通过这个镜像启动的容器的8501端口绑定,访问本地的8501端口就相当于访问了该容器的8501端口。当然第一个8501可以修改任意本地空闲的端口,第二个8501不可以随便修改,tensorflow/serving镜像默认对外提供两个端口,8501:http请求的端口,用去提供restful服务;8500:grpc请求的端口,提供grpc服务,这里要注意。
–mount type=bind,source=/home/saved_model_half_plus_two_cpu,target=/tensorflow/models/half_plus_two:source后面的地址是本地的地址,后面的是容器上的地址,这里是将本地的这个地址挂载到容器上这个地址
-e MODEL_NAME=half_plus_two:设置环境变量,设置模型名称为half_plus_two
-t tensorflow/serving:通过tensorflow/serving这个镜像来启动容器
–model_base_path=/tensorflow/models/half_plus_two:指定模型的基础路径,这里的路径最好和target后面的路径保持一致。
&:后面运行

执行上述命令之后输出如下信息,代表启动成功了:
在这里插入图片描述
这时候就可以ctrl+c退出这个页面,然后使用http请求测试一下

curl -d '{"instances": [1.0, 2.0, 5.0]}' -X POST http://localhost:8501/v1/models/half_plus_two:predict

输出如下:
在这里插入图片描述

多模型部署

这里说的多模型部署的意思是在一个容器里启动多个模型,也可以启动多个容器,每个容器里启动一个模型。多模型部署,要先创建一个models.config文件,内容如下

model_config_list:{

        config:{
                name:"half_plus_two"
                base_path:"/tensorflow/multiModel/two"
                model_platform:"tensorflow"
                model_version_policy {
                        specific {
                                versions: 123
                        }
                }
        },
        config:{
                name:"tf"
                base_path:"/tensorflow/multiModel/two_tf2"
                model_platform:"tensorflow"
                model_version_policy {
                        specific {
                                versions: 123
                        }
                }
        }
}

创建好这个文件之后执行下面的命令:

docker run -p 8500:8500 -p 8501:8501 -v /home/tensorflow/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu:/tensorflow/multiModel/two -v /home/tensorflow/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_tf2_cpu:/tensorflow/multiModel/two_tf2 -v /home/tensorflow/models.config:/tensorflow/models.config -t tensorflow/serving --model_config_file=/tensorflow/models.config &

说明:
docker run:不多说
-p 8500:8500 -p 8501:8501:这里就是将本机的8500和8501绑定到容器上的8500和8501端口,这两个端口分别提供http请求和grpc请求,这个上面详细讲了,这里也不多说了。
-v /home/tensorflow/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu:/tensorflow/multiModel/two:这里也是挂载目录的意思,冒号前面的地址是本机地址(绝对路径),冒号后面是容器上的地址(绝对路径)。接下来两个-v后面跟的内容都是这个意思。就不说了
–model_config_file=/tensorflow/models.config:设置config文件的地址,注意这里后面跟着的地址是容器上的地址,最好也和挂载的地址保持一致
&:后台运行

执行命令之后输出和测试和单模型部署一样,这里就不贴图了。

问题

博主对于docker和模型,还有这个tensorflow/serving镜像就是个小白,但是工作中要用到,所以在本地虚拟机测了一下要用到的内容,遇到的问题挺多的,也记不清了,下面这俩还有记录。
Could not find base path /models/half_plus_two for servable half_plus_two with error NOT_FOUND:
Failed to start server. Error: NOT_FOUND: /tensorflow/models.config; No such file or directory
主要弄懂每个地址是对应的本地地址,还是对应的容器上的地址,我遇到的问题应该就很好解决了,没什么要写的了,结束!
参考文档:https://blog.csdn.net/xxm524/article/details/128060790
https://blog.csdn.net/xiedelong/article/details/122044005

是不是一定要有所失,才能有所悟

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Halcon基于组件的模板匹配

Halcon基于组件的模板匹配 基于组件的模板匹配可以说是基于形状的模板匹配的加强版,加强的地方在于,这种方法允许模板中包含多个目标,并且允许目标之间存在相对运动(位移和旋转)。这决定了这种方式不适用于尺寸缩放的…

PDF转PPT,四款神器助你一臂之力!

亲爱的朋友们,你们在日常的工作和生活中有没有遇到过需要将PDF文件转换成PPT格式的情况呢?今天,我就来给大家推荐四款非常好用的工具,让你轻松应对PDF转PPT的难题! 一、福昕转换器 直通车(粘贴到浏览器打…

小阿轩yx-Kubernertes日志收集

小阿轩yx-Kubernertes日志收集 前言 在 Kubernetes 集群中如何通过不同的技术栈收集容器的日志,包括程序直接输出到控制台日志、自定义文件日志等 有哪些日志需要收集 日志收集与分析很重要,为了更加方便的处理异常 简单总结一些比较重要的需要收集…

framework-android启动

1:BootRom->BootLoader->Linux Kernel->Init->Zygote- >SystemServer->Launcher BootLoader 层:主要包括 Boot Rom 和 Boot Loader Kernel 层:主要是 Android 内核层 Native 层:主要是包括 init 进程以及其…

【SM系列】简单说说SM2,SM3,SM4加密算法

希望文章能给到你启发和灵感~ 如果觉得文章对你有帮助的话,点赞 关注 收藏 支持一下博主吧~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、什么是SM2加密?2.1 应用场景2.2 与RSA算法的区别 三、什么是SM3加密…

AI修复老照片的完整教程来了!

大家好,我是每天分享AI应用的萤火君! 最近老照片修复的项目比较火爆,很多同学都拿到了成果,这个技术上已经没有太大的难度,结合各种工具可以做出不错的效果,但是很多人还不知道如何实现,这篇文…

最常用的100个Python库入门

文章目录 最常用的100个Python库入门命令行界面和参数解析日志和错误处理多媒体处理异步编程Web开发网络和API代码分析和测试数据处理和科学计算数据库和数据存储系统和文件操作安全性机器学习和深度学习其他工具和库任务调度进度条虚拟环境管理异步任务队列文档生成HTML处理SQ…

Web APIs第一天

第一天&#xff1a;DOM获取元素&#xff0c;获取元素&#xff0c;修改属性 声明新变量&#xff0c;一般默认const&#xff0c;如果变量的值不变&#xff0c;则使用const。如果变量的值变化&#xff0c;则使用let。var已经被淘汰了。 <script>const arr [red, pink]arr.…

ESP32!Thonny+MicroPython+ESP32开发环境搭建!!

准备工具&#xff1a; ThonnyMicroPythonESP32 一.Thonny安装 下载地址&#xff1a;Thonny, Python IDE for beginnershttps://thonny.org/ 二.下载esp32环境——根据型号下载 下载地址&#xff1a;MicroPython - Python for microcontrollershttps://micropython.org/dow…

登录页面设计课堂,用8个案例带你学习

本文将以 8个最受欢迎的登录页模板为例&#xff0c;给大家分析想要提升登录页转化率&#xff0c;设计登录页时应该关注的要点 作为设计师&#xff0c;在设计登录页面时&#xff0c;除了要让你的界面设计拥有出色的视觉效果&#xff0c;还要想尽可能地获取新用户&#xff0c;并留…

分享一个使用智狐联创AI平台创建的WordPress分类广告插件

为了提升广告的效果与管理效率&#xff0c;我们开发了一款基于WordPress的分类广告插件&#xff0c;旨在帮助用户根据文章分类方便地显示相关广告。这款插件不仅简化了广告的管理流程&#xff0c;还提高了广告的精准投放。 插件功能概述 1. 广告管理 用户可以通过插件后台轻…

谷歌seo优化有能一步提升的方法吗?

网站优化的方法有很多&#xff0c;但没有一刀切的解决方案。 谷歌SEO绝对不是一项廉价的服务。任何声称能以低价实现显著效果的承诺都值得怀疑。 谷歌SEO是一项需要人力、技术和资源的工作&#xff0c;如果你打算自己做 最少需要一个人的年薪&#xff0c;还要考虑域名、服务器…

Linux中的编译器gcc/g++

目录 一、gcc与g的区别 1.gcc编译器使用 2.g编译器使用 二、gcc/g编译器编译源文件过程 1.预处理 2.编译 3.汇编 4.链接 三、静态库和动态库 1.库中的头文件作用 2.静态库 3.动态库 四、gcc编译器的一些选项命令 一、gcc与g的区别 gcc用于编译C语言代码&#xff…

Echarts可视化大屏数据详解

1、ECharts介绍 1.1、什么是ECharts ECharts是一款由百度开发并开源的数据可视化图表库&#xff0c;旨在帮助开发者通过简单易用的方式实现复杂的数据展示和分析需求。它完全基于 JavaScript 开发&#xff0c;利用 HTML5 的 Canvas 技术进行图形渲染&#xff0c;这使得它能够…

精密五金零配件加工的核心技术解析

在现代制造业中&#xff0c;精密五金零配件起着至关重要的作用。从电子产品到机械设备&#xff0c;从汽车制造到航空航天&#xff0c;都离不开高精度的五金零配件。而要实现精密五金零配件的加工&#xff0c;需要掌握一系列核心技术。时利和与大家一同解析精密五金零配件加工的…

Flutter之修改App的图标、名称

一、修改App名称 Android 路径&#xff1a;android/app/src/main/AndroidManifest.xml, 找到 android:label”string/app_name”。点击Ctrl鼠标左键转到string.xml 修改名称&#xff1a; <resources><string name"app_name">你的APP名称</string>…

如何使 div 居中?CSS 居中终极指南

前言 长期以来&#xff0c;如何在父元素中居中对齐一个元素&#xff0c;一直是一个让人头疼的问题&#xff0c;随着 CSS 的发展&#xff0c;越来越多的工具可以用来解决这个难题&#xff0c;五花八门的招式一大堆&#xff0c;这篇博客&#xff0c;旨在帮助你理解不同的居中方法…

获取navicat已保存数据库连接的密码

打开connections.ncx&#xff0c;可以看到Passwordxxx,这是加密后的密码 解密 在线的运行工具https://tool.lu/coderunner 运行如下代码&#xff0c;代码中的密码改成你的密码&#xff0c;在倒数第二行位置 <?phpnamespace FatSmallTools;class NavicatPassword{protected…

基础数据结构之双向链表

目录 基础定义 节点的定义 节点的初始化 创建双链表 1.前插法 2.尾插法 双向链表的遍历输出 指定位置插入 双向链表的按位取值 任意位置删除 双向链表销毁 主程序入口​​​​​​​ 基础定义 所谓的双向链表就是单向链表多了一个前驱指针。双向链表是由一个个结点组成每个结点…

【LLM】大模型基础--大规模预训练语言模型的开源教程笔记

1.引言 本文以DataWhale大模型开源教程为学习路线&#xff0c;进行一整个大模型的入门操作 什么是语言模型 语言模型是一种对词元序列&#xff08;token&#xff09;的概率分布&#xff0c;可以用于评估文本序列的合理性并生成新的文本。 从生成文本的方式来看&#xff0c;…