Skip to main content

Python binding to Omikuji, an efficient implementation of Partioned Label Trees and its variations for extreme multi-label classification

Project description

Omikuji

Build Status Crate version PyPI version

An efficient implementation of Partitioned Label Trees (Prabhu et al., 2018) and its variations for extreme multi-label classification, written in Rust🦀 with love💖.

Features & Performance

Omikuji has has been tested on datasets from the Extreme Classification Repository. All tests below are run on a quad-core Intel® Core™ i7-6700 CPU, and we allowed as many cores to be utilized as possible. We measured training time, and calculated precisions at 1, 3, and 5. (Note that, due to randomness, results might vary from run to run, especially for smaller datasets.)

Parabel, better parallelized

Omikuji provides a more parallelized implementation of Parabel (Prabhu et al., 2018) that trains faster when more CPU cores are available. Compared to the original implementation written in C++, which can only utilize the same number of CPU cores as the number of trees (3 by default), Omikuji maintains the same level of precision but trains 1.3x to 1.7x faster on our quad-core machine. Further speed-up is possible if more CPU cores are available.

Dataset Metric Parabel Omikuji
(balanced,
cluster.k=2)
EURLex-4K P@1 82.2 82.1
P@3 68.8 68.8
P@5 57.6 57.7
Train Time 18s 14s
Amazon-670K P@1 44.9 44.8
P@3 39.8 39.8
P@5 36.0 36.0
Train Time 404s 234s
WikiLSHTC-325K P@1 65.0 64.8
P@3 43.2 43.1
P@5 32.0 32.1
Train Time 959s 659s

Regular k-means for shallow trees

Following Bonsai (Khandagale et al., 2019), Omikuji supports using regular k-means instead of balanced 2-means clustering for tree construction, which results in wider, shallower and unbalanced trees that train slower but have better precision. Comparing to the original Bonsai implementation, Omikuji also achieves the same precisions while training 2.6x to 4.6x faster on our quad-core machine. (Similarly, further speed-up is possible if more CPU cores are available.)

Dataset Metric Bonsai Omikuji
(unbalanced,
cluster.k=100,
max_depth=3)
EURLex-4K P@1 82.8 83.0
P@3 69.4 69.5
P@5 58.1 58.3
Train Time 87s 19s
Amazon-670K P@1 45.5* 45.6
P@3 40.3* 40.4
P@5 36.5* 36.6
Train Time 5,759s 1,753s
WikiLSHTC-325K P@1 66.6* 66.6
P@3 44.5* 44.4
P@5 33.0* 33.0
Train Time 11,156s 4,259s

*Precision numbers as reported in the paper; our machine doesn't have enough memory to run the full prediction with their implementation.

Balanced k-means for balanced shallow trees

Sometimes it's desirable to have shallow and wide trees that are also balanced, in which case Omikuji supports the balanced k-means algorithm used by HOMER (Tsoumakas et al., 2008) for clustering as well.

Dataset Metric Omikuji
(balanced,
cluster.k=100)
EURLex-4K P@1 82.1
P@3 69.4
P@5 58.1
Train Time 19s
Amazon-670K P@1 45.4
P@3 40.3
P@5 36.5
Train Time 1,153s
WikiLSHTC-325K P@1 65.6
P@3 43.6
P@5 32.5
Train Time 3,028s

Layer collapsing for balanced shallow trees

An alternative way for building balanced, shallow and wide trees is to collapse adjacent layers, similar to the tree compression step used in AttentionXML (You et al., 2019): intermediate layers are removed, and their children replace them as the children of their parents. For example, with balanced 2-means clustering, if we collapse 5 layers after each layer, we can increase the tree arity from 2 to 2⁵⁺¹ = 64.

Dataset Metric Omikuji
(balanced,
cluster.k=2,
collapse 5 layers)
EURLex-4K P@1 82.4
P@3 69.3
P@5 58.0
Train Time 16s
Amazon-670K P@1 45.3
P@3 40.2
P@5 36.4
Train Time 460s
WikiLSHTC-325K P@1 64.9
P@3 43.3
P@5 32.3
Train Time 1,649s

Build & Install

Omikuji can be easily built & installed with Cargo as a CLI app:

cargo install omikuji --features cli

Or install from the latest source:

cargo install --git https://github.com/tomtung/omikuji.git --features cli

The CLI app will be available as omikuji. For example, to reproduce the results on the EURLex-4K dataset:

omikuji train eurlex_train.txt --model_path ./model
omikuji test ./model eurlex_test.txt --out_path predictions.txt

Python Binding

A simple Python binding is also available for training and prediction. It can be install via pip:

pip install omikuji

Note that you might still need to install Cargo should compilation become necessary.

You can also install from the latest source:

pip install git+https://github.com/tomtung/omikuji.git -v

The following script demonstrates how to use the Python binding to train a model and make predictions:

import omikuji

# Train
hyper_param = omikuji.Model.default_hyper_param()
# Adjust hyper-parameters as needed
hyper_param.n_trees = 5
model = omikuji.Model.train_on_data("./eurlex_train.txt", hyper_param)

# Serialize & de-serialize
model.save("./model")
model = omikuji.Model.load("./model")
# Optionally densify model weights to trade off between prediction speed and memory usage
model.densify_weights(0.05)

# Predict
feature_value_pairs = [
    (0, 0.101468),
    (1, 0.554374),
    (2, 0.235760),
    (3, 0.065255),
    (8, 0.152305),
    (10, 0.155051),
    # ...
]
label_score_pairs =  model.predict(feature_value_pairs)

Usage

$ omikuji train --help
Train a new omikuji model

USAGE:
    omikuji train [OPTIONS] <TRAINING_DATA_PATH>

ARGS:
    <TRAINING_DATA_PATH>
            Path to training dataset file

            The dataset file is expected to be in the format of the Extreme Classification
            Repository.

OPTIONS:
        --centroid_threshold <THRESHOLD>
            Threshold for pruning label centroid vectors

            [default: 0]

        --cluster.eps <CLUSTER_EPS>
            Epsilon value for determining linear classifier convergence

            [default: 0.0001]

        --cluster.k <K>
            Number of clusters

            [default: 2]

        --cluster.min_size <MIN_SIZE>
            Labels in clusters with sizes smaller than this threshold are reassigned to other
            clusters instead

            [default: 2]

        --cluster.unbalanced
            Perform regular k-means clustering instead of balanced k-means clustering

        --collapse_every_n_layers <N_LAYERS>
            Number of adjacent layers to collapse

            This increases tree arity and decreases tree depth.

            [default: 0]

    -h, --help
            Print help information

        --linear.c <C>
            Cost coefficient for regularizing linear classifiers

            [default: 1]

        --linear.eps <LINEAR_EPS>
            Epsilon value for determining linear classifier convergence

            [default: 0.1]

        --linear.loss <LOSS>
            Loss function used by linear classifiers

            [default: hinge]
            [possible values: hinge, log]

        --linear.max_iter <M>
            Max number of iterations for training each linear classifier

            [default: 20]

        --linear.weight_threshold <MIN_WEIGHT>
            Threshold for pruning weight vectors of linear classifiers

            [default: 0.1]

        --max_depth <DEPTH>
            Maximum tree depth

            [default: 20]

        --min_branch_size <SIZE>
            Number of labels below which no further clustering & branching is done

            [default: 100]

        --model_path <MODEL_PATH>
            Optional path of the directory where the trained model will be saved if provided

            If an model with compatible settings is already saved in the given directory, the newly
            trained trees will be added to the existing model")

        --n_threads <N_THREADS>
            Number of worker threads

            If 0, the number is selected automatically.

            [default: 0]

        --n_trees <N_TREES>
            Number of trees

            [default: 3]

        --train_trees_1_by_1
            Finish training each tree before start training the next

            This limits initial parallelization but saves memory.

        --tree_structure_only
            Build the trees without training classifiers

            Might be useful when a downstream user needs the tree structures only.
$ omikuji test --help
Test an existing omikuji model

USAGE:
    omikuji test [OPTIONS] <MODEL_PATH> <TEST_DATA_PATH>

ARGS:
    <MODEL_PATH>
            Path of the directory where the trained model is saved

    <TEST_DATA_PATH>
            Path to test dataset file

            The dataset file is expected to be in the format of the Extreme Classification
            Repository.

OPTIONS:
        --beam_size <BEAM_SIZE>
            Beam size for beam search

            [default: 10]

    -h, --help
            Print help information

        --k_top <K>
            Number of top predictions to write out for each test example

            [default: 5]

        --max_sparse_density <DENSITY>
            Density threshold above which sparse weight vectors are converted to dense format

            Lower values speed up prediction at the cost of more memory usage.

            [default: 0.1]

        --n_threads <N_THREADS>
            Number of worker threads

            If 0, the number is selected automatically.

            [default: 0]

        --out_path <OUT_PATH>
            Path to the which predictions will be written, if provided

Data format

Our implementation takes dataset files formatted as those provided in the Extreme Classification Repository. A data file starts with a header line with three space-separated integers: total number of examples, number of features, and number of labels. Following the header line, there is one line per each example, starting with comma-separated labels, followed by space-separated feature:value pairs:

label1,label2,...labelk ft1:ft1_val ft2:ft2_val ft3:ft3_val .. ftd:ftd_val

Trivia

The project name comes from o-mikuji (御神籤), which are predictions about one's future written on strips of paper (labels?) at jinjas and temples in Japan, often tied to branches of pine trees after they are read.

References

  • Y. Prabhu, A. Kag, S. Harsola, R. Agrawal, and M. Varma, “Parabel: Partitioned Label Trees for Extreme Classification with Application to Dynamic Search Advertising,” in Proceedings of the 2018 World Wide Web Conference, 2018, pp. 993–1002.
  • S. Khandagale, H. Xiao, and R. Babbar, “Bonsai - Diverse and Shallow Trees for Extreme Multi-label Classification,” Apr. 2019.
  • G. Tsoumakas, I. Katakis, and I. Vlahavas, “Effective and efficient multilabel classification in domains with large number of labels,” ECML, 2008.
  • R. You, S. Dai, Z. Zhang, H. Mamitsuka, and S. Zhu, “AttentionXML: Extreme Multi-Label Text Classification with Multi-Label Attention Based Recurrent Neural Networks,” Jun. 2019.

License

Omikuji is licensed under the MIT 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

omikuji-0.5.0.tar.gz (50.5 kB view details)

Uploaded Source

Built Distributions

omikuji-0.5.0-cp310-cp310-win_amd64.whl (373.5 kB view details)

Uploaded CPython 3.10 Windows x86-64

omikuji-0.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (846.9 kB view details)

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

omikuji-0.5.0-cp310-cp310-macosx_10_15_universal2.whl (493.9 kB view details)

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

omikuji-0.5.0-cp39-cp39-win_amd64.whl (379.6 kB view details)

Uploaded CPython 3.9 Windows x86-64

omikuji-0.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (839.4 kB view details)

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

