(4-2) AWS

Yongjoo Lee·2020년 12월 22일
2
post-thumbnail

AWS를 활용한 인공지능 모델 배포

클라우드 환경에서의 인공지능 모델 서빙 API 개발

클라우드 기초

클라우드 등장 이전

과거에는 인터넷 환경에서 서비스를 제공하기 위해 서비스 제공자는 서비스 호스팅에 필요한 모든 것을 직접 구축

  • 데이터 센터(물리적 공간)
  • 서버,저장소
  • 네트워크 방화벽, 보안
  • 운영체제, 기타 개발도구
  • 전기, 온도, 습도 관리
  • 운영/관리 인력

⚠️ 하지만 서버를 직접 구축하고 운영하는 자원과 인력 비용이 크고 운영 상황의 변화에 능동적으로 대응하기 어려움

회사나 조직이 직접 모든 것을 구축하고 운영하지 않도록 도와주는 IDC 등장

📌 IDC (Internet Data Center)

  • 서버 운영에 필요한 공간, 네트워크, 유지 보수 등의 서비스를 제공
  • IDC 입주자가 직접 서버를 구입하여 들어오기도 하지만 유휴 자원이 발생하기 때문에 IDC에서 서버를 임대해주기도 함
  • 하지만,
    • 서버 임대를 통해 자원을 효율적으로 이용하고 비용을 줄일 수 있었지만
      대부분의 IDC의 서버 임대는 계약을 통해 일정 기간 임대를 하는 유연성이 떨어지는 구조 (원하는 대로 자유롭게 조정할 수 없음)

클라우드 컴퓨팅 등장 배경

인터넷 사용자가 크게 증가하고 다양한 서비스를 제공하게 되면서 필요한 때에 필요한 만큼 서버를 증설하기 원하는 On-Demand 수요가 증가!

  • IT 기술과 인프라가 빠르게 발전하면서 기존의 서버 구축이나 운영 방식으로는 적절한 시간에 필요한 서비스를 사용자에게 제공하기 어려움 존재
  • 개별 서버 자원 사용률은 평균 10~15%로 매우 낮았으며, 같은 자원을 다른 여러 사용자와 공유함으로써 사용률을 향상시켜 자원의 효율적인 활용과 이를 통한 비용 절감을 추구하고 하였음

☁️Cloud Computing

클라우드라고 부르기도 하며 "인터넷 기반 컴퓨팅의 일종"

  • 언제 어디서나 필요한 만큼의 컴퓨팅 자원을 필요한 시간만큼 인터넷을 통하여 활용할 수 있는 컴퓨팅 방식
  • 2006년 아마존이 클라우드를 통한 저장공간 및 연산 자원 제공 서비스인 S3와 EC2를 개시하면서 본격적인 클라우드 컴퓨팅 시대 시작

AWS는 클라우드 컴퓨팅을 클라우드 서비스 플랫폼에서 컴퓨팅 파워, DB 저장공간, 애플리케이션 및 기타 IT자원을 필요에 따라 인터넷을 통해 제공하고 사용한 만큼만 비용을 지불하는 것으로 정의

👉 4차 산업혁명 시대에서 빅데이터의 수집, 저장, 분석을 위한 방대한 컴퓨팅 자원과 인공지능 개발을 위한 고성능 컴퓨터를 처음부터 모든 것을 별도로 구입하지 않고도 적은 비용으로 빠르게 필요한 IT 환경 마련 가능

👍 Cloud Computing 장점

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F651fe824-ef34-4a2b-a914-3b799a15825c%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F651fe824-ef34-4a2b-a914-3b799a15825c%2Fimage.png)

  • 속도
    • 주문형 셀프서비스 - 클라우드 제공자와 별도의 커뮤니케이션 없이 원하는 클라우드 서비스를 바로 이용 가능
  • 접근성
    • 인터넷을 통해 사용자의 위치, 시간과 관계없이 어떤 디바이스로도 접근 가능
  • 확장성
    • 갑작스러운 이용량 증거나 변화에 신속하고 유연하게 추가 확장이 가능
  • 생산성
    • 하드웨어, 소프트웨어 들어가는 시간과 비용 절감으로 핵심업무에 집중
  • 보안 및 안정성
    • 클라우드 공급자가 전체적으로 보안이나 안정성에 대해 준비
  • 측정가능성
    • 분초 단위로 사용자가 클라우드 서비스를 사용한 만큼만 계량하여 과금

