-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathbits.py
145 lines (114 loc) · 4.92 KB
/
bits.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import dl_models
import argparse
import sys
import cProfile
import hickle
import copy
import random
from dl_models.models.base import *
from dl_models.models import mnistFC
from dl_models.models import mnistLenet5
from dl_models.models import svhnLenet5
from dl_models.models import imagenetVGG16
from dl_models.models import imagenetResNet50
from dl_models.models import imagenetInceptionv3
from dl_models.models import cifar10VGG
from dl_models.models import tidigitsGRU
from dl_models.models import tidigitsRNN
from dl_models.models import tidigitsLSTM
from dl_models.models import cifar10alexnet
model_class_map = {
'mnist_lenet5' : mnistLenet5,
'mnist_fc' : mnistFC,
'svhn_lenet5' : svhnLenet5,
'imagenet_vgg16' : imagenetVGG16,
'imagenet_resnet50' : imagenetResNet50,
'cifar10_vgg' : cifar10VGG,
'tidigits_gru' : tidigitsGRU,
'tidigits_rnn' : tidigitsRNN,
'tidigits_lstm' : tidigitsLSTM,
'imagenet_inceptionv3' : imagenetInceptionv3,
'cifar10_alexnet' : cifar10alexnet,
}
def cli():
# Default message.
parser = argparse.ArgumentParser(description='Bit level fault injection experiment', \
epilog='Configure your experiment from the command line.')
parser.add_argument('-m', '--model', required=True, type=str, \
help='Pick a model to run. Models listed in models/model_config.py')
parser.add_argument('-lw', '--load_weights', action='store_true', help='Load saved weights from cache.')
parser.add_argument('-ld_name', '--weight_name', default=None, type=str, \
help='Specifiy the weights to use.')
parser.add_argument('-qi', '--qi', default=2, type=int, help='Integer bits for quantization')
parser.add_argument('-qf', '--qf', default=6, type=int, help='Fractional bits for quantization')
parser.add_argument('-seed', '--seed', default=0xdeadbeef, type=int, help='Random seed for bit-level fault injector')
parser.add_argument('-frate', '--frate', default=0.0001, type=float, help='Fault Rate')
parser.add_argument('-c','--configuration', type=str, default=None, help='Specify a configuration file.')
parser.add_argument('-cache','--cache', type=str, default=None, help='Specify a cache dir.')
parser.add_argument('-results','--results', type=str, default=None, help='Specify results dir.')
args = parser.parse_args()
return args
def load_and_build(model, args):
# build the model
model.load_dataset()
model.build_model()
model.compile_model()
if args.load_weights:
model.load_weights(args.weight_name, absolute=True)
def exp(model, args):
load_and_build(model, args)
mask = [ True for layer in model.get_layers()]
#retrain = dl_models.transform.Retraining(layer_mask=mask)
sparsity = dl_models.transform.SummarizeSparsity(mode='both')
distrib = dl_models.transform.SummarizeDistribution()
#retrain.config(model)
print("=====================================================================")
print('(0) Model Topology')
print()
for layer in model.get_layers():
print(' ->',layer[0],':',layer[1].size())
print('(1) Base model')
print()
err = model.eval_model()
print('(1) error:',err)
print()
sparsity(model)
print('(1) sparsity:',sparsity.get_summary())
print()
distrib(model)
print('(1) distribution:',distrib.get_summary())
print()
layer_mask = [ True for layer in model.get_layers()]
random_fault_injector = dl_models.transform.RandomFault(layer_mask, seed=args.seed,
frac=args.frate,
random_addrs=True,
fault_type='bit',
int_bits=args.qi,
frac_bits=args.qf)
random_fault_injector(model)
err = model.eval_model()
print('(2) error after bit injection:',err)
dargs = vars(args)
for key in list(dargs.keys()):
print("::::", key, dargs[key])
print("::::", "error", err)
def config_setup(args):
if args.configuration is not None:
print("[Conf] Using configuration from:" + args.configuration)
Conf.load(Conf.find_config(args.configuration))
else:
print("[Conf] Using default environment configuration")
Conf.set_env_default()
if args.cache is not None:
Conf.set('cache', args.cache)
if args.results is not None:
Conf.set('results', args.results)
if __name__=='__main__':
args = cli()
np.random.seed(args.seed)
config_setup(args)
model_name = args.model
ModelClass = model_class_map[model_name]
model = ModelClass()
print('Experimenting with model: %s' % model.model_name)
exp(model, args)