Build Docker image & Serving

류창훈·2024년 2월 11일

MLOps

목록 보기
2/2

Introduction



이번 포스팅은
서버 구축, 도커 이미지 빌드, 클라우드 배포 명령어 등, 맨날 까먹어서 이렇게 정리를 해봅니다.


저번에 글 써서 올렸던, GCP vertex ai는 매우 편리하고, 강력한 도구이지만, 비용이 꽤 비싸다는 유일한 단점이 있습니다.


아무 생각없이 안 껐더니, 보름도 안돼서 무료 크레딧이 사라져 있었다....


그래도 개발을 하려면, 어떻게든 배포는 해야하는 상황이라서,

그나마 좀 저렴하게 배포할 수 있는 전체적인 흐름을 정리하자면 다음과 같습니다.

1. Flask나 Fast api 로 서버 구축.
2. 도커 컨테이너 이미지 화.
3. GCP VM 인스턴스 배포.





서버 구축



from flask import Flask, render_template, request, send_file
import cv2
import numpy as np
from io import BytesIO
import base64

app = Flask(__name__)

def convert_image_to_grayscale(image):
    grayscale_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    return grayscale_image

@app.route('/', methods=['GET', 'POST']) 
def index():
    if request.method == 'POST':
        uploaded_file = request.files['file']
        if uploaded_file.filename != '':
            image_stream = BytesIO(uploaded_file.read())
            image_stream.seek(0)
            file_bytes = np.asarray(bytearray(image_stream.read()), dtype=np.uint8)
            image = cv2.imdecode(file_bytes, cv2.IMREAD_COLOR)

            option = request.form.get('option')

            if option == '흑백변환':
                grayscale_image = convert_image_to_grayscale(image)
                _, img_encoded = cv2.imencode('.png', grayscale_image)
                grayscale_img_base64 = base64.b64encode(img_encoded).decode('utf-8')
                return render_template('results.html', processed_image=grayscale_img_base64) 

    return render_template('index.html') 
    
                                      
if __name__ == '__main__':
    app.run('0.0.0.0', port=5000, debug=True)

위의 코드는 flask로 구현한 app.py 파일의 코드 구성입니다.

어떤 이미지를 넣었을 때, 흑백으로 변환하는 매우 단순한 파이썬 코드이고,

눈여겨 봐야 할 부분은, get, post 파트 입니다.

이는 어떤 요청(request)이 왔을 때 응답(response) 한다는 의미 입니다.



그리고 아래에 보면, render_template가 보이는데,
이걸 rendering 이라고 부릅니다.

즉, 쉽게 말하면 어떤 그래픽, 웹 디자인 그런걸 생성하는 걸 의미하고,

여기서는 각각 results.html, index.html 파일을 렌더링 해줬습니다.



그리고 밑에 port=5000이 보이는데, 이는 도커의 기본 포트 번호가 5000 이어서 이렇게 지정을 해줬습니다.


이는 본인이 원하는 포트 번호로 지정해주면 될 것 같습니다.


결론적으로,

전체 파일의 구성은

이런식으로 구성이 되어야 하는데,

전체 코드는 아래 링크를 통해서 보시면 될 것 같습니다.



아무쪼록, 세세한 코드 설명은 최소화 하고,

이번 포스팅의 초점은 서버 구축, 배포 이다.

도커 컨테이너, 이미지화 하는 명령어를 정리하자면,

docker build -t _________  .
docker tag ___________________
docker push _______________

의 명령어를 쳐주면,

이런식으로, 도커 이미지가 생성된게 보입니다.


잘 생성된 거 확인 후,

docker run -p 5000:5000 _____________

이렇게 도커 이미지를 실행시켜주고,

localhost:5000에 접근을 하면, 이 코드가 잘됐는지 잘못됐는지 확인 가능합니다.


아마 잘 되었을거라는 가정 하에, 다음 단계 진행하도록 하겠습니다.





GCP Serving

먼저, GCP에 접속을 하여, VM 인스턴스를 하나 생성해줘야 합니다.

VM 인스턴스 생성은 다른 자료에도 많으니 그걸 참고 하시면 될 것 같고,

그래도 최대한 저렴한거로 하는게 좋다.

주의해 주어야 할 부분은 위에 방화벽 구간 입니다.

모든 트래픽 허용을 선택해야, IP 접속 시, 원활하게 접속 가능합니다.


만들기 버튼을 클릭하시고,

다음과 같이 VM 인스턴스 하나가 생성된 것이 보일 겁니다.


아까 위에는 내가 전에 사용한게 있어서 보인 것이다.

옆에 SSH 를 클릭하시고,

>> sudo apt-get update
>> sudo apt-get install docker.io
>> sudo docker pull 본인이 허브에 올린 도커 이미지 이름
>> sudo docker run -d -p 5000:5000 생성한 도커 이미지 이름

이렇게 입력하시고,

외부 IP 접속 시, 접속이 안됩니다.


이는 접속 권한 부여를 안해줘서 그렇고,
이를 해결하기 위해서는, VPC 네트워크에 대한 설정이 추가적으로 필요한데,

검색창에 방화벽을 검색하셔서 들어가시면,

아래와 같은 것을 볼 수 있습니다.



여기서 방화벽 규칙 만들기를 누르고,

아래와 같이 설정을 한 후, 만들기를 누르시고,

다시 외부 IP:5000으로 접속을 하시면, 원활히 접속이 됩니다.


GCP 내부 작업이 우리의 손처럼 빠르지는 않으니, 조금 기다렸다가 확인해보자.




DuckDNS



이제, http 형태의 주소로 만들어 줄 것 입니다.

구글창에 Duck DNS를 검색하게 되면, 위의 오리가 보일 겁니다.


슥 들어가면,

저 오리가 좀 크게 뜨는 어떤 사이트가 나오게 되는데,


디자인은 좀 허접한데... 이상한거 아니다.

거기서 add domain 버튼을 누르고,

current ip 에 아까 보였던, 외부 ip 를 넣어서 생성해 주게 되면,

이제 http:// 형태의 주소로 접속을 할 수 있게 되는 웹 사이트 하나가 만들어 집니다.


위에서 포트 번호를 5000으로 설정해줘서,

'설정한 도메인 값.duckdns.org:5000'

으로 접속을 하면 됩니다.






감사합니당 ~ 🦾





참고자료

https://github.com/Ryuchanghoon/Blog_Code/tree/main/Cloud_Deployment

profile
Vision AI Researcher

0개의 댓글