클라우드 컴퓨팅 운용 모델

클라우드 컴퓨팅은 구축 및 배포 유형에 따라
퍼블릭(Public), 프라이빗(Private), 하이브리드(Hybrid) 클라우드 3 가지 형태로 구분.

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F7fa1b298-b947-4414-abf3-579c9dcac6e8%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F7fa1b298-b947-4414-abf3-579c9dcac6e8%2Fimage.png)

  • 퍼블릭(public)
    • 서비스 유지를 위한 모든 인프라와 IT 기술을 클라우드에서 사용
    • AWS, GCP, Azure와 같은 외부 클라우드 컴퓨팅 사업자가 IT 자원을 소유하고 인터넷을 통해 제공
    • IT 관리 인력이나 인프라 구축 비용이 없는 경우에 유용
  • 프라이빗(private)
    • 고객이 자체 데이터센터에서 직접 클라우드 서비스를 구축하는 형태
    • 가상화기술 사용 - 물리적인 공간을 원하는 대로 쪼개서 가상화 형태로 제공 (유연하게 사용 가능)
    • 내부 계열사나 고객에게만 제공하여 인프라 확충은 쉬우나 IT 기술 확보가 어려운 단점이 있음
    • 보안이 좋고 커스텀이 가능하며 글로벌 클라우드 사업자가 IT 기술만 패키지형태로 판매하기도 함
  • 하이브리드(hybrid)
    • 고객의 핵심 시스템은 내부에 두면서도 외부의 클라우드를 활용하는 형태
    • IT 기술은 클라우드에서 받고 서비스 유지를 위한 인프라는 고객의 것을 혼용
    • 퍼블릭의 경제성과 프라이빗의 보안성을 모두 고려

클라우드 서비스 제공 모델

클라우드 서비스 제공 방식에 따라 IaaS, PaaS, SaaS 3 가지 형태로 구분

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F0c992d54-aea0-4cb5-b2b0-7837046d51c6%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F0c992d54-aea0-4cb5-b2b0-7837046d51c6%2Fimage.png)

  • On-Premises
    • A부터 Z까지 모든 것을 내가 직접 관리
  • IaaS (Infrastructure as a Service, 서비스로서의 인프라스트럭처)
  • PaaS(Platform as a Service, 서비스로서의 플랫폼)
  • SaaS(Software as a Service, 서비스로서의 소프트웨어)

예시 1# 피자를 만든다고 할 때

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F526dc517-1046-4308-a896-e8a7d4aab7b8%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F526dc517-1046-4308-a896-e8a7d4aab7b8%2Fimage.png)

예시 2# 차를 이용하여 이동을 한다고 할 때

클라우드 서비스 제공 사업자

AWS, GCP, Azure, NCP 등 다양한 클라우드 벤더들이 클라우드 서비스를 제공

AWS는 인프라와 기초 서비스 뿐만 아니라 사용자 니즈에 맞는 다양한 어플리케이션 서비스를 제공

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F1d337231-8a27-4145-88ce-37744afd8339%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F1d337231-8a27-4145-88ce-37744afd8339%2Fimage.png)

👉 이 중에서 AWS의 Amazon EC2를 이용할 예정!

