PyTorch的可微分量化框架。
项目描述
通过伪量化噪声进行可微分模型压缩
DiffQ使用伪量化噪声执行可微分量化。它可以自动调整每个权重或权重组使用的位数,以达到在模型大小和准确性之间的特定权衡。
阅读我们的论文以获取更多详细信息。
发生了什么?
查看变更日志以获取关于发布的详细信息。
- 2022-08-24: v0.2.3: 修复了加载旧量化状态时的错误。
- 2021-11-25: 版本 0.2.2: 增加了torchscript的支持。
需求
DiffQ需要Python 3.7,以及一个合理近期的PyTorch版本(理想情况下为1.7.1)。要安装DiffQ,您可以从存储库的根目录运行
pip install .
您也可以通过pip install diffq
直接从PyPI安装。
用法
import torch
from torch.nn import functional as F
import diffq
from diffq import DiffQuantizer
model = MyModel()
optim = ... # The optimizer must be created before the quantizer
quantizer = DiffQuantizer(model)
quantizer.setup_optimizer(optim)
# Distributed data parallel must be created after DiffQuantizer!
dmodel = torch.distributed.DistributedDataParallel(...)
penalty = 1e-3
model.train() # call model.eval() on eval to automatically use true quantized weights.
for batch in loader:
...
optim.zero_grad()
# The `penalty` parameter here will control the tradeoff between model size and model accuracy.
loss = F.mse_loss(x, y) + penalty * quantizer.model_size()
optim.step()
# To get the true model size with when doing proper bit packing.
print(f"Model is {quantizer.true_model_size():.1f} MB")
# When you want to dump your final model:
torch.save(quantizer.get_quantized_state(), "some_file.th")
# You can later load back the model with
model = MyModel()
diffq.restore_quantized_state(model, torch.load("some_file.th"))
# For DiffQ models, we support exporting the model to Torscript with optimal storage.
# Once loaded, the model will be stored in fp32 in memory (int8 support coming up).
from diffq.ts_export import export
export(quantizer, 'quantized.ts')
文档
请参阅API文档以获取详细文档。以下将介绍一些方面。
量化器对象
量化器在其创建时附加到模型上。所有量化器对象都提供相同的基本功能
- 如果模型处于评估模式,则自动切换到量化权重。
- 在训练正向过程中提供特定的量化器代码(例如,对于使用QAT的UniformQuantizer的STE,DiffQ的噪声注入)。
- 提供对量化模型大小和状态访问。
量化大小和状态
方法quantizer.model_size()
提供可微模型大小(对于DiffQ),而quantizer.true_model_size()
提供真实、最优的位打包模型大小(不可微)。使用quantizer.compressed_model_size()
,您可以使用gzip
获取模型大小。这实际上可能大于真实模型大小,并揭示了关于特定量化方法熵使用的有趣信息。
通过 quantizer.get_quantized_state()
获取位打包的量化状态,并通过 quantizer.restore_quantized_state()
恢复。位打包针对速度进行了优化,可能会产生一些开销(实际中均匀和LSQ不会超过120B,DiffQ不会超过1KB)。
如果您无法访问原始量化器,例如在推理时,可以使用 diffq.restore_quantized_state(model, quantized_state)
加载状态。
量化器和优化
某些量化器会添加额外的可优化参数(DiffQuantizer和LSQ)。这些参数可能需要与主模型权重不同的优化器或超参数。通常,DiffQ位参数始终使用Adam进行优化。因此,您应该始终在量化器之前创建主优化器。然后,您可以使用此优化器或其他优化器设置量化器。
model = MyModel(...)
opt = torch.optim.Adam(model.parameters())
quantizer = diffq.DiffQuantizer(model)
quantizer.setup_optimizer(opt, **optim_overrides)
这提供了使用单独超参数的自由。例如,DiffQuantizer
总是禁用位参数的 weight_decay。
如果主优化器是SGD,建议为量化器使用第二个Adam优化器。
注意:您必须在创建量化器后始终用 DistributedDataParallel
包装您的模型,否则量化器参数不会被优化!
TorchScript 支持
目前,TorchScript 支持是实验性的。我们支持将模型以最佳存储方式保存到磁盘上的TorchScript。一旦加载,模型将存储在内存中的FP32。我们正在努力添加对内存中int8的支持。请参阅API中的 diffq.ts_export.export
函数。
示例
我们在 examples/
文件夹中提供了三个示例。一个用于CIFAR-10/100,使用标准架构,如Wide-ResNet、ResNet或MobileNet。第二个基于 DeiT 视觉变换器。第三个是在Wikitext-103上的语言建模任务,使用 Fairseq。
DeiT和Fairseq示例作为原始代码库中特定提交的补丁提供。您可以初始化git子模块并运行以下命令应用补丁:
make examples
有关每个示例的更多详细信息,请查看它们的特定README。
开发安装
这将安装依赖项和开发者模式下的 diffq
(文件更改将直接反映),以及运行单元测试的依赖项。
pip install -e '.[dev]'
更新基于补丁的示例
要更新补丁,首先运行 make examples
正确初始化子仓库。然后执行所有您想要的更改,提交它们并运行 make patches
。这将更新每个仓库的补丁。一旦完成,并确认您所做的所有更改都已正确包含在新的补丁文件中,您可以在运行 git add -u .; git commit -m "my changes"
和推送之前运行 make reset
(这将从子模块中删除您所做的所有更改,因此在调用此命令之前请检查补丁文件)。
测试
您可以使用以下命令运行单元测试:
make tests
引用
如果您在论文中使用此代码或结果,请引用我们的工作如下:
@article{defossez2021differentiable,
title={Differentiable Model Compression via Pseudo Quantization Noise},
author={D{\'e}fossez, Alexandre and Adi, Yossi and Synnaeve, Gabriel},
journal={TMLR},
year={2022}
}
许可
此存储库根据CC-BY-NC 4.0许可证发布,如LICENSE文件中所示,以下部分除外,该部分根据MIT许可证发布。文件 examples/cifar/src/mobilenet.py
和 examples/cifar/src/resnet.py
来自 kuangliu/pytorch-cifar,以MIT许可证发布。文件 examples/cifar/src/wide_resnet.py
来自 meliketoy/wide-resnet,以MIT许可证发布。请参阅每个文件的头部以获取详细许可证信息。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源代码分发
构建分发
diffq-0.2.4.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 049064861e974ebf00d0badab8b324c775037371419eda3150985b9d477b5bd2 |
|
MD5 | a8994cc44b9310abf3cbd12a369add3b |
|
BLAKE2b-256 | 5afd4c58807bf855c5929ffa6da55f26dd6b9ae462a4193f5e09cc49fbbfd451 |
diffq-0.2.4-cp310-cp310-win_amd64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3467622841b15ece3d953fa42ad65f41703afe30e777bb910b96c89125174c8e |
|
MD5 | 470b93a2d6b4e94426c787aa3302568b |
|
BLAKE2b-256 | ac9a60beef2ec7718daf4291064b7ae6e01e19496d6c8ade0002ba675cd67322 |
哈希值 用于 diffq-0.2.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 71a374573ec064227665208a5892d88032cb18736f68560d5522e0c48138ced1 |
|
MD5 | edd1d4f7d5cdf6573c8a0f978a708840 |
|
BLAKE2b-256 | 0e3b5ab58fda751ea353aa606260d78a9b58352aebf53d3a69183c593d14cd6d |
哈希值 用于 diffq-0.2.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d62ffd89498611dbf32cde417f5fc8d222f450085b06afb4e8764307906ab2ca |
|
MD5 | 7e90fac73aba32638d44d6cdc80d47c4 |
|
BLAKE2b-256 | c95709ee34fd5756b5ebf96c63bcd82f4fabab4f1a95a350e491c1c8f92fdaad |
哈希值 用于 diffq-0.2.4-cp310-cp310-macosx_11_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | cf990911fc2c932e505df9958ce50417f182fe9178b2dbe329173b29e6521727 |
|
MD5 | 0268ed191ed6dabb7ba77505b30dbd06 |
|
BLAKE2b-256 | 4f45b6d26c9d4c64c1f6481fa8a85b9920951349a786bcfa2615241387a118dc |
哈希值 用于 diffq-0.2.4-cp310-cp310-macosx_10_9_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 15d5055ebfc629914689d66fcfa36f6d751fd45b4b2331ba0d3390604e2b40fa |
|
MD5 | e21b0582b3bed3b136d65ccf34be47f8 |
|
BLAKE2b-256 | 992183da39abd8080e4aa5d211c6d17c3eb1b7e6e90b35bf98394ed648c5a039 |
哈希值 用于 diffq-0.2.4-cp310-cp310-macosx_10_9_universal2.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3d8e6d6b882dd93568b41a7da9ff9657845ec08c82e71460544d0d04ed112320 |
|
MD5 | d1f358c026cd8e743d1b94abbea72523 |
|
BLAKE2b-256 | b329592009a585a22f6313e2950b38173975c2be979b18fe4454679f67102cb8 |
哈希值 用于 diffq-0.2.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a5fc5cf4967d7cea065e75d2044824137ad08f1ccf7571d871cbf03bcf8809bd |
|
MD5 | ead1288beecbe994429123aee3ccbda1 |
|
BLAKE2b-256 | 8045ff8b779e9aeb653861fff9fceb65690a1b7e5c025d40cd930912731a65f7 |
哈希值 用于 diffq-0.2.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 02268472f1646cafe4fb3feaad9ac519f7e65d617871a58b56e71bc552fc8fb3 |
|
MD5 | 98e509792b3624aceba45339fbf28a53 |
|
BLAKE2b-256 | 4f76857ec5bc72d035a69189a629624c0a04adebefbf39c0c30fa3c2dafeea76 |
哈希值 用于 diffq-0.2.4-cp39-cp39-macosx_10_9_universal2.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 967a30e3a9da922d8705c3dbf44bb82d5b76a3ad49ecaa4c9450d97479fe8a31 |
|
MD5 | 7c0179a59e5ca42259232dc4a68da461 |
|
BLAKE2b-256 | cb2366b56a6ec679a24e8449368688674a6752a45962d93add1c7ff770574536 |
哈希值 用于 diffq-0.2.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0381dedef3b88b4910eedfd894610ecac9affd689c2191c96694b70b3366dd27 |
|
MD5 | 81c5a14a3ea671c78c4bb4cc358ceb9c |
|
BLAKE2b-256 | 1e0a6151b12a53f7278eb0da3befcee0b9e0aa7bef2cbd7e7d14a7c76d526f75 |
哈希值 用于 diffq-0.2.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0b0cf50749d1a80fb74ee9e5135e08f06b519ab57f5b725bb374b2866412b725 |
|
MD5 | 11ed46063259dcaa4ebc78b33b8a15c1 |
|
BLAKE2b-256 | 7f24a3b46b2a3b764ea1680a7d0eadbbb3326a86de153e167a0a4043b40d71b0 |
哈希值 用于 diffq-0.2.4-cp38-cp38-macosx_10_9_universal2.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | de84917882a3def0d71548e5366813f7e25a7b110d2085fe0b0fa4c9877f5098 |
|
MD5 | 8f4b1f26de5db342e7f96480c75cc425 |
|
BLAKE2b-256 | b0baaf32f0228b14a72458b25280dec04b03655491132e8604afca9a9f6929c8 |
哈希值 用于 diffq-0.2.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d6779a81fcb8045d006a5f309c52a34e48fefb73db99232b4b1452a8829c083c |
|
MD5 | 5d30f77a3f2c056bb5e27fcf0fcd21d7 |
|
BLAKE2b-256 | 5156b5e9725cba5d3e3c45ed7cd35e3f330413268159b592d3cae3bb45d2971c |
哈希值 用于 diffq-0.2.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0729231949ec74641709ad9b713ba127898735ba20ec8f44677d984d2ce1c3b9 |
|
MD5 | 783d41888c3d2893e00c8b6cbd5ce9a6 |
|
BLAKE2b-256 | c4708581f5748e958b6c25d75a86def24e983dcdeb46c39775ff6d7fdcb9fd0f |
哈希值 用于 diffq-0.2.4-cp37-cp37m-macosx_10_9_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3aef094383d39e12508ddf61c45a377986b2d4bac26ee553b6504fee10e2ff9d |
|
MD5 | c304b83673c23010b8b4d2a3b7f473b5 |
|
BLAKE2b-256 | 2aeb7b8055f85850771211126ceb4c23e835f5d56f5d171a1ee88eb20500289d |