인공지능

[Python] 그림 분석 모델 개발 일지(1) - 서버 기본 세팅

tony1724 2025. 3. 19. 16:55

1일차 : 서버 기본 세팅

목표: 서버 실행

서버: FastAPI 서버

  • FastAPI를 사용한 이유
    1. 고성능 비동기 처리 지원 (Flask보다 빠름)
    2. 자동 API 문서 (Swagger UI 제공)
    3. 이미지 업로드 & JSON 반환이 용이함
    4. 배포하기 용이 (Uvicorn을 사용해 빠르게 실행 가능)
  • 요약 : 낮은 진입장벽, 테스트 개발 유용함

 

1. 파이썬 및 기본 라이브러리 다운

https://www.python.org/downloads/release/python-3132/

최신 버전인 파이썬 3.13.2를 다운 받았다.

 

지피티가 시키는 대로 권장 라이브러리를 우선적으로 다운 받았다.

PS C:\\Users\\hofa\\Desktop\\python> pip install fastapi uvicorn pillow tensorflow numpy
  • 뭐하는 라이브러리?
    • fastapi → API 서버
    • uvicorn → FastAPI 서버 실행
    • pillow → 이미지 변환을 위한 라이브러리
    • tensorflow → 딥러닝 모델 사용
    • numpy → 이미지 데이터를 배열로 변환
  • 추가적으로 다운한 라이브러리
    • scikit-learn → 머신러닝 모델 학습 및 평가
    • matplotlib → 데이터 시각화(테스트용)
    • quickdraw → Google QuickDraw 데이터셋을 처리하는 라이브러리

에러 발생

ERROR: Could not find a version that satisfies the requirement tensorflow (from versions: none)

[notice] A new release of pip is available: 24.3.1 -> 25.0.1
[notice] To update, run: python.exe -m pip install --upgrade pip
ERROR: No matching distribution found for tensorflow

 

찾아보니 파이썬 3.13.2버전에서는 지원하지 않는 라이브러리가 있어서 버전을 3.10.0으로 다운그레이드 하였다.

https://www.python.org/downloads/release/python-3100/

pip version : 21.2.3

 

이후 pip list로 제대로 라이브러리가 다운되었는지 확인하였다.

Package                      Version
---------------------------- -----------
absl-py                      2.1.0
annotated-types              0.7.0
anyio                        4.8.0
astunparse                   1.6.3
certifi                      2025.1.31
charset-normalizer           3.4.1
click                        8.1.8
colorama                     0.4.6
contourpy                    1.3.1
cycler                       0.12.1
exceptiongroup               1.2.2
fastapi                      0.115.11
flatbuffers                  25.2.10
fonttools                    4.56.0
gast                         0.6.0
google-pasta                 0.2.0
grpcio                       1.70.0
h11                          0.14.0
h5py                         3.13.0
idna                         3.10
joblib                       1.4.2
keras                        3.8.0
kiwisolver                   1.4.8
libclang                     18.1.1
Markdown                     3.7
markdown-it-py               3.0.0
MarkupSafe                   3.0.2
matplotlib                   3.10.1
mdurl                        0.1.2
ml-dtypes                    0.4.1
namex                        0.0.8
numpy                        2.0.2
opt_einsum                   3.4.0
optree                       0.14.1
packaging                    24.2
pillow                       11.1.0
pip                          21.2.3
protobuf                     5.29.3
pydantic                     2.10.6
pydantic_core                2.27.2
Pygments                     2.19.1
pyparsing                    3.2.1
python-dateutil              2.9.0.post0
python-multipart             0.0.20
quickdraw                    1.0.0
requests                     2.32.3
rich                         13.9.4
scikit-learn                 1.6.1
scipy                        1.15.2
setuptools                   57.4.0
six                          1.17.0
sklearn                      0.0
sniffio                      1.3.1
starlette                    0.46.0
tensorboard                  2.18.0
tensorboard-data-server      0.7.2
tensorflow                   2.18.0
tensorflow_intel             2.18.0
tensorflow-io-gcs-filesystem 0.31.0
termcolor                    2.5.0
threadpoolctl                3.5.0
typing_extensions            4.12.2
urllib3                      2.3.0
uvicorn                      0.34.0
Werkzeug                     3.1.3
wheel                        0.45.1
wrapt                        1.17.2

 

2. 서버 실행

우선 특정 url로 get 요청을 할 경우 “hello”를 반환해주는 아주 기본적인 서버를 구축해보았다.

from fastapi import FastAPI

app = FastAPI()

@app.get("/test")
async def say_hello():
    return {"message": "hello"}

 

app이라는 FastAPI 인스턴스를 생성하여, /test url로 get 요청을 할 경우 hello라는 json 응답을 반환한다.

 

서버 실행법 1

uvicorn main:app --host 0.0.0.0 --port=8000 --reload

 

가장 기본적인 방법으로, uvicorn으로 FastAPI 서버를 실행하는 방법이다.

8000포트로 서버를 열며, —reload를 통해 변경된 내용을 자동으로 반영해준다.

 

서버 실행법 2

위의 방식은 매우 번거롭기 때문에 아래와 같은 방법을 사용할 수도 있다.

python main.py

 

이 방법은 아래의 코드를 추가하여야 한다.

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

 

코드를 간단하게 설명하자면, 해당 파일을 스크립트로 실행하였을 경우 name 변수가 main으로 변경되어 트리거 되는 원리이다.

 

python main.py 처럼 해당 파일을 실행하면 uvicorn으로 FastAPI 서버를 실행해준다.

 

다만, reload 옵션을 주지 못하기 때문에 개발환경에서는 실행법 1을 사용하는 것이 좋아보인다.

 

다음은 내가(지피티가) 간단히 개발한 Quick Draw 모델을 적용하여 PNG를 받아 제시어를 예측하여 반환해주는 서버를 제작해보겠다.