深度學習框架中的框架具體是指軟件框架(Software Framework),軟件框架是指為瞭實現某個業界標準或者完成特定基本任務的軟件組件規范,也指為瞭實現某個軟件規范時,提供規范所要求的基礎功能的軟件產品。
針對性地說對於機器學習或是深度學習而言,由於海量數據的積累和計算機硬件計算能力的提升使其應用越來越廣泛,早期機器學習或是深度學習的研究深度學習通常會涉及到多個不同的步驟和工具,這使得其開發依賴的環境安裝、部署、測試以及不斷迭代改進準確性和性能調優的工作變得非常繁瑣耗時也非常復雜。例如需要用C++或MATLAB來編寫大量的低級算法,同時研究過程中需要一次又一次重復實現相同的算法,這時就需要一個完全公開所有代碼、算法和各個細節的框架,以簡化、加速和優化這個過程;此外由於這些算法僅能被機器學習或深度學習相關領域專傢所理解,而框架的使用則可以簡化瞭這些復雜算法的使用步驟,以便開發人員可以輕松地在應用程序中實現想要的功能。為此學界和業界都作瞭很多的努力,開發並完善瞭多個基礎的平臺和通用工具,也被稱為機器學習框架或深度學習框架。
當前各式各樣的框架的發展充分賦能機器學習,尤其是深度學習領域,為開發者提供瞭極致便利,作為機器學習革命的腳手架,其使得更多機器學習從業者能夠使用合適的領域特定編程語言和豐富的構建模塊更容易組裝模型。因此,軟件框架是整個人工智能技術核心體系,實現對於人工智能算法的封裝,數據的調用以及計算資源的使用,起到承上啟下的重要作用。
人工智能、機器學習與深度學習這三個概念前面介紹到是依次包含的關系,即機器學習是人工智能的子領域,深度學習又是機器學習的子領域,也可以粗略理解為:人工智能是“目標”,機器學習是“手段”,深度學習是機器學習中的其中一種方法。因此,深度學習框架和機器學習框架兩者之間也存在一定的聯系和區別。
420b794ecedae656f83c42cb694b2b52
機器學習是指根據提供的數據以及模型方法等資料,通過機器來尋找相關的函數function,因而機器學習能夠通過使用多種算法來自動化實現各種業務操作並使機器模仿人的行為。具體而言,機器學習框架是一個接口,可以使用它來無縫部署智能機器學習模型,以實現更快和更自動化的工作。如下圖所示,機器學習框架進行的步驟:先準備一個函數集function set,也稱為model(模型);使用訓練數據Training Data判斷這個函數function或者模型是好是壞;有效率的演進算法會自動挑選出最好的函數function或模型,進而可以使用該函數進行測試、部署等工作。
廣義上機器學習框架包含瞭深度學習框架,所以深度學習框架的步驟也想類似,但業界一般的共識來看,本質上機器學習框架涵蓋用於分類、回歸、聚類、異常檢測和數據準備等各種學習方法;深度學習框架則專註於神經網絡結構,涵蓋許多具有多隱藏層的各類神經網絡拓撲。
代表性的機器學習框架包括Scikit-learn、Apache Mahout、SystemDS、Spark MLlib等等,下面以Scikit-learn為例簡要介紹一下機器學習框架,Scikit-learn是開源的Python庫,通過統一的界面實現機器學習、預處理、交叉驗證及可視化算法,通過Python的各種包來構建,從下圖可以看出它能夠實現的功能包括分類、聚類、降維、模型選擇、預處理等。其中,分類是指識別對象屬於哪個類別,回歸是指預測與對象關聯的連續值屬性,聚類是指自動將相似對象分組到集合中,降維是指減少要考慮的隨機變量的數量,模型選擇是指比較、驗證和選擇參數和模型,預處理是指對數據進行特征提取和歸一化等操作。
其作為機器學習框架的代表,可以與熟悉的深度學習框架對比有以下幾點區別:
1、對於數據處理的方式不同導致瞭功能不同
Scikit-learn等機器學習框架的定位是通用機器學習庫,而深度學習框架的定位主要是深度學習庫。一個顯而易見的不同是在進行數據處理時,機器學習框架是利用特征工程 (feature engineering),如如維度壓縮、特征選擇、轉換格式等人為對數據進行提煉清洗,而深度學習框架則利用表示學習 (representation learning),由模型自身對數據進行提煉並學習數據的表示。
2、模型封裝的抽象化程度不同,從而給予開發者使用的自由度不同
Scikit-learn等機器學習框架中的模塊都是高度抽象化的,實現相關功能的調用基本都可以在很短的幾行代碼內完成,同時例如transform等所有的轉換器也都有固定的格式。這種抽象化雖然增加瞭模型的效率,降低瞭批量化、標準化的的難度,但限制瞭使用者的自由度。而深度學習框架則不同,有很高的自由度,開發者可以自定義實現自己需要實現的算法,像封裝在TensorFlow 等工具庫上的更高級的框架Keras更像深度學習界的Scikit-learn。
3、針對的群體和項目不同
Scikit-learn等機器學習框架主要適合中小型的、實用機器學習項目,尤其是那種數據量不大且需要使用者手動對數據進行處理,並選擇合適模型的項目,這類項目往往對硬件要求低,在 CPU 上就可以完成。而深度學習框架主要適合已經明確瞭解需要用深度學習,且數據處理需求不高的項目。這類項目往往數據量較大,且最終需要的精度更高,一般都需要 GPU 等加速器運算。
因此,像Scikit-learn等機器學習框架也有神經網絡模塊,但不適合做復雜的、大型的深度學習項目;而深度學習框架也可以用於做傳統的機器學習,由於需要手動實現相關算法往往事倍功半。更常見的情況下,可以把這兩種框架,甚至和深度學習框架的高級封裝Keras結合起來使用,發揮所長,例如Scikit-learn機器學習框架肩負基本的數據處理任務,TensorFlow用於在完整的的數據上進行嚴肅的調參任務,更高層的封裝Keras用於對問題進行小規模實驗快速驗證想法。
深度學習框架又具體包括:訓練框架和推理框架。在介紹相關內容之前,首先區別深度學習中”訓練”、“推理”以及“部署”三個概念:
訓練過程是指定義好神經網絡拓撲之後,通過輸入數據迭代更新模型的權重,旨在學習一組好的模型權重值。
深度學習算法的重要能力是對未知的新數據做出預測,而所依據的則是在已知數據上訓練出的模型。這個過程與人面對問題時依據經驗思考推導後得出結論相類似,所以在人工智能領域又被稱為推理或者推斷(Inference)。所以對於深度學習而言,訓練和推理是兩個不同的行為。將新數據輸入訓練得到的模型,得到輸出結果,就是預測或者推理。看起來推理階段會比訓練更加簡單,因為從原理上隻需要對神經網絡完成前向計算即可。所以對一個可支持訓練的深度學習框架來講,天然是可以完成推理計算的。
在實際應用中,推理階段可能會面臨和訓練完全不一樣的硬件環境,當然也存在著不一樣的計算性能的要求。因此要使訓練得到的模型,能在具體生產環境中可以正確、高效地實現推理功能,就需要進行部署(Deployment)這一操作環節。
因此深度學習框架按照應用場景分為雲端訓練、雲端推斷以及端側推斷三類。不同應用場景任務不同,所需承載的計算及相關限制條件也存在差異,因此針對各場景計算工具的功能及性能要求均有不同。
雲端訓練框架主要完成面向海量數據的模型訓練任務,對算力要求最高,實際應用中需要采用分佈式計算等技術,同時對於工業級模型及穩定性也有特殊要求。目前像TensorFlow等深度學習雲端訓練框架技術及生態已經趨於成熟,由於其各自特性也在業務部署中得到瞭充分使用。
基於深度學習的推理計算相對訓練過程計算量要小很多,但仍涉及到大量的矩陣卷積、非線性變換等運算,需要開發專用工具或框架實現業務部署,提升計算效率。總的來看,推理框架部署環境主要分為兩類:一類是在手機終端以及不同嵌入式設備上部署的推理框架,另一類是一類是在服務器端部署的推理框架。
雲端推理框架主要完成訓練模型的優化、雲端部署及推斷計算等工作,限制條件較終端推斷要求相對較少,但對於計算性能、並發性、業務實時性等要求更為嚴格。雲端端推斷框架受到訓練框架軟硬件生態影響較大,在技術選項方面有一定的延續性,如業界主流的TensorFlow等框架也被廣泛應用於雲端推斷。此外,許多芯片廠商也開發瞭相應的推理框架, 如NVIDIA的TensorRT,Intel的openVIVO,這些芯片廠商其在底層所做的大量性能優化工作,能夠有效降低單機服務成本,增加單機服務請求量計算,從而保證在計算資源占用量小的情況下也能夠有效提升推理速度。
在手機終端以及不同嵌入式設備上部署的端側推理框架主要完成訓練模型在終端的部署及計算,由於終端功耗、功能、芯片等眾多限制,這對於終端推斷框架的性能、能耗及自身優化需產生瞭多種限制要求。產業界在手機端推斷側應用主要包括自動拍照、AR 手勢識別、實時翻譯以及目標識別等應用,對於實時性、多硬件平臺及終端能耗有著特殊需求。為滿足這些實際需求,業界開發瞭眾多開源的推斷軟件框架供生產使用,在智能手機上,Android 系統可以選擇 TensorFlow Lite,Apple系統可以選擇 CoreML,此外國內騰訊、阿裡等企業開源的移動端推理框架NCNN、TNN、MNN等也具有一定影響力。而對於手機之外的端側系統,目前產業界尚未形成成熟解決方案,需要從硬件加速器到軟件工具鏈進一步打磨。國內開源的百度、華為深度學習框架也都包含瞭用於端側推理框架PaddlePaddle Lite、MindSpore Lite,針對大部分業界主流模型,提供端側通用硬件的部署推理支持。
圖片所示為人工智能框架白皮書中針對框架發展歷程的一個梳理,此外國外資深軟件工程師也細數瞭二十一世紀以來的深度學習框架的發展歷程,並將其劃分瞭石器、青銅、鐵器、羅馬和工業化時代,下面將以兩者作為參考,並查找整理瞭相應階段框架的使用以及特性,回顧深度學習框架的演變。
大約從神經網絡概念被提出到2012年這一時期,受限於計算能力不足,這一階段的神經網絡技術影響力相對有限,在21世紀初前後就出現瞭一些描述和開發神經網絡的傳統的機器學習工具來提供基本支持,也就是當今AI 框架的雛形,包括MATLAB、OpenNN、Torch等。
MATLAB是由美國MathWorks公司出品的商業數學軟件。MATLAB是一種用於算法開發、數據分析以及數值計算的高級技術計算語言和軟件環境。但該工具早期用於數值計算並不是專門為神經網絡模型開發定制的,因此在構建神經網絡並訓練需要手動實現算法,控制相關參數,如圖展示瞭使用MATLAB實現反向傳播算法訓練網絡的函數MnistConv,該函數功能是獲取神經網絡的權重和訓練數據,並返回訓練後的權重。從代碼的實現中可以看出這整個算法實現的過程中需要手工控制相關參數,而且涉及到的參數也較多,隻適用於專業領域的開發人員進行實現,當模型變化需要重新進行相應編碼,比較繁瑣和復雜。
78ce04fc805a1cfcb02641bc37bdac59
這一時其的另一種框架是OpenNN,開發起源於2003 年在國際工程數值方法中心的一個名為 RAMFLOOD(洪水風險評估和管理)的歐盟資助研究項目,它是一個使用C++編寫的開源類庫以實現神經網絡。由於采用C++開發,因此它有更好的內存管理和更高的處理速度。這個是利用OpenNN來實現深度學習的例子,從數據集的處理到神經網絡的構建再到訓練、測試、預測等都需要使用C++實現。
上面兩種框架一種是MATLAB另一種是采用C++,這兩種接口對開發者而言相對不友好,因此如何設計易用且高性能的編程接口就一直成為瞭框架設計者首要解決的問題。在早期的機器學習框架中,人們選擇用Lua(Torch)這一高層次編程語言來編寫深度學習的程序。
Torch是由Facebook開源的機器學習庫和科學計算框架,Torch 的總體思路非常簡單:首先,DataSet 生成一個或多個“訓練示例”。Trainer 將它們提供給 Machine,該 Machine中開發者使用Torch庫中封裝的例如卷積等計算搭建神經網絡,計算輸出,並由Trainer 使用該輸出來調整 Machine 的參數。 在此過程中,也可以使用一個或多個Measures來監控系統的性能。
但這些框架 API 極其復雜對開發者並不友好,且這些工具並沒有對 GPU 算力進行支持。這些早期的機器學習框架並不完善,開發者仍然不得不進行大量基礎的工作,但是在框架不斷的發展中,後續如Torch7也引入瞭張量、並行化OpenMP、CUDA、更多包的支持,進一步提升編程友好型和性能,如下是Torch7中實現深度學習的一個例子。由於Lua是一門需要新學習的語言,增加瞭學習成本,因此後續Facebook又開發瞭Python版本的Torch,即PyTorch。MATLAB也在不斷發展中提供瞭卷積等操作的封裝,也建立起神經網絡包和模型庫,並且也提供瞭可拖拽的可視化界面去搭建神經網絡。
青銅時代這一階段框架的發展得益於深度神經網絡快速崛起,並很快在各個AI應用領域(計算機視覺,語音識別,自然語言處理等)取得瞭最先進的性能。2012 年,著名的 AlexNet模型在 ImageNet 數據集上達到瞭最佳精度,引爆瞭深度神經網絡的熱潮。自此極大地推動瞭 AI 框架的發展,出現瞭 Caffe、Theano和Chainer等具有代表性的早期 AI 框架,幫助開發者方便地建立復雜的深度神經網絡模型,如 CNN、RNN、LSTM 等。
不僅如此,計算加速卡(如英偉達GPU)的通用編程接口(例如CUDA C)日趨成熟,而構建於CPU多核技術之上的多線程庫(POSIX Threads)也被廣大開發者所接受。因此,許多的機器學習用戶希望基於C和C++來開發高性能的深度學習應用。這一類需求被Caffe等一系列以C和C++作為核心編程接口的框架所滿足,這些框架開始支持多 GPU 訓練,讓開展更大、更深的模型訓練成為可能。
在這一階段,AI 框架體系已經初步形成,聲明式風格和命令式風格為之後的 AI 框架趟出瞭兩條不同的發展道路:以Caffe、Theano為代表的聲明式編程風格和以Chainer為代表的命令式編程風格。命令式編程告訴機器怎樣做,聲明式編程關註的是做什麼,由框架(機器)完成怎麼做的過程。
Caffe是以C++/CUDA代碼為主的深度學習框架,需要進行編譯安裝,支持命令行、Python和MATLAB接口,單機多卡、多機多卡等都可以很方便的使用。
Caffe中的神經網絡是由一系列連接的Layer層組成的 a directed acyclic graph(DAG,有向無環圖)。自定義構建網絡時,需要定義各層的參數,這些參數寫在固定的prototxt傳輸格式文件當中,同時用於訓練和測試的網絡需要分別構建相應的prototext文件。還需要定義包含具體訓練參數的prototxt,根據這些參數文件,執行腳本進行訓練,生成模型;對模型進行部署應用。
790c8b92f2447bc3d34a746ee8450ca2
同時使用Caffe的好處是其內置瞭很多種預先訓練好的模型庫,可以下載後立即使用,而無需編碼。然而,機器學習模型往往需要針對部署場景,數據類型,識別任務等需求進行深度定制,而這類定制任務需要被廣大的AI應用領域的開發者所實現需要 C++ 和 CUDA 來編寫新 GPU 層級。這類開發者的背景多樣,其往往不具有熟練使用C和C++的背景,因此Caffe這一類庫與C和C++深度綁定的編程模型快速成為瞭制約這一類框架快速推廣的巨大瓶頸。
Theano是一個Python庫和優化編譯器的開源項目,用於操作和評估數學表達式,尤其是矩陣表達式,其計算使用Python風格的Numpy語法的編程接口,並且編譯後可在CPU/GPU架構上高效運行。它采用計算圖的內部表示,這種表示也被後來的深度學習框架所借鑒使用,所以其也被稱為深度學習框架的鼻祖。
其優點是使用Python+NumPy編程接口,對用戶較為友好、使用圖結構下的符號計算架構、對RNN支持很好、缺點是偏底層,在Theano之上有更高級的封裝Keras和Lasagne等緩解瞭這一問題。調試困難、編譯時間長、主要是針對圖像領域而言沒有預訓練好的模型可以用、相對Torch更臃腫。
Chainer是一個開源的深度學習框架,使用Python編程接口,它的一個特點是采用邊運行邊定義方式的命令式編程接口。訓練一個神經網絡一般需要三個步驟:(1)基於神經網絡的定義來構建計算圖;(2)輸入訓練數據並計算損失函數;(3)使用優化器迭代更新參數直到收斂。通常,深度學習框架在步驟2之前先要完成步驟1。 我們稱這種方法是“先定義再運行”。 對於復雜神經網絡,這種“先定義再運行”的方法簡單直接,但並不是最佳的,因為計算圖必須在訓練前確定,這就會使代碼變的難以調試和維護。
與之不同的是,Chainer使用一種“邊運行邊定義”的獨特方法,它將第一步和第二步合並到一個步驟中去。計算圖不是在訓練之前定義的,而是在訓練過程中獲得的。這種方式可以讓用戶以在每次迭代甚至對於數據樣本以及需求中對計算圖做各種修改,方便調試。
此外Chainer還有許多功能可以幫助用戶容易高效地實現他們自己的神經網絡,包括采用CuPy這種GPU使用的 NumPy等效數組後端。它支持獨立於CPU / GPU的編碼,可以石器通過充分利用NVIDIA的CUDA和cuDNN以性能著稱。
之後進入鐵器時代,2015 年的ResNet再次突破瞭圖像分類的高點,在 ImageNet 數據集上的準確率再創新高,也終於凝聚瞭產業界和學界的共識,那就是深度學習將成為下一個重大技術趨勢,大型科技公司加入瞭開發深度學習框架的力量。在這一到兩年裡,Google 開源瞭著名的 TensorFlow 框架,Caffe 的發明者加入瞭Facebook(現更名為 Meta)並發佈瞭 Caffe2;與此同時,FacebookAI 研究團隊也發佈瞭另一個流行的框架 PyTorch,該框架拓展自Torch 框架,但使用瞭更流行的 Python API。微軟研究院開發瞭CNTK 框架。Amazon 采用瞭華盛頓大學、CMU 和其他機構的聯合學術項目 MXNet,國內的百度則率先於2016年佈局開源瞭 PaddlePaddle 飛槳深度學習框架。
谷歌率推出的TensorFlow,相比於傳統的Caffe、Torch和Theano,TensorFlow借鑒瞭 Theano 的聲明式編程風格,提出利用高層次編程語言:Python作為面向用戶的主要前端語言,幫助TensorFlow能夠快速融入Python為主導的大數據生態,而利用C和C++實現高性能後端得以實現高性能。這種設計在日後崛起的PyTorch,MXNet和CNTK的機器學習框架得到傳承。
而 PyTorch 則繼承瞭 Torch 直觀且用戶友好的命令式編程風格。雖然命令式編程風格更靈活(例如定義 while 循環等)且易於跟蹤,但聲明式編程風格通常為內存和基於計算圖的運行時優化提供更多空間。
另一方面,被稱為“mix-net”網絡的 MXNet 通過同時支持一組符號(聲明性)API 和一組命令式 API ,並通過一種hybridization方法優化瞭使用命令式API描述的模型的性能,從而享受瞭這兩種編程風格的好處。在命令式編程上MXNet提供張量運算,進行模型的迭代訓練和更新中的控制邏輯;在聲明式編程中MXNet支持符號表達式,用戶可以自由的混合它們來快速實現自己的想法。例如我們可以用聲明式編程來描述神經網絡,並利用系統提供的自動求導來訓練模型。另一方面,模型的迭代訓練和更新模型法則中可能涉及大量的控制邏輯,因此我們可以用命令式編程來實現。同時我們用它來進行方便地調式和與主語言交互數據。MXNet也相較之前的框架提供瞭多種編程接口。
Caffe 的發明者加入 Facebook 並繼續發佈Caffe2,將Caffe2中計算的基本單元之一是Operators,其進一步增加瞭對大規模分佈訓練、除瞭CPU和CUDA之外新的硬件支持、提供瞭更為豐富的模型庫,Caffe2在移動和大規模部署方面表現出色。CNTK:微軟研究院開發瞭 CNTK 框架微軟的開源人工智能框架CNTK最大的優勢就是訓練速度快、分佈式和並行計算性能好。
隨著多個深度學習框架的出現,Keras等高層次深度學習開發庫提供瞭更高層次的Python API從而可以快速導入已有的模型, 這些高層次API進一步屏蔽瞭底層框架的實現細節,是一個高度模塊化的神經網絡庫,支持GPU和CPU。能夠在TensorFlow,CNTK或Theano之上運行。 Keras的特點是能夠快速實現模型的搭建, 簡單方便地讓開發者實現從想法到實驗驗證的轉化,這都是高效地進行科學研究的關鍵。
就像人類歷史的發展一樣,經過一輪深度學習框架的激烈角逐,最終形成瞭兩大“帝國”的雙頭壟斷:TensorFlow 和 PyTorch,它們代表瞭深度學習框架研發和生產中超過 95% 的用例。Chainer 團隊在2019年將他們的開發工作轉移到瞭PyTorch;同樣微軟也停止瞭CNTK 框架的開發,部分團隊轉而支持Windows和ONNX運行時的 PyTorch;Keras被TensorFlow收編,並在TensorFlow 2.0版本中成為其高級API之一;MXNet 在深度學習框架領域仍然位居第三。
這一時期框架的特征是業界不斷對TensorFlow以及PyTorch進行改進,使其對於大模型訓練有瞭很好的支持;在並行計算、編程友好型上有瞭進一步提升,深度學習框架有兩個趨勢:
大模型訓練:隨著BERT 及其基於 Transformer 的同類產品GPT-3的誕生,訓練大型模型的能力成為深度學習框架的理想特性。這需要深度學習框架能夠在多達數百個甚至數千個設備的規模上進行有效訓練。
可用性:這一時期的所有深度學習框架都采用瞭命令式編程風格,因為它具有靈活的語義和易於調試的特點。同時,這些框架還提供瞭用戶級的設計器或 API,通過一些JIT即時編譯器技術來實現高性能。
之後,深度學習框架的發展進入瞭工業時代,深度學習在從自動駕駛、個性化推薦、自然語言理解到醫療保健等廣泛領域的巨大成功,帶來瞭前所未有的用戶、開發者和投資者浪潮。框架不斷增加對於多場景多任務的支持,在頂層和底層都不斷擴充提供豐富的套件以及硬件支持,同時更好地利用算力、調動算力,充分發揮硬件資源的潛力,追求性能,而不斷改進和優化。此外,人工智能與社會倫理的痛點問題也促使可信賴人工智能在框架層面的進步。
這一時期國內也湧現出很多開源的框架,如昇思MindSpore、天元MegEngine、一流OneFlow以及清華大學學術團隊開發的Jittor計圖等。
回顧整個深度學習框架的發展歷程,可以更清楚地看到深度學習框架和深度學習算法之間的緊密耦合關系,這種相互依賴的良性循環推動瞭深度學習框架和工具的快速發展。而未來十年是開發深度學習工具和框架的黃金時期。盡管深度學習框架從一開始就有瞭顯著的進步,但它們在深度學習領域的地位還遠不如編程語言JAVA/C++在互聯網應用開發中的那樣成熟,仍有改進的機會和工作還有待探索和完成,以下幾點趨勢:
基於編譯器的算子優化
如今,許多算子內核要麼是手動實現的,要麼是通過一些針對特定硬件平臺的第三方庫(如BLAS、CuDNN、OneDNN 等)實現的。當模型在不同的硬件平臺上訓練或部署時,這會導致大量開銷。此外,新的深度學習算法的發展速度通常比這些庫的迭代快得多,這使得這些庫通常不支持新的算子。諸如Apache TVM、MLIR、Facebook Glow等深度學習編譯器,提出瞭基於編譯器的算子優化能在任何硬件後端上進行優化和有效計算。
編程接口的不斷發展優化
編程接口對用戶友好型不斷提升,以提供簡單的開發體驗。幫助開發者實現網絡自動切分,隻需串行表達就能實現並行訓練,降低門檻以簡化開發流程;同時也具有靈活的調試模式,具備訓練過程靜態執行和動態調試能力,開發者通過變更一行代碼即可切換模式,快速在線定位問題。同時像FreeTensor等編程接口也從優化層面,對不規則張量的表達處理進行一定的優化和改進,從而獲得性能的提升。
大模型分佈式訓練的支持
超大型數據集和超大型深度神經網絡崛起讓分佈式執行成為瞭機器學習框架編程模型的核心設計需求,支持多節點或多設備訓練正在成為深度神經網絡訓練的規范。最近開發的深度學習框架,例如 OneFlow從最初就將這一理念納入設計考慮,這為性能優化提供瞭更多機會。為瞭實現分佈式執行,TensorFlow和PyTorch也進一步優化開發相關組件來支持將數據集和神經網絡分配到分佈式節點上來提供相關支持。MindSpore進一步完善瞭機器學習框架的分佈式編程模型的能力,從而讓單節點的MindSpore程序可以無縫地運行在海量節點上,同時也在不斷優化自動並行、混合並行等分佈式策略。
全場景協同、安全可信
深度學習框架在上層和底層都不斷完成其生態,上層通過構建預訓練模型庫以及開發相應科學計算組件以支持多學科多領域的應用,在底層也不斷地高效支持多種後端芯片以實現深度學習應用在海量異構設備上的全場景快速部署,充分發揮硬件潛能,幫助開發者縮短訓練時間,提升推理性能;同時也對於模型訓練過程中考慮瞭隱私保護、模型安全等,讓開發者專註於深度學習應用的創造。
同時支持動態圖和靜態圖,兼顧靈活性和高性能
動態計算意味著程序會按照研發人員編寫命令的順序進行執行,這種機制將使得調試更加容易,並且也使得想法轉化為實際代碼變得更加容易。而靜態計算則意味著程序程序在編譯執行時將先生成神經網絡的結構,然後再執行相應操作。而靜態計算是通過先定義後執行的方式,之後再次運行的時候就不再需要重新構建計算圖,所以速度會比動態圖更快。從理論上講,靜態計算這樣的機制允許編譯器進行更大程度的優化,但是這也意味著所期望的程序與編譯器實際執行之間存在著更多的代溝,代碼中的錯誤將更加難以發現,如計算圖的結構出現問題。框架中對於動態圖、靜態圖進行融合並靈活轉換可以使得兩者優勢相結合,同時兼顧靈活性和性能。
訓練推理一體化
由於模型訓練過程與推理過程的需求不同,例如一個精妙設計的模型可能算法訓練的時候使用瞭一種自定義的算子 Operator,以及為瞭讓量化的模型精度更高,算法效果更好,可能需要在訓練過程中來進行量化訓練,訓練各種 Operator 的量化參數。 這時候,使用推理框架對訓練好的模型推理就可能遇到如Operator 不支持、轉換參數錯誤、量化精度不夠等問題。為此框架發展過程中也在設計方面考慮將訓練推理一體化,以減少模型轉換帶來的問題。如曠視推出天元 MegEngine,在訓練推理一體化方面深度佈局,百度的飛槳PaddlePaddle也追求速度體驗,設計推理引擎一體化實現訓練到多端推理的無縫對接。
小樣本訓練支持
2020年開始,小樣本訓練的問題也越來越引起行業的重視,重點解決數據量不夠的場景,例如工業數據,用小樣本訓練就能完成同樣準確度,顛覆深度學習,例如強化學習RL中的生成對抗網絡GAN,圖像數據可以通過旋轉、裁切或改變明暗等方式增加數據量,目前有相當多領域透過GAN方法生成非常近似原始數據的數據,但因為比較新穎,框架也需要更好地支持強化學習、對抗生成網絡的支持以增加數據量。
如果你不註意防范,患上類風濕性關節炎的風險就會增加。傢裡衣物總是晾不幹,被子濕漉漉的,地板和墻面滿是水跡,空氣中還有...