Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,7 @@ site
.coverage
runs
dist
build/
.venv/
*.pyc
*.egg-info
2 changes: 1 addition & 1 deletion docs/basic_faultinjection.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
For example, the following code perform a quantized random integer bit flip injection on LeNet.

```python title="Setup LeNet default fault injection"
from dataset.lenet_cifar import make_testloader, LeNet
from mrfi_dataset.lenet_cifar import make_testloader, LeNet
from mrfi import MRFI, EasyConfig
from mrfi.experiment import Acc_experiment, Acc_golden, BER_Acc_experiment

Expand Down
2 changes: 1 addition & 1 deletion docs/example_layerwise.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Additionally, if the GPU is available, the following code automatically uses CUD

```python
import torch
from dataset.lenet_cifar import testset, Net
from mrfi_dataset.lenet_cifar import testset, Net
from mrfi import MRFI, EasyConfig
import sys

Expand Down
2 changes: 1 addition & 1 deletion experiments/lenet_FI_observe.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from dataset.lenet_cifar import make_testloader, LeNet
from mrfi_dataset.lenet_cifar import make_testloader, LeNet
from mrfi import MRFI, EasyConfig
from mrfi.experiment import observeFI_experiment, observeFI_experiment_plus
import matplotlib.pyplot as plt
Expand Down
2 changes: 1 addition & 1 deletion experiments/lenet_basic_observe.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"import matplotlib.pyplot as plt\n",
"import torch\n",
"\n",
"from dataset.lenet_cifar import LeNet, make_testloader\n",
"from mrfi_dataset.lenet_cifar import LeNet, make_testloader\n",
"from mrfi import MRFI, EasyConfig\n",
"from mrfi.experiment import get_activation_info, get_weight_info"
]
Expand Down
2 changes: 1 addition & 1 deletion experiments/lenet_basic_observe.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import matplotlib.pyplot as plt
import torch

from dataset.lenet_cifar import LeNet, make_testloader
from mrfi_dataset.lenet_cifar import LeNet, make_testloader
from mrfi import MRFI, EasyConfig
from mrfi.experiment import get_activation_info, get_weight_info

Expand Down
2 changes: 1 addition & 1 deletion experiments/lenet_float.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from dataset.lenet_cifar import make_testloader, Net
from mrfi_dataset.lenet_cifar import make_testloader, Net
from mrfi import MRFI, EasyConfig
from mrfi.experiment import BER_Acc_experiment, logspace_density
import matplotlib.pyplot as plt
Expand Down
2 changes: 1 addition & 1 deletion experiments/lenet_layerwise.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import torch
from dataset.lenet_cifar import testset, Net
from mrfi_dataset.lenet_cifar import testset, Net
from mrfi import MRFI, EasyConfig
import sys

Expand Down
2 changes: 1 addition & 1 deletion experiments/lenet_scale_BER_Acc.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from dataset.lenet_cifar import make_testloader, Net
from mrfi_dataset.lenet_cifar import make_testloader, Net
from mrfi import MRFI, EasyConfig
from mrfi.experiment import BER_Acc_experiment, logspace_density
import matplotlib.pyplot as plt
Expand Down
2 changes: 1 addition & 1 deletion experiments/lenet_visualize.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from dataset.lenet_cifar import make_testloader, LeNet, testset
from mrfi_dataset.lenet_cifar import make_testloader, LeNet, testset
from mrfi import MRFI, EasyConfig
from mrfi.experiment import get_activation_info, observeFI_experiment_plus, Acc_golden, Acc_experiment
import matplotlib.pyplot as plt
Expand Down
2 changes: 1 addition & 1 deletion experiments/poisson_sample.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
'''Compare speed of poisson_sample'''
from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from mrfi.experiment import BER_Acc_experiment, logspace_density, Acc_golden
from torchvision.models import resnet18
Expand Down
2 changes: 1 addition & 1 deletion experiments/resnet18_BER_Acc.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from mrfi.experiment import BER_Acc_experiment, logspace_density, Acc_golden, benchmark_range
import matplotlib.pyplot as plt
Expand Down
2 changes: 1 addition & 1 deletion experiments/resnet18_activation.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'''
Conduct BER_Acc experiemnt on resnet18 with different datatype.
'''
from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from mrfi.experiment import BER_Acc_experiment, logspace_density, Acc_golden, get_activation_info
from torchvision.models import resnet18
Expand Down
2 changes: 1 addition & 1 deletion experiments/resnet18_floatbit.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from mrfi.experiment import BER_Acc_experiment, logspace_density, Acc_golden
import matplotlib.pyplot as plt
Expand Down
2 changes: 1 addition & 1 deletion experiments/resnet18_pixelwise.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from mrfi.experiment import get_activation_info, observeFI_experiment_plus, Acc_experiment
from torchvision.models import resnet18
Expand Down
2 changes: 1 addition & 1 deletion experiments/resnet18_qbit.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from mrfi.experiment import BER_Acc_experiment, logspace_density, Acc_golden
import matplotlib.pyplot as plt
Expand Down
2 changes: 1 addition & 1 deletion experiments/resnet18_weight.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from mrfi.experiment import BER_Acc_experiment, logspace_density, Acc_golden, get_weight_info
from torchvision.models import resnet18
Expand Down
2 changes: 1 addition & 1 deletion experiments/torchvision_classify_activation.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from mrfi.experiment import Acc_golden, Acc_experiment, get_activation_info
from torchvision.models import alexnet
Expand Down
2 changes: 1 addition & 1 deletion experiments/vgg11_channelwise.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from mrfi.experiment import observeFI_experiment_plus, get_activation_info
from torchvision.models import vgg11
Expand Down
2 changes: 1 addition & 1 deletion experiments/vgg11_floatbit_cnt.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from torchvision.models import vgg11
import torch
Expand Down
2 changes: 1 addition & 1 deletion experiments/vgg11_pixelwise.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from mrfi.experiment import get_activation_info, observeFI_experiment_plus, Acc_experiment
from torchvision.models import vgg11
Expand Down
2 changes: 1 addition & 1 deletion experiments/vgg11_speedtest.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from mrfi.experiment import Acc_experiment, Acc_golden
from torchvision.models import vgg11
Expand Down
2 changes: 1 addition & 1 deletion experiments/vgg11_spread.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from mrfi.experiment import get_activation_info, observeFI_experiment_plus, Acc_experiment
from torchvision.models import vgg11
Expand Down
2 changes: 1 addition & 1 deletion experiments/vgg16_activation.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from mrfi.experiment import BER_Acc_experiment, logspace_density, Acc_golden, get_activation_info
from torchvision.models import vgg16
Expand Down
2 changes: 1 addition & 1 deletion experiments/vgg16_fixnum.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from mrfi.experiment import Acc_golden, Acc_experiment
from torchvision.models import vgg16
Expand Down
2 changes: 1 addition & 1 deletion experiments/vgg16_floatbit_cnt.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from torchvision.models import vgg11
import torch
Expand Down
2 changes: 1 addition & 1 deletion experiments/vgg16_weight.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

from dataset.imagenet import make_testloader
from mrfi_dataset.imagenet import make_testloader
from mrfi import MRFI, EasyConfig
from mrfi.experiment import BER_Acc_experiment, logspace_density, Acc_golden, get_weight_info
from torchvision.models import vgg16
Expand Down
26 changes: 21 additions & 5 deletions mrfi/mrfi.py
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,9 @@ def _FI_activation(config, act):
modifier = named_functions[config.error_mode.method]
modifier_args = config.error_mode.args.raw_dict

values = act.view(-1)[error_list]
error_idx = error_list.to(act.device) if isinstance(error_list, torch.Tensor) else error_list

values = act.view(-1)[error_idx]

if fi_quantization:
quantization_method.quantize(values, **quantization_args)
Expand All @@ -345,7 +347,7 @@ def _FI_activation(config, act):
if fi_quantization:
quantization_method.dequantize(fi_value, **quantization_args)

act.view(-1)[error_list] = fi_value
act.view(-1)[error_idx] = fi_value

if layerwise_quantization:
quantization_method.dequantize(act, **quantization_args)
Expand Down Expand Up @@ -405,7 +407,9 @@ def _FI_weight(config, weight):
modifier = named_functions[config.error_mode.method]
modifier_args = config.error_mode.args.raw_dict

values = weight.view(-1)[error_list]
error_idx = error_list.to(weight.device) if isinstance(error_list, torch.Tensor) else error_list

values = weight.view(-1)[error_idx]

if fi_quantization:
quantization_method.quantize(values, **quantization_args)
Expand All @@ -415,7 +419,7 @@ def _FI_weight(config, weight):
if fi_quantization:
quantization_method.dequantize(fi_value, **quantization_args)

weight.view(-1)[error_list] = fi_value
weight.view(-1)[error_idx] = fi_value

if layerwise_quantization:
quantization_method.dequantize(weight, **quantization_args)
Expand Down Expand Up @@ -518,7 +522,19 @@ def __init__(self, model: nn.Module, config: Union[str, EasyConfig]) -> None:
if isinstance(config, EasyConfig):
self.config = self.__expand_config(config)
elif isinstance(config, str):
self.config = ConfigTree(_read_config(config), self)
treedict = self.__empty_configtree(self.model)
user_config = _read_config(config)

