Skip to content

Latest commit

 

History

History
194 lines (153 loc) · 8.39 KB

File metadata and controls

194 lines (153 loc) · 8.39 KB

End-to-end AIoT w/ SageMaker and Greengrass 2.0 on NVIDIA Jetson Nano (Korean)

[Note] 이 핸즈온은 NVIDIA Jetson nano용이지만, 몇 줄의 코드만으로 NVIDIA Jetson Xavier 및 Raspberry Pi에서 원활하게 작동합니다.

이 핸즈은랩은 데이터 준비, 모델 훈련 및 모델 컴파일과 같은 기본적인 머신 러닝(이하 ML) 절차와 NVIDIA Jetson nano 디바이스에서 Greengrass v2 컴포넌트 및 레시피를 밑바닥부터 생성하고 배포하는 방법을 다룹니다. 각 폴더는 독립적으로 실행할 수 있으며, 이미 모델을 컴파일한 경우 ML 파트를 생략할 수 있습니다.

  • sm-model-train-compile: ML part (Amazon SageMaker)
  • ggv2-deploy-on-device: IoT part (AWS IoT Greengrass 2.0, 온디바이스에 배포 시)
  • ggv2-deploy-on-cloud: IoT part (AWS IoT Greengrass 2.0, 클라우드 인스턴스로 배포 시)

ggv2-deploy-on-cloud는 IoT/ML 워크샵에 활용됩니다.

1. ML Part: Compile your ML model using Pytorch Framework and Amazon SageMaker

ML 파트에서는 ML 초보자도 쉽게 자신의 모델을 훈련/컴파일할 수 있도록 여러본의 데이터를 자유롭게 준비하고 폴더를 구성 후 코드를 실행할 수 있습니다. 데이터가 기가바이트를 초과한다면 어떻게 해야 할까요? 대용량 데이터를 고려하여 PyTorch DDP 기반의 분산 훈련도 구현하였습니다.

raw 이미지 폴더를 구성하는 예시를 들어 보겠습니다.

Example 1) 개/고양이 분류 모델 훈련

raw
├── cat
└── dog

Example 2) 생산 라인에서의 양품/불량 분류 모델 훈련 (ggv2-deploy-on-device/raw 폴더에 포함되었습니다.)

raw
├── brown_abnormal_chinese: 갈색 제품에 한자가 적혀 있는 불량 박스입니다.
├── brown_abnormal_korean: 갈색 제품에 한글이 적혀 있는 불량 박스입니다.
├── brown_normal_chinese: 갈색 제품에 한자가 적혀 있는 양품 박스입니다.
├── brown_normal_korean: 갈색 제품에 한글이 적혀 있는 양품 박스입니다.
├── no_box: 박스가 없습니다. 하지만, 때때로 박스 일부분들을 볼 수 있습니다.
├── red_abnormal: 적색 제품이며 불량 박스입니다.
└── red_normal: 적색 제품이며 양품 박스입니다.

