Skip to content
Go back

tensor-serving 서버 구축

Updated:
Edit page

Table of contents

Open Table of contents

Pytorch와 다른 점

예전에 작성했던 pytorch 모델을 이용한 fastapi서버에서는 도커 컨테이너에서 모델을 가져오고 fastapi를 이용하여 restapi화 하여 제작했다.
하지만 tensorflow에서는 tensor-serving이라는 컨테이너가 따로 존재하는데, pytorch와 다른 방식으로 만들어야했다.
tensor-serving 외에도 nvidia에서 만든 triton을 이용하여 배포하는 방법도 있다.
tensor-serving, fastapi 등 다른 것들보다 더 빠르고 확장성이 넓다는 장점이 있지만 방법에 대한 문서가 많지 않아서 다음에 다시 다루도록 하겠다.
tensor-serving은 컨테이너가 자동으로 볼륨 디렉토리에 모델을 탐지하고 api화 시켜 localhost로 서비스가 시작된다.
그러기에 다른 컨테이너에서 fastapi를 이용하여 이미지를 받고 정제한 뒤, tensor-serving 컨테이너로 데이터를 넘겨 결과값을 받아와야 한다.

Predict 코드

다음은 tensor-serving 컨테이너로 이미지를 넘기기 전 이미지를 정제하고 보낸 뒤, 검증 결과를 처리하는 코드이다.

def TestModel(path):
    image = cv2.imread(path, cv2.IMREAD_UNCHANGED)
    image = cv2.resize(image, dsize=(256,256),interpolation=cv2.INTER_LINEAR)

    image = image / 255.0
    image_arr = np.array(image)
    image_arr = np.expand_dims(image_arr,axis=0)

    data = json.dumps({"signature_name":"serving_default","instances":image_arr.tolist()})

    headers = {"content-type": "application/json"}
    json_response = requests.post('http://localhost:8501/v1/models/model:predict', data=data, headers=headers)
    prediction = json.loads(json_response.text)

    try:
        predict_arr = np.array(prediction['predictions'])
    except: 
        return -1
    else:
        result = np.argmax(predict_arr[0])

    return category[result]

fastapi에서 이미지 경로를 받아와 주고 이미지를 정제해준다.
그 뒤, json으로 tensor-serving컨테이너로 데이터를 넘겨주는데 경로는 v1은 버전명으로 실제 폴더명에서 숫자를 의미한다.(밑에서 다시 설명하겠다)
그 뒤의 경로는 도커 볼륨경로를 써주고 마지막에 :predict를 써주면 된다.
여기서 텐서플로우 모델은 h5모델이 아닌 saved_model 형식으로 되어있어야 한다.
변환 방법은 아래와 같다.

import tensorflow as tf

model = tf.keras.models.load_model('/data/api/tensorflow/saved_model/1/model.h5')

model.save('/data/api/tensorflow/saved_model/1/model')

도커 설정

도커 실행 명령어는 아래와 같다.

docker run -it --rm -p 8501:8501 -v /mnt/d/yaming_dataset/Yaming_AI/api/tensorflow/saved_model:/models/model tensorflow/serving:2.3.0

볼륨 경로설정에서 : 왼쪽의 경로를 확인하면 …/saved_model 까지 되어있는데 실제 saved_model 경로 안에는 숫자로만 된 폴더가 있어야 한다(1이나 2 같은 정수)
이 숫자는 모델의 버전을 뜻하게 되고 요청할 때 경로에서 v1, v2 등으로 해주면 된다.
: 오른쪽은 요청 경로를 뜻한다. 실제로 요청 경로를 오른쪽에 쓴 것대로 해주면 된다.


Edit page
Share this post on:

Previous Post
diffusion과 gan의 원리와 차이점
Next Post
git 협업