Skip to main content

Cryptographically secure pseudorandom number generators for PyTorch

Project description

PyTorch/CSPRNG

torchcsprng is a PyTorch C++/CUDA extension that provides cryptographically secure pseudorandom number generators for PyTorch.

CircleCI

Design

torchcsprng generates a random 128-bit key on CPU using one of its generators and runs AES128 in CTR mode either on CPU or on GPU using CUDA to generate a random 128 bit state and apply a transformation function to map it to target tensor values. This approach is based on Parallel Random Numbers: As Easy as 1, 2, 3(John K. Salmon, Mark A. Moraes, Ron O. Dror, and David E. Shaw, D. E. Shaw Research). It makes torchcsprng both crypto-secure and parallel on CUDA and CPU.

CSPRNG architecture

Advantages:

  • The user can choose either seed-based(for testing) or random device based(fully crypto-secure) generators
  • One generator instance for both CPU and CUDA tensors(because the encryption key is always generated on CPU)
  • CPU random number generation is also parallel(unlike the default PyTorch CPU generator)

Features

torchcsprng exposes two methods to create crypto-secure and non-crypto-secure PRNGs:

Method to create PRNG Is crypto-secure? Has seed? Underlying implementation
create_random_device_generator(token: string=None) yes no See std::random_device and its constructor. The implementation in libstdc++ expects token to name the source of random bytes. Possible token values include "default", "rand_s", "rdseed", "rdrand", "rdrnd", "/dev/urandom", "/dev/random", "mt19937", and integer string specifying the seed of the mt19937 engine. (Token values other than "default" are only valid for certain targets.) If token=None then constructs a new std::random_device object with an implementation-defined token.
create_mt19937_generator(seed: int=None) no yes See std::mt19937 and its constructor. Constructs a mersenne_twister_engine object, and initializes its internal state sequence to pseudo-random values. If seed=None then seeds the engine with default_seed.

The following list of methods supports all forementioned PRNGs:

Kernel CUDA CPU
random_() yes yes
random_(to) yes yes
random_(from, to) yes yes
uniform_(from, to) yes yes
normal_(mean, std) yes yes
cauchy_(median, sigma) yes yes
log_normal_(mean, std) yes yes
geometric_(p) yes yes
exponential_(lambda) yes yes
randperm(n) yes* yes
  • the calculations are done on CPU and the result is copied to CUDA

Installation

CSPRNG works with Python 3.6/3.7/3.8 on the following operating systems and can be used with PyTorch tensors on the following devices:

Tensor Device Type Linux macOS MS Window
CPU Supported Supported Supported
CUDA Supported Not Supported Coming

Binary Installation

Anaconda:

OS CUDA
Linux 9.2

10.1

10.2

None
conda install torchcsprng cudatoolkit=9.2 -c pytorch

conda install torchcsprng cudatoolkit=10.1 -c pytorch

conda install torchcsprng cudatoolkit=10.2 -c pytorch

conda install torchcsprng cpuonly -c pytorch
macOS None conda install torchcsprng cpuonly -c pytorch
Windows None conda install torchcsprng cpuonly -c pytorch

pip:

OS CUDA
Linux 9.2

10.1

10.2

None
pip install torchcsprng==0.1.1+cu92 torch==1.6.0+cu92 -f https://download.pytorch.org/whl/torch_stable.html

pip install torchcsprng==0.1.1+cu101 torch==1.6.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html

pip install torchcsprng torch

pip install torchcsprng==0.1.1+cpu torch==1.6.0+cpu -f https://download.pytorch.org/whl/torch_stable.html
macOS None pip install torchcsprng torch
Windows None pip install torchcsprng torch -f https://download.pytorch.org/whl/torch_stable.html

Nightly builds:

Anaconda:

OS CUDA
Linux 9.2

10.1

10.2

None
conda install torchcsprng cudatoolkit=9.2 -c pytorch-nightly

conda install torchcsprng cudatoolkit=10.1 -c pytorch-nightly

conda install torchcsprng cudatoolkit=10.2 -c pytorch-nightly