Note: 이 데이터셋은 AWS IoT Smart Factory 데모를 준비하기 위해 저자가 직접 NVIDIA Jetson nano CSI 카메라로 촬영했으며 인터넷 이미지는 전혀 사용하지 않았습니다. 데이터셋의 포장 박스 이미지는 광동 제약(http://www.ekdp.com) 협찬으로 제공된 우환청심원 포장 박스들이며, 데이터셋 촬영은 터크코리아(https://www.turck.kr) 후원으로 터크코리아 검사 장비에서 이루어졌습니다.

Example 2의 데이터셋 샘플은 raw 데이터셋 폴더(ggv2-deploy-on-device/raw)를 참고하시기 바랍니다.

2. IoT Part: On-Device ML Inference with AWS IoT Greengrass 2.0

컴파일된 모델을 ML 파트에서 NVIDIA Jetson nano로 직접 복사하여 추론할 수 있지만 실제 프로덕션 환경에서는 한 번에 여러 디바이스들을 등록해야 합니다. 이 때, Greengrass-v2 컴포넌트를 등록하면 여러 에지 디바이스에 편리하게 배포할 수 있습니다. 향후 이를 기반으로 추론 데이터를 MQTT에 게시하여 Model/Data Drift를 감지하는 것도 가능합니다.

모든 코드는 정상적으로 동작하지만 수동 작업이 많기 때문에 향후 CDK(Cloud Development Kit)를 통한 자동화를 권장합니다.

2.0. NVIDIA Jetson Nano setup (if you have not done)

2.1. Optional: Simple Test

$ cd artifacts

# Single image inference
$ python3 test_dlr.py

# Camera w/ real-time inference
$ python3 test_camera_dlr.py

# Camera w/ real-time inference (write captured images)
$ python3 test_camera_dlr_write.py

# Flask Camera
$ export DEVICE_IP='[YOUR IP]'
$ python3 flask_camera.py

# Flask Camera w/ real-time inference
$ python3 flask_camera_dlr.py

2.2. Optional, but Recommended: Shell Script Test

$ cd artifacts
$ chmod +x run.sh run_flask.sh

# No Camera: Real-time inference for samples images
$ ./run.sh -c 0

# Camera: Real-time inference 
$ ./run.sh -c 1 

# Flask Camera w/ real-time inference
$ ./run_flask.sh -i [YOUR-DEVICE-IP] -p [YOUR-PORT]
# ./run_flask.sh -i 192.168.200.200 -p 2345

2.3. AWS IoT Greengrass setup (if you have not done)

[주의] 이 방법은 보안에 취약하고 프로더션에 적합하지 않습니다. 더 적절한 설정은 AWS IoT 플릿 프로비저닝으로 AWS IoT Greengrass Core 소프트웨어 설치를 참조하세요.

  1. AWS CLI V2 (Linux ARM) 를 설치하세요.
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
  1. JDK를 설치하세요.
$ sudo apt install default-jdk
$ java -version
  1. AWS configure and access key, secret key environment variable setting
$ aws configure # Set up your credentials
$ export AWS_ACCESS_KEY_ID=[YOUR-KEY-ID]
$ export AWS_SECRET_ACCESS_KEY=[YOUR-SECRET-ACCESS-KEY]
  1. AWS IoT Greengrass V2 core software를 다운로드하고 설치하세요.

2.4. Register AWS IoT Greengrass Component

  1. config.json을 먼저 수정하세요.
  2. create_gg_component.sh를 실행하세요. 만약 Macbook에서 실행한다면 create_gg_component_mac.sh을 실행하세요.
    이 셀스크립트를 실행하면 config.json 설정에서 변경된 내용을 반영하여 로컬의 json recipe와 artifacts/config_utils.py을 자동으로 수정해 주고 artifacts 폴더의 파일을 zip으로 압축하여 여러분의 S3 버킷으로 업로드 후, 마지막으로 Greengrass 컴포넌트를 자동으로 등록합니다.
$ ./create_gg_component.sh

2.5. Deploy to your Edge devices

컴포넌트가 등록되었다면 AWS UI나 Greengrass CLI로 쉽게 배포할 수 있습니다. 개발자 가이드를 참조해 주세요.

Experiments

아래의 실험 결과는 엄밀하지 않습니다. 대략적인 FPS(Frames Per Second)만 확인해 주세요.

  • Model: MobileNet-v2 Image Classification
  • Framework: PyTorch 1.6.0
  • CSI Camera Input size: 1280 x 720 x 3
  • DLR Runtime Version: 1.9.0

오버클러킹을 수행하면 약 4~5프레임이 향상됩니다. 하지만 오버클러킹은 충분한 쿨링 시스템을 갖춰야 합니다.

Vanilla PyTorch (Built-in OpenCV 4.1.1) Compiled w/ SageMaker Neo (Built-in OpenCV 4.1.1) Compiled w/ SageMaker Neo (Build OpenCV 4.5.3 from scratch)
CPU/GPU CPU GPU CPU GPU CPU GPU
Model Loading Time ~50 secs ~90 secs 2~3 secs ~40 secs 2~3 secs ~40 secs
FPS 0.16~0.18 8~9 5~6 16~17 8~10 23~25
Image classification w/ SageMaker Neo
(GPU enabled, Gstreamer on OpenCV 4.5.3)
Image classification w/ SageMaker Neo
(GPU disenabled, Gstreamer on OpenCV 4.5.3)

License Summary

이 샘플 코드는 MIT-0 라이선스에 따라 제공됩니다. LICENSE 파일을 참조하십시오.