【實操教程】使用 Jetson nano 結合 AWS 機器學習和 IoT 實現邊緣智慧—上篇
- 2020 年 7 月 7 日
- AI
為什麼只在雲端做推理不行?
眾所周知,人工智慧(AI)正在成為改變各行各業的通用技術。此前絕大部分AI是依賴雲端實現的,因為雲端有更豐富的算力、GPU資源、機器學習平台等。隨著AI晶片和邊緣算力的不斷發展,邊緣智慧(Edge Intelligence,EI)已成為未來的趨勢。
版權聲明:本文原作者 李強 。經 @AWS雲計算 授權轉載發布,僅供學習討論。
文章原始出處:知乎文章地址 / 亞馬遜AWS官方部落格

一、一些概念
在正式開啟AWS邊緣智慧之前,我們先了解一些基礎概念:
1.1 邊緣智慧(Edge Intelligence,EI)是指在「終端側」部署人工智慧。為什麼只在雲端做推理不行?眾所周知,人工智慧(AI)正在成為改變各行各業的通用技術。此前絕大部分AI是依賴雲端實現的,因為雲端有更豐富的算力、GPU資源、機器學習平台等。隨著AI晶片和邊緣算力的不斷發展,EI已成為未來的趨勢。
1.2 邊緣計算定義:OpenStack 基金會對外發布的白皮書《邊緣計算 – 跨越傳統數據中心》對「邊緣計算」這一概念進行了清晰的闡述,邊緣計算是為應用開發者和服務提供商在網路的邊緣側提供雲服務和 IT 環境服務,「邊緣」指的是位於管理域的邊緣,儘可能地靠近數據源或用戶。其目標是在靠近數據輸入或用戶的地方提供計算、存儲和網路頻寬。但不同的行業對應邊緣計算的定義可能不同。基於物聯網技術的行業更多的邊緣側旨在設備端。
1.3 Jetson Nano 是 NVIDIA 推出邊緣AI的開發板,GPU使用 NVIDIA Maxwell™ 架構,配備 128 個 NVIDIA CUDA® 核心,開發者們可以基於 Jetson Nano 開發很多 EI 的應用。

1.4 邊緣計算與IoT雲平台,邊緣計算與雲計算平台將是共生互補。邊緣計算並不會取代雲計算,而是通過邊緣側的算力,讓傳統的雲計算框架進一步去中心化,在邊緣側完成部分計算工作,然後將結果匯聚到雲端進行統一處理。雲端也可以通過OTA,模型的訓練後的下放與邊緣端集成到一起。雲端仍舊可以處理時間不敏感的應用場景,通過數據的匯聚以及雲端的大數據分析進一步為業務的決策提供數據支撐。
二、場景描述:
在本篇部落格中,我們將通過 AWS Greengrass 和 Jetson Nano 實現圖片的分類,AWS Greengrass 通過 Lambda 處理影像分類的消息與調用本地的 SageMaker 訓練好的Neo模型,然後通過 Topic 把影像分類的結果發送至 AWS IoT Core。其中邊緣推理部分使用了Greengrass ML inference。
本篇部落格以樂高恐龍影像分類作為開啟 EI 亦或 AIoT 應用的開端。

三、技術架構:

