Machine Learning Academy · บทเรียน

การให้บริการการทำนายด้วยปลายทาง FastAPI

ผู้เรียนจะห่อแบบจำลอง joblib ไว้ในเส้นทาง POST ของ FastAPI ที่รับข้อมูล JSON และส่งคืนผลการทำนาย จากนั้นทดสอบด้วยคำขอ curl

บทเรียน 3 จาก 413 ขั้นตอน

การให้บริการการทำนายด้วยปลายทาง FastAPI เป็นบทเรียน Machine Learning Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Machine Learning Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Machine Learning Academy มีบทเรียนทั้งหมด 4 บทเรียน

จากโน้ตบุ๊กสู่ API สำหรับใช้งานจริง

โน้ตบุ๊ก Jupyter เป็นสภาพแวดล้อมที่ดีสำหรับการพัฒนา แต่เป็นระบบให้บริการจริงที่ไม่เหมาะสม แนวทางมาตรฐานจากโน้ตบุ๊กสู่ระบบจริงคือ ฝึกและบันทึกโมเดลด้วย joblib ห่อโมเดลไว้ใน REST API แล้วนำ API ดังกล่าวไปใช้งานเป็นบริการแบบคอนเทนเนอร์ API จะรับค่าคุณลักษณะดิบในรูป JSON ประมวลผลล่วงหน้าผ่าน pipeline ที่ฝึกแล้ว และส่งผลการทำนายกลับภายในเวลาไม่กี่มิลลิวินาที

เหตุใดจึงใช้ FastAPI สำหรับการให้บริการ ML

FastAPI เป็นเฟรมเวิร์กเว็บ Python สมัยใหม่ที่สร้างบน Pydantic และ Starlette โดยสร้างเอกสารแบบโต้ตอบอัตโนมัติ (Swagger UI) ตรวจสอบเนื้อหาคำขอด้วยคำใบ้ชนิดข้อมูล และจัดการ I/O แบบไม่พร้อมกันได้อย่างมีประสิทธิภาพ สำหรับการให้บริการ ML นั้น FastAPI ได้รับความนิยมเพราะต้องเขียนโค้ดประกอบเพียงเล็กน้อย รองรับคำขอพร้อมกันผ่านผู้ปฏิบัติงานแบบไม่พร้อมกัน และทำงานร่วมกับชนิดข้อมูล Python ที่ใช้ใน sklearn และ pandas ได้อย่างเป็นธรรมชาติ

การติดตั้ง FastAPI และ Uvicorn

FastAPI ต้องใช้ uvicorn เป็นเซิร์ฟเวอร์ ASGI เพื่อทำงาน ให้ติดตั้งทั้งสองอย่างด้วยคำสั่งเดียว uvicorn เป็นเซิร์ฟเวอร์แบบไม่พร้อมกันประสิทธิภาพสูงที่จัดการการเชื่อมต่อ HTTP และส่งต่อคำขอไปยังแอปพลิเคชัน FastAPI ในระบบจริง โดยทั่วไปจะเรียกใช้ uvicorn ไว้หลังพร็อกซีย้อนกลับ nginx พร้อมกระบวนการผู้ปฏิบัติงานหลายกระบวนการ

# pip install fastapi uvicorn[standard]

# Verify installation
from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn

print('FastAPI ready')

การกำหนดโครงสร้างคำขอด้วย Pydantic

คลาส Pydantic BaseModel ใช้กำหนดโครงสร้างของคำขอขาเข้า FastAPI ใช้โมเดลเหล่านี้ตรวจสอบเนื้อหา JSON โดยอัตโนมัติ หากฟิลด์ที่จำเป็นหายไปหรือมีชนิดข้อมูลไม่ถูกต้อง FastAPI จะส่งข้อผิดพลาด 422 ที่เข้าใจง่ายก่อนที่โค้ดของคุณจะเริ่มทำงาน แต่ละฟิลด์ในโมเดล Pydantic จะสอดคล้องกับคุณลักษณะนำเข้าหนึ่งรายการของโมเดล

from pydantic import BaseModel
from typing import Optional

class IrisFeatures(BaseModel):
    sepal_length: float
    sepal_width: float
    petal_length: float
    petal_width: float

class PredictionResponse(BaseModel):
    predicted_class: int
    class_name: str
    confidence: float

# Example input (FastAPI will validate this automatically)
input_data = IrisFeatures(sepal_length=5.1, sepal_width=3.5,
                           petal_length=1.4, petal_width=0.2)
print('Input:', input_data)

การโหลดโมเดลเมื่อเริ่มต้น

โหลดโมเดล ครั้งเดียวเมื่อเริ่มต้น ไม่ใช่ทุกครั้งที่มีคำขอ การโหลดไฟล์ joblib ทุกครั้งที่ทำนายจะเพิ่มเวลาแฝงต่อคำขอหลายร้อยมิลลิวินาที ให้ใช้ตัวแปรระดับโมดูลหรือเครื่องจัดการเหตุการณ์ lifespan ของ FastAPI เพื่อโหลดโมเดลเมื่อเซิร์ฟเวอร์เริ่มทำงาน และเก็บโมเดลไว้ในหน่วยความจำสำหรับคำขอถัดไปทั้งหมด

import joblib
from contextlib import asynccontextmanager
from fastapi import FastAPI

ml_models = {}

@asynccontextmanager
async def lifespan(app: FastAPI):
    # Startup: load model once
    ml_models['iris'] = joblib.load('/tmp/iris_pipeline.joblib')
    print('Model loaded at startup')
    yield
    # Shutdown: cleanup if needed
    ml_models.clear()

app = FastAPI(title='Iris Predictor API', lifespan=lifespan)

การสร้างจุดปลายทางสำหรับการทำนาย

กำหนดเส้นทาง POST ที่รับโมเดลนำเข้า Pydantic แปลงเป็นอาร์เรย์ NumPy เรียกใช้ pipeline.predict และ predict_proba แล้วส่งผลการทำนายกลับเป็นการตอบสนอง JSON แบบมีโครงสร้าง FastAPI จะทำให้โมเดลการตอบสนอง Pydantic เป็นอนุกรมโดยอัตโนมัติ

import numpy as np
from fastapi import FastAPI
from pydantic import BaseModel
import joblib

app = FastAPI()
model = None

@app.on_event('startup')
def load_model():
    global model
    model = joblib.load('/tmp/iris_pipeline.joblib')

CLASS_NAMES = ['setosa', 'versicolor', 'virginica']

@app.post('/predict')
def predict(features: IrisFeatures):
    X = np.array([[features.sepal_length, features.sepal_width,
                   features.petal_length, features.petal_width]])
    pred = int(model.predict(X)[0])
    proba = float(model.predict_proba(X)[0].max())
    return {
        'predicted_class': pred,
        'class_name': CLASS_NAMES[pred],
        'confidence': round(proba, 4)
    }

การเพิ่มจุดปลายทางตรวจสอบสถานะ

จุดปลายทาง /health หรือ /ping เป็นสิ่งจำเป็นสำหรับบริการใช้งานจริง ตัวกระจายโหลดและระบบจัดการงานประสานกัน (Kubernetes, ECS) จะเรียกจุดปลายทางนี้เป็นระยะเพื่อยืนยันว่าบริการยังทำงานอยู่ การตอบสนองว่าสุขภาพดีหมายความว่าเซิร์ฟเวอร์กำลังทำงาน AND โมเดลโหลดเสร็จแล้ว ให้ส่งสถานะ 503 หากโหลดโมเดลไม่สำเร็จ

from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get('/health')
def health():
    if model is None:
        return JSONResponse(status_code=503,
                            content={'status': 'unhealthy', 'reason': 'model not loaded'})
    return {'status': 'ok', 'model': 'iris_pipeline', 'version': '1.0.0'}

@app.get('/')
def root():
    return {'message': 'Iris Predictor API — POST /predict to get a classification'}

การเรียกใช้เซิร์ฟเวอร์ภายในเครื่อง

บันทึกแอป FastAPI ลงใน main.py แล้วเริ่มทำงานด้วย uvicorn main:app --reload แฟล็ก --reload จะเริ่มเซิร์ฟเวอร์ใหม่โดยอัตโนมัติเมื่อไฟล์มีการเปลี่ยนแปลง (ใช้สำหรับการพัฒนาเท่านั้น) เปิด http://localhost:8000/docs เพื่อดู Swagger UI ที่สร้างขึ้นโดยอัตโนมัติ ซึ่งคุณสามารถทดสอบการทำนายแบบโต้ตอบได้

# Save to main.py then run:
# uvicorn main:app --host 0.0.0.0 --port 8000 --reload

# Test with curl:
# curl -X POST http://localhost:8000/predict \
#   -H 'Content-Type: application/json' \
#   -d '{"sepal_length": 5.1, "sepal_width": 3.5, "petal_length": 1.4, "petal_width": 0.2}'
#
# Expected response:
# {"predicted_class": 0, "class_name": "setosa", "confidence": 0.9981}

print('Command to start: uvicorn main:app --reload --port 8000')

การทดสอบจุดปลายทางด้วยไลบรารี requests

ในสคริปต์ทดสอบหรือโน้ตบุ๊ก ให้ใช้ requests.post เพื่อเรียก API ที่กำลังทำงานอยู่ นี่เป็นวิธีที่แอปพลิเคชันไคลเอนต์ เช่น แอปมือถือ แดชบอร์ด และไมโครเซอร์วิซ์อื่น ๆ ใช้เรียก API การทำนายด้วย รูปแบบคำขอเดียวกันนี้ใช้ได้จากทุกภาษา เช่น curl, JavaScript fetch และ http.Client ของ Go

import requests

url = 'http://localhost:8000/predict'
payload = {
    'sepal_length': 6.3,
    'sepal_width': 3.3,
    'petal_length': 6.0,
    'petal_width': 2.5
}

response = requests.post(url, json=payload)
if response.status_code == 200:
    result = response.json()
    print('Predicted class:', result['class_name'])
    print('Confidence:', result['confidence'])
else:
    print('Error:', response.status_code, response.text)

