Kafka 스트림으로 입력받은 이미지 데이터를 텐서플로우 기반의 MNIST 모델을 이용하여 분류한 결과를 Kafka 스트림으로 출력하는 예제를 설명합니다.
웹툴킷 화면에서 [Repository] 탭을 클릭하여, MNIST 모델을 등록합니다.
웹툴킷 화면에서 [New Directory] 메뉴를 클릭하여, MNIST 모델을 등록할 폴더를 생성합니다.
웹툴킷 화면에서 [File Upload] 메뉴를 클릭하여, 모델을 등록합니다.
[파일 입력] 콤보 박스에서 '폴더'를 선택합니다.
[파일 선택] 버튼을 클릭하여, 등록할 모델을 선택합니다.
웹툴킷 화면에서 모델이 등록된 것을 확인할 수 있습니다.
워크플로우 편집기를 이용하여, 다음의 절차에 따라 워크플로우를 생성합니다.
본 예제는 스트림 타입의 모델 서빙 서비스를 제공하므로, StreamToStream 엔진을 선택합니다.
Kafka 스트림을 입력받기 위해 KafkaReader를 선택하고, 아래 표와 같이 속성을 설정합니다.
field | value | 설명 |
---|---|---|
topic | mnist_input | 이미지 데이터를 입력받기 위한 Kafka Topic 이름 |
zooKeeperConnect | csle1:2181 | Zookeeper 접속주소 (IP, 포트번호) |
groupId | mnist_input | Kafka 통신을 위한 그룹 아이디 |
bootStrapServer | csle1:9092 | Kafka 서버 접속주소 (IP, 포트번호) |
이미지 분류 결과를 Kafka 스트림으로 출력하기 위해 KafkaWriter를 선택하고, 아래 표와 같이 속성을 설정합니다.
field | value | 설명 |
---|---|---|
topic | mnist_output | 이미지 분류 결과를 출력하기 위한 Kafka Topic 이름 |
zooKeeperConnect | csle1:2181 | Zookeeper 접속주소 (IP, 포트번호) |
groupId | mnist_output | Kafka 통신을 위한 그룹 아이디 |
bootStrapServer | csle1:9092 | Kafka 서버 접속주소 (IP, 포트번호) |
Spark 기반의 스트림 데이터 처리를 위해 SparkSessionOrStreamController를 선택하고, 아래 표와 같이 속성을 설정합니다.
field | value | 설명 |
---|---|---|
operationPeriod | 1 | 스트림 데이터를 처리하는 주기 (초 단위) |
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 메모리 |
본 예제의 경우, 데이터 전처리가 필요 없기에 아래 1개의 Operator를 이용합니다.
field | value | 설명 |
---|---|---|
modelServerUri | model/mnist | MNIST 모델 경로 |
modelName | mnist | 모델 이름 |
signatureName | predict_images | 이미지 분류 signature 이름 |
완성된 워크플로우는 다음과 같습니다.
웹툴킷에 ksbuser@etri.re.kr 계정으로 로그인하면, 본 예제 워크플로우가 이미 만들어져 있는 것을 확인할 수 있습니다.
워크플로우 편집기의 불러오기 메뉴를 통해 본 예제를 실행할 수 있습니다.
워크플로우 편집기 화면 상단의 실행 버튼을 클릭하여, 위에서 작성한 워크플로우를 실행합니다.
본 예제는 스트림 타입의 엔진이므로, Batch 체크박스를 해제하고 Run 버튼을 클릭합니다.
웹툴킷 [Monitoring] 화면에서 [Workflow] 탭을 선택하여, 위에서 실행한 워크플로우와 엔진의 동작 상태를 확인할 수 있습니다.
정상적으로 실행되어 Status 값이 Inprogress인 것을 확인할 수 있습니다.
[Workflow History] 탭을 선택하여, 현재 동작 중인 워크플로우의 로그 정보를 확인할 수 있습니다.
KSB 툴박스에 포함된 테스트 스크립트를 이용하여, 스트림 방식의 모델 서빙 기능을 확인하는 과정입니다.
KSB 툴박스에 포함된 consume-mnist-output.sh
스크립트를 실행하여, MNIST 이미지 분류 결과를 Kafka 서버로부터 수신할 수 있도록 대기합니다.
호스트 PC에서 터미널 창을 열어, 아래의 명령을 수행합니다.
$ docker exec -it csle1 bash $ cd ~/ksb-csle/examples/models/mnist/client/kafka-json $ ./consume-mnist-output.sh
KSB 툴박스에 포함된 publish-mnist-input.sh
스크립트를 실행하여, MNIST 이미지 데이터를 Kafka 서버로 전송합니다.
호스트 PC에서 터미널 창을 열어, 아래의 명령을 수행합니다.
$ docker exec -it csle1 bash $ cd ~/ksb-csle/examples/models/mnist/client/kafka-json $ ./publish-mnist-input.sh
위 (1)번 과정에서 실행한 터미널 창에서, MNIST 이미지 데이터와 분류 결과를 확인할 수 있습니다.
웹툴킷 [Monitoring] 화면의 [Workflow] 탭에서, 현재 Status가 Inprogress인 '2.5.12.TfStreamPredictionMnist' 워크플로우의 정지(◼) 버튼을 클릭하여 종료시킵니다.
워크플로우 편집기에서 작성한 워크플로우를 "Save Workflow" 메뉴를 이용하여 저장합니다.