2.5.12.TfStreamPredictionMnist.md 6.9 KB
Newer Older
HooYoungAhn's avatar
HooYoungAhn committed
---
html:
  toc: true
  offline: true
export_on_save:
  html: true
---
# 스트림 방식으로 MNIST 모델 서빙하기 (TfStreamPredictionMnist)
---

Kafka 스트림으로 입력받은 이미지 데이터를 텐서플로우 기반의 MNIST 모델을 이용하여 분류한 결과를 Kafka 스트림으로 출력하는 예제를 설명합니다. 

## 모델 등록하기
웹툴킷 화면에서 [Repository] 탭을 클릭하여, MNIST 모델을 등록합니다.

### 모델 폴더 생성하기
웹툴킷 화면에서 [New Directory] 메뉴를 클릭하여, MNIST 모델을 등록할 폴더를 생성합니다.
![모델 폴더 생성화면](images/2.5.12_1_01.png)

### 모델 업로드
웹툴킷 화면에서 [File Upload] 메뉴를 클릭하여, 모델을 등록합니다.

[파일 입력] 콤보 박스에서 '폴더'를 선택합니다.
![모델 업로드 메뉴](images/2.5.12_1_02.png)
[파일 선택] 버튼을 클릭하여, 등록할 모델을 선택합니다.
![모델 업로드 선택](images/2.5.12_1_03.png)

### 모델 등록 완료
웹툴킷 화면에서 모델이 등록된 것을 확인할 수 있습니다.
![모델 등록 완료](images/2.5.12_1_04.png)

## 워크플로우 생성하기
워크플로우 편집기를 이용하여, 다음의 절차에 따라 워크플로우를 생성합니다.

### 엔진 선택
본 예제는 스트림 타입의 모델 서빙 서비스를 제공하므로, StreamToStream 엔진을 선택합니다.

#### Reader
Kafka 스트림을 입력받기 위해 KafkaReader를 선택하고, 아래 표와 같이 속성을 설정합니다.
field | value | 설명
--|---|--
topic | mnist_input | 이미지 데이터를 입력받기 위한 Kafka Topic 이름
zooKeeperConnect | csle1:2181 | Zookeeper 접속주소 (IP, 포트번호)
groupId | mnist_input | Kafka 통신을 위한 그룹 아이디
bootStrapServer | csle1:9092 | Kafka 서버 접속주소 (IP, 포트번호)

#### Writer
이미지 분류 결과를 Kafka 스트림으로 출력하기 위해 KafkaWriter를 선택하고, 아래 표와 같이 속성을 설정합니다.
field | value | 설명
--|---|--
topic | mnist_output | 이미지 분류 결과를 출력하기 위한 Kafka Topic 이름
zooKeeperConnect | csle1:2181 | Zookeeper 접속주소 (IP, 포트번호)
groupId | mnist_output | Kafka 통신을 위한 그룹 아이디
bootStrapServer | csle1:9092 | Kafka 서버 접속주소 (IP, 포트번호)

#### Controller
Spark 기반의 스트림 데이터 처리를 위해 SparkSessionOrStreamController를 선택하고, 아래 표와 같이 속성을 설정합니다.
field | value | 설명
--|---|--
operationPeriod | 1 | 스트림 데이터를 처리하는 주기 (초 단위)

#### Runner
Spark 환경 설정을 위해 SimpleSparkRunner를 선택하고, 아래 표와 같이 속성을 설정합니다.
field | value | 설명
--|---|--
inJason | false | false로 설정하는 경우 json 형태의 파라메타를 커맨드라인 파라미터 형태로 변환하여 호출되는 외부 시스템에 전달. True 이면 json 형태의 파라메타 형태 그대로 외부시스템에 전달
sparkArgs | 아래 표 참고 | Spark Application 설정

sparkArgs 설정은 다음과 같이 합니다.
field | value | 설명
--|---|--
master | local[\*] | 마스터
numExecutors | 4 | Spark Executor 개수  
excuterCores | 2 | 각 Spark Executor의 core 개수  
executerMemory | 1g | 각 Spark Executor의 메모리 크기
driverMemory | 1g | Spark Driver 메모리

#### Operator
본 예제의 경우, 데이터 전처리가 필요 없기에 아래 1개의 Operator를 이용합니다.

1. **TensorflowPredictOperator**
텐서플로우 기반의 MNIST 모델을 이용하여, 입력 이미지의 분류 결과를 출력합니다.

field | value | 설명
--|---|--
modelServerUri | model/mnist | MNIST 모델 경로
modelName | mnist | 모델 이름
signatureName | predict_images | 이미지 분류 signature 이름

완성된 워크플로우는 다음과 같습니다.
![워크플로우 완성 화면](images/2.5.12_2_01.png)

웹툴킷에 ksbuser@etri.re.kr 계정으로 로그인하면, 본 예제 워크플로우가 이미 만들어져 있는 것을 확인할 수 있습니다.
워크플로우 편집기의 불러오기 메뉴를 통해 본 예제를 실행할 수 있습니다.

## 워크플로우 실행 및 모니터링하기

### 워크플로우 실행하기
워크플로우 편집기 화면 상단의 실행 버튼을 클릭하여, 위에서 작성한 워크플로우를 실행합니다.
본 예제는 스트림 타입의 엔진이므로, Batch 체크박스를 해제하고 Run 버튼을 클릭합니다.
![워크플로우 실행](images/2.5.12_3_01.png)

### 워크플로우 모니터링 하기

#### 워크플로우 상태 확인
웹툴킷 [Monitoring] 화면에서 [Workflow] 탭을 선택하여, 위에서 실행한 워크플로우와 엔진의 동작 상태를 확인할 수 있습니다.
정상적으로 실행되어 Status 값이 Inprogress인 것을 확인할 수 있습니다.
![워크플로우 동작 상태 확인](images/2.5.12_3_02.png)

#### 워크플로우 로그 보기
[Workflow History] 탭을 선택하여, 현재 동작 중인 워크플로우의 로그 정보를 확인할 수 있습니다.
![워크플로우 히스토리](images/2.5.12_3_03.png)

## 결과 확인하기
KSB 툴박스에 포함된 테스트 스크립트를 이용하여, 스트림 방식의 모델 서빙 기능을 확인하는 과정입니다.

#### (1) 이미지 분류 결과 수신 대기
KSB 툴박스에 포함된 ```consume-mnist-output.sh``` 스크립트를 실행하여, MNIST 이미지 분류 결과를 Kafka 서버로부터 수신할 수 있도록 대기합니다.
호스트 PC에서 터미널 창을 열어, 아래의 명령을 수행합니다.
```bash
$ docker exec -it csle1 bash
$ cd ~/ksb-csle/examples/models/mnist/client/kafka-json
$ ./consume-mnist-output.sh
```
![이미지 분류 결과 수신 대기](images/2.5.12_4_01.png)

#### (2) 분류할 이미지 데이터 전송
KSB 툴박스에 포함된 ```publish-mnist-input.sh``` 스크립트를 실행하여, MNIST 이미지 데이터를 Kafka 서버로 전송합니다.
호스트 PC에서 터미널 창을 열어, 아래의 명령을 수행합니다.
```bash
$ docker exec -it csle1 bash
$ cd ~/ksb-csle/examples/models/mnist/client/kafka-json
$ ./publish-mnist-input.sh
```
![분류할 이미지 데이터 전송](images/2.5.12_4_02.png)

#### (3) 이미지 분류 결과 수신 확인
위 (1)번 과정에서 실행한 터미널 창에서, MNIST 이미지 데이터와 분류 결과를 확인할 수 있습니다.
![이미지 분류 결과 수신 확인](images/2.5.12_4_03.png)

## 워크플로우 종료하기
웹툴킷 [Monitoring] 화면의 [Workflow] 탭에서, 현재 Status가 Inprogress인 '2.5.12.TfStreamPredictionMnist' 워크플로우의 정지(<span style="color:red">&#9724;</span>) 버튼을 클릭하여 종료시킵니다.

## 워크플로우 저장하기
워크플로우 편집기에서 작성한 워크플로우를 "Save Workflow" 메뉴를 이용하여 저장합니다.