๐Ÿ“„ AI ๋ชจ๋ธ ์ €์žฅ ํฌ๋งท ๋ฐ FastAPI ์—ฐ๋™ ์ „๋žต

1. Keras ๋ชจ๋ธ ์ €์žฅ ํฌ๋งท ๋น„๊ต

ํฌ๋งท์„ค๋ช…์žฅ์ ๋‹จ์ 
.kerasKeras v3 ๊ณต์‹ ํฌ๋งท (SavedModel + Metadata ํฌํ•จ)์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ์ฒด ์ง๋ ฌํ™”, ๊ตฌ์กฐ + ๊ฐ€์ค‘์น˜ + ์˜ตํ‹ฐ๋งˆ์ด์ € ํฌํ•จFastAPI์ฒ˜๋Ÿผ ๊ฒฝ๋Ÿ‰ํ™”๋œ ์„œ๋ฒ„์™€ ์—ฐ๋™ ์‹œ ๋ฌด๊ฒ๊ณ  ๋น„ํšจ์œจ์ 
.h5HDF5 ๊ธฐ๋ฐ˜ Keras ๋ชจ๋ธ ํฌ๋งท๋‹จ์ผ ํŒŒ์ผ ์ €์žฅ, ๋น ๋ฅธ ๋กœ๋”ฉ์‚ฌ์šฉ์ž ์ •์˜ ๋ ˆ์ด์–ด ํฌํ•จ ๋ถˆ๊ฐ€, ์˜ตํ‹ฐ๋งˆ์ด์ € ์ƒํƒœ ์ €์žฅ ๋ถˆ๊ฐ€
SavedModelTensorFlow์˜ ํ‘œ์ค€ ๋ชจ๋ธ ์ €์žฅ ํฌ๋งทTensorFlow Serving๊ณผ ์—ฐ๋™ ๊ฐ€๋Šฅํฌ๊ธฐ ํผ, ๋””๋ ‰ํ† ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋จ

๐Ÿ”Ž Keras v3์—์„œ๋Š” .keras๋ฅผ ๊ธฐ๋ณธ ์ €์žฅ ํฌ๋งท์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋ฐฐํฌ ํ™˜๊ฒฝ(ํŠนํžˆ FastAPI)์—์„œ๋Š” .h5 ๋˜๋Š” SavedModel์ด ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Œ.


2. PyTorch ๋ชจ๋ธ ์ €์žฅ ํฌ๋งท

ํฌ๋งท์„ค๋ช…์žฅ์ ๋‹จ์ 
.pt / .pth๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ PyTorch ์ €์žฅ ๋ฐฉ์‹ (pickle ๊ธฐ๋ฐ˜)๋„๋ฆฌ ์‚ฌ์šฉ๋จ, ๊ฐ„ํŽธํ•จ๋ณด์•ˆ ์ด์Šˆ (pickle)
.pt2PyTorch 2.7์˜ ExportedProgram ํฌ๋งท์ƒˆ๋กœ์šด ๊ทธ๋ž˜ํ”„ ๊ธฐ๋ฐ˜ API ๋Œ€์‘๋„์ž… ์ดˆ๊ธฐ ๋‹จ๊ณ„
TorchScript (.pt)Python ์—†๋Š” ์‹คํ–‰ ์ง€์› (C++ ํ™˜๊ฒฝ ๋“ฑ)๋ฐฐํฌ ์ตœ์ ์ œ์•ฝ ์กด์žฌ (Python ๋™์  ๊ธฐ๋Šฅ ์ œํ•œ)
.onnxํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ„ ๋ชจ๋ธ ๊ณต์œ  ํ‘œ์ค€ ํฌ๋งทONNX ๋Ÿฐํƒ€์ž„, ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ ๋Œ€์‘๋ณ€ํ™˜์ด ๋ฒˆ๊ฑฐ๋กœ์›€
.safetensorsHugging Face ๊ธฐ๋ฐ˜ ์•ˆ์ „ํ•œ ๋ชจ๋ธ ํฌ๋งท๋น ๋ฅด๊ณ  ์•ˆ์ „ (non-pickle)์‚ฌ์šฉ ๋ฒ”์œ„ ์ œํ•œ์ 

3. FastAPI ๊ธฐ๋ฐ˜ ์ถ”๋ก  ์„œ๋ฒ„ ์„ค๊ณ„ ์‹œ ๊ณ ๋ ค ์‚ฌํ•ญ

๊ณ ๋ ค ํ•ญ๋ชฉ๊ถŒ์žฅ ๋ฐฉ์‹
๊ฒฝ๋Ÿ‰ ์„œ๋ฒ„ ๊ตฌํ˜„.h5, SavedModel, ONNX, TFLite
๋ชจ๋ธ ๋กœ๋”ฉ ์†๋„.h5 ๋˜๋Š” ONNX
๋ณด์•ˆ ์ด์Šˆ ํšŒํ”ผ.safetensors ๋˜๋Š” TorchScript
์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ์ฒด ํฌํ•จ ํ•„์š”.keras ๋˜๋Š” .pt ๋‹จ, ๊ฐ™์€ ์ฝ”๋“œ๋ฒ ์ด์Šค ๋‚ด์—์„œ๋งŒ ๋กœ๋”ฉ ๊ฐ€๋Šฅ
PyTorch ์„œ๋น™torch.load() ๋˜๋Š” torch.jit.load()
TensorFlow ์„œ๋น™TensorFlow Serving + REST/gRPC
FastAPI ๋‚ด ์ถ”๋ก  ์ฒ˜๋ฆฌ๋ชจ๋ธ๋งŒ ๋กœ๋”ฉํ•˜๊ณ , ์ž…๋ ฅ/์ถœ๋ ฅ ์ฒ˜๋ฆฌ๋งŒ ๋‹ด๋‹นํ•˜๋Š” ๊ตฌ์กฐ ๊ถŒ์žฅ

4. ์‹ค์šฉ ์ฝ”๋“œ ์˜ˆ์‹œ (FastAPI + Keras .h5)

from fastapi import FastAPI
from pydantic import BaseModel
import numpy as np
import tensorflow as tf

# ๋ชจ๋ธ ๋กœ๋”ฉ
model = tf.keras.models.load_model("model.h5")

app = FastAPI()

class InputData(BaseModel):
    input: list

@app.post("/predict")
async def predict(data: InputData):
    x = np.array([data.input])
    prediction = model.predict(x)
    return {"prediction": prediction.tolist()}

5. ์š”์•ฝ: ๋ฐฐํฌ ํฌ๋งท ์„ ํƒ ๊ฐ€์ด๋“œ

๋ชฉํ‘œ์ถ”์ฒœ ํฌ๋งท
๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•œ ์ถ”๋ก  ์„œ๋ฒ„ ๊ตฌ์ถ• (FastAPI ๋“ฑ).h5, .pt, TorchScript
ํ”Œ๋žซํผ ๋…๋ฆฝ ์‹คํ–‰ONNX, TFLite
์‚ฌ์šฉ์ž ์ •์˜ ๋ ˆ์ด์–ด ํฌํ•จ ์ €์žฅ.keras, .pt
๋ณด์•ˆ/์„ฑ๋Šฅ ์ตœ์šฐ์„ safetensors, TorchScript
ํด๋ผ์šฐ๋“œ ์ž๋™ ์„œ๋น™SavedModel + TensorFlow Serving

โœ… ๊ฒฐ๋ก :
.keras๋Š” ์‹คํ—˜/๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„  ๋งค์šฐ ์œ ์šฉํ•˜์ง€๋งŒ, FastAPI ๊ธฐ๋ฐ˜ ์ถ”๋ก  ์„œ๋ฒ„์ฒ˜๋Ÿผ ๊ฒฝ๋Ÿ‰/๋ณด์•ˆ/์†๋„๊ฐ€ ์ค‘์š”ํ•œ ํ™˜๊ฒฝ์—์„  ์ „ํ†ต์ ์ธ ํฌ๋งท(.h5, .pt, ONNX)์ด ํ›จ์”ฌ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋ฉ˜ํŠธ

๋‹ต๊ธ€ ๋‚จ๊ธฐ๊ธฐ

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค