10 분 이내에 REST API를 통해 머신 러닝 모델 제공

10 분 이내에 REST API를 통해 머신 러닝 모델 제공

10 분 이내에 REST API를 통한 SSERBER Machine Learning 모델
저자의 이미지 | 캔버

머신 러닝 모델을 구축하고 새로운 것을 실험하는 것을 좋아한다면 정말 멋지다. 그러나 솔직히 말해서, 일단 당신이 그들에게 그것을 이용할 수있게되면 다른 사람들에게만 유용해진다. 이를 위해서는 다른 프로그램 (또는 인간)이 데이터를 전송하고 예측을 되 찾을 수 있도록 웹 API를 통해 노출시켜야합니다. 그곳에서 REST API가 들어오는 곳입니다.

이 기사에서는 단순한 머신 러닝 모델에서 Python에서 가장 빠르고 개발자 친화적 인 웹 프레임 워크 중 하나 인 FASTAPI를 사용하여 단순한 기계 학습 모델에서 프로덕션 준비 API로 10 분 안에 어떻게 갈 것인지 배웁니다. 그리고 우리는 단지“Make It Run”데모에서 멈추지 않을 것이지만 다음과 같은 것들을 추가 할 것입니다.

  • 들어오는 데이터 검증
  • 모든 요청을 기록합니다
  • 둔화를 피하기 위해 배경 작업을 추가합니다
  • 우아하게 오류를 처리합니다

코드 부분으로 이동하기 전에 프로젝트 구조가 어떻게 보이는지 신속하게 보여 드리겠습니다.

ml-api/
│
├── model/
│   └── train_model.py        # Script to train and save the model
│   └── iris_model.pkl        # Trained model file
│
├── app/
│   └── main.py               # FastAPI app
│   └── schema.py             # Input data schema using Pydantic
│
├── requirements.txt          # All dependencies
└── README.md                 # Optional documentation

1 단계 : 필요한 것을 설치하십시오

이 프로젝트에는 몇 가지 파이썬 패키지가 필요합니다. PIP를 사용하여 설치할 수 있습니다.

pip install fastapi uvicorn scikit-learn joblib pydantic

환경을 저장하십시오 :

pip freeze > requirements.txt

2 단계 : 간단한 모델을 훈련하고 저장하십시오

기계 학습 부분을 단순하게 유지하여 모델 서비스에 집중할 수 있습니다. 우리는 유명한 것을 사용할 것입니다 아이리스 데이터 세트 그리고 훈련 a 임의의 산림 분류기 꽃잎과 spal 측정을 기반으로 홍채 꽃의 유형을 예측합니다.

교육 스크립트는 다음과 같습니다. 호출 된 파일을 만듭니다 Train_Model.py a 모델/ 예배 규칙서:

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import joblib, os

X, y = load_iris(return_X_y=True)
clf = RandomForestClassifier()
clf.fit(*train_test_split(X, y, test_size=0.2, random_state=42)[:2])

os.makedirs("model", exist_ok=True)
joblib.dump(clf, "model/iris_model.pkl")
print("✅ Model saved to model/iris_model.pkl")

이 스크립트는 데이터를로드하고, 분할하고, 모델을 훈련시키고, joblib을 사용하여 저장합니다. 모델 파일을 생성하려면 한 번 실행하십시오.

python model/train_model.py

3 단계 : API가 무엇을 입력 해야하는지 정의하십시오

이제 사용자가 API와 상호 작용하는 방법을 정의해야합니다. 그들은 무엇을 보내야하고 어떤 형식으로?

우리는 Fastapi의 내장 부분 인 Pydantic을 사용하여 들어오는 데이터를 설명하고 검증하는 스키마를 만듭니다. 구체적으로, 우리는 사용자가 두 가지 양의 플로트 값을 제공 할 수 있도록 보장합니다.

새 파일에서 앱/스키마 .py추가하다:

from pydantic import BaseModel, Field

class IrisInput(BaseModel):
    sepal_length: float = Field(..., gt=0, lt=10)
    sepal_width: float = Field(..., gt=0, lt=10)
    petal_length: float = Field(..., gt=0, lt=10)
    petal_width: float = Field(..., gt=0, lt=10)

여기서는 입력을 깨끗하고 현실적으로 유지하기 위해 값 제약 조건 (0 및 10 미만)을 추가했습니다.

4 단계 : API를 만듭니다

이제 실제 API를 구축 할 차례입니다. 우리는 fastapi를 사용합니다.

  • 모델을로드하십시오
  • JSON 입력을 수락하십시오
  • 클래스 및 확률을 예측하십시오
  • 백그라운드에서 요청을 기록하십시오
  • 깨끗한 JSON 응답을 반환하십시오

메인 API 코드를 내부에 쓰자 앱/main.py:

from fastapi import FastAPI, HTTPException, BackgroundTasks
from fastapi.responses import JSONResponse
from app.schema import IrisInput
import numpy as np, joblib, logging

# Load the model
model = joblib.load("model/iris_model.pkl")

