提到 AI,我們腦海中總會浮現如火星文般的複雜算法、深不可測的神經網絡、數量龐大到以 TB 計數的 dataset 以及高速運算耗電量驚人的 GPU 等,它們可能存在於雲端,甚至就在自家機房的內部;然而,儘管它們的算法再精確、GPU 運算再迅速、網絡傳輸再快,還是無法滿足一般使用者最基本的需求:即時回饋,因此更貼近使用者、無延遲的「Edge AI」近年來大量興起,而前述龐大笨重的 AI 系統則隱身幕後稱為「Centralized AI」,兩者便組成 Distributed AI 的架構。
如上圖左側,Edge AI 部署於使用者終端,專用於「推論及決策」等動作,可滿足低延遲、快速回應的 AI需求,例如 Robots、Drones、Portable or Mobile Devices、Outdoor Devices 等。
Google Coral USB Accelerator
目前市面可滿足 Edge AI 的硬件設備選擇相當多,大致可分為可單獨運行的單版 AI board 與 USB 接口無法獨立運行的 AI 加速器。今天要開箱的是一個可以通過 USB 與樹莓派搭配的 AI 加速器:Google Coral USB Accelerator,它的外形與功能很容易讓我們聯想到 Intel 的 Neural Computing Stick(NCS),這兩種都屬於針對「深度學習運算」特別設計的 ASIC IC(Application Specific Integrated Circuit),它們兩者都非常適合平行的處理大量加乘運算,但也由於專用於特定用途,因此它們只支持有限的深度學習框架,而且必須先將模型轉換為特定的中介格式後才能運作。
NCS2 使用的中介檔稱為 IR(Intermediate Representation),可支持 TensorFlow、Caffe、MXNet、ONNX、Darknet 等模型轉換為 IR(Intermediate Representation)的中介檔格式,且還支持 OpenCV 的 DNN 模組;而 Google Edge TPU 目前則僅支持自家的 Tensorflow Lite 格式,且是 Edge TPU 專用的tflite-tpu,因此使用前必須將 TF Lite 模型轉檔後才能使用。
Google Coral USB Accelerator 的尺寸與重量都比想像中的更小更輕,相較於部置在雲端能夠提供訓練與推論的 Cloud TPU,這塊 Coral USB Accelerator 屬於 Edge AI 的一環,即是上面所指的 Edge TPU。
推論時間比較
這個小巧的加速器能提升多少深度模型的推論速度呢?下面統計資料來自官方網站,由左至右:藍色為使用一般 PC(CPU)、橙色為 PC 加上 Edge TPU、灰色為樹莓派 3、黑色為樹莓派加 Edge TPU,數值代表模型的推論時間,因此越小越好;由圖表中可看出樹莓派加上 Edge TPU 後可說是如虎添翼,比 PC 的 CPU 快上數十倍,甚至與 CPU+Edge TPU 並駕齊驅,可惜樹莓派沒有支持 USB 3.0,否則速度應該會更令人滿意。
安裝 Edge TPU 與 Python 資料集
接下來,我們先將 Google Coral USB Accelerator 接上樹莓派,如下圖所示:
A.下載 Edge TPU API
<code>cd ~/wget https://dl.google.com/coral/edgetpu_api/edgetpu_api_latest.tar.gz -O edgetpu_api.tar.gz –trust-server-namestar xzf edgetpu_api.tar.gz/<code>
B. 安裝 Edge TPU API
<code>cd edgetpu_apibash ./install.sh/<code>
下圖為安裝的畫面,未來如果想要更改設定值,可以重複執行此安裝的步驟。
最後一行出現”Would you like to enable the maximum operating frequency?”如果輸入Y,那麼 Edge TPU 在推論時會全力運作加快速度,但需注意在這種情況下可能會產生高熱。
安裝的過程相當簡單且順利,目前的版本為 edgetpu-1.9.2,如下圖所示:
C. 重新插入
安裝好 API 後,如果 Accelerator 已經接在 USB 上,建議再重新插拔一次,讓 udev rule 生效。
D. Demo 範例實作
- Image Classification
首先試試最基本的影像分類模型,請執行下方>
<code>cd ~/Downloads/wget https://dl.google.com/coral/canned_models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \\https://dl.google.com/coral/canned_models/inat_bird_labels.txt \\https://dcoral.withgoogle.com/static/docs/images/parrot.jpg/<code>
下載完成後,進入 demo 目錄執行 classify_image.py 程序:
<code>cd /usr/local/lib/python3.5/dist-packages/edgetpu/demopython3 classify_image.py \\--model ~/Downloads/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \\--label ~/Downloads/inat_bird_labels.txt \\--image ~/Downloads/parrot.jpg/<code>
卻出現下方的 error:
<code>Traceback (most recent call last): File "classify_image.py", line 19, in <module> from edgetpu.classification.engine import ClassificationEngineImportError: No module named 'edgetpu'/<module>/<code>
錯誤的原因是 edgetpu API 預設安裝到 /usr/local/lib/python3.5/dist-packages,但如果你的 Python 環境是 virtualenv,便需要多執行下列的安裝步驟:
<code>cd /home/pi/envAI/lib/python3.5/site-packages/ln -s /usr/local/lib/python3.5/dist-packages/edgetpuln -s /usr/local/lib/python3.5/dist-packages/edgetpu-1.9.2.dist-info/<code>
執行結果:此為待分類的示範圖片鸚鵡,範例程序預測其為 Ara macao,機率為 0.76,如下圖所示:
總結
雖然 Google Coral USB Accelerator 在外形體積與耗電量上佔盡優勢,且使用精度更低的 INT8,使得 Coral USB Accelerator 在 SSD Mobilenet V2 模型的推論速度比起其他 Edge AI chip 更快,但這是種種不方便使用之下妥協的結果,例如 Edge TPU 目前僅支持 Tensorflow lite 一種格式,且是更為簡化的 Tensorflow lite 版本,所支持的神經網絡 layer 種類更少。
因此,您在上手一個 Google Coral USB Accelerator 後,除了執行官方所提供的範例外,可能還會煩惱「如何將自己先前所訓練、FP32 精度的模型通過一道道繁瑣的程序轉換為最終 INT8 的 Tensorflow lite for Edge TPU 模型?」(此步驟稱為 post-training quantization),並且考慮能否接受 INT8 模型所帶來較低準確率的表現,以及後續是否需要採取重新訓練的方式來提升 INT8 精度模型的準確率。
閱讀更多 AI智慧 的文章