Flask와 Elastic Beanstalk를 사용하여 AI/ML 모델 결과 시각화 - 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Flask와 Elastic Beanstalk를 사용하여 AI/ML 모델 결과 시각화

작성자: 크리스 코딜 (AWS) 과 두르가 서리

환경: PoC 또는 파일럿

기술: 기계 학습 및 AI, 분석, DevOps 웹 및 모바일 앱

워크로드: 오픈 소스

AWS 서비스: Amazon Comprehend, AWS Elastic Beanstalk

요약

인공 지능 및 기계 학습(AI/ML) 서비스의 결과를 시각화하려면 개발자와 엔지니어가 사용자 지정해야 하는 복잡한 API 직접 호출이 필요한 경우가 많습니다. 분석가가 새 데이터 세트를 빠르게 탐색하려는 경우 이는 단점이 될 수 있습니다.

사용자가 자신의 데이터를 업로드하고 대시보드에서 모델 결과를 시각화할 수 있는 웹 기반 사용자 인터페이스(UI)를 사용함으로써 서비스의 접근성을 높이고 더 인터랙티브한 형태의 데이터 분석을 제공할 수 있습니다.

이 패턴은 FlaskPlotly를 사용하여 Amazon Comprehend를 사용자 지정 웹 애플리케이션과 통합하고 사용자가 제공한 데이터에서 감정과 개체를 시각화합니다. 또한 이 패턴은 Elastic Beanstalk를 사용하여 애플리케이션을 배포하는 절차를 제공하기도 합니다. Amazon Web Services (AWS) AI 서비스를 사용하거나 엔드포인트에서 호스팅되는 사용자 지정 학습 모델 (예: Amazon SageMaker 엔드포인트) 을 사용하여 애플리케이션을 조정할 수 있습니다.

사전 조건 및 제한 사항

사전 조건 

  • 활성 상태의 AWS 계정. 

  • 로컬 시스템에 설치 및 구성된 Command Line Interface(CLI). 이에 대한 자세한 내용은 CLI 설명서에서 기본 사항 구성을 참조하십시오. AWS Cloud9 통합 개발 환경(IDE)을 사용할 수도 있습니다. 이에 대한 자세한 내용은 Cloud9 설명서에서 Cloud9에 관한 Python 자습서Cloud9 IDE의 실행 중인 애플리케이션 미리보기를 참조하십시오.

  • Flask의 웹 애플리케이션 프레임워크에 대한 이해. Flask에 대한 자세한 내용은 Flask 설명서에서 퀵스타트를 참조하십시오.

  • Python 버전 3.6 이상이 설치 및 구성되었습니다. Elastic Beanstalk 설명서에서 Python 개발 환경 설정의 지침을 따라 Python을 설치할 수 있습니다.

  • Elastic Beanstalk Command Line Interface(EB CLI)가 설치 및 구성되었습니다. 이에 대한 자세한 내용은 Elastic Beanstalk 설명서의 EB CLI 설치EB CLI 구성을 참조하십시오.

제한 사항

  • 이 패턴의 Flask 애플리케이션은 단일 텍스트 열을 사용하고 200행으로 제한되는 .csv 파일과 함께 작동하도록 설계되었습니다. 애플리케이션 코드는 다른 파일 유형 및 데이터 볼륨을 처리하도록 조정할 수 있습니다.

  • 애플리케이션은 데이터 보존을 고려하지 않으며, 업로드된 사용자 파일을 수동으로 삭제할 때까지 계속 집계합니다. 영구 객체 스토리지를 위해 애플리케이션을 Amazon Simple Storage Service(Amazon S3)와 통합하거나, 서버리스 키 값 스토리지를 위해 Amazon DynamoDB와 같은 데이터베이스를 사용할 수 있습니다.

  • 애플리케이션은 영어로 된 문서만 고려합니다. 하지만 Amazon Comprehend를 사용하여 문서의 기본 언어를 감지할 수 있습니다. 각 작업에 지원되는 언어에 대한 자세한 내용은 Amazon Comprehend 설명서에서 API 참조를 참조하십시오.

  • 일반적인 오류와 해결 방법이 포함된 문제 해결 목록은 추가 정보 섹션에서 확인할 수 있습니다.

