色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何把Tengine Python API移植到Tengine Lite上

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-15 00:30 ? 次閱讀

大佬說選擇移植Tengine Python API這個任務,一方面是因為他之前做過涉及Python和C++/C交互的開源項目工作,如 MXNet 中DLPack的Python API和他自己的開源項目 MobulaOP,這些工作讓他踩了不少的坑;另一方面是因為他認為,了解一個框架需要先把例子跑起來, 就像學習一門新的編程語言要先跑通它的Hello World程序。通過這次任務,可以了解基于Tengine Lite的圖像分類實現,對TengineLite有一個初始的、直觀的感受。

以下為大佬第一人稱自述/~

初探源碼

這個任務的工作可以用一句話來概括: 在Tengine跑起Python例子, 再在Tengine Lite跑起同樣的例子。

第一步需要找到Tengine Python API的例子。但Tengine沒有的Python例子, 也沒有Python API的文檔。想從單元測試入手,但也沒有Python API的單元測試,難怪移植Python API的任務難度比移植C++ API的任務難度高。還有什么方法可以了解Python API的用法呢? 閱讀源碼。Tengine的Python API放在pytengine文件夾, 里面有八個模塊,分別是:base、context、device、 graph、libinfo、node、tengine和tensor,可以重點關注base, graph和tensor。

從base.py源碼中可以看出Tengine使用ctypes的形式進行Python和C++/C的交互,把動態鏈接庫libtengine.so讀取后保存到變量/_LIB中,通過/_LIB.可以調用Tengine的C API. graph.py實現計算圖部分的API,tensor.py實現了作為輸入和輸出的張量API。

編譯和導入模塊

找到Python API代碼的位置后,編譯Tengine,并嘗試在Python中導入tengine模塊。從libinfo.py中可以了解到,Tengine Python API會在Python API目錄和環境變量LD/_LIBRARY/_PATH所指向的目錄中,查找動態鏈接庫libtengine.so.這時遇到了第一個Bug,我用的操作系統沒有定義LD/_LIBRARY/_PATH這個環境變量,而API里直接用下標訪問的形式取這個環境變量的值,出現了KeyError的錯誤。改成os.environ.get('LD/_LIBRARY/_PATH', '')即可。設置好動態鏈接庫的路徑后,可以成功導入pytengine模塊了。

編寫Python分類示例

Tengine提供C++/C的分類示例代碼,在examples目錄下,可以作為編寫Python例子時的參考。其中,classification.cpp用了Tengine的C++ API,比C API多了Net類的封裝,Net類封裝了對于計算圖Graph的操作。而classification/_old/_api.cpp用的是Tengine的C API. 由于Tengine Python API調用的是Tengine C API,因此可以拿classification/_old/_api.cpp作為參考。Tengine Python API封裝得很簡潔,很容易能找到每個Python函數調用的C函數。C++分類示例代碼和Python API的代碼互相對照,就可以寫出Python分類示例的代碼。寫完后就可以嘗試運行了。

運行Python分類示例

運行Python分類示例并不順利,一開始就在構建計算圖上出錯了。定位到Python API的源碼后, 發現是在以下兩行出錯。

# pytengine/tengine/graph.py:L24-L25 
params = [ c_str(item) for item in kwarg] 
self.graph = _LIB.create_graph(ctypes.c_void_p(context), c_str(model), *params)

create/_graph有三個參數: 第一個參數context是模型執行的上下文,第二個參數是模型的格式,第三個參數是模型的文件名。這兩行代碼看起來沒什么毛病,和C++例子里的調用方式是一模一樣的。但出錯的原因就在給變量params賦值的這一行,里面的item是一個臨時變量,當這條語句結束時,item離開了作用域就被釋放了。而c/_str(item)是指向原來item的位置,變成了一個野指針。為了解決這個問題,可以把該行改為params = [ c/_str(kwarg[i]) for i in range(len(kwarg)) ],此時c/_str(kwarg[i])指向的是變量kwargs中存儲的值,變量kwargs在調用函數create/_graph時仍在作用域內。

