---
# System prepended metadata

title: Proposed prototype

---

# Proposed prototype

## Adviser advice
1. 就是 <font color="#f00">  Unet Accelerator </font>
2. PMP security問peter

## Work Progress Update
1. UNet的training flow已經由Jay建立起來，輸入圖片是224*224 gray scale picture。
2. UNet模型訓練完成。
3. 模型參數已經dump出來，剩下每層之間的input activation還沒dump，目前仍在研究中-- by Leo。
4. 接下來可能要延用之前的FPGA專題實作流程，將參數以及activation利用GEMM攤法，將資料攤成矩陣形式，只是需要更加robust。
## Reference (有料就丟上來)
### ASIC btw. CPU
1. [Building security into an AI SoC using CPU features with extensions](https://www.embedded.com/building-security-into-an-ai-soc-using-cpu-features-with-extensions/): 這篇有提到老師講的security和AI accelerator的東東，關於整體系統的文章 -- ++*provide by David*++
---
### UNet - Paper
1. [U-Net: Convolutional Networks for Biomedical Image Segmentation](https://arxiv.org/abs/1505.04597) - 1st ver.
2. [U-net++: A Nested U-Net Architecture for Medical Image Segmentation](https://arxiv.org/abs/1807.10165) - 2nd ver. 
3. [UNet 3+: A Full-Scale Connected UNet for Medical Image Segmentation](https://arxiv.org/abs/2004.08790) - 3rd ver. 

### UNet - Code
1. [**UNet Github Code**(1st ver.)](https://nn.labml.ai/unet/index.html) -> 論文中的code -- ++*provided by Leo*++ 
![](https://hackmd.io/_uploads/SkNtr6Zya.png)
- 補充說明: 
expansive path的up-conv 2x2 會將feature channel數減半，再與contracting path crop過來的feature做channel-wise concatenation。
    >[torch.cat()](https://pytorch.org/docs/stable/generated/torch.cat.html)

- 1st ver. UNet 假設以$3*224*224$的圖片為輸入:
MACs = 41.817079808G
Params = 31.031875M

- 與ResNet50做比較:
![](https://hackmd.io/_uploads/ByEZcgz16.png)
- Padding or not?
![](https://hackmd.io/_uploads/SJYujxz16.png)
- UNet論文沒有padding，會造成解析度下降，可以看到[本文的最下面training](https://keras.io/examples/vision/oxford_pets_image_segmentation/)似乎解析度真的不怎麼好

-> 那先 padding 好了(阿不過不 padding 的話運算量應該會比較少) -- ++*by Jay*++ 

2. [3 versions UNet Github Code](https://github.com/ZJUGiveLab/UNet-Version/tree/master/models) -> 假設有時間的話可以做改進版的unet，僅供參考。
-- ++*provided by Leo*++ 
3. [Unet Code](https://towardsdatascience.com/cook-your-first-u-net-in-pytorch-b3297a844cf3) 
-- ++*provided by Jay*++ 



---

## About Implementation(Software)
(我放個更新時間，怕大家一直點進去看一樣的內容)
### [Python function Explanation & Verification (Last update: 2023/09/16)](https://hackmd.io/VDEEE6wAT9mPxSZ6LWn1aw)

-- ++*provided by Jay*++ 

### Unet - Model Training -- ++*provided by Jay*++ 
<font color="#f55"> 目前自己搭建的 Unet model 已經可以正常 training </font>

- Dataset : 某種 biomedical 的圖像( [image source](https://github.com/zhixuhao/unet/tree/master) )
    - Ex:
    ![](https://hackmd.io/_uploads/r1CqauQJp.png)

- #### Training Result (雖然 dataset 共只有 30 張照片，但是效果我覺得還不錯)（不過這邊送進去 predict 的照片是有經過train 過的就是了）
    - Epoch=50
    ![](https://hackmd.io/_uploads/B1uHRu7ya.png)
    ![](https://hackmd.io/_uploads/SkfTAOX16.png)
    - Epoch=100
    ![](https://hackmd.io/_uploads/rJo80dXyT.png)
    ![](https://hackmd.io/_uploads/r1eRCd7yT.png)
    - Epoch=200
    ![](https://hackmd.io/_uploads/SJnvCd71a.png)
    ![](https://hackmd.io/_uploads/B1OC0O7k6.png)
    - Epoch=300
    ![](https://hackmd.io/_uploads/SkxcdCOXk6.png)
    ![](https://hackmd.io/_uploads/Sky9COXkT.png)

- #### [My Colab source code](https://colab.research.google.com/drive/1PDKqhvUXmE_E1gV1P64B9jmyhksgW3Vc#scrollTo=L7SIr_4xlUsK)

-- ++*provided by Jay*++

<font color="#80d">
    
#### Note : loss function 我最後是選 BCELoss，一開始試了一堆效果都不怎麼好，但要注意的是資料送入 BCELoss function 之前必須讓值介於 0~1 之間，因此我在 Model 最後一層有多加上 sigmoid function。-- ++*by Jay*++
    
</font>



- **拿training data set以外的照片跑過**，雖然說有些細節沒有顯示出來，但效果還不錯，應該就可以拿這版的model來生成參數，**目前嘗試中**。(by Leo)
![](https://hackmd.io/_uploads/ry-U3yEkp.png)
![](https://hackmd.io/_uploads/Byempk4ka.png)

- #### [Parameters Folder](https://drive.google.com/drive/folders/1zeYZEFp-3IwUW5ewDif3SCQ4BuAJXOSf?usp=sharing) (lastest update: 2023/09/17/22:58)
[Dump parameters code](https://colab.research.google.com/drive/1_qajU1PwcNnLl0j_Gqfl-ZgIF86b-Ick?usp=sharing), 目前已將模型的參數給輸出 -- ++*by Leo*++ 

<font color="#80d"> 
    
#### Note : 參數提取出來後使用時要注意一下，一般的 Conv2d 的 weight 會是(Cout, Cin, Height, Width)，而 de-Conv 的 weight 則是 (Cin, Cout, ::-1, ::-1) (目前看起來是這樣啦，如果我有說錯再跟我說~) -- ++*by Jay*++
    
</font>

#### Activations Extractions (Before Quantization)
![](https://hackmd.io/_uploads/H1cp5OEkp.jpg)
[Activations Folder](https://drive.google.com/drive/folders/1EyvHuyhgk9N69pX9wOYCYc-sC_0e6Vfu?usp=sharing)
### Unet - Model Quantization -- ++*provided by Jay*++
<font color="#f55">
    
#### 目前的 Unet model 已經做完 Quantization 
    
</font>

<font color="#f60"> 
    
- Done
    - 每層 activation 的輸出已提取出來(給後續驗證做使用)
    - 每層 Conv、de-Conv 的 weight 已提取出來 (model 先用沒有 Bias 的(效果跟有 Bias 的差不多))
    - Model Quantization
    - Quantization 後的各層 activation、weight 的 Scaling factor 以及 Zero point 皆已輸出。
    
</font>

- Model Size of Before & After
    ![](https://hackmd.io/_uploads/Sybb9KEk6.png)

- Predict result
![](https://hackmd.io/_uploads/SkzNqYVy6.png)

- #### [My Colab source code](https://colab.research.google.com/drive/1PDKqhvUXmE_E1gV1P64B9jmyhksgW3Vc#scrollTo=L7SIr_4xlUsK)

-- ++*provided by Jay*++

### Unet - Verify the model inference using numpy (include quantized model)


- 如果不想自己跑那些 colab，跑完的檔案[在這](https://drive.google.com/drive/folders/1apiQWJ6PNtVp3V8NVprh7g6WVFybqx3b?usp=sharing)

- [Floating point Unet Verification](https://hackmd.io/qAwABUIgQaC9lgU6xZvGzw) -> <font color="#f55"> done ! </font>
    > code 就是雲端資料夾內的 "inference_Unet_v1.py" 裡面包括讀取所有 activation 輸出，以及讀取所有 parameter ，並用 numpy inference 整個 Unet 確保運算方式理解正確

- [8-bit Unet Verification](https://hackmd.io/Yw3qoF07SfSUOcxbaYjMXg) ->  not yet ! 

    ![](https://hackmd.io/_uploads/ry-OhrU1p.png)


    > 目前用 numpy 去 inference 8-bit Unet 還存在一點點值的誤差，但輸出圖像看不出什麼差異就是了(如上圖)

-- ++*provided by Jay*++

### Segmentation Model 好壞指標

- Pixel Accuracy(像素準確率)
    - 預測類別正確的像素數佔總像素數的比例
    
- Confusion Matrix
    - ![](https://hackmd.io/_uploads/H1M7_uPkp.png)

- IOU (Intersection over Union) (<font color="#f55"> 這是目前唯一有跑的 model 指標 </font>)
    - <font color="#f95"> 模型對某一類別預測結果和 Ground Truth 的交集與聯集的比值 -> 越高代表兩者越像、重疊率越高 </font>
    - ![](https://hackmd.io/_uploads/B13xOOw16.png)
    - ![](https://hackmd.io/_uploads/SyOJ5dwJa.png)
    - ![](https://hackmd.io/_uploads/B1-lcdwJp.png)
    - ![](https://hackmd.io/_uploads/r1xsepPka.png)
    - 
    
-- ++*provided by Jay*++

---
## About Implementation(Hardware)
1. 因為UNet有許多MAC運算，所以提議用TPU架構來加速MAC運算，不知道可不可行? maxpooling和crop+concatenate或許可以用硬體加速? -- ++*by Leo*++ 
2. 感覺可以，不過都要 padding 了，好像也不用 crop 了 -- ++*by Jay*++
3. 目前的目標是要**單純inference**還是**包括training**?-- ++*by Leo*++
    -> 硬體能夠inference就好，但軟體端希望要能training，這樣事後比較好調整model以及quantize -- ++*by Jay*++
5. 圖片輸入應該可以縮小來縮減參數量?-- ++*by Leo*++ 
    -> 目前不是決定用224ㄇ，還是要用別的 -- ++*by Jay*++
    -> 224可以，原本是覺得572太大了-- ++*by Leo*++ 
    -> OK，那就 224 !!-- ++*by Jay*++ 
- [Systolic array](https://hackmd.io/iobnIE6NRJWSMI4V18lEzQ): 之前的專題
- model對於systolic array的一些初步分析，利用GEMM的矩陣攤法，參數量似乎非常多，目前覺得systolic array的大小可以開128*128，不然感覺會算很久。
![](https://hackmd.io/_uploads/HygQQCMyp.png)

6. 我們期望的 Matrix to vector 的運算方式 -> Toeplitz matrix multiplication，以這個尋找，可能可以找到跟方便的轉vector方式。一種適合GPU運算的轉換。與我們parallel 8個PE概念相同。
![image.png](https://hackmd.io/_uploads/rkxtyf-eXp.png)

7. Von Neumann bottleneck -> 資料全部都卡在BUS上 -> 可能需要壓縮資料再傳??
    不知道最後row data是不是有很多0??。 output buffer部分一定要積到bus bitwise的量再傳
    memory store 4x8-bit的想法，可能bus要開一個DRAM output的3~4倍，進PE再去解資料。
8. 類似我們想實作的PE架構，但他的buffer都是SRAM。 NB、SB為dual port，DMA會在旁邊幫忙preload或data reuse。綠色部分為DMA的instruction。(但我們可能變成單純的狀態積控)
    再NFU-2、NFU-3之間，有一個dedicated register (pipeline register)，這個pipeline必要，可以避免資料進buffer才accumulate(MAC結合multi-multiplication的概念)。
    ![image.png](https://hackmd.io/_uploads/H17gEbgXT.png)


---
### 缺的東東
- memory mapping (Hierarchy)
- 切 tile 的方式 (especially for Unet)-> Leo
- DMA、AXI BUS 溝通方式 -> 共同
- 多顆systolic array -> David
- PMP security(暫時忽略)

### Schedule
- 10/5  1st Meeting
Todolist:
    1. Software 整理(參數提取，模型調小)
    2. Tiling 整理 -> 想想看怎麼在硬體實現
    3. 查看多顆systolic array運作模式
- 10/12 2nd Meeting
- 10/19 3rd Meeting
- 11/08 Final Presentation
