Skip to main content

Differentiable quantization framework for PyTorch.

Project description

Differentiable Model Compression via Pseudo Quantization Noise

linter badge tests badge cov badge

DiffQ performs differentiable quantization using pseudo quantization noise. It can automatically tune the number of bits used per weight or group of weights, in order to achieve a given trade-off between model size and accuracy.

Go read our paper for more details.

What's up?

See the changelog for details on releases.

  • 2022-08-24: v0.2.3: fixed a bug when loading old quantized states.
  • 2021-11-25: version 0.2.2: adding support for torchscript.

Requirements

DiffQ requires Python 3.7, and a reasonably recent version of PyTorch (1.7.1 ideally). To install DiffQ, you can run from the root of the repository:

pip install .

You can also install directly from PyPI with pip install diffq.

Usage

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')

Documentation

See the API documentation for detailed documentation. We cover hereafter a few aspects.

Quantizer object

A Quantizer is attached to a model at its creation. All Quantizer objects provide the same basic capabilities:

  • automatically switches to quantized weights on the forward if the model is in eval mode.
  • quantizer-specific code on training forward (e.g. STE for UniformQuantizer with QAT, noise injection for DiffQ).
  • provide access to the quantized model size and state.

Quantized size and state

The method quantizer.model_size() provide a differentiable model size (for DiffQ), while quantizer.true_model_size() provide the true, optimally bit-packed, model size (non differentiable). With quantizer.compressed_model_size() you can get the model size using gzip. This can actually be larger than the true model size, and reveals interesting information on the entropy usage of a specific quantization method.

The bit-packed quantized state is obtained with quantizer.get_quantized_state() , and restored with quantizer.restore_quantized_state(). Bit packing is optimized for speed and can suffer from some overhead (in practice no more than 120B for Uniform and LSQ, and not more than 1kB for DiffQ).

If you do not have access to the original quantizer, for instance at inference time, you can load the state with diffq.restore_quantized_state(model, quantized_state).

Quantizer and optimization

Some quantizer will add extra optimizable parameters (DiffQuantizer and LSQ). Those parameters can require different optimizers or hyper-parameters than the main model weights. Typically, DiffQ bits parameters are always optimized with Adam. For that reason, you should always create the main optimizer before the quantizer. You can then setup the quantizer with this optimizer or another:

model = MyModel(...)
opt = torch.optim.Adam(model.parameters())
quantizer = diffq.DiffQuantizer(model)
quantizer.setup_optimizer(opt, **optim_overrides)

This offers the freedom to use a separate hyper-params. For instance, DiffQuantizer will always deactivate weight_decay for the bits parameters.

If the main optimizer is SGD, it is advised to have a second Adam optimizer for the quantizer.

Warning: you must always wrap your model with DistributedDataParallel after having created the quantizer, otherwise the quantizer parameters won't be optimized!

TorchScript support

At the moment the TorchScript support is experimental. We support saving the model with TorchScript to disk with optimal storage. Once loaded, the model is stored in FP32 in memory. We are working towards adding support for int8 in memory. See the diffq.ts_export.export function in the API.

Examples

We provide three examples in the examples/ folder. One is for CIFAR-10/100, using standard architecture such as Wide-ResNet, ResNet or MobileNet. The second is based on the DeiT visual transformer. The third is a language modeling task on Wikitext-103, using Fairseq

The DeiT and Fairseq examples are provided as a patch on the original codebase at a specific commit. You can initialize the git submodule and apply the patches by running

make examples

For more details on each example, go checkout their specific READMEs:

Installation for development

This will install the dependencies and a diffq in developer mode (changes to the files will directly reflect), along with the dependencies to run unit tests.

pip install -e '.[dev]'

Updating the patch based examples

In order to update the patches, first run make examples to properly initialize the sub repos. Then perform all the changes you want, commit them and run make patches. This will update the patches for each repo. Once this is done, and you checked that all the changes you did are properly included in the new patch files, you can run make reset (this will remove all your changes you did from the submodules, so do check the patch files before calling this) before calling git add -u .; git commit -m "my changes" and pushing.

Test

You can run the unit tests with

make tests

Citation

If you use this code or results in your paper, please cite our work as:

@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}
}

License

This repository is released under the CC-BY-NC 4.0. license as found in the LICENSE file, except for the following parts that is under the MIT license. The files examples/cifar/src/mobilenet.py and examples/cifar/src/src/resnet.py are taken from kuangliu/pytorch-cifar, released as MIT. The file examples/cifar/src/wide_resnet.py is taken from meliketoy/wide-resnet, released as MIT. See each file headers for the detailed license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

diffq-0.2.4.tar.gz (157.1 kB view details)

Uploaded Source

Built Distributions

diffq-0.2.4-cp310-cp310-win_amd64.whl (91.8 kB view details)

Uploaded CPython 3.10 Windows x86-64

diffq-0.2.4-cp310-cp310-win32.whl (82.2 kB view details)

Uploaded CPython 3.10 Windows x86

diffq-0.2.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (418.8 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

diffq-0.2.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (401.1 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ i686 manylinux: glibc 2.5+ i686

diffq-0.2.4-cp310-cp310-macosx_11_0_arm64.whl (97.4 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

diffq-0.2.4-cp310-cp310-macosx_10_9_x86_64.whl (106.2 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

diffq-0.2.4-cp310-cp310-macosx_10_9_universal2.whl (175.8 kB view details)

Uploaded CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

diffq-0.2.4-cp39-cp39-win_amd64.whl (93.2 kB view details)

Uploaded CPython 3.9 Windows x86-64

diffq-0.2.4-cp39-cp39-win32.whl (83.5 kB view details)

Uploaded CPython 3.9 Windows x86

diffq-0.2.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (425.5 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

diffq-0.2.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (409.1 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ i686 manylinux: glibc 2.5+ i686

diffq-0.2.4-cp39-cp39-macosx_11_0_arm64.whl (96.7 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

diffq-0.2.4-cp39-cp39-macosx_10_9_x86_64.whl (106.0 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

diffq-0.2.4-cp39-cp39-macosx_10_9_universal2.whl (174.9 kB view details)

Uploaded CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)

diffq-0.2.4-cp38-cp38-win_amd64.whl (93.1 kB view details)

Uploaded CPython 3.8 Windows x86-64

diffq-0.2.4-cp38-cp38-win32.whl (83.4 kB view details)

Uploaded CPython 3.8 Windows x86

diffq-0.2.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (446.6 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

diffq-0.2.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (428.1 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ i686 manylinux: glibc 2.5+ i686

diffq-0.2.4-cp38-cp38-macosx_11_0_arm64.whl (95.1 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

diffq-0.2.4-cp38-cp38-macosx_10_9_x86_64.whl (103.8 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

diffq-0.2.4-cp38-cp38-macosx_10_9_universal2.whl (171.1 kB view details)

Uploaded CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64)

diffq-0.2.4-cp37-cp37m-win_amd64.whl (91.9 kB view details)

Uploaded CPython 3.7m Windows x86-64

diffq-0.2.4-cp37-cp37m-win32.whl (81.9 kB view details)

Uploaded CPython 3.7m Windows x86

diffq-0.2.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (393.8 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

diffq-0.2.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (376.0 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ i686 manylinux: glibc 2.5+ i686

diffq-0.2.4-cp37-cp37m-macosx_10_9_x86_64.whl (104.5 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

File details

Details for the file diffq-0.2.4.tar.gz.

File metadata

  • Download URL: diffq-0.2.4.tar.gz
  • Upload date:
  • Size: 157.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.15

File hashes

Hashes for diffq-0.2.4.tar.gz
Algorithm Hash digest
SHA256 049064861e974ebf00d0badab8b324c775037371419eda3150985b9d477b5bd2
MD5 a8994cc44b9310abf3cbd12a369add3b
BLAKE2b-256 5afd4c58807bf855c5929ffa6da55f26dd6b9ae462a4193f5e09cc49fbbfd451

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: diffq-0.2.4-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 91.8 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.15

File hashes

Hashes for diffq-0.2.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3467622841b15ece3d953fa42ad65f41703afe30e777bb910b96c89125174c8e
MD5 470b93a2d6b4e94426c787aa3302568b
BLAKE2b-256 ac9a60beef2ec7718daf4291064b7ae6e01e19496d6c8ade0002ba675cd67322

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp310-cp310-win32.whl.

File metadata

  • Download URL: diffq-0.2.4-cp310-cp310-win32.whl
  • Upload date:
  • Size: 82.2 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.15

File hashes

Hashes for diffq-0.2.4-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 1480ea49785dfdcc793a3f20043aba430f510d51487063e3617020f5a2d2a753
MD5 02749aa9e74238773b6d72ad31d38d5c
BLAKE2b-256 98e55f6c7644b2b9585922ad116a605928db69320484a87dc236940a2e417172

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 71a374573ec064227665208a5892d88032cb18736f68560d5522e0c48138ced1
MD5 edd1d4f7d5cdf6573c8a0f978a708840
BLAKE2b-256 0e3b5ab58fda751ea353aa606260d78a9b58352aebf53d3a69183c593d14cd6d

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 d62ffd89498611dbf32cde417f5fc8d222f450085b06afb4e8764307906ab2ca
MD5 7e90fac73aba32638d44d6cdc80d47c4
BLAKE2b-256 c95709ee34fd5756b5ebf96c63bcd82f4fabab4f1a95a350e491c1c8f92fdaad

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cf990911fc2c932e505df9958ce50417f182fe9178b2dbe329173b29e6521727
MD5 0268ed191ed6dabb7ba77505b30dbd06
BLAKE2b-256 4f45b6d26c9d4c64c1f6481fa8a85b9920951349a786bcfa2615241387a118dc

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 15d5055ebfc629914689d66fcfa36f6d751fd45b4b2331ba0d3390604e2b40fa
MD5 e21b0582b3bed3b136d65ccf34be47f8
BLAKE2b-256 992183da39abd8080e4aa5d211c6d17c3eb1b7e6e90b35bf98394ed648c5a039

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 3d8e6d6b882dd93568b41a7da9ff9657845ec08c82e71460544d0d04ed112320
MD5 d1f358c026cd8e743d1b94abbea72523
BLAKE2b-256 b329592009a585a22f6313e2950b38173975c2be979b18fe4454679f67102cb8

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: diffq-0.2.4-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 93.2 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.15

File hashes

Hashes for diffq-0.2.4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 9729121832c9abbbf4c443effe4e2c2952c48170d8c8255d79012d236c8dcd6d
MD5 b030ff0892bd31c03a48a4760993ddec
BLAKE2b-256 d348715aef982f49938063b181afe2aa7cd0998bcc6648ba79133dba2020ded7

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp39-cp39-win32.whl.

File metadata

  • Download URL: diffq-0.2.4-cp39-cp39-win32.whl
  • Upload date:
  • Size: 83.5 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.15

File hashes

Hashes for diffq-0.2.4-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 71575ca7202628ee1380a993aebee7e15c23ee12a96bc1a4dd1bff023aafdee2
MD5 3c6ca016c01162aba6935de7e8e80fd4
BLAKE2b-256 694a85492c979dde4f8762f2879dec5c4e9bc55aa5a82ca9d0caf467f962dea7

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 a5fc5cf4967d7cea065e75d2044824137ad08f1ccf7571d871cbf03bcf8809bd
MD5 ead1288beecbe994429123aee3ccbda1
BLAKE2b-256 8045ff8b779e9aeb653861fff9fceb65690a1b7e5c025d40cd930912731a65f7

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 02268472f1646cafe4fb3feaad9ac519f7e65d617871a58b56e71bc552fc8fb3
MD5 98e509792b3624aceba45339fbf28a53
BLAKE2b-256 4f76857ec5bc72d035a69189a629624c0a04adebefbf39c0c30fa3c2dafeea76

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ce966eb21bbb983e5bf5957c5832cad57d0968b7c5602da4065c3d1603ef8a95
MD5 89f11c2a6fc0dbbe6c03c3b76ece8377
BLAKE2b-256 a975e898aaed1414c1fc4712090942913217762fa6c670b045cc07cbb91ed9e6

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 78124e86f1e208830bfebe744c2321d92c65ba5d7e125d260ed418b4a2fa93df
MD5 13897ccc53ac54e5183bec47bf294420
BLAKE2b-256 4fb927300827a7a4b1aaa9a59d4435dcf5767301dfe8394904134dcbab86cc8f

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp39-cp39-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 967a30e3a9da922d8705c3dbf44bb82d5b76a3ad49ecaa4c9450d97479fe8a31
MD5 7c0179a59e5ca42259232dc4a68da461
BLAKE2b-256 cb2366b56a6ec679a24e8449368688674a6752a45962d93add1c7ff770574536

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: diffq-0.2.4-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 93.1 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.15

File hashes

Hashes for diffq-0.2.4-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 7566f823bda2f3f786dfea1ca2cfaa9663b854ccafcb1b185a4370690b628cf5
MD5 b46e3156d0aa425201ad1025c9b268e4
BLAKE2b-256 4ab52edadeb398560dedde227bcceeae70b05d9d3a5eec841172568f2bea12bf

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp38-cp38-win32.whl.

File metadata

  • Download URL: diffq-0.2.4-cp38-cp38-win32.whl
  • Upload date:
  • Size: 83.4 kB
  • Tags: CPython 3.8, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.15

File hashes

Hashes for diffq-0.2.4-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 e793fed11642fdb4909efc0f87f2dbb52808dc5fa9865d7fcadb93ec5fd3aacd
MD5 1910c34f55d02c6e91d7d2f82dc73ae1
BLAKE2b-256 d77516097cea7c275615c094559aaec841a60fa25ac48b8c876d3134bb25aaeb

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 0381dedef3b88b4910eedfd894610ecac9affd689c2191c96694b70b3366dd27
MD5 81c5a14a3ea671c78c4bb4cc358ceb9c
BLAKE2b-256 1e0a6151b12a53f7278eb0da3befcee0b9e0aa7bef2cbd7e7d14a7c76d526f75

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 0b0cf50749d1a80fb74ee9e5135e08f06b519ab57f5b725bb374b2866412b725
MD5 11ed46063259dcaa4ebc78b33b8a15c1
BLAKE2b-256 7f24a3b46b2a3b764ea1680a7d0eadbbb3326a86de153e167a0a4043b40d71b0

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8ff6ff92f3978770b0d2d355a5e553a554ea22732236cda9171c0683e5da5577
MD5 989b64e91aaf5c7153ec042ea7357ea7
BLAKE2b-256 594575a6021a4a244c02f75c44132630441d0445846fda34389affdfe72daa15

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8937f15e45464fd899e9b3a6b1b57700c977367caf50a626f872dbb7883e3c1c
MD5 759361a5a5eeef1176e0263d8358983e
BLAKE2b-256 4a2417d7031906a03351d4d3e6cbb4d771b80f25eb1242a16b86a73d39f6a97e

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp38-cp38-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp38-cp38-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 de84917882a3def0d71548e5366813f7e25a7b110d2085fe0b0fa4c9877f5098
MD5 8f4b1f26de5db342e7f96480c75cc425
BLAKE2b-256 b0baaf32f0228b14a72458b25280dec04b03655491132e8604afca9a9f6929c8

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: diffq-0.2.4-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 91.9 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.15

File hashes

Hashes for diffq-0.2.4-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 ee7f31d56f5131c2577dfa7bdb7d7284c5cce031fca0e30ac10d248b3e0e6841
MD5 901a5f00fae86d0326cc1721ade47ba7
BLAKE2b-256 7b8182390c8c66f8cb4975c728ca3aae828d7f0a3d37adf5bcf8495f1efd4a59

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp37-cp37m-win32.whl.

File metadata

  • Download URL: diffq-0.2.4-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 81.9 kB
  • Tags: CPython 3.7m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.15

File hashes

Hashes for diffq-0.2.4-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 36f568bb1bbf75ac5601115e6253828c8c7b21a0501d7fcdc3b9545f80dc74f7
MD5 d9c9773bcf3a4cf682efd82396d78e22
BLAKE2b-256 89ddeeea6caa7dc113bda4c13b85fd3cf2eff0f447d7657742dd077419b485b7

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 d6779a81fcb8045d006a5f309c52a34e48fefb73db99232b4b1452a8829c083c
MD5 5d30f77a3f2c056bb5e27fcf0fcd21d7
BLAKE2b-256 5156b5e9725cba5d3e3c45ed7cd35e3f330413268159b592d3cae3bb45d2971c

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 0729231949ec74641709ad9b713ba127898735ba20ec8f44677d984d2ce1c3b9
MD5 783d41888c3d2893e00c8b6cbd5ce9a6
BLAKE2b-256 c4708581f5748e958b6c25d75a86def24e983dcdeb46c39775ff6d7fdcb9fd0f

See more details on using hashes here.

File details

Details for the file diffq-0.2.4-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for diffq-0.2.4-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3aef094383d39e12508ddf61c45a377986b2d4bac26ee553b6504fee10e2ff9d
MD5 c304b83673c23010b8b4d2a3b7f473b5
BLAKE2b-256 2aeb7b8055f85850771211126ceb4c23e835f5d56f5d171a1ee88eb20500289d

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page