공부/AIFFEL

FUNDAMENTAL 31. Ainize, 나의 원클릭 포트폴리오 만들기

dong_dong_2 2021. 3. 17. 20:59

1. 들어가며
    - 나만의 ML프로젝트, 설명하지 않고 보여줄 수 있다면?
       1) 머신러닝과 관련된 연구, 개발, 공부를 하다보면 프로젝트, 논문, 코드 등 여러가지 매체를 통해 많은 정보를 얻을 수 있다.
       2) 이 많은 정보들 중에서 내가 필요로 하는 정보는 얼마나 될까? 만약 우리의 프로젝트를 누군가에게 보여줘야 할 상황에는 어떻게 해야할까?
       3) 코드들을 설명만 하는 것보다 백문이불여일견이라고 프로젝트가 구동되는것을 볼 수 있다면 좋을 것이다.
    - DevOps to MLOps
       1) DevOPs란 Development Operations를 줄여 쓴 말로, 단순히 코드로 구현만 하는것이 아니라, 실제 제품으로서 프로그램이 살아 숨쉴 수 있도록 모든 과정을 책임지고 수행하는 일을 말한다.
       2) 더 나아가 MLOps란 Machine Learning Operations의 약자로, AI 구현체를 단순히 코드로만 놔두는 것이 아니라 실제 작동하는 AI를 만드는 것이 목표이다.
    - Ainize
       1) 오늘 배울 Ainize 서비스는 단순히 텍스트 형식으로 잠들어 있는 오픈소스 코드에 생명을 불어넣어 준다.
       2) 내가 만든 AI가 살아 숨쉬어 프로그램으로 작동한다면, 많은 사람들이 논문과 코드의 벽에서 막히지 않고, 내 프로젝트를 더 쉽게 접근할 수 있을것이다.
       3) Ainize는 무료 배포(free deployment)와 간단한 환경 설정(simple configuration), 그리고 자동 스케일링 서비스(auto-scaling service)를 제공한다.
    - Ainize를 통해 내 프로젝트에 생명을 불어넣기 위해서는 Docker 설치와 Ainize 서비스 가입이 미리 되어있어야 한다.
    - 이번 노드는 블록체인 클라우드와 인공지능을 통해 가치의 인터넷을 실현하는 기술기업 커먼컴퓨터와의 협력을 통해 제작되었다고 한다.
2. 프로젝트 준비(git fork and docker run)
    - 첫번째 프로젝트
       1) 우리의 첫 Ainize 프로젝트는 손글씨 판독기를 만드는 작업이다.
       2) 마치 처음 AI 접했을 때 MNIST를 바라보았듯이, 서비스화에 초심인 우리가 MNIST 앱을 아이나이즈 해보는 것이다.
       3) 가장 기본이 되는 프로젝트는 mnist-mlp-app이라는 이름으로 github.com/minsulee2/mnist-mlp-app라는 url를 통해 fork했다.

       4) mnist-mlp-app의 구성은 간단하다

          (1) images/, models/라는 두 가지 디렉토리가 있고,
          (2) mnist_mlp.py라는 하나의 파이썬 스크립트가 있는 간단한 구성이다.

          (3) 그리고 이번에 마지막쯤에 다루는 도커라이즈 및 도커 실행을 위한 Dockerfile이라는 파일이 있다.
       5) image/에는 손글씨 이미지 파일이 있다.
       6) models/에는 mnist_mlp 학습을 수행하여 생성한 모델의 정보가 담긴 모델 관련 파일이 있다.
       7) 그리고 mnist_mlp를 살펴봤다.
    - 로컬 프로젝트 구성
       1) 방금 fokr하여 내 것으로 만든 프로젝트를 로컬 프로젝트로 구성해 봤다.
       2) 작업 디렉토리를 만들고, 그 디렉토리에서 git clone을 실행했다.
       3) 그리고 혹시 몰라서 필요한 패키지를 설치하고, mnist_mlp를 실행시켜봤다.
       4) 여기서 얘를 많이 먹었는데 keyerror가 떳다. 그 이유는 어제의 노드는 tensorflow 2.2에서 가능하다 하여 버전을 내렸는데, 이번 노드에서는 2.3이상의 tensorflow가 필요했었다.
