作者 | 夕顏
出品 | 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為開發者做什麼?
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 能力無縫融入到現有的生產系統裡。
打造基於.NET的機器學習生態
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 庫:
-
Numpy 的.NET版NumSharp
-
TensorFlow 的.NET 移植版TensorFlow.NET
-
與Pandas 對應的Pandas.NET
上面提到的 3 個庫提供了從頭開始編寫 ML 演算法的完整解決方案,SciSharp 的重點之一便是能夠相容用 Python 編寫類庫的所有機器學習演算法,並儘可能無縫地在 5 分鐘內將其遷移到 C#。C# 是微軟公司釋出的一種物件導向的、執行於 .NET Framework 之上的高階程式設計語言。隨著.NET Core 3.0 的即將釋出,這個最初釋出於 2016 年的平臺終於有了最新的主版本,該平臺具有通用性、模組化、跨平臺和開放原始碼的特性。這樣,除了 Python 和 Java,開發者同樣可以使用 C#完成機器學習任務。
最受歡迎的專案
TensorFlow.NET
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 的慢慢完善,能給資料科學家提供的工具函式也將越來越完善。
NumSharp
從 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開發者套件迭代與完善計劃
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的AI智慧應用市場還是一片“處女地”
正如文章開篇所說,目前,在 .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的主要開發人員。
https://www.toutiao.com/a6750967682008351243/