pytorch優化之量化

2021-10-05 06:43:20 字數 1338 閱讀 9461

思考:pytorch的eager模式,是怎樣支援開發模式支援序列執行斷點除錯,生產模式支援生成可併發執行**的,可以拉原始碼除錯分析。這裡會涉及到圖程式設計模式、編譯原理,執行優化等技術。

什麼是量化?

量化是指用於執行計算並以低於浮點精度的位寬儲存張量的技術。量化模型對張量使用整數而不是浮點值執行部分或全部運算。 這允許更緊湊的模型表示,並在許多硬體平台上使用高效能向量化操作。與典型的 fp32 型號相比,pytorch 支援 int8 量化,從而可將模型大小減少 4 倍,並將記憶體頻寬要求減少 4 倍。 與 fp32 計算相比,對 int8 計算的硬體支援通常快 2 到 4 倍。 量化主要是一種加速推理的技術,並且量化運算元僅支援前向傳遞。量化能夠在模型精度幾乎不損失的情況下大大降低模型的儲存和時間開銷。

動態量化能夠減少開銷的原因:模型執行時間主要由從記憶體中載入權重而不是計算矩陣乘法來決定

筆者以靜態量化舉例,在本教程結束時,您將看到 pytorch 中的量化如何導致模型大小顯著減小同時提高速度

pytorch 支援每個張量和每個通道非對稱線性量化。 每個張量意味著張量內的所有值都以相同的方式縮放。 每通道意味著對於每個尺寸(通常是張量的通道尺寸),張量中的值都按比例縮放並偏移乙個不同的值(實際上,比例和偏移成為向量)。 這樣可以在將張量轉換為量化值時減少誤差。

通過使用以下命令轉換浮點張量來執行對映

靜態量化:這是最常用的量化形式,其中權重是提前量化的,並且基於觀察校準過程中模型的行為來預先計算啟用張量的比例因子和偏差。 訓練後量化通常是在記憶體頻寬和計算節省都很重要的情況下進行的,而 cnn 是典型的用例。 進行訓練後量化的一般過程是:

準備模型: 通過新增 quantstub 和 dequantstub 模組,指定在何處明確量化啟用和量化數量。 b。 確保不重複使用模組。 c。 將所有需要重新量化的操作轉換為模組

將諸如 conv + relu 或 conv + batchnorm + relu 之類的保險絲操作融合在一起,以提高模型的準確性和效能。

指定'97 量化方法的配置,例如選擇對稱或非對稱量化以及 minmax 或 l2norm 校準技術。

使用torch.quantization.prepare()插入將在校準期間觀察啟用張量的模組

通過對校準資料集進行推斷來校準模型

最後,使用 torch.quantization.convert()方法轉換模型本身。 這可以做幾件事:它量化權重,計算並儲存要在每個啟用張量中使用的比例和偏差值,並替換關鍵運算子的量化實現。

量化感知訓練 pytorch量化備忘錄

將高精度運算轉化到低精度上運算,例如float32轉化為int8資料上運算。那就要說說量化的好處了,一般量化有以下好處 但是其也有一些缺點 雖然量化方法很多,但並無本質區別。記住一點就可以了 將高精度資料對映到低精度表達,在低精度上運算,然後再反量化回去,因為最終的輸出我們還是要高精度的資料的。當然...

tensorflow模型優化 量化

量化的概念 量化 quantitative 這裡不是指金融上的量化交易,而是指離散化。量化是乙個總括術語,是用比 32 位浮點數更少的空間來儲存和執行模型,並且 tensorflow 量化的實現遮蔽了儲存和執行細節。神經網路訓練時要求速度和準確率,訓練通常在 gpu 上進行,所以使用浮點數影響不大。...

MNN量化 ADMM優化演算法

目錄 量化的模型建立 admm演算法 現在我們知道了如何做量化推斷,下一步是如何去建立量化模型,或者說我們應該用乙個什麼樣的方式才能求得量化權重和量化輸入呢?現在已知我們的輸入為fp32,我們想用int8來對原fp32的資料進行表示,其中的轉化關係假設為 fp32和int8值之間的轉化關係 對於每個...