아키텍처

Flask 애플리케이션 아키텍처

Flask는 Python에서 웹 애플리케이션을 개발하기 위한 경량 프레임워크입니다. Python의 강력한 데이터 처리 기능과 풍부한 웹 UI를 결합하도록 설계되었습니다. 패턴의 Flask 애플리케이션은 사용자가 데이터를 업로드하고 추론을 위해 Amazon Comprehend로 데이터를 전송한 다음 결과를 시각화하는 웹 애플리케이션을 빌드하는 방법을 보여줍니다.   애플리케이션의 구조는 다음과 같습니다.

  • static— 웹 UI를 지원하는 모든 정적 파일 (예: CSS JavaScript, 이미지) 을 포함합니다.

  • templates - 애플리케이션의 모든 HTML 페이지 포함

  • userData - 업로드된 사용자 데이터 저장

  • application.py - Flask 애플리케이션 파일

  • comprehend_helper.py - Amazon Comprehend에 대한 API 직접 호출 함수

  • config.py - 애플리케이션 구성 파일

  • requirements.txt - 애플리케이션에 필요한 Python 종속성

application.py 스크립트에는 4개의 Flask 경로로 구성된 웹 애플리케이션의 핵심 기능이 포함되어 있습니다. 다음 다이어그램은 이러한 Flask 경로를 보여줍니다.

웹 애플리케이션의 핵심 기능을 구성하는 네 가지 Flask 경로.
  • /(은)는 애플리케이션의 루트이며 사용자를 upload.html 페이지(templates 디렉토리에 저장되어 있음)로 디렉션합니다.

  • /saveFile(은)는 사용자가 파일을 업로드한 후 호출되는 경로입니다. 이 경로는 사용자가 업로드한 파일이 포함된 HTML 양식을 통해 POST 요청을 받습니다. 파일은 userData 디렉터리에 저장되며 경로는 사용자를 /dashboard 경로로 리디렉션합니다.

  • /dashboard(은)는 사용자를 dashboard.html 페이지로 보냅니다. 이 페이지의 HTML 내에서 /data 라우트에서 데이터를 읽는 JavaScript 코드를 실행한 다음 페이지에 대한 시각화를 작성합니다. static/js/core.js

  • /data(은)는 대시보드에서 시각화할 데이터를 제시하는 JSON API입니다. 이 경로는 사용자가 제공한 데이터를 읽고 comprehend_helper.py 내 함수를 사용하여 사용자 데이터를 Amazon Comprehend로 전송해서 감정 분석 및 명명된 개체 인식(NER)을 수행합니다. Amazon Comprehend의 응답은 형식이 지정되고 JSON 객체로 반환됩니다.

배포 아키텍처

AWS 클라우드에서 Elastic Beanstalk를 사용하여 배포한 애플리케이션의 설계 고려 사항에 대한 자세한 내용은 AWS Elastic Beanstalk 설명서를 참조하십시오.

플라스크와 Elastic Beanstalk를 사용하여 AI/ML 모델 결과를 시각화하기 위한 아키텍처 다이어그램.

설계 고려 사항

기술 스택

  • Amazon Comprehend 

  • Elastic Beanstalk 

  • Flask 

자동화 및 규모 조정

Elastic Beanstalk 배포는 로드 밸런서 및 오토 스케일링 그룹을 사용하여 자동으로 설정됩니다. 추가 구성 옵션에 대해서는 Elastic Beanstalk 설명서에서 Elastic Beanstalk 환경 구성을 참조하십시오.

도구

  • AWS 명령줄 인터페이스 (AWS CLI) 는 AWS의 모든 부분과 상호 작용할 수 있는 일관된 인터페이스를 제공하는 통합 도구입니다.

  • Amazon Comprehend는 자연어 처리 (NLP) 를 사용하여 특별한 사전 처리 없이 문서 내용에 대한 통찰력을 추출합니다.

  • AWS Elastic Beanstalk를 사용하면 애플리케이션을 실행하는 인프라에 대해 배울 필요 없이 AWS 클라우드에서 애플리케이션을 빠르게 배포하고 관리할 수 있습니다.

  • Elastic Beanstalk CLI (EB CLI) 는 로컬 리포지토리에서 환경을 쉽게 생성, 업데이트 및 모니터링할 수 있는 대화형 명령을 제공하는 AWS Elastic Beanstalk의 명령줄 인터페이스입니다.

  • Flask 프레임워크는 Python을 사용하여 데이터 처리 및 API 호출을 수행하고 Plotly를 사용하여 대화형 웹 시각화를 제공합니다.

code

이 패턴의 코드는 플라스크와 AWS Elastic Beanstalk 리포지토리를 사용한 AI/ML 모델 결과 GitHub 시각화에서 사용할 수 있습니다.

에픽

작업설명필요한 기술

리포지토리를 복제합니다. GitHub

다음 명령을 실행하여 Flask 및 AWS Elastic Beanstalk 리포지토리를 사용하여 GitHub 시각화 AI/ML 모델 결과에서 애플리케이션 코드를 가져옵니다.

git clone git@github.com:aws-samples/aws-comprehend-elasticbeanstalk-for-flask.git

참고: SSH 키는 를 사용하여 구성해야 합니다. GitHub

개발자

Python 모듈을 설치합니다.

리포지토리를 복제하고 나면 새 로컬 aws-comprehend-elasticbeanstalk-for-flask 디렉터리가 생성됩니다. 이 디렉터리의 requirements.txt 파일에는 애플리케이션을 실행하는 Python 모듈과 버전이 들어 있습니다. 다음 명령을 사용하여 모듈을 설치합니다.

cd aws-comprehend-elasticbeanstalk-for-flask

pip install -r requirements.txt

Python 개발자

로컬로 애플리케이션 테스트합니다.

다음 명령을 실행하여 Flask 서버를 시작합니다.

python application.py

이를 통해 실행 중인 서버에 대한 정보를 반환합니다. 브라우저를 열고 http://localhost:5000을 방문하여 애플리케이션에 액세스할 수 있어야 합니다.

참고: AWS Cloud9 IDE에서 애플리케이션을 실행하는 경우 application.py 파일의 application.run() 명령을 다음과 같은 줄로 바꿔야 합니다.

application.run(host=os.getenv('IP', '0.0.0.0'),port=int(os.getenv('PORT', 8080)))

배포하기 전에 이 변경 내용을 되돌려야 합니다.

Python 개발자
작업설명필요한 기술

Elastic Beanstalk 애플리케이션을 시작합니다.

프로젝트를 Elastic Beanstalk 애플리케이션으로 시작하려면 애플리케이션의 루트 디렉터리에서 다음의 명령을 실행합니다.

eb init -p python-3.6 comprehend_flask --region us-east-1

중요:

  • comprehend_flask(은)는 Elastic Beanstalk 애플리케이션의 이름이며, 요구 사항에 따라 변경할 수 있습니다. 

  • 리전을 원하는 리전으로 바꿀 수 있습니다. 리전을 지정하지 않으면 CLI의 기본 리전이 사용됩니다.

  • 이 애플리케이션은 Python 버전 3.6으로 제작되었습니다. 다른 Python 버전을 사용하는 경우 오류가 발생할 수 있습니다.

더 많은 배포 구성 옵션을 보려면 eb init -i 명령을 실행합니다.

아키텍트, 개발자

Elastic Beanstalk 환경을 배포합니다.

애플리케이션의 루트 디렉터리에서 다음의 명령을 실행합니다.

