【實操教程】使用 Jetson nano 結合 AWS 機器學習和 IoT 實現邊緣智能—下篇
- 2020 年 7 月 7 日
- AI
邊緣智能正在促成人工智能(AI)與物聯網(IoT)的混合,AI與IoT相輔相成:
如果沒有AI,IoT只是收集數據的 sensor,如果沒有IoT,AI也不會應用到邊緣。AIoT項目確實比其他單純的一個軟件或硬件的研發更加複雜,它是多學科或技術棧的融合。
版權聲明:本文原作者 李強 。經 @AWS雲計算 授權轉載發佈,僅供學習討論。
文章原始出處:知乎文章地址 / 亞馬遜AWS官方博客
上篇傳送門:
【實操教程】使用 Jetson nano 結合 AWS 機器學習和 IoT 實現邊緣智能—上篇
一、回顧
上一章我們通過 Amazon SageMaker 完成了邊緣智能中的圖像標註,模型訓練和優化,最終將圖像分類的 SageMaker Neo 模型導出到S3存儲桶中。也就是我們完成了下圖右下角陰影部分的內容。
本章重點分為兩大部分:
- 設備端,主要包含:安裝 Jetson nano 的鏡像、SageMaker Neo runtime、Greengrass的部署、運行模型。
- 雲端,主要包含:配置 IoT core與Greengrass、開發與部署 Lambda 函數、model到設備端。

二、Jetson Nano的鏡像燒錄
使用官方推薦的Etcher燒錄鏡像,不同的操作系統對應不同的操作方法,所以不再詳細介紹,可以參考 //developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write ,燒寫成功後是如下圖所示的基於aarch64-linux。

另外在使用CSI接口的攝像頭時排線不要插反,並測試攝像頭。
$ gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e
可以順利打開攝像頭。代碼的含義是使用GStreamer打開一個3820像素寬、2464像素高的相機stream,並在一個960像素寬、616像素高的窗口中顯示它。

三、使用 AWS IoT Greengrass 部署模型到 Jetson Nano
這個步驟我們做如下的事情:
- 3.1 安裝SageMaker Neo runtime
- 3.2 安裝AWS IoT Greengrass
- 3.3 配置和部署AWS Lambda
- 3.4 設置機器學習模型部署環境
- 3.5 部署機器學習模型Sagemaker Neo到邊緣
- 3.6 啟動模型並測試
3.1 安裝SageMaker Neo runtime
下載 .whl文件並安裝,其中包含SageMaker Neo的一些依賴庫來運行model。
可以通過以下鏈接下載:
//ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn/dlr-1.0-py2.py3-none-any.whl
如果是Jetson Nano以外的設備也可以通過SageMaker Neo git //neo-ai-dlr.readthedocs.io/en/latest/install.html 找到對應Device Name進行下載。
下載完成後,SSH到設備中,然後安裝.whl文件:
sudo apt-get install python3-pip
sudo pip install dlr-1.0-py2.py3-none-any.whl
也要安裝AWS Python SDK boto3
sudo pip install boto3
3.2 安裝AWS IoT Greengrass
在 Jetson Nano 的系統中運行如下命令創建 Greengrass user 和 group
$ sudo adduser --system ggc_user
$ sudo addgroup --system ggc_group
在AWS控制台上(北京 cn-north-1)通過以下鏈接來創建證書資源並SCP給Jetson Nano:
//docs.amazonaws.cn/greengrass/latest/developerguide/gg-config.html。
在Jetson Nano中下載AWS IoT Greengrass Core Software(v1.10)的aarch64版本(注意版本,只有對應最新的大版本才能部署成功)。
//ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn/greengrass-linux-aarch64-1.10.0.tar.gz
解壓縮Greengrass core和剛剛我們下載的證書資源文件:
$ sudo tar -xzvf greengrass-linux-aarch64-1.10.0.tar.gz -C /
$ sudo tar -xzvf <hash>-setup.tar.gz -C /greengrass # these are the security keys downloaded above
下載AWS ATS 終端根證書(CA):
$ cd /greengrass/certs/
$ sudo wget -O root.ca.pem //www.amazontrust.com/repository/AmazonRootCA1.pem
啟動Greengrass Core在我們的Jetson Nano上:
$ cd /greengrass/ggc/core/$ sudo ./greengrassd start
執行完成後我們終端會返回一個:
Greengrass successfully started with PID: XXXX
3.3 使用AWS Lambda配置推理代碼
登陸回控制台(北京 cn-north-1),創建Lambda函數。先將github中的aws-samples/aws-greengrass-samples中的hello-world-python下載下來並部署到AWS Lambda中,鏈接如下:
//github.com/aws-samples/aws-greengrass-samples/tree/master/hello-world-python
然後替換hello-world-python的默認代碼如下面的鏈接,但該代碼需要引入一些模塊入numpy、jetbot、cv2等,請確認Jetson Nano環境包含這些依賴。
//github.com/mahendrabairagi/AWS_ML_At_Edge_With_NVIDIA_Jetson_Nano/blob/master/inference-lambda.py
import time
import datetime
import numpy as np
import cv2
import boto3
from jetbot import Camera
from dlr import DLRModel
import greengrasssdk
3.4 設置機器學習模型部署環境
- 登陸AWS管理控制台(cn-north-1),進入Greengrass。
- 選擇並進入我們在2步驟中所創建的group
- 選擇我們在3步驟中創建的Lambda函數
- 然後使此函數長時間運行(Make this function long-lived and keep it running indefinitely)並分配內存為1000MB參考鏈接如下: //docs.aws.amazon.com/greengrass/latest/developerguide/long-lived.html 如下圖:
長時間生存(long-lived)的 Lambda 函數在 AWS IoT Greengrass 啟動後函數會自動在自己的容器中保持運行。這與按需 Lambda 函數相反,後者在調用時啟動,並在沒有要執行的任務時停止。有關更多信息,請參考 Greengrass Lambda 函數的生命周期配置。

Keep Lambda long-lived
- 在資源中添加 Machine Learning 模型,添加機器學習資源如下圖,在模型源中選擇我們上傳過的 Sagemaker Neo 的模型。本地路徑設置為 /ml_model

- 添加本地資源, 這裡要注意的是回到 Jetson Nano 中查看/dev/下的文件是否與下面列出的路徑對應,如果沒有請創建並分配目錄擁有者為 ggc_user 和 ggc_group 。例如:
/dev$ cd /
$ sudo mkdir /nvmap
$ sudo chown ggc_user:ggc_group *

- 在部署模型之前,需要安裝 openjdk-8 。這是 GGC v1.10 新功能,用於本地處理數據流並自動將其導出到 AWS雲 的流管理器。此功能需要 Greengrass 核心設備上的 Java 8。
sudo apt install openjdk-8-jdk
如果沒有安裝會報錯如下圖:

3.5 部署SageMaker Neo訓練的模型到邊緣
最後,我們需要把在終端圖像分類後的消息。 通過MQTT方式上報給雲端的 AWS IoT Core,所以還需要添加訂閱操作,並進行部署。回到Greengrass Group中,左側的工具欄中選擇訂閱(subscription),然後選擇源(source)選擇我們在步驟3.3中部署好的Lambda,目標我們選擇IoT Cloud,然後定義一個Topic如」dino-detect」。
當配置完成之後,單擊右上角的操作(Actions),選擇部署。部署成功後如下圖,如果部署失敗請查找失敗原因:

3.6 啟動模型並測試
所有步驟都配置成功後,我們就可以測試樂高恐龍的分類器了。在 AWS IoT 控制台中,選擇測試,並訂閱主題 dino-detect 或 #,然後啟用 Jeston Nano 的攝像頭捕獲並對圖像進行分類,最後將結果發送回 AWS IoT 控制台。
總結:
再次回顧一下我們的Demo流程圖:

我們共同完成了邊緣智能應用的所有步驟。 (๑•ᴗ•๑)
AIoT或 EI 隨着 AI芯片低功耗和低成本使得越來越多的企業關注智聯網這個領域。邊緣智能正在促成人工智能(AI)與物聯網(IoT)的混合,AI與IoT相輔相成:如果沒有AI,IoT只是收集數據的sensor,如果沒有IoT,AI也不會應用到邊緣。AIoT項目確實比其他單純的一個軟件或硬件的研發更加複雜,它是多學科或技術棧的融合。比如,數據的採集、分析、展現可能需要大數據的技術,邊緣邏輯的推理、判斷需要機器學習的模型,對數據加工後又要與大數據結合去ETL。雲端的邏輯編寫、OTA升級、安全、設備管理也要與終端集成。另外,如果是視頻流交互還涉及到編解碼、媒體等技術。正是因為它的複雜性,我們可以利用雲計算提供的服務和接口來快速原型和開發。
參考鏈接:
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
