[1日30分 인생승리의 학습법]프로덕션 환경에서 텐서 플로우 모델을 구축하는 방법

gRPC로 텐서플로우 서빙 서비스 플랫폼 개발

 

생산 환경에서 텐서 플로우 모델을 구축하는 방법

 

 

만약 당신이 계속 따라왔다면, 당신은 내가 딥 러닝 모델을 만드느라 바빴다는 것을 알 것이다. 이 모델로 카사바 농부는 농작물에 질병을 발견할 수 있다. 농부는 상태가 있다고 의심되는 카사바 식물의 사진을 찍는다. 그런 다음 응용 프로그램은 농부가 적절한 조치를 취할 수 있도록 질병의 유형을 보여줍니다.

농부 전화에서 응용 프로그램을 얻으려면 이 텐서플로 모델을 실제 응용 프로그램으로 변환해야 한다. 응용 프로그램을 네 가지 다른 서비스로 나눌 예정입니다. 이 서비스들은 도커 컨테이너에서 실행될 것입니다. 도커를 선택하는 이유는 명확해야 합니다. 도커 컨테이너는 서버 기반 응용 프로그램의 표준 배포 단위입니다.

저는 이 기사에서 네 가지 서비스의 이면에 있는 근거와 그것들이 어떻게 상호작용하는지 설명할 것입니다. 아래 그림은 최종 아키텍처를 보여 줍니다.

The architecture of the solution

각 서비스의 소스 코드와 도커 파일은 GitHub에서 이용할 수 있다. 기사 말미에, 지역 워크스테이션에서 서비스를 실행하는 방법을 알려드리겠습니다.

그러나 먼저 서비스의 세부 사항과 이를 도커 컨테이너로 전환하는 방법에 대해 논의하겠습니다.

모델 서비스

구글은 텐서플로우 서빙이라는 생산 환경에서 텐서플로우 모델을 서비스하기 위한 특수 모듈을 개발했다. 그래서 우리의 모델 서비스는 텐서플로우 서빙을 사용할 것이다.

Logo

교육 중에는 모델을 h5 형식으로 저장합니다. 이 형식에는 모델과 가중치가 단일 파일에 포함됩니다. 그러나 텐서플로우 서빙에서는 h5를 사용할 수 없다. 우리는 그것을 Save Model 형식으로 변환해야 합니다.

다음 Python 스크립트를 사용하여 h5 파일을 SaveModel 형식으로 변환할 수 있습니다.

4행에서는 Save Model의 내보내기 경로를 구성합니다. 1을 경로로 하여 이 모델을 버전화한다.

일단 모델이 SaveModel 포맷으로 만들어지면, 우리는 TensorFlow 서빙을 사용하여 서비스를 시작할 수 있다.

우리는 TensorFlow 팀이 우리를 위해 만든 TensorFlow 서빙 도커 컨테이너를 사용할 것입니다. 이 컨테이너에는 여러 버전이 있습니다(GPU를 사용하는 버전과 CPU용 버전). 우리는 최신 CPU 버전을 사용할 것입니다.

GPU 버전에는 특수 도커 플러그인이 필요하기 때문에 GPU 버전 대신 CPU를 사용한다. 이렇게 하면 컨테이너가 원치 않는 도커 설치에 따라 달라집니다.

모델 서비스를 생성하기 위한 도커 파일

TensorFlow 서빙 도커 이미지를 직접 사용하는 대신 모델을 포함하는 도커 이미지를 생성한다. Docker 파일은 모델 서비스에 대한 이미지를 생성합니다.

TensorFlow 서빙 이미지를 사용하면서 기본 신호 처리기를 올바르게 처리하지 못한다는 것을 알게 되었습니다.

즉, Ctrl-c를 사용하여 실행 중인 컨테이너를 중지하려고 해도 중지되지 않습니다. 도커는 앱이 응답할 때까지 10초(기본 시간 초과) 동안 기다립니다. 해당 시간 내에 앱이 응답하지 않으면 컨테이너가 중지됩니다.

도커 이미지에 티니를 추가할 수 있습니다. 그게 내가 도커 파일의 3-6열에서 했던 거야. 그런 다음 Tini가 SIGTERM과 같은 기본 신호 처리기를 올바르게 처리하는지 확인하여 10초 동안 기다릴 필요가 없습니다.

도커 이미지 생성 스크립트

저는 도커 이미지를 만들기 위해 항상 작은 도우미 스크립트를 사용합니다. 이 스크립트는 이미지를 생성하고 태그를 지정합니다.

Windows에서도 실행할 수 있는 PowerShell 스크립트를 생성했습니다.

API 서비스

나는 웹이나 모바일 애플리케이션이 모델 서비스와 직접 통화하는 것을 원하지 않기 때문에 API 서비스를 만들었습니다. 그 이유는 두 가지입니다.

API 서비스는 REST 인터페이스를 제공합니다. 이 REST 인터페이스는 이미지(jpg 또는 png)를 수신하여 gRPC를 통해 모델 서비스로 전송하는 단일 방식을 가지고 있다. 그런 다음 모델 서비스가 예측을 생성하여 API 서비스에 반환합니다. API 서비스는 예측을 JSON으로 변환하여 호출자에게 반환합니다.

Logo

저는 파이썬과 패스트 API를 사용하여 예측 서비스를 구현했습니다. FastAPI는 파이썬으로 API를 구축하기 위한 최신 고성능 웹 프레임워크이다.

다음은 예측 함수를 구현합니다. Fast에 의해 트리거됩니다./예측/이미지` 끝점에서 HTTP POST를 실행할 때의 API입니다. 예측하려는 이미지가 HTTP 메시지 본문에 포함되어야 합니다.

소스 코드를 보면 먼저 제공된 이미지가 정확한지 확인하는 것으로 확인됩니다. 그런 다음 10행에서는 이미지를 예측 함수가 허용하는 형식으로 변환합니다. 11열에서는 gRPC를 통해 모델 서비스로 이미지를 전송합니다.

read_dism_image는 이미지를 읽고 1x150x150x3의 4차원 배열로 변환합니다. 또한 각 픽셀 값을 255로 나누어 이미지를 정규화합니다.

예측 함수는 gRPC를 사용하여 모델 서비스에 연결됩니다.

TensorFlow 서빙을 통한 TensorFlow 모델과의 통신에는 gRPC 및 TensorFlow별 프로토버프가 필요하다. PyPI의 tensorflow-serving-apis 패키지는 이러한 인터페이스를 제공하지만 tensorflow가 필요하다. TensorFlow Python 패키지의 크기는 약 700MB이다.

min-tfs-client 사용

TensorFlow를 사용하여 TensorFlow 서빙에 연결하는 대신 min-tfs-client의 TensorServing Client를 사용한다. 이 패키지는 TensorFlow를 종속성으로 포함하지 않으므로 전체 패키지 크기가 1MB 미만으로 감소한다.

7행의 입력 사전 이름과 출력 키는 모델에 따라 다릅니다. 우리는 가장 높은 예측을 가진 범주를 적절한 카사바 잎 질병으로 매핑합니다. 그런 다음 REST API를 통해 JSON으로 반환됩니다.

API 서비스를 생성하기 위한 Docker 파일

우리는 API 서비스의 기본 이미지로 파이썬:3.8-slim-buster를 사용한다. 알파인을 사용해 보았지만 필요한 패키지를 모두 설치할 수 없었습니다.

5행에는 루트가 아닌 사용자를 생성하고 17행에는 필수 패키지를 설치합니다. 이렇게 되면 300MB 정도의 이미지가 나오는데, 아직은 좀 큰 것 같습니다.

UI 서비스

Logo

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

UI 서비스는 Angular를 사용하여 만든 웹 페이지로 구성됩니다. 이 웹 페이지를 통해 사용자는 아래와 같이 이미지를 업로드하고 예측된 카사바 잎 질병에 걸릴 수 있습니다.

A small web page to upload an image and get the prediction

업로드 구성 요소를 정의하는 Angular 구성 요소를 생성했습니다. 업로드 구성 요소는 HttpClient를 사용하는 Angular 서비스를 사용하여 API 서비스에 대한 POST 요청을 수행합니다. 아래 소스 코드에서 Angular 업로드 서비스를 볼 수 있습니다.

UI 서비스를 만들기 위한 도커 파일

Angular 애플리케이션을 위해 공식 NGINX Docker 이미지를 사용했습니다. 다음 Docker 파일은 NGINX 및 Angular 애플리케이션을 사용하여 Docker 이미지를 생성합니다.

로컬 dist 폴더를 NGINX HTML 폴더에 복사합니다. dist 폴더는 ngbuild --prod 명령을 사용하여 Angular 앱을 컴파일하여 생성됩니다.

역방향 프록시 도커 컨테이너

마지막 도커 컨테이너는 역방향 프록시를 제공하는 컨테이너입니다. 역방향 프록시는 Traefik Proxy에 의해 구현된다. Traefik Proxy는 마이크로 서비스를 쉽게 배포할 수 있는 오픈 소스 역방향 프록시 및 로드 밸런서입니다.

Logo

Traefik의 구성은 동적입니다. Traefik을 시작하면 Docker에 연결되어 컨테이너 이벤트를 수신합니다. 컨테이너가 시작되거나 중지되면 Traefik은 자동으로 자체 재구성합니다. 우리는 Traefik 2.4를 사용하고 있다.

우리의 경우, Traefik은 우리의 서비스들간의 의사소통을 돕는다. IP 주소 및 포트와 통신하는 대신 도메인 이름 및 URL을 사용하여 연결하고 통신할 수 있습니다.

예를 들어 Angular 애플리케이션의 upload-file.service는 http://127.0.0.1:8000 대신 http://api.service.localhost를 사용하여 API 서비스와 통신합니다. Traefik은 요청을 API 서비스의 Docker 컨테이너의 포트 8000으로 라우팅합니다.

Traefik은 우리가 이 프로젝트에서 사용하지 않을 다른 많은 유용한 기능들을 가지고 있습니다. 예를 들어 자동 인증서 생성을 위해 ACME 공급자(예: Let`s Encrypt)를 사용하도록 Traefik을 구성할 수 있습니다.

도커 작성을 사용하여 모든 컨테이너 시작

Docker Composite를 사용하여 모든 컨테이너를 구성하고 시작합니다. 각 서비스의 구성에 대해 논의하겠습니다.

트래픽부터 시작해보죠.

트래픽

우리는 작성 당시 최신 버전인 traefik:v2.4를 사용한다. api.insecure를 true로 설정하면 포트 8080에서 Traefik API에 액세스할 수 있습니다. 14행의 볼륨 구성은 Traefik과 Docker를 연결합니다. 이렇게 하면 트래픽은 도커 요청을 모두 받게 됩니다.

모델 서비스

TensorFlow 서빙에는 시작 중 모델의 이름이 필요합니다. 그래서 환경변수 MODEL_NAME를 설정했습니다. 모델 서비스는 프리드 네트워크에 연결되어 있다. 다른 컨테이너를 통해서만 모델 서비스에 액세스할 수 있으므로 포트 매핑이 없습니다.

API 서비스

API 서비스는 Traefik에 추가 정보를 제공하는 첫 번째 서비스입니다. 레이블을 사용하여 이 정보를 제공합니다. 첫째, 9열에서는 Traefik을 사용합니다. 두 번째, 다음 행에서 이 서비스의 호스트 이름을 설정합니다.

이는 Traefik이 포트 8000에 있는 이 서비스 컨테이너의 IP 주소로 api.service.localhost에 대한 수신 트래픽을 리디렉션하는 라우터를 생성한다는 것을 의미합니다. 포트 8000은 7행의 노출을 사용하여 지정됩니다.

API 서비스는 gRPC를 통해 모델 서비스와 통신합니다. 모델 서비스와 API 서비스를 모두 동일한 네트워크에 연결하였기 때문에 이 작업이 가능합니다.

UI 서비스

UI 서비스는 API 서비스와 동일한 방식으로 Traefik을 사용합니다. Traefik은 포트 80에서 ui.service.localhost에 대한 들어오는 트래픽을 이 서비스 컨테이너의 IP 주소로 리디렉션하는 라우터를 생성합니다. 우리는 이것을 10행에서 구성했다.

UI 서비스가 Angular 애플리케이션을 브라우저로 전달합니다. 그런 다음 Angular 애플리케이션은 http://api.service.localhost URL을 사용하여 API 서비스에 연결합니다. Traefik은 요청을 API 서비스 컨테이너의 포트 8000으로 라우팅합니다.

트래픽 UI

모든 서비스가 실행 중이면 Traefik 대시보드를 사용하여 모든 서비스가 올바르게 구성되었는지 확인할 수 있습니다. 모든 라우터의 개요를 얻고 각 라우터에서 드릴다운할 수 있습니다.

The details of the UI-service router

로컬에서 실행

Docker Composite를 실행하려면 먼저 각 서비스의 개별 Docker 이미지를 구축해야 합니다. 각 서비스 폴더에 해당 서비스의 이미지를 생성할 수 있는 셸 및 PowerShell 스크립트를 추가했습니다.

The folder structure of the application

각 서비스 폴더에서 //docker-build를 실행합니다.sh 또는 docker-build.ps1 스크립트로 해당 서비스의 도커 이미지를 만듭니다.

한 가지 예외는 ui.service이다. 이 서비스에 대한 도커 이미지를 작성하려면 먼저 응용프로그램을 작성해야 합니다. 응용 프로그램을 빌드하려면 먼저 필요한 패키지를 설치해야 합니다. 먼저 npm install -g @angular/cli를 실행하여 Angular를 설치합니다.

그런 다음 npm install을 호출하여 프로젝트의 모든 종속성을 설치합니다.마지막으로 ngbuild-prod를 실행하여 애플리케이션을 구축한다. 그럼 /docker-build로 전화하면 되겠군요.sh는 ui.service의 도커 이미지를 구축한다.

세 개의 Docker 영상을 모두 빌드한 후에는 다음 명령을 사용하여 포그라운드에서 애플리케이션을 시작할 수 있습니다.

도킹을 하다.

백그라운드에서 실행하려는 경우 -d 플래그를 추가합니다.

독수리업.

역방향 프록시를 포함한 모든 컨테이너가 시작됩니다. 그런 다음 브라우저를 사용하여 http://ui.service.localhost/로 이동하면 이미지를 업로드하고 예측을 얻을 수 있는 사용자 인터페이스가 표시됩니다.

결론

이 글은 3부작 시리즈로 끝을 맺는다. 그것은 Kaggle 대회에 출전하는 것으로 시작했다. 이번 대회의 목표는 카사바 잎에 질병을 분류할 수 있는 모델을 만드는 것이었다. 첫 번째 기사에서는 88.9%의 정확한 모델을 만들었습니다.

두 번째 기사에서는 모델의 정확도를 높이는 것이 목표였다. 우리는 Kaggle 커뮤니티의 다섯 가지 최적화 기술을 사용했다. 이러한 기술을 조합하여 정확도를 89.35%로 높였다.

이 마지막 기사에서는 모델을 생산 환경에서 어떻게 사용할 수 있는지 보았습니다. 우리는 텐서플로우 서빙을 사용하여 모델을 서비스하고 gRPC를 통해 접근했다. 우리는 REST를 사용하여 예측을 얻기 위해 REST API를 만들었습니다. 예측이 용이하도록 이 REST API를 사용하는 Angular UI를 추가하였습니다.

