每日最新頭條.有趣資訊

為易用而生,揭秘你不知道的最新飛槳核心框架

機器之心發布

機器之心編輯部

11月5日,在Wave Summit+2019深度學習開發者峰會上,飛槳全新發布和重要升級了最新的21項進展,在深度學習開發者社區引起了巨大的反響。機器之心現場親歷了發布會的全部環節,並且在《半年21項全新發布和升級,百度飛槳團隊「碼力」全開》這篇文章中作了詳細介紹,再次引發國貨當自強的評論。

很多未到場的開發者覺得遺憾,希望可以了解飛槳發布會背後的更多技術細節。機器之心策劃了一個系列稿件,分別從核心框架、基礎模型庫、端到端開發套件、工具組件和服務平台五個層面分別詳細解讀飛槳的核心技術與最新進展,敬請關注。

今天給大家帶來的是飛槳系列解讀文章之核心框架揭秘,本文對飛槳最重要的核心框架的進行解讀,公布了大量珍貴的資料內容,很多飛槳核心框架的關鍵性內容屬於首次深度解讀。

飛槳全景圖,本文主要針對核心框架部分進行深度解讀。

第一部分,首先看一下最新版本核心框架的重要升級:

本次核心框架重要升級

1.1.開發-易用性提升

用戶體驗和易用性專項提升,包含全面的文檔優化、報錯信息優化、配置項優化、接口優化、編譯優化、多平台支持以及編程易用性提升等各方面。

1.2.訓練-速度優化

訓練框架進一步優化了速度,完善了顯存優化機制,並支持在框架外部自定義C++/CUDA OP。新增了大量OP,並從多個維度優化了大量存量OP,包括兼容性、行為一致性、功能提升等方面。

分布式訓練新增LocalSGD、GEO-SGD等策略,大規模同步訓練、異步訓練速度繼續提升,並支持K8S + Volcano任務提交。

1.3.預測-部署能力強化

發布Paddle Lite 2.0,定位高性能、多平台、輕量化的端側預測引擎,並可作為伺服器端預測庫的加速庫。

PaddleSlim強化了量化訓練功能,增加了基於硬體的小模型搜索功能。

從Release note中可以看到,本次的升級點還是比較多的。而且從字裡行間也可以看得出,每一個幾十字的點,背後其實是非常重的工作量。但是畢竟缺少細節,我們再來詳細解讀一下發布會PPT的重點內容。

飛槳核心框架升級重點圖文解讀

2.1.核心框架易用性的全面提升

本次發布,核心框架在易用性方面全面提升。

首先是算子的全面性,對於任何一個算法,基本算子庫是基礎,對於完善和全面性都有很高的要求。飛槳通過這次新版本的發布,基本上可以保證支持全部AI主流領域的模型。

其次是API接口的升級,這裡有兩個層面:一是數據層,飛槳本次升級把IO的接口做了非常全面的梳理和進一步的呈現,易用性大幅提升。二是分布式訓練的易用性。在單機上開發好的算法,在訓練時面對非常大規模數據時需要進行分布式訓練,代碼也需要調整,對於不了解分布式訓練的開發者困難很大。通過本次發布,只需要新增5行代碼再加上對於執行語句的少量修改,就可以把單機版改成分布式並行訓練。

最後,根據開發者持續以來的反饋,飛槳不斷的完善文檔的內容,並且提供中英雙語文檔。本次發布,飛槳在中文的文檔上進行了非常多的升級和完善,本著打造藝術品的標準來打磨API文檔。可以為開發者提供更清晰,有示例,甚至有時候會得到一些靈感的文檔。

2.2.分布式訓練的高性能

分布式訓練的高性能,是飛槳的核心優勢技術之一,這也與飛槳本身就是源於大數據的產業實踐分不開的,在CPU和GPU方向分布式性能都有很好的性能優勢。

通過GPU分布式訓練下的Benchmark,可以看到在8x8 v100硬體條件下,相比其他主流實現可以獲得20%-100%的速度提升。

