데이터 분석/머신러닝

딥러닝 모델을 웹 / 모바일 앱에 배포하기

Family in August 2024. 5. 13. 19:40
반응형


딥러닝 모델을 웹/모바일 앱에 배포하기

1. 개요
딥러닝 모델을 개발한 후에는 실제 서비스에 배포하는 단계가 필수적입니다. 이번 포스팅에서는 학습된 모델을 웹이나 모바일 애플리케이션에서 사용할 수 있도록 서빙하는 다양한 방법을 알아보겠습니다.

2. TensorFlow Serving 구축
TensorFlow 모델을 프로덕션 환경에 배포할 때 많이 사용하는 옵션이 TensorFlow Serving입니다.


설치 및 모델 저장

pip install tensorflow-serving-api


import tensorflow as tf
 
model = ... # 학습된 TF 모델 로드

MODEL_VERSION = 1
export_path = f"./exported_models/model/{MODEL_VERSION}"

# 모델 저장
tf.saved_model.save(model, export_path)



gRPC 클라이언트 예제

import grpc
import tensorflow as tf
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc

# TF Serving 호스트 주소와 포트  
host = "localhost"
port = 8500

# 채널 생성  
channel = grpc.insecure_channel(f"{host}:{port}")
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)

# 입력 데이터   
input_data = ...

# 모델에 입력값 전달하여 추론 
request = predict_pb2.PredictRequest()
request.model_spec.name = "model" 
request.model_spec.signature_name = "serving_default"
request.inputs['input_tensor'].CopyFrom(tf.make_tensor_proto(input_data))
result = stub.Predict(request)



Docker 컨테이너로 TF Serving을 배포하면 모델 서버를 쉽게 운영할 수 있습니다.

3. TorchServe로 PyTorch 모델 서빙
PyTorch 모델을 배포할 때는 TorchServe를 사용하면 편리합니다.

pip install torchserve torch-model-archiver

# 모델 저장 
torch_model = ...
torch_model.save('model.pth')

# 모델 압축 및 mar 파일 생성
model_archiver = ...
mar_file = model_archiver.package_model(...)

# TorchServe 서버 실행  
torchserve --start --model-store ./model_store --models model.mar




클라이언트측에서는 HTTP 요청으로 추론을 요청할 수 있습니다.

import json 
import requests

payload = {
    'input_data': input_data_json
}

resp = requests.post('http://localhost:8080/predictions/model', json=payload)
print(resp.json())



4. Flask 웹앱에 배포
웹 애플리케이션에 모델을 배포하려면 먼저 ONNX 포맷으로 모델을 변환해야 합니다.

# PyTorch → ONNX
import torch.onnx 

dummy_input = torch.randn(1, 3, 32, 32)
torch.onnx.export(model, dummy_input, "model.onnx")



Flask 웹앱에서 ONNX 런타임을 사용하여 추론을 수행할 수 있습니다.

import onnxruntime as rt

class ONNXModel:
    def __init__(self, model_path):
        self.session = rt.InferenceSession(model_path)
        self.input_name = self.session.get_inputs()[0].name
        
    def predict(self, input_data):
        result = self.session.run(None, {self.input_name: input_data})
        return result
        
onnx_model = ONNXModel('model.onnx')

@app.route('/predict', methods=['POST'])
def predict():
    file = request.files['image']
    input_data = preprocess(file.read())
    
    outputs = onnx_model.predict(input_data)
    results = postprocess(outputs)
    
    return jsonify(results)



5. Android 앱에 배포
모바일 앱에서도 ONNX 런타임을 사용할 수 있습니다. 예를 들어 Android 앱에서 카메라로 촬영한 이미지를 객체 인식하는 앱을 만들어 보겠습니다.

// ONNX 세션 열기
val session = OnnxRuntime.createSessionFromFile(this, "model.onnx")
        
// 카메라 캡처 콜백에서 추론 수행  
override fun onPictureTaken(bytes: ByteArray) {
    // 이미지 전처리
    val inputData = preprocessImage(bytes)
    
    // 입력 텐서 생성
    val inputTensor = OnnxTensor.createTensor(session.inputInfo, inputData)
    
    // 모델 추론
    val outputs = session.run(arrayOf(inputTensor))
    val detectedObjects = postprocessResults(outputs[0].value)
    
    // UI 업데이트
    updateObjectsOnOverlay(detectedObjects)
}



이렇게 Android ONNX 런타임을 활용하면 모바일 앱에서도 On-Device AI가 가능해집니다.

6. 성능 비교 및 고려사항
각 옵션별로 장단점이 있으므로 배포 환경과 모델 특성에 맞게 적절히 선택해야 합니다.

- TensorFlow Serving: 안정적이고 성능이 뛰어남. gRPC 통신 고려 필요
- TorchServe: PyTorch 모델을 위한 간편한 옵션. 성능은 중간 수준
- ONNX 런타임: 다양한 환경에서 사용 가능하나 추론 속도 확인 필요

배포 환경의 요구사항과 모델의 크기, 응답 지연 시간 중요도 등을 종합적으로 고려하여 최적의 옵션을 선택하는 것이 중요합니다.

7. 결론
이번 포스팅에서는 딥러닝 모델을 실제 서비스에 배포하는 다양한 방법을 살펴보았습니다. 웹이나 모바일 애플리케이션뿐만 아니라 다양한 환경에서 모델을 서빙할 수 있는 옵션들이 있습니다. 각 옵션의 특징을 이해하고 실제 예제를 통해 구현해보았습니다.

TensorFlow Serving, TorchServe, ONNX 런타임 등 다양한 방식을 사용해보면서 각각의 장단점을 파악할 수 있었을 것입니다. 실제 프로덕션 환경에서는 모델의 크기, 응답 시간, 서비스 유형 등 다양한 요소를 고려하여 가장 적합한 옵션을 선택해야 합니다.

또한 모델 배포 외에도 모니터링, 버전 관리, 자동 스케일링 등 프로덕션 단계에서 추가적으로 고려해야 할 사항들이 있습니다. 이러한 요소들을 종합적으로 검토하여 안정적이고 효율적인 ML 시스템을 구축하는 것이 중요합니다.

실전 프로젝트에서 이번 포스팅을 참고하여 모델 배포 경험을 쌓아보시기 바랍니다. 앞으로도 지속적으로 새로운 기술과 사례를 공유하여 모델 서빙 역량을 높여나가겠습니다. 감사합니다.

반응형