出品 | AI科技大本营(ID:rgznai100)
导读:.NET 框架是由微软开发,致力于敏捷软件开发、快速应用开发、具平台无关性和网络透明化的软件框架,目前全球有 620 万开发者在使用 .NET 开发程序。然而,开发者在学习、开发和应用 AI 时,会发现市面上少有基于 .NET 的 AI 开发类库、人工智能应用技术平台和商业支持服务。在这样的背景下,SciSharp AI 开源社区应运而生,它打造一个基于 .NET 的机器学习生态,推出并开源了多个颇受欢迎的基于 .NET 的机器学习项目和工具,比如 TensorFlow.NET 就被谷歌列入 TensorFlow 官网,推荐给全球开发者。
SciSharp 是怎样的一个社区?它是如何构建一个基于 .NET 的机器学习生态?它在做的事情对开发者来说有何意义?本次,AI 科技大本营与 SciSharp 核心团队成员,包括 SciSharp 社区产品运营负责人,原 “微信”技术专利发明人George Zhao、 TensorFlow.NET 发起人和主要贡献者Eric Chen、NumSharp 主要贡献者 Eli Belash、Torch.NET与Numpy.NET的主要贡献者Meinrad Recheis和 ICSharpCore主要贡献者Kerry Jiang聊了聊,更加深入地了解这个 AI 社区及其产品。
SciSharp 是一个非盈利人工智能开源社区,目前核心开发者有 5 人,他们分别来自以色列、奥地利、澳大利亚、美国和中国,其他 35 名贡献者则来自德国、印度等 15 个国家和地区。目前,整个社区主要是靠成员各自的兴趣驱动,管理也是由团队人员自发共同承担,是一个完全透明和自治的开源技术社区。
众所周知,C# 和 JAVA 是目前企业系统里最流行的两大编程语言,现在,Java 机器学习生态里已经有不少社区和团队在做相关产品和服务,如斯坦福的 CoreNLP、DL4J 的机器学习库等,并且做得都不错。唯独在 .NET 领域,优秀的产品非常缺乏,而且,虽然有 Accord.NET、Deedle、ML.NET 和其它一些零散的库可供开发者使用,但是它们存在着明显的缺陷,造成目前的开源库无法持续发展和创新,陷入僵局。在深度学习领域,更是 Python “独霸天下”的局面,让人以为做机器学习,就必须用 Python,做大数据就必须用 Scala或Java。这让很多 .NET 开发者感到很不便,因此,SciSharp 就开始试着手建立一个基于.NET(以 C# 开发语言为主)的机器学习生态社区。
NumSharp 的主要贡献者,来自以色列的工程师Eli Belash 回顾了他刚开始从事机器学习和人工智能开发时的感受:“我了解到 .NET 多年来缺乏可以与 Python 相匹敌的语言功能。微软的 ML.NET 仍处于早期阶段,微软的 CNTK(图形计算库)刚刚中断。那时,你无法用 C#语言编写 ML(机器学习)算法,而用其他语言,如 Python 或 R 做这些事非常容易。因此,我们缺乏基于.NET 的可靠的解决方案来编写机器学习算法。当机器学习成为趋势时,C# 目前落后于 Python 和 Java。”
在这种背景下,SciSharp 社区成立了,目的主要是为了让 .NET 开发者在当前火热的 AI 热潮中能够使用最新的 AI 技术,而不用花很长的时间学习和使用 Python 机器学习生态里的工具,降低 .NET 开发者入门机器学习的门槛,让他们能快速把 AI 能力无缝融入到现有的生产系统里。
SciSharp 的核心理念是:打造一个基于 .NET 的机器学习生态,提供一个和 Python 生态体验一致的工具库,让模型迁移更容易、学习曲线最低。为了达到这个目的,SciSharp 从最基本的张量计算库 NumSharp 开始构建,到 TensorFlow Binding,再到吸纳其它深度学习库 SiaNet, 做 ArrayFire.NET,最后到开发ICSharpCore以支持Jupyter Notebook调试。团队的心愿一致,本着以精卫填海的精神,尽可能把 .NET 机器学习生态进一步完善。
NumSharp 的主要贡献者Eli Belash 表示,目前,Python 是 ML 开发和研究的主要语言。在阅读机器学习相关的论文时,你会发现作者很可能会使用 Tensorflow、Pytorch 和/或Numpy 等库并用 Python 语言编程来实现。在这样的情况下,重新造轮子可能并不是聪明的做法。如果现在流行的 Python 库运行良好,我们没理由去思考别的方法。
这就是为什么 SciSharp 决定迁移 ML 最流行的 Python 库:
上面提到的 3 个库提供了从头开始编写 ML 算法的完整解决方案,SciSharp 的重点之一便是能够兼容用 Python 编写类库的所有机器学习算法,并尽可能无缝地在 5 分钟内将其迁移到 C#。C# 是微软公司发布的一种面向对象的、运行于 .NET Framework 之上的高级程序设计语言。随着.NET Core 3.0 的即将发布,这个最初发布于 2016 年的平台终于有了最新的主版本,该平台具有通用性、模块化、跨平台和开放源代码的特性。这样,除了 Python 和 Java,开发者同样可以使用 C#完成机器学习任务。
SciSharp 上现已有几十个基于 .NET 的项目供开发者使用,从 star 数和 fork 上来看,最受欢迎的当属 TensorFlow.NET(简称TF.NET) 和 NumSharp。
其中,TensorFlow.NET 近期被谷歌列入 TensorFlow 官网推荐给全球开发者,并被微软的 ML.NET 1.3.1 集成,作为ML.NET里深度学习部分的重要组件,目前已经完成了用迁移学习算法进行图像分类的功能,并计划在年底完成图像对象检测的功能,届时将会对全球开发者公布。
微软在官博中介绍了 TensorFlow.NET :
为了使用TensorFlow,ML.NET 内部依赖于 Tensorflow.NET Library。
Tensorflow.NET Library 是一个开源和底层API 库,提供 TensorFlow 的 .NET 标准绑定。
微软(ML.NET团队)与 TensorFlow.NET Library 团队密切合作,不仅为 ML.NET 用户提供更高级别的 API,并帮助 Tensorflow.NET Library 作为一个开源项目进行改善。
受到谷歌和微软的双重肯定,与TensorFlow.NET 具有易用性的特点分不开。
TensorFlow.NET 保持和 Python 代码几乎一样的语法和接口,让目前流行的模型能够快速移植到 TF.NET。开发者可以很容易地在 .NET 上运行用 Tensorflow 开发的模型。日前,社区开发者 Kerry Jiang 开发了支持 Jupyter 的组件,使用 Jupyter Notebook 一样可以在线开发和调试 C# 语言程序和 TensorFlow.NET,并可以实时呈现绘图的效果。
据介绍,目前主要有 2 个核心工程师在开发 TensorFlow.NET(另外一名为奥地利工程师 Meinrad Recheis),其目标是做成 TensorFlow 的全功能绑定,即基于.NET提供与Python版的TensorFlow一样的接口和功能。
做成这样一个庞大的项目并非易事,因为 TensorFlow 本身是个巨大的库,能完成从文件读取、矩阵计算、梯度计算、图像变换和GPU、TPU 并行计算和分布式网络计算的能力,包含上千个 API。Eric Chen讲到,要全部完成这些 API 的迁移很有挑战性,包括语言特性造成的困难,比如很难完全将 TensorFlow 迁移到 C#,同时保持它与原始实现完全一样。这导致该团队决定写入Tensorflow 的 C ++ API 绑定,这样,用户可以使用 Tensorflow.NET 时会感觉和使用 Python 基本没有差别。另外,接口绑定对开发人员是完全透明的。
目前,TensorFlow.NET 已经可以开发神经网络模型,随着 API 的慢慢完善,能给数据科学家提供的工具函数也将越来越完善。
从 star 数和 fork 数量来看,NumSharp 是 SciSharp 中除 TensorFlow.NET 之外第二大受欢迎的项目。
NumSharp 是 Python 流行库 numpy 的纯 C# 端口,目的是提供快速、零拷贝和 n 维计算。目前,它是唯一一个为 .NET 编写的稳定库,能够在 n 维之间执行数学运算,如矩阵乘法、换位、加法等,同时完全支持传播、非复制 slides、特定的轴向迭代法;在 .NET 中可用的所有数字类型中,NumSharp 是 SciSharp 所有库的基础(包括TensorFlow.NET) ,并以多种形式被很多项目引用,比如 BotSharp、TensorFlow.NET 和 Pandas.NET。再如 TF.NET 计算之后,结果以 NumSharp 的格式(NDArray)返回。NumSharp 和 Numpy 一样,通常在 TensorFlow.NET 之前或之后用于清理、操作一般的特征工程。
另外,SciSharp 上还有 Keras.Net、Torch.NET 等项目。与 TF.NET 和 NumSharp 不同,Keras.Net 和 Torch.Net 几乎完全由该团队自己编写的生成器生成。它们使用Pythonnet(CPython运行时绑定库)从 C# 调用 Python 代码。因为使用的是用 Python 编写的原始代码,所以与原始库完全相同,且可以轻松更新。使用这些库的优点是整个 C# API 都可用,但另一方面,在某些情况下必须从 C# 调用 Python 的开销会影响性能。
值得注意的是,这些库不能直接与 TF.NET 或 NumSharp 兼容,但是该团队计划在所有库之间添加对移动内存的支持,而无需复制或进行任何额外的工作,感兴趣的同学可以期待一下。
AI 开发者套件也是机器学习开发者最关心的,据了解,SciSharp AI 开发套件目前包括视觉、NLP 支持、高端 API 等模块,George 透露未来还可能会开发Keras.NET Native版本,让开发者使用起来更容易。这些库其实都是根据实际应用随时添加,比如目前该团队正在做 Object Detection, 就需要计算机图像处理方面的库,如果在开源库里找不到合适的库,SciSharp 就会考虑做基于 .NET 的项目。
SciSharp AI开发套件的每个组件目前都有独立的发布周期,其中 TensorFlow.NET 最近一次迭代是配合 ML.NET 的发布,在集成过程当中发现了一些问题,并做了及时调整。9 月份,ML.NET 版本发布后会完全融合 TF.NET。
而 NumSharp 则已被完全重写,以确保该库经过充分测试,且功能与 NumPy 相当。NumSharp 将内部存储替换为非托管内存,以便在库之间轻松转换并提高性能。未来,该团队计划逐步迁移更多功能还计划通过创建 IL-Generator 以尽可能提高性能。
Tensorflow.NET 则是进行 Tensorflow 1.40 版本的绑定,现在功能已经比较完备。未来,Tensorflow.NET 将进行 Tensorflow 2.0 的绑定。
正如文章开篇所说,目前,在 .NET 领域虽然存在一些类似 Accord.NET、Deedle以及其它一些零散的库,它们能用,但是缺陷也很明显,比如:1)存在性能问题;2)没有开发者持续维护;3)和流行的 Python 库语法差异巨大,即便是微软大神米格尔亲自操刀制作的TFSharp,也只能做模型推理,不能开发模型和训练模型,目前正处于无人维护的状态。
鉴于以上现状,基于.NET的 AI 智能应用市场几乎还是一片空白的“处女地”。
与市面上的其他产品相比,SciSharp 具有一个特点——技术门槛高。这里,技术门槛高是指在众多的语言绑定里,谷歌官方只推荐 Python binding, 因为只有 Python binding 能完全发挥 Tensorflow 计算功能的上层 API。Python 在其中扮演着非常重要的角色,它负责把模型的计算过程翻译成 TensorFlow 的计算图,这些计算图有的非常复杂,比如一个优化过的 CNN模型包含的计算结点有 15, 000个,这些结点都是用 Python 语言调用 C API 来完成的,其它语言绑定 Java、Scalar 和最新的 Swift 均不能完整构建如此复杂的计算图,因此,SciSharp 在这方面比其他产品略胜一筹。
总之,这片待开发的基于 .NET 的 AI 智能应用“处女地”已被 SciSharp 看到,未来,像 SciSharp 这样的技术社区能够为开发者提供哪些更实用、更有价值的产品和服务,我们拭目以待。
采访嘉宾:
George Zhao,SciSharp社区产品运营负责人,原 “微信”技术专利发明人。
Eric Chen: 微软.NET Foundation会员,TensorFlow.NET项目的维护者、主要代码贡献者,BotSharp项目的主要代码贡献者。
Eli Belash:以色列空军技术学院工程师,NumSharp项目的主要代码贡献者、项目维护者。
Meinrad Recheis:Torch.NET、Numpy.NET项目的原创作者和维护者,NumSharp、TensorFlow.NET项目的主要代码贡献者。
Deepak Kumar Battini:Keras.NET的维护者,TensorFlow.NET和NumSharp的代码贡献者。
Kerry Jiang: SuperSocket作者,eBay资深软件工程师。SciSharp旗下项目ICSharpCore和SharpPythonCompiler的主要开发人员。