# Set up logging
logging.basicConfig(filename="api.log", level=logging.INFO,
                    format="%(asctime)s - %(message)s")

# Create the FastAPI app
app = FastAPI()

@app.post("/predict")
def predict(input_data: IrisInput, background_tasks: BackgroundTasks):
    try:
        # Format the input as a NumPy array
        data = np.array([[input_data.sepal_length,
                          input_data.sepal_width,
                          input_data.petal_length,
                          input_data.petal_width]])
        
        # Run prediction
        pred = model.predict(data)[0]
        proba = model.predict_proba(data)[0]
        species = ["setosa", "versicolor", "virginica"][pred]

        # Log in the background so it doesn’t block response
        background_tasks.add_task(log_request, input_data, species)

        # Return prediction and probabilities
        return {
            "prediction": species,
            "class_index": int(pred),
            "probabilities": {
                "setosa": float(proba[0]),
                "versicolor": float(proba[1]),
                "virginica": float(proba[2])
            }
        }

    except Exception as e:
        logging.exception("Prediction failed")
        raise HTTPException(status_code=500, detail="Internal error")

# Background logging task
def log_request(data: IrisInput, prediction: str):
    logging.info(f"Input: {data.dict()} | Prediction: {prediction}")

여기서 무슨 일이 일어나고 있는지 잠시 멈추고 이해합시다.

앱이 시작될 때 모델을 한 번로드합니다. 사용자가 쳤을 때 /예측하다 유효한 JSON 입력을 사용하여 엔드 포인트를 낭프 배열로 변환하고 모델을 통과하며 예측 된 클래스 및 확률을 반환합니다. 무언가 잘못되면 로그인하고 친근한 오류를 반환합니다.

주목하십시오 백그라운드 작업 PART – 이것은 응답이 전송 된 후 작동 할 수있는 깔끔한 FastApi 기능입니다 (예 : 로그 저장). 이는 API의 반응을 유지하고 지연을 피합니다.

5 단계 : API를 실행하십시오

서버를 시작하려면 다음과 같은 Uvicorn을 사용하십시오.

uvicorn app.main:app --reload

방문 : http://127.0.0.1:8000/docs
API를 테스트 할 수있는 대화식 Swagger UI가 표시됩니다.
이 샘플 입력을 시도하십시오.

{
  "sepal_length": 6.1,
  "sepal_width": 2.8,
  "petal_length": 4.7,
  "petal_width": 1.2
}

또는 컬을 사용하여 다음과 같은 요청을 할 수 있습니다.

curl -X POST " -H  "Content-Type: application/json" -d \
'{
  "sepal_length": 6.1,
  "sepal_width": 2.8,
  "petal_length": 4.7,
  "petal_width": 1.2
}'

둘 다 동일한 응답을 생성합니다.

{"prediction":"versicolor",
 "class_index":1,
 "probabilities": {
	 "setosa":0.0,
	 "versicolor":1.0,
	 "virginica":0.0 }
 }

선택 단계 : API를 배포하십시오

FastApi 앱을 배포 할 수 있습니다.

  • Render.com (제로 구성 배포)
  • Railway.App (지속적인 통합 용)
  • Heroku (Docker를 통해)

인증 (예 : API 키 또는 OAUTH)을 추가하여 엔드 포인트를 보호하고 Prometheus 및 Grafana를 사용한 요청을 모니터링하고 배경 작업 대기열에 Redis 또는 Celery를 사용하여 제작 준비 서비스로 확장 할 수도 있습니다. Docker를 사용하여 기계 학습 모델을 배포하기위한 내 기사 : 단계별 안내서를 참조하십시오.

마무리

그게 다야 – 그리고 이미 대부분의 데모보다 낫다. 우리가 만든 것은 단순한 장난감 예제입니다. 그러나, 그것은 :

  • 입력 데이터를 자동으로 확인합니다
  • 예측 신뢰로 의미있는 반응을 반환합니다
  • 모든 요청을 파일에 로그인합니다 (API.LOG)
  • 배경 작업을 사용하여 API가 빠르고 반응을 유지합니다.
  • 실패를 우아하게 처리합니다

그리고 100 줄의 코드 이하의 모든 것.

Kanwal Mehreen Kanwal은 머신 러닝 엔지니어이자 데이터 과학에 대한 열정과 AI의 의학 교차점을 가진 기술 작가입니다. 그녀는 eBook “Chatgpt의 생산성을 극대화하는 것”을 공동 저술했습니다. APAC의 Google Generation Scholar 2022로서 그녀는 다양성과 학업 우수성을 챔피언시킵니다. 그녀는 또한 Tech Scholar, Mitacs Globalink Research Scholar 및 Harvard Wecode Scholar의 Teradata 다양성으로 인정 받고 있습니다. Kanwal은 STEM 분야의 여성에게 힘을 실어주기 위해 펨코드를 설립 한 변화에 대한 열렬한 옹호자입니다.

출처 참조

Post Comment

당신은 놓쳤을 수도 있습니다