# 基礎知識
## 電腦
這邊會從主機板開始介紹,因為都有自己組過電腦的經驗,因此從主機板介紹會對後面介紹的內容有更加清晰的理解。
主機板裡面的零件可以參考下圖裡面的零件所示,這邊針對CPU、SATA、RAM以及PCI插槽做簡介。
* CPU負責處理RAM傳過來的資料已執行各種運算。
* SATA負責連接大容量儲存裝置(例如:硬碟) 。
* RAM是一暫存裝置,負責作為硬碟跟CPU之間的資料傳輸。
* PCI插槽可以插上顯示卡當作主機板跟螢幕的連接通道,讓螢幕可以顯示用戶介面。

當我們把主機板所有零件裝上去之後,就把主機板放到外殼裡面,讓使用者看不到主機板,使用者只需要按開機鍵變可以運行Win10作業系統,電腦裡面運行的程式就會依照Windows提供的架構進行開發,使用者下載exe檔就可以執行想要的內容(例如遊戲)。
## 手機
Iphone手機可以視為一個小的電腦主機,因此裡面也有所謂的主機板,相當於將主機板塞到手機的外殼裡面,因此我們把iPhone拆開之後,也可以看到主機板。
* 圖左邊裡面紅色的地方是蘋果的A14,相當於主機板面的CPU,下面就堆疊了RAM跟三星的固態硬碟(SSD)。
* 圖又紫色的插槽相當於主機板理的PCI插槽,用來連接手機理其他的感測元件(例如:鏡頭、麥克風、Face ID元件) 。