另外遇到的一個復雜的問題和Tensor類有關, pytengine的Tensor類還不完善,無法取出Tensor里的數據.。對照C語言寫的例子修改Tensor的buf函數,得到數據內存地址,占用的內存大小,類型,尺寸后,轉換為NumPy數組。 需要注意一下Tengine Lite前端的執行步驟:

# 建立計算圖并讀取模型文件
tm_file graph = tg.Graph(None, 'tengine', tm_file) 
# 取出輸入
Tensor input_tensor = graph.getInputTensor(0, 0) 
# 設置輸入Tensor的尺寸 
dims = [1, 3, img_h, img_w] 
input_tensor.shape = dims
# 預先運行以分配資源, 必須加上 
graph.preRun() 
# 設置輸入數據的內存地址, 這里的data是尺寸為(3, img_h, img_w)的NumPy數組. 注意: 這里不會檢查shape 
input_tensor.buf = data
# 以同步方式讓網絡進行推斷(前向傳播), 其中1表示使用同步的方式 
graph.run(1) # 1 is blocking 
# 取出輸出的Tensor 
output_tensor = graph.getOutputTensor(0, 0) 
# 將Tensor轉為NumPy數組 
output = np.array(output_tensor.buf)

把這些問題解決后,就能在Tengine上運行Python示例了。

需要注意的是,Tengine Lite和Tengine在做推斷前,都需要調用preRun()函數對資源進行分配,這是必須要調用的。 雖然現在的Python API用起來有點復雜,但相信之后會封裝得更好的。

從Tengine到Tengine Lite

在Tengine上成功運行Python示例后,移植就變得方便了。直接把pytengine文件夾下的所有代碼, 以及Python分類示例復制粘貼到Tengine Lite中,將動態庫名稱從libtengine.so改為libtengine-lite.so, 然后運行Python分類示例。不出意料,出錯了。 原因是Tengine Lite在設置輸入Tensor的數據內存地址時,也會檢查數據的大小,而之前的Python API的數據大小的計算是錯誤的。 修復Bug后, 成功在Tengine Lite上運行圖像分類示例。移植完成。不得不夸一下Tengine Lite的C API兼容性做得真好!

在EAIDK-310上運行Tengine Lite的Python圖像分類示例

之前參加OPEN AI LAB的活動,得到了一塊EAIDK-310開發板, 剛好可以在上面進行測試。
這里使用可愛的虎貓(Tiger Cat)作為測試圖片,模型采用MobileNet。 圖片和模型都可以在Tengine項目的頁面中找到鏈接 (Tengine快速上手指南)。

下載代碼

[openailab@localhost proj]$ git clone https://github.com/OAID/Tengine 
# 進入Tengine的目錄 
cd Tengine 
[openailab@localhost Tengine]$ git branch 
* tengine-lite

當前Tengine的默認分支是Tengine Lite。

2. 編譯Tengine Lite

mkdir build 
cd build 
cmake .. 
make -j2

注意不要把編譯線程數設太大,因為在最后編譯MobileNet SSD例子時消耗顯存比較多。六分鐘多可以編譯完。

3. 配置Tengine Lite的Python API編輯/home/openailab/.bashrc,再最后一行后面加入:

export TENGINE_LITE_PATH=/home/openailab/proj/Tengine 
export PYTHONPATH=$PYTHONPATH:$TENGINE_LITE_PATH/pytengine 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TENGINE_LITE_PATH/build/src/

環境變量TENGINE_LITE_PATH設置為Tengine Lite的根目錄路徑, 設置好后重新打開終端。 打開Python, 能成功導入tengine。

[openailab@localhost examples]$ python 
Python 3.6.5 (default, Mar 29 2018, 17:45:40) 
[GCC 8.0.1 20180317 (Red Hat 8.0.1-0.19)] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import tengine

4. 將三個文件cat.jpg/, mobilenet.tmfile/, synset/_words.txt放在examples的目錄下, 文件結構如下所示:

[openailab@localhost examples]$ pwd 
/home/openailab/proj/Tengine/examples

[openailab@localhost examples]$ tree 
. 
├── cat.jpg 
├── classification.py 
├── mobilenet.tmfile 
├── synset_words.txt

