torch (1.13.0)
numpy (1.21.4)
setLayerInfo
-
Description
๋ณธ module์ ์ฌ์ฉํ๊ธฐ ์ํด์, model์ ๋ถ๋ฌ์ค๊ณ inference๋ฅผ ์์ํ๊ธฐ ์ ์ ๊ผญ ์ํํด์ผ ํ๋ ์์
(injection overhead ์ต์ํ ๋ฑ์ ๋ชฉ์ )
์ดํ์ ๊ธฐ์ ๋๋ ๋ชจ๋ ๋ฉ์๋๋ค์ ์ฌ์ฉํ๊ธฐ ์ , ๋ค์ ์์ ์ด ์ ํ๋์ด์ผ ํ๋ค:
* ์ดํ ๊ธฐ์ ๋๋ ๋ฉ์๋๋ค์ ์ฌ์ฉํ ๋๋, FS().method()์ฒ๋ผ ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋,
์๋ ์์์ ๊ฐ์ด ๊ธฐ์กด์ ๋ณ์์ ํ ๋นํด ๋ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํด์ผ ํจimport vgg16 import FS model = vgg16() fault_sim = FS() fault_sim.setLayerInfo(model) ... fault_sim.onlineSingleLayerOutputInjection(...)
-
parameters
- model: torch.nn.Module (required)
bit flip์ ์ฃผ์ ํ ๋ชจ๋ธ
- model: torch.nn.Module (required)
-
return value
- None
onlineSingleLayerOutputInjection
-
parameters
-
model: torch.nn.Module (required)
bit flip์ ์ฃผ์ ํ ๋ชจ๋ธ -
errorRate: float (required *)
Layer output์ค bit flip์ ๋์์ด ๋ neuron์ ๋น์จ
ex) layer output=100,000๊ฐ, errorRate์ด 0.1์ด๋ผ๋ฉด ์ด 10,000๋ฒ์ bit flip ๋ฐ์
* NofError์ ๊ฐ์ด ์ฌ์ฉ๋ ์ ์์ -
NofError: int (required *)
Layer output์ค bit flip์ ๋์์ด ๋ neuron์ ๊ฐ์
ex) layer output=100,000๊ฐ, errorRate์ด 100์ด๋ผ๋ฉด ์ด 100๋ฒ์ bit flip ๋ฐ์
* errorRate์ ๊ฐ์ด ์ฌ์ฉ๋ ์ ์์ -
targetBit: int or "random" (required)
bit flip์ด ๋ฐ์ํ๋ bit position์ ํน์ ํ ์ ์์
32bit float ์๋ฃํ์ ์ฌ์ฉํ๋ ๋ชจ๋ธ์ ๊ฒฝ์ฐ 0~31๋ก ์ง์ ๊ฐ๋ฅ
๋๋คํ bit position์ ์๋ฌ๋ฅผ ์ฃผ์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ "random" ๋ฌธ์์ด ์ ๋ฌ -
targetLayer: str or "random" (required)
target์ด ๋๋ layer๋ฅผ ์ง์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ง์ ๊ฐ๋ฅ
๋ณธ module ๋ด getModuleNameList ๋ฉ์๋์ ๋ฐํ๊ฐ ์ค ํ๋๋ฅผ ์ ํํด ์ ๋ฌ
target์ด ๋๋ layer๋ฅผ ๋๋คํ๊ฒ ์ง์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ "random" ๋ฌธ์์ด์ ๊ผญ ์ ๋ฌํด์ผ ํจ -
targetLayerTypes: list<Layer class> (optional)
target์ด ๋๋ layer์ ์ข ๋ฅ๋ฅผ ์ง์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉ
ex) conv2d layer๋ค๋ง target์ผ๋ก ์ ํํ๊ณ ์ถ์ ๊ฒฝ์ฐ, ๋น ๋ฆฌ์คํธ ์์ torch.nn.Conv2d ํด๋์ค๋ฅผ ๋ฃ์ด ์ ๋ฌ,
์ฌ๋ฌ ํ์ ์ ์ง์ ํ๋ ๊ฒ ๋ํ ๊ฐ๋ฅ
-
-
return value
- torch.utils.hooks.RemovableHandle
layer์ ์ค์ ๋ hook์ ์ ๊ฑฐํ ์ ์๋ handle
remove() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด hook์ ์ ๊ฑฐํ ์ ์์ผ๋ฉฐ,
๋งค inference๋ง๋ค injection ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ, inference๊ฐ ๋๋ ๋ค ๊ผญ remove()๋ฅผ ํธ์ถํด์ค์ผ ํจ
(๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ hook์ด ์ค์ฒฉ๋์ด inference ํ์๋งํผ injection์ด ์ถ๊ฐ๋ก ์คํ๋จ)
- torch.utils.hooks.RemovableHandle
onLineSingleLayerInputInjection
-
parameters
-
model: torch.nn.Module (required)
bit flip์ ์ฃผ์ ํ ๋ชจ๋ธ -
errorRate: float (required *)
Layer output์ค bit flip์ ๋์์ด ๋ neuron์ ๋น์จ
ex) layer output=100,000๊ฐ, errorRate์ด 0.1์ด๋ผ๋ฉด ์ด 10,000๋ฒ์ bit flip ๋ฐ์
* NofError์ ๊ฐ์ด ์ฌ์ฉ๋ ์ ์์ -
NofError: int (required *)
Layer output์ค bit flip์ ๋์์ด ๋ neuron์ ๊ฐ์
ex) layer output=100,000๊ฐ, errorRate์ด 100์ด๋ผ๋ฉด ์ด 100๋ฒ์ bit flip ๋ฐ์
* errorRate์ ๊ฐ์ด ์ฌ์ฉ๋ ์ ์์ -
targetBit: int or "random" (required)
bit flip์ด ๋ฐ์ํ๋ bit position์ ํน์ ํ ์ ์์
32bit float ์๋ฃํ์ ์ฌ์ฉํ๋ ๋ชจ๋ธ์ ๊ฒฝ์ฐ 0~31๋ก ์ง์ ๊ฐ๋ฅ
๋๋คํ bit position์ ์๋ฌ๋ฅผ ์ฃผ์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ "random" ๋ฌธ์์ด ์ ๋ฌ -
targetLayer: str or "random" (required)
target์ด ๋๋ layer๋ฅผ ์ง์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ง์ ๊ฐ๋ฅ
๋ณธ module ๋ด getModuleNameList ๋ฉ์๋์ ๋ฐํ๊ฐ ์ค ํ๋๋ฅผ ์ ํํด ์ ๋ฌ
target์ด ๋๋ layer๋ฅผ ๋๋คํ๊ฒ ์ง์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ "random" ๋ฌธ์์ด์ ๊ผญ ์ ๋ฌํด์ผ ํจ -
targetLayerTypes: list<Layer class> (optional)
target์ด ๋๋ layer์ ์ข ๋ฅ๋ฅผ ์ง์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉ
ex) conv2d layer๋ค๋ง target์ผ๋ก ์ ํํ๊ณ ์ถ์ ๊ฒฝ์ฐ, ๋น ๋ฆฌ์คํธ ์์ torch.nn.Conv2d ํด๋์ค๋ฅผ ๋ฃ์ด ์ ๋ฌ,
์ฌ๋ฌ ํ์ ์ ์ง์ ํ๋ ๊ฒ ๋ํ ๊ฐ๋ฅ
-
-
return value
- torch.utils.hooks.RemovableHandle
layer์ ์ค์ ๋ hook์ ์ ๊ฑฐํ ์ ์๋ handle
remove() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด hook์ ์ ๊ฑฐํ ์ ์์ผ๋ฉฐ,
๋งค inference๋ง๋ค injection ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ, inference๊ฐ ๋๋ ๋ค ๊ผญ remove()๋ฅผ ํธ์ถํด์ค์ผ ํจ
(๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ hook์ด ์ค์ฒฉ๋์ด inference ํ์๋งํผ injection์ด ์ถ๊ฐ๋ก ์คํ๋จ)
- torch.utils.hooks.RemovableHandle
offlineSinglayerWeightInjection
-
parameters
-
model: torch.nn.Module (required)
bit flip์ ์ฃผ์ ํ ๋ชจ๋ธ -
errorRate: float (required *)
Layer output์ค bit flip์ ๋์์ด ๋ neuron์ ๋น์จ
ex) layer output=100,000๊ฐ, errorRate์ด 0.1์ด๋ผ๋ฉด ์ด 10,000๋ฒ์ bit flip ๋ฐ์
* NofError์ ๊ฐ์ด ์ฌ์ฉ๋ ์ ์์ -
NofError: int (required *)
Layer output์ค bit flip์ ๋์์ด ๋ neuron์ ๊ฐ์
ex) layer output=100,000๊ฐ, errorRate์ด 100์ด๋ผ๋ฉด ์ด 100๋ฒ์ bit flip ๋ฐ์
* errorRate์ ๊ฐ์ด ์ฌ์ฉ๋ ์ ์์ -
targetBit: int or "random" (required)
bit flip์ด ๋ฐ์ํ๋ bit position์ ํน์ ํ ์ ์์
32bit float ์๋ฃํ์ ์ฌ์ฉํ๋ ๋ชจ๋ธ์ ๊ฒฝ์ฐ 0~31๋ก ์ง์ ๊ฐ๋ฅ
๋๋คํ bit position์ ์๋ฌ๋ฅผ ์ฃผ์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ "random" ๋ฌธ์์ด ์ ๋ฌ -
targetLayer: str or "random" (required)
target์ด ๋๋ layer๋ฅผ ์ง์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ง์ ๊ฐ๋ฅ
๋ณธ module ๋ด getModuleNameList ๋ฉ์๋์ ๋ฐํ๊ฐ ์ค ํ๋๋ฅผ ์ ํํด ์ ๋ฌ
target์ด ๋๋ layer๋ฅผ ๋๋คํ๊ฒ ์ง์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ "random" ๋ฌธ์์ด์ ๊ผญ ์ ๋ฌํด์ผ ํจ -
accumulate: bool (required)
weight์ ์ฃผ์ ๋ ์๋ฌ๋ layer์ input, output๊ณผ ๋ค๋ฅด๊ฒ inference๊ฐ ๋๋ ๋ค์๋ model์ ์๋ฅํจ
์ด๋ฅผ ์ ์ง(๋์ )ํ ์ง, ๋ณต์ํ ์ง ์ ํํ ์ ์๋ parameter
accumulate=True๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ hard error(stuck-at)๋ฅผ ๊ตฌํํ ์๋ ์์ -
targetLayerTypes: list<Layer class> (optional)
target์ด ๋๋ layer์ ์ข ๋ฅ๋ฅผ ์ง์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉ
ex) conv2d layer๋ค๋ง target์ผ๋ก ์ ํํ๊ณ ์ถ์ ๊ฒฝ์ฐ, ๋น ๋ฆฌ์คํธ ์์ torch.nn.Conv2d ํด๋์ค๋ฅผ ๋ฃ์ด ์ ๋ฌ,
์ฌ๋ฌ ํ์ ์ ์ง์ ํ๋ ๊ฒ ๋ํ ๊ฐ๋ฅ
-
-
return value
- None
gatherAllNeuronValues
getLog
-
parameter
- None
-
return value
-
list
๊ฐ injection์ ๋ํ ์ ์ฒด log๊ฐ ํฌํจ๋ ๋ฐฐ์ด์ ๋ฐํ
๊ฐ ํ๋๋ ์ฝ๋ก (:)์ผ๋ก ๊ตฌ๋ถ๋๋ฉฐ, ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์:
{0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}0: target layer์ index (๋ช ๋ฒ์งธ layer์ธ์ง)
1: target layer์ ์ ๋ณด
2: target neuron/weight์ "1์ฐจ์" index
3: target bit์ index
4: target neuron/weight์ ์๋ณธ ๊ฐ (2์ง ํํ)
5: target neuron/weight์ ์๋ณธ ๊ฐ (10์ง ํํ)
6: bit flip ์ฃผ์ ์ดํ target neuron/weight์ ๊ฐ (2์ง ํํ)
7: bit flip ์ฃผ์ ์ดํ target neuron/weight์ ๊ฐ (10์ง ํํ)
-
from Models.VGGModel import VGG, vgg16_bn
testset = torchvision.datasets.CIFAR10(root=os.path.dirname(__file__)+'/../Datasets/CIFAR10/data', train=False, download=True, transform=transform)
testloader = DataLoader(testset, batch_size=1, shuffle=True)
model = vgg16_bn().cuda()
model.load_state_dict(torch.load(os.path.dirname(__file__)+"/../Models/trained/vgg16_bn.pt"))
model.eval()
fs = FS()
fs.setLayerInfo(model)
with torch.no_grad():
for data in testloader:
inputs, labels = data[0].cuda(), data[1].cuda()
handle = fs.onlineSingleLayerOutputInjection(model=model, targetLayerTypes=[torch.nn.ReLU], NofError=1, targetBit=1)
outputs = model(inputs)
handle.remove()