TensorFlow Serving
TensorFlow Serving
- TensorFlow Serving은 머신러닝 모델을 프로덕션 환경에서 서빙하기 위해 Google에서 개발한 고성능 모델 서빙 시스템입니다.
- 주로 TensorFlow 모델을 서빙하는 데 사용되지만, 다양한 머신러닝 모델을 지원하는 확장성을 갖추고 있어 비즈니스 요구에 맞는 다양한 모델을 배포하고 관리하는 데 적합합니다.
TensorFlow Serving의 주요 기능
- 고성능: TensorFlow Serving은 고성능 모델 서빙을 위해 설계되어 요청당 지연 시간을 최소화하고 대규모 요청을 효율적으로 처리합니다.
- 유연성: 여러 버전의 모델을 동시에 서빙할 수 있어, 새로운 모델을 테스트하거나 단계적으로 롤아웃하는 등의 작업을 쉽게 수행할 수 있습니다.
- 자동 재로딩: 모델의 업데이트가 필요할 경우 TensorFlow Serving은 새로운 버전이 감지되면 이를 자동으로 로드할 수 있어 모델 업데이트가 신속하게 반영됩니다.
- 확장성: 다양한 모델을 다양한 하드웨어 환경에서 서빙할 수 있으며, 여러 백엔드와의 통합이 가능해 유연한 아키텍처 구성이 가능합니다.
TensorFlow Serving 설치
TensorFlow Serving을 설치하는 가장 쉬운 방법은 Docker를 사용하는 것입니다. 다음 명령어로 Docker 컨테이너를 통해 TensorFlow Serving을 실행할 수 있습니다.
docker pull tensorflow/serving
사용 예제: TensorFlow Serving으로 AI 모델 서빙하기
여기서는 MNIST 데이터셋을 학습한 간단한 이미지 분류 모델을 TensorFlow Serving을 통해 배포하는 예제를 보여드리겠습니다.
- 모델 학습 및 저장
import tensorflow as tf
from tensorflow import keras
# 모델 정의 및 학습
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# MNIST 데이터셋으로 모델 학습
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
model.fit(x_train, y_train, epochs=5)
# 모델 저장
model.save('/path/to/exported_model/1') # 버전 폴더 포함
- 먼저, TensorFlow로 모델을 학습하고 저장합니다.
- TensorFlow Serving 실행
docker run -p 8501:8501 --name tf_serving_mnist \\
--mount type=bind,source=/path/to/exported_model,target=/models/mnist \\
-e MODEL_NAME=mnist -t tensorflow/serving
- Docker 컨테이너를 통해 TensorFlow Serving을 실행할 때 -v 옵션을 사용해 모델을 TensorFlow Serving에 마운트할 수 있습니다.
- API 요청으로 모델 추론
import requests
import numpy as np
# 테스트 데이터 준비
data = json.dumps({"signature_name": "serving_default", "instances": x_test[:1].tolist()})
# API 요청 보내기
headers = {"content-type": "application/json"}
json_response = requests.post('<http://localhost:8501/v1/models/mnist:predict>', data=data, headers=headers)
predictions = np.array(json_response.json()['predictions'])
print(predictions)
- TensorFlow Serving은 기본적으로 REST API와 gRPC 인터페이스를 제공합니다. REST API를 통해 추론 요청을 보내는 예시는 다음과 같습니다.
이 예제에서, TensorFlow Serving이 Docker 컨테이너로 구동되어 요청을 처리하며, 모델 버전을 통해 안정적으로 모델 업데이트 및 배포를 관리할 수 있습니다. TensorFlow Serving은 이러한 서빙 시스템을 쉽게 관리할 수 있는 툴이므로 AI 모델의 빠른 서빙과 안정적인 운영을 필요로 하는 시스템에서 매우 유용합니다.
TensorFlow Serving 주요 기능
아래에 각 기능에 대한 예제와 실무에 적용할 수 있는 방안을 구체적으로 설명하겠습니다.
1. 모델 로딩 및 버전 관리
예제: Speech Recognition Model v1이 배포 중인 환경에서 정확도를 개선한 v2 모델을 배포하려고 한다고 가정합니다. TensorFlow Serving을 사용하면 새로운 버전 v2를 로드하여 기존의 v1과 함께 배포할 수 있습니다.
tensorflow_model_server --port=8500 --model_name=speech_recognition --model_base_path=/models/speech_recognition
- 실무 활용: TensorFlow Serving 설정 파일에서 모델 경로를 /models/speech_recognition/v1에서 /models/speech_recognition/v2로 변경하고 hot swapping 기능을 통해 v2가 문제없으면 v1을 제거하여 무중단 업데이트를 진행합니다.
2. 멀티 모델 관리
예제: Speech Recognition Model과 Speech Synthesis Model이 각각 다르게 배포되어야 할 때, TensorFlow Serving은 다중 모델을 하나의 서버에서 관리할 수 있습니다.
tensorflow_model_server --port=8500 --model_config_file=/models/config/model_config.cfg
model_config.cfg 파일 예시:
model_config_list: {
config: {
name: "speech_recognition",
base_path: "/models/speech_recognition",
model_platform: "tensorflow"
},
config: {
name: "speech_synthesis",
base_path: "/models/speech_synthesis",
model_platform: "tensorflow"
}
}
- 실무 활용: 이 구조는 SAPEON의 AI Serving Cloud와 같은 환경에서 다양한 모델을 통합해 운영할 때 유리합니다. API Gateway를 통해 모델별로 엔드포인트를 구성하고, 서비스 유형에 따라 별도의 모델을 호출할 수 있습니다.
3. 성능 최적화
예제: 모델 추론 성능을 극대화하기 위해 batching을 설정할 수 있습니다.
batching_parameters 파일 예시:
max_batch_size { value: 64 }
batch_timeout_micros { value: 1000 }
설정 적용:
tensorflow_model_server --port=8500 --model_name=speech_recognition --model_base_path=/models/speech_recognition --enable_batching=true --batching_parameters_file=batching_parameters
- 실무 활용: max_batch_size를 통해 서버의 부하를 낮추면서도 효율적인 처리량을 유지할 수 있습니다. 이 기능은 요청량이 많은 AI 서비스에 적합하며, GPU 활용 시 특히 높은 성능을 발휘합니다.
4. REST 및 gRPC 인터페이스 지원
예제: REST API와 gRPC를 통해 모델을 호출할 수 있습니다.
- REST API 호출 예제:
- curl -d '{"instances": [1.0, 2.0, 5.0]}' -X POST http://localhost:8501/v1/models/speech\_recognition:predict
- gRPC 호출 예제:
- import tensorflow as tf channel = grpc.insecure_channel('localhost:8500') stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) request = predict_pb2.PredictRequest() request.model_spec.name = 'speech_recognition' request.inputs['input'].CopyFrom(tf.make_tensor_proto(data)) result = stub.Predict(request, 10.0) # 10 seconds timeout
- 실무 활용: REST API는 단순히 HTTP 기반 통신이 가능하여 빠르게 테스트하기 좋고, gRPC는 낮은 지연 시간과 높은 처리량을 요구하는 대규모 배포 환경에 적합합니다. SAPEON AI 클라우드 서비스에서 다양한 고객사 요청에 대응할 수 있는 유연한 구조를 제공할 수 있습니다.
5. 유연한 구성
예제: TensorFlow Serving의 구성 파일을 이용해 모델 경로와 기타 설정을 변경할 수 있습니다.
설정 예제:
tensorflow_model_server --port=8500 --model_config_file=/models/config/model_config.cfg
model_config.cfg 예시:
model_config_list: {
config: {
name: "speech_recognition",
base_path: "/models/speech_recognition",
model_platform: "tensorflow"
}
}
- 실무 활용: 설정 파일을 통해 모델 경로나 배치 구성 등 다양한 환경 설정을 유연하게 관리할 수 있어, AI 서비스의 환경 변화에 따라 쉽게 조정할 수 있습니다.
6. 모니터링 및 로깅
예제: TensorFlow Serving은 Prometheus와의 통합을 통해 모니터링할 수 있습니다. Prometheus는 모델의 메트릭을 수집하고 시각화합니다.
curl <http://localhost:8501/monitoring/prometheus/metrics>
- 실무 활용: Prometheus와 Grafana 같은 모니터링 도구와 통합하여 모델의 예측 요청 수, 평균 지연 시간, 실패율 등을 모니터링하고, 이 데이터를 활용해 AI 서비스의 성능 및 상태를 실시간으로 파악할 수 있습니다.
7. 온디맨드 로딩 및 동적 관리
예제: 특정 모델을 요청 시에만 로드하도록 구성할 수 있습니다. 이를 통해 메모리 사용량을 최적화할 수 있습니다.
예를 들어, speech_recognition 모델이 필요할 때만 로딩하도록 설정할 수 있습니다. 모델이 필요하지 않으면 로딩하지 않음으로써 메모리 최적화가 가능합니다.
- 실무 활용: 메모리가 제한된 클라우드 환경에서 고사양 모델을 관리할 때 이 기능이 유용합니다. 예를 들어 AI 서비스에서 특정 기능이 적은 빈도로 호출된다면 해당 모델을 요청 시에만 로드하여 메모리 자원을 효율적으로 활용할 수 있습니다.