# 重要提示 ### 1. <span style="color:red;">請勿在路徑中包含中文</span>,否則各種錯誤請自行想辦法 ### 2. 此處一樣要使用兩版YOLO,一為原版本YOLO,量化程式請放在原版的目錄底下執行。第二個為OpenVINO的YOLO範例,量化後使用。 # INT8量化 我們在[在OpenVINO中部署自訓練的YOLOv5模型](https://hackmd.io/@99playrobot/ByEfoxtxT)中做了標記訓練YOLO,並轉換為OpenVINO使用的格式,同時將模型量化到FP16。但在實務上,執行環境往往更為嚴苛,這時候將需要更小的模型。 本篇我們就來更進一步,把模型量化到INT8,理論上應該可以獲得更好的性能。 ......要先跟大家說抱歉,上一篇中說步驟很繁雜,但本鳥簡化了一些舊版的方法和一些比對過程之後,實際上的操作只需要以下這段程式碼就可以搞定。 ```python= from openvino.runtime import serialize from utils.dataloaders import create_dataloader from utils.general import check_dataset from openvino.runtime import Core import nncf import multiprocessing as mp def create_data_source(): data = check_dataset("data/fadou/fadou.yaml") val_dataloader = create_dataloader( data["val"], imgsz=640, batch_size=1, stride=32, pad=0.5, workers=0 )[0] return val_dataloader # Define the transformation method. This method should take a data item returned # per iteration through the `data_source` object and transform it into the model's # expected input that can be used for the model inference. def transform_fn(data_item): # unpack input images tensor images = data_item[0] # convert input tensor into float format images = images.float() # scale input images = images / 255 # convert torch tensor to numpy array images = images.cpu().detach().numpy() return images if __name__ == '__main__': mp.freeze_support() core = Core() data_source = create_data_source() # Wrap framework-specific data source into the `nncf.Dataset` object. nncf_calibration_dataset = nncf.Dataset(data_source, transform_fn) subset_size = 300 preset = nncf.QuantizationPreset.MIXED ov_model = core.read_model("fadou_fp32.xml") quantized_model = nncf.quantize( ov_model, nncf_calibration_dataset, preset=preset, subset_size=subset_size ) nncf_int8_path = "fadou_int8.xml" serialize(quantized_model, nncf_int8_path) ``` 這段程式碼我們分成三個部分來看。 第一個部分是8~14行的建立資料集。和FP16不同,INT8量化時損失的資訊太多,因此需要利用原本的訓練資料進行後訓練來拉回辨識的正確度。這邊使用的yaml檔就是前面訓練時自行撰寫的YAML檔案,請依照個人路徑和檔名更改這邊。 第二部分則是19~28行,這邊處理了資料的格式讓它符合nncf需要的格式。nncf是Neural Network Compression Framework的縮寫,用於神經網路優化。在OpenVINO中,它也是我們做INT8量化的推薦工具。 最後則是30行以後,啟動OpenVINO的核心功能後引入準備好的數據集開始量化。40行會讀取之前訓練完成的xml檔案,請依照自己前面訓練時取的檔名更改。而一個比較需要注意的是開頭的 ```python if __name__ == '__main__': mp.freeze_support() ``` 和以往不一樣,這邊是必定得加上的行。pyTorch在windows底下執行的時候會有奇妙的表現,若不加上這兩行會卡在分線程資料處理的錯誤(即使指定0額外線程也會照樣卡著)。 執行後需要稍等一下,幸運的是,和前面訓練時相比時間會短上不少。 正常執行完之後資料夾底下會多出指定的int8_xml檔案  (是的,本鳥後來發現打法鬥的中文發音看起來有點菜,後來改為正式名稱了) 接著我們直接把上一篇使用過的辨識程式,更動模型的名稱即可:  執行之後應該跟FP16的顯示結果差不多:  我們可以注意到左下角每一張照片辨識的需時是0.025~0.022左右,而這到底快了多少呢,我們可以看看將模型改回跑FP16時的照片  大約落在0.05秒至0.06秒之間,有略超過2倍的速度。 最後科普一下,法國鬥牛犬並不是法國犬種喔......
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up