-
며칠간의 삽질을 기록해보겠다
저번 시간 드디어 간단 모델을 만들었다... 오늘은 배포하고 app engine에서 받아서 화면에 helloworld를 출력해보자 될려나..
문서를 참고하여 모델을 만들어보자
1.우선 모델을 생성한다
$ gcloud ml-engine models create "helloworldtest"
2.버킷 경로를 지정해준다
$DEPLOYMENT_SOURCE="gs://helloworldtest_1"
3.모델을 생성한다
$gcloud ml-engine versions create "version_name"\--model "model_name" --origin $DEPLOYMENT_SOURCEㅋㅋㅋ 바로될리가 없다 ㅋㅋ 콘솔로 가서 해봐도 똑같은 오류가 뜬다 !!!
아하 모델 export를 해야한다 1부에서 언급했던것같다ㅏ 이게 이때 쓰는거구나!한번 찾아보자
http://fdahms.com/2017/03/05/tensorflow-serving-jvm-client/ 이분이 친절하게 설명해주시고 계시다 따라해보자
우선 간단한 모델을 하나 생성한다
import tensorflow as tf x = tf.placeholder(tf.float32, shape=(None)) y = tf.placeholder(tf.float32, shape=(None)) three = tf.Variable(3, dtype= tf.float32) z = tf.scalar_mul(three, x) + y
그리고 이 모델을 export한다 화살표로 가르킨곳에서 난 에러가 낫는데 .python을 제거하니깐 됐다. (모듈이 바뀐건가)
import os from tensorflow.python.util import compat model_version = 1 path = os.path.join("three_x_plus_y", str(model_version)) builder = tf.python.saved_model.builder.SavedModelBuilder(path) <-- with tf.Session() as sess: sess.run(tf.global_variables_initializer()) builder.add_meta_graph_and_variables( sess, [tf.python.saved_model.tag_constants.SERVING], signature_def_map= { "magic_model": tf.saved_model.signature_def_utils.predict_signature_def( <-- inputs= {"egg": x, "bacon": y}, outputs= {"spam": z}) }) builder.save()
오 이렇게 하니깐 .pb파일이 만들어졌다. 이제 콘솔로 가서 버전을 맹그러보자!
생성중이뜨더니 생성되었다 ㅎㅎ 아이 신나라 이제 예측을 보내보자 ㅎㅎㅎㅎㅎㅎ
...
$ echo $MODEL_NAME 생성해둔 모델 이름
testingecho $MODEL_BINARIES .pb 파일이 잇는곳의 경로를
#나중에 알았지만 철자 틀렸다..밤샘이이렇게 위험..
gs://modelcreateing우선 두개의 변수를 성정해주고..
gcloud ml-engine versions create v1 \
--model $MODEL_NAME \
--origin $MODEL_BINARIES \
--runtime-version 1.2공식문서에서 가르쳐준데로 하면
gcloud ml-engine versions create "v1" --model "testingmodel" --origin $DEPLOYMENT_SOURCE
Creating version (this might take a few minutes)......failed.
ERROR: (gcloud.ml-engine.versions.create) Model validation failed: Serving metagraph must contain exactly one SignatureDef with key: serving_default오 에러가 뜬다 ㅎ 모델 버전이 아예 생성이 안된모냥이다..
ㅋ
생성시의 keyㅔ 대한 에러같은데 모델을 다시 생성해보자 서빙에 대한 문서를 다시봐야겠다
https://tensorflow.github.io/serving/serving_basic
유추시 입/출력 바인딩 메서드를 매핑하는거라는 .. 이건 위에서 한거아닌가... 혼돈이군
signature_def_map= { "magic_model": tf.saved_model.signature_def_utils.predict_signature_def( inputs= {"egg": x, "bacon": y}, outputs= {"spam": z}) })
이부분이 아닌가.. 공식문서를 보니 predict_signature에서는 input,output값만 넘겨줄 수 있다 아래와 같이
predict_signature_def(
inputs,
outputs
)mnist 예제를 보고 다시 코드를 수정해보았다. 다시시도해보자
import tensorflow as tf x = tf.placeholder(tf.float32, shape=(None)) y = tf.placeholder(tf.float32, shape=(None)) three = tf.Variable(3, dtype= tf.float32) z = tf.scalar_mul(three, x) + y import os from tensorflow.python.util import compat model_version = 1 path = os.path.join("three_x_plus_y", str(model_version)) builder = tf.saved_model.builder.SavedModelBuilder(path) legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op') tensor_info_x = tf.saved_model.utils.build_tensor_info(x) tensor_info_y = tf.saved_model.utils.build_tensor_info(y) tensor_info_z = tf.saved_model.utils.build_tensor_info(z) prediction_signature = ( tf.saved_model.signature_def_utils.build_signature_def( inputs= {'egg': tensor_info_x, 'bacon': tensor_info_y}, outputs= {'spam': tensor_info_z}, method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME)) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) builder.add_meta_graph_and_variables( sess,[tf.saved_model.tag_constants.SERVING], signature_def_map= { "magic_model": prediction_signature}, legacy_init_op=legacy_init_op ) builder.save()
소용이 없었다..같은 오류다 ...
결국 스택오버플로의 도움을 받았다! 문제는 magic_model을 그저 serving_default로 변경해주길 바라는것이였다.. .이런 멍청한 ㅠ_ㅠ
아무튼 해결하고 버전도 배포했으니 요청을 날려보자
는 다음시간에.. 지친다...
'2017년 > Google Platform' 카테고리의 다른 글
cloud sql database export (0) 2017.08.02 구글 플랫폼 ml을 써보자 4부 (0) 2017.07.20 구글 플랫폼 ml을 써보자 2부 (0) 2017.07.17 gcloud sdk를 설치해보자 [우분투기준] (0) 2017.07.17 구글 앱엔진을 사용해보자 (0) 2017.07.11