5. 運行examples文件夾下的圖像分類示例classification.py

[openailab@localhost examples]$ python classification.py 
n02123159 tiger cat 8.5975923538208 
n02119022 red fox, Vulpes vulpes 7.954988956451416 
n02119789 kit fox, Vulpes macrotis 7.867891311645508 
n02113023 Pembroke, Pembroke Welsh corgi 7.427407264709473 
n02123045 tabby, tabby cat 6.364651679992676

由此,就能夠在Tengine Lite上正確預測出虎貓啦 : )

下一步工作

對于Tengine Lite Python API,我覺得在API設計方面可以進一步改進。比如把數據預處理, 計算圖構建等操作隱藏起來,比如:

image = cv2.imread('./cat.jpg') 
model = tg.Model(tm_file) 
pred = model(image)

這樣可以減少出錯概率, 一些錯誤比如忘記對數據做預處理,使用的數據內存分布(NCHW還是NHWC)不正確,忘記調用prerun。

本次Tengine Python API移植任務,大佬做的工作是編寫一個Python的圖像分類示例,在Tengine上跑通代碼,再將pytengine移植(復制)到Tengine Lite上, 再在Tengine Lite上跑通代碼,其中還修復了pytengine中的一些bug。

更多Tengine相關內容請關注Tengine-邊緣AI推理框架專欄。

審核編輯 黃昊宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • python
    +關注

    關注

    56

    文章

    4798

    瀏覽量

    84801
  • Tengine
    +關注

    關注

    1

    文章

    47

    瀏覽量

    2861