AWS IoT Greengrass 可將 AWS 無縫擴展至邊緣設備,因此可以在本地操作其生成的數據,同時仍可將雲用於管理、分析和持久存儲。藉助 AWS IoT Greengrass,邊緣設備可以運行 AWS Lambda 函數、Docker 容器,基於機器學習模型執行預測、使設備數據保持同步以及與其他設備安全通訊 – 甚至在沒有連接 Internet 的情況下也可實現這些功能。
Amazon SageMaker 是一種完全託管的機器學習服務。藉助 Amazon SageMaker,數據科學家和開發人員可以快速輕鬆地構建和訓練機器學習模型,然後直接將模型部署到託管的生產就緒環境中。它提供了一個集成 Jupyter Notebook 的實例,供您輕鬆訪問數據源以便進行探索和分析,因此您無需管理伺服器。
Amazon SageMaker Ground Truth 是數據標註的服務,為機器學習模型構建高品質的訓練數據集。
Amazon SageMaker Neo 使機器學習模型訓練一次即可在雲和邊緣站點中的任何環境運行。Neo 可自動優化 TensorFlow、Apache MXNet、PyTorch、ONNX 和 XGBoost 模型以部署在 ARM、Intel 和 Nvidia 處理器上,減少移植所需的時間和工作。但需要注意一點的是,Neo當前支援的是從 TensorFlow、MXNet 或 PyTorch 導出的影像分類模型,以及 XGBoost 模型。
本篇具體實現的流程如下圖,在最後的參考鏈接會附有源程式碼和對應的庫:

四、AWS EI 實驗步驟:
4.1 圖片標註(SageMaker GroundTruth)
在這次試驗中,我們將使用 SageMaker GroundTruth 的服務來標註由樂高恐龍組成的影像訓練集。
步驟如下:
- 將未標註的數據集上傳到 S3 上
- 在Sagemaker GroundTruth 中創建一個私有的 Labeling workforce
- 創建一個 GroundTruth Labeling job
- 使用 GroundTruth 平台來標註圖片
- 分析結果
4.1.1下載未標註的數據集:
在這一步中,我們將未標註的數據集下載到本地,然後upload到剛剛創建的存儲桶中作為SageMaker GroundTruth的數據輸入。
這個數據集中包含388個文件,其中包含6大分類(Brachiosaurus, Dilophosaurus, Spinosaurus, Stegosaurus, Triceratops and Unknown)。
數據集下載地址:lego_dinosaurs_dataset / 備用地址
將未標註的數據集上傳到S3上:
在ap-northeast-1區域中創建一個S3存儲桶並給存儲桶唯一的命名.(比如,ground-truth-labelling-job-initials-20200112)
- 將download的數據集上傳到剛剛創建的桶中。(因為下面的步驟我們需要做人工標註,所以建議將6大類的樂高恐龍分別選取2-3張作為需要標註的數據集即可)
- 在設置許可權這一步保持默認即可,然後完成設置。
4.1.2 在GroundTruth中創建一個私有的Labeling workforce
這一步驟中我們將通過Sagemaker GroundTruth創建一個影像分類任務在ap-northeast-1。
- 打開AWS控制台 > Amazon SageMaker > 標籤工作人員(Labeling workforces)
- 選擇私有(Private)的標籤然後創建私有團隊(Create private team)
- 給私有標註的工作組命名
- 填寫一個有效的郵箱地址
- …
- 創建私有團隊

當創建成功後,我們的郵箱會收到來自於[email protected]發來的驗證郵件,這個郵件包含了我們創建workforce的用戶名和臨時密碼。

- 使用log in的連接和臨時密碼登陸到標註控制台進行標註。
- 此時會要求我們更改臨時密碼。
- 因為我們還沒有分配給worker(我們自己)標註任務,此時標註任務是空 的,下一步我們將分配給自己標註樂高恐龍的標註任務。
4.1.3 創建一個GroundTruth Labeling job
這一步驟就是我們創建一個標註的任務,然後分配給 workforce。
- 打開AWS控制台 > Amazon SageMaker > 標記任務(Labeling jobs)
- Step1:指定任務詳細資訊中:
—定義任務名稱(記住任務名稱,我們在notebook中的程式碼會用到)
—創建清單文件(manifest),輸入S3訓練數據集的路徑,注意要以/結尾。
例如 : s3:///<prefix/foldername>/



—IAM角色,在測試環境中我們可以允許它訪問所有的S3 bucket,當然我們可以指定它可以訪問特定S3 bucket。

—任務類型,我們選擇影像分類。

