模型定點的問題

edited September 2021 in Innoserve area

當自訂模型做完定點化之後,進行推論時輸入的圖片需要轉成int8的精度嗎? 

如果需要那推薦的轉換方法是直接將rgb的值減去128嗎?

因為我們在pytorch推論時是先將圖片預處理到0,1之間輸入,不知使用nef格式是否也可以接受float

Comments

  • 耐能的NPU架構會需要將模型轉成定點架構(INT8),但使用者僅需在浮點架構下(float)訓練完模型,並轉成耐能所需的ONNX格式即可,透過toolchain編譯時就會有相關功能可以將模型轉成定點,使用者不需額外準備定點架構的模型。

    輸入的圖片不需要轉成INT8的格式,但必須依據模型所需的輸入範圍來做正規化,我們將這個步驟稱為前處理(preprocess)。因為圖片的傳輸是以byte為單位,加上原始圖片的值不會是負數,所以會是UINT8的格式(0~255),以格式RGBA8888為例,即每個像素(pixel)會有紅、綠、藍與亮度四個通道,並各將以8bit來表示,最小值為0,最大值為255。

    若原始模型的輸入需要正規化到0~1範圍內,以耐能的radix公式 7 – ceil(log2 (abs_max)) 來推算,radix會等於7 (radix的設定會在toolchain操作時提到),也就代表圖片輸入到NPU時會自動除以2^7 (128),而輸入範圍0~255的圖片,除以128後大約會是0~2,為了要符合0~1的需求,使用者需要自行將圖片做除以2的動作。

    總結這個範例(0~1)所需要前處理的流程,會包含下面幾個步驟

    1. 將圖片轉換成RGBA四個通道的格式,且每個通道的數值為UINT8 (0~255)
    2. 將每個像素內各通道的值都除以二

    如此一來,圖片輸入至radix = 7的模型後,就會被正規化至0~1之間。

  • 請問這段話是指當運行dme_async_pre_post_host_classification.py時經過preprocess會進行處理的處理嗎?

    因為我們目前看到對於radix的使用只有在kdp_wrapper.py中的convert_float_to_rgba,且其中(圖一)的radix輸出看到的是8,與input_params.json(圖二)中radix的設定有關嗎?

    我們有需要手動調整radix的值嗎? 

    謝謝

  • 想像在定點INT8的世界裡,資料能夠儲存的範圍只有-128 ~ 127,但若模型在浮點狀態下所需要的輸入範圍是-1.0 ~ 1.0,也就是需要用-128~127的值去代表-1.0~1.0,為了要達到這個目的,我們可以把-128~127的數值全都除以128 ( 2^7),如此一來,只要記錄下除以128 (radix = 7)這件事,就可以達到定點與浮點間的轉換。

    但若是模型需要的範圍是-0.5~0.5,要用-128~127去代表則需要除以256,所以radix的值會依據模型所需要的輸入範圍而有所不同。

    除以2^radix是指定點與浮點轉換的過程中的固定公式,這部分在模型轉成耐能的定點架構的同時就會處理,使用者在前處理的階段只要確認圖片送到NPU後,除以2^radix會符合原本模型所需的輸入範圍即可,前處理內不需去做除以2^radix這個動作

    因此,以模型需求範圍0.0~1.0為範例,radix會等於7,因為NPU的定點運算會有一個 / 2^7的動作,[0, 255]/ (2^7) = [0, 2],因此前處理中要先將照片的值除以2,才會符合模型需求的0.0~1.0

    [0, 255] / 2 / (2^7) = [0, 1]

    因此,針對你的問題回覆如下

    1. 前處理(preprocess)中不用做 / 2^radix

    2. function convert_float_to_rgba雖然以radix方式來做rgba的轉換,但這邊可以依照個人習慣的寫法,只要符合上面的說明不用將radix寫在函式裡面也沒關係

    3. radix的公式為 7 – ceil(log2 (abs_max)),在toolchain的input_params.json中設定img_preprocess_method的參數時就會決定了。

The discussion has been closed due to inactivity. To continue with the topic, please feel free to post a new discussion.