conda install torchcsprng cpuonly -c pytorch-nightly
macOS None conda install torchcsprng cpuonly -c pytorch-nightly
Windows None conda install torchcsprng cpuonly -c pytorch-nightly

pip:

OS CUDA
Linux 9.2

10.1

10.2

None
pip install --pre torchcsprng -f https://download.pytorch.org/whl/nightly/cu92/torch_nightly.html

pip install --pre torchcsprng -f https://download.pytorch.org/whl/nightly/cu101/torch_nightly.html

pip install --pre torchcsprng -f https://download.pytorch.org/whl/nightly/cu102/torch_nightly.html

pip install --pre torchcsprng -f https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html
macOS None pip install --pre torchcsprng -f https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html
Windows None pip install --pre torchcsprng -f https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html

From Source

torchcsprng is a Python C++/CUDA extension that depends on PyTorch. In order to build CSPRNG from source it is required to have Python(>=3.6) with PyTorch(>=1.6.0) installed and C++ compiler(gcc/clang for Linux, XCode for macOS, Visual Studio for MS Windows). To build torchcsprng you can run the following:

python setup.py install

By default, GPU support is built if CUDA is found and torch.cuda.is_available() is True. Additionally, it is possible to force building GPU support by setting the FORCE_CUDA=1 environment variable, which is useful when building a docker image.

Getting Started

The torchcsprng API is available in torchcsprng module:

import torch
import torchcsprng as csprng

Create crypto-secure PRNG from /dev/urandom:

urandom_gen = csprng.create_random_device_generator('/dev/urandom')

Create empty boolean tensor on CUDA and initialize it with random values from urandom_gen:

torch.empty(10, dtype=torch.bool, device='cuda').random_(generator=urandom_gen)
tensor([ True, False, False,  True, False, False, False,  True, False, False],
       device='cuda:0')

Create empty int16 tensor on CUDA and initialize it with random values in range [0, 100) from urandom_gen:

torch.empty(10, dtype=torch.int16, device='cuda').random_(100, generator=urandom_gen)
tensor([59, 20, 68, 51, 18, 37,  7, 54, 74, 85], device='cuda:0',
       dtype=torch.int16)

Create non-crypto-secure MT19937 PRNG:

mt19937_gen = csprng.create_mt19937_generator()
torch.empty(10, dtype=torch.int64, device='cuda').random_(torch.iinfo(torch.int64).min, to=None, generator=mt19937_gen)
tensor([-7584783661268263470,  2477984957619728163, -3472586837228887516,
        -5174704429717287072,  4125764479102447192, -4763846282056057972,
         -182922600982469112,  -498242863868415842,   728545841957750221,
         7740902737283645074], device='cuda:0')

Create crypto-secure PRNG from default random device:

default_device_gen = csprng.create_random_device_generator()
torch.randn(10, device='cuda', generator=default_device_gen)
tensor([ 1.2885,  0.3240, -1.1813,  0.8629,  0.5714,  2.3720, -0.5627, -0.5551,
        -0.6304,  0.1090], device='cuda:0')

Create non-crypto-secure MT19937 PRNG with seed:

mt19937_gen = csprng.create_mt19937_generator(42)
torch.empty(10, device='cuda').geometric_(p=0.2, generator=mt19937_gen)
tensor([ 7.,  1.,  8.,  1., 11.,  3.,  1.,  1.,  5., 10.], device='cuda:0')

Recreate MT19937 PRNG with the same seed:

mt19937_gen = csprng.create_mt19937_generator(42)
torch.empty(10, device='cuda').geometric_(p=0.2, generator=mt19937_gen)
tensor([ 7.,  1.,  8.,  1., 11.,  3.,  1.,  1.,  5., 10.], device='cuda:0')

Contributing

We appreciate all contributions. If you are planning to contribute back bug-fixes, please do so without any further discussion. If you plan to contribute new features, utility functions or extensions, please first open an issue and discuss the feature with us.

License

torchcsprng is BSD 3-clause licensed. See the license file here

Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

torchcsprng-0.1.2-cp38-cp38-manylinux1_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.8

torchcsprng-0.1.2-cp38-cp38-macosx_10_9_x86_64.whl (161.5 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

torchcsprng-0.1.2-cp37-cp37m-manylinux1_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.7m

torchcsprng-0.1.2-cp37-cp37m-macosx_10_9_x86_64.whl (160.9 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

torchcsprng-0.1.2-cp36-cp36m-manylinux1_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.6m

torchcsprng-0.1.2-cp36-cp36m-macosx_10_9_x86_64.whl (160.8 kB view details)

Uploaded CPython 3.6m macOS 10.9+ x86-64

File details

Details for the file torchcsprng-0.1.2-cp38-cp38-manylinux1_x86_64.whl.

File metadata

  • Download URL: torchcsprng-0.1.2-cp38-cp38-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.3.1.post20200622 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.8.1

File hashes

Hashes for torchcsprng-0.1.2-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 a0b5e5a70b6d4a1a073637dff2573b4c54846eac1b34ef1b98822d1a9d25c432
MD5 09788eaf383149d779845a6915c1478b
BLAKE2b-256 9a92141e50428313201c2409f7aec8ac8286188f5ed6432f9da5e4f64a6b646e

See more details on using hashes here.

File details

Details for the file torchcsprng-0.1.2-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: torchcsprng-0.1.2-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 161.5 kB
  • Tags: CPython 3.8, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.3.1.post20200622 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.8.1

File hashes

Hashes for torchcsprng-0.1.2-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 81aa1e37c99c5a3ceb26610683057cab598f3e41fb89860e96711cedae0f4202
MD5 c2efce637d020d88308c22e4672a1052
BLAKE2b-256 212d618747816109e351cd48ea0885d0a900f393e96b485bd8d65fb4701b7c33

See more details on using hashes here.

File details

Details for the file torchcsprng-0.1.2-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

  • Download URL: torchcsprng-0.1.2-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.3.1.post20200622 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.8.1

File hashes

Hashes for torchcsprng-0.1.2-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 711ad4c4c2634bbe23c8eaea44b60c14a8d4342f6cb3c9f7ef49768b85510ea7
MD5 c0d0bada539cf142ca17884b9ff553c1
BLAKE2b-256 bd83f9bbe3132a096a2c9e5739071f92380909ece96f38ee1de42882c18efb32

See more details on using hashes here.

File details

Details for the file torchcsprng-0.1.2-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: torchcsprng-0.1.2-cp37-cp37m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 160.9 kB
  • Tags: CPython 3.7m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.3.1.post20200622 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.8.1

File hashes

Hashes for torchcsprng-0.1.2-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f4601abe69be6a7f65d47d0d33d81577de3757e268c702cfe14812da35c9beb0
MD5 b3517f543659b42d19f4d62465201d9c
BLAKE2b-256 d1825d1d4a5a79401dd3db0571d9f690fac49a5ba7f517152254251800a1fb44

See more details on using hashes here.

File details

Details for the file torchcsprng-0.1.2-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

  • Download URL: torchcsprng-0.1.2-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.3.1.post20200622 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.8.1

File hashes

Hashes for torchcsprng-0.1.2-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 4fcffdea36db134a685d78a6f263fb3f3cb2aa0231866d1a80ad3687d30e9220
MD5 e2806359cea50845f3c7b6451b125bb6
BLAKE2b-256 4ceed560e6b045035add58f6a7cc047fdf5f04ffff478d67ef841c2bac59a874

See more details on using hashes here.

File details

Details for the file torchcsprng-0.1.2-cp36-cp36m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: torchcsprng-0.1.2-cp36-cp36m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 160.8 kB
  • Tags: CPython 3.6m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.3.1.post20200622 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.8.1

File hashes

Hashes for torchcsprng-0.1.2-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4c7ac4e2aa3be8acbb3a3b2184740665da1af3958685072d9be616da610be6f1
MD5 0156bfcf22bd1c59a708ae731f1db58a
BLAKE2b-256 eb011f76e65d597f6ab53791bbf9fc265efa6dfde20b62167f03fb10efa02f97

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