官术网_书友最值得收藏!

2.1 機器學習系統編程模型的演進

隨著機器學習系統的誕生,如何設計易用且高性能的API接口就一直成為了系統設計者首先要解決的問題。在早期的機器學習框架中,人們選擇用Lua(Torch)和Python(Theano)等高級編程語言來編寫機器學習程序,如圖2.1所示。這些早期的機器學習框架提供了機器學習必需的模型定義、自動微分等功能,適用于編寫小型的以科研為導向的機器學習應用。

深度神經網絡從2011年以來快速崛起,很快在各個AI應用領域(計算機視覺、語音識別、自然語言處理等)取得了突破性的成績。訓練深度神經網絡需要消耗大量的算力,而以Lua和Python為主導開發的Torch和Theano無法發揮這些算力的最大性能。與此同時,計算加速卡(如英偉達GPU)的通用API接口(例如CUDA C)日趨成熟,且構建于CPU多核技術之上的多線程庫(POSIX Threads)也被廣大開發者所接受。因此,許多的機器學習用戶希望基于C和C++開發高性能的深度學習應用。這一類需求被Caffe等一系列以C和C++作為核心API的框架所滿足。

圖2.1 機器學習編程框架的發展歷程

然而,機器學習模型往往需要針對部署場景、數據類型、識別任務等需求進行深度定制,而這類定制任務需要被廣大的AI應用領域開發者所實現。這類開發者的背景多樣,往往不能熟練使用C和C++。因此Caffe這一類與C和C++深度綁定的編程框架,成為了制約框架快速推廣的巨大瓶頸。

在2015年底,谷歌率先推出了TensorFlow。相比于傳統的Torch,TensorFlow提出前后端分離相對獨立的設計,利用高層次編程語言Python作為面向用戶的主要前端語言,而利用C和C++實現高性能后端。大量基于Python的前端API(應用程序編程接口)確保了TensorFlow可以被大量的數據科學家和機器學習科學家所接受,同時幫助TensorFlow能夠快速融入Python為主導的大數據生態(大量的大數據開發庫,如Numpy、Pandas、SciPy、Matplotlib和PySpark等)。同時,Python具有出色的和C/C++語言的互操作性,這種互操作性已經在多個Python庫中得到驗證。因此,TensorFlow兼有Python的靈活性和生態,同時也通過C/C++后端得以實現高性能。這種設計在日后崛起的PyTorch、MindSpore和PaddlePaddle等機器學習框架得到傳承。

隨著各國大型企業開源機器學習框架的出現,為了更高效地開發機器學習應用,基于開源機器學習框架為后端的高層次庫Keras和TensorLayerX應運而生,它們提供Python API可以快速導入已有的模型,這些高層次API進一步屏蔽了機器學習框架的實現細節,因此Keras和TensorLayerX可以運行在不同的機器學習框架之上。

隨著深度神經網絡的進一步發展,對于機器學習框架編程接口的挑戰也日益增長。因此在2020年前后,新型的機器學習框架,如MindSpore和JAX進一步出現。其中,MindSpore在繼承了TensorFlow、PyTorch的Python和C/C++的混合接口的基礎上,進一步拓展了機器學習編程模型從而可以高效支持多種AI后端芯片(如華為Ascend、英偉達GPU和ARM芯片),實現了機器學習應用在海量異構設備上的快速部署。

同時,超大型數據集和超大型深度神經網絡的崛起讓分布式執行成為機器學習框架編程框架的核心設計需求。為了實現分布式執行,TensorFlow和PyTorch的使用者需要花費大量代碼將數據集和神經網絡分配到分布式節點上,而大量的AI開發人員并不具有分布式編程的能力。因此MindSpore進一步完善了機器學習框架的分布式編程模型的能力,從而讓單節點的MindSpore程序可以無縫地運行在海量節點上。

在本小節中,以MindSpore為例講解一個現代機器學習框架的Python前端API和C/C++后端API的設計原則。這些設計原則和PyTorch、TensorFlow相似。

主站蜘蛛池模板: 罗山县| 杂多县| 泰和县| 句容市| 大名县| 三门县| 拉萨市| 永吉县| 灵山县| 若羌县| 乌鲁木齐县| 江门市| 册亨县| 迁西县| 房产| 泸水县| 灵宝市| 郓城县| 古丈县| 皮山县| 绵竹市| 广灵县| 清徐县| 彩票| 太仓市| 吐鲁番市| 灯塔市| 若尔盖县| 潞西市| 巨野县| 运城市| 昌乐县| 余干县| 会同县| 延安市| 梅州市| 阜新| 泽州县| 普陀区| 三明市| 六盘水市|