最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

OneFlow|推薦一款兼容 PyTorch 的國產(chǎn) AI 框架

2022-05-31 14:20 作者:矩池云  | 我要投稿

在人工智能和深度學(xué)習(xí)的不斷發(fā)展進(jìn)程中,深度學(xué)習(xí)框架已經(jīng)成為行業(yè)研發(fā)基礎(chǔ),承載著越來越多的研發(fā)者基于框架構(gòu)建、訓(xùn)練和部署相關(guān)應(yīng)用?;谏疃葘W(xué)習(xí)框架,研發(fā)人員可以依據(jù)研究或業(yè)務(wù)目標(biāo)更快速地開發(fā)相關(guān)應(yīng)用,行業(yè)的研發(fā)效率和水平也因此得到了顯著提升。在深度學(xué)習(xí)框架中,PyTorch 和 TensorFlow 推出時(shí)間比較早,在科研和研發(fā)場(chǎng)景滲透率都比較高,PyTorch 是目前受到用戶喜歡的框架之一,它的 API 友好,Eager 模式讓模型搭建和調(diào)試過程變得更加容易,但是靜態(tài)圖編譯和部署體驗(yàn)還不能完全令人滿意;另外一款用戶常用的框架 TensorFlow ,其靜態(tài)編譯和部署功能很完備,但調(diào)試體驗(yàn)相對(duì)復(fù)雜。

面對(duì)現(xiàn)有框架的優(yōu)劣勢(shì),OneFlow?在2020 年 7 月在 GitHub 上開源時(shí),差異化地定位于框架對(duì)分布式和高性能的支持,為了更好地滿足研發(fā)場(chǎng)景的需求,團(tuán)隊(duì)用一年多時(shí)間自研了動(dòng)態(tài)圖引擎,旨在兼容并包 PyTorch 與 TensorFlow 的優(yōu)勢(shì)。OneFlow 0.7 版本已支持與 PyTorch 一致的 Eager 體驗(yàn),實(shí)現(xiàn)了同時(shí)支持動(dòng)態(tài)圖和靜態(tài)圖。不僅如此,OneFlow 編程 API 與 PyTorch 兼容,常見深度學(xué)習(xí)模型只需修改一行 import oneflow as torch 就可以把 PyTorch 寫的模型在 OneFlow 上跑起來。目前,矩池云 Matpool?已經(jīng)支持 OneFlow 框架,只需要在訓(xùn)練時(shí)選擇框架,就可以體驗(yàn)到這款優(yōu)秀的國產(chǎn)框架。

OneFlow 視覺模型庫flowvision

OneFlow 視覺模型庫?flowvision?已經(jīng)支持計(jì)算機(jī)視覺領(lǐng)域圖像分類、分割和檢測(cè)等方向的經(jīng)典 SOTA 模型 (見下表),這些模型都可以通過 import torch as flow 或 import oneflow as torch 實(shí)現(xiàn)自由切換。

OneFlow 和 PyTorch 的兼容,意味著用戶可以像使用 PyTorch 一樣來使用 OneFlow ,如果對(duì)模型效果比較滿意,就可以繼續(xù)使用 OneFlow 擴(kuò)展到大規(guī)模分布式或使用靜態(tài)圖部署模型。


遷移調(diào)優(yōu)案例

項(xiàng)目案例背景

一家頭部通信公司將上線一款基于深度學(xué)習(xí)的圖像識(shí)別應(yīng)用,項(xiàng)目基于 PyTorch 建立了業(yè)務(wù)模型,且已經(jīng)跑通了正常訓(xùn)練流程,但是訓(xùn)練/推理速度都很慢,在本次案例中,項(xiàng)目方研發(fā)人員將模型腳本遷移到 OneFlow ,在 OneFlow 團(tuán)隊(duì)的支持下,進(jìn)行了大幅度的訓(xùn)練/推理性能優(yōu)化、部署上線。


研發(fā)人員可以借助與 PyTorch 兼容的 OneFlow 實(shí)現(xiàn)模型加速和部署,?OneFlow 發(fā)布的官方案例展示了通過多方位調(diào)優(yōu),達(dá)到整體性能提升的一些方法,其中涉及到的調(diào)優(yōu)思路,既有共性的調(diào)優(yōu)方法,也有在 OneFlow 框架下所特有調(diào)優(yōu)方式 *


項(xiàng)目案例遷移調(diào)優(yōu)過程

1 一鍵遷移 PyTorch 模型轉(zhuǎn) OneFlow 模型:只需 import oneflow as torch 就夠了

OneFlow 最新發(fā)布的 0.7.0 版本對(duì) PyTorch 接口的兼容性有了進(jìn)一步的完善。OneFlow 對(duì)已經(jīng)支持的算子都能保證和 PyTorch 的接口在語義和結(jié)果上一致。在本案例中,業(yè)務(wù)模型的主干網(wǎng)絡(luò)是 resnet101,在遷移過程中,可參考 官方文檔 遷移 ,只需要模型文件中與 torch 相關(guān)的 import 修改為 import oneflow as torch,就完成了模型代碼的遷移工作。


在模型腳本遷移完畢之后,還需要驗(yàn)證模型遷移的準(zhǔn)確性,確定精度是不是對(duì)齊了。


1.1 推理精度的驗(yàn)證


首先進(jìn)行推理精度的驗(yàn)證,可直接加載 PyTorch 訓(xùn)練好的模型然后驗(yàn)證推理精度,由于 OneFlow 對(duì)齊了 PyTorch 的接口,加載 PyTorch 的模型也非常方便,只需數(shù)行代碼即可完成:

在驗(yàn)證完推理精度后是驗(yàn)證訓(xùn)練流程,在對(duì)齊訓(xùn)練超參數(shù)之后,使用 OneFlow 訓(xùn)練模型的 loss 曲線和 PyTorch 的 loss 曲線也高度一致,在小數(shù)據(jù)集上的精度高度一致。

2 使用 OneFlow 的 nn.Graph 加速模型訓(xùn)練與推理性能

在驗(yàn)證完算法正確性后,需要考慮的是如何進(jìn)行加速執(zhí)行。

2.1 動(dòng)態(tài)轉(zhuǎn)靜態(tài)

OneFlow 有?ResNet50?的開源項(xiàng)目,其中單卡的執(zhí)行效率已經(jīng)做得很高,項(xiàng)目中涉及到的優(yōu)化技巧都可以用在 ResNet101 上。

OneFlow ResNet50 下做模型加速使用的是靜態(tài)圖?nn.Graph?,類似 PyTorch 的 TorchScript。OneFlow 的優(yōu)化功能做的更全面一些,運(yùn)行時(shí)也是一個(gè)特有的服務(wù)于加速的 Actor Runtime。

nn.Graph?是一個(gè)面向?qū)ο箫L(fēng)格的靜態(tài)圖類,它代表一個(gè)完整的靜態(tài)計(jì)算圖。對(duì)于預(yù)測(cè)任務(wù),nn.Graph?可以只包括前向計(jì)算;對(duì)于訓(xùn)練任務(wù),還可以包括后向計(jì)算和模型更新。

nn.Graph?的基礎(chǔ)接口和?nn.Module?的行為比較類似,比如添加子 Module,自定義算法執(zhí)行邏輯,調(diào)用以執(zhí)行一次計(jì)算,保存模型等。被添加進(jìn)入?nn.Graph?的?nn.Module?對(duì)象,在?nn.Graph?里執(zhí)行時(shí),就會(huì)采用靜態(tài)圖模式執(zhí)行,如此動(dòng)態(tài)圖下的計(jì)算邏輯就可以被靜態(tài)圖直接復(fù)用,這樣就實(shí)現(xiàn)了動(dòng)靜執(zhí)行的切換。特殊一點(diǎn)的是,Optimizer 也可以添加進(jìn)入靜態(tài)圖,這樣前向、后向、模型更新可以被加入一個(gè)完整的靜態(tài)圖做聯(lián)合優(yōu)化。

下面的步驟把動(dòng)態(tài)執(zhí)行的 ResNet101Module 變成靜態(tài)執(zhí)行,使用方式和?nn.Module?類似,只需要聲明、實(shí)例化、調(diào)用三個(gè)基本步驟。

  • 聲明一個(gè)靜態(tài)圖:主要包括兩部分,先在初始化函數(shù)中添加要靜態(tài)化的?nn.Module?和?Optimizer?;然后在?build?函數(shù)中構(gòu)圖。

  • 實(shí)例化靜態(tài)圖:按普通的 Python Class 使用習(xí)慣去做初始化就好。

  • 調(diào)用靜態(tài)圖:類似?nn.Module?的調(diào)用方式,注意第一次調(diào)用會(huì)觸發(fā)編譯,所以第一次調(diào)用比后面的時(shí)間要長(zhǎng)。

在本案例中,把 ResNet101 的?nn.Module?的實(shí)例加入?nn.Graph?執(zhí)行后,對(duì)比得到約 25% 的加速。

2.2 算法層次的優(yōu)化

在把動(dòng)態(tài)圖代碼遷移到靜態(tài)圖代碼的過程中,因?yàn)樾枰紤]哪些部分要做靜態(tài)化,所以對(duì)模型做了模塊化的重構(gòu),但發(fā)現(xiàn)本任務(wù)中有些計(jì)算是做實(shí)驗(yàn)時(shí)遺留的,在部署時(shí)并不必要,順便做了算法邏輯的約減:

  • 一般推理時(shí)只需要前向計(jì)算,后向計(jì)算是不需要的,但在用戶這個(gè)特殊的模型里,部署和推理也是需要后向計(jì)算,只是不需要模型更新,這就導(dǎo)致用戶寫代碼時(shí)為了保留后向計(jì)算也誤把參數(shù)更新的邏輯保留下來了。據(jù)此可以省略參數(shù)的梯度計(jì)算,在本案例中,這里大概帶來了 75% 的加速;

  • 進(jìn)而發(fā)現(xiàn)原任務(wù)(前向、后向、前向)中的第二次前向在部署時(shí)是多余的,可以裁剪掉,在本案例中,這里帶來了大約 33% 的加速。

事實(shí)證明,算法邏輯本身具有很大的優(yōu)化空間,代碼做好模塊化,可以比較容易找到算法邏輯上的優(yōu)化點(diǎn)。當(dāng)然,這部分改善也適用于PyTorch。

2.3 提高并行度

在做完優(yōu)化的基礎(chǔ)上,研發(fā)人員觀察到 GPU 的利用率只有 30%。此時(shí) batch_size 為 1( BN 的某些參數(shù)和 batch 大小有關(guān),此前擔(dān)心擴(kuò)大 batch_size 可能影響計(jì)算結(jié)果,事后證明這個(gè)擔(dān)心是多余的,從理論推導(dǎo)和實(shí)驗(yàn)結(jié)果都證實(shí),擴(kuò)大 batch_size 并不影響計(jì)算結(jié)果),單進(jìn)程,提高數(shù)據(jù)并行度是很值得嘗試的方案。因此,案例中嘗試了提高 batch_size 和 多進(jìn)程方案:

  • 增大 batch_size,默認(rèn) batch_size 為 1,此時(shí) GPU 利用率為 30%,當(dāng)增大到 16 時(shí),最高可以達(dá)到 90%,這里大約得到了 155% 的加速;

  • 由于數(shù)據(jù)預(yù)處理在 CPU,網(wǎng)絡(luò)計(jì)算在 GPU,兩種設(shè)備接力執(zhí)行,這時(shí)使用 2 進(jìn)程進(jìn)行,給數(shù)據(jù)加載部分加一個(gè)互斥鎖,可以比較簡(jiǎn)易的實(shí)現(xiàn) CPU 和 GPU 兩級(jí)流水線,這里帶來了約 80% 的加速。

提高并行度的累積加速是 4.6 倍。增加并行度以充分利用多核、多設(shè)備,帶來了最明顯的加速效果。當(dāng)然,這里的優(yōu)化效果是用戶遷移到 OneFlow 后實(shí)現(xiàn)的,在 PyTorch 上也可以做到。

2.4 靜態(tài)編譯優(yōu)化

做到以上優(yōu)化后,GPU 利用率已經(jīng)能比較穩(wěn)定的保持在 90%,一般來說,已經(jīng)沒有太大優(yōu)化空間了。但是,OneFlow?nn.Graph?下還有一些自動(dòng)的編譯優(yōu)化技術(shù)可以嘗試。

比如利用自動(dòng)混合精度做低精度計(jì)算、利用算子融合來減少訪存開銷等,這里最終帶來了 64% 的加速,速度到了原來最好性能的 1.56 倍。

此前示例中提到的?_config_graph?函數(shù)就是在配置這些優(yōu)化選項(xiàng),具體如下:

對(duì)于 ResNet101,batch_size 設(shè)置為 16,在?nn.Graph?無優(yōu)化選項(xiàng)打開的基礎(chǔ)上:

  • 打開混合精度,測(cè)試得到了約 36% 的加速

自動(dòng)混合精度訓(xùn)練,自動(dòng)將網(wǎng)絡(luò)中的合適的算子由 FP32 單精度計(jì)算轉(zhuǎn)換成 FP16 半精度浮點(diǎn)進(jìn)行計(jì)算,不僅可以減少 GPU 顯存占用,而且可以提升整體性能,在支持 Tensor Core 的 GPU 設(shè)備上還會(huì)使用 Tensor Core 進(jìn)一步加速訓(xùn)練。

  • 再打開卷積試跑優(yōu)化,測(cè)試得到了 7% 的加速,總加速為 43%

cudnn 的 convolution 算子包含多種算法,例如前向的算法。不同的 input 和 filter 大小在不同的算法下有不同的性能表現(xiàn),為了選擇最佳算法,在調(diào)用 cudnn convolution 算子接口前,需要先調(diào)用 cudnn convolution searching algorithm 的接口。cudnn 提供了2種搜索模式:?jiǎn)l(fā)式搜索和試運(yùn)行搜索(cudnnFindConvolutionForwardAlgorithm)。

啟發(fā)式搜索是通過一種「查表」的方式來搜尋最佳算法,cudnn 對(duì)不同的參數(shù)配置對(duì)應(yīng)的最佳算法進(jìn)行了預(yù)先定義,然后每次搜索時(shí)進(jìn)行匹配得到結(jié)果。試運(yùn)行搜索會(huì)傳入實(shí)際的張量進(jìn)行多次試運(yùn)行,然后返回運(yùn)行結(jié)果。搜索算法返回的結(jié)果都是不同算法的元信息及其所需耗時(shí)。

啟發(fā)式搜索在搜索階段不需額外分配內(nèi)存,且能更快得到結(jié)果;而試運(yùn)行搜索能得到更為全面和精確的結(jié)果,也即通常能更精確地找到最佳算法。啟發(fā)式搜索在常見情形下可以得到與試運(yùn)行搜索一致的結(jié)果,但在一些特殊參數(shù)配置下無法得到最佳結(jié)果。OneFlow 中默認(rèn)啟動(dòng)了啟發(fā)式搜索,但可通過?graph.config.enable_cudnn_conv_heuristic_search_algo(False)?接口關(guān)閉,關(guān)閉后使用的就是試運(yùn)行搜索。

  • 再打開 pad 和 conv 算子融合,測(cè)試得到了 19% 的加速,總加速為 62%

在 CNN 網(wǎng)絡(luò) Backbone 中有很多 convolution + pad 的組合,convolution 算子自身支持 pad 操作,自動(dòng)將 pad 算子 fuse 到 convolution 算子上,可以省掉 pad 算子的開銷,提升網(wǎng)絡(luò)整體性能。

  • 再打開 add 的算子的融合,測(cè)試得到了 2% 的加速,總加速為 64%

自動(dòng)將網(wǎng)絡(luò)中常見的訪存密集型算子 Elementwise add 算子和上游的算子 fuse 起來,可以減少帶寬使用,從而提升性能。對(duì)于 Elementwise add 算子來說,將其 fuse 到上一個(gè)算子,可以減少一次數(shù)據(jù)讀寫,有約 2/3 的性能提升。

另外?nn.Graph?可以很方便地支持使用 TensorRT 。本優(yōu)化對(duì)象沒有更新模型的需求,所以也適合使用 TensorRT 做加速。在?nn.Graph?無優(yōu)化選項(xiàng)基礎(chǔ)上, batch_size 設(shè)置為 16,新增自動(dòng)混合精度、NHWC、使用 TensorRT 后端,可以提速 48%。

在這個(gè)模型里,只使用 TensorRT 后端比只使用 OneFlow 的靜態(tài)圖優(yōu)化還差一點(diǎn),可能的原因是, TensorRT 下的一些優(yōu)化在?nn.Graph?里已經(jīng)做了,所以沒有帶來額外收益。不過其實(shí)驗(yàn)起來還比較方便,編譯一下帶 TensorRT 的 OneFlow,再在 nn.Graph 下打開開關(guān)就可以,列出來作為參考:

在本案例中,案例項(xiàng)目方基于 OneFlow v0.7.0 將之前開發(fā)的 PyTorch 的業(yè)務(wù)模型代碼一鍵遷移成 OneFlow 的模型代碼,再經(jīng)過簡(jiǎn)單加工就轉(zhuǎn)成 OneFlow 的靜態(tài)圖 nn.Graph 模式,并行地使用 OneFlow 進(jìn)行加速。最終結(jié)合「動(dòng)態(tài)轉(zhuǎn)靜態(tài)、算法邏輯約減、提高并行度、靜態(tài)編譯優(yōu)化」這四類技巧,其中動(dòng)態(tài)轉(zhuǎn)靜態(tài)加速約 1.25 倍、算法邏輯約減加速約 2.33 倍、提高并行度加速約 4.6 倍、靜態(tài)編譯優(yōu)化加速約 1.6 倍,累積加速約 21 倍,中間有些小的優(yōu)化點(diǎn)沒有完全記錄,最終單機(jī)執(zhí)行達(dá)到了 25 倍以上的加速效果。


3 使用 OneFlow-Serving,輕松將訓(xùn)練好的模型部署上線

當(dāng)用戶完成訓(xùn)練,得到最終的模型之后,接下來的一步就是模型部署。不同于模型訓(xùn)練時(shí)需要進(jìn)行權(quán)重更新,部署時(shí)的權(quán)重固定不變,所以可以進(jìn)行更激進(jìn)的速度優(yōu)化,例如 int8 量化、更廣泛的 kernel fusion、constant folding 等等。

用戶參考 OneFlow v0.7.0 提供了官方的?Serving 模塊,它是一個(gè) NVIDIA Triton 的后端,集成了 OneFlow 內(nèi)置的 XRT 模塊,并提供了開箱即用的用戶接口。只需使用下述方法就將訓(xùn)練好的 OneFlow 模型快速高效的部署起來:

為了將模型用于推理,在使用 nn.Graph 訓(xùn)練完成之后,需要構(gòu)造一個(gè)只包含前向的?ResNet101InferenceGraph?:

并以一個(gè)樣例輸入運(yùn)行 inference_graph,觸發(fā) inference_graph 的計(jì)算圖構(gòu)建:

接下來就可以運(yùn)行?flow.save?將?inference_graph?的計(jì)算圖結(jié)構(gòu)以及權(quán)重均保存在 "model" 文件夾下,以供部署使用:

然后只需要運(yùn)行

由此可以啟動(dòng)一個(gè)部署著 ResNet101 模型的 Docker 容器。這里的 -v 很重要,它表示將當(dāng)前目錄下的 model 文件夾映射到容器內(nèi)的 "/models/resnet101/1" 目錄,其中 /models 是 Triton 讀取模型的默認(rèn)目錄,Triton 會(huì)以該目錄下的一級(jí)目錄名("resnet101")作為模型名稱,二級(jí)目錄名("1")作為模型版本。

如果將啟動(dòng)命令調(diào)整為

模型就會(huì)通過 OneFlow 的 XRT 模塊自動(dòng)使用 TensorRT 進(jìn)行推理,此外 OneFlow Serving 還支持類似的 “--enable-openvino”。

啟動(dòng) Docker 容器后,運(yùn)行下面的命令,就可以查看服務(wù)狀態(tài):

返回值為?HTTP/1.1 200 OK?,表示服務(wù)正在正常工作。

接下來就可以使用 Triton 的 C++ 或 Python SDK 實(shí)現(xiàn)向服務(wù)端發(fā)送請(qǐng)求并獲取結(jié)果的邏輯了,例如一個(gè)最簡(jiǎn)單的客戶端:

試著運(yùn)行一下,可以發(fā)現(xiàn)它成功的打印出了推理結(jié)果:

在矩池云使用OneFlow框架

矩池云已經(jīng)支持最新版本的 OneFlow ,根據(jù) OneFlow 官方說明,目前框架支持在以下類型顯卡使用,進(jìn)入?主機(jī)市場(chǎng),選擇相應(yīng)的顯卡

再輸入 OneFlow ,即可直接運(yùn)行。

OneFlow?https://github.com/Oneflow-Inc/oneflow

矩池云Matpool?https://www.matpool.com

完整教程 https://matpool.com/learn/article/oneflow-matpool

OneFlow|推薦一款兼容 PyTorch 的國產(chǎn) AI 框架的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
桂东县| 纳雍县| 阿巴嘎旗| 呼伦贝尔市| 团风县| 句容市| 天水市| 方城县| 张掖市| 巴南区| 清远市| 永新县| 黄浦区| 铜陵市| 永清县| 金昌市| 神池县| 礼泉县| 天门市| 旬邑县| 阜城县| 甘孜县| 黎川县| 新乐市| 陆河县| 肇州县| 广河县| 二手房| 娄底市| 无极县| 阳东县| 阆中市| 文水县| 通山县| 南澳县| 海丰县| 廉江市| 炎陵县| 志丹县| 柳林县| 东乌|