PytorchFS

Pytorch Fault Simulator


Keywords
pytorchFS, 4thMemorize, python, fault, pytorch, injection, simulator
Install
pip install PytorchFS==1.1.2

Documentation

Pytorch Fault Simulator

Requirements

torch (1.13.0)
numpy (1.21.4)

Methods

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์„ ์ฃผ์ž…ํ•  ๋ชจ๋ธ
  • 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์ด ์ถ”๊ฐ€๋กœ ์‹คํ–‰๋จ)

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์ด ์ถ”๊ฐ€๋กœ ์‹คํ–‰๋จ)

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์ง„ ํ‘œํ˜„)

Example

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()