INT4量化模型原理

 ✒️ @halomaster 📅 05 Apr 2023, 13:43 GMT⋮ 【AI】 

INT4量化是一种神经网络模型的压缩技术,旨在减小模型所需的内存和计算资源。该方法将网络的浮点权重和激活值转换为仅有4位的整数(即-8到+7的整数),从而降低了存储和计算成本。 INT4量化的原理如下: 首先,将浮点类型的权重值和`激活值`通过一个量化操作转换为整数。对于权重值,这个量化操作可以通过对权重进行`最小二乘`近似来得到一个合适的量化间隔。对于`激活值`,可以根据在训练数据集上统计得到的`激活值`分布来选择合适的量化间隔大小。然后,在网络的每个卷积或全连接层的计算过程中,使用量化后的整数作为权重和激活值,并且在每层结束进行反量化以还原精度。反量化也使用最小二乘近似或者极大似然估计等方法根据量化间隔进行实现。同时,还可以使用剪枝技术去除小于某个阈值的权重,进一步减小模型的大小。 INT4量化的优点在于可以极大地减少模型的计算和存储开销,因此可以在边缘设备上实现高效的模型推断,同时还能避免使用大量存储和计算资源的负担。然而,由于将浮点值转换为整数会丢失一些信息,因此INT4量化可能会导致模型准确率的下降。因此,在使用INT4量化时需要在准确率和性能之间进行平衡,需要通过实验来调整量化间隔等参数,以获得最佳结果。


[1] @halomaster • 05 Apr 2023, 13:44 GMT 
CUDA支持INT4运算。NVIDIA CUDA Toolkit 12.1可以实现INT4计算,用户可以从官网下载并使用该软件包。


[2] @halomaster • 09 Apr 2023, 17:04 GMT 
在PyTorch框架中进行INT4量化,可以使用PyTorch提供的量化神经网络(QNN)模块。 首先,需要定义一个QNN模型,并选择量化参数。在这里,我们选择INT4量化: ``` import torch.nn as nn import torch.quantization as quant # 定义一个QNN模型 class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1) self.relu1 = nn.ReLU() self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2) self.quant = quant.QuantStub() def forward(self, x): x = self.conv1(x) x = self.relu1(x) x = self.pool1(x) x = self.quant(x) return x # 选择INT4量化参数 qconfig = quant.QConfig(activation=quant.MinMaxObserver.with_args(dtype=torch.quint4), weight=quant.per_channel_weight_observer(qengine="qnnpack")) ``` 接着,需要将模型和数据量化为INT4格式: ``` # 实例化QNN模型 model = MyModel() # 将模型和数据量化为INT4格式 model.qconfig = qconfig model_int4 = quant.quantize_dynamic(model, dtype=torch.quint4) data_int4 = quant.convert(data, dtype=torch.quint4) # 执行INT4量化模型推理 with torch.no_grad(): output_int4 = model_int4(data_int4) ``` 最后,可以将量化模型导出为ONNX格式,以便在其他框架中使用: ``` # 将INT4量化模型导出为ONNX格式 torch.onnx.export(model_int4, data_int4, "model_int4.onnx", input_names=["input"], output_names=["output"]) ``` 注意,在使用QNN模块进行INT4量化时,需要注意以下几点: 1. 选择合适的量化参数和观察器,以确保量化后的模型精度和性能。 2. 对模型进行量化前,需要执行训练和微调等操作,以提高模型的精度和鲁棒性。 3. 在执行INT4量化模型推理时,需要确保硬件或软件平台支持INT4数据类型。


[3] @halomaster • 09 Apr 2023, 17:10 GMT 
在PyTorch框架中进行INT4量化需要对模型进行量化感知训练(Quantization Aware Training, QAT)。PyTorch在0.3版以后提供了量化功能,但目前主要支持INT8量化。因此,要实现INT4量化,需要在PyTorch的基础上进行一些定制。 以下是一个简单的步骤来进行INT4量化: 1. **准备数据和模型** 在开始量化过程之前,请确保您已经准备好了数据集和训练好的模型。如果您还没有训练好的模型,可以先使用常规的方法进行训练。 2. **安装PyTorch** 为了使用PyTorch的量化功能,请确保您安装的PyTorch版本至少为0.3。您可以使用以下命令更新PyTorch: ``` pip install --upgrade torch torchvision ``` 3. **修改量化设置** PyTorch默认支持INT8量化,要实现INT4量化,需要在PyTorch源码中修改一些设置。找到`torch/quantization/quantize.py`文件,在`QuantStub`和`DeQuantStub`类中修改量化位数。例如,将量化位数从8位更改为4位: ```python class QuantStub(nn.Module): def __init__(self): super(QuantStub, self).__init__() self.qconfig = QConfig(activation=MinMaxObserver.with_args(dtype=torch.qint4)) class DeQuantStub(nn.Module): def __init__(self): super(DeQuantStub, self).__init__() self.qconfig = QConfig(activation=MinMaxObserver.with_args(dtype=torch.qint4)) ``` 4. **进行量化感知训练** 使用量化感知训练对模型进行微调。在训练过程中,为模型添加`QuantStub`和`DeQuantStub`。例如: ```python import torch import torch.quantization as quantization # 加载预训练好的模型 model = MyModel() model.load_state_dict(torch.load("model_weights.pth")) # 准备进行量化感知训练的模型 model.qconfig = torch.quantization.get_default_qconfig("fbgemm") model_prepared = quantization.prepare_qat(model) ``` 5. **微调量化感知训练** 使用与原始训练相同的优化器和损失函数进行量化感知训练微调。在训练过程中,使用`QuantStub`和`DeQuantStub`。例如: ```python optimizer = torch.optim.SGD(model_prepared.parameters(), lr=0.01) criterion = nn.CrossEntropyLoss() for epoch in range(num_epochs): for batch in train_loader: inputs, labels = batch optimizer.zero_grad() # 前向传播 outputs = model_prepared(inputs) loss = criterion(outputs, labels) # 反向传播 loss.backward() optimizer.step() ``` 6. **转换为量化模型** 使用`convert`函数将微调后的模型转换为量化模型。例如: ```python model_quantized = quantization.convert(model_prepared, inplace=False) ``` 7. **保存和加载量化模型** 保存量化模型: ```python torch.save(model_quantized.state_dict(), "model_quantized.pth") ``` 加载量化模型: ```python model_quantized = MyModel() model_quantized.load_state_dict(torch.load("model_quantized.pth")) ```


[4] @halomaster • 09 Apr 2023, 17:13 GMT 
PyTorch的[`torch.quantization`](https://pytorch.org/docs/stable/quantization.html)模块提供了一系列工具,可以帮助你量化模型,以及使用INT4量化进行前向和反向传播。


1 of 1 pages  4 replies