머신러닝 모델을 배포하는 방법은 무엇인가요?
최근 몇 년 동안 머신러닝과 인공 지능이 큰 인기를 얻고 있습니다. 이는 자연어 처리 및 추천 시스템의 발전에 힘입은 바가 큽니다.
이 문서에서는 머신 러닝과 그 애플리케이션, 배포 옵션을 소개하고 간단한 머신 러닝 모델을 Back4app 컨테이너에 배포하는 방법을 설명합니다.
머신러닝이란 무엇인가요?
머신러닝은 인공 지능의 하위 분야입니다. 머신러닝의 핵심은 통계 알고리즘을 활용하여 데이터를 학습하고 보이지 않는 새로운 데이터에 대해 예측하는 것입니다.
즉, 컴퓨터가 명시적으로 프로그래밍하지 않고도 학습할 수 있는 기능을 제공합니다.
머신 러닝과 인공 지능은 종종 같은 의미로 사용되지만, 둘은 같은 것이 아닙니다.
머신러닝은 알고리즘과 데이터 구조에 초점을 맞추는 반면, 인공지능은 인간과 같은 사고를 할 수 있는 기계를 만들려는 일반적인 시도입니다.
일반적인 머신러닝 기법은 회귀(집값과 같은 연속적인 값 예측)와 분류(영화 장르와 같은 유한한 클래스 집합에서 클래스 예측)입니다.
일반적으로 머신러닝은 세 가지 유형으로 나눌 수 있습니다:
- 지도 학습 – 알고리즘은 레이블이 지정된 데이터 세트를 사용하여 학습합니다. 데이터 세트의 각 예시에는 레이블(또는 소위 목표 변수)이 포함되어 있습니다. 알고리즘은 이를 사용하여 보이지 않는 예제에 대한 레이블을 예측합니다. 지도 학습 알고리즘에는 kNN, decision trees 등이 포함됩니다.
- 비지도 학습 – 알고리즘은 명시적인 지침 없이 학습합니다. 데이터에서 패턴을 찾고 이를 기반으로 예측을 하는 것은 알고리즘의 몫입니다. 알고리즘의 예로는 K-평균 클러스터링이 있습니다.
- 강화 학습 – 알고리즘은 시행착오를 통해 학습합니다. 일반적으로 보상을 기반으로 하며 알고리즘의 목표는 보상을 극대화하는 것입니다. 예: 유전 알고리즘.
이 글의 실습 부분에서는 일반적인 모델 구축 과정을 살펴보겠습니다. 지도 학습을 사용하여 분류 작업을 해결해 보겠습니다.
머신 러닝 애플리케이션
실제 머신 러닝 애플리케이션을 살펴보겠습니다!
추천 시스템
추천 시스템은 사용자가 어떤 항목(영화, 제품 등)을 소비해야 하는지 제안합니다. 이러한 시스템은 콘텐츠 기반 또는 협업 기반일 수 있습니다.
오늘날 추천 시스템은 거의 모든 회사에서 사용하고 있습니다. 이를 통해 기업은 비즈니스 성공률을 높이고, 추가 수요를 창출하고, 사용자 참여도를 높이고, 고객에 대해 더 많은 것을 배울 수 있습니다.
예를 들어 넷플릭스에서는 영화를 추천하는 데, 스포티파이에서는 노래를 추천하는 데, 유튜브에서는 관심사에 따라 시청할 만한 동영상을 추천하는 데 사용합니다.
자연어 처리(NLP)
자연어 처리(NLP)를 통해 컴퓨터는 인간의 언어를 처리하고 이해할 수 있습니다. 자연어 생성(NLG)은 컴퓨터가 인간의 언어를 생성할 수 있게 해줍니다.
이 기술은 챗봇, 언어 번역 도구, 감정 분석 도구 등에서 사용됩니다. ChatGPT는 NLP와 NLG를 활용하는 가장 유명한 사례 중 하나입니다.
ChatGPT에 대해 더 자세히 알고 싶으신가요? ChatGPT를 사용하여 앱을 만드는 방법이라는 다른 글도 확인해보세요.
컴퓨터 비전 및 이미지 인식
컴퓨터 비전은 컴퓨터가 이미지와 동영상을 ‘보고’ ‘이해할 수 있는’ 능력을 제공합니다. 이를 통해 컴퓨터는 (실시간) 분할을 수행하고, 사물, 얼굴, 심지어 감정까지 인식할 수 있습니다.
사진 앱에서 친구를 자동으로 태그하는 데 사용되는 기술입니다. 또한 감시 시스템에서 의심스러운 행동을 감지하는 데 사용되기도 합니다.
사기 탐지
기업은 거래 또는 사용자 행동에서 의심스러운 활동을 탐지하기 위해 머신러닝을 사용합니다. 이러한 시스템은 트렌드와 이상 징후를 연구하여 잠재적인 사기 행위를 탐지하여 사기와 사이버 범죄로부터 비즈니스와 고객을 보호할 수 있습니다.
자율 주행 자동차
자율 주행은 머신 러닝 문제 중 가장 복잡한 문제 중 하나입니다. 컴퓨터 비전, 이상 감지, 행동 예측, 경로 계획 등과 같은 다양한 애플리케이션이 결합되어 있습니다.
이 글을 쓰는 시점에서 우리는 완전 자율 주행 자동차에 근접하지 못했습니다. 현재의 ‘자율 주행’ 자동차는 제한된 지역에서만 잘 작동합니다.
머신 러닝 배포 옵션
머신 러닝 모델을 배포하려면 일반적으로 웹 애플리케이션에서 모델을 제공합니다. 따라서 머신 러닝 모델 배포 옵션은 웹 애플리케이션을 배포할 때와 거의 동일합니다. 한번 살펴보겠습니다!
온프레미스
온프레미스 배포에는 회사의 실제 구내에서 서버 및 저장 장치와 같은 IT 장비를 호스팅하고 관리하는 작업이 수반됩니다.
이러한 전통적인 전략은 하드웨어와 소프트웨어에 상당한 초기 투자와 지속적인 유지보수 및 지원을 필요로 합니다.
장점은 더 높은 수준의 제어 및 보안과 더 쉽게 사용자 지정할 수 있다는 점입니다. 반면에 단점은 비용, 확장성 및 유지 관리입니다.
클라우드
반면 클라우드 배포는 타사 서비스를 사용하여 인터넷을 통해 인프라와 애플리케이션을 호스팅합니다.
이 모델을 통해 사용자는 클라우드 서비스 제공업체가 처리하는 확장 가능한 리소스 및 서비스에 대해 사용한 만큼만 비용을 지불할 수 있습니다.
확장성, 사용 편의성, 초기 비용이 들지 않는다는 장점이 있습니다. 반면에 단점은 제어 수준이 낮고 유연성이 떨어지며 공급업체에 종속될 수 있다는 점입니다.
클라우드 기반 플랫폼의 예는 다음과 같습니다:
- Back4app
- Amazon Web Services (AWS)
- Google Cloud Platform (GCP)
- Microsoft Azure
인기 있는 머신 러닝 알고리즘
널리 사용되는 머신 러닝 알고리즘은 다음과 같습니다:
- k-Nearest Neighbours (kNN)
- Decision Trees & Random Forests
- Support Vector Machines (SVM)
- Linear Regression
- Naive Bayes
- K-means
실제 예제에서는 k-Nearest Neighbors를 사용하겠습니다.
머신 러닝 모델을 배포하는 방법은 무엇인가요?
이 문서 섹션에서는 머신 러닝 모델을 빌드하고, FastAPI로 제공하고, 도커화하며, 마지막으로 Back4app 컨테이너에 배포하는 방법을 알아봅니다.
전제 조건
- 머신 러닝에 대한 기본 지식
- Python 및 FastAPI 사용 경험
- 도커와 컨테이너화 기술에 대한 기본적인 이해
- 로컬 머신에 설치된 Git 및 Docker Desktop
프로젝트 개요
머신러닝 모델을 배포하는 방법을 설명하기 전에 먼저 모델을 구축해 보겠습니다. 널리 사용되는 홍채 데이터 세트를 사용하여 간단한 kNN 분류기를 만들겠습니다. 이 모델의 목적은 다양한 특징을 기반으로 관찰 대상이 “세토사”, “버시컬러” 또는 “버지니카”인지 예측하는 것입니다.
그런 다음 모델을 파일에 저장하고 FastAPI에서 로드한 다음 엔드포인트를 통해 제공합니다. 그런 다음 앱을 도커라이즈하고 GitHub에 푸시한 다음 Back4app 컨테이너에 배포합니다.
모델 만들기
모델을 만들기 위해 Jupyter Notebooks을 사용하겠습니다. 로컬 컴퓨터에 Jupyter를 설치하거나 Google Colab을 무료로 사용할 수 있습니다.
먼저 새 Jupyter 노트북을 만드세요.
이 글 섹션의 각 코드 블록은 Jupyter 셀을 나타냅니다. 메뉴에서 만들거나 명령 모드에서 “B” 키 바인딩을 사용하여 만들 수 있습니다.
또한 메뉴에서 실행하거나 “ALT + ENTER”를 사용하여 실행하는 것을 잊지 마세요.
첫 번째 셀에 다음 가져오기를 추가합니다:
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from joblib import dump
데이터 세트 로드
홍채 데이터 세트는 기본적으로 Scikit-learn에 포함되어 있습니다. load_iris()
함수를 호출하고 객체를 프레임으로 변환하기만 하면 됩니다.
새 셀을 만듭니다:
df = load_iris(as_frame=True)["data"]
df["target"] = load_iris(as_frame=True)["target"]
홍채 데이터 집합을 로드하면 대상 변수에 따라 정렬됩니다. 이는 머신 러닝 모델이 학습 단계에서 일부 유형의 예만 볼 수 있기 때문에 좋지 않습니다. 예를 들어 ‘세토사’와 ‘버시컬러’만 볼 수 있습니다.
이 문제를 피하기 위해 셔플을 사용하면 됩니다:
df = df.sample(frac=1, random_state=42)
랜덤 상태
속성은 재현성을 위해 사용됩니다. 원하는 숫자를 사용할 수 있습니다.
데이터 집합 살펴보기
모델을 만들기 전에 어떤 데이터를 다루고 있는지 살펴보는 것이 좋습니다. 이를 위해 head()
, describe()
등과 같은 기본 제공 Pandas 함수를 사용할 수 있습니다.
# Displays the first five rows of the dataset
df.head(5)
# Generates descriptive statistics
df.describe()
또한 데이터 집합을 시각화하여 어떤 기능이 예제를 가장 잘 구분하는지, 어떤 머신 러닝 알고리즘이 문제에 유용할 수 있는지 파악해야 합니다.
위의 이미지는 Python을 사용한 데이터 시각화 가이드 문서에서 차용한 것입니다. 데이터 시각화에 대해 자세히 알아보려면 꼭 확인해 보세요.
이미지에서 ‘빨간색’ 점은 다른 두 점과 선형적으로 분리할 수 있음을 보여줍니다. 반면에 ‘파란색’과 ‘녹색’ 점은 선형적으로 분리할 수 없습니다.
데이터 집합 분할
이제 기능(예측자)과 대상 변수를 정의해 보겠습니다:
features = [
"sepal length (cm)", "sepal width (cm)", "petal length (cm)", "petal width (cm)"
]
target = "target"
그런 다음 X
(특징 데이터)와 Y
(목표 변수 데이터)로 추출하고 이를 테스트 훈련으로 분할합니다:
X = df[features].values
y = df[target].values
dev_X, test_X, dev_y, test_y = train_test_split(X, y, test_size=0.25, random_state=42)
test_size=0.25를
사용하면 데이터 세트의 25%가 테스트에 사용되고 75%가 학습에 사용됩니다.
모델 빌드
다음으로, 먼저 데이터를 스케일링한 다음 kNN 분류기를 사용하는 파이프라인을 생성합니다:
knn = Pipeline(steps=[
("scaler", StandardScaler()),
("predictor", KNeighborsClassifier()),
])
knn.fit(dev_X, dev_y)
스케일링이 필수적인 이유를 알아보려면 이 글을 확인하세요.
그런 다음 10배 교차 유효성 검사를 사용하여 유효성 검사 오류를 확인합니다:
cross_val_score(knn, dev_X, dev_y, cv=10, scoring="accuracy").mean()
# 0.9363636363636362
테스트 세트에서 모델을 평가합니다:
accuracy_score(test_y, knn.predict(test_X))
# 0.9736842105263158
검증과 테스트 정확도는 거의 동일합니다. 이는 모델이 과소 적합하거나 과대 적합하지 않다는 것을 의미합니다.
모델 저장
마지막으로 모든 데이터를 사용하여 모델을 재학습하고 model.pkl 파일에 저장합니다:
knn.fit(X, y)
dump(knn, "model.pkl")
Google Colab을 사용 중인 경우 다음 단계에서 필요하므로 model.pk 파일을 다운로드하세요.
서브 모델
앞서 언급했듯이 FastAPI를 사용하여 모델을 제공할 것입니다.
계속해서 새 FastAPI 프로젝트를 생성하고 다음과 같이 main.py를 대체합니다:
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {
"name": "back4app-deploy-ml-model",
"description": "A FastAPI app serving an ML model",
"version": "1.0.0",
}
개발 서버를 시작합니다:
$ uvicorn app.main:app --reload
http://localhost:8000/ 으로 이동하면 다음과 같은 응답이 표시됩니다:
{
"name": "back4app-deploy-ml-model",
"description": "A FastAPI app serving an ML model",
"version": "1.0.0"
}
로드 모델
다음으로 모델을 로드하고 model_classes를
정의해 보겠습니다.
먼저 이전 단계의 model.pkl을 프로젝트의 루트에 복사합니다. 그런 다음 모델을 로드하고 FastAPI 앱 초기화 바로 아래에서 다음과 같이 클래스를 정의합니다:
# ...
model = load("model.pkl")
model_classes = {
0: "setosa",
1: "versicolor",
2: "virginica",
}
# ...
모델_클래스를
사용하여 대상 변수를 숫자에서 텍스트로 변환하겠습니다.
로드 모델
그런 다음 기능을 가져오고 로드된 모델을 사용하여 예측을 수행하는 /predict
엔드포인트를 만듭니다:
# main.py
# ...
class Observation(BaseModel):
"""
A Pydantic model for the observation data.
This is our ML model's input data.
"""
sepal_length: float
sepal_width: float
petal_length: float
petal_width: float
@app.post("/predict")
async def predict(observation: Observation):
predictions = model.predict([[
observation.sepal_length,
observation.sepal_width,
observation.petal_length,
observation.petal_width,
]])
prediction = predictions[0]
prediction_class = model_classes[prediction]
return {
"prediction": int(prediction),
"prediction_class": prediction_class,
}
엔드포인트는 수치 예측과 함께 사용자 친화적인 테스트 예측을 반환합니다.
파일 상단에 있는 가져오기 기능을 잊지 마세요:
from joblib import load
from pydantic import BaseModel
최종 main.py는 다음과 같은 모습이어야 합니다.
개발 서버를 다시 시작하고 자주 사용하는 웹 브라우저에서 http://localhost:8000/docs 으로 이동합니다. FastAPI는 모든 엔드포인트에 대한 대화형 문서를 자동으로 생성합니다.
다음과 같이 요청을 제출하여 모델을 테스트해 보세요:
이제 웹 앱이 완전히 작동합니다!
도커라이즈 앱
이 문서 섹션에서는 웹 애플리케이션을 도커화하겠습니다. Docker파일을 생성하고 .dockerignore 파일을 구성하겠습니다.
도커파일
도커파일은 이미지를 빌드하기 위해 도커 엔진이 따라야 할 지침이 포함된 파일입니다.
여기에는 일반적으로 파일 전송, 기본 이미지 정의, 작업 디렉토리 구성, 사용자 지정 명령 실행 등이 포함됩니다.
Docker파일 명령은 일반적으로 모두 대문자로 작성되며 해당 인수가 바로 뒤에옵니다.
<COMMAND> <arg1> <arg2> ... <arg_n>
# Example
WORKDIR /app
모든 지침에 대해 자세히 알아보려면 Docker파일 참조를 방문하세요.
프로젝트 루트에서 Docker파일을 만듭니다:
# Dockerfile
# Set the base image
FROM python:3.12.2-alpine3.19
# Install the required dependencies (gcc)
RUN apk add build-base
# Set the working directory
WORKDIR /app
# Confingure Python using environmental variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# Copy the requirements file into the image and install them
COPY ./requirements.txt .
RUN pip install --no-cache-dir --upgrade pip
RUN pip install --no-cache-dir --upgrade -r ./requirements.txt
# Copy the source code into the image
COPY . .
# Expose the port
EXPOSE 8000
# Start the Uvicorn server
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
.dockerignore
Docker로 작업할 때는 가능한 한 작은 이미지를 만드는 것이 좋습니다.
이미지 크기를 줄이는 한 가지 방법은 .dockerignore 파일을 활용하는 것입니다. 이 파일은 .gitignore 파일과 유사하게 작동합니다. 이 파일을 사용하면 이미지에 포함할 필요가 없는 파일을 생략할 수 있습니다.
프로젝트 루트에서 .dockerignore 파일을 만듭니다:
.git/
.idea/
__pycache__/
venv/
create_model.ipynb
프로젝트의 요구 사항(예: 다른 IDE를 사용하는 경우)에 따라 .dockerignore 파일을 조정해야 합니다.
빌드, 실행, 테스트
이미지를 클라우드로 푸시하기 전에 로컬에서 테스트하는 것이 좋습니다.
따라 하려면 컴퓨터에 Docker Desktop이 설치되어 있어야 합니다.
터미널을 열고 현재 설치된 이미지를 확인합니다:
$ docker images
그런 다음 Docker파일을 사용하여 이미지를 빌드합니다:
$ docker build -t iris-webapp:1.0 .
Docker가 이미지를 빌드하는 데 시간이 꽤 오래 걸립니다. 이는 주로 Scikit-learn이 Docker 컨테이너에 최적화되지 않았기 때문입니다. 잠시 커피를 마시며 시간을 보내세요.
명령이 완료된 후 이미지를 다시 확인합니다. 새로 빌드된 이미지가 있어야 합니다.
마지막으로 이미지를 사용하여 새 컨테이너를 만듭니다:
$ docker run -p 8000:8000 --name iris-webapp iris-webapp:1.0
그거예요!
이제 웹 애플리케이션이 컨테이너화되었습니다. http://localhost:8000/ 에서 액세스할 수 있으며 이전과 동일한 방식으로 작동합니다.
GitHub로 푸시
먼저 GitHub로 이동하여 새 리포지토리를 만듭니다. 다음 단계에서 필요하므로 원격 URL을 메모해 두세요.
그런 다음 프로젝트 루트로 돌아갑니다.
소스 코드를 클라우드에 푸시하기 전에 .gitignore 파일을 만드세요. .gitignore 파일을 사용하면 버전 관리에서 생략할 파일과 디렉터리를 지정할 수 있습니다.
이 유형의 파일은 .dockerignore 파일과 동일한 방식으로 작동합니다.
프로젝트 루트에서 .gitignore 파일을 만듭니다:
#.dockerignore
.idea/
__pycache__/
venv/
터미널을 열고 다음 명령을 실행하여 Git을 초기화합니다:
$ git init
모든 파일을 VCS에 추가하고 커밋합니다:
$ git add .
$ git commit -m "first commit"
마지막으로 앞서의 URL을 사용하여 원격 GitHub 오리진을 추가하고 소스 코드를 푸시합니다:
$ git remote add origin <remote_url>
$ git push origin master
이전 단계의 원격 URL을 대신하여 .
이제 끝입니다. 지금 GitHub 리포지토리 페이지를 방문하면 모든 파일이 추가된 것을 볼 수 있습니다.
앱 배포
Back4app 컨테이너에 앱을 배포하려면 먼저 등록하거나 로그인해야 합니다(이미 계정이 있는 경우).
Back4app 계정으로 인증하면 앱 대시보드로 이동합니다. 새 앱을 만들려면 “새 앱 만들기”를 클릭합니다.
Back4app은 서비스로서의 백엔드 및 서비스로서의 컨테이너 배포를 허용합니다. 컨테이너화된 앱을 배포할 것이므로 후자의 옵션을 선택하겠습니다.
다음으로 GitHub 계정을 Back4app에 연결해야 합니다. 이렇게 하면 Back4app이 리포지토리에서 소스 코드를 가져올 수 있습니다. 모든 리포지토리에 대한 액세스 권한을 부여하거나 특정 리포지토리를 선택할 수 있습니다.
리포지토리를 가져온 후 “선택”을 클릭합니다.
설명적인 애플리케이션 이름을 제공하는 것 외에는 환경을 구성할 필요가 없습니다.
그런 다음 ‘만들기’를 클릭합니다.
Back4app은 이미지를 빌드하고, 컨테이너 레지스트리에 푸시하고, 컨테이너를 스핀업하는 데 몇 분 정도 소요됩니다. 배포가 완료되면 앱의 상태가 “준비됨”으로 변경됩니다.
앱을 방문하려면 아래 이미지에 표시된 URL을 클릭합니다.
훌륭합니다. 머신 러닝 모델을 Back4app 컨테이너에 성공적으로 배포했습니다. 웹 앱은 로컬에서와 동일한 방식으로 작동해야 합니다. 앱을 다시 한 번 테스트하세요.
요약
이 문서에서는 머신 러닝의 기본 사항, 머신 러닝의 애플리케이션, 머신 러닝 모델을 배포하는 방법에 대해 알아보았습니다.
이제 자신만의 간단한 모델을 생성하고, FastAPI로 제공하고, Back4app 컨테이너에 배포할 수 있습니다.
back4app-deploy-ml-model GitHub 리포지토리에서 최종 소스 코드를 가져옵니다.