定點化和模型量化(三)

量化解決的是訓練使用的浮點和運行使用的硬件只支持定點的矛盾。這里介紹一些實際量化中使用到的工具。

SNPE簡介

The Snapdragon Neural Processing Engine (SNPE)是高通驍龍為了加速網絡模型設計的框架。但它不只支持高通,SNPE還支持多種硬件平臺,ARM平臺、Intel平臺等。支持的深度學習框架也有包括Caffe、TensorFlow和ONNX等。

SNPE可以前向運行模型,但需要先將模型轉換為Deep Learning Container (DLC) file才可以加載進SNPE中。

CPU支持支持雙精度浮點和8位量化的模型,GPU支持混合精度或者單精度浮點,數字信號處理器DSP就只支持支持8位整形。DLC進一步進行8bit量化才可以運行在Qualcomm?Hexagon?DSP上。

下圖是典型的workflow:

?

上圖的上半部分是我們熟悉的模型浮點訓練,當模型效果達到預期之后,模型參數固定下來,然后轉換成dlc,dlc再經過壓縮,量化等操作,最后運行在SNPE中。

SNPE安裝及命令

下載SNPE壓縮包,版本號與高通芯片有關,主流是2.13,還有2.17,2.22等。在壓縮包的docs文件夾里面有官方html文檔。

source ./bin/envsetup.sh,激活snpe環境。sh ,bash ,./,?source的作用都是執行腳本。然后就可以在終端中調用snpe指令了:

轉換dlc

以TensorFlow 為例,模型文件可以是pb file或者checkpoint+meta,調用SNPE轉換指令時給定模型路徑和輸入尺寸,最后一層節點名字,就可以得到dlc文件:

snpe-tensorflow-to-dlc --input_network $SNPE_ROOT/models/inception_v3/tensorflow/inception_v3_2016_08_28_frozen.pb \--input_dim input "1,299,299,3" --out_node "InceptionV3/Predictions/Reshape_1" \--output_path inception_v3.dlc

如果是pytorch框架得到的模型,使用snpe-pytorch-to-dlc,serialized PyTorch model into a SNPE DLC file。

更一般地,不管什么框架,都可以先將模型轉換為onnx格式。ONNX(Open Neural Network Exchange)是一種開放式的文件格式,專為機器學習設計,用于存儲訓練好的模型。它使得不同的深度學習框架(如Pytorch,MXNet)可以采用相同格式存儲模型數據。onnx轉dlc使用命令snpe-onnx-to-dlc。

解析dlc:

snpe-dlc-info -i ./xxxx.dlc

dlc量化:snpe-dlc-quantize。

[ --input_dlc=<val> ]Path to the dlc container containing the model for which fixed-point encodingmetadata should be generated. This argument is required.[ --input_list=<val> ]Path to a file specifying the trial inputs. This file should be a plain text file,containing one or more absolute file paths per line. These files will be taken to constitutethe trial set. Each path is expected to point to a binary file containing one trial inputin the 'raw' format, ready to be consumed by SNPE without any further modifications.This is similar to how input is provided to snpe-net-run 
application.
[ --enable_htp ]      Pack HTP information in quantized DLC.

Snapdragon Neural Processing Engine SDK: Tools

run on linux

cd $SNPE_ROOT/models/alexnet
snpe-net-run --container dlc/bvlc_alexnet.dlc --input_list data/cropped/raw_list.txt

run on android target

推lib下面對應架構的所有so

推lib/dsp下面的so

推bin里面的snpe-net-run

AIMET簡介

剛才提到的量化其實是后量化,要想實現量化感知訓練QAT,需要使用AIMET(AI Model Efficiency Toolkit),AIMET也是高通提高的工具,可以實現量化和壓縮。

AIMET是一個庫,可以對訓練好的模型進行量化和壓縮,從而在保證精度損失最小的情況下縮短運行時間,減輕內存壓力。

?

雖然是在訓練過后再使用AIMET,但它不是簡單地轉化為dlc,而是也有一個訓練的過程,這個過程盡量縮小與浮點模型的誤差。

AIMET實例

PTQ

參考github上面的文檔。AIMET PyTorch AutoQuant API — AI Model Efficiency Toolkit Documentation: ver tf-torch-cpu_1.31.0

即便是后量化也有很多方法組合,需要一些專業的分析。AIMET 提供了AutoQuant 這樣的接口,可以自動分析模型,選擇最合適的后量化方法。用戶只需要指明能接受的精度損失就可以了。

核心是實例化一個AutoQuant類:

auto_quant = AutoQuant(model,                        # Load a pretrained FP32 modeldummy_input=dummy_input,      # dummy_input 是一個隨機數組,只要維度符合輸入就行。data_loader=unlabeled_imagenet_data_loader, eval_callback=eval_callback)  # 統計準確率
使用默認值初始化后開始量化:
auto_quant.set_adaround_params(adaround_params)
model, optimized_accuracy, encoding_path = auto_quant.optimize(allowed_accuracy_drop=0.01)
print(f"- Quantized Accuracy (after optimization):  {optimized_accuracy}")

注意,auto_quant.optimize會返回三個值,分別是model,精度,和encoding path。encoding path以類似json的格式記錄了每一層的名稱,位寬,最大值最小值,offset,scale,還有是否是symmertic。

這里的offset,scale應該就對應上一篇量化中提到的step和zero point。

QAT

參考文檔。AIMET PyTorch Quantization SIM API — AI Model Efficiency Toolkit Documentation: ver tf-torch-cpu_1.31.0

關鍵是構建QuantizationSimModel:

sim = QuantizationSimModel(model=model,quant_scheme=QuantScheme.post_training_tf_enhanced,dummy_input=dummy_input,default_output_bw=8,  # activation quantizations的bitwidthdefault_param_bw=8)   # parameter  quantizations的bitwidth

真正的QAT也只用一行代碼完成:

ImageNetDataPipeline.finetune(sim.model, epochs=1, learning_rate=5e-7, learning_rate_schedule=[5, 10], use_cuda=use_cuda)

也可以把sim當成一個正常的模型,然后使用常規的torch的梯度更新的訓練方法進行訓練。

reference:

基于CentOS更新 glibc - 解決 `GLIBC_2.29‘ not found-CSDN博客

MVision/CNN/Deep_Compression/quantization at master · Ewenwan/MVision · GitHub

模型量化了解一下? - 知乎

Snapdragon Neural Processing Engine SDK: Features Overview

Tensorflow模型量化(Quantization)原理及其實現方法 - 知乎

GitHub - quic/aimet: AIMET is a library that provides advanced quantization and compression techniques for trained neural network models.AI Model Efficiency ToolkitGitHub - quic/aimet: AIMET is a library that provides advanced quantization and compression techniques for trained neural network models.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19303.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19303.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Beego 使用教程 8:Session 和 Cookie

beego 是一個用于Go編程語言的開源、高性能的 web 框架 beego 被用于在Go語言中企業應用程序的快速開發&#xff0c;包括RESTful API、web應用程序和后端服務。它的靈感來源于Tornado&#xff0c; Sinatra 和 Flask beego 官網&#xff1a;http://beego.gocn.vip/ 上面的 be…

抄表營收系統是什么?

1.抄表營收系統的概念和功能 抄表營收系統是一種自動化軟件&#xff0c;主要運用于公用事業公司(如電力工程、水、天然氣等)管理方法其服務的計量檢定、計費和收付款全過程。該系統根據集成化智能儀表、遠程控制數據收集和分析功能&#xff0c;提高了效率&#xff0c;降低了人…

(十)Python3 接口自動化測試,測試結果發送郵件

(十)Python3 接口自動化測試,測試結果發送郵件 1.前言 Windows本地執行的話,可自行編寫發送郵件方法發送郵件。 Jenkins執行的話,可用jenkins配套郵件發送郵件。 2.發送郵件示例 # -*- coding: utf-8 -*- # 主程序 import sys sys.path.append(./server) sys.path.appe…

人臉識別——探索戴口罩對人臉識別算法的影響

1. 概述 人臉識別是一種機器學習技術&#xff0c;廣泛應用于各種領域&#xff0c;包括出入境管制、電子設備安全登錄、社區監控、學校考勤管理、工作場所考勤管理和刑事調查。然而&#xff0c;當 COVID-19 引發全球大流行時&#xff0c;戴口罩就成了日常生活中的必需品。廣泛使…

反射機制大揭秘-進階Java技巧,直擊核心!

反射在Java中扮演著重要的角色&#xff0c;掌握了反射&#xff0c;就等于掌握了框架設計的鑰匙。本文將為您逐步講解反射的基本概念、獲取Class對象的三種方式、使用反射實例化對象并操作屬性和方法&#xff0c;還有解析包的相關內容。跟隨我一起探索反射的奧秘&#xff0c;提升…

使用 Ubuntu + Docker + Vaultwarden + Tailscale 自建密碼管理器

使用 Ubuntu Docker Vaultwarden Tailscale 自建密碼管理器 先決條件 一臺運行 Ubuntu 系統的服務器。可以是云提供商的 VPS、家庭網絡中的樹莓派、或者 Windows 電腦上的虛擬機等等 一個 Tailscale 賬戶。如果還沒有 Tailscale 賬戶&#xff0c;可以通過此鏈接迅速創建一個…

SelfKG論文翻譯

SelfKG: Self-Supervised Entity Alignment in Knowledge Graphs SelfKG&#xff1a;知識圖中的自監督實體對齊 ABSTRACT 實體對齊旨在識別不同知識圖譜&#xff08;KG&#xff09;中的等效實體&#xff0c;是構建網絡規模知識圖譜的基本問題。在其發展過程中&#xff0c;標…

華納云:MAC電腦怎么遠程連接Windows服務器桌面?

在Mac電腦上遠程連接Windows服務器桌面可以通過多種方式實現&#xff0c;最常用的方法是使用微軟提供的免費應用程序 "Microsoft Remote Desktop"。以下是詳細的步驟來設置和使用該工具&#xff1a; 步驟一&#xff1a;下載和安裝 Microsoft Remote Desktop 打開App …

SpringBoot的自動裝配

我們今天再來說一下關于 SpringBoot 的自動裝配&#xff0c;為什么會有這樣的問題呢&#xff1f;一般這種情況都是在面試的過程中&#xff0c;面試官有時候會問到這個問題&#xff0c;就比如從開始問SpringBoot 的一些常用注解&#xff0c;到SpringBoot的一些特性&#xff0c;然…

zynq之UART

之前嘗試UART0&#xff08;MIO50、51&#xff09;&#xff0c;串口調試助手收到發送的內容。 現在板子上EMIO端有多個串口&#xff0c;所以看看這個怎么弄。 串口是484的轉接板&#xff08;接232的串口就會輸出亂碼&#xff09; https://blog.51cto.com/u_15262460/2882973 …

【九十三】【算法分析與設計】719. 找出第 K 小的數對距離,N 臺電腦的最長時間,二分答案法

719. 找出第 K 小的數對距離 - 力扣&#xff08;LeetCode&#xff09; 數對 (a,b) 由整數 a 和 b 組成&#xff0c;其數對距離定義為 a 和 b 的絕對差值。 給你一個整數數組 nums 和一個整數 k &#xff0c;數對由 nums[i] 和 nums[j] 組成且滿足 0 < i < j < nums.le…

java調用遠程接口下載文件

在postman中這樣下載文件 有時下載文件太大postman會閃退&#xff0c;可以通過代碼下載&#xff0c;使用hutool的http包

3步操作助您輕松實現蘋果手機照片一鍵傳輸至電腦

對于很多使用蘋果手機的用戶來說&#xff0c;隨著手機中照片和視頻數量的不斷積累&#xff0c;如何將這些珍貴的回憶從手機轉移到電腦&#xff0c;以便更好地保存、整理和分享&#xff0c;成為了一個值得關注的問題。那么&#xff0c;蘋果手機怎么把照片導入電腦呢&#xff1f;…

鴻蒙課程培訓 | 訊方技術與鴻蒙生態服務公司簽約,成為鴻蒙鉆石服務商

3月15日&#xff0c;深圳市訊方技術股份有限公司與鴻蒙生態服務公司簽署合作協議&#xff0c;訊方技術成為鴻蒙鉆石服務商&#xff0c;正式進軍鴻蒙原生應用培訓開發領域。訊方技術總裁劉國鋒、副總經理劉銘皓、深圳區域總經理張松柏、深圳區域交付總監張梁出席簽約儀式。 作…

鄉村振興的鄉村產業創新發展:培育鄉村新興產業,打造鄉村產業新名片,促進鄉村經濟多元化發展

目錄 一、引言 二、鄉村產業創新發展的必要性 &#xff08;一&#xff09;適應新時代發展要求 &#xff08;二&#xff09;滿足消費升級需求 &#xff08;三&#xff09;促進農民增收致富 三、培育鄉村新興產業策略 &#xff08;一&#xff09;加強科技創新引領 &#…

在 MFC 中 UNICODE 加 _T 與 L 長字符串,有什么區別?

在MFC&#xff08;Microsoft Foundation Classes&#xff09;和更廣泛的Windows編程環境中&#xff0c;UNICODE宏用于指示程序應使用Unicode字符集&#xff08;通常是UTF-16&#xff09;來處理文本。當定義了UNICODE宏時&#xff0c;編譯器和庫函數會期待和處理寬字符&#xff…

Android下HWC以及drm_hwcomposer普法((上)

Android下HWC以及drm_hwcomposer普法((上) 引言 按摩得全套&#xff0c;錯了&#xff0c;做事情得全套&#xff0c;普法分析也是如此。drm_hwcomposer如果對Android圖形棧有一定研究的童鞋們應該知道它是Android提供的一個的圖形后端合成處理HAL模塊的實現。但是在分析這個之前…

Java復習-集合篇

集合 集合分為倆大類 單列集合 每個元素數據只包含一個值 雙列集合 每個元素包含倆個鍵值對 Conllection單列集合 單列集合常用的主要是下列幾種 List集合 List系列集合的特點&#xff1a;添加元素是有序、可重復、有索引 這里我們來試一下ArrayList ArrayList<String&g…

Spring OAuth2:開發者的安全盾牌!(上)

何利用Spring OAuth2構建堅不可摧的安全體系&#xff1f;如何使用 OAuth2 從跨域挑戰到性能優化&#xff0c;每一個環節都為你的應用保駕護航&#xff1f; 文章目錄 Spring OAuth2 詳解1. 引言簡述OAuth2協議的重要性Spring Framework對OAuth2的支持概述 2. 背景介紹2.1 OAuth2…

比較Rust和Haskel

在比較Rust和Haskell時&#xff0c;我們可以從多個維度來分析它們各自的優勢。以下是Rust相對于Haskell的優勢&#xff0c;以及Haskell相對于Rust的優勢&#xff1a; Rust比Haskell強的方面&#xff1a; 內存安全與并發性&#xff1a; Rust通過獨特的所有權系統和借用檢查器在…