ModelArts模型導入tensorflow frozenGraph格式模型
背景:
線下有一個Tensorflow frozenGraph格式的yolov3模型, 并且已經有推理代碼demo.py可以加載模型并進行推理
問題:
如何導入到ModelArts模型管理中?
文中引用到的參考代碼已保存在附件中
1????? 本地代碼介紹
本地代碼結構如下:
其中demo.py是推理入口腳本,demo.py調用了yolov3_utils.py中的方法。frozen_darknet_yolov3_model2.pb是需要導入的模型文件。
2? Modelarts推理代碼結構
適配模型導入后的代碼結構如下
l? 所有的文件需要保存在model的目錄下,然后上傳到obs
l? config.json用于定義容器的執行環境與依賴的python包。
l? demo.py變為了customize_service.py
3 代碼遷移
3.1????? ModelArts模型導入都做了哪些事情?
l? 通過讀取config.json的runtime字段信息,后臺啟動一個runtime對應的docker鏡像,并在docker鏡像中安裝config.json中定義的依賴python包。
l? 然后將obs上配置的模型文件目錄整體拷貝到docker鏡像中,放到指定的目錄下。
l? Docker鏡像中有推理框架,自動加載customize_service.py中的方法,初始化,對應的customize_service.py中定義的__init__方法也會被執行,如果customize_service.py沒有覆寫__init__方法,那么會執行框架原有的init方法,對模型進行加載。
l? 服務啟動,等待傳入推理數據。
3.2 ? ?? 編寫config.json文件
config.json主要功能是定義模型運行環境信息,例如如果我推理代碼使用了numpy的版本是1.15.0可以在配置文件中添加如下內容。
Runtime字段指定了是否使用帶cuda的docker環境,如果模型是基于python 3.6 tensorflow 1.13 gpu環境構建的,這個時候runtime字段就要選擇
Config.json中的信息內容參考如下鏈接,
https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0092.html
一般來說物體檢測和圖像分類的輸入輸出都是固定,因此可以直接運行一個預置算法,預置算法默認會將config.json進行輸出,直接復用就可以。
3.3 ? ?? 編寫customize_service.py
參考文檔 https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0093.html
首先自定義的代碼需要繼承一個固定的類,這個和框架有關,例如我當前使用的tensorflow框架,那么我需要繼承的類是
在代碼中實際上這樣體現,我創建了一個新的類,類名為 Yolov3Service()這個類名隨便起,只要是你繼承了TfServingBaseService這個類,框架就知道了你這個類下面的方法就是你自己定義的方法。運行時,框架能夠調用到你的方法。
ModelArts推理框架將推理服務分成了4個流程。分別是
__init__(self, model_name, model_path):此方法只會在服務啟動時調用一次,可以在此方法內實現模型的加載,變量初始化。如果是tensorflow savedmodel格式的模型,可以不覆寫此方法,框架默認的__init__方法會自動加載模型。
model_name沒什么用,model_path是系統層傳進來的,這個目錄是此腳本所在docker容器中的運行目錄, model_path=os.path.abspath(__file__)
_preprocess(self, data):前處理,在推理請求前調用,用于將API接口用戶原始請求數據轉換為模型期望輸入數據。
_inference(self, data):實際推理請求方法
_postprocess(self, data):后處理方法,在推理請求完成后調用,用于將模型輸出轉換為API接口輸出
_preprocess,_inference,_postprocess這三個方法會在每次推理時調用,并且以此順序進行調用。
3.3.1??????? 依賴包導入
customize_service.py相比demo.py,依賴包增加導入紅框中的內容
入參由tf.app.flags.FLAGS變為通過環境變量獲取,例如demo.py里面通過
進行動態參數的傳遞而customize_service.py通過如下方式進行入參的解析。
此環境變量在模型部署時傳入
當然這些傳參也可以硬編碼
3.3.2 ? ? ?? __init__編寫
Demo.py中初始化模型邏輯如下
customize_service.py遷移后的代碼為
Demo.py 55行到60行被簡化為tf.ConfigProto(),因為云上一個模型占用一個GPU,所以不需要設置gpu顯存使用率。
Demo.py 67行對應customize_service.py 43行,session被保存起來,因為線上推理服務需要重復的使用
customize_service.py 36行通過model_path和model_filename,對于模型文件進行加載。為什么要進行路徑拼接,請參考3.1章節
3.3.3 ? ? ? _preprocess編寫
Demo.py里面對于圖片進行了resize
customize_service.py遷移后的代碼為
和讀取本地文件不同,_preprocess收到的是一個data數組,里面存的是圖片的信息。所以這里要對于每一個元素進行遍歷。這次這么做的好處就是支持帶batchsize的推理,一次可以傳入多張圖片。
3.3.4 ? ? ?? _inference編寫
Demo.py里面直接調用了session對文件進行了推理
customize_service.py遷移后的代碼為
3.3.5 ? ? ?? _postprocess編寫
Demo.py里面
進行了非極大值抑制,然后將推理獲得的坐標等比例擴大為原始尺寸。
對應customize_service.py的63行和74行。這里的代碼比較多,是因為要將返回值構建成config.json定義的結構。
3.4 ? 其推理模型編寫教程
https://bbs.huaweicloud.com/forum/thread-66858-1-1.html
附件: frozengraph模型導入demo.zip 4.29KB 下載次數:2次
AI開發平臺ModelArts
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。