본문 바로가기
DevOps/AWS

AWS Tensorflow 모델 배포 및 endpoint 생성하기

by 푸푸망나뇽 2021. 8. 5.
반응형

AWS sagemaker에서 모델개발을 진행 중인데 

AWS에서 제공하는 autopilot 이외에 개인이 개발한 모델의 엔드포인트를 생성해 사용하고싶어졌다.

열심히 찾아본 결과를 정리해보겠다!

 

우선 Tensorflow 모델을 배포하는 방법!

 

Sagemaker - 노트북환경에서 진행하도록 한다.

 

1) 모델 훈련 후 해당 모델을 저장한다.

 

# 모델 생성
model = tf.keras.Sequential([ tf.keras.layers.Dense(units=256, activation='relu', input_shape=(89,)),  
                             tf.keras.layers.Dense(units=128, activation='relu'), 
                             tf.keras.layers.Dense(units=64, activation='relu'), 
                             tf.keras.layers.Dense(units=32, activation='relu'), 
                             tf.keras.layers.Dense(units=16, activation='relu'),
                             tf.keras.layers.Dense(units=8, activation='relu'),
                             tf.keras.layers.Dense(units=2, activation='sigmoid') ]) 
model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.0005), loss='binary_crossentropy', metrics=['accuracy']) 

# 모델 훈련
# epoch: 100, batch_size: 8
history = model.fit(X_train, y_train, epochs=100, batch_size=8, validation_split=0.25, callbacks=[tf.keras.callbacks.EarlyStopping(patience=10, monitor='val_loss')])
# 모델 저장
model.save('./model/1')

 

 

2) 저장한 모델을 tar화 하여 저장하고 AWS S3에 업로드한다.

 

%%sh
cd model
tar cvfz model-tf.tar.gz 1

 

* 이때 주의할점은 모델의 버전이 명시된 폴더에 저장해서 tar화 해야한다는 것이다.

   이걸 몰라서 한참 오류가 나서 포기할뻔했다...ㅠ

 

import sagemaker

sess = sagemaker.Session()
bucket = '버킷이름'
model_path = sess.upload_data(bucket = bucket,path='./1/model-tf.tar.gz', key_prefix='model')
print(model_path)

 

 

3) Sagemaker Tensorflow를 이용해 저장한 모델읽어와 모델 생성 후 배포

 

from sagemaker.tensorflow.model import TensorFlowModel

tf_model = TensorFlowModel(
    model_data=model_path,
    framework_version='2.3.1',
    role=sagemaker.get_execution_role())
from time import strftime,gmtime

# 엔드포인트 이름 설정
tf_endpoint_name = 'tf-{}-{}'.format('model', strftime("%Y-%m-%d-%H-%M-%S", gmtime()))

# 모델 배포 및 엔드포인트 생성
tf_predictor = tf_model.deploy(
    endpoint_name=tf_endpoint_name,
    initial_instance_count=1, 
    instance_type='ml.t2.medium')

print(tf_endpoint_name)

 

 

생성한 엔드포인트는  Sagemaker>추론>엔드포인트 에서 생성된 엔드포인트 확인이 가능하다!

 

AWS 공식문서에는 아래와같이 읽어서 생성한 모델에 대해 배포 후 컴파일작업을 수행하는데 

AWS example깃헙에서는 컴파일 후 배포를 한다;;

(https://github.com/aws/amazon-sagemaker-examples/blob/master/sagemaker_neo_compilation_jobs/pytorch_torchvision/pytorch_torchvision_neo.ipynb)

compile과정이 필수인지는 모르겠다.... 일단 배포도 잘되고 엔드포인트호출도 잘되기때문에... 혼란스럽군...

 

instance_family = 'ml_c5'
framework = 'tensorflow'
compilation_job_name = 'keras-compile'
# output path for compiled model artifact
compiled_model_path = 's3://{}/{}/output'.format(bucket,compilation_job_name)
data_shape = {'inputs':[1, data.shape[0], data.shape[1]]}

optimized_estimator = sm_model.compile(target_instance_family=instance_family,
                                         input_shape=data_shape,
                                         job_name=compilation_job_name,
                                         role=role,
                                         framework=framework,
                                      framework_version=tf_framework_version,
                                         output_path=compiled_model_path
                  )

optimized_predictor = optimized_estimator.deploy(initial_instance_count = 1, instance_type = instance_type)

 

 

 

++)

https://beomi.github.io/2017/12/07/Deploy-Tensorflow-Keras-on-AWS-Lambda/

https://www.slideshare.net/awskorea/aws-lambda-tensorflow-keras-inferences

 

이글을 보면 텐서플로우 모델의 weight파일을 S3에 업로드 한후

Lambda에서 이를 가져와 모델을 만들어서 바로 predict하도록 되어있는데

Tensorflow를 Lambda에서 임포트하기가 용량때문에 몹시 까다로워서 실패하였다.

 

 

 


참고

 

https://aws.amazon.com/ko/blogs/machine-learning/deploy-trained-keras-or-tensorflow-models-using-amazon-sagemaker/

 

https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/deploying_tensorflow_serving.html

 

https://github.com/aws/amazon-sagemaker-examples

 

https://gitlab.com/juliensimon/amazon-studio-demos/-/blob/master/sagemaker_fridays/s03e08/02%20Import%20TensorFlow.ipynb

 

반응형

댓글