การตรวจสอบข้อมูลนำเข้าและการจัดการข้อผิดพลาด

การตรวจสอบด้วย Pydantic ของ FastAPI จะตรวจจับข้อผิดพลาดของชนิดข้อมูลโดยอัตโนมัติ แต่คุณควรจัดการข้อผิดพลาดระดับโมเดลด้วย เช่น ค่า NaN ที่ไม่คาดคิดหรือข้อมูลนำเข้าที่อยู่นอกช่วง ใช้ try/except ภายในฟังก์ชันเส้นทาง แล้วส่งสถานะ 400 หรือ 500 พร้อมข้อความข้อผิดพลาดที่มีความหมาย หลีกเลี่ยงการเปิดเผยรายละเอียดข้อผิดพลาดภายใน เช่น ร่องรอยสแตก แก่ผู้เรียก API ในระบบจริง

from fastapi import FastAPI, HTTPException
import numpy as np

app = FastAPI()

@app.post('/predict')
def predict(features: IrisFeatures):
    try:
        X = np.array([[features.sepal_length, features.sepal_width,
                       features.petal_length, features.petal_width]])
        if np.any(np.isnan(X)) or np.any(X < 0):
            raise HTTPException(status_code=400,
                                detail='Input contains invalid values (NaN or negative)')
        pred = int(model.predict(X)[0])
        proba = float(model.predict_proba(X)[0].max())
        return {'predicted_class': pred, 'confidence': round(proba, 4)}
    except HTTPException:
        raise
    except Exception as e:
        raise HTTPException(status_code=500, detail='Internal prediction error')

จุดปลายทางการทำนายแบบกลุ่ม

สำหรับกรณีใช้งานที่ต้องรองรับปริมาณงานสูง ให้เพิ่มจุดปลายทางแบบกลุ่มที่รับรายการชุดคุณลักษณะและส่งรายการผลการทำนายกลับมาในการเรียก API ครั้งเดียว การประมวลผลเป็นกลุ่มช่วยลดค่าใช้จ่ายด้านเครือข่ายและทำให้โมเดลประมวลผลการทำนายแบบเวกเตอร์ได้อย่างมีประสิทธิภาพ (sklearn predict รองรับเมทริกซ์)

from typing import List
from pydantic import BaseModel
import numpy as np

class BatchRequest(BaseModel):
    instances: List[IrisFeatures]

@app.post('/predict/batch')
def predict_batch(batch: BatchRequest):
    X = np.array([[f.sepal_length, f.sepal_width, f.petal_length, f.petal_width]
                  for f in batch.instances])
    preds = model.predict(X).tolist()
    probas = model.predict_proba(X).max(axis=1).tolist()
    return {'predictions': [{'class': p, 'confidence': round(c, 4)}
                            for p, c in zip(preds, probas)]}

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับการให้บริการผลการทำนาย ML ด้วย FastAPI จากบทเรียนนี้

ทบทวนบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า FastAPI ห่อ pipeline ที่โหลดด้วย joblib ไว้ใน REST endpoint ที่กำหนดชนิดข้อมูล พร้อมการตรวจสอบ JSON และเอกสาร Swagger โดยอัตโนมัติ ควรโหลดโมเดลครั้งเดียวเมื่อเริ่มต้น เพื่อหลีกเลี่ยงเวลาแฝงจากการอ่านดิสก์ทุกคำขอ และ ควรมีจุดปลายทาง /health เสมอ เพื่อให้ตัวกระจายโหลดและระบบจัดการงานประสานกันตรวจสอบได้ว่าบริการยังทำงานอยู่ บทถัดไป เราจะเพิ่มการบันทึกผลการทำนายลงใน API และพูดถึงการเลื่อนของข้อมูลกับตัวกระตุ้นการฝึกโมเดลใหม่

เริ่มต้นได้ฟรี

เรียนรู้ Python ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

คำถามที่พบบ่อย

บทเรียน “การให้บริการการทำนายด้วยปลายทาง FastAPI” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การให้บริการการทำนายด้วยปลายทาง FastAPI” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Machine Learning Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Machine Learning Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การให้บริการการทำนายด้วยปลายทาง FastAPI”

ผู้เรียนจะห่อแบบจำลอง joblib ไว้ในเส้นทาง POST ของ FastAPI ที่รับข้อมูล JSON และส่งคืนผลการทำนาย จากนั้นทดสอบด้วยคำขอ curl คุณปฏิบัติ Machine Learning Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Machine Learning Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Machine Learning Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การให้บริการการทำนายด้วยปลายทาง FastAPI” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Machine Learning Academy นี้ได้ไหม

ได้ บทเรียน Machine Learning Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การบันทึกแบบจำลองด้วย joblib และ pickle
  2. การจัดการเวอร์ชันแบบจำลอง: เหตุใดชื่อไฟล์และข้อมูลกำกับจึงสำคัญ
  3. การให้บริการการทำนายด้วยปลายทาง FastAPI
  4. การติดตามการทำนาย: การบันทึกข้อมูลขาเข้าและขาออก
← กลับไปที่ Machine Learning Academy