(실습) AWS & 실습 환경 세팅

  1. AWS 계정 가입

  2. EC2 생성 & Security group 설정

    1. AMI 선택

      ![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fbe3dc326-a54b-4b5e-a817-ea401fd40333%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fbe3dc326-a54b-4b5e-a817-ea401fd40333%2Fimage.png)

      ![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fecf9c107-5801-4d29-bcf7-b8ef40ac10e1%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fecf9c107-5801-4d29-bcf7-b8ef40ac10e1%2Fimage.png)

      • 딥러닝 AMI가 설치된 EC2를 생성하여 필요 개발 환경 사전 세팅
      • *딥러닝 AMI : Tensorflow, PyTorch, Scikit-learn, Numpy 등 다양한 딥러닝 활용을 위한 패키지가 기본적으로 설치되어 있음.
    2. 인스턴스 유형 선택 & 보안 그룹 설정

      ![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F18caebd0-2bf5-4332-9246-78c179d3acce%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F18caebd0-2bf5-4332-9246-78c179d3acce%2Fimage.png)

      • 원격으로 API 서버에 접근/호출할 수 있도록 사용자 설정 포트를 새로 생성
        • (ex. 포트범위: 5000, 소스 0.0.0.0/0) 후 검토 및 시작
    3. 키 페어 생성 & 인스턴스 시작 검토

      ⚠️ 모든 IP에 대한 포트를 열어주는 것은 보안적으로 좋지는 않지만 간단한 실습 진행을 위해 인스턴스 보안 경고 무시.

      • 시작하기 버튼 클릭
      • 보안을 위한 키 페어 생성을 위해 키 페어 이름을 입력하고 (ex. kdt) "키 페어 다운로드"를 클릭하여 키 페어 다운로드
        (다운로드한 키 페어는 이후 인스턴스에 접속하기 위해 필요)

      ![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fb2a64109-d152-4fec-b4ec-62dd2ac1ebc6%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fb2a64109-d152-4fec-b4ec-62dd2ac1ebc6%2Fimage.png)

      • 인스턴스 시작
  3. 탄력적 IP 설정

    1. 탄력적 IP 생성

      API 서비스를 웹으로 제공한다는 것을 가정 -> 웹으로 제공했을 때는 동일한 주소로 계속해서 변경없이 제공되어야 API로써 기능을 수행할수 있다.

      인스턴스를 중지 또는 종료 후 다시 시작하거나 생성하게 되면 기존 퍼블릭 IP가 변경 됨
      💡 퍼블릭 IP를 고정으로 사용하고 싶을 때 탄력적 IP 주소를 할당할 수 있으나 추가 과금 발생!

  4. VS Code로 환경 테스트

    1. 인스턴스 연결 초기화(initialization)

      💡 초기화 과정을 진행하여야 이후에 원활한 인스턴스 접속이 가능하므로 반드시 진행할 것!

      • 다운로드 받은 키 페어가 있는 위치에서 AWS 가이드에 따라 진행 - SSH 클라이언트 이용

      • 연결 후 확인

        • lscpu
        • conda
        • conda env list
    2. 원격 접속 및 개발을 위한 VS Code 플러그인 설치

      • Remote-SSH
      • Remote Development
    3. 인스턴스에 접속

      • Remote-SSH: Connect to Host... 선택
      • ssh -i "kdt.pem" ubuntu@<public-ip-address> 입력
      • Select SSH configuration file
    4. 터미널 열고 환경 확인

      • conda env list

      ![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fb5fa2673-7849-49ef-93a5-e1a60966a059%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fb5fa2673-7849-49ef-93a5-e1a60966a059%2Fimage.png)

ML 모델을 지원하는 API

ML 모델을 지원하는 API 아키텍처

AWS EC2와 Python Flask 기반 모델 학습 및 추론을 요청/응답하는 API 서버 개발

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fcb14773d-25f4-4502-9572-50d517b21205%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fcb14773d-25f4-4502-9572-50d517b21205%2Fimage.png)

인터페이스

  • 사용자는 기계와 소프트웨어를 제어하기 위해
    인터페이스를 정해진 매뉴얼에 따라 활용하여 원하는 경험을 획득
  • 컴퓨터의 마우스, 키보드와 같이 입력을 위한 인터페이스와
    프린터와 같이 출력을 위한 인터페이스가 있음

👉 인터페이스는 상호 합의된 매뉴얼에 따라 적절한 입력을 받아 기대되는 출력을 제공할 수 있어야 함!

API

  • Application Programming Interface,
    소프트웨어와 소프트웨어 간의 커뮤니케이션을 위한 인터페이스를 의미

👉 노드와 노드 간 데이터를 주고 받기 위한 인터페이스로,
사전에 정해진 정의에 따라 입력이 들어왔을 때 적절한 출력을 전달해야 함.

RESTful API

  • REST 아키텍처를 따르는 API로
    HTTP URI를 통해 자원을 명시하고, HTTP Method를 통해 필요한 연산을 요청하고 반환하는 API를 지칭
  • 데이터나 정보의 교환/요청 등을 위한 인터페이스를 REST 아키텍처를 따라 구현한 API
  • 일반적으로 데이터 값을 담아 요청하고 모델이 추론한 결과에 대한 return을 보통 json 형태로 반환하도록 설계

👉 RESTful API는 요청 메시지만 봐도 어떤 내용으로 되어있는지 알 수 있도록 표현됨

머신러닝의 실제 과정

  1. 문제정의
  2. 데이터준비
  3. 모델 학습 및 검증
  4. 모델 배포
  5. 모니터링

등의 과정을 통해 실제 서비스에 기계학습 모델을 적용

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Ff457b8ee-f3c9-4d84-9fb8-15c140fb5089%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Ff457b8ee-f3c9-4d84-9fb8-15c140fb5089%2Fimage.png)

🔥 우리의 목표는 표시한 부분! → 저장된 모델 파일을 불러와서 실행하고 예측하는 작업

모델 Serving

학습된 모델을 REST API 방식으로 배포하기 위해서
학습된 모델의 Serialization과 웹 프레임워크를 통해 배포 준비 필요

  • 모델을 서빙할 때는 학습 시의 데이터 분포나 처리 방법과의 연속성 유지 필요
  • 모델을 배포하는 환경에 따라 다양한 Serving Framework를 고려하여 활용

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F2c5e0bdc-a996-4058-91ff-40777cd12c60%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F2c5e0bdc-a996-4058-91ff-40777cd12c60%2Fimage.png)

📌

  1. 데이터 전처리, 모델 학습
  2. 학습된 모델 저장
  3. 저장한 모델을 불러오고 API를 통해서 배포

Serialization & De-serialization

학습한 모델의 재사용 및 배포를 위해서 저장하고 불러오는 것

Serialization(직렬화) : 객체를 쉽게 옮길 수 있는 형태로 변환

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F15258f33-fb70-4c98-a70c-9098a6522be0%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F15258f33-fb70-4c98-a70c-9098a6522be0%2Fimage.png)

  • Serialization을 통해 ML/DL 모델 객체를 디스크에 write하여
    어디든 전송하고 불러올 수 있는 형태로 변환
  • De-serialization을 통해 Python 혹은 다른 환경에서 model을 불러와 추론/학습에 사용

👉 모델을 배포하는 환경을 고려해 환경에 맞는 올바른 방법으로 Serialization을 해야 De-serialization 가능

모델 Serving을 위한 Handler의 골격

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fd2b357d2-b6bb-4faa-95d7-c1555fe322f6%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fd2b357d2-b6bb-4faa-95d7-c1555fe322f6%2Fimage.png)

💡 핸들러 없이 하드코딩으로 API를 코딩할 수 있지만,
코드의 관리나 유지 측면에서 Handler를 이용하는 것이 좋다!

모델 Serving을 위한 다양한 프레임워크

딥러닝 모델의 안정적인 serving을 위해
TensorFlow serving이나 TorchServe, TensorRT 같은 프레임워크를 사용하는 것이 일반적

  • Flask와 같은 웹 프레임워크는 클라이언트로부터의 요청을 처리하기 위해 주로 사용
  • 별도의 모델 추론을 위한 API 서버를 운용하여 내부 혹은 외부 통신을 통해 예측/추론값 반환
  • 대용량 데이터 배치처리와 딥러닝 모델의 활용이 늘면서
    multi node, multi GPU 환경에서의 안정적인 모델 서빙을 위한 프레임워크