eb create comprehend-flask-env

참고: comprehend-flask-env(은)는 Elastic Beanstalk 환경의 이름이며, 요구 사항에 따라 변경할 수 있습니다. 이름은 문자, 숫자 및 대시만 포함할 수 있습니다.

아키텍트, 개발자

Amazon Comprehend를 사용할 수 있도록 배포를 승인합니다.

애플리케이션을 성공적으로 배포할 수 있더라도, Amazon Comprehend에 대한 액세스 권한과 함께 배포를 제공해야 합니다. ComprehendFullAccess(은)는 Amazon Comprehend에 API를 호출할 수 있는 권한을 배포된 애플리케이션에 제공하는 관리형 정책입니다.

다음 명령을 실행하여 ComprehendFullAccess 정책을 aws-elasticbeanstalk-ec2-role(이 역할은 배포의 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 대하여 자동으로 생성됨)에 연결합니다.

aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/ComprehendFullAccess --role-name aws-elasticbeanstalk-ec2-role

중요: aws-elasticbeanstalk-ec2-role(은)는 애플리케이션 배포 시 생성됩니다. Identity and Access Management(IAM) 정책을 연결하려면 배포 프로세스를 완료해야 합니다.

개발자, 보안 아키텍트

배포된 애플리케이션을 방문합니다.

애플리케이션이 성공적으로 배포되면 eb open 명령을 실행하여 해당 애플리케이션을 방문할 수 있습니다.

eb status 명령을 실행하여 배포에 대한 세부 정보를 받을 수도 있습니다. 배포 URL은 CNAME 아래에 나열되어 있습니다.

아키텍트, 개발자
작업설명필요한 기술

새 모델에 액세스할 수 있도록 Elastic Beanstalk를 승인합니다.

Elastic Beanstalk에 새 모델 엔드포인트에 필요한 액세스 권한이 있는지 확인합니다. 예를 들어 Amazon SageMaker 엔드포인트를 사용하는 경우 배포에 엔드포인트를 호출할 권한이 있어야 합니다. 

이에 대한 자세한 내용은 Amazon SageMaker 설명서를 참조하십시오. InvokeEndpoint

개발자, 보안 아키텍트

사용자 데이터를 새 모델로 보냅니다.

이 애플리케이션에서 기본 ML 모델을 변경하려면 다음 파일을 변경해야 합니다.

  • comprehend_helper.py - 이것은 Amazon Comprehend에 연결하여 응답을 처리하고 최종 결과를 애플리케이션에 반환하는 Python 스크립트입니다. 이 스크립트에서는 데이터를 클라우드의 다른 AI 서비스로 라우팅하거나 사용자 지정 모델 엔드포인트로 보낼 수 있습니다. 또한 이 패턴의 논리적 분리와 재사용성을 위해 이 스크립트에서 결과의 형식을 지정하는 것이 좋습니다.

  • application.py - comprehend_helper.py 스크립트나 함수의 이름을 변경하는 경우 해당 변경 내용을 반영하도록 애플리케이션 application.py 스크립트를 업데이트해야 합니다.

데이터 사이언티스트

대시보드 시각화를 업데이트합니다.

일반적으로 새 ML 모델을 통합하면 새 결과를 반영하도록 시각화를 업데이트해야 합니다. 이 변경은 다음과 같이 이루어졌습니다.

  • templates/dashboard.html - 사전 빌드된 애플리케이션은 두 가지 기본 시각화만 담당합니다. 이 파일에서 페이지의 전체 레이아웃을 조정할 수 있습니다.

  • static/js/core.js – 이 스크립트는 Flask 서버의 /data 경로의 형식화된 출력을 캡처하고, Plotly를 사용하여 시각화를 만듭니다. 페이지의 차트를 추가하거나 업데이트할 수 있습니다.

웹 개발자
작업설명필요한 기술

애플리케이션의 요구 사항 파일을 업데이트합니다.

변경 내용을 Elastic Beanstalk에 보내기 전에 애플리케이션의 루트 디렉터리에서 다음 명령을 실행하여 새 Python 모듈을 반영하도록 requirements.txt 파일을 업데이트합니다.

pip freeze > requirements.txt

Python 개발자

Elastic Beanstalk 환경을 재배포합니다.

애플리케이션 변경 사항이 Elastic Beanstalk 배포에 반영되도록 하려면 애플리케이션의 루트 디렉터리로 이동하여 다음 명령을 실행합니다.

eb deploy

그러면 최신 버전의 애플리케이션 코드가 기존 Elastic Beanstalk 배포로 전송됩니다.

시스템 관리자, 아키텍트

관련 리소스

추가 정보

문제 해결 목록

다음은 6가지 일반적인 오류와 해결 방법입니다.

오류 1 

Unable to assume role "arn:aws:iam::xxxxxxxxxx:role/aws-elasticbeanstalk-ec2-role". Verify that the role exists and is configured correctly.

해결 방법: eb create 실행 시 이 오류가 발생하면 Elastic Beanstalk 콘솔에서 샘플 애플리케이션을 생성하여 기본 인스턴스 프로파일을 생성합니다. 이에 대한 자세한 내용은 Elastic Beanstalk 설명서에서 Elastic Beanstalk 환경 생성을 참조하십시오.

오류 2

Your WSGIPath refers to a file that does not exist.

해결 방법: Elastic Beanstalk는 Flask 코드의 이름이 지정될 것으로 예상하기 때문에 배포 로그에서 이 오류가 발생합니다. application.py 다른 이름을 선택한 경우 다음 코드 샘플에 표시된 대로 eb config(을)를 실행하고 WSGIPath를 편집합니다.

aws:elasticbeanstalk:container:python: NumProcesses: '1' NumThreads: '15' StaticFiles: /static/=static/ WSGIPath: application.py

application.py(을)를 파일 이름으로 바꿔야 합니다.

Gunicorn 및 Procfile을 적극 활용할 수도 있습니다. 이 접근 방식에 대한 자세한 내용은 Elastic Beanstalk 설명서에서 Procfile을 사용하여 WSGI 서버 구성을 참조하십시오.

오류 3

Target WSGI script '/opt/python/current/app/application.py' does not contain WSGI application 'application'.

해결 방법: Elastic Beanstalk는 Flask 애플리케이션을 대표하는 변수의 이름이 지정될 것으로 예상합니다. application application.py 파일은 application(을)를 변수 이름으로 사용해야 합니다.

application = Flask(__name__)

오류 4

The EB CLI cannot find your SSH key file for keyname

해결 방법: EB CLI를 사용하여 어떤 키 페어를 사용할지 지정하거나 배포의 EC2 인스턴스를 위한 키 페어를 생성합니다. 오류를 해결하려면 eb init -i(을)를 실행합니다. 그러면 옵션 중 하나에 다음 메시지가 표시됩니다.

Do you want to set up SSH for your instances?

Y(으)로 응답하여 키 페어를 생성하거나 기존 키 페어를 지정합니다.

오류 5

코드를 업데이트하고 재배포했지만 배포에 변경 사항이 반영되지 않습니다.

해결 방법: 배포와 함께 Git 리포지토리를 사용하는 경우 재배포 전에 변경 내용을 추가하고 커밋해야 합니다.

오류 6

AWS Cloud9 IDE에서 Flask 애플리케이션을 미리보기 실행 중에 오류가 발생했습니다.

해결 방법: 이에 대한 자세한 내용은 AWS Cloud9 설명서에서 AWS Cloud9 IDE의 실행 중인 애플리케이션 미리보기를 참조하십시오.

Amazon Comprehend를 사용하는 자연어 처리

Amazon Comprehend를 사용을 선택하여 실시간 분석 또는 비동기 배치 작업을 실행함으로써 개별 텍스트 문서에서 사용자 지정 개체를 탐지할 수 있습니다. 또한 Amazon Comprehend를 사용하면 엔드포인트를 생성하여 실시간으로 사용할 수 있는 사용자 지정 개체 인식 및 텍스트 분류 모델을 훈련할 수 있습니다.

이 패턴은 비동기 배치 작업을 사용하여 여러 문서가 포함된 입력 파일에서 감성과 개체를 탐지합니다. 이 패턴에서 제공하는 샘플 애플리케이션은 사용자가 행당 하나의 텍스트 문서와 함께 하나의 열이 들어 있는 .csv 파일을 업로드하도록 설계되어 있습니다. 플라스크와 comprehend_helper.py AWS Elastic Beanstalk 리포지토리를 사용한 AI/ML 모델 결과 GitHub 시각화에 있는 파일은 입력 파일을 읽고 처리를 위해 Amazon Comprehend로 입력을 전송합니다.

BatchDetectEntities

Amazon Comprehend는 이름이 지정된 개체가 있는지 문서 배치의 텍스트를 검사하여 탐지된 엔터티, 위치, 엔터티 유형, 그리고 Amazon Comprehend의 신뢰 수준을 표시하는 점수를 반환합니다. 한 번의 API 직접 호출로 최대 25개의 문서를 전송할 수 있으며, 각 문서의 크기는 5,000바이트 미만입니다. 사용 사례에 따라 특정 엔터티만 표시하도록 결과를 필터링할 수 있습니다. 예를 들어 ‘quantity’ 개체 유형을 건너뛰고 탐지된 개체에 대한 임계값 점수(예: 0.75)를 설정할 수 있습니다. 임계값을 선택하기 전에 특정 사용 사례에 대한 결과를 살펴보는 것이 좋습니다. 이에 대한 자세한 내용은 Amazon BatchDetectEntitiesComprehend 설명서를 참조하십시오.

BatchDetectSentiment

Amazon Comprehend는 수신 문서 배치를 검사하여 각 문서에 대한 일반적인 감성을 반환합니다(POSITIVE, NEUTRAL, MIXED 또는 NEGATIVE). 한 번의 API 직접 호출로 최대 25개의 문서를 전송할 수 있으며, 각 문서의 크기는 5,000바이트 미만입니다. 감성에 대한 분석은 간단하며, 사용자가 가장 높은 점수의 감성을 선택하여 최종 결과에 표시합니다. 이에 대한 자세한 내용은 Amazon BatchDetectSentimentComprehend 설명서를 참조하십시오.

 

Flask 구성 처리

Flask 서버는 일련의 구성 변수를 사용하여 서버 실행 방법을 제어합니다. 이러한 변수에는 디버그 출력, 세션 토큰 또는 기타 애플리케이션 설정이 포함될 수 있습니다. 애플리케이션이 실행 중인 상태에서 액세스할 수 있는 사용자 지정 변수를 정의할 수도 있습니다. 구성 변수를 설정하는 방법은 여러 가지가 있습니다.

이 패턴에서는 구성이 config.py에 정의되고 application.py 내에서 상속됩니다.

  • config.py에는 애플리케이션의 스타트업 시 설정되는 구성 변수가 포함됩니다. 이 애플리케이션에서는 서버를 디버그 모드에서 실행하도록 애플리케이션에 지시하는 DEBUG 변수가 정의됩니다. 참고: 프로덕션 환경에서 애플리케이션을 실행할 때는 디버그 모드를 사용하면 안 됩니다. UPLOAD_FOLDER(은)는 나중에 애플리케이션에서 참조하여 업로드된 사용자 데이터를 저장해야 하는 위치를 알려주도록 정의된 사용자 지정 변수입니다.

  • application.py(은)는 Flask 애플리케이션을 시작하고 config.py에서 정의된 구성 설정을 상속합니다. 이는 다음 코드에 의해 수행됩니다.

application = Flask(__name__) application.config.from_pyfile('config.py')