모든 서비스는 도커 컨테이너 내부에서 실행됩니다. 서버 기반 애플리케이션의 표준 배치 단위이기 때문에 Docker를 선택했습니다. 우리는 Docker Composite를 사용하여 애플리케이션을 배포했습니다. 일부 수정으로 도커 컴포지트의 YAML 구성은 도커 스쿼드나 쿠버네츠 같은 실제 생산 환경에 사용될 수 있다.

읽어주셔서 감사드리며, 배우는 것을 멈추지 말아야 한다는 것을 기억하세요!

[출처] https://devcloset.tistory.com/89

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
1111 [ 一日30分 인생승리의 학습법] KoELECTRA로 기계독해(MRC) API 개발 file 졸리운_곰 2023.01.01 7
1110 [ 一日30分 인생승리의 학습법] 일 안 해도 생기는 수입? 그런 ‘패시브 인컴’은 없다 file 졸리운_곰 2023.01.01 6
1109 [ 一日30分 인생승리의 학습법] Qemu를 이용한 가상화 기초 file 졸리운_곰 2022.12.31 5
1108 [ 一日30分 인생승리의 학습법] 파이토치로 딥러닝해야 하는 5가지 이유 졸리운_곰 2022.12.31 6
1107 [ 一日30分 인생승리의 학습법] 왜 ‘한국어’의 자연어처리(NLP)는 유독 어려울까? file 졸리운_곰 2022.12.31 10
1106 [ 一日30分 인생승리의 학습법] MinIO Windows Service 등록 졸리운_곰 2022.12.24 7
1105 [ 一日30分 인생승리의 학습법] Apache 2.2에서 2.4로 마이그레이션 시 발생하는 에러 및 해결책 정리 졸리운_곰 2022.12.18 6
1104 [ 一日30分 인생승리의 학습법] Git 사용 방법 정리(commit, push, pull request, merge 등) 졸리운_곰 2022.12.04 18
1103 [ 一日30分 인생승리의 학습법] [웹 기획] 화면 설계 용어 - 와이어프레임, 스토리보드, 프로토타입의 차이점 file 졸리운_곰 2022.12.03 6
1102 [ 一日30分 인생승리의 학습법] REST API 설계 (네이밍) 졸리운_곰 2022.11.26 22
1101 [ 一日30分 인생승리의 학습법] REST API URI 규칙 졸리운_곰 2022.11.26 12
1100 [ 一日30分 인생승리의 학습법 ] REST API URL 규칙 졸리운_곰 2022.11.26 9
1099 [ 一日30分 인생승리의 학습법 ] prolog 문법 : Prolog Syntax 졸리운_곰 2022.11.21 3
1098 [ 一日30分 인생승리의 학습법 ] noVNC 작동원리 file 졸리운_곰 2022.11.16 6
1097 [ 一日30分 인생승리의 학습법 ] 프로젝트 만들고 GitHub에 첫 Commit하고 Push하기 file 졸리운_곰 2022.11.15 4
1096 [ 一日30分 인생승리의 학습법 ] 우분투(리눅스) 에서 EBS 라디오 자동녹음 만들기 졸리운_곰 2022.11.11 9
1095 [ 一日30分 인생승리의 학습법 ] EBS FM 라디오, rtmp 서비스 중단 졸리운_곰 2022.11.11 9
1094 [ 一日30分 인생승리의 학습법 ] 악보 읽는 방법 file 졸리운_곰 2022.11.08 12
1093 [ 一日30分 인생승리의 학습법 ] 13가지 주요 오픈소스 프로젝트 file 졸리운_곰 2022.10.09 15
1092 [ 一日30分 인생승리의 학습법 ] 극상의 학습 난이도로 입문자 울리는 프로그래밍 언어 Top 10 졸리운_곰 2022.09.03 15
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED