728x90
반응형
SMALL
파일 구조 확인
mv flaskapp myapp
mkdir flaskapp
mv myapp flaskapp
sudo apt install tree
tree ./
라이브러리 버전 확인
pyenv activate py3_11_9
pip list | grep -E 'scikit-learn|Flask|gunicorn|psycopg2'
requirements 작성
flaskapp 디렉토리에서 requirements를 작성한다.
vim requirements.txt
scikit-learn==1.5.0
flask==3.0.3
psycopg2==2.9.9
Dockerfile 파일 생성
마찬가지로, flaskapp 디렉토리에서 Dockerfile를 생성한다.
vim Dockerfile
FROM python:3.11.9
WORKDIR /usr/src/app
COPY . .
RUN python -m pip install --upgrade pip
RUN pip install -r requirements.txt
WORKDIR ./myapp
CMD python main.py
EXPOSE 5000
docker0 IP 주소 확인
ifconfig
host 값을 docker0 IP로 변경한다.
vim main.py
import numpy as np
from sklearn.linear_model import LinearRegression
import psycopg2
from flask import Flask, request, jsonify
app = Flask(__name__)
np.random.seed(0)
X = np.random.rand(10, 1)
y = 2 * X + 1 + 0.1 * np.random.randn(10, 1)
model = LinearRegression()
model.fit(X, y)
@app.route('/')
def welcome():
return 'HELLO, ML API SERVER'
@app.route('/predict', methods=['POST'])
def predict():
data = request.json
new_X = data['input']
new_X_val = float(new_X[0])
input_X = np.array(new_X_val).reshape(1, -1)
y_pred = model.predict(input_X)
y_pred_list = y_pred.tolist()
y_pred_val = round(y_pred_list[0][0], 5)
conn = psycopg2.connect(dbname='ml', user='postgres', password='postgres', host='172.17.0.1', port=5432)
cur = conn.cursor()
query = "INSERT INTO pred_result (input, output) VALUES (%s, %s)"
values = (new_X_val, y_pred_val)
cur.execute(query, values)
conn.commit()
cur.close()
conn.close()
res = jsonify({'input': new_X_val, 'predicted_output': y_pred_val})
return res
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
도커 이미지 빌드
docker image build . -t flaskapi01
docker image ls
인바운드 규칙
컨테이너 실행
docker container run -d -p 80:5000 flaskapi01
"Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use." 에러 발생시 포트가 할당된 것을 확인하여 kill을 수행한다.
sudo lsof -i :80
sudo kill -9 PID
cmd에서 API 요청을 테스트한다.
# window
curl -d "{""input"":[""0.6""]}" -H "Content-Type: application/json" -X POST http://퍼블릭 IP/predict
# mac
curl -d '{"input":["0.6"]}' -H "Content-Type: application/json" -X POST http://퍼블릭 IP/predict
728x90
반응형
LIST
'App Programming > AWS' 카테고리의 다른 글
[AWS] 도커 컴포즈 배포 (0) | 2024.06.11 |
---|---|
[AWS] 도커 컨테이너 nginx 배포 (0) | 2024.06.11 |
[AWS] Flask에 PostgreSQL 적용 (0) | 2024.05.31 |
[AWS] PostgreSQL 설치 (0) | 2024.05.31 |
[AWS] 도커 설치 (0) | 2024.05.30 |