【實操教程】使用 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到設備端。

AWS EI image classification

二、Jetson Nano的鏡像燒錄

使用官方推薦的Etcher燒錄鏡像,不同的操作系統對應不同的操作方法,所以不再詳細介紹,可以參考 developer.nvidia.com/em ,燒寫成功後是如下圖所示的基於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像素高的窗口中顯示它。

CSI排線

三、使用 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

如果是Jetson Nano以外的設備也可以通過SageMaker Neo git neo-ai-dlr.readthedocs.io 找到對應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/green

在Jetson Nano中下載AWS IoT Greengrass Core Software(v1.10)的aarch64版本(注意版本,只有對應最新的大版本才能部署成功)。

ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn

解壓縮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/

然後替換hello-world-python的默認代碼如下面的鏈接,但該代碼需要引入一些模塊入numpy、jetbot、cv2等,請確認Jetson Nano環境包含這些依賴。

github.com/mahendrabair

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/gre 如下圖:
    長時間生存(long-lived)的 Lambda 函數在 AWS IoT Greengrass 啟動後函數會自動在自己的容器中保持運行。這與按需 Lambda 函數相反,後者在調用時啟動,並在沒有要執行的任務時停止。有關更多信息,請參考 Greengrass Lambda 函數的生命周期配置
Keep Lambda long-lived

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 *
Local Resource

  • 在部署模型之前,需要安裝 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流程圖:

AWS EI Demo流程圖

我們共同完成了邊緣智能應用的所有步驟。 (๑•ᴗ•๑)

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

參考鏈接:

1. Nvidia Jetson Nano介紹:

developer.nvidia.com/em

2. Nvidia Jetson Nano 鏡像燒錄:

developer.nvidia.com/em

3. AWS IoT Greengrass:

docs.aws.amazon.com/zh_

4. NVIDIA Jetson Nano with AWS ML@Edge:

github.com/mahendrabair

5. 《智聯網·未來的未來》電子工業出版社 2018,6 彭昭

6. Amazon Sagemaker Neo模型下載:

ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn