天天看點

飛槳進入2.0時代,他發生了什麼變換?

重要更新

本版本為飛槳架構v2.0的測試版,最重要的變化為API體系的全面更新以及指令式程式設計(動态圖)能力的全面完善。本版本系統優化了飛槳基礎API的目錄結構,全面修複了曆史遺留的相關問題,并對API做了充分補充,特别是提供了更為完善的高層API功能;同時提供了對動态圖的量化訓練、混合精度訓練的支援,動靜轉換實作了完備的文法支援,并且易用性大幅提升,動态圖相關功能趨于完善,推薦使用動态圖模式。此外,推理庫的C++接口也做了更新優化,推理庫對量化模型的支援以及推理性能都有了全面增強。

訓練架構

基礎API

相容性說明

  • Paddle 2.x版本推薦使用者使用位于paddle根目錄下的API,同時在paddle.fluid目錄下保留了所有的Paddle 1.x版本的API。按照設計,Paddle 1.x版本訓練的代碼,不做任何修改,即可在Paddle 2.x版本上正常運作;Paddle 1.x版本訓練儲存的模型,可以使用Paddle 2.x版本進行推理。

目錄結構調整

  • 在2.0-alpha版本的基礎上,本版本對于目錄結構進行了一些調整,調整完最新的目錄結構如下:
飛槳進入2.0時代,他發生了什麼變換?

API别名規則

  • 為了友善使用者使用,API會在不同的路徑下建立别名,比如

    paddle.add -> paddle.tensor.add

    ,推薦使用者優先使用較短的路徑

    paddle.add

  • 所有framework, tensor目錄下的API,均在paddle根目錄建立别名;除少數特殊API外,其他API在paddle根目錄下均沒有别名。
  • paddle.nn目錄下除functional目錄以外的所有API,在paddle.nn目錄下均有别名;functional目錄中的API,在paddle.nn目錄下均沒有别名。
  • 以下為一些特殊的别名關系,推薦使用左邊的名稱:
    • paddle.sigmoid -> paddle.tensor.sigmoid -> paddle.nn.functional.sigmoid
    • paddle.tanh -> paddle.tensor.tanh -> paddle.nn.functional.tanh
    • paddle.remainder -> paddle.mod -> paddle.floor_mod
    • paddle.divide -> paddle.true_divide
    • paddle.rand -> paddle.uniform
    • paddle.randn -> paddle.standard_normal
    • Optimizer.clear_grad -> Optimizer.clear_gradients
    • Optimizer.set_state_dict -> Optimizer.set_dict
    • Optimizer.get_lr -> Optimizer.current_step_lr
    • Layer.clear_grad -> Layer.clear_gradients
    • Layer.set_state_dict -> Layer.set_dict

常用API名稱變化

  • 此版本使用Tensor表示資料,建立張量API, paddle.fluid.dygraph.to_variable修改為paddle.to_tensor
  • 加、減、乘、除使用全稱,不使用簡稱
  • 對于目前逐元素操作,不加elementwise字首
  • 對于按照某一軸操作,不加reduce字首
  • Conv, Pool, Dropout, BatchNorm, Pad組網類API根據輸入資料類型增加1d, 2d, 3d字尾
飛槳進入2.0時代,他發生了什麼變換?

新增API

  • 共計新增140個API,具體參考連結和API文檔
    • 新增環境設定API:paddle.set_default_dtype, paddle.get_default_dtype, paddle.set_device, paddle.get_device, paddle.manual_seed
    • 新增Tensor操作API:numel, chunk, masked_select, isfinite, isinf, isnan, sort, topk, Flatten, dim, tile
    • 新增組網API: Linear, Bilinear, Embedding, linear, bilinear, embedding
    • 新增視覺組網類API:Conv1d, ConvTranspose1d, MaxPool1d, MaxPool2d, MaxPool3d, AvgPool1d, AvgPool2d, AvgPool3d, AdaptiveMaxPool1d, AdaptiveMaxPool2d, AdaptiveMaxPool3d, ReflactionPad1d, ReflactionPad2d, ReflactionPad3d, ReplicationPad1d, ReplicationPad2d, ReplicationPad3d, ZeroPad2d, ConstantPad1d, ConstantPad2d, ConstantPad3d, PixelShuffle, Upsample, UpsamplingNearest2d, UpsamplingBilinear2d, conv1d, conv_transpose1d, avg_pool1d, avg_pool2d, avg_pool3d, max_pool1d, max_pool2d, max_pool3d, adaptive_max_pool1d, adaptive_max_pool2d, adaptive_max_pool3d, adaptive_avg_pool1d, adaptive_avg_pool3d
    • 新增文本處理組網類API: SimpleRNN, LSTM, GRU, MultiHeadAttention, Transformer, TransformerEncoder, TransformerEncoderLayer, TransformerDecoder, TransformerDecoderLayer
    • 新增激活類API:ELU, Hardshrink, Hardtanh, PReLU, ReLU6, Tanh, Tanhshrink, Softmax
    • 新增歸一化API:BatchNorm1d, BatchNorm2d, BatchNorm3d, SyncBatchNorm, InstanceNorm1d, InstanceNorm2d, InstanceNorm3d, weight_norm, remove_weight_norm, batch_norm, instance_norm, layer_norm, normalize
    • 新增Dropout類API:Dropout2d, Dropout3d, AlphaDropout, dropout, dropout2d, dropout3d
    • 新增相似度、損失函數類API:CosineSimilarity, PairwiseDistance, CTCLoss, KLDivLoss, BCEWithLogitsLoss, MarginRankingLoss, SmoothL1Loss, consine_similarity, binary_cross_entropy, binary_cross_entropy_with_logits, cross_entropy, ctc_loss, l1_loss, mse_loss, margin_ranking_loss, nll_loss, smooth_l1_loss
    • 新增分布式通信類API: broadcast, all_reduce, reduce, all_gather, scatter, barrier
    • 新增機率分布類API: Distribution, normal, bernoulli
    • 新增Optimizer相關API:step, AdamW
    • 新增資料集相關API:Dataset, IterableDataset, TensorDataset, Sampler, RandomSampler, BatchSampler, DistributedBatchSampler

修複和完善API

  • 共計修改和完善155個API,具體參考連結和API文檔
  • 修複随機數生成相關的API,包括:種子設定paddle.rand, randn, randint, randperm, dropout, Uniform, Normal等
  • 以下API對應的底層C++ OP進行了代碼更新,理論上可以實作相容,但不排除會出現少量不相容的情況:linspace, concat, gather, gather_nd, split, squeeze, unsqueeze, clip, argmax, argmin, mean, norm, unique, cumsum, LeakyReLU, leaky_relu, hardshrink, embedding, margin_ranking_loss, grid_sample, affine_grid
  • 增加了relu6和Sigmoid激活函數的 oneDNN支援

多裝置/分布式訓練API

  • 動态圖單機多卡訓練
    • 新增paddle.distributed.spawn(func, args=(), nprocs=-1, join=True, daemon=False, **options),用于啟動動态圖多卡訓練。
    • 新增paddle.distributed.init_parallel_env(),用于初始化動态圖多卡訓練的環境。
    • 新增paddle.distributed.get_rank(),用于擷取多卡訓練時目前程序的rank。
    • 新增paddle.distributed.get_world_size(),用于擷取多卡訓練時參與訓練的總程序數。
  • 分布式集合通信
    • 新增paddle.distributed.broadcast(tensor, src, group=0),将指定程序上的tensor廣播到所有程序。
    • 新增paddle.distributed.all_reduce(tensor, op=ReduceOp.SUM, group=0),對所有程序的指定Tensor執行歸約操作,結果傳回給所有程序。
    • 新增paddle.distributed.reduce(tensor, dst, op=ReduceOp.SUM, group=0),對所有程序的指定Tensor執行歸約操作,結果傳回給指定程序。
    • 新增paddle.distributed.all_gather(tensor_list, tensor, group=0),聚合所有程序的指定Tensor,結果傳回給所有程序。
    • 新增paddle.distributed.scatter(tensor, tensor_list=None, src=0, group=0),将指定程序Tensor清單中的Tensor分發到所有程序。
    • 新增paddle.distributed.barrier(group=0),同步所有程序。

高層API

  • 新增飛槳高層API,對模型開發過程中常見的組網、訓練、評估、預測、存取等操作進行封裝,實作低代碼開發,MNIST手寫數字識别任務對比指令式程式設計模式實作方式,高層API可減少80%執行類代碼。
  • 資料管理
    • 統一資料加載使用方式
      • 資料集定義,繼承

        paddle.io.Dataset

        進行實作。
      • 多程序資料加載,使用

        paddle.io.DataLoader

    • 新增

      paddle.io.IterableDataset

      用于流式資料集,并在

      paddle.io.DataLoader

      中支援對其進行并發加速。
    • 新增

      paddle.io.get_worker_info

      用于

      paddle.io.IterableDataset

      中劃分子程序資料。
  • 模型組網
    • 新增常見Loss接口

      paddle.nn.loss.*

      和Metric接口

      paddle.metric.*

      的封裝
    • 釋出基于高層API實作的12個模型
      • Transformer,Seq2seq,LAC,BMN,ResNet,YOLOv3,VGG,MobileNet,TSM,CycleGAN,Bert,OCR
      • 釋出于PaddlePaddle/hapi倉庫的examples目錄
  • 模型執行
    • 新增Model類

      paddle.Model

      封裝,封裝模型開發過程中常用的基礎功能,包括:
      • 提供

        Model.summary

        接口,用于檢視動态圖組網的網絡結構與參數數量。
      • 提供

        Model.prepare

        接口,用于指定損失函數和優化算法。
      • 提供

        Model.fit

        接口,實作訓練和評估,可通過callback方式實作訓練過程中執行自定義功能,比如模型存儲等。
      • 提供

        Model.evaluate

        接口,實作評估集上的預測和評估名額計算。
      • 提供

        Model.predict

        接口,實作特定的測試資料推理預測。
      • 提供

        Model.train_batch

        接口,實作單batch資料的訓練。
      • 提供

        Model.eval_batch

        接口,實作單batch資料的評估。
      • 提供

        Model.text_batch

        接口,實作單batch資料的測試。
      • 提供

        Model.save

        /

        Model.load

        接口,支援動态圖訓練模式存儲推理模型。
    • 新增Callback接口

      paddle.callbacks.*

      ,用于模型執行接口,進行日志記錄、Checkpoint模型存儲等,使用者可繼承

      paddle.callbacks.Callback

      進行自定義。
  • 領域API
    • 新增視覺(CV)領域接口

      paddle.vision

      • 新增Dataset接口

        paddle.vision.datasets.*

        ,對常用資料集進行封裝,支援資料的随機通路
      • 新增Resize, Normalize等24種常見的資料預處理接口

        paddle.vision.transforms.*

      • 新增圖像分類骨幹網絡和預訓練參數
        • paddle.vision.models.lenet

           或 

          paddle.vision.lenet

        • paddle.vision.models.vgg

           或 

          paddle.vision.vgg

        • paddle.vision.models.resnet

           或 

          paddle.vision.vgg

        • paddle.vision.models.mobilenetv1

           或 

          paddle.vision.mobilenetv1

        • paddle.vision.models.mobilenetv2

           或 

          paddle.vision.mobilenetv2

    • 新增自然語言處理(NLP)領域接口

      paddle.text

      • 新增Dataset接口

        paddle.text.datasets.*

        ,對常用資料集進行封裝,支援資料的随機通路
      • 新增領域組網接口

        paddle.text.*

  • 自動斷點重新開機
    • 新增接口 

      train_epoch_range

      :可以在靜态圖上實作基于epoch粒度的 

      checkpoint

       自動儲存和自動加載功能,支援自動斷點重新開機。

功能優化(含分布式)

動态圖轉靜态圖

  • ProgramTranslator新增文法支援
    • 新增對return文法動轉靜支援,使得動轉靜時可以在if-elif-else或者循環條件中提前return,也能return不同類型的tensor或None。
    • 新增對print文法動轉靜支援,使得print(tensor)也能在動轉靜中列印出tensor。
    • 新增對for周遊Tensor,for enumerate周遊Tensor,for周遊TensorList,for enumerate周遊TensorList幾種文法的動轉靜支援,使得循環處理Tensor的相關操作在動轉靜中能夠靈活使用。
    • 新增對assert文法動轉靜支援,使得assert tensor也能在動轉靜中保證tensor為True(bool類型)或者非0(其他資料類型)。
    • 新增對資料類型cast的轉寫支援,使得float(tensor), int(tensor) 等類似的動态圖類型轉化語句也能在靜态圖中進行類型轉化。
  • ProgramTranslator易用性優化功能
    • 将動轉靜的傳回類型從callable函數改為class StaticLayer,這個class可以調用.code,.main_program等接口更輕松擷取轉化後的靜态圖資訊。
    • 增加 set_verbosity 和 set_code_level 接口,可以讓使用者設定log級别來檢視動轉靜運作過程的log或者檢視中間狀态轉化的代碼。
    • 新增InputSpec,可以指定動轉靜時輸入Tensor變量形狀和資料類型。
    • 優化了動轉靜運作下如果出錯顯示的報錯資訊,使動轉靜後靜态圖運作錯誤的代碼也能彙報到原動态圖錯誤的代碼行,并且删除python棧中動轉靜部分報錯,使報錯資訊更多與使用者代碼相關。
    • 動轉靜支援用 pdb.set_trace() 進行斷點調試。
  • 優化部署模型存儲載入接口
    • 新增 paddle.jit.save 接口用于動轉靜模型的儲存,使接口更加易用,删除舊接口ProgramTranslator.save_inference_model 。
    • 新增 paddle.jit.load 接口用于載入靜态圖格式存儲的預測模型,包括paddle.jit.save和paddle.io.save_inference_model儲存的模型,模型載入後可在動态圖下用于模型推理或者模型訓練調優。

混合精度訓練

  • 增加了動态圖混合精度的支援,ResNet-50模型在V100上使用混合精度相比于fp32訓練加速比為2.6。

量化訓練

  • 新增

    ImperativeQuantAware

    類,提供動态圖量化訓練功能,目前支援對Conv2D、Linear等層的量化,支援的模型類型包括MobileNetV1/MobileNetV2/ResNet50等。
  • 模型經動态圖量化訓練後,使用

    ImperativeQuantAware.save_quantized_model

    接口儲存的量化模型可利用Paddle-Lite推理庫進行預測部署。
  • 靜态圖量化支援Conv2d_tranpose量化,支援Linear使用per-channel形式量化。

性能優化(含分布式)

  • 簡化動态圖模式下DataLoader底層實作邏輯,降低讀取線程開銷,進一步提升資料讀取效率,提升模型整體訓練速度。經測試MobileNetV1在V100單卡、BatchSize=128的場景下整體訓練速度提升34%。
  • 動态圖組網API更新和性能優化,大量動态圖API将直接調用自動生成的Pybind接口,提升性能。

