# 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