3. Docker 맛보기
    - Docker를 사용한 프로젝트 빌드
       1) 이번엔 도커 사용법을 배워보겠다. 사용법을 익히기 전 왜 도커를 사용하는지 설명했다.
       2) 도커의 장점
          (1) Compatibility : 도커의 가장 큰 장점 중 하나로 여러 서비스들(DBs, frameworks, libraries 등등)과 OS의 호환성을 최대한 보장해 준다.
          (2) Independence : 여러 서비스 / OS의 버전에 맞추어 각각의 도커 컨테이너를 생성하고 각 환경을 독립적으로 실행할 수 있다.
          (3) Lightness : 프로그램 자체가 가볍다. 기존 가상 머신 환경을 떠올려보면, 현재 사용하고 있는 OS위에 새로운 OS를 또 설치하고 사용하기 때문에 퍼포먼스가 제대로 나오지 않는다. 하지만 도커의 경우 가장 필요한 OS 컴포넌트들만을 설치 / 제공하여, 새로운 OS를 올리는 것에 부담이 적다.
          (4) DevOps : 소프트웨어 제품을 개발하는데 있어서, 개발 못지않게 서비스 운영 또한 상당히 중요하다. 도커를 이용하면 development, staging, 그리고 production 각 단계에 맞추어 환경을 쉽게 정의할 수 있도록 한다.
          (5) Scalability : 도커 컨테이너는 가볍고 독립적이기 때문에, 쉽게 스케일을 늘리고 줄일 수 있다. 무거운 작업을 수행하는 도커 컨테이너에게는 스케일을 늘려 부하를 줄여주고, 일의 로드가 줄어드는 경우에는 쉽게 스케일을 줄일 수 있다.
       3) 위에서 언급한 장점 이외에도 많은 장점이 있지만, 이정도만 해도 서비스를 운영하기 위해 도커를 이용한 개발의 중요성이 보일 것이다.
       4) 도커 설명은 이정도로 하고 Dokerfile을 살펴봤다. 구성은 상당히 간단했다. 아래 사진이다.


          (1) Line 1 : FROM 키워드는 OS를 구성할 때 사용하는 키워드이다. 그 뒤에 나오는 tensorflow:latest-gpu 키워드는 GPU를 사용하는 tensorflow의 가장 최신버전을 지원하는 OS를 설치하겠다는 의미이다. (이것 때문에 애를 먹었던 것 같다.)
          (2) Line 3 ~ 6 : WORKDIR을 이용해 workspace라는 디렉토리를 생성한다. 그 후 COPY를 이용해 루트(Dockerfile이 있는 곳)에 있는 모든 파일을 workspace로 복사한다.
          (3) Line 8 : RUN를 통해 필요한 디펜던시들(dependency, 참조 라이브러리)을 설치한다. 여기서는 keras, numpy, 그리고 pillow를 설치했다.
          (4) Line 10 : CMD 키워드는 커맨드라인을 실행하는 키워드이다. python3 mnist_mlp.py를 실행했다.

       5) 그리고 도커 빌드(doker build)를 했다. 도커 빌드란 텍스트로 작성돤 Dokerfile을 수 GB의 바이너리 도커 이미지로 빌드하는 것을 의미한다.
          (1) 코드는 sudo docker build -t mnist-mlp-app . 이다
       6) 빌드된 도커를 실행해봤다. 아래의 커맨드를 입력하면 된다.
          (1) sudo docker run mnist-mlp-app

4. 웹서버 준비(Flask)
    - flask를 이용한 웹서비스화
       1) 처음 말한대로 Ainize는 웹 형식으로 서비스를 배포해주는 플랫폼이기 때문에 배포할 프로젝트 안에 가벼운 웹 서버가 포함되어야 한다.
       2) 대부분의 머신러닝 프로젝트들이 파이썬으로 작성된 것을 감안하여, 가벼운 파이썬 웹 서버 프레임워크인 Flask를 이용하여 웹 서버를 만들었다.
    - 그리고 노드에 나와있는대로 server.py와 index.html를 만들어 코딩하고, Dockerfile를 수정해주고 다시 도커빌드 한 뒤 도커를 실행했다.
       1) 위 과정에서 server와 index 파일의 코드들을 살펴봤다.
       2) 이번 스텝에서 코딩이 다 끝난 것이 아니고, 간단하게 server 만들고, index를 통해 웹 제목정도만 넣었다.

4번의 결과

5. HTML 업그레이드 해보기
    - index.html 화면 구성

       1) 지금까지 mnist-mlp라는 간단한 스크립트를 docker 환경에서 구동해보는 것을 시작으로 간단한 웹서버를 만들어 docker 환경에서 띄워봤다.
       2) 아직 mnist-mlp 스크립트와 서버를 연결하지 않았고, app 화면도 구성되지 않았다.
       3) 이번에는 flask app의 화면을 구성해봤다.
       4) <head>만 채웠지 <body>는 비워있었는데 이번에는 <body>를 채웠다. 이 부분도 코드를 살펴보며 채웠다.
       5) 수정한 index파일에 맞게 server파일도 약간 수정한 뒤 도커 빌드 후 실행을 했다.

5번의 결과

6. 서버에 기능 붙이기
    - 서비스 통합배포
       1) 이제 서비스화하기 전 마지막 한 단계만 남았다. 웹 서버와 mnist_mlp파일의 기능을 합쳐보는 것이다.
       2) 그 전에 이미지를 읽어오고, 전처리를 수행하는 코드를 먼저 만들었다. 그리고 image_preprocessor.py라고 저장했다.

          (1) 이 파일은 이미지를 gray scale로 변경하고,
          (2) 28x28의 크기로 사이즈 조정을 하고
          (3) 마지막으로 이미지의 색을 반전시키는 역할을 한다.
       3) 그리고 mnist_mlp파일을 수정했다. 수정내용은 아래에 쓰여진 부분만 수정하고 나머지는 불필요해서 삭제했다.
          (1) 모델을 로드해오는 부분
          (2) predict() 함수를 통해 숫자를 예측 하는 부분
       4) server파일도 수정했다.
       5) 마지막으로 Dockerfile을 수정 한 뒤 도커빌드 -> 도커실행을 했다.

6번의 결과


7. Ainize 서비스 올리기
    - 이번에는 Ainize에 들어가서 내 github 주소를 넣어서 지금까지 했던 작업을 잘 푸시했다.

7번의 결과


8. 실행 및 확인
    - Ainize로 배포된 앱을 실행시켜봤다.
9. (보너스) Run on Ainize 버튼 달아보기
    - 나의 github에 Ainize 버튼을 달아보았다.
       1) Ainize에서 Redeploy 옆에 ... 버튼을 누르면 button snippet 이란 버튼이 나온다. 그걸 클릭하고 옆에 나온 copy라는 버튼을 클릭한다.
       2) 프로젝트에 README.md 파일이 있는데 위에서 copy한 코드를 이 파일에 적절한 곳에 넣어주고 저장한다.
       3) 마지막으로 깃 커밋 & 푸시를 하면 된다.
    - 이번에 배운 것은 github 뿐 아니라 html을 사용할 수 있는 어떤 곳이든 이렇게 배포할 수 있다고 한다.

9번의 결과