omikuji-0.5.0-cp39-cp39-macosx_10_15_x86_64.whl (488.1 kB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

omikuji-0.5.0-cp38-cp38-win_amd64.whl (379.6 kB view details)

Uploaded CPython 3.8 Windows x86-64

omikuji-0.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (839.4 kB view details)

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

omikuji-0.5.0-cp38-cp38-macosx_10_15_x86_64.whl (488.1 kB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

omikuji-0.5.0-cp37-cp37m-win_amd64.whl (379.6 kB view details)

Uploaded CPython 3.7m Windows x86-64

omikuji-0.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (839.4 kB view details)

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

omikuji-0.5.0-cp37-cp37m-macosx_10_15_x86_64.whl (488.1 kB view details)

Uploaded CPython 3.7m macOS 10.15+ x86-64

File details

Details for the file omikuji-0.5.0.tar.gz.

File metadata

  • Download URL: omikuji-0.5.0.tar.gz
  • Upload date:
  • Size: 50.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.34.0 CPython/3.6.9

File hashes

Hashes for omikuji-0.5.0.tar.gz
Algorithm Hash digest
SHA256 512bb953dff1654e036767c878544dcb9e85b2c16d7fb60dd590101ca881146d
MD5 4fcac06d204dc03abba1614a21b5bc03
BLAKE2b-256 56fc14fbe376d3a1c971fcc7e0a28ffe79d9bba50b00e621300671272cd941f4

See more details on using hashes here.

File details

Details for the file omikuji-0.5.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: omikuji-0.5.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 373.5 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.34.0 CPython/3.6.9

File hashes

Hashes for omikuji-0.5.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1456792490b699a779b6208dc9779ddc79f4efafc631c2fc3f98f729efc12ae2
MD5 850b07f8417c05c792ea87eaff164d33
BLAKE2b-256 769439908c5290deec475867539d80f89cb511b82f6561c0fcb2f6643cb15140

See more details on using hashes here.

File details

Details for the file omikuji-0.5.0-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 omikuji-0.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 19a5b486eee0c079640a9fd10e39c3d259dbe8277ce4cdf53bf3c06183e58255
MD5 cc4a2b10c3a938d30081210325238bb5
BLAKE2b-256 aac1d52f0085531f7309ca05f6bbb051811c6b8c5567020e703795a856b9c50f

See more details on using hashes here.

File details

Details for the file omikuji-0.5.0-cp310-cp310-macosx_10_15_universal2.whl.

File metadata

  • Download URL: omikuji-0.5.0-cp310-cp310-macosx_10_15_universal2.whl
  • Upload date:
  • Size: 493.9 kB
  • Tags: CPython 3.10, macOS 10.15+ universal2 (ARM64, x86-64)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.34.0 CPython/3.6.9

File hashes

Hashes for omikuji-0.5.0-cp310-cp310-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 31685a65761a22266b7e50a3accb37bb6eec631f2af3d84e2cebc86710258421
MD5 f10fefaa307b1fbcff45c2baf715a7ad
BLAKE2b-256 39ffa05e5e899370cc06c39d911aee92cc0d46d9c1cc4fab6dcb26ae7adabc86

See more details on using hashes here.

File details

Details for the file omikuji-0.5.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: omikuji-0.5.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 379.6 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.34.0 CPython/3.6.9

File hashes

Hashes for omikuji-0.5.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 60b304be2be702406de604252cae756b5484883b09477dd1e2708855c2fd3d3f
MD5 ef724dd98c24ebbe3e2323646df6c58d
BLAKE2b-256 45afc6e3216484827ddb9678ad74fffc363dacf0cac818ec6f22de5ca0831fb6

See more details on using hashes here.

File details

Details for the file omikuji-0.5.0-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 omikuji-0.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 84c372a91a0e9a9dc847314569b2d4b9999f46438747829d11bb61ae6ce80567
MD5 e841972822ca5eaa918be6c1d1f5bfa6
BLAKE2b-256 6180f6b4291a706559ea5dedd85b7c96d42c6adebf3b169fe8bcbd0d2d197bf1

See more details on using hashes here.

File details

Details for the file omikuji-0.5.0-cp39-cp39-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: omikuji-0.5.0-cp39-cp39-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 488.1 kB
  • Tags: CPython 3.9, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.34.0 CPython/3.6.9

File hashes

Hashes for omikuji-0.5.0-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 f3e51bbc8cf13bed9d0fbc0d89a30ca5981626101fd74d2db68aaf70fba26234
MD5 8712b34f2385f78f254b50d7032362da
BLAKE2b-256 e5c81de31067fa243d6cfef7ff42307bd8003fe64cd21e974136ce032c3f179f

See more details on using hashes here.

File details

Details for the file omikuji-0.5.0-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: omikuji-0.5.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 379.6 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.34.0 CPython/3.6.9

File hashes

Hashes for omikuji-0.5.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 80820430954c54135f61892d6f3137ef1b6e93d28e2d55a6ba3b91cbb9618cde
MD5 9daa9d56fcb36b05453d99a4d35c07b6
BLAKE2b-256 8a6f2cdd16eeef27276857dbfd4a66b540a7a1819c45bf48bd5680d5b069d24f

See more details on using hashes here.

File details

Details for the file omikuji-0.5.0-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 omikuji-0.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 7b7b96628c2ae71dc040d6840b99e1873811f993e6de207965ba5a0a4d59bcd7
MD5 ce160a03b95783988a4010beb86a1247
BLAKE2b-256 21f6cbd39555085319650aa78bc13fb4692de4a9d7964543f0ae092ef3463ff9

See more details on using hashes here.

File details

Details for the file omikuji-0.5.0-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: omikuji-0.5.0-cp38-cp38-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 488.1 kB
  • Tags: CPython 3.8, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.34.0 CPython/3.6.9

File hashes

Hashes for omikuji-0.5.0-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 6d009344c6b5fc7398869fa76d63b284502d2c49443683cade759cebd270b640
MD5 88e60d1c0ce089daee95f785b478e988
BLAKE2b-256 b0600a7735db8961f07ddee09b5664b1020c69b3cb9fd0f0876747382c54fab3

See more details on using hashes here.

File details

Details for the file omikuji-0.5.0-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: omikuji-0.5.0-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 379.6 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.34.0 CPython/3.6.9

File hashes

Hashes for omikuji-0.5.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 30a8ab2f45d06603136a38c5a4f959438108348a616ea837a8d26ca2effef94d
MD5 80442601c68fd04cc91fe8048c199d61
BLAKE2b-256 eb1cfd0b83ceda609912d755b0af8ca1d7f2b740963479686d029af00055bbe2

See more details on using hashes here.

File details

Details for the file omikuji-0.5.0-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 omikuji-0.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 97a09c466a0ed908e2ef40357b244bad2006dbf35e553eebc2a696ef780a5af3
MD5 252960a5a97e40d35180f4b95abfc8d4
BLAKE2b-256 aaa4bfe2fe5adb105d3b96ad175b244a631fb10196d8f2b552268a168066860b

See more details on using hashes here.

File details

Details for the file omikuji-0.5.0-cp37-cp37m-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: omikuji-0.5.0-cp37-cp37m-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 488.1 kB
  • Tags: CPython 3.7m, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.34.0 CPython/3.6.9

File hashes

Hashes for omikuji-0.5.0-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 0d55b728f83954874c26c1778b5eaef181dac2a96c9f19bbaf9fb9804efea30c
MD5 396e2db6575a855daed00480acf4cd50
BLAKE2b-256 a8589d2a3dc986533937f87830e61e5b31ccdf6c3235b86475c5331094a93efc

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