Paddle Release Note
Paddle Release Note
重要更新
飛槳paddle框架2.0.0版本有如下重要更新:
? 編程范式:默認(rèn)開(kāi)啟動(dòng)態(tài)圖模式進(jìn)行模型開(kāi)發(fā)和訓(xùn)練,通過(guò)動(dòng)轉(zhuǎn)靜的方式進(jìn)行模型部署和訓(xùn)練加速。如果需要使用靜態(tài)圖編程范式,可以通過(guò)paddle.enable_static()來(lái)切換到靜態(tài)圖模式。
? API體系:對(duì)API進(jìn)行了補(bǔ)充,對(duì)目錄結(jié)構(gòu)進(jìn)行了調(diào)整,使得更加易用,詳情請(qǐng)見(jiàn):API文檔,同時(shí),提供高層API簡(jiǎn)化使用流程;詳情請(qǐng)見(jiàn):飛槳paddle高層API使用指南。
? 框架功能:對(duì)數(shù)據(jù)加載、動(dòng)態(tài)圖執(zhí)行,OP性能,混合精度訓(xùn)練,分布式訓(xùn)練,動(dòng)靜轉(zhuǎn)換,等進(jìn)行了功能增強(qiáng)和性能優(yōu)化。
? 環(huán)境適配: 提供了對(duì)ARM架構(gòu)CPU的支持,增加了對(duì)Python 3.8、CUDA 10.1/10.2的支持,發(fā)布支持CUDA11的安裝包(experimental),發(fā)布支持百度昆侖芯片的安裝包(experimental),詳情請(qǐng)見(jiàn):開(kāi)始使用。
? 模型庫(kù)及開(kāi)發(fā)套件:飛槳paddle的官方模型庫(kù)和套件已經(jīng)完成絕大部分模型升級(jí)至飛槳paddle框架2.0.0版本。
o PaddleHub:支持2.0動(dòng)態(tài)圖,全面遷移動(dòng)態(tài)圖編程模式,模型開(kāi)發(fā)調(diào)試更加方便,finetune接口更加靈活易用。
o PaddleDetection: 支持2.0動(dòng)態(tài)圖,覆蓋檢測(cè)方向主流算法(PP-YOLO、Faster-RCNN、SOLOv2),支持動(dòng)靜轉(zhuǎn)換,打通預(yù)測(cè)部署,提供了更加模塊化的組網(wǎng)方式。
o PaddleClas: 支持2.0動(dòng)態(tài)圖,提供了29個(gè)系列的分類算法和134個(gè)預(yù)訓(xùn)練模型,提供了基于SSLD知識(shí)蒸餾的優(yōu)化方案,將分類模型的精度普遍提升3%以上。
o PaddleSeg: 支持2.0動(dòng)態(tài)圖,提供了50+的高質(zhì)量預(yù)訓(xùn)練模型,支持15+主流分割網(wǎng)絡(luò),提供了業(yè)界的SOTA模型OCRNet,很好的提升了產(chǎn)品易用性。
o PaddleOCR: 支持2.0動(dòng)態(tài)圖,PPOCR系統(tǒng)、文字檢測(cè)模型(DB,EAST,SAST)與文字識(shí)別模型(Rosetta,CRNN,StarNet)完成2.0動(dòng)態(tài)圖適配。
o PaddleGAN:支持2.0動(dòng)態(tài)圖,所有模型,包括風(fēng)格遷移、視頻增強(qiáng)、唇形遷移、人臉動(dòng)漫化等九種模型均基于動(dòng)態(tài)圖開(kāi)發(fā)。
o PaddleRec:支持2.0動(dòng)態(tài)圖,免安裝,動(dòng)靜組網(wǎng)統(tǒng)一,方便用戶的調(diào)研和上線,同時(shí)整理發(fā)布了推薦系統(tǒng)經(jīng)典數(shù)據(jù)集。
o PaddleNLP:支持2.0動(dòng)態(tài)圖,提供25+預(yù)訓(xùn)練模型和易用的API方式提升文本建模效率。
o Parakeet:支持2.0動(dòng)態(tài)圖,已發(fā)布的聲學(xué)模型及聲碼器均良好支持動(dòng)態(tài)圖版本。
o PaddleVideo:支持2.0動(dòng)態(tài)圖,包含了視頻分類和視頻動(dòng)作定位方向模型,包括: TSN、TSM、SlowFast、AttentionLSTM、BMN模型以及特色應(yīng)用預(yù)訓(xùn)練模型VideoTag和FootballAction。
o AmazonDJL:易用流暢的 Java 推理接口,支持各操作系統(tǒng)平臺(tái)(Mac / Windows / Linux),支持 Paddle 預(yù)訓(xùn)練模型讀取。
前瞻性預(yù)告
? 飛槳paddle框架計(jì)劃在未來(lái)的某個(gè)版本起,放棄對(duì)python2和python3.5的支持,建議您升級(jí)python到3.8版本來(lái)使用飛槳paddle。
? 飛槳paddle框架計(jì)劃在未來(lái)的某個(gè)版本起,放棄對(duì)CUDA9的支持,建議您升級(jí)CUDA版本來(lái)使用飛槳paddle。
訓(xùn)練框架
兼容性說(shuō)明
? 編程范式:飛槳paddle2.0.0默認(rèn)開(kāi)啟了命令式編程范式(動(dòng)態(tài)圖),但仍然保留對(duì)靜態(tài)圖的支持,靜態(tài)圖代碼(包括1.8版本的靜態(tài)圖代碼),可以通過(guò)添加paddle.enable_static()后來(lái)運(yùn)行。
? API:飛槳paddle框架2.0.0版本推薦用戶使用位于paddle根目錄下的API,同時(shí)在paddle.fluid目錄下保留了所有的1.x版本的API,保留對(duì)之前版本API體系的支持。因此,1.x版本的靜態(tài)圖訓(xùn)練代碼,添加paddle.enable_static()即可在2.0.0版本上正常運(yùn)行;1.x版本訓(xùn)練保存的模型,可以使用2.0.0版本進(jìn)行推理。
? 整理了1.8版本API到2.0版本API的對(duì)應(yīng)關(guān)系表。
? 提供了遷移工具,來(lái)方便您將基于舊版本的代碼遷移為2.0.0版本的代碼,詳情請(qǐng)見(jiàn):版本遷移工具。
動(dòng)態(tài)圖模式
默認(rèn)開(kāi)啟動(dòng)態(tài)圖模式進(jìn)行模型開(kāi)發(fā)和訓(xùn)練,通過(guò)動(dòng)轉(zhuǎn)靜的方式進(jìn)行模型部署和訓(xùn)練加速。詳情,請(qǐng)參看:動(dòng)態(tài)圖,動(dòng)態(tài)圖轉(zhuǎn)靜態(tài)圖。
API體系
? 基礎(chǔ)API
o API目錄結(jié)構(gòu)調(diào)整,1.x 版本的API主要位于paddle.fluid目錄,本版本對(duì)API目錄結(jié)構(gòu)進(jìn)行調(diào)整,使得分類更為合理,具體調(diào)整后的目錄說(shuō)明請(qǐng)參見(jiàn)API文檔。
o 新增API共186個(gè),修復(fù)和完善API共260個(gè):詳情請(qǐng)參考2.0.0 pre release版本的release notes,以及API文檔。
o 新增分布式基礎(chǔ)通信類API到paddle.distributed: broadcast, all_reduce, reduce, all_gather, scatter, barrier;動(dòng)態(tài)圖多卡訓(xùn)練啟動(dòng)API spawn, init_parallel_env,動(dòng)靜統(tǒng)一啟動(dòng)方式fleetrun
o 組網(wǎng)類API實(shí)現(xiàn)動(dòng)靜統(tǒng)一,支持在動(dòng)態(tài)圖模式和靜態(tài)圖模式兩種模式下運(yùn)行。
? 高層API
o 新增飛槳paddle高層API,對(duì)模型開(kāi)發(fā)過(guò)程中常見(jiàn)的組網(wǎng)、訓(xùn)練、評(píng)估、預(yù)測(cè)、存取等操作進(jìn)行封裝,實(shí)現(xiàn)低代碼開(kāi)發(fā),請(qǐng)參見(jiàn)飛槳paddle高層API使用指南。
o 新增分布式高層API paddle.distributed.fleet,支持通過(guò)配置DistributedStrategy來(lái)支持多種優(yōu)化策略組合和自動(dòng)并行、分布式指標(biāo)計(jì)算、InMemoryDataset
功能優(yōu)化(含分布式)
動(dòng)態(tài)圖基礎(chǔ)功能
? 易用性優(yōu)化:
o Tensor功能增強(qiáng):新增Tensor拷貝接口Tensor.clone(),及120余個(gè)Tensor計(jì)算操作接口(如Tensor.cos()等);新增使用索引或切片原地修改Tensor的功能;新增Tensor與Scalar運(yùn)算時(shí)自動(dòng)類型提升的功能;動(dòng)態(tài)圖Tensor打印信息優(yōu)化,展示形式與Numpy保持相同。
o Layer功能增強(qiáng):新增Layer深拷貝接口Layer.deepcopy();新增Layer屬性和函數(shù)查看接口Layer.dir();自本版本起,Layer.eval()調(diào)用后,Trace功能仍會(huì)自動(dòng)記錄反向操作,如不需要記錄反向,需要顯式調(diào)用paddle.no_grad()。
o Optimizer新增set_lr()接口,可在動(dòng)態(tài)圖模式下靈活調(diào)整學(xué)習(xí)率。
o 新增set_global_initializer()接口,可定義全局的參數(shù)初始化方法。
o 多卡運(yùn)行代碼簡(jiǎn)化,不需要再顯式調(diào)用scale_loss和apply_collective_grads。
? 性能優(yōu)化:
o 多卡訓(xùn)練時(shí)Embedding等API支持使用稀疏參數(shù)梯度更新的功能。
o 動(dòng)態(tài)圖訓(xùn)練和推理新增對(duì)Intel加速庫(kù)oneDNN(原MKL-DNN)的支持,CPU訓(xùn)練場(chǎng)景Resnet50模型可提速6倍。
o 新增動(dòng)態(tài)圖Inplace計(jì)算功能,可復(fù)用Tensor存儲(chǔ)空間,減小顯存占用,并新增View方法,可以在共享底層存儲(chǔ)的情況下改變Tensor描述。
o 【不兼容升級(jí)】新增動(dòng)態(tài)圖梯度累加功能,起到變相“擴(kuò)大BatchSize”的作用,backward()接口默認(rèn)不清空梯度,需要顯式調(diào)用optimizer.clear_grad()來(lái)清空梯度。
? Bug修復(fù):
o 修復(fù)了多個(gè)模型在train/eval切換時(shí)會(huì)互相干擾的問(wèn)題。
動(dòng)態(tài)圖轉(zhuǎn)靜態(tài)圖
? 動(dòng)靜轉(zhuǎn)換新增語(yǔ)法支持
o 新增return語(yǔ)法支持,可以在if-elif-else或者循環(huán)條件中提前return,并能夠return不同類型的tensor或None。
o 新增對(duì)函數(shù)signature中含有kwargs參數(shù)的支持。
o 新增for、for enumerate遍歷Tensor和TensorList的語(yǔ)法支持,遍歷Tensor的操作更加靈活。
o 新增更多python語(yǔ)法支持,如print,assert,cast,isinstance,tuple,dict.pop()等。
? 動(dòng)靜轉(zhuǎn)換易用性優(yōu)化
o 動(dòng)轉(zhuǎn)靜的返回類型從callable函數(shù)改為Class,可以調(diào)用Class的code,main_program等接口更輕松獲取轉(zhuǎn)化后的靜態(tài)圖信息。
o 動(dòng)轉(zhuǎn)靜裝飾器to_static新增支持直接裝飾model實(shí)例,如to_static(model, input_spec) 。
o 新增jit.not_to_static裝飾器,可以在動(dòng)轉(zhuǎn)靜過(guò)程中,不轉(zhuǎn)化該函數(shù)。
o 增加set_verbosity()和set_code_level()接口,可以設(shè)置不同級(jí)別來(lái)查看動(dòng)轉(zhuǎn)靜過(guò)程的log或者中間狀態(tài)的代碼。
o 新增InputSpec,可以指定動(dòng)轉(zhuǎn)靜時(shí)輸入Tensor變量的形狀和數(shù)據(jù)類型。
o 報(bào)錯(cuò)信息優(yōu)化,可以定位到原動(dòng)態(tài)圖錯(cuò)誤的代碼行,并隱藏與用戶無(wú)關(guān)的報(bào)錯(cuò)信息。
o 支持用 pdb.set_trace() 進(jìn)行斷點(diǎn)調(diào)試。
? 優(yōu)化部署模型存儲(chǔ)載入接口
o 新增paddle.jit.save接口用于動(dòng)轉(zhuǎn)靜模型的保存,該接口同時(shí)兼容存儲(chǔ)未經(jīng)paddle.jit.to_static轉(zhuǎn)寫(xiě)的Layer對(duì)象以及paddle.DataParallel模型,刪除舊接口ProgramTranslator.save_inference_model。
o 新增 paddle.jit.load 接口用于載入靜態(tài)圖格式存儲(chǔ)的預(yù)測(cè)模型,包括paddle.jit.save和paddle.io.save_inference_model保存的模型,模型載入后可在動(dòng)態(tài)圖下用于模型推理或者模型訓(xùn)練調(diào)優(yōu)。
o paddle.jit.TransLatedLayer新增program方法,用于獲取paddle.jit.load載入模型的program,便于了解模型結(jié)構(gòu)。
o 【不兼容升級(jí)】paddle.jit.save, paddle.jit.load接口參數(shù)model_path含義變更,改為存儲(chǔ)文件前綴而非目錄。
混合精度訓(xùn)練
? 混合精度策略升級(jí):黑白名單策略(下簡(jiǎn)稱“O1策略”)之外,新增“Almost FP16(下簡(jiǎn)稱O2策略)”支持,即盡可能多使用FP16進(jìn)行計(jì)算。
o 新增FP16 Guard功能(paddle.static.amp.fp16_guard),支持用戶自由控制模型中單個(gè)Op是否選用FP16計(jì)算類型。
o 用戶可自定義custom_black_list,以控制某一類Op保持FP32計(jì)算。
o 使用O2策略,Resnet50和Bert base在V100單卡訓(xùn)練速度分別可達(dá)1400images/s和590sequences/s。
? 易用性優(yōu)化:
o 使用paddle.static.amp包統(tǒng)一管理與靜態(tài)圖混合精度訓(xùn)練相關(guān)的接口。
o 為AutoMixedPrecisionLists提供簡(jiǎn)化名稱CustomOpLists,即用戶可使用CustomOpLists自定義AMP黑白名單Op列表。
分布式訓(xùn)練優(yōu)化
? 集合通信All Reduce
o 支持千億語(yǔ)言模型混合并行訓(xùn)練:支持基于executor接口的流水線并行訓(xùn)練,sharding-DP策略,GradientMerge+AMP策略,Recompute+Offload策略,megatron策略
o 支持動(dòng)態(tài)圖:支持多流通信策略,自動(dòng)rebuild group策略,高性能稀疏參數(shù)通信,多卡梯度順序一致性策略
? 參數(shù)服務(wù)器PS
o 大規(guī)模稀疏功能升級(jí):升級(jí)大規(guī)模稀疏PS-API,抽象通信組件/參數(shù)表/優(yōu)化器基類,方便用戶通過(guò)子類派生方式進(jìn)行二次開(kāi)發(fā);同時(shí)還支持千億特征流式訓(xùn)練,含特征準(zhǔn)入,退場(chǎng),增量訓(xùn)練,分布式指標(biāo)預(yù)測(cè)等;通信方式從GRPC切換成了BRPC
o 開(kāi)源異構(gòu)參數(shù)服務(wù)器,既支持傳統(tǒng)的純CPU機(jī)器PS,也支持基于三級(jí)存儲(chǔ)(SSD/內(nèi)存/顯存)的純GPU機(jī)器PS,還支持CPU機(jī)器+GPU機(jī)器/昆侖機(jī)器混布PS,可以完成萬(wàn)億參數(shù)點(diǎn)擊率預(yù)估模型的分鐘級(jí)訓(xùn)練
? 新訓(xùn)練機(jī)制支持:
o 支持基于控制流的多任務(wù)分布式訓(xùn)練,性能較基于Intag的多任務(wù)提升50%以上
? 分布式啟動(dòng)方式優(yōu)化
o 支持使用paddle.distibuted.spawn接口啟動(dòng)all_gather等分布式低階API;
o paddle.distributed.launch接口升級(jí),支持指定單節(jié)點(diǎn)的進(jìn)程數(shù),并可簡(jiǎn)化為fleetrun;
o 優(yōu)化gen_nccl_id,去除grpc依賴,添加一定的容錯(cuò)性,提升分布式任務(wù)啟動(dòng)的穩(wěn)定性;
o 支持Gloo方式啟動(dòng)集合通信多CPU
模型保存與載入
? 規(guī)范Layer、Optimzier等API的set_dict方法名,統(tǒng)一改為set_state_dict。
? paddle.load兼容性增強(qiáng):支持從fluid.io.save_inference_model和fluid.io.save_params/persistables等接口的存儲(chǔ)結(jié)果中載入Layer的state_dict。
? 修改paddle.save/load接口行為,paddle.save不再為存儲(chǔ)結(jié)果添加后綴,paddle.load每次載入僅返回一個(gè)結(jié)果,規(guī)范接口語(yǔ)義。
? 移除paddle.SaveLoadConfig,對(duì)于paddle.jit.save, paddle.jit.load, paddle.load等接口兼容載入的場(chǎng)景,使用kwargs傳入額外的配置,簡(jiǎn)化接口的使用。
? 原靜態(tài)圖API paddle.io.save, paddle.io.load, paddle.io.save_inference_model, paddle.io.load_inference_model移動(dòng)到paddle.static模塊下。
? 優(yōu)化paddle.static.load_program_state接口使用體驗(yàn),在不指定載入var_list的使用場(chǎng)景中,載入目錄存在干擾文件時(shí)僅警告而不報(bào)錯(cuò)。
復(fù)數(shù)計(jì)算
? 擴(kuò)展動(dòng)靜態(tài)圖執(zhí)行引擎,支持復(fù)數(shù)神經(jīng)網(wǎng)絡(luò)訓(xùn)練與復(fù)數(shù)梯度累加。
? 新增mul, div, matmul, kron, abs等Op對(duì)復(fù)數(shù)計(jì)算支持。
ONNX功能升級(jí)
? 新增API: paddle.onnx.export支持paddle2.0動(dòng)態(tài)圖轉(zhuǎn)換到ONNX協(xié)議
? 新增PPOCR,PPYOLO,FasterRCNN,ERNIE等模型轉(zhuǎn)換
? 更豐富的Paddle op覆蓋,支持88個(gè)Paddle OP算子,同時(shí)支持導(dǎo)出為ONNX 1~12不同版本的算子集
性能優(yōu)化(含分布式)
? 動(dòng)態(tài)圖性能優(yōu)化:
o 數(shù)據(jù)讀取性能優(yōu)化:簡(jiǎn)化動(dòng)態(tài)圖模式下DataLoader底層實(shí)現(xiàn)邏輯,降低讀取線程開(kāi)銷,進(jìn)一步提升數(shù)據(jù)讀取效率,提升模型整體訓(xùn)練速度。MobileNetV1在V100單卡、BatchSize=128的場(chǎng)景下整體訓(xùn)練速度提升34%。
o 動(dòng)態(tài)圖組網(wǎng)API升級(jí)和性能優(yōu)化,大量動(dòng)態(tài)圖API將直接調(diào)用自動(dòng)生成的Pybind接口,性能顯著提升。
o 提高了Resnet50 oneDNN動(dòng)態(tài)圖訓(xùn)練的性能。目前CPU場(chǎng)景Resnet50 oneDNN 動(dòng)態(tài)圖訓(xùn)練速度提升6.4 倍。
? OP性能優(yōu)化:
o argsort:優(yōu)化輸入Tensor的元素個(gè)數(shù)等于其axis維長(zhǎng)度時(shí)的性能,前向速度提升34倍,反向速度提升10倍。
o dropout:優(yōu)化GPU性能,FP32性能提升約20%,FP16性能提升約50%。
o cast:優(yōu)化GPU性能,性能提升10%~20%。
o softmax:優(yōu)化axis=-1的情況下的GPU性能,針對(duì)不同shape有3倍~96倍的提升。
o 其他OP性能優(yōu)化:cumsum,reshape,Flatten,IndexSelect,Roll,elementwise_add,AdamW及RNN類(LSTM,GRU,SimpleRNN)等OP,均有明顯性能提升。
? 策略優(yōu)化:
o 新增fused_bn_add_act融合策略,可以自動(dòng)對(duì)batch_norm+elementwise_add+activation的組合模式進(jìn)行自動(dòng)融合加速。
o 新增梯度聚合的inplace addto策略,支持原位梯度累加,在ResNet-50混合精度訓(xùn)練中性能提升6.3%。
? 優(yōu)化FastThreadedSSAGraphExecutor調(diào)度,修復(fù)通信同步場(chǎng)景下,通信計(jì)算不重疊的情況,4機(jī)32卡resnet50提升約0.3%。
? 分布式性能優(yōu)化:
o 優(yōu)化lars策略, ResNet50 分布式多卡訓(xùn)練 16k batch size 的 time2train 指標(biāo)小于 10 分鐘。
o 優(yōu)化paddle.fleet amp分布式性能,修復(fù)最后一個(gè)通信和計(jì)算不重疊的情況,fp16 4機(jī)32卡性能提升約0.5%。
o 優(yōu)化paddle.fleet.gradient_merge分布式性能,先聚合梯度再通信,多機(jī)性能可提升20%-40%,達(dá)到線性加速比。
o 優(yōu)化參數(shù)服務(wù)器通信組件Communicator性能。GEO-400batch通信一次的情況下,W2V模型吞吐率、Simnet-Bow模型性能均有顯著提升。Async模式下,相較于飛槳paddle框架1.8按本,W2V模型吞吐率提升11%,CTR-DNN模型性能提升14% 。
調(diào)試分析
? 將框架內(nèi)僅100處使用LOG(FATAL)拋出異常的寫(xiě)法統(tǒng)一改為使用PADDLE_THROW,優(yōu)化由于框架不支持某種行為而導(dǎo)致的報(bào)錯(cuò)格式與內(nèi)容。
? 完善框架內(nèi)Signal Handler實(shí)現(xiàn),優(yōu)化執(zhí)行遇到系統(tǒng)Signal錯(cuò)誤時(shí)的報(bào)錯(cuò)格式與內(nèi)容。
? 優(yōu)化框架報(bào)錯(cuò)棧格式,將編譯時(shí)python報(bào)錯(cuò)棧移至原生報(bào)錯(cuò)棧下方,提升報(bào)錯(cuò)信息閱讀體驗(yàn)。
? 累計(jì)進(jìn)一步完善約1500余條框架內(nèi)檢查報(bào)錯(cuò)的錯(cuò)誤類型與提示文案,提升框架整體調(diào)試易用性。
? 動(dòng)態(tài)圖報(bào)錯(cuò)信息增強(qiáng),動(dòng)態(tài)圖下Pybind層的報(bào)錯(cuò)信息進(jìn)行系統(tǒng)性增強(qiáng),提升用戶體驗(yàn)。
? 優(yōu)化Paddle Python端報(bào)錯(cuò)異常類型,與Python原生報(bào)錯(cuò)類型對(duì)齊。
? 默認(rèn)隱藏C++報(bào)錯(cuò)棧,優(yōu)化隱藏C++棧之后的報(bào)錯(cuò)格式,去掉分界標(biāo)志Error Message Summary,與Python原生報(bào)錯(cuò)格式對(duì)齊。
? 優(yōu)化部分static模塊下API在非靜態(tài)圖模式下使用報(bào)錯(cuò)提示,包括static.append_backward, static.gradients, static.scope_guard, static.Print, static.nn.embedding, static.nn.data_norm, static.nn.multi_box_head, static.nn.nce, static.nn.py_func共9個(gè)API。
? 優(yōu)化了動(dòng)態(tài)圖模型下傳入Tensor為None時(shí)的報(bào)錯(cuò)信息。
? 優(yōu)化了Layer的打印信息,支持打印Layer中的各個(gè)層次結(jié)構(gòu)關(guān)系。
推理部署
模型量化
? 動(dòng)態(tài)圖訓(xùn)練時(shí)量化功能增強(qiáng),新增ImperativeQuantAware類統(tǒng)一管理動(dòng)態(tài)圖量化功能。目前支持對(duì)Conv2D、Linear等帶權(quán)重層的量化,并支持對(duì)權(quán)重進(jìn)行分channel求取量化參數(shù),同時(shí)也支持無(wú)權(quán)重層如ReLU,Tanh的量化,以及skip指定Layer量化的功能。
? 新增動(dòng)態(tài)圖量化訓(xùn)練過(guò)程中對(duì)模型layer求取output scale參數(shù)功能,供Server端量化推理部署使用
? 動(dòng)態(tài)圖量化模型支持使用Paddle-Lite進(jìn)行預(yù)測(cè)部署。
? 離線量化功能支持提前融合conv+bn,及產(chǎn)出LSTM量化模型的功能,移除保存采樣數(shù)據(jù)到臨時(shí)文件的功能。
? 靜態(tài)圖量化支持Conv2d_tranpose量化,支持Linear使用per-channel形式量化。
Paddle Inference
預(yù)測(cè)庫(kù)默認(rèn)命名從fluid_inference改為paddle_inference。
API
? 全面升級(jí)推理C++ API,推薦使用新版API。原API暫時(shí)保留,但使用時(shí)會(huì)報(bào) warning,計(jì)劃未來(lái)會(huì)刪除;新版API主要是從規(guī)范命名、簡(jiǎn)化使用方法角度做的升級(jí),重要變化包括:
o C++ 接口新增 paddle_infer 命名空間,包含推理相關(guān)接口;
o ZeroCopyTensor 更名為 Tensor,作為推理接口默認(rèn)輸入輸出表示方式;
o 簡(jiǎn)化 CreatePaddlePredictor 為 CreatePredictor,只保留 對(duì)AnalysisConfig 的支持,不再支持其他多種Config;
o 新增服務(wù)相關(guān)的工具類,比如 PredictorPool,便于創(chuàng)建多個(gè)predictor 時(shí)使用。
功能升級(jí)
? 算子版本信息相關(guān)
o Paddle 在 2.0 中新增或升級(jí)了部分算子。從本版本起,對(duì)前向算子版本進(jìn)行定義與兼容約束。通過(guò)框架間算子版本的對(duì)齊,確保不同框架中同一算子版本的定義和行為一致,從而增強(qiáng)框架整體的健壯性。
o 增加推理前向算子版本的注冊(cè)機(jī)制,并將算子的不兼容升級(jí)行為納入統(tǒng)計(jì)。
o 增加預(yù)測(cè)模型的算子版本信息。預(yù)測(cè)庫(kù)通過(guò)模型文件,將可以對(duì)此模型對(duì)應(yīng)的算子定義進(jìn)行識(shí)別,避免定義不同導(dǎo)致計(jì)算錯(cuò)誤。
? 模型接口
o load_inference_model 和 save_inference_model 兩個(gè)API遷移到 paddle.static 下,兼容舊接口,提升易用性。
o 新增 serialize_program, deserialize_program, serialize_persistables, deserialize_persistables, save_to_file, load_from_file 六個(gè)API,用來(lái)滿足用戶執(zhí)行序列化/反序列化 program,序列化/反序列化 params,以及將模型/參數(shù)保存到文件,或從文件中加載模型/參數(shù)的需求。
? NV GPU 推理相關(guān)
o 新增對(duì)TRT 7.1版本的適配支持。
o 新增對(duì)Jetson Nx硬件的適配支持。
o Paddle-TensorRT增強(qiáng)對(duì) PaddleSlim 量化模型的支持,涵蓋CV上檢測(cè),分類,分割等多個(gè)任務(wù)。
o Paddle-TRT支持clip op,支持分類模型GhostNet在Paddle-TRT下運(yùn)行。
o Paddle-TRT 支持含有channelwise量化的mul op的模型,支持PaddleOCR檢測(cè)和識(shí)別量化模型在Paddle-TRT int8下運(yùn)行。
o Paddle-TRT 動(dòng)態(tài)shape功能支持PaddleSlim量化Int8模型。
? X86 CPU 推理相關(guān)
o 添加了對(duì)oneDNN BF16的支持:支持conv2d 和gru bf16 計(jì)算,目前支持resnet50,googlenet,mobilenetv1和mobilenetv2模型的BF16預(yù)測(cè)。
o 在oneDNN INT8量化策略中增加對(duì)有偏移scales的量化和反量化的支持。
o 添加了一些oneDNN 算子的版本兼容性支持。
o CPU端增加了elementwise_add 和elementwise_mul INT8 oneDNN 內(nèi)核支持。
o 提升CPU端測(cè)試量化模型的易用性,支持同時(shí)對(duì)比測(cè)試原始模型和量化模型。
? 自定義OP
o Python端推理新增對(duì)用戶自定義OP支持。
? 內(nèi)存 /顯存相關(guān)
? 新增TryShrinkMemory接口,通過(guò)釋放臨時(shí)tensor的方式減少應(yīng)用顯/內(nèi)存占用,demo示例可參考Paddle-Inference-Demo。
? 動(dòng)態(tài)圖量化模型支持
o X86 推理支持動(dòng)態(tài)圖量化模型。
o NVIDIA GPU 推理支持動(dòng)態(tài)圖量化模型。
? 報(bào)錯(cuò)信息
o 編譯打開(kāi)ON_INFER時(shí),FLAGS_call_stack_level默認(rèn)為打開(kāi),報(bào)錯(cuò)信息顯示調(diào)用棧。
性能優(yōu)化
? 升級(jí)了量化模型的轉(zhuǎn)換和優(yōu)化
? NV GPU 相關(guān)
o 優(yōu)化了CUDA 的ArgMin, ArgMax OP,使得該OP的二進(jìn)制大小從60M下降至1.3M。
o ERNIE模型在T4上使用Paddle-TRT FP16推理性能提升15%。
o ERNIE模型在開(kāi)啟TenorRT時(shí)增加變長(zhǎng)輸入的支持,帶來(lái)性能提升147%。在軟件版本cuda10.1、cudnn 7.6、tensorrt 6.0、OSS 7.2.1,模型ernie-base-2.0,數(shù)據(jù)集QNLI,輸入BatchSize = 32時(shí),Nvidia Telsa T4上的性能從905 sentences/s提升到2237 sentences/s。示例代碼:Paddle-Inference-Demo/c++。
? X86 CPU相關(guān)
o 新增 conv + affine_op pass,在6248機(jī)器上,MASK-RCNN fp32單線程性能提高了26%。
o 新增fc + gru pass和oneDNN(原MKL-DNN) GRU fp32內(nèi)核,使得GRU fp32模型4線程推斷速度在機(jī)器Intel Xeon 6248上提高 20%。
o 通過(guò)支持oneDNN INT8 GRU,GRU INT8模型的速度與NativeConfig推理相比,提高了約1.65倍(線程= 1,batch_size = 50)。
o 添加了oneDNN batchnorm + activation的fuse支持,pvanet_ocr模型性能因此提高了2.8%。
o 增加了oneDNN FC + Gelu,FC + Sigmoid 和 FC + tanh 算子融合,將BERT推理模型提高了4.5%。
o 增加了對(duì)部分Op的oneDNN inplace支持。
o 優(yōu)化的oneDNN LRN op,使得GoogleNet fp32模型提速1%。
o 通過(guò)oneDNN升級(jí)到1.6,Ernie Large oneDNN在Skylake上(Intel Core 6148)推理的速度提高了約2.7倍(即單元測(cè)試 test_analyzer_ernie_large)。
o 增加了插值interpolate oneDNN前向算子支持,目前ocr_det模型推理性能相比單純CPU Native推理提高了2.04倍。
Paddle Lite
端側(cè)推理引擎Paddle Lite v2.8適配主框架v2.0
環(huán)境適配
編譯安裝
訓(xùn)練框架Paddle
? 發(fā)布支持使用x86 CPU及飛騰CPU下使用昆侖芯片的安裝包。
? 新增安裝包對(duì)python3.8的支持。
? 新增安裝包對(duì)cuda10.1、cuda10.2的支持。
? (experimental)發(fā)布支持cuda11的安裝包。
? 將cuda10.1及以上的Paddle鏡像以及CI系統(tǒng)鏡像中的NCCL版本到2.7.8。
? 升級(jí)oneDNN(原MKL-DNN)從1.3至1.5版本。
? 鏡像中新增預(yù)裝openssl-dev依賴。
? 刪除安裝依賴包:nltk、opencv、scipy、rarfile、prettytable、pathlib、matplotlib、graphviz、objgraph。
? Paddle的avx與no_avx單獨(dú)發(fā)版,whl包減小40%,默認(rèn)安裝avx版本,優(yōu)化了安裝報(bào)錯(cuò)信息,會(huì)檢查用戶的CPU類型與Paddle版本,自動(dòng)給出對(duì)應(yīng)的安裝報(bào)錯(cuò)提示。
? Paddle develop版本pypi安裝用戶體驗(yàn)提升,縮減用戶安裝路徑,用pip –pre方式即可進(jìn)行安裝。
推理引擎Paddle Inference
? 預(yù)測(cè)庫(kù)支持cuda10.2-cudnn8-trt7.1的版本。
? 發(fā)布支持jetpack的安裝包,以及支持nv_jetson的C++預(yù)測(cè)庫(kù)。
? 新增發(fā)布聯(lián)編tensorrt的兩個(gè)wheel包,cuda10.0-cudnn7.6-trt6.0.1.5-python36、cuda10.0-cudnn7.6-trt6.0.1.5-python36。
? 修復(fù)聯(lián)編策略,單獨(dú)發(fā)布包含tensorrt的gpu包,避免用戶在安裝其他GPU版本的包出現(xiàn)沒(méi)有tensorrt的報(bào)錯(cuò)。
? 修復(fù)預(yù)測(cè)庫(kù)打包有重復(fù)的問(wèn)題。
新硬件訓(xùn)練支持
? 昆侖芯片:支持單卡訓(xùn)練,靜態(tài)圖多卡訓(xùn)練,并發(fā)布10+模型。
? 昇騰910芯片:支持單卡訓(xùn)練。
已知問(wèn)題
? 由于cuDNN 8.0.x自身的問(wèn)題,使用cuDNN 8.0.x編譯推理庫(kù)且沒(méi)有使用TensorRT加速時(shí),在很多模型上有性能退化現(xiàn)象,等待cuDNN后續(xù)版本解決。可以嘗試使用TensorRT加速,或者使用cuDNN7.6版本。
? 由于cuDNN 8.0.x自身的問(wèn)題,使用cuDNN 8.0.x版本進(jìn)行推理時(shí),在某些模型會(huì)發(fā)生內(nèi)存泄露現(xiàn)象,當(dāng)前發(fā)現(xiàn)可能發(fā)生的為使用cuDNN的convolutionBiasActivationForward時(shí)。可以嘗試通過(guò)推理配置文件config.pass_builder()->DeletePass()禁用conv_elementwise_add_act_fuse_pass、conv_elementwise_add_act_fuse_pass。如果還有泄露現(xiàn)象,可以嘗試cuDNN7.6,并將發(fā)現(xiàn)問(wèn)題的模型通過(guò)issue方式發(fā)給分析。
總結(jié)
以上是生活随笔為你收集整理的Paddle Release Note的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何在框架外部自定义C++ OP
- 下一篇: AI框架类FAQ