def update_dict(d, u):
for k, v in u.items():
if isinstance(v, dict) and isinstance(d.get(k, None), dict):
update_dict(d[k], v)
else:
d[k] = v

update_dict(treedict, user_config)
self.config = ConfigTree(treedict, self)
self.__add_moduleconfig(self.config, self.model)
else:
raise TypeError(config)

Expand Down
Empty file added mrfi_dataset/__init__.py
Empty file.
19 changes: 15 additions & 4 deletions dataset/cnn_exp.py → mrfi_dataset/cnn_exp.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,16 @@
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

trainset = torchvision.datasets.CIFAR10(root='./_data', train=True,
try:
import os
datapath = os.environ['DATASETS'] + '/cifar10'
except Exception:
import os
datapath = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), '_data')

trainset = torchvision.datasets.CIFAR10(root=datapath, train=True,
download=False, transform=transform)
testset = torchvision.datasets.CIFAR10(root='./_data', train=False,
testset = torchvision.datasets.CIFAR10(root=datapath, train=False,
download=False, transform=transform)
classes = ('plane', 'car', 'bird', 'cat',
'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
Expand Down Expand Up @@ -101,14 +108,18 @@ def train():

print('Finished Training')

torch.save(net.state_dict(), 'cifar_vgg.pth')
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
torch.save(net.state_dict(), os.path.join(dir_path, 'cifar_vgg.pth'))

def test():
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
net = Net()
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False)
net.load_state_dict(torch.load('cifar_vgg.pth'))
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
net.load_state_dict(torch.load(os.path.join(dir_path, 'cifar_vgg.pth')))
net.eval()

correct = 0
Expand Down
2 changes: 2 additions & 0 deletions dataset/imagenet.py → mrfi_dataset/imagenet.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
testset = None

def get_testset(folder = '~/dataset/val'):
import os
folder = os.path.expanduser(folder)
global testset
if testset is None:
testset = datasets.ImageFolder(folder, tf)
Expand Down
15 changes: 11 additions & 4 deletions dataset/lenet_cifar.py → mrfi_dataset/lenet_cifar.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
import os
datapath = os.environ['DATASETS'] + '/cifar10'
except Exception:
datapath = './_data'
import os
datapath = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), '_data')

trainset = torchvision.datasets.CIFAR10(root=datapath, train=True,
download=True, transform=transform)
Expand Down Expand Up @@ -43,7 +44,9 @@ def __init__(self, trained = False):
self.fc2 = nn.Linear(120,84)
self.fc3 = nn.Linear(84,10)
if trained:
self.load_state_dict(torch.load('./dataset/lenet_cifar10.pth'))
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
self.load_state_dict(torch.load(os.path.join(dir_path, 'lenet_cifar10.pth')))

def forward(self,x):
x = F.max_pool2d(F.relu(self.conv1(x)),(2,2))
Expand Down Expand Up @@ -90,13 +93,17 @@ def train():

print('Finished Training')

torch.save(net.state_dict(), 'cifar10.pth')
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
torch.save(net.state_dict(), os.path.join(dir_path, 'cifar10.pth'))

def test():
net=Net()
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False)
net.load_state_dict(torch.load('cifar10.pth'))
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
net.load_state_dict(torch.load(os.path.join(dir_path, 'cifar10.pth')))
net.eval()

correct = 0
Expand Down
File renamed without changes.
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ dependencies = [
"scipy",
"torch>=1.9",
]
version = "2.0.0"
version = "2.1.0"

[tool.setuptools]
packages = ["mrfi"]
packages = ["mrfi", "mrfi_dataset"]

[project.urls]
Homepage = "https://github.com/fffasttime/MRFI"
Expand Down
2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ The following code perform a quantized random integer bit flip injection on LeNe
and find the relation between bit error rate (BER) and classification accuracy.

```python title="LeNet default fault injection"
from dataset.lenet_cifar import make_testloader, LeNet
from mrfi_dataset.lenet_cifar import make_testloader, LeNet
from mrfi import MRFI, EasyConfig
from mrfi.experiment import Acc_experiment, Acc_golden, BER_Acc_experiment

Expand Down
2 changes: 1 addition & 1 deletion test/test_addfunc.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
sys.path.append('.')
from mrfi import experiment
import torch
from dataset.lenet_cifar import make_testloader, Net
from mrfi_dataset.lenet_cifar import make_testloader, Net
from mrfi import MRFI, EasyConfig, load_package_functions, add_function

class NoQuantization:
Expand Down
2 changes: 1 addition & 1 deletion test/test_experiment.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
sys.path.append('.')
from mrfi import experiment
import torch
from dataset.lenet_cifar import make_testloader, Net
from mrfi_dataset.lenet_cifar import make_testloader, Net
from mrfi import MRFI, EasyConfig

def test_00():
Expand Down
Loading