TensorFlow.NET 在工业部署中的应用

前言

深度学习训练的模型 如何快速地在工业应用中进行部署,这一直是工业领域深度学习技术应用的痛点。

我们来看下TIOBE 2020年7月 的 TOP 10 编程语言排行榜:

从上图中可以看到,Python 占据了 第 3 名,C# 在 第 5 名。

在深度学习的科研和开发中,目前是以 Python 语言为主流,但是在传统的工业生产环境中,依然是 微软.NET 的天下,其中主要的开发语言为 C#

那么,如何解决不同语言框架开发之间的兼容,如何快速有效地进行模型部署,接下来,我们介绍 Google 官方推荐 .NET 开发者使用的,同时也是 微软 ML.NET 的底层深度学习框架之一的,来自 SciSharp 的 TensorFlow.NET 。

我们通过图文的方式,来逐一看下 TensorFlow.NET 在工业应用中的各种优势。

1. 模型部署 无缝对接

当前生成环境的工业软件主要有以下特点:

  1. 封闭性和保密性,数据敏感,无法接入外部互联网;

  2. 整体软件基础架构自主开发;

  3. 运行速度和稳定性要求高,离线单机设备多;

总结自己在工业中的深度学习应用案例,模型部署主要有以下 3 种方式,我们分别列举其部署方式和优缺点。其中,采用 TensorFlow.NET 的方式可以直接在 .NET [ C# ] 环境下,集成 GPU 训练和推理,代码块可以直接嵌入现有的工业软件框架,实现模型部署无缝对接

1.1 Python GPU 训练 + 推理

原理简述

训练:Python GPU版本 TensorFlow

推理:Python CPU or GPU版本 TensorFlow

模型部署:Python 加载模型,通过 Post 通讯,接收图像进行推理,返回 Json 格式结果

优缺点

优点:服务器/客户端分离,支持多客户端并行运算

缺点:需要安装和运行Python和.NET 2种框架,部署流程和架构复杂

图示说明

通讯方式:


1.2 Python GPU 训练 + TensorFlowSharp CPU 推理

原理简述

训练:Python GPU版本 TensorFlow

推理:CPU版本 TensorFlowSharp

模型部署:TensorFlowSharp 加载Python训练出的模型,并直接进行推理

优缺点

优点:客户端单一的 .NET 环境,部署简单,代码结构简洁

缺点:TensorFlowSharp目前社区已不维护,无新版本支持,且无GPU版本支持 无法进行训练

图示说明

附:TensorFlowSharp 的GPU版本扩展

如果需要使用带 GPU 的 TensorFlowSharp,就需要自己通过 C++ 编译带 Cuda 的 DLL,编译流程如下:

(或参考Google官网的流程:https://www.tensorflow.org/install/source_windows)

  1. 安装 Python 和 TensorFlow 软件包依赖项

  2. 安装 对应版本的 Bazel

  3. 安装 MSYS2

  4. 安装 Visual C++ 生成工具 2015

  5. 安装 GPU 环境支持

  6. 下载 TensorFlow 源代码

  7. 编译脚本修改 适合自己的系统环境

  8. 使用编译脚本进行编译

  9. 将编译后的DLL重命名为TensorFlowSharp默认的 libtensorflow.dll,并进行替换即可

上述流程整体还是较复杂的,其中编译脚本修改的环节,可能会出现很多坑,需要自己去摸索。

1.3 TensorFlow.NET GPU 训练 + 推理

终于来到我们的重点推荐框架,来自 SciSharp 社区的 TensorFlow.NET ,该框架同时支持 CPU 和 GPU 版本的模型训练和推理,同时作者和社区成员们也在持续努力维护中,目前 TensorFlow 2.x 对应的框架已经在开发中。

原理简述

训练:GPU 版本 TensorFlow.NET

推理:CPU or GPU 版本 TensorFlow.NET

模型部署:TensorFlow.NET GPU版本 训练出的模型直接调用

优缺点

优点:

  1. TensorFlow在.NET环境下的GPU支持

  2. 模型训练和部署 可以在同1套程序中集成,无需外部通讯

  3. Google官方推荐.NET开发者使用,同时作为ML.NET的底层深度学习框架

图示说明

通过TensorFlow.NET,你可以轻松打造1套可视化交互式的深度学习集成软件,支持GPU训练和推理,同时通过DLL引用即可快速完成工业生产部署,所有的操作都在统一的.NET环境进行,可以将各操作类库标准化封装,部署便利性和稳定性极高。

下述是作者基于TensorFlow.NET开发的一套机器视觉的深度学习通用平台,集成了OpenCV的大量算子和深度学习模块,同时实现大量可视化操作,可以直接交付现场生产环境使用,达到深度学习无基础快速应用的目的。

2. 较Python性能大幅提升

我们通过一个相同数据集的1000轮的线性回归的例子的运行,我们对比 C# 和 Python 的运行速度和内存占用,发现 C# 的速度大约是 Python 的2倍,而内存的使用,C# 只占到 Python 的1/4 ,可以说 TensorFlow 的 C# 版本在速度和性能上同时超过了 Python 版本,因此,在工业现场或者实际应用时,TensorFlow.NET 除了部署上的便利,更有性能上的杰出优势。

下述2个图是具体的对比运行示意图:


3. GPU环境无需部署 一键使用

详细文章请访问路径:https://github.com/SciSharp/TensorFlow.NET-Tutorials/blob/master/%E4%B8%89%E3%80%81%E5%B7%A5%E4%B8%9A%E5%BA%94%E7%94%A8%E4%B8%8E%E6%A1%88%E4%BE%8B-1.%20TensorFlow.NET%20%E5%88%9D%E6%8E%A2.md

(或扫下述二维码转至)

你是否踩过GPU环境部署中Cuda和cuDNN的坑,是否为如何进行深度学习GPU训练软件的移植和快速应用而烦恼,那么本文就是为了解决这些问题而制作的,一键部署GPU,最大化体现.NET优势,彻底解决GPU环境配置的繁琐问题,让你专注于深度学习算法和模型的开发

本文主要适用于下述情况:

  • 一键部署深度学习训练软件,无需安装复制的Cuda、cuDNN和配置环境变量等;

  • 希望将GPU加速的训练软件整体打包、移植使用,软件安装绿色简便化;

  • GPU训练版本软件开发完交付客户,避免因客户PC配置差异导致的软件无法正常使用;

  • 简单地复制粘贴,即可一键完成GPU训练环境部署,确保GPU环境安装“0”差错;

  • 需要在一台机器上 同时 跑多个版本TF和多个版本Cuda的开发环境

原理说明:

利用.net的封装优势,将 tensorflow.dll、TensorFlow.NET.dll 及 NVIDIA GPU 相关必要的 DLL 全部提取,拷贝至应用程序相同目录下,伴随可执行文件打包、移植使用,实现 GPU 环境跟随主程序版本打包应用的效果。

4. 完整案例:在C#下使用TensorFlow.NET训练自己的数据集

本文主要结合代码来详细介绍如何使用 SciSharp STACK 的 TensorFlow.NET 来训练CNN模型,该模型主要实现 图像的分类 ,可以直接移植该代码在 CPUGPU 下使用,并针对你们自己本地的图像数据集进行训练和推理。

详细文章请访问路径:

https://github.com/SciSharp/TensorFlow.NET-Tutorials/blob/master/%E9%99%84%E5%BD%95%EF%BC%9A2.%20%E5%9C%A8C%23%E4%B8%8B%E4%BD%BF%E7%94%A8TensorFlow.NET%E8%AE%AD%E7%BB%83%E8%87%AA%E5%B7%B1%E7%9A%84%E6%95%B0%E6%8D%AE%E9%9B%86.md

(或扫下述二维码转至)

加入TFUG苏州

参与TFUG社区活动,可以是组织者,志愿者,讲师(不一定是大牛,只要能分享相关经验即可)等;也可以是合作伙伴,为社区提供各种资源。

如果您想作为TFUG苏州的组织者或志愿者,或者有任何意见或建议,欢迎给我们的公众号留言!

微信公众号: TFUG苏州

Join Us

If you love TensorFlow, machine learning and willing to share, if you have other great ideas about our activities, if you are interested in our community and activities here, please contact us! 

WeChat: TFUGSuzhou

关注我们的公众号,第一时间获取最新活动消息

Gmail: tfugsuzhou@gmail.com 

微信号:

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

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

相关文章

全年营业额怎么计算_门店盈亏平衡计算及案例分析 | 商品管理

以某门店为例,面积为150平方米。年租金16万元、人员工资费用15万元、水电费3万元,税费1.2万元、装修费2.9万元、交通费1.6万元、投入成本的利息及其他费用3.3万元。(进货折扣)是50%,春夏季销售额占年总销售额的40%,一件春夏季的衣…

人工智能?.NetCore一样胜任!

提起AI,大家都会先想到Python,确实Python作为一门好几十年的老语言,上一波的AI大流行使它焕发了青春。大家用Phtyon来做AI,最主要的原因无非就是编码量更少,很多数学和AI相关的Api都是现成的。但是随着ML.net的问世&am…

区域转换为二值图像_Matlab图像处理系列教程(一)

小编近期为大家带来一套全面系统的MATLAB在图像处理中的应用。灰度处理 灰度化处理就是将一幅色彩图像转化为灰度图像的过程。彩色图像分为R,G,B三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色的R,G&#xff0…

7.30 KubeCon2020 | 今天下午5:40 近几年最火爆的技术峰会之分享主题.NET开发者与Kuberentes...

01最负盛名的峰会自2018 年 KubeConCloudNativeCon 首次落地中国以来,CNCF 每年都会在中国举办云原生技术大会。大会每年都能吸引来自五大洲 48 个国家的开源精英和技术大咖前来参会。阿里、华为、腾讯等你所知道的每一家大厂都是KubeCon的大会赞助商。滑动查看更多…

[MyBatisPlus]测试BaseMapper的功能测试自定义功能

测试BaseMapper的功能 添加功能 /*** 实现新增用户信息*/Testpublic void testInsert(){User user new User();user.setName("张三");user.setAge(23);user.setEmail("zhangsanxx.com");int result userMapper.insert(user);System.out.println("r…

[MyBatisPlus]通用Service接口测试通用Service

通用Service接口 说明: 通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 get 查询单行 remove 删 除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,泛型 T 为任意实体对象建议如果存在自定义通用 Service 方法的可能&#x…

程序员修神之路--晦涩难懂的CAP,是否完全正确?

微信搜一搜架构师修行之路菜菜哥,帮忙解决一个问题是不是面试又被虐了?是的呢,这次面试官问我什么是CAP?这个可就说来话长了......01PARTCAP说到CAP,首先不能不说分布式系统,前面几篇也说过,分布…

[MyBatisPlus]雪花算法

雪花算法 背景 需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量。 数据库的扩展方式主要包括:业务分库、主从复制,数据库分表。 数据库分表 将不同业务数据分散存储到不同的数据库服务器,能够支撑…

如何隐藏运行 winform 程序?

群里有个同学问了问题 如何隐藏运行 winform 程序?,提起了我的兴趣,玩玩呗?那就玩玩吧!第一版 将一个 winform 程序隐藏执行,隐藏执行的方式有很多种,第一个 demo 就用最简单的方式,…

[MyBatisPlus]常用注解_@TableName_@TableId_@TableField_@TableLogic通过全局配置配置主键生成策略

常用注解 TableName 设置实体类所对应的表名 如果全部表都有某个前缀,难道我们要通过一个一个加注解的方式来解决实体类对应表名问题吗? 我们可以通过配置文件来解决这个问题: TableId 将属性所对应的字段指定为主键 TableId的value属性 TableId的ty…

最小堆和最大堆的建立以及基本操作

前言: 堆的特性:用数组表示的完全二叉树。有序性:任一结点的关键字是其子树所有结点的最大值 (最小值) 堆的本质:就是一颗 完全二叉树 堆的数据存储: 用的是 数组 建堆时主要的操作:就是调整 对数组的元素…

字符串是单一字符的无序组合吗_Python学习笔记(八)组合数据类型

Python语言中最常用的组合数据类型有3大类, 分别是集合类型、序列类型和映射类型。集合类型是一个具体的数据类型名称,而序列类型和映射类型是一类数据类型的总称。集合类型是一个元素集合,元素之间无序,相同元素在 集合中唯一存在…

[MyBatisPlus]条件构造器wapper

wapper简介 QueryWrapper 组装查询条件 查询用户名包含a,年龄在20到30之间,邮箱信息不为null的用户信息 package com.xxxx.mybatisplus;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.xxxx.mybatisplus.mapper.Use…

推荐:适合小白入门的Asp.Net Core 开源学习手册

前言推荐一个入门级的.NET Core开源项目,非常适合新手入门学习.NET Core。开源地址:https://github.com/windsting/little-aspnetcore-book。手册在线下载地址:https://nbarbettini.gitbooks.io/little-asp-net-core-book/content/chapters/mvc-basics/c…

从当前元素继续寻找_云漫圈 | 寻找无序数组的第k大元素

戳蓝字“CSDN云计算”关注我们哦!作者:小灰来源:程序员小灰本期封面作者:泰勒太乐————— 第二天 —————题目是什么意思呢?比如给定的无序数组如下:如果 k6,也就是要寻找第6大的元素&a…

DFS和BFS总结和代码演示(详解)

1:BFS 广度优先搜索类似于树的层次遍历过程。它需要借助一个队列来实现。如图2-1-1所示,要想遍历从v0到v6的每一个顶点,我们可以设v0为第一层,v1、v2、v3为第二层,v4、v5为第三层,v6为第四层,再…

Kestrel的ListenAnyIP和ListenLocalhost的区别

问题在上篇文章,把AAStore.ProductCatalog.Api部署到docker中运行,输入地址访问报错如下图,说明外部无法访问这个url。(当然本地开发环境测试是可以访问的)。后来修改此处options.ListenLocalhost(8081)的代码改成opti…

[MyBatisPlus]Plus分页插件的配置和使用

Plus分页插件的配置和使用 配置类 package com.xxxx.mybatisplus.config;import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.Pagin…

控制是否展示_现场展示板管理不在于看,而在于管!

点击上方"五株科技",关注公众号,天天有精彩!一位日本专家根据研究数据宣称,如果中国的中小企业有效实行车间展示板管理,最大能够提升生产效率30%以上。通常被管理者小视的车间展示板,在专家眼中却…

龙芯完成.NET移植稳步推进生态建设

不久前,龙芯团队完成了.Net Core 3.1在龙芯上的移植。早在1年前,一位网友就告知,希望.Net能够移植到龙芯平台,因为一些政务应用场景有这方面的需求。只不过了一年,这就问题就被龙芯团队解决了。龙芯团队之所以移植.Net…