• 텐서플로우 서빙에 대해

    2017. 9. 5. 14:55

    by. 위지원

    텐서플로우 홈페이지를 보고 공부한 내용용


    텐서플로우 서빙이란?


    -텐서플로우 머신런닝 모델을 운영환경으로 배포하는 것을 도와주는것으로써 구글에서 런칭함

    -쉽게 말해 모델을 운영환경에서 사용할 수 있도록 도와준다.

    -사용자로부터의 입력을 모델에 반영하기위해 서빙api를 이용할 수 있다.




    학습기에서 훈련데이터를 공급하여 모델을 생성하고 검증하여 텐서플로우 서빙 시스템에 배포 


    SavedModelBuilder모듈을 사용하여 모델을 내보낸다. ( 스냅샷을 저장소에 저장하여 로드할 수 있게 하는 것 )

    from tensorflow.python.saved_model import builder as saved_model_builder

    빌더에 필요한 라이브러리를 import 한다.

    export_path_base = sys.argv[-1]
    export_path
    = os.path.join(
          compat
    .as_bytes(export_path_base),
          compat
    .as_bytes(str(FLAGS.model_version)))

    스냅샷을 저장할 경로를 설정한다.  여기서 FLAGS는 모델의 훈련 횟수나 버전 train.py가 위치한 디렉토리를 지정한것이다. 자세한 내용은 mnist.py 참조

    이렇게 지정하면 파일명.py [--training_iteration=x] [--model_version=y] export_dir 이렇게 사용할 수 있다


    tf.app.flags.DEFINE_integer('training_iteration',1000,'number of training iterations.')

    tf.app.flags.DEFINE._integer('model_version',1,'version number of the model.')

    tf.app.flags.DEFINE._string('work_dir','/tmp','Working directory')

    FLAGS = tf.app.flags.FLAGS


    **나는 경로지정과 버전을 이렇게 지정해줬다.


    model_version = 1

    path = os.path.join("modelTaxi", str(model_version))

    builder = tf.saved_model.builder.SavedModelBuilder(path)


    경로를 설정하고 나면 모델을 해당 경로에 저장한다

    builder = saved_model_builder.SavedModelBuilder(export_path)


    그다음에 저장할때 metaGraph와 variables에 대해 넘겨주는데, 

    -sess : 말그대로 내보내기 위해 훈련 된 모델을 가지고잇는 텐서의 세션이다.

    -tags : 메타그래프를 저장할 태그 세트이다. serve에 미리 정의되어있는 상수태그를 이용

    -signature_def_map : 메타 그래프에 추가 할 tensorflow ::SignatureDef 에 대한 서명에 대한 사용자 제공 키의 맵을 지정한다고 한다

    보통 여기서 이제 사용자가 모델에 입력할 값에대한 매핑정보와 그리고 출력으로 나온 값에 대한 매핑 정보를 담는다

    -"serving_default"로 키를 지정하여 모델을 내보내면 기본 서명을 지정한다. : 일전에 테스트 모델에서 이것에 대한 오류를 다뤘던 것 같다. 

     http://weejw.tistory.com/52


    그래서 이때 사용을 이런식으로 하였었다.↓↓


    "serving_default": tf.saved_model.signature_def_utils.predict_signature_def(

                        inputs= {"egg": x, "bacon": y},

                        outputs= {"spam": z})


    -서명을 쉽게 작성하기 위하여 signature_def_utils.build_signature_def()  을 이용하여  아래에 있는 세 구문을 한번에 할 수 있다.

    (위의 코드와 아래의 코드 비교)


    (A)

    prediction_signature, 

    signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: 

    classification_signature


    만약에 문서에 나와있는데로(A)를 사용하려면 

    classfication_signature의 인자로 

    -inputs={'images':tensor_info_x}

    -outputs={'scores':tensor_info_y}

    (values를 플레이스 홀더 변수명과 일치시켜야한다) 

    를 넘겨주어야한다.


    마지막으로 legacy_init_op는 변수초기화 시켜주는 작업이다 

    legacy_init_op = tf.group (tf.tables_initializer (), name = ' legacy_init_op ' )

    이렇게 정의해주면 된다.


    **나는 이렇게도 그냥 초기화를 바로해서 했었다.     

    with tf.Session() as sess:

            sess.run(tf.global_variables_initializer())


    builder.add_meta_graph_and_variables(
          sess
    , [tag_constants.SERVING],
          signature_def_map
    ={
               
    'predict_images':
                   prediction_signature
    ,
               signature_constants
    .DEFAULT_SERVING_SIGNATURE_DEF_KEY:
                   classification_signature
    ,
         
    },
          legacy_init_op
    =legacy_init_op)