(실습) Serialization & De-serialization

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F703642fa-5044-4cf7-960b-2ba2e3f5ef36%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F703642fa-5044-4cf7-960b-2ba2e3f5ef36%2Fimage.png)

👉 이번 실습에서는 학습된 모델을 저장하고, 불러오는 작업을 진행하는 것이 목표

실습 환경 세팅

실습 진행을 위해 실습 코드를 깃헙에서 복제

# 아나콘다 가상환경 실행
conda activate pytorch_p36

# template 소스코드 다운로드
git clone https://github.com/sackoh/kdt-ai-aws
cd ./kdt-ai-aws

# 필요 라이브러리 설치
pip install -r requirements.txt

머신러닝 모델 학습

실습 진행을 위해 사전 준비한 코드를 실행하여 모델 학습 및 저장

python train_ml.py

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F3e867cae-1663-4592-8f56-3bbf0676375e%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F3e867cae-1663-4592-8f56-3bbf0676375e%2Fimage.png)

Serialization 코드 확인

Serialization을 수행한 방식대로 De-serialization을 해야 함.

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fe4225a66-24a1-4894-b2cf-df71e7a3699b%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fe4225a66-24a1-4894-b2cf-df71e7a3699b%2Fimage.png)

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F3ee098de-f8b8-46a7-9ef1-fab5e2530a00%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F3ee098de-f8b8-46a7-9ef1-fab5e2530a00%2Fimage.png)

  • Serialization 에 joblib 모듈을 사용
  • ml_model.pkl, ml_vectorizer.pkl 파일이 생성됨

De-serialization

저장된 모델을 불러와 특정 입력 값에 대한 예측 수행

  1. 터미널 환경에서 python 또는 ipython, jupyter notebook 실행
  2. 아래 예제 코드 테스트하여 de-serialization 확인
# De-serialization
>>> import joblib
>>> model = joblib.load('model/ml_model.pkl')
>>> vectorizer = joblib.load('model/ml_vectorizer.pkl')

# Test loaded model and vectorizer
>>> text = '재미있는 영화입니다.'

>>> model_input = vectorizer.transform([text])
>>> model_input
<1x100000 sparse matrix of type '<class 'numpy.int64'>'
        with 2 stored elements in Compressed Sparse Row format>
>>> print(model_input.asformat('array'))
[[0 0 0 ... 0 0 0]]

>>> model_output = model.predict_proba(model_input)
>>> model_output
array([[0.02618814, 0.97381186]])
>>> model_output = model_output.argmax(axis=1)
>>> model_output
array([1])

>>> id2label = {0: 'negative', 1: 'positive'}
>>> print(f'sentiment : {id2label[model_output[0]]}')
sentiment : positive

📌 vectorizer

  • 현재 학습한 데이터는 NLP 관련 데이터이고 한글같은 경우 수치형으로 표현하기 위한 기법이 필요하다.
  • 그 기법 중에서 단어를 음절 단위로 쪼갠 후에 문장내에서 음절이 몇번 반복되었는지,
    몇번 나왔는지 카운팅해서 벡터형태로 표현하는 전처리함 → vectorizer

🔥 Serialization과 De-serialization 방법은 동일해야 함!

  • serialization 할 때 joblib 모듈을 사용하였기 때문에
    de-serialization 할 때도 똑같이 joblib 모듈을 사용

  • joblib으로 serialization을 하고 pickle로 불러올 수 없음

    >>> import pickle
    >>> with open('model/ml_model.pkl', 'rb') as r:
    ...     model = pickle.load(r)
    ... 
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    _pickle.UnpicklingError: invalid load key, '\x00'.
profile
하나씩 정리하는 개발공부로그입니다.