通過多機分布式CPU訓練Benchmark比較,基於飛槳自研的高性能異步訓練算法Geo-SGD,可以看到分布式訓練在Word2Vec和CTR任務中,飛槳吞吐量最大可達對標產品的6倍以上。

同時飛槳與英特爾也開展密切合作,在最新的英特爾至強可擴展處理器上,在保證精度基本不變的情況下,通過INT8的量化訓練,性能的提升也能達到2到3.7倍,非常適合實際業務使用。

2.3.打通端到端的部署全流程

除了開發的易用性和訓練的高性能,飛槳在打通端到端部署方面,也發布了一些最新進展。

從整個端到端部署涉及到的工作內容上看,需要做的工作還是非常多的,首先就是要適配不同的硬體。在最新的版本裡面,飛槳新增了對於華為NPU的適配,以及對於邊緣設備上FPGA的適配。後續還會進一步發布跟寒武紀和比特大陸適配,敬請期待。

從整個打通端到端部署的流程來看,在搭建模型和訓練模型之後,會根據部署環境的特點,對模型做壓縮處理,其目標包括壓縮模型存儲體積和提升推理速度。

目前針對移動設備端環境常見的一個常用且比較成熟的壓縮策略是INT8量化,該方法可以大幅壓縮模型的體積,並提升預測效率。

飛槳在上一個版本已經支持了剪枝、量化、蒸餾等壓縮方法。這次的升級重點是優化和增強自動化網絡結構設計,我們直接把候選模型在具體硬體上的推理速度作為搜索的一個約束條件。基於這種策略,搜索到的模型可能更好的適配目標硬體,在保證精度的情況下獲得更多的速度收益。

在ImageNet1000類分類任務上,通過Light-NAS搜索到的模型,精度無損,在某款移動端硬體上的實際推理速度提升了20%。除了模型壓縮策略增強之外,PaddleSlim通過打通檢測庫提供了更豐富的模型支持,同時保證了壓縮產出的模型支持用PaddleLite直接部署。

了解完PaddleSlim的升級點之後,Paddle Lite 2.0版本也是正式發布。主要特點:

一是非常高的易用性。在移動端開發應用程序或者是在邊緣設備上開發應用程序涉及到非常多的設備環境的連調工作,Paddle Lite裡面提供大量的示例代碼,以及操作的指南,方便大家能夠快速的去實現在不同的設備場景上進行部署。

二是非常廣泛的硬體支持。Paddle Lite目前已經支持了8種主流的硬體,同時還支持華為的NPU和邊緣設備的FPGA。而且Paddle Lite整個架構設計非常便於新硬體的擴展。新的硬體適配,只要去Paddle Lite裡面新增這個硬體相關的Kernel就可以了,與框架代碼是高度解耦的。可以非常便捷的適配新硬體。

三是性能優勢。Paddle Lite一個非常顯著的優勢是在性能方面處在領先狀態。性能的優勢不僅僅是在FP32這種場景下,尤其是在現在移動端已經廣泛普及的INT8上,領先優勢會更加明顯。

對比不同的推理框架使用MobileNetV1在ARM-v8上面推理延時,在FP32上大家可以看到,Paddle Lite 2.0已經具備全面領先的優勢。而右側INT8的條件下,性能優勢更加顯著。在真正的移動端下的推理場景,真正達到的性能的優勢對於實際的應用是至關重要的,時延上的優勢直接關係到最終開發產品的用戶體驗。

飛槳核心框架技術完整公開解讀

飛槳深度學習框架核心技術,主要包括前端語言、組網編程範式、核心架構、算子庫以及高效率計算核心五部分。

3.1.核心架構

飛槳核心架構採用分層設計,如圖3所示。前端應用層考慮靈活性,採用Python實現,包括了組網 API、IO API、OptimizerAPI和執行 API等完備的開發接口;框架底層充分考慮性能,採用C++來實現。框架內核部分,主要包含執行器、存儲管理和中間表達優化;內部表示方面,包含網絡表示(ProgramDesc)、數據表示(Variable)和計算表示(Operator)幾個層面。框架向下對接各種芯片架構,可以支持深度學習模型在不同異構設備上的高效運行。

3.2.關鍵技術

(1)前端語言

為了方便用戶使用,選擇Python作為模型開發和執行調用的主要前端語言,並提供了豐富的編程接口API。Python作為一種解釋型編程語言,代碼修改不需要重新編譯就可以直接運行,使用和調試非常方便,並且擁有豐富的第三方庫和語法糖,擁有眾多的用戶群體。同時為了保證框架的執行效率,飛槳底層實現採用C++。對於預測推理,為方便部署應用,則同時提供了C++和Java API。

(2)組網編程範式

飛槳中同時兼容命令式編程(動態圖)與聲明式編程(靜態圖)兩種編程範式,飛槳以程序化“Program”的形式動態描述神經網絡模型計算過程,並提供對順序、分支和循環三種執行結構的支持,可以組合描述任意複雜的模型,並可在內部自動轉化為中間表示的描述語言。“Program”的定義過程就像在寫一段通用程序。使用聲明式編程時,相當於將“Program”先編譯再執行,可類比靜態圖模式。首先根據網絡定義代碼構造“Program”,然後將“Program”編譯優化,最後通過執行器執行“Program”,具備高效性能;同時由於存在靜態的網絡結構信息,能夠方便地完成模型的部署上線。而命令式編程,相當於將“Program”解釋執行,可視為動態圖模式,更加符合用戶的編程習慣,代碼編寫和調試也更加方便。飛槳後面會增強靜態圖模式下的調試功能,方便開發調試;同時提升動態圖模式的運行效率,加強動態圖自動轉靜態圖的能力,快速完成部署上線;同時更加完善接口的設計和功能,整體提升框架易用性。

(3)顯存管理

飛槳為用戶提供技術領先、簡單易用、兼顧顯存回收與複用的顯存優化策略,在很多模型上的表現優於其他開源框架。

顯存分配機制:

原生的CUDA系統調用(cudaMalloc)和釋放(cudaFree)均是同步操作,非常耗時。為了加速顯存分配,飛槳實現了顯存預分配的策略,具體方式如圖4所示。設置一個顯存池chunk,定義其大小為chunk_size。若分配需求requested_size不超過chunk_size,則框架會預先分配chunk_size大小的顯存池chunk,並從中分出requested_size大小的塊返回。之後每次申請顯存都會從chunk中分配。若requested_size大於chunk_size,則框架會調用cudaMalloc分配requested_size大小的顯存。chunk_size一般依據初始可用顯存大小按比例確定。同時飛槳也支持按實際顯存佔用大小的動態自增長的顯存分配方式,可以更精準地控制顯存使用,以節省對顯存佔用量,方便多任務同時運行。

顯存垃圾及時回收機制

顯存垃圾及時回收機制GC(Garbage Collection)的原理是在網絡運行階段釋放無用變量的顯存空間,達到節省顯存的目的。GC策略會積攢一定大小的顯存垃圾後再統一釋放。GC內部會根據變量佔用的顯存大小,對變量進行降序排列,且僅回收前面滿足佔用大小閾值以上的變量顯存。GC策略默認生效於使用Executor或Parallel Executor做模型訓練預測時。

Operator內部顯存複用機制

Operator內部顯存複用機制(Inplace)的原理是Operator的輸出複用Operator輸入的顯存空間。例如,數據整形(reshape)操作的輸出和輸入可複用同一片顯存空間。Inplace策略可通過構建策略(BuildStrategy)設置生效於Parallel Executor的執行過程中。

(4)算子庫