- Step2: 選擇工作人員並配置工具
選擇「私有(Private)」>「私有團隊(Private teams)在下拉框中我們已經在1.2創建過的」>「取消自動標記」>「其他配置中工作人員數量為1」>「影像分類標記工具中添加6個標籤:Brachiosaurus, Dilophosaurus, Spinosaurus, Stegosaurus, Triceratops and Unknown」 - 返回標註作業的頁面查看jobs的狀態,此時我們的郵箱會有[email protected]發來的郵件,內容是分配給我1個jobs需要完成。
4.1.4 用GroundTruth平台來標註圖片
這一步驟就是人工標註的過程,因為前面我們已經節選出13張有代表的影像,我們下面就對這13張影像進行標註即可。如下圖:

當標註完成後,我們返回到Sagemaker平台上。可以跟蹤標記任務的狀態以及進度。

4.1.5結果驗證
我們可以用sublime text打開在output中的/manifests/output.manifest文件,它是一個json文件包含一些被標記圖片的metadata. 比如:

4.2 模型訓練與優化
這一步我們主要的目的就是通過Amazon SageMaker notebook編寫訓練模型的程式碼,通過程式碼來調用雲計算的資源,比如機器學習類型的instance。它將執行數據訓練,並將訓練和優化好的模型以Amazon SageMaker Neo導出。下一步將Amazon SageMaker Neo模型部署到Jetson Nano的設備上。如果不想對模型進行訓練的話可以到參考鏈接處下載訓練好的模型。
這個notebook主要是展示端到端機器學習的工作流程
- 使用Sagemaker GroundTruth創建的標籤數據集。然後將數據集分為訓練和驗證。
- 使用Sagemaker容器訓練模型
- 使用Sagemaker Neo優化模型
4.2.1 下載程式碼ipynb並導入到SageMaker notebook中
影像分類程式碼 //ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn/sagemaker_image_classification-Copy1.ipynb
注意不要使用參考鏈接中的github上的程式碼。

4.2.2 部分程式碼解析
- 在OUTPUT_MANIFEST要輸入Sagemaker GroundTruth的output路徑,前面的步驟已經驗證過output的manifest的json格式。

- 在創建Sagemaker訓練任務的時候,請根據自己數據集訓練的個數來調整超參數(hyperparamerter)和訓練instance的類型(InstanceType)如下:

- 在InputDataConfig替換AttributeNames為自己定義的name,比如:
「AttributeNames」: [「source-ref」,」groundtruth-labeling-job-20191209-clone」]
- 啟動訓練作業,我們可以在Sagemaker notebook中查看到結果,也可以返回到Sagemaker控制台的訓練任務中看到訓練的狀態。訓練的時間長短取決於訓練實例類型、數據集大小、超參數的定義。

通過使用Sagemaker Neo來優化壓縮模型給終端Jetson Nano使用,導出的模型路徑我們要記錄一下,在下一步驟部署GreenGrass的時候會用到。

小結:
回顧一下我們的Demo流程圖,我們一起完成了第一部分:圖片標註和第二部分模型訓練與優化。下一章是我們的另一個重點,開始構建邊緣環境與執行邊緣推理。

下篇傳送門:
【實操教程】使用 Jetson nano 結合 AWS 機器學習和 IoT 實現邊緣智慧—下篇
參考鏈接:
1. Nvidia Jetson Nano介紹:
//developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#intro
2. Nvidia Jetson Nano 鏡像燒錄:
//developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write
3. AWS IoT Greengrass:
//docs.aws.amazon.com/zh_cn/greengrass/latest/developerguide/what-is-gg.html
4. NVIDIA Jetson Nano with AWS ML@Edge:
//github.com/mahendrabairagi/AWS_ML_At_Edge_With_NVIDIA_Jetson_Nano
5. 《智聯網·未來的未來》電子工業出版社 2018,6 彭昭
6. Amazon Sagemaker Neo模型下載:
//ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn/model-jetson_nano.tar.gz
