前言
深度学习训练的模型 如何快速地在工业应用中进行部署,这一直是工业领域深度学习技术应用的痛点。
我们来看下TIOBE 2020年7月 的 TOP 10 编程语言排行榜:
从上图中可以看到,Python 占据了 第 3 名,C# 在 第 5 名。
在深度学习的科研和开发中,目前是以 Python 语言为主流,但是在传统的工业生产环境中,依然是 微软.NET 的天下,其中主要的开发语言为 C#。
那么,如何解决不同语言框架开发之间的兼容,如何快速有效地进行模型部署,接下来,我们介绍 Google 官方推荐 .NET 开发者使用的,同时也是 微软 ML.NET 的底层深度学习框架之一的,来自 SciSharp 的 TensorFlow.NET 。
我们通过图文的方式,来逐一看下 TensorFlow.NET 在工业应用中的各种优势。
1. 模型部署 无缝对接
当前生成环境的工业软件主要有以下特点:
封闭性和保密性,数据敏感,无法接入外部互联网;
整体软件基础架构自主开发;
运行速度和稳定性要求高,离线单机设备多;
总结自己在工业中的深度学习应用案例,模型部署主要有以下 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)
安装 Python 和 TensorFlow 软件包依赖项
安装 对应版本的 Bazel
安装 MSYS2
安装 Visual C++ 生成工具 2015
安装 GPU 环境支持
下载 TensorFlow 源代码
编译脚本修改 适合自己的系统环境
使用编译脚本进行编译
将编译后的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版本 训练出的模型直接调用
优缺点
优点:
TensorFlow在.NET环境下的GPU支持
模型训练和部署 可以在同1套程序中集成,无需外部通讯
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模型,该模型主要实现 图像的分类 ,可以直接移植该代码在 CPU 或 GPU 下使用,并针对你们自己本地的图像数据集进行训练和推理。
详细文章请访问路径:
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
微信号: