<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          自己動手實現(xiàn)輕量級神經網絡推理框架——Planer

          共 4376字,需瀏覽 9分鐘

           ·

          2021-02-04 22:18

          ↑ 點擊藍字?關注極市平臺

          作者丨東林鐘聲@知乎(已授權)
          來源丨h(huán)ttps://zhuanlan.zhihu.com/p/347752954
          編輯丨極市平臺

          極市導讀

          ?

          本文介紹了作者編寫的 Planer (Powerful Light Artificial NEuRon)框架,該框架僅依賴 NumPy 作為其矩陣計算庫,通過正則表達式對 PyTorch 模型 TorchScript 進行解析實現(xiàn)模型自動轉換到 Planer 框架進行推理。?作者已經轉換了多種 CNN 模型在 Planer 實現(xiàn)成功推理。?>>加入極市CV技術交流群,走在計算機視覺的最前沿

          介紹:

          前段時間投入了大量的時間與精力編寫了 Planer (Powerful Light Artificial NEuRon)框架,該框架僅依賴 NumPy 作為其矩陣計算庫,并設計了 JSON 格式的及其精簡的中間表達格式。最終通過正則表達式對 PyTorch 模型 TorchScript 進行解析實現(xiàn)模型自動轉換到 Planer 框架進行推理。筆者已經轉換了多種 CNN 模型在 Planer 實現(xiàn)成功推理。同時,筆者希望 Planer 能夠成為在對部署難度有要求的計算環(huán)境中成為有競爭力的一個框架。Planer 在設計之初就考慮到 了可擴展性以及可移植性,筆者編寫的另一個目的是希望大家能夠加入完善 Planer 的隊伍當中,實現(xiàn)更多的 Layer 并支持更多更新的模型,讓 Planer 的生態(tài)壯大起來。

          https://github.com/Image-Py/planergithub.com

          下圖是已經成功轉換的PyTorch訓練好的模型在Planer上實現(xiàn)推理(HED邊緣檢測、CRAFT場景文字檢測、ResNet18、ESRGAN超分辨率、UNet以及YOLO-v3)。Image-Py/planer(https://github.com/Image-Py/planer)下圖是已經成功轉換的PyTorch訓練好的模型在Planer上實現(xiàn)推理(HED邊緣檢測、CRAFT場景文字檢測、ResNet18、ESRGAN超分辨率、UNet以及YOLO-v3)。

          特點:

          • 純NumPy實現(xiàn),依賴簡單、部署快捷
          • 非常精簡的IR實現(xiàn),基于JSON
          • 自帶模型可視化(基于networkx)
          • 支持模型從PyTorch自動轉換
          • 比較豐富的示例CNN模型

          頂層設計:

          我們要設計一個神經網絡推理框架,首先要先把框架的頂層設計想好。我們的目的是實現(xiàn)一個部署友好、自主可控且輕量級的推理框架。部署友好如何實現(xiàn)?因為推理框架的本質還是涉及到數(shù)據(jù)的計算,我們采用NumPy來支撐我們所有的計算。同時為了做到輕量級,我們將所有神經網絡中涉及到比較單獨的部分統(tǒng)稱為Layer,比如卷積層、全連接層以及非線性激活函數(shù)等。同時這種設計方式使得以后對框架進行擴充只需要再實現(xiàn)新的Layer功能就好。這里我們給出我們Layer這個基本類的Python抽象:

          class Layer:    name = 'layer'
          def __init__(self, name): self.name = name
          def forward(self, x): pass
          def backward(self, grad_y): pass
          def para(self): return None
          def load(self, buf): return 0
          def __call__(self, x): return self.forward(x)

          Layer中最重要的兩個api就是前向計算 forward 以及參數(shù)加載load。這個設計基本上可以覆蓋大部分的模型中所涉及到的層與操作。同時我們這種統(tǒng)一的Layer 設計,可以統(tǒng)一有訓練參數(shù)層操作(全連接、卷積層等)與無訓練參數(shù)操作(激活函數(shù)、池化等)。無訓練參數(shù)操作只需要實現(xiàn)forward即可。為了保證模型在部署加載中的簡便性,我們將所有的權重都拉直后拼接成一個一維npy文件保存起來,通過NumPy 的io功能實現(xiàn)模型的保存于加載。同時我們將模型的計算表示,也就是IR用json文件保存。這樣在實際部署推理模型的時候,只需要NumPy模塊與一個npy和一個json文件。這樣的設計極大程度的較小了部署難度,將所有的業(yè)務實現(xiàn)交給NumPy來完成。同時由于PyTorch更加直觀且高效,在研究中廣泛使用。Planer框架主要將PyTorch作為對照,計算風格與api設計成與之類似。

          構建方式:

          Planer支持兩種構建方式,一種是手動構建,基本和PyTorch一樣的實現(xiàn),另外一種是基于json文件自動生成模型。

          手動構建:

          from planer import *# ========== write a net manually ========== class CustomNet(Net):    def __init__(self):        self.conv = Conv2d(3, 64, 3, 1)        self.relu = ReLU()        self.pool = Maxpool(2)        self.upsample = UpSample(2)        self.concatenate = Concatenate()        self.sigmoid = Sigmoid()
          def forward(self, x): x = self.conv(x) x = self.relu(x) y = self.pool(x) y = self.upsample(y) z = self.concatenate([x, y]) return self.sigmoid(z)

          JSON構建:

          # ========== load net from json ========== layer = [('conv', 'conv', (3, 64, 3, 1)),        ('relu', 'relu', None),        ('pool', 'maxpool', (2,)),        ('up', 'upsample', (2,)),        ('concat', 'concat', None),        ('sigmoid', 'sigmoid', None)]
          flow = [('x', ['conv', 'relu'], 'x'), ('x', ['pool', 'up'], 'y'), (['x','y'], ['concat', 'sigmoid'], 'z')]
          net = Net()net.load_json(layer, flow)

          模型自動轉換(ResNet18、pytorch 1.1.0):

          from torchvision.models import resnet18import torchfrom planer import torch2planer
          net = resnet18(pretrained=True)x = torch.randn(1, 3, 224, 224, device='cpu')torch2planer(net, 'resnet18', x)
          # then you will get a resnet18.json and resnet18.npy in current folder.
          from planer import read_netimport planerimport numpy as np
          # get the planer array libpal = planer.core(np)x = pal.random.randn(1, 3, 224, 224).astype('float32')net = read_net('resnet18')net(x) # use the net to predict youre data

          GPU加速:

          這里可以直接使用CuPy替換掉NumPy作為backend來進行gpu計算加速

          import planer, cupyplaner.core(cupy) # use cupy as backend
          import planer, clpyplaner.core(clpy) # use clpy as backend

          模型可視化(UNet):

          已經支持的Layer:

          FC、Conv、Flatten、Upsample、MaxPool、BachNorm、ReLU、Sigmoid、LeakyReLU、Softmax等。其實再有了這些基本的操作后,可以成功推理復雜的CNN,比如YOLO-v3:

          YOLO-v3的成功轉換代表了一個里程碑,表示一些基本的模型都可以通過Planer來進行推理實現(xiàn),而且Planer推理只依賴NumPy,這使得使用Planer可以大幅度降低部署難度與門檻。同時我正在寫一本詳細講解Planer的電子書《動手編寫深度學習推理框架 Planer》,第一個版本的電子書已經編寫完畢,詳情可以私聊。


          推薦閱讀



          添加極市小助手微信(ID : cvmart2),備注:姓名-學校/公司-研究方向-城市(如:小極-北大-目標檢測-深圳),即可申請加入極市目標檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計/ReID/GAN/圖像增強/OCR/視頻理解等技術交流群:月大咖直播分享、真實項目需求對接、求職內推、算法競賽、干貨資訊匯總、與?10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~
          △長按添加極市小助手

          △長按關注極市平臺,獲取最新CV干貨

          覺得有用麻煩給個在看啦~??
          瀏覽 57
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲国产精品VA在线看黑人 | 久久高清一区二区三区 | 艹逼无码黄色的视频禁止 | 肏屄视频网站 | 三级视频网站在线观看 |