飛槳算子庫目前提供了500余個算子,並在持續增加,能夠有效支持自然語言處理、計算機視覺、語音等各個方向模型的快速構建。同時提供了高質量的中英文文檔,更方便國內外開發者學習使用。文檔中對每個算子都進行了詳細描述,包括原理介紹、計算公式、論文出處,詳細的參數說明和完整的代碼調用示例。

飛槳的算子庫覆蓋了深度學習相關的廣泛的計算單元類型。比如提供了多種循環神經網絡(Recurrent Neural Network,RNN),多種卷積神經網絡(Convolutional Neural Networks, CNN)及相關操作,如深度可分離卷積(Depthwise Deparable Convolution)、空洞卷積(Dilated Convolution)、可變形卷積(Deformable Convolution)、池化興趣區域池化及其各種擴展、分組歸一化、多設備同步的批歸一化,另外涵蓋多種損失函數和數值優化算法,可以很好地支持自然語言處理的語言模型、閱讀理解、對話模型、視覺的分類、檢測、分割、生成、光學字元識別(Optical Character Recognition,OCR)、OCR檢測、姿態估計、度量學習、人臉識別、人臉檢測等各類模型。

飛槳的算子庫除了在數量上進行擴充之外,還在功能性、易用性、便捷開發上持續增強:例如針對圖像生成任務,支持生成算法中的梯度懲罰功能,即支持算子的二次反向能力;而對於複雜網絡的搭建,將會提供更高級的模塊化算子,使模型構建更加簡單的同時也能獲得更好的性能;對於創新型網絡結構的需求,將會進一步簡化算子的自定義實現方式,支持Python算子實現,對性能要求高的算子提供更方便的、與框架解耦的C++實現方式,可使得開發者快速實現自定義的算子,驗證算法。

(5)高效率計算核心

飛槳對核心計算的優化,主要體現在以下兩個層面。

Operator粒度層面

飛槳提供了大量不同粒度的Operator(Op)實現。細粒度的Op能夠提供更好的靈活性,而粗粒度的Op則能提供更好的計算性能。飛槳提供了諸如softmax_with_cross_entropy等組合功能Op,也提供了像fusion_conv_inception、fused_elemwise_activation等融合類Operator。其中大部分普通Op,用戶可以直接通過Python API配置使用,而很多融合的Op,執行器在計算圖優化的時候將會自動進行子圖匹配和替換。

核函數實現層面

飛槳主要通過兩種方式來實現對不同硬體的支持:人工調優的核函數實現和集成供應商優化庫。

針對CPU平台,飛槳一方面提供了使用指令Intrinsic函數和借助於xbyak JIT匯編器實現的原生Operator,深入挖掘編譯時和運行時性能;另一方面,飛槳通過引入OpenBLAS、Intel MKL、Intel MKL-DNN 和nGraph,對Intel CXL等新型芯片提供了性能保證。

針對GPU平台,飛槳既為大部分Operator用CUDA C實現了經過人工精心優化的核函數,也集成了cuBLAS、cuDNN等供應商庫的新接口、新特性。

注:以上核心框架解讀部分內容已經正式發表在中英文期刊《數據與計算發展前沿》(CN 10-1649/TP,ISSN 2096-742X)

本文對於飛槳核心框架的深度解讀,也是飛槳全新發布完整解讀的系列文章之(一),後續還會繼續推出五篇系列文章,敬請期待。

如果您想詳細了解更多飛槳PaddlePaddle的相關內容,請參閱以下文檔。

官網地址:https://www.paddlepaddle.org.cn/

核心框架:https://github.com/PaddlePaddle/Paddle

分布式訓練:https://github.com/PaddlePaddle/Fleet

PaddleLite:https://github.com/PaddlePaddle/Paddle-Lite

PaddleSlim:https://github.com/PaddlePaddle/models/tree/release/1.6/PaddleSlim

本文為機器之心發布,轉載請聯繫本公眾號獲得授權。

------------------------------------------------

獲得更多的PTT最新消息
按讚加入粉絲團