`dattri` is a PyTorch library for developing, benchmarking, and deploying efficient data attribution algorithms.
See the code
Quick Start | Algorithms | Metrics | Benchmark Settings | Benchmark Results
dattri is a PyTorch library for developing, benchmarking, and deploying efficient data attribution algorithms. You may use dattri to
pip install dattri
If you want to use sjlt to accelerate the random projection, you may install the version with sjlt by
pip install dattri[sjlt]
[!NOTE] It's highly recommended using a device support CUDA to run dattri, especially for large models or datasets.
[!NOTE] It's required to have CUDA if you want to install and use the sjlt version
dattri[sjlt]to accelerate the random projection.
It's not required to follow the exact same steps in this section. But this is a verified environment setup flow that may help users to avoid most of the issues during the installation.
conda create -n dattri python=3.10
conda activate dattri
conda install -c "nvidia/label/cuda-12.4.0" cuda-toolkit
pip3 install torch==2.6.0 --index-url https://download.pytorch.org/whl/cu124
pip install dattri[sjlt]
One can apply different data attribution methods to PyTorch Models. One only needs to define:
train_loader, test_loader).The following is an example of using IFAttributorCG and AttributionTask to apply data attribution to a PyTorch model.
Please reference here for the guide on how to properly define train/test data for Attributor and loss/target function.
More examples can be found here.
import torch
from torch import nn
from dattri.algorithm import IFAttributorCG
from dattri.task import AttributionTask
from dattri.benchmark.datasets.mnist import train_mnist_lr, create_mnist_dataset
from dattri.benchmark.utils import SubsetSampler
dataset_train, dataset_test = create_mnist_dataset("./data")
train_loader = torch.utils.data.DataLoader(
dataset_train,
batch_size=1000,
sampler=SubsetSampler(range(1000)),
)
test_loader = torch.utils.data.DataLoader(
dataset_test,
batch_size=100,
sampler=SubsetSampler(range(100)),
)
model = train_mnist_lr(train_loader)
def f(params, data_target_pair):
x, y = data_target_pair
loss = nn.CrossEntropyLoss()
yhat = torch.func.functional_call(model, params, x)
return loss(yhat, y)
task = AttributionTask(loss_func=f,
model=model,
checkpoints=model.state_dict())
attributor = IFAttributorCG(
task=task,
max_iter=10,
regularization=1e-2
)
attributor.cache(train_loader)
with torch.no_grad():
score = attributor.attribute(train_loader, test_loader)
Hessian-vector product (HVP), inverse-Hessian-vector product (IHVP) are widely used in data attribution methods. dattri provides efficient implementation to these operators by torch.func. This example shows how to use the CG implementation of the IHVP implementation.
import torch
from dattri.func.hessian import ihvp_cg, ihvp_at_x_cg
def f(x, param):
return torch.sin(x / param).sum()
x = torch.randn(2)
param = torch.randn(1)
v = torch.randn(5, 2)
# ihvp_cg method
ihvp_func = ihvp_cg(f, argnums=0, max_iter=2) # argnums=0 indicates that the param of (x, param) to be passed to ihvp_func is the model parameter
ihvp_result_1 = ihvp_func((x, param), v) # both (x, param) and v as the inputs
# ihvp_at_x_cg method: (x, param) is cached
ihvp_at_x_func = ihvp_at_x_cg(f, x, param, argnums=0, max_iter=2)
ihvp_result_2 = ihvp_at_x_func(v) # only v as the input
# the above two will give the same result
assert torch.allclose(ihvp_result_1, ihvp_result_2)
It has been shown that long vectors will retain most of their relative information when projected down to a smaller feature dimension. To reduce the computational cost, random projection is widely used in data attribution methods. Following is an example to use random_project. The implementation leverages sjlt.
from dattri.func.random_projection import random_project
# initialize the projector based on users' needs
project_func = random_project(tensor, tensor.size(0), proj_dim=512)
# obtain projected tensors
projected_tensor = project_func(torch.full_like(tensor))
Normally speaking, tensor is probably the gradient of the loss/target function and has a large dimension (i.e., the number of parameters).
Recent studies found that ensemble methods can significantly improve the performance of data attribution, DROPOUT ENSEMBLE is one of these ensemble methods. One may prepare their model with
from dattri.model_util.dropout import activate_dropout
# initialize a torch.nn.Module model
model = MLP()
# (option 1) activate all dropout layers
model = activate_dropout(model, dropout_prob=0.2)
# (option 2) activate specific dropout layers
# here "dropout1" and "dropout2" are the names of dropout layers within the model
model = activate_dropout(model, ["dropout1", "dropout2"], dropout_prob=0.2)
We have implemented most of the state-of-the-art methods. The categories and reference paper of the algorithms are listed in the following table.
| Family | Algorithms |
|---|---|
| IF | Explicit |
| CG | |
| LiSSA | |
| Arnoldi | |
| DataInf | |
| EK-FAC | |
| RelatIF | |
| LoGra | |
| GraSS | |
| TracIn | TracInCP |
| Grad-Dot | |
| Grad-Cos | |
| RPS | RPS-L2 |
| TRAK | TRAK |
| Shapley Value | KNN-Shapley |
| TSLOO | Data Value Embedding |
| Dataset | Model | Task | Sample Size (train, test) | Parameter Size | Metric | Data Source |
|---|---|---|---|---|---|---|
| MNIST-10 | LR | Image Classification | (5000,500) | 7840 | LOO/LDS/AUC | link |
| MNIST-10 | MLP | Image Classification | (5000,500) | 0.11M | LOO/LDS/AUC | link |
| CIFAR-2 | ResNet-9 | Image Classification | (5000,500) | 4.83M | LDS | link |
| CIFAR-10 | ResNet-9 | Image Classification | (5000,500) | 4.83M | AUC | link |
| MAESTRO | Music Transformer | Music Generation | (5000,178) | 13.3M | LDS | link |
| Shakespeare | nanoGPT | Text Generation | (3921,435) | 10.7M | LDS | link |
| wikitext2 | gpt2 | Text Generation | (4656,481) | 124M | LDS | link |