收藏 人收藏

    評論

    相關推薦

    將基于PC的MP3播放器軟件移植ADSP-21262 SHARC處理器

    電子發燒友網站提供《將基于PC的MP3播放器軟件移植ADSP-21262 SHARC處理器.pdf》資料免費下載
    發表于 01-03 14:54 ?0次下載
    將基于PC的MP3播放器軟件<b class='flag-5'>移植</b><b class='flag-5'>到</b>ADSP-21262 SHARC處理器<b class='flag-5'>上</b>

    在設備利用AI Edge Torch生成式API部署自定義大語言模型

    MediaPipe LLM Inference API 讓開發者們能夠將一些最受歡迎的 LLM 部署設備。現在,我們很高興能進一步拓展對模型的支持范圍,并讓大家部署設備,而且具
    的頭像 發表于 11-14 10:23 ?471次閱讀
    在設備<b class='flag-5'>上</b>利用AI Edge Torch生成式<b class='flag-5'>API</b>部署自定義大語言模型

    如何利用pythonAPI查詢IP地址?

    Python中,直接查詢IP地址的地理位置或詳細信息(如所屬國家、城市等)通常需要依賴外部API服務,因為Python標準庫本身不提供直接查詢IP地址地理位置的功能。以下是一個使用requests
    發表于 08-28 11:55

    是否能將libwebsokets移植ESP8266利用libwebsokets進行網絡應用開發?

    1. 如題目,請問是否能將 libwebsokets 移植 ESP8266 利用 libwebsokets進行網絡應用開發? 2. libwebsokets 是純C實現,如何設置ESP8266
    發表于 07-22 06:22

    0.9.3的sdk的程序移植1.0的sdk,重啟后一直掛機的原因?

    0.9.3的sdk原來的程序移植1.0的sdk,下載完成后,不斷電,程序運行正常,但重啟后一直掛機。 load 0x40100000, len 816, room 16 1
    發表于 07-12 07:28

    將ADF移植RTOS大概都需要哪些步驟?一般移植周期多久呢?

    1 ADF是免費的開源軟件嗎? 2 將ADF移植RTOS大概都需要哪些步驟?一般移植周期多久呢?
    發表于 06-28 08:03

    如何移植http/https serversoftAP

    網頁服務器移植 worksapceesp-idfexampleswifigetting_startedsoftAP 可以通過網頁進行配置 現在是一點思路都沒有,各種 大神/牛哥,給點指導,謝謝了
    發表于 06-19 06:14

    第四講:單片機STC89C52+RA8889驅動控制彩屏 代碼移植范例(包含API接口)

    51單片機通過RA8889控制驅動彩屏,移植API參考程序
    的頭像 發表于 06-06 13:59 ?1476次閱讀
    第四講:單片機STC89C52+RA8889驅動控制彩屏 代碼<b class='flag-5'>移植</b>范例(包含<b class='flag-5'>API</b>接口)

    訊飛星火Lite API開放免費永久,星火Pro/Max API價格0.2元

    5月22日,科大訊飛宣布旗下訊飛星火Lite API完全免費向公眾開放,滿足在線聯網搜索及低算力推理與模型精調等特殊需求。同時,訊飛星火Pro/Max API的定價則為每萬tokens收取0.21元。
    的頭像 發表于 05-22 11:43 ?1202次閱讀

    STemWin移植STM32后無法顯示怎么解決?

    最近在玩STemWin,但是移植STM32后無法顯示,單步調試的時候進入不了打點函數,我用的是IAR,驅動代碼沒有優化,僅僅是想先用打點函數來實現一下看看效果,后續再做優化,請教一下大神們,這個該怎么解決
    發表于 05-13 07:20

    STM32F407的程序移植STM32F103的芯片上面,需要修改哪些內容?

    STM32F407的程序移植STM32F103的芯片上面,需要修改哪些內容?
    發表于 04-10 07:38

    如何stm32F103程序移植stm32g030k6t6

    怎么stm32F103程序移植stm32g030k6t6
    發表于 04-03 07:57

    ELF 1技術貼|如何將Python3.6.9移植開發板

    如何進行交叉編譯并移植ELF1開發板。在網址:https://www.python.org/ftp/python/下載
    的頭像 發表于 02-22 14:06 ?443次閱讀
    ELF 1技術貼|如何將<b class='flag-5'>Python</b>3.6.9<b class='flag-5'>移植</b><b class='flag-5'>到</b>開發板<b class='flag-5'>上</b>

    OpenHarmony 移植:build lite 編譯構建過程

    這些疑惑,會對 build lite 編譯構建過程有個更深入的理解。 1、產品解決方案代碼是如何被調用編譯的 在文件 buildliteBUILD.gn 配置文件中的構建目標 //build/lite
    的頭像 發表于 02-19 16:19 ?976次閱讀

    嵌入式學習-ElfBoard ELF 1板卡-移植python3.6.9

    /lsb_release 再次make install編譯,在_install目錄下會生成bin、include、lib、share文件夾。6.移植交叉編譯好的pythonARM開發板:(1)在
    發表于 01-24 16:50
    主站蜘蛛池模板: 亚洲日本天堂在线| 含羞草免费完整视频在线观看 | 免费在线亚洲视频| 秋霞网站一级一片| 亚洲第一页视频| 777EY_卡通动漫_1页| 国产成人精品视频频| 久久精品免费电影| 人人模人人干| 亚洲久久少妇中文字幕| 999zyz色资源站在线观看| 国产精品99久久久久久AV| 龙腾亚洲人成电影网站| 婷婷激情综合色五月久久竹菊影视| 永久免费看A片无码网站四虎| 久久久久亚洲| 欧美伦理片第7页| 亚洲2023无矿砖码砖区| 95国产精品人妻无码久| 国产精品亚洲欧美| 空姐被黑人 苏晓曼| 我解开了岳的乳第一个女人| 1级午夜影院费免区| 国产日韩欧美三级| 内射一区二区精品视频在线观看 | 久久久久毛片免费观看| 日本亚洲精品无码区国产电影 | 最新果冻传媒在线观看免费版| 儿子好妈妈的HD3中字抢劫| 久久精品视在线观看2| 三级全黄的视频| 69式国产真人免费视频| 国产亚洲精品高清视频免费| 欧美性猛交AAA片| 伊人狠狠丁香婷婷综合尤物| 国产成人精品电影在线观看| 男人舔女人的阴部黄色骚虎视频| 亚洲欧美自拍明星换脸| 邓奴的视频IVK| 免费人成网站永久| 亚洲伊人精品综合在合线|