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깃헙에서는 컴파일 후 배포를 한다;;
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://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/deploying_tensorflow_serving.html
https://github.com/aws/amazon-sagemaker-examples
'DevOps > AWS' 카테고리의 다른 글
AWS EC2서버 접속하기 - for Mac,Window (0) | 2021.09.26 |
---|---|
AWS Lambda(람다)란 (1) | 2021.08.24 |
AWS Lambda Scikit-Learn Layer생성하기 (1) | 2021.08.20 |
Lambda에서 Pandas, Numpy Layer로 사용하기 (0) | 2021.08.11 |
AWS Lambda에서 Sagemaker Endpoint 호출 (0) | 2021.08.07 |
댓글