@inproceedings{deng2024dattri,
author = {Deng, Junwei and Li, Ting-Wei and Zhang, Shiyuan and Liu, Shixuan and Pan, Yijun and Huang, Hao and Wang, Xinhe and Hu, Pingbang and Zhang, Xingjian and Ma, Jiaqi},
title = {dattri: A Library for Efficient Data Attribution},
booktitle = {Advances in Neural Information Processing Systems},
editor = {A. Globerson and L. Mackey and D. Belgrave and A. Fan and U. Paquet and J. Tomczak and C. Zhang},
pages = {136763--136781},
publisher = {Curran Associates, Inc.},
url = {https://proceedings.neurips.cc/paper_files/paper/2024/file/f732683302d91e47610b2416b4977a66-Paper-Datasets_and_Benchmarks_Track.pdf},
volume = {37},
year = {2024}
}
We welcome contributions to dattri! Please see our Contributing Guide for details on how to get started, report issues, or submit pull requests.
This project is licensed under the MIT License - see the LICENSE file for details.
`dattri` is a PyTorch library for developing, benchmarking, and deploying efficient data attribution algorithms.
See the code
Quick Start | Algorithms | Metrics | Benchmark Settings | Benchmark Results
dattri is a PyTorch library for developing, benchmarking, and deploying efficient data attribution algorithms. You may use dattri to
pip install dattri
If you want to use sjlt to accelerate the random projection, you may install the version with sjlt by
pip install dattri[sjlt]
[!NOTE] It's highly recommended using a device support CUDA to run dattri, especially for large models or datasets.
[!NOTE] It's required to have CUDA if you want to install and use the sjlt version
dattri[sjlt]to accelerate the random projection.
It's not required to follow the exact same steps in this section. But this is a verified environment setup flow that may help users to avoid most of the issues during the installation.
conda create -n dattri python=3.10
conda activate dattri
conda install -c "nvidia/label/cuda-12.4.0" cuda-toolkit
pip3 install torch==2.6.0 --index-url https://download.pytorch.org/whl/cu124
pip install dattri[sjlt]
One can apply different data attribution methods to PyTorch Models. One only needs to define:
train_loader, test_loader).The following is an example of using IFAttributorCG and AttributionTask to apply data attribution to a PyTorch model.
Please reference here for the guide on how to properly define train/test data for Attributor and loss/target function.
More examples can be found here.
import torch
from torch import nn
from dattri.algorithm import IFAttributorCG
from dattri.task import AttributionTask
from dattri.benchmark.datasets.mnist import train_mnist_lr, create_mnist_dataset
from dattri.benchmark.utils import SubsetSampler
dataset_train, dataset_test = create_mnist_dataset("./data")
train_loader = torch.utils.data.DataLoader(
dataset_train,
batch_size=1000,
sampler=SubsetSampler(range(1000)),
)
test_loader = torch.utils.data.DataLoader(
dataset_test,
batch_size=100,
sampler=SubsetSampler(range(100)),
)
model = train_mnist_lr(train_loader)
def f(params, data_target_pair):
x, y = data_target_pair
loss = nn.CrossEntropyLoss()
yhat = torch.func.functional_call(model, params, x)
return loss(yhat, y)
task = AttributionTask(loss_func=f,
model=model,
checkpoints=model.state_dict())
attributor = IFAttributorCG(
task=task,
max_iter=10,
regularization=1e-2
)
attributor.cache(train_loader)
with torch.no_grad():
score = attributor.attribute(train_loader, test_loader)
Hessian-vector product (HVP), inverse-Hessian-vector product (IHVP) are widely used in data attribution methods. dattri provides efficient implementation to these operators by torch.func. This example shows how to use the CG implementation of the IHVP implementation.
import torch
from dattri.func.hessian import ihvp_cg, ihvp_at_x_cg
def f(x, param):
return torch.sin(x / param).sum()
x = torch.randn(2)
param = torch.randn(1)
v = torch.randn(5, 2)
# ihvp_cg method
ihvp_func = ihvp_cg(f, argnums=0, max_iter=2) # argnums=0 indicates that the param of (x, param) to be passed to ihvp_func is the model parameter
ihvp_result_1 = ihvp_func((x, param), v) # both (x, param) and v as the inputs
# ihvp_at_x_cg method: (x, param) is cached
ihvp_at_x_func = ihvp_at_x_cg(f, x, param, argnums=0, max_iter=2)
ihvp_result_2 = ihvp_at_x_func(v) # only v as the input
# the above two will give the same result
assert torch.allclose(ihvp_result_1, ihvp_result_2)
It has been shown that long vectors will retain most of their relative information when projected down to a smaller feature dimension. To reduce the computational cost, random projection is widely used in data attribution methods. Following is an example to use random_project. The implementation leverages sjlt.
from dattri.func.random_projection import random_project
# initialize the projector based on users' needs
project_func = random_project(tensor, tensor.size(0), proj_dim=512)
# obtain projected tensors
projected_tensor = project_func(torch.full_like(tensor))
Normally speaking, tensor is probably the gradient of the loss/target function and has a large dimension (i.e., the number of parameters).
Recent studies found that ensemble methods can significantly improve the performance of data attribution, DROPOUT ENSEMBLE is one of these ensemble methods. One may prepare their model with
from dattri.model_util.dropout import activate_dropout
# initialize a torch.nn.Module model
model = MLP()
# (option 1) activate all dropout layers
model = activate_dropout(model, dropout_prob=0.2)
# (option 2) activate specific dropout layers
# here "dropout1" and "dropout2" are the names of dropout layers within the model
model = activate_dropout(model, ["dropout1", "dropout2"], dropout_prob=0.2)
We have implemented most of the state-of-the-art methods. The categories and reference paper of the algorithms are listed in the following table.
| Family | Algorithms |
|---|---|
| IF | Explicit |
| CG | |
| LiSSA | |
| Arnoldi | |
| DataInf | |
| EK-FAC | |
| RelatIF | |
| LoGra | |
| GraSS | |
| TracIn | TracInCP |
| Grad-Dot | |
| Grad-Cos | |
| RPS | RPS-L2 |
| TRAK | TRAK |
| Shapley Value | KNN-Shapley |
| TSLOO | Data Value Embedding |
| Dataset | Model | Task | Sample Size (train, test) | Parameter Size | Metric | Data Source |
|---|---|---|---|---|---|---|
| MNIST-10 | LR | Image Classification | (5000,500) | 7840 | LOO/LDS/AUC | link |
| MNIST-10 | MLP | Image Classification | (5000,500) | 0.11M | LOO/LDS/AUC | link |
| CIFAR-2 | ResNet-9 | Image Classification | (5000,500) | 4.83M | LDS | link |
| CIFAR-10 | ResNet-9 | Image Classification | (5000,500) | 4.83M | AUC | link |
| MAESTRO | Music Transformer | Music Generation | (5000,178) | 13.3M | LDS | link |
| Shakespeare | nanoGPT | Text Generation | (3921,435) | 10.7M | LDS | link |
| wikitext2 | gpt2 | Text Generation | (4656,481) | 124M | LDS | link |



@inproceedings{deng2024dattri,
author = {Deng, Junwei and Li, Ting-Wei and Zhang, Shiyuan and Liu, Shixuan and Pan, Yijun and Huang, Hao and Wang, Xinhe and Hu, Pingbang and Zhang, Xingjian and Ma, Jiaqi},
title = {dattri: A Library for Efficient Data Attribution},
booktitle = {Advances in Neural Information Processing Systems},
editor = {A. Globerson and L. Mackey and D. Belgrave and A. Fan and U. Paquet and J. Tomczak and C. Zhang},
pages = {136763--136781},
publisher = {Curran Associates, Inc.},
url = {https://proceedings.neurips.cc/paper_files/paper/2024/file/f732683302d91e47610b2416b4977a66-Paper-Datasets_and_Benchmarks_Track.pdf},
volume = {37},
year = {2024}
}
We welcome contributions to dattri! Please see our Contributing Guide for details on how to get started, report issues, or submit pull requests.
This project is licensed under the MIT License - see the LICENSE file for details.