본문 바로가기

AWS/PROJECT

AWS IoT Greengrass 구성요소로 기계학습 추론 수행하기

728x90

AWS IoT Greengrass 구성요소로 기계 학습 추론 수행하기

https://docs.aws.amazon.com/ko_kr/greengrass/v2/developerguide/perform-machine-learning-inference.html

 

기계 학습 추론 수행 - AWS IoT Greengrass

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

위에 관련된 내용이지만, 사실 좀 그지같이 쓰여있어서 이해하기 어렵다..

그래서 공부하고 정리한 내용을 적어보아야지.. 기록기록

 

1. AWS IoT Greengrass에 접속해 Greengrass 디바이스 - 구성 요소에 접속한다. 중간에 ‘구성 요소 생성’을 클릭한다.

AWS IoT Greengrass 구성 요소 콘솔 화면

2. 구성 요소 정보에서 구성 요소 소스에서 레시피를 JSON으로 입력을 선택하고, 레시피를 작성한다. 레시피의 “run”은 코어 디바이스에서 실행할 부분이며, “script”에 실행할 명령을 명시하면 코어 디바이스에서 차례로 명령을 실행한다. 이 레시피에서는 가상환경을 실행하고, 추론을 실행하는 코드를 실행하라는 명령이 명시되어 있다.

 

아래 레시피는 라즈베리파이에서 실행되는 것으로, os는 linux로 설정해놓았다.

script 부분에는 pi 디렉토리로 이동 및 가상환경 실행, 추론 코드가 있는 디렉토리로 이동, 추론 코드 실행 순이다.

라즈베리파이에서 실행되기 때문에 &&를 사용해 이전의 명령어가 실행되고 난 뒤에 다음 명령어가 실행되도록 하였다.

Artifacts 부분의 Uri는 S3 버킷에 저장된 추론 코드 및 모델, 데이터셋 등이 들어있는 Amazon SageMaker로 만들어진 기계학습 코드들의 압축 파일이다. 압축파일이기 때문에 Unarchive에 Zip이라고 작성했다.

{
  "RecipeFormatVersion": "2020-01-25",
  "ComponentName": "com.james.socket",
  "ComponentVersion": "1.0.2",
  "ComponentType": "aws.greengrass.generic",
  "ComponentDescription": "Capstone Design James socket server.",
  "ComponentPublisher": "Me",
  "ComponentConfiguration": {
    "DefaultConfiguration": {
      "accessControl": {}
    }
  },
  "Manifests": [
    {
      "Platform": {
        "os": "linux",
        "architecture": "arm"
      },
      "Lifecycle": {
        "install": {
          "Script": ""
        },
        "run": {
          "script": "cd /home/pi&&. pracvenv/bin/activate&&cd socketserve&&python3 jamesML.py"
        }
      },
      "Artifacts": [
        {
          "Uri": "s3://greengrass-sagemaker-0930/jamesML.zip",
          "Digest": "/Yc32C/p71rQimCrTxcqnU1ziSjy9EArmrmD3pGraI0=",
          "Algorithm": "SHA-256",
          "Unarchive": "ZIP",
          "Permission": {
            "Read": "OWNER",
            "Execute": "NONE"
          }
        }
      ]
    }
  ],
  "Lifecycle": {}
}

 

 

3. 구성 요소 생성이 완료된 모습이다. 오른쪽 상단의 배포를 선택한다.

구성 요소 생성 완료 화면

 

4. 라즈베리파이4가 등록된 사물 그룹에 배포를 할 것이다.

구성 요소 배포 과정1

 

5. 대상 지정에서 배포 정보에 ‘이름’을 적은 뒤, ‘다음’을 선택한다.

구성 요소 배포 과정2

 

6. 구성 요소 선택에서 내 구성 요소에서 이전에 만든 ‘com.james.Socket’을 선택한다.

구성 요소 배포 과정3

7. 구성 요소 구성에서 구성 요소를 선택하고, ‘구성 요소 구성’을 선택해서 구성을 수정한다.

구성 요소 배포 과정4

 

8. 그림과 같이 구성을 추가한다. “runWith”을 “pi”로 지정하여 코어 디바이스에서 pi 사용자로 작동할 수 있도록 명시한다. 아래에서 확인 버튼을 누르고 ‘다음’ 버튼을 눌러서 생성을 완료한다.

pi로 명시하지 않으면, 라즈베리파이에 그린그래스 등록시 사용하는 gcc_user로 실행이 되기 때문에 제대로 동작하지 않는다. 권한이나 사용자 또한 문제가 되는 것인가보다..

구성 요소 배포 과정5 중 구성 업데이트

 

9. 마지막으로 검토한 뒤 ‘완료’를 눌러 배포를 시작한다.

구성 요소 배포 과정6

 

10. 코어 디바이스에 배포가 완료되면 그림과 같이 ‘실행 중’이라고 나타난다.

구성 요소 배포 완료 화면

 

11. 다음 그림은 코어 디바이스인 라즈베리파이4에서 sudo tail -f /greengrass/v2/logs/com.james.socket.log 명령을 실행하면 나타나는 구성 요소의 로그이다. 이를 통해 코어 디바이스에 구성 요소가 완전히 배포 되었으며, 현재 실행 중임을 알 수 있다. 구성 요소 배포를 완료하면, 코어 디바이스인 라즈베리파이4에서 추론 코드가 실행된다.

그림에서 표시한 것과 같이 '사용자 이름 hi 정확도' 라는 결과가 나타난다

라즈베리파이의 구성요소 com.james.socket 로그

 

12. 얼굴인식 코드는 다음과 같다. 현재 모델에는 min과 hyo 두 사람의 얼굴이 인식되어 있다. 얼굴인식을 10번 측정해 나타난 10번의 정확도의 평균을 구한다. min과 hyo 중 평균값이 더 높은 사람이 인식되었다고 판단한다. 만약 평균값이 일정 수치인 0.99보다 낮다면 이는 침입자인 것으로 판단한다. 이 경우, 즉시 화면을 캡쳐해서 Amazon S3 bucket에 저장한다. 그리고 Amazon QLDB에 시간과 캡쳐한 사진의 S3 URL을 저장한다.

얼굴인식 코드1
얼굴인식 코드2

 


정리해보자면,

S3에 실행하고 싶은 기계학습 모델이 담긴 파일을 압축해서 업로드한다.

그러면 기계학습 추론 코드 및 모델에 라즈베리파이에 있지 않아도 AWS IoT Greengrass 구성요소를 통해 실행할 수 있다.

위의 추론 코드를 실행했음에도 불구하고 이런 식으로 에러가 나타난다면, 위의 8번을 꼭 확인해야한다.

반드시 pi로 설정하도록 할 것.!

 

그럼 이만!

728x90