Skip to main content

Dataset fingerprinting library

Project description

Dataset fingerprinting

This repository contains our proof-of-concept for fingerprinting a dataset.

Local installation

git clone https://github.com/trailofbits/datasig && cd datasig
uv sync

Usage

Fingerprinting

The code below shows experimental usage of the library. This will be subject to frequent changes in early development stages.

from torchvision.datasets import MNIST
from datasig.dataset import TorchVisionDataset, CanonicalDataset

torch_dataset = MNIST(root="/tmp/data", train=True, download=True)
dataset = TorchVisionDataset(torch_dataset)
canonical = CanonicalDataset(dataset)
print("Dataset UID: ", canonical.uid)
print("Dataset fingerprint: ", canonical.fingerprint)

Dynamic dataset streaming

Datasig can be used in AIBOM solutions that require data to be streamed dynamically. Here is how to use it, using the MNIST example

On the server side (acquire and serve data):

from torchvision.datasets import MNIST
from datasig.dataset import TorchVisionDataset, CanonicalDataset
from datasig.streaming import StreamedDataset

# Create dataset and wrap with StreamedDataset
torch_dataset = MNIST(root="/tmp/data", train=True, download=True)
stream = StreamedDataset(TorchVisionDataset(torch_dataset))

# Option 1: Iterative data point access
for data_point in stream:
    pass

# Option 2: Index-based data point access
data_point = stream[10]

# Serializing data points to bytes and serve
x = stream.serialize_data_point(data_point)
your_send_data_function(x)

# Once done streaming, compute fingerprint
canonical = CanonicalDataset(stream)
print("Dataset fingerprint: ", canonical.fingerprint)

On the client side (receive, deserialize, and use the data):

from datasig.dataset import TorchVisionDataset

# Get data sent by the server side
data: bytes = your_receive_data_function()

# Deserialize data to get proper python object
data_point = TorchVisionDataset.deserialize_data_point(data)

# Do something with the data...

Development

Unit tests

Tests are in the datasig/test directory. You can run the tests with:

uv run python -m pytest # Run all tests
uv run python -m pytest -s datasig/test/test_csv.py # Run only one test file
uv run python -m pytest -s datasig/test/test_csv.py -k test_similarity # Run only one specific test function

Profiling

The profiling script generates a profile for dataset processing and fingerprint generation using cProfile. To profile the MNIST dataset from the torch framework, you can run:

uv run python profiling.py torch_mnist --full

The --full argument tells the script to include dataset canonization, UID generation, and fingerprint generation in the profile. If you want to profile only some of these steps you can cherry pick by using or omitting the following arguments instead:

uv run python profiling.py torch_mnist --canonical --uid --fingerprint

You can optionally specify the datasig config version to use (at the time of writing we have only v0) with:

uv run python profiling.py torch_mnist -v 0 --all

Currently we support only one target dataset: torch_mnist. To add another dataset, add a class in profiling.py similar to TorchMNISTV0, that implements the _setup() method which is responsible for loading the dataset.

Benchmarking

Datasig has a built-in benchmark module that allows to run experiments to benchmark speed and accuracy of various fingerprinting methods with varying configurations and on several datasets.

Benchmarks are configured programmatically using the datasig library directly. The benchmarking.py script gives a comprehensive overview of how to configure and run a benchmark, export results, as well as plot them on graph.

You can run the example benchmark with

uv run python benchmarking.py

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

datasig-0.0.2.tar.gz (85.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

datasig-0.0.2-py3-none-any.whl (90.7 kB view details)

Uploaded Python 3

File details

Details for the file datasig-0.0.2.tar.gz.

File metadata

  • Download URL: datasig-0.0.2.tar.gz
  • Upload date:
  • Size: 85.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for datasig-0.0.2.tar.gz
Algorithm Hash digest
SHA256 4a18ff50af06cb7aa61dea3e78dd835da3316724cb27dceb17f116d8bef0bad9
MD5 9d0613cedac55157984ea1def483c2a3
BLAKE2b-256 4e1b2a08d9a3cb58284d72d284351672b195784371a81f98fe123a89387c64f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for datasig-0.0.2.tar.gz:

Publisher: release.yml on trailofbits/datasig

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file datasig-0.0.2-py3-none-any.whl.

File metadata

  • Download URL: datasig-0.0.2-py3-none-any.whl
  • Upload date:
  • Size: 90.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for datasig-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 95b9faeb0dd1b2f50bab4c6a667b5e37d9e1d68f301e0f729bef34ac8ecb38c1
MD5 2d4928b6afe97d99cffab2a0d1476a66
BLAKE2b-256 4ec44a49d9e686a6e5cb21b804da59a76a3d95385d5a8ed24e27bb57b206266b

See more details on using hashes here.

Provenance

The following attestation bundles were made for datasig-0.0.2-py3-none-any.whl:

Publisher: release.yml on trailofbits/datasig

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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