wordpress导航网站,做一个网站成本是多少,安卓手机开发者模式,2021年网络十大关键词更多 TVM 中文文档可访问 →Apache TVM 是一个端到端的深度学习编译框架#xff0c;适用于 CPU、GPU 和各种机器学习加速芯片。 | Apache TVM 中文站
作者#xff1a;Wuwei Lin
本文介绍如何用 TVM 自动量化#xff08;TVM 的一种量化方式#xff09;。有关 TVM 中量化的…更多 TVM 中文文档可访问 →Apache TVM 是一个端到端的深度学习编译框架适用于 CPU、GPU 和各种机器学习加速芯片。 | Apache TVM 中文站
作者Wuwei Lin
本文介绍如何用 TVM 自动量化TVM 的一种量化方式。有关 TVM 中量化的更多详细信息参阅 此处。本教程将在 ImageNet 上导入一个 GluonCV 预训练模型到 Relay量化 Relay 模型然后执行推理。
import tvm
from tvm import te
from tvm import relay
import mxnet as mx
from tvm.contrib.download import download_testdata
from mxnet import gluon
import logging
import osbatch_size 1
model_name resnet18_v1
target cuda
dev tvm.device(target)准备数据集
以下演示如何为量化准备校准数据集首先下载 ImageNet 的验证集并对数据集进行预处理。
calibration_rec download_testdata(http://data.mxnet.io.s3-website-us-west-1.amazonaws.com/data/val_256_q90.rec,val_256_q90.rec,
)def get_val_data(num_workers4):mean_rgb [123.68, 116.779, 103.939]std_rgb [58.393, 57.12, 57.375]def batch_fn(batch):return batch.data[0].asnumpy(), batch.label[0].asnumpy()img_size 299 if model_name inceptionv3 else 224val_data mx.io.ImageRecordIter(path_imgreccalibration_rec,preprocess_threadsnum_workers,shuffleFalse,batch_sizebatch_size,resize256,data_shape(3, img_size, img_size),mean_rmean_rgb[0],mean_gmean_rgb[1],mean_bmean_rgb[2],std_rstd_rgb[0],std_gstd_rgb[1],std_bstd_rgb[2],)return val_data, batch_fn把校准数据集可迭代对象定义为 Python 中的生成器对象本教程仅用几个样本进行校准。
calibration_samples 10def calibrate_dataset():val_data, batch_fn get_val_data()val_data.reset()for i, batch in enumerate(val_data):if i * batch_size calibration_samples:breakdata, _ batch_fn(batch)yield {data: data}导入模型
用 Relay MxNet 前端从 Gluon 模型集合model zoo中导入模型。
def get_model():gluon_model gluon.model_zoo.vision.get_model(model_name, pretrainedTrue)img_size 299 if model_name inceptionv3 else 224data_shape (batch_size, 3, img_size, img_size)mod, params relay.frontend.from_mxnet(gluon_model, {data: data_shape})return mod, params量化模型
量化过程要找到每一层的每个权重和中间特征图feature map张量的 scale。
对于权重而言scales 是根据权重的值直接计算出来的。支持两种模式power2 和 max。这两种模式都是先找到权重张量内的最大值。在 power2 模式下最大值向下舍入为 2 的幂。如果权重和中间特征图的 scale 都是 2 的幂则可以利用移位bit shifting进行乘法运算这使得计算效率更高。在 max 模式下最大值用作 scale。如果不进行四舍五入在某些情况下 max 模式可能具有更好的精度。当 scale 不是 2 的幂时将使用定点乘法。
中间特征图可以通过数据感知量化来找到 scale。数据感知量化将校准数据集作为输入参数通过最小化量化前后激活分布之间的 KL 散度来计算 scales。或者也可以用预定义的全局 scales这样可以节省校准时间但会影响准确性。
def quantize(mod, params, data_aware):if data_aware:with relay.quantize.qconfig(calibrate_modekl_divergence, weight_scalemax):mod relay.quantize.quantize(mod, params, datasetcalibrate_dataset())else:with relay.quantize.qconfig(calibrate_modeglobal_scale, global_scale8.0):mod relay.quantize.quantize(mod, params)return mod运行推理
创建一个 Relay VM 来构建和执行模型。
def run_inference(mod):model relay.create_executor(vm, mod, dev, target).evaluate()val_data, batch_fn get_val_data()for i, batch in enumerate(val_data):data, label batch_fn(batch)prediction model(data)if i 10: # 本教程只对几个样本进行推理breakdef main():mod, params get_model()mod quantize(mod, params, data_awareTrue)run_inference(mod)if __name__ __main__:main()输出结果
/workspace/python/tvm/driver/build_module.py:268: UserWarning: target_host parameter is going to be deprecated. Please pass in tvm.target.Target(target, hosttarget_host) instead.target_host parameter is going to be deprecated.
/workspace/python/tvm/relay/build_module.py:411: DeprecationWarning: Please use input parameter mod (tvm.IRModule) instead of deprecated parameter mod (tvm.relay.function.Function)DeprecationWarning,脚本总运行时长 1 分 22.338 秒
下载 Python 源代码deploy_quantized.py
下载 Jupyter Notebookdeploy_quantized.ipynb