# Fault Tolerant RRAM-Based Neuromorphic Computing with Static and Dynamic Variations ###### tags: `paper` [TOC] ## 12/17 ### goal : traicing `main.py` * [source](https://hackmd.io/@hsieh22/fault_tolerant_rram_src1) ### function and purpose * parser * function : define parameter and control program by input * each parameter has clearly defined in src (in help field) * class * quantize_opts * default mode is `none`, width is `-1`, base is `-1` * user can choose quantize or not * LeNet * case situation: * decide which structure should be used, there are eight modules * because this work solve static variation through adding a new layer after normal input to adjust weight, so we have to modified original structure, the followong eight structures use in this work. * resnet18 * resnet34 * mobilenet * lenet * inputmap_vgg11_bn - specific module to fit this work * inputmap_vgg16_bn - specific module to fit this work * inputmap_resnet18 - specific module to fit this work * inputmap_resnet34 - specific module to fit this work * CUDA * what is CUDA ? Excerpt from [CUDA](https://blogs.nvidia.com/blog/2012/09/10/what-is-cuda-2/) > CUDA is a parallel computing platform and programming model that makes using a GPU for general purpose computing simple and elegant. The developer still programs in the familiar C, C++, Fortran, or an ever expanding list of supported languages, and incorporates extensions of these languages in the form of a few basic keywords. ## 12/10 ### environment setting * deploy on `140.116.245.115` ``` Linux gpuserval-System-Product-Name 4.15.0-123-generic #126-Ubuntu SMP Wed Oct 21 09:40:11 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux ``` * python version ( default python version is 2.6, we have to change to 3.6 through adding alias ) ``` Python 3.6.9 ``` * create python virtual environment ``` $apt-get update $apt-get install python-virtualenv $virtualenv -p /usr/bin/python3 virtualenv/project_name $cd virtualenv/project_name/bin $source activate ``` * install tool, check this [website](https://pytorch.org/) to get suitable version and install * check CUDA version by `nvidia-sim` ``` pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html ``` * then we can run `main.py` ``` python main.py ``` training result :::spoiler ``` (Epoch - 0) Accuracy on Trainset: 36.08 % (Epoch - 0) Accuracy on Testset: 49.57 % (Epoch - 1) Accuracy on Trainset: 55.62 % (Epoch - 1) Accuracy on Testset: 62.31 % (Epoch - 2) Accuracy on Trainset: 64.38 % (Epoch - 2) Accuracy on Testset: 62.48 % (Epoch - 3) Accuracy on Trainset: 69.50 % (Epoch - 3) Accuracy on Testset: 67.22 % (Epoch - 4) Accuracy on Trainset: 73.15 % (Epoch - 4) Accuracy on Testset: 67.53 % (Epoch - 5) Accuracy on Trainset: 75.67 % (Epoch - 5) Accuracy on Testset: 74.35 % (Epoch - 6) Accuracy on Trainset: 77.86 % (Epoch - 6) Accuracy on Testset: 74.34 % (Epoch - 7) Accuracy on Trainset: 79.13 % (Epoch - 7) Accuracy on Testset: 78.17 % (Epoch - 8) Accuracy on Trainset: 80.77 % (Epoch - 8) Accuracy on Testset: 77.79 % (Epoch - 9) Accuracy on Trainset: 81.57 % (Epoch - 9) Accuracy on Testset: 77.85 % (Epoch - 10) Accuracy on Trainset: 82.97 % (Epoch - 10) Accuracy on Testset: 78.25 % (Epoch - 11) Accuracy on Trainset: 83.63 % (Epoch - 11) Accuracy on Testset: 79.39 % (Epoch - 12) Accuracy on Trainset: 84.54 % (Epoch - 12) Accuracy on Testset: 80.11 % (Epoch - 13) Accuracy on Trainset: 85.28 % (Epoch - 13) Accuracy on Testset: 80.85 % (Epoch - 14) Accuracy on Trainset: 85.90 % (Epoch - 14) Accuracy on Testset: 79.88 % (Epoch - 15) Accuracy on Trainset: 86.47 % (Epoch - 15) Accuracy on Testset: 82.08 % (Epoch - 16) Accuracy on Trainset: 87.16 % (Epoch - 16) Accuracy on Testset: 84.93 % (Epoch - 17) Accuracy on Trainset: 87.41 % (Epoch - 17) Accuracy on Testset: 84.79 % (Epoch - 18) Accuracy on Trainset: 87.83 % (Epoch - 18) Accuracy on Testset: 84.20 % (Epoch - 19) Accuracy on Trainset: 88.03 % (Epoch - 19) Accuracy on Testset: 83.65 % (Epoch - 20) Accuracy on Trainset: 88.40 % (Epoch - 20) Accuracy on Testset: 81.61 % (Epoch - 21) Accuracy on Trainset: 88.51 % (Epoch - 21) Accuracy on Testset: 83.12 % (Epoch - 22) Accuracy on Trainset: 89.12 % (Epoch - 22) Accuracy on Testset: 82.92 % (Epoch - 23) Accuracy on Trainset: 89.04 % (Epoch - 23) Accuracy on Testset: 84.11 % (Epoch - 24) Accuracy on Trainset: 89.53 % (Epoch - 24) Accuracy on Testset: 82.76 % (Epoch - 25) Accuracy on Trainset: 89.45 % (Epoch - 25) Accuracy on Testset: 85.83 % (Epoch - 26) Accuracy on Trainset: 89.76 % (Epoch - 26) Accuracy on Testset: 81.08 % (Epoch - 27) Accuracy on Trainset: 89.91 % (Epoch - 27) Accuracy on Testset: 83.48 % (Epoch - 28) Accuracy on Trainset: 90.09 % (Epoch - 28) Accuracy on Testset: 84.74 % (Epoch - 29) Accuracy on Trainset: 90.42 % (Epoch - 29) Accuracy on Testset: 84.26 % (Epoch - 30) Accuracy on Trainset: 93.42 % (Epoch - 30) Accuracy on Testset: 88.66 % (Epoch - 31) Accuracy on Trainset: 94.09 % (Epoch - 31) Accuracy on Testset: 88.67 % (Epoch - 32) Accuracy on Trainset: 94.48 % (Epoch - 32) Accuracy on Testset: 87.32 % (Epoch - 33) Accuracy on Trainset: 94.40 % (Epoch - 33) Accuracy on Testset: 88.09 % (Epoch - 34) Accuracy on Trainset: 94.57 % (Epoch - 34) Accuracy on Testset: 87.50 % (Epoch - 35) Accuracy on Trainset: 94.71 % (Epoch - 35) Accuracy on Testset: 87.54 % (Epoch - 36) Accuracy on Trainset: 94.60 % (Epoch - 36) Accuracy on Testset: 85.94 % (Epoch - 37) Accuracy on Trainset: 94.80 % (Epoch - 37) Accuracy on Testset: 86.72 % (Epoch - 38) Accuracy on Trainset: 94.77 % (Epoch - 38) Accuracy on Testset: 87.06 % (Epoch - 39) Accuracy on Trainset: 94.73 % (Epoch - 39) Accuracy on Testset: 87.23 % (Epoch - 40) Accuracy on Trainset: 94.74 % (Epoch - 40) Accuracy on Testset: 88.06 % (Epoch - 41) Accuracy on Trainset: 94.83 % (Epoch - 41) Accuracy on Testset: 87.52 % (Epoch - 42) Accuracy on Trainset: 94.78 % (Epoch - 42) Accuracy on Testset: 87.10 % (Epoch - 43) Accuracy on Trainset: 95.01 % (Epoch - 43) Accuracy on Testset: 87.01 % (Epoch - 44) Accuracy on Trainset: 95.08 % (Epoch - 44) Accuracy on Testset: 86.77 % (Epoch - 45) Accuracy on Trainset: 94.91 % (Epoch - 45) Accuracy on Testset: 87.48 % (Epoch - 46) Accuracy on Trainset: 95.18 % (Epoch - 46) Accuracy on Testset: 86.14 % (Epoch - 47) Accuracy on Trainset: 95.25 % (Epoch - 47) Accuracy on Testset: 88.04 % (Epoch - 48) Accuracy on Trainset: 95.09 % (Epoch - 48) Accuracy on Testset: 86.95 % (Epoch - 49) Accuracy on Trainset: 95.06 % (Epoch - 49) Accuracy on Testset: 87.39 % (Epoch - 50) Accuracy on Trainset: 95.22 % (Epoch - 50) Accuracy on Testset: 87.44 % (Epoch - 51) Accuracy on Trainset: 95.15 % (Epoch - 51) Accuracy on Testset: 87.30 % (Epoch - 52) Accuracy on Trainset: 95.22 % (Epoch - 52) Accuracy on Testset: 84.95 % (Epoch - 53) Accuracy on Trainset: 95.23 % (Epoch - 53) Accuracy on Testset: 87.74 % (Epoch - 54) Accuracy on Trainset: 95.36 % (Epoch - 54) Accuracy on Testset: 87.48 % (Epoch - 55) Accuracy on Trainset: 95.59 % (Epoch - 55) Accuracy on Testset: 87.51 % (Epoch - 56) Accuracy on Trainset: 95.26 % (Epoch - 56) Accuracy on Testset: 87.96 % (Epoch - 57) Accuracy on Trainset: 95.46 % (Epoch - 57) Accuracy on Testset: 87.81 % (Epoch - 58) Accuracy on Trainset: 95.52 % (Epoch - 58) Accuracy on Testset: 87.12 % (Epoch - 59) Accuracy on Trainset: 95.82 % (Epoch - 59) Accuracy on Testset: 86.89 % (Epoch - 60) Accuracy on Trainset: 97.50 % (Epoch - 60) Accuracy on Testset: 89.40 % (Epoch - 61) Accuracy on Trainset: 97.95 % (Epoch - 61) Accuracy on Testset: 89.83 % (Epoch - 62) Accuracy on Trainset: 98.16 % (Epoch - 62) Accuracy on Testset: 89.31 % (Epoch - 63) Accuracy on Trainset: 98.23 % (Epoch - 63) Accuracy on Testset: 89.20 % (Epoch - 64) Accuracy on Trainset: 98.29 % (Epoch - 64) Accuracy on Testset: 89.66 % (Epoch - 65) Accuracy on Trainset: 98.39 % (Epoch - 65) Accuracy on Testset: 89.55 % (Epoch - 66) Accuracy on Trainset: 98.40 % (Epoch - 66) Accuracy on Testset: 89.26 % (Epoch - 67) Accuracy on Trainset: 98.29 % (Epoch - 67) Accuracy on Testset: 88.83 % (Epoch - 68) Accuracy on Trainset: 98.48 % (Epoch - 68) Accuracy on Testset: 89.28 % (Epoch - 69) Accuracy on Trainset: 98.39 % (Epoch - 69) Accuracy on Testset: 89.37 % (Epoch - 70) Accuracy on Trainset: 98.15 % (Epoch - 70) Accuracy on Testset: 88.90 % (Epoch - 71) Accuracy on Trainset: 98.30 % (Epoch - 71) Accuracy on Testset: 88.76 % (Epoch - 72) Accuracy on Trainset: 98.26 % (Epoch - 72) Accuracy on Testset: 89.58 % (Epoch - 73) Accuracy on Trainset: 98.20 % (Epoch - 73) Accuracy on Testset: 88.38 % (Epoch - 74) Accuracy on Trainset: 98.38 % (Epoch - 74) Accuracy on Testset: 89.65 % (Epoch - 75) Accuracy on Trainset: 98.27 % (Epoch - 75) Accuracy on Testset: 88.73 % (Epoch - 76) Accuracy on Trainset: 98.31 % (Epoch - 76) Accuracy on Testset: 89.46 % (Epoch - 77) Accuracy on Trainset: 98.15 % (Epoch - 77) Accuracy on Testset: 89.32 % (Epoch - 78) Accuracy on Trainset: 98.38 % (Epoch - 78) Accuracy on Testset: 89.10 % (Epoch - 79) Accuracy on Trainset: 98.12 % (Epoch - 79) Accuracy on Testset: 88.19 % (Epoch - 80) Accuracy on Trainset: 98.24 % (Epoch - 80) Accuracy on Testset: 88.49 % (Epoch - 81) Accuracy on Trainset: 98.17 % (Epoch - 81) Accuracy on Testset: 89.28 % (Epoch - 82) Accuracy on Trainset: 98.36 % (Epoch - 82) Accuracy on Testset: 88.86 % (Epoch - 83) Accuracy on Trainset: 98.11 % (Epoch - 83) Accuracy on Testset: 88.58 % (Epoch - 84) Accuracy on Trainset: 98.15 % (Epoch - 84) Accuracy on Testset: 89.24 % (Epoch - 85) Accuracy on Trainset: 98.09 % (Epoch - 85) Accuracy on Testset: 89.21 % (Epoch - 86) Accuracy on Trainset: 98.37 % (Epoch - 86) Accuracy on Testset: 88.15 % (Epoch - 87) Accuracy on Trainset: 97.94 % (Epoch - 87) Accuracy on Testset: 88.48 % (Epoch - 88) Accuracy on Trainset: 98.13 % (Epoch - 88) Accuracy on Testset: 88.35 % (Epoch - 89) Accuracy on Trainset: 98.03 % (Epoch - 89) Accuracy on Testset: 88.21 % (Epoch - 90) Accuracy on Trainset: 99.06 % (Epoch - 90) Accuracy on Testset: 90.59 % (Epoch - 91) Accuracy on Trainset: 99.32 % (Epoch - 91) Accuracy on Testset: 90.55 % (Epoch - 92) Accuracy on Trainset: 99.42 % (Epoch - 92) Accuracy on Testset: 90.68 % (Epoch - 93) Accuracy on Trainset: 99.45 % (Epoch - 93) Accuracy on Testset: 90.68 % (Epoch - 94) Accuracy on Trainset: 99.55 % (Epoch - 94) Accuracy on Testset: 90.99 % (Epoch - 95) Accuracy on Trainset: 99.56 % (Epoch - 95) Accuracy on Testset: 90.68 % (Epoch - 96) Accuracy on Trainset: 99.54 % (Epoch - 96) Accuracy on Testset: 90.76 % (Epoch - 97) Accuracy on Trainset: 99.51 % (Epoch - 97) Accuracy on Testset: 90.73 % (Epoch - 98) Accuracy on Trainset: 99.52 % (Epoch - 98) Accuracy on Testset: 90.66 % (Epoch - 99) Accuracy on Trainset: 99.52 % (Epoch - 99) Accuracy on Testset: 90.89 % (Epoch - 100) Accuracy on Trainset: 99.53 % (Epoch - 100) Accuracy on Testset: 90.56 % (Epoch - 101) Accuracy on Trainset: 99.48 % (Epoch - 101) Accuracy on Testset: 90.43 % (Epoch - 102) Accuracy on Trainset: 99.62 % (Epoch - 102) Accuracy on Testset: 90.64 % (Epoch - 103) Accuracy on Trainset: 99.56 % (Epoch - 103) Accuracy on Testset: 90.67 % (Epoch - 104) Accuracy on Trainset: 99.52 % (Epoch - 104) Accuracy on Testset: 90.81 % (Epoch - 105) Accuracy on Trainset: 99.57 % (Epoch - 105) Accuracy on Testset: 91.04 % (Epoch - 106) Accuracy on Trainset: 99.59 % (Epoch - 106) Accuracy on Testset: 90.76 % (Epoch - 107) Accuracy on Trainset: 99.53 % (Epoch - 107) Accuracy on Testset: 90.29 % (Epoch - 108) Accuracy on Trainset: 99.48 % (Epoch - 108) Accuracy on Testset: 90.39 % (Epoch - 109) Accuracy on Trainset: 99.56 % (Epoch - 109) Accuracy on Testset: 90.59 % (Epoch - 110) Accuracy on Trainset: 99.61 % (Epoch - 110) Accuracy on Testset: 90.63 % (Epoch - 111) Accuracy on Trainset: 99.65 % (Epoch - 111) Accuracy on Testset: 90.69 % (Epoch - 112) Accuracy on Trainset: 99.54 % (Epoch - 112) Accuracy on Testset: 90.45 % (Epoch - 113) Accuracy on Trainset: 99.59 % (Epoch - 113) Accuracy on Testset: 91.06 % (Epoch - 114) Accuracy on Trainset: 99.61 % (Epoch - 114) Accuracy on Testset: 90.77 % (Epoch - 115) Accuracy on Trainset: 99.67 % (Epoch - 115) Accuracy on Testset: 90.42 % (Epoch - 116) Accuracy on Trainset: 99.50 % (Epoch - 116) Accuracy on Testset: 90.62 % (Epoch - 117) Accuracy on Trainset: 99.58 % (Epoch - 117) Accuracy on Testset: 90.37 % (Epoch - 118) Accuracy on Trainset: 99.48 % (Epoch - 118) Accuracy on Testset: 89.94 % (Epoch - 119) Accuracy on Trainset: 99.54 % (Epoch - 119) Accuracy on Testset: 90.51 % (Epoch - 120) Accuracy on Trainset: 99.68 % (Epoch - 120) Accuracy on Testset: 91.02 % (Epoch - 121) Accuracy on Trainset: 99.79 % (Epoch - 121) Accuracy on Testset: 91.31 % (Epoch - 122) Accuracy on Trainset: 99.84 % (Epoch - 122) Accuracy on Testset: 91.22 % (Epoch - 123) Accuracy on Trainset: 99.84 % (Epoch - 123) Accuracy on Testset: 91.40 % (Epoch - 124) Accuracy on Trainset: 99.86 % (Epoch - 124) Accuracy on Testset: 91.27 % (Epoch - 125) Accuracy on Trainset: 99.89 % (Epoch - 125) Accuracy on Testset: 91.22 % (Epoch - 126) Accuracy on Trainset: 99.88 % (Epoch - 126) Accuracy on Testset: 91.24 % (Epoch - 127) Accuracy on Trainset: 99.93 % (Epoch - 127) Accuracy on Testset: 91.50 % (Epoch - 128) Accuracy on Trainset: 99.88 % (Epoch - 128) Accuracy on Testset: 90.91 % (Epoch - 129) Accuracy on Trainset: 99.89 % (Epoch - 129) Accuracy on Testset: 91.29 % (Epoch - 130) Accuracy on Trainset: 99.90 % (Epoch - 130) Accuracy on Testset: 91.34 % (Epoch - 131) Accuracy on Trainset: 99.92 % (Epoch - 131) Accuracy on Testset: 91.43 % (Epoch - 132) Accuracy on Trainset: 99.92 % (Epoch - 132) Accuracy on Testset: 91.14 % (Epoch - 133) Accuracy on Trainset: 99.92 % (Epoch - 133) Accuracy on Testset: 91.38 % (Epoch - 134) Accuracy on Trainset: 99.91 % (Epoch - 134) Accuracy on Testset: 91.38 % (Epoch - 135) Accuracy on Trainset: 99.94 % (Epoch - 135) Accuracy on Testset: 91.61 % (Epoch - 136) Accuracy on Trainset: 99.91 % (Epoch - 136) Accuracy on Testset: 91.52 % (Epoch - 137) Accuracy on Trainset: 99.96 % (Epoch - 137) Accuracy on Testset: 91.74 % (Epoch - 138) Accuracy on Trainset: 99.94 % (Epoch - 138) Accuracy on Testset: 91.69 % (Epoch - 139) Accuracy on Trainset: 99.92 % (Epoch - 139) Accuracy on Testset: 91.42 % (Epoch - 140) Accuracy on Trainset: 99.93 % (Epoch - 140) Accuracy on Testset: 91.57 % (Epoch - 141) Accuracy on Trainset: 99.91 % (Epoch - 141) Accuracy on Testset: 91.43 % (Epoch - 142) Accuracy on Trainset: 99.93 % (Epoch - 142) Accuracy on Testset: 91.59 % (Epoch - 143) Accuracy on Trainset: 99.94 % (Epoch - 143) Accuracy on Testset: 91.56 % (Epoch - 144) Accuracy on Trainset: 99.93 % (Epoch - 144) Accuracy on Testset: 91.47 % (Epoch - 145) Accuracy on Trainset: 99.95 % (Epoch - 145) Accuracy on Testset: 91.64 % (Epoch - 146) Accuracy on Trainset: 99.95 % (Epoch - 146) Accuracy on Testset: 91.37 % (Epoch - 147) Accuracy on Trainset: 99.95 % (Epoch - 147) Accuracy on Testset: 91.66 % (Epoch - 148) Accuracy on Trainset: 99.97 % (Epoch - 148) Accuracy on Testset: 91.80 % (Epoch - 149) Accuracy on Trainset: 99.96 % (Epoch - 149) Accuracy on Testset: 91.58 % (Epoch - 150) Accuracy on Trainset: 99.94 % (Epoch - 150) Accuracy on Testset: 91.82 % ``` ::: --- ## 11/26 ### Source code structure #### datasets * cifar10data * cifar-10-batches-py * data_batch_1 ~data_batch_5 * mnist * MNIST * processed * `test.pt` * `training.pt` * raw * t10k-images-idx3-ubyte * t10k-labels-idx1-ubyte * train-images-idx3-ubyte * train-labels-idx1-ubyte --- #### ResNet * inputmap of ResNet (it's PT file) * `main.py` : main program, parser is define here * `models_resnet.py` : define the model of ResNet in this work, here we make ResNet18 for testing * `models_resnet_inputmap.py` * `models_vgg.py` : define the model of VGG in this work * `models_vgg_inputmap.py` * `utils.py` : define several funcs use in this work * `run.sh` : run all file, just like makefile --- #### VGG * inputmap of VGG * other files are same with files in ResNet --- #### venv * environment data ---- #### Code tracing ##### `main.py` [source](https://hackmd.io/@hsieh22/fault_tolerant_rram_src1) * define and implement parser * parser will define parameter how to control program, then it will reference parameters to run training, finetune and evaluation * we can set parser, resume (directory that storing weight),the bits of quantizing, network architecture or restoring data * define quantize_opt * define LeNet * deal with different datasets * inference step * finetune step * quantize options * training ---- ##### `utils.py` * implement all details of function * Variation() * DynamicVariation() * quantize() * deal with three type of quantize : linear, exp and power * SaveWeights() * RowRestoring_Weights() * RowRestoring_Gradients() * Train() * Eval() --- ### TODO :::info 1. realize the structure of this work 2. trace each process in `main.py` 3. tracing `utils.py` :::