當使用者拿到Iphone手機之後,按開機鍵之後就會開始運行iOS系統,用戶可以透過APP商城下載應用程式,這些APP也是依照APPLE提供的開發架構進行開發,使用者透過點擊就可以運行相對應的APP。
## 邊緣裝置
邊緣裝置也是有類似的架構,我們這邊以華為海思為例,可以參考[海思邊緣裝置](https://item.jd.com/70336912222.html#crumbwrap),華為就把海思跟其他裝置用一個外殼包住,如下圖所示,用戶提供電源以及連接相對應感測器便可以運行邊緣裝置。

當我們拆開外殼之後,可以發現裡面的主機板會像圖右所示。
* Hi3559是海思的微控器(相當於Iphone裡的A14或是電腦裡面的intel),其可以連接不同的感測器以及一AI加速套件Atlas 200。
* 此裝置裡面已經包含RAM,然後利用SD卡用來當作是手機或電腦裡的固態硬碟。
邊緣裝置的硬體規格不足以運行iOS這樣的系統,因此會選擇執行一些輕量化的作業系統(例如:tiny Linux或是鴻蒙中的Lite OS),當運行這些系統時,我們開發的程式就需要依照選擇的作業系統的框架進行開發。
邊緣裝置也可以像手機一樣更換不同的CPU,因此海思邊緣裝置採用海思的芯片,當廠商把芯片更換成Rockchip的芯片,就可以是以Rockchip為基礎的邊緣裝置。
## 為何需要邊緣裝置
目前連接互聯網的裝置越來越多,其造成的海量資料帶來存儲不便及計算結果的遲滯性。面對龐大的資料量,雲計算可以為大資料提供存儲和計算支援。然而產生的資料如果完全由雲計算處理,網路邊緣側產生的資料就需要全部上傳到雲端,不僅傳輸時間長,傳輸代價也很大,加上資料是先上傳至雲端再回饋於終端,資料處理的效率將大打折扣。因此通過在靠近用戶的邊緣端設置具有計算、存儲、處理等功能的邊緣計算裝置,讓資料在邊緣計算裝置進行處理,可以有效解決這一問題。邊緣計算裝置具有與使用者物理距離近的優勢,使得回饋更迅速以達成低延遲的特點,同時無須將資料上傳雲端便可執行決策,因此邊緣計算在自動駕駛、智慧城市以及醫療保健等方面得到相當成熟的應用。
## AI在邊緣裝置
### AI簡介
近年來人工智慧(Artificial Intelligence, AI)發展迅速,其是以「人工」編寫的電腦程式,去模擬出人類的「智慧」行為,其中包含模擬人類感官的「聽音辨讀、視覺辨識」、大腦的「推理決策、理解學習」、動作類的「移動、動作控制」等行為。
AI簡易來說跟大數據分析類似,都是分析數據,只是AI是讓機器透過學習歷史數據,執行或決策更為複雜的任務。
AI 功能的身影已經充斥在我們的生活,它的樣貌已不再那麼的神祕,舉凡交通、娛樂、醫療等,到處都可見其蹤影,以下舉幾個例子讓大家更了解 AI 的樣貌:
* 手機助理語音辨識功能
* 社群網路上的廣告投放
* 串流影音網站的推薦(如 抖音推薦影片、Spotify 精選)
* Google Map 最佳路線規劃
* 人臉辨識
### AI在邊緣裝置部屬
邊緣裝置距離使用者較近,因此數據不需上傳到雲端,透過邊緣裝置就可以快速的回傳決策結果給使用者。
因為AI可以幫助自動化執行複雜的決策,如果能把AI部屬在邊緣裝置,就可以讓邊緣裝置執行更多複雜的功能。
然而AI模型部屬在邊緣裝置會遇到下列挑戰:
* AI模型壓縮
-- 目前AI模型多針對伺服器等超級計算設備進行設計,其模型複雜和計算複雜度高,邊緣裝置無法擁有跟電腦或是手機一樣功能的處理器,因此AI模型無法直接部署到邊緣計算設備內,需要針對模型進行壓縮或剪裁來使AI模型可以被部署在邊緣計算裝置中。
* AI模型調整
-- 除了需要將模型壓縮之外,AI模型在部署到邊緣計算裝置時,需要針對不同數據和應用場景進行調整或設計,因此雲端平台需要針對不同任務對AI模型進行調整。在調整的同時,因為重新訓練AI模型需要消耗大量的時間及計算資源,因此需要通過演算法使AI模型快速適應不同任務,節省訓練時間。
* 部屬流程
-- AI模型在完成調整后,需要部署到邊緣裝置,然而並非所有使用者都熟悉將AI模型部署到硬體上的流程,因此本提案會通過雲平台與邊緣裝置建立連線,用自動化程式將AI模型部署到硬體上,為客戶節省人力開發時間。 同時考慮到國產晶元和操作系統(鴻蒙)的發展需求,本提案會著重於國產晶元及系統的開發。
---
# AI 開發平台的每個元件的基礎知識
要部署一個基礎的 ai platform (軟體+硬體)
可以從 ai 嵌入式系統的角度進行了解,(芯片開發平台)
embedded system
嵌入式系統可以分成三個部分 --> 嵌入式軟體 / 嵌入式主芯片 / 適配嵌入式應用之硬體周邊
### 嵌入式主芯片:針對一些特殊應用,功耗,效能,製作出一個符合需求的芯片
目前最新蘋果手機所使用的 Apple A15 手機芯片就屬於一個強大的嵌入式芯片之一

* 內建數個處理器核心以及 coprocessor
* 內建神經網路引擎
* 顯示引擎 影像解碼硬件
* 高速的快取記憶體
* 訊號處理器
由於手機芯片算是一個強大的嵌入式芯片,因此根據成本與效能,還會有其他的微控制器來作為特殊應用之嵌入式單芯片
比較如下
| | 手機芯片 | 嵌入式芯片 | 補充:AI嵌入式芯片 |
| -------- | -------- | -------- | -------- |
| 芯片製程技術 | 高 | 低 | 看引擎數目決定 |
| IO接口 | 多 | 少 | 少 |
| 核心效能 | 高 | 低 | 低 |
| ai 效能| 高(近期支援 ai 相關之手機芯片)| 低 | 高 |
| 價格 | 非常高(數百人民幣,甚至數千元) | 非常低(10元至100元人民幣不等) | 介於一般芯片與手機芯片之間 |
| 目標 | 高效能產品 | 低成本低功耗應用 | 低成本低功耗之 ai 應用 |
### 適配 ai 芯片與周邊的嵌入式軟體,其中包含:
* bootloader
* 主要作為開機程序的軟體,需要適配主芯片的程式進入點
* kernel
* 核心驅動程式,包含了週邊硬體設備的初始化以及 api 介面
* root file system
* 預設的工具程式
* 客戶自定義 application
* reserve area
* debug 所使用
* 或是存入回復原廠設置之 image
### 適配嵌入式應用之硬體周邊
大部分的嵌入式系統開發板如下圖

擁有大量的 I/O, GPIO, LEDs, ADC/DAC, Audio output, SD slot, UART, 等等
已經可以稱作是一個小型的桌上型電腦
而像我們的邊緣嵌入式裝置,就可以到以下這麼簡易:
根據當下應用的層面,像我們的 esp32 邊緣運算物件辨識,主要就是由三個部件組成

ESP32 主芯片
藍芽訊號天線
OV2640 串列式傳輸鏡頭模組
其中 ov2640 是使用 i2c 進行傳輸,所以需要 i2c driver 進行模組的初始化與部分設定
假設我們要語音辨識,可能就需要麥克風,螢幕,喇叭等等硬體周邊
不同的硬體周邊就必須透過主芯片或是其他週邊芯片進行橋接,以達到目標功能
### 邊緣運算平台技術內容彙整
以下是報告用到的系統架構圖

圖中包含用戶、終端裝置、邊緣裝置、雲端(平台開發整合系統) 四個部分進行說明
#### 用戶端
用戶端主要會透過 Command line 或是簡易的 web 介面針對雲端平台伺服器進行溝通
我們會使用 ssh 給予使用者與雲端作為連線通道,進行 code commit 以及使用者自定義自動化腳本等操作
code commit 之後會經由 CI/CD 協助進行遠端檢查程式碼/ compiler/ 以及部署至 Jenkins 等動作

之後 Jenkins 就會使用該程式碼進行 firmware binary 的製作,製作出的檔案也會透過版本管理產生出當前的版本號,這樣執行遠端更新時,客戶可以自由選擇版本號來進行遠端裝置更新服務
用戶端可以從 git server 上進行 clone 到自己的 local 端,進行 application 的開發
#### 邊緣裝置
邊緣裝置就是上面那張 ESP32-CAM 的模樣,他支援了遠端更新的介面,以及 AI 的主芯片
#### 終端裝置
邊緣裝置加上產品包裝即為終端裝置
#### 雲端
裡面有數個小 component,一一進行列舉
* git/Jenkins 主機
* 目前主要會以 gitlab + jenkins 為主進行部署,會透過雲端建立一個虛擬機進行部署

* Training Engine
* 大部分使用者為了測試自己所設計的 AI 模型,會使用常用的 ai platform 例如以下:
* Google Colaboratory (Google Colab)
* Jupyter NoteBook
* Azure NoteBook (本平台會使用之 ai 訓練平台)
* 因此本開發平台會內建 Azure NoteBook 作為訓練平台之基底
* 使用者上傳 AI 模型或是裝置回傳的重要資料都會經由 ai 平台算出更加精準 準確的新模型,就可以再次更新至邊緣裝置中,使判別更加準確
* 數據庫
* 即為當下終端裝置集體收集到的重要訓練資料都會週期性地回傳儲存至平台內
* FOTA (Firmware On The Air)
* 會在 VM 內部署一個 web 介面,使用可以手動選擇特定版本以及特定機型,進行空中固件更新,並且回傳更新狀態
* 核心程序
目前的平台架構會使用類似 linux kernel 的平台架構,並加入數個邊緣裝置所整合資料夾:
1. component:內建數個開發平台之資料夾,其中包含了開發平台的硬體周邊驅動
2. main: 此為使用者應上傳之程式碼,程式碼會加入至此資料夾,應該包含
* 使用者針對周邊硬體之初始化程式
* include 自定義 header
* include 自定義 lib
* CMake 腳本
核心程序內會有內建腳本,根據使用著所選擇的芯片與裝置內容,選擇適合的驅動函式進行編譯與連結(compile and link)