본문 바로가기
Python/Web

[Python, 파이썬] Flask 와 FastAPI - 웹 프레임워크

by coding-choonsik 2023. 7. 21.
728x90
반응형
SMALL

1. Flask

  • 2010년에 Armin Ronacher에 의해 개발된 경량 웹 프레임워크
  • Flask는 최소한의 추상화를 제공하면서도 유연하고 확장 가능한 방식으로 웹 어플리케이션을 구축할 수 있음
  • [플라스크 홈페이지]
    더보기
    https://flask.palletsprojects.com/en/2.3.x/
 

Welcome to Flask — Flask Documentation (2.3.x)

 

flask.palletsprojects.com

 

 

1-1. 예제 다루기

 

✅ 새로운 프로젝트에 'app.py' 파일 생성

 

 

✅ Flask 패키지 설치

 

 

app = Flask(__name__)
# __name__: 스페셜메소드(이 프로그램의 이름을 알려줌), 외부에서 임포트를 할 경우에는 외부 파이썬 파일의 이름이 들어옴

@app.route('/')
def hello():
    return 'Hello Flask!!'




# 자체적으로 실행할 경우(if문이 실행되지않는 경우는 외부에서 임포트한 경우)
if __name__ == '__main__':
    app.run(debug=True)  # 에러가 날 경우 표시함, 배포시에는 False

1-2. 머신러닝 결과를 서버로 띄우기

 

✅ 패키지 설치

▲ Settings ➡️ Project 선택 ➡️ 필요한 패키지 Install

 

✅ LinearSVC 모델을 만들고 학습하는 모듈 파일 만들기

import torch
import torch.nn as nn
import torch.optim as optim

# 학습데이터
x_train = torch.FloatTensor([[73, 80, 85],
                             [93, 88, 93],
                             [89, 91, 90],
                             [96, 98, 100],
                             [76, 66, 70]])

y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])

# 모델 설계(선형회귀)
model = nn.Linear(3, 1)

# 옵티마이저는 SGD 사용
optimizer = optim.SGD(model.parameters(), lr=0.00001)

# 학습
epochs = 1000

for epoch in range(epochs+1):
    y_pred = model(x_train)
    loss = nn.MSELoss()(y_train, y_pred)
    optimizer.zero_grad()  # 기울기 초기회
    loss.backward()    # 역전파
    optimizer.step()   # 기울기 업데이트
    if epoch % 100 == 0:
        print(f'Epoch {epoch}/{epoch}  Loss: {loss: .6f}')

torch.save(model.state_dict(), 'model.pth')  # 학습 모델 저장

 

✅ 머신러닝 모델을 불러와 서버에서 json형태로 데이터를 보내고  결과 띄우기

from flask import Flask, request, jsonify
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score

app = Flask(__name__)

learn_data = [[0, 0], [1, 0], [0, 1], [1, 1]]

learn_label = [0, 0, 0, 1]

svc = LinearSVC()

svc.fit(learn_data, learn_label)

@app.route('/predict', methods=['POST'])
def predict():
    data = request.json['data']
    pred = svc.predict(data)
    acc = accuracy_score(learn_label, pred)
    return jsonify(acc)




if __name__ == '__main__':
    app.run(debug=True)

2. FastAPI

  • 비교적 최근에 등장한 웹 프레임워크
  • 파이썬 3.6 버전 부터 지원
  • Type Annotation을 사용 (@을 쓰는 방식)
  • 풍부한 자유도(무겁게 사용할수도 가볍게 사용할수도 있음)
  • 자동 스웨거(Swagger) 지원
    • 포스트맨을 사용하지 않고 포스트맨 기능을 구현할 수 있는 화면이 있음
  • 큰 커뮤니티가 있지만 아직 작은 생태계(파이썬보다 자바 웹 개발자 규모가 크기 때문)

2-1. Uvicorn

  • ASGI(Asynchronous Server Gateway Interface) 서버
  • 비동기 처리를 지원하며, 높은 성능을 발휘할 수 있음
  • 비동기 처리
    • 작업들이 동시에 진행되거나, 한 작업의 결과를 기다리지 않고 다른 작업을 동시에 실행하는 프로그래밍 패턴
  • 멀티스레드 방식보다 더욱 빠른 속도를 보장
  • Swagger와 같은 API 문서 자동화 기능을 제공
  • API 개발 시 생산성을 높일 수 있음

▲ uvicorn 설치 코드
▲ uvicorn 실행, 밑줄은 파일명

 

2-2. Swagger

  • API 문서를 자동으로 생성해주는 강력한 도구
  • API의 엔드포인트, 파라미터, 응답 형식 등을 시각적으로 표현하여 사용자가 API를 쉽게 이해하고 테스트할 수 있도록 도와줌
  • http://127.0.0.1:8000/docs

▲ FastAPI의 url별 파라미터와 결과도 입력해볼 수 있음

2-3. 예제 다루기

 

✅ FastAPI 패키지 설치

 

 

▲ settings ➡ project ➡ Install Package

 

✅ get방식으로 서버에 데이터 띄우기

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def index():
    return {"index": "Hello! FastAPI"}


@app.get("/math/sum")
def math_sum(num1: int, num2: int):
    return {"result": num1 + num2}

📍 터미널에 uvicorn 실행코드를 실행시켜 서버를 띄운다!

▲docs에서 확인해볼 수도 있음(포스트맨으로 확인해도됨!)

 

 

✅ Flask로 구현한 선형회귀 모델을 FastAPI를 이용하여 구현해 보자.(POST 방식으로)

 

📄 모델 파일

model.pth
0.00MB

import torch
import torch.nn as nn
from fastapi import FastAPI, Request

app = FastAPI()
model = nn.Linear(3, 1)
model.load_state_dict(torch.load('model.pth'))
model.eval()

@app.post("/predict/")
async def predict(request: Request):
    data = await request.json()
    data = data["data"]
    x_test = torch.FloatTensor(data)
    y_pred = model(x_test)
    return {
        "pred": y_pred.tolist()
    }

 

📍 포스트맨으로 결과 확인

728x90
반응형
LIST