• 구글 플랫폼 ml 을 써보자 3부

    2017. 7. 18. 02:55

    by. 위지원

    며칠간의 삽질을 기록해보겠다




    저번 시간 드디어 간단 모델을 만들었다... 오늘은 배포하고 app engine에서 받아서 화면에 helloworld를 출력해보자 될려나..


    우선 https://cloud.google.com/ml-engine/docs/how-tos/deploying-models?hl=ko&_ga=1.11794548.1971978119.1500268292

    문서를 참고하여 모델을 만들어보자


    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 생성해둔 모델 이름
    testing


    echo $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로 변경해주길 바라는것이였다.. .이런 멍청한 ㅠ_ㅠ


    아무튼 해결하고 버전도 배포했으니 요청을 날려보자


    는 다음시간에.. 지친다...