動态圖基礎功能

  • 支援多卡訓練時配置Embedding等API使用稀疏參數梯度更新的功能。
  • 增加Tensor類成員函數,包括Tensor().abs()、Tensor().add()、Tensor().cos()等120餘個。
  • 增加Layer的dir()接口,可以友善地檢視Layer中屬性和函數。
  • 增加optimizer.set_lr()接口,使用者可以在動态圖模式下中靈活調整學習率。
  • 增加全局參數初始化方式的接口set_global_initializer,可定義全局的參數初始化方法。
  • 增加了對動态訓練和推理的oneDNN(原MKL-DNN)支援。Resent50 oneDNN動态訓練可以使用(Minist資料集)。

調試分析

  • 将架構内僅100處使用LOG(FATAL)抛出異常的寫法統一改為使用PADDLE_THROW,優化由于架構不支援某種行為而導緻的報錯格式與内容。
  • 完善架構内Signal Handler實作,優化執行遇到系統Signal錯誤時的報錯格式與内容。
  • 優化架構報錯棧格式,将編譯時python報錯棧移至原生報錯棧下方,提升報錯資訊閱讀體驗。
  • 累計進一步完善約1300餘條架構内檢查報錯的錯誤類型與提示文案,提升架構整體調試易用性。
  • 動态圖報錯資訊增強,動态圖下Pybind層的報錯資訊進行系統性增強,提升使用者體驗。

Bug修複

  • 修複動态圖Layer使用add_parameter接口可能意外出現AttributeError的問題,增強輸入檢查。
  • 修複無法正常列印int_8與uint_8類型的Tensor的問題,使資料可以正常輸出。

依賴庫更新

  • 更新oneDNN(原MKL-DNN)從1.3至1.5版本。

推理

Paddle Inference

API

  • 全面更新推理C++ API,推薦使用新版API。原API暫時保留,但使用時會報 warning,計劃未來會删除;新版API主要是從規範命名、簡化使用方法角度做的更新,重要變化包括:
    • C++ 接口新增 

      paddle_infer

       命名空間,包含推理相關接口;
    • ZeroCopyTensor

       更名為 

      Tensor

      ,作為推理接口預設輸入輸出表示方式;
    • 簡化 

      CreatePaddlePredictor

       為 

      CreatePredictor

      ,隻保留 對

      AnalysisConfig

       的支援,不再支援其他多種Config;
    • 新增服務相關的工具類,比如 

      PredictorPool

      ,便于建立多個predictor 時使用。

功能更新

  • 更新算子版本相容資訊系統資料庫以支援更精确的Op版本資訊,提升推理相容性。
  • 新增對TRT 7.1版本的适配支援。
  • Paddle-TensorRT增強對 PaddleSlim 量化模型的支援,涵蓋CV上檢測,分類,分割等多個任務。
  • Python端推理新增對使用者自定義OP支援。
  • CPU端增加了

    elementwise_add

     和

    elementwise_mul

     INT8 oneDNN(原MKL-DNN)核心支援。
  • 提升了CPU端測試量化模型的易用性,支援同時對比測試原始模型和量化模型。
  • 新增對Jetson Nx硬體的适配支援。

性能優化

  • 新增 conv + affine_op pass,在6248機器上,MASK-RCNN fp32單線程性能提高了26%。
  • 新增fc + gru pass和oneDNN(原MKL-DNN) GRU fp32核心,使得GRU fp32模型4線程推斷速度在機器Intel Xeon 6248上提高 20%。
  • 增加了對許多Op的oneDNN inplace支援(人臉feature fp32模型提速2%)。
  • 優化的oneDNN LRN op,使得GoogleNet fp32模型提速1%。
  • 更新了量化模型的轉換和優化。
  • 優化了CUDA 的ArgMin, ArgMax OP,使得該OP的二進制大小從60M下降至1.3M。

Bug修複

  • 修複CPU下的mask-rcnn推斷錯誤的問題。
  • 修複CPU多線程量化模型和推斷過程中出現的錯誤。

來源

https://github.com/PaddlePaddle/Paddle/releases​github.com

飛槳進入2.0時代,他發生了什麼變換?

歡迎兄弟對2版本進行深度評測!!!

繼續閱讀