Ubuntu 실습(3)

zeusqoi·2026년 9월 4일

개인공부

목록 보기
10/42

지난 글에서는 TensorFlow Hub를 이용하여 Object Detection 실습을 진행했다.

이번에는 TensorFlow에서 학습한 모델을 실제 서비스 환경에서 사용할 수 있도록 TensorFlow Serving을 이용해 모델을 서버에 올리고, REST API를 통해 예측을 요청해 보았다.


1. TensorFlow Serving이란?

머신러닝 모델을 학습하는 것과 실제 서비스에서 사용하는 것은 별개의 과정이다.

모델을 학습한 후에는 애플리케이션에서 해당 모델에 데이터를 전달하고 예측 결과를 받을 수 있도록 모델을 서버 형태로 제공해야 한다.

TensorFlow Serving은 TensorFlow 모델을 서버에서 실행하고, 클라이언트가 API를 통해 예측을 요청할 수 있도록 해주는 시스템이다.


2. 기존 MNIST 모델 준비

이전에 TensorFlow 기본 실습에서 사용했던 MNIST 모델을 그대로 활용했다.

모델 학습이 완료된 후 다음 코드를 사용하여 SavedModel 형식으로 export했다.

model.evaluate(x_test, y_test, verbose=2)

model.export("saved_model/1")

여기서 1은 모델 버전이다.

TensorFlow Serving에서는 모델 버전을 디렉터리로 구분할 수 있다.

saved_model/
└── 1/

3. SavedModel 생성 확인

모델을 export한 후 다음 명령어로 파일을 확인했다.

ls saved_model/1

실행 결과:

assets
fingerprint.pb
saved_model.pb
variables

정상적으로 SavedModel이 생성된 것을 확인할 수 있었다.

특히 다음 파일과 디렉터리가 존재한다.

saved_model.pb
variables/

4. TensorFlow Serving Docker 이미지 다운로드

이번에는 Docker를 이용해 TensorFlow Serving을 실행했다.

먼저 TensorFlow Serving 이미지를 다운로드했다.

docker pull tensorflow/serving

실행 결과:

Status: Downloaded newer image for tensorflow/serving:latest
docker.io/tensorflow/serving:latest

기존에 Docker 환경을 구축해 두었기 때문에 별도의 TensorFlow Serving 설치 과정 없이 Docker 이미지를 이용할 수 있었다.


5. TensorFlow Serving 실행

현재 tensorflow-study 디렉터리에 SavedModel이 있기 때문에 해당 디렉터리에서 Docker 컨테이너를 실행했다.

docker run -p 8501:8501 \
  --mount type=bind,source="$(pwd)/saved_model",target=/models/mnist \
  -e MODEL_NAME=mnist \
  -t tensorflow/serving

각 옵션은 다음과 같다.

옵션설명
-p 8501:8501REST API 포트 연결
--mount로컬 모델을 컨테이너에 연결
/models/mnist컨테이너 내부의 모델 위치
MODEL_NAME=mnist모델 이름 지정
tensorflow/servingTensorFlow Serving 이미지

6. 모델 정상 로딩 확인

Docker 실행 후 TensorFlow Serving의 로그를 확인했다.

Successfully reserved resources to load servable
{name: mnist version: 1}

그리고 다음과 같은 로그도 확인할 수 있었다.

SavedModel load for tags { serve };
Status: OK

마지막으로:

Running gRPC ModelServer at 0.0.0.0:8500 ...
Exporting HTTP/REST API at:localhost:8501 ...

라는 메시지가 출력되었다.

따라서 TensorFlow Serving이 정상적으로 실행되었고,

gRPC  → 8500
REST  → 8501

포트를 통해 요청을 받을 수 있는 상태가 되었다.


7. REST API 확인

서버가 실행된 터미널은 그대로 둔 상태에서 새로운 터미널을 열었다.

그 후 다음 명령어를 실행했다.

curl --noproxy '*' http://127.0.0.1:8501/v1/models/mnist

정상적으로 모델 상태가 반환되었다.

이를 통해 mnist 모델이 TensorFlow Serving에 정상적으로 등록되어 있는 것을 확인했다.


8. 예측 요청 데이터 생성

이제 실제로 모델에 데이터를 보내기 위해 MNIST 테스트 데이터를 JSON 형식으로 만들었다.

먼저 TensorFlow 환경을 활성화했다.

conda activate test

그리고 첫 번째 MNIST 이미지를 가져와 request.json으로 저장했다.

python -c "import tensorflow as tf, json; (x_train, y_train), _ = tf.keras.datasets.mnist.load_data(); x = (x_train[0] / 255.0).tolist(); json.dump({'instances': [x]}, open('request.json', 'w'))"

생성된 파일을 확인했다.

ls -lh request.json

정상적으로 request.json 파일이 생성되었다.


9. curl을 이용한 예측 요청

이제 REST API에 실제 예측 요청을 보냈다.

curl --noproxy '*' -X POST \
  http://127.0.0.1:8501/v1/models/mnist:predict \
  -H "Content-Type: application/json" \
  -d @request.json

TensorFlow Serving에서 다음과 같은 예측 결과를 반환했다.

{
  "predictions": [
    [
      -16.8028,
      -4.0355,
      -4.2372,
       8.3255,
      -25.7745,
      12.6974,
      -17.9552,
      -5.7750,
     -12.6860,
      -7.3699
    ]
  ]
}

여기서 10개의 값은 숫자 0~9 각각에 대한 모델의 출력값이다.

가장 높은 값은:

5 → 12.6974

이므로 모델은 해당 이미지를 숫자 5로 예측했다.


10. Python에서 API 호출하기

이번에는 curl이 아니라 Python에서 TensorFlow Serving API를 호출해 보았다.

먼저 requests를 설치했다.

python -m pip install requests

그리고 predict.py 파일을 생성했다.

import json
import requests

# TensorFlow Serving API 주소
url = "http://127.0.0.1:8501/v1/models/mnist:predict"

# 테스트 데이터 읽기
with open("request.json", "r") as f:
    data = json.load(f)

# TensorFlow Serving에 예측 요청
response = requests.post(
    url,
    json=data
)

# 결과 확인
result = response.json()

print("===== TensorFlow Serving 예측 결과 =====")

predictions = result["predictions"][0]

for i, value in enumerate(predictions):
    print(f"{i} : {value:.4f}")

# 가장 높은 값을 가진 숫자 선택
predicted_digit = max(
    range(len(predictions)),
    key=lambda i: predictions[i]
)

print()
print(f"예측 결과: {predicted_digit}")

실행:

python predict.py

실행 결과:

===== TensorFlow Serving 예측 결과 =====

0 : -16.8028
1 : -4.0355
2 : -4.2372
3 : 8.3255
4 : -25.7745
5 : 12.6974
6 : -17.9552
7 : -5.7750
8 : -12.6860
9 : -7.3699

예측 결과: 5

curl을 사용했을 때와 동일하게 5로 예측되었다.


마무리

이번 실습에서는 단순히 TensorFlow 모델을 학습하는 것에서 끝나지 않고, 학습한 모델을 실제 서비스 형태로 제공하는 과정까지 진행해 보았다.

  • TensorFlow 모델 학습
  • SavedModel 생성
  • Docker를 이용한 TensorFlow Serving 실행
  • REST API 확인
  • JSON 데이터 생성
  • REST API를 통한 모델 예측
  • Python requests를 이용한 API 호출

0개의 댓글