Path: blob/master/site/ko/guide/migrate/saved_model.ipynb
38983 views
Copyright 2021 The TensorFlow Authors.
SavedModel 마이그레이션 워크플로
모델을 TensorFlow 1의 그래프 및 세션에서 TensorFlow 2 API(예: tf.function, tf.Module 및 tf.keras.Model)로 마이그레이션한 후, 모델을 저장하고 로드하는 코드를 마이그레이션할 수 있습니다. 이 노트북은 TensorFlow 1 및 TensorFlow 2에서 SavedModel 형식으로 저장하고 로드할 수 있는 방법에 대한 예제를 제공합니다. 다음은 TensorFlow 1에서 TensorFlow 2로 마이그레이션할 때 사용하는 API 변경 사항에 대한 간략한 개요입니다.
| TensorFlow 1 | TensorFlow 2로 마이그레이션 --- | --- | --- 저장 | tf.compat.v1.saved_model.Buildertf.compat.v1.saved_model.simple_save | tf.saved_model.save
Keras: tf.keras.models.save_model 로드 | tf.compat.v1.saved_model.load | tf.saved_model.load
Keras: tf.keras.models.load_model 서명: 다음을
실행하는 데
사용할 수 있는
입력 및 출력 텐서 집합 | *.signature_def 유틸을 사용하여 생성됨
(예: tf.compat.v1.saved_model.predict_signature_def) | tf.function을 작성하고 tf.saved_model.save의 signatures 인수
를 사용하여 내보내기 수행 분류
및 회귀:
서명의 특수한 유형 | tf.compat.v1.saved_model.classification_signature_def,tf.compat.v1.saved_model.regression_signature_def 및
특정 Estimator 내보내기로
생성 | 이 두 서명 유형은 TensorFlow 2에서 제거됨.
서빙 라이브러리에 이러한 메서드 이름이 필요한 경우tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater 사용
매핑에 대한 자세한 설명은 아래의 TensorFlow 1에서 TensorFlow 2로의 변경 사항 섹션을 참조하세요.
설치하기
아래 예제는 TensorFlow 1 및 TensorFlow 2 API를 사용하여 동일한 더미 TensorFlow 모델(아래에서는 add_two로 정의)을 SavedModel 형식으로 내보내고 로드하는 방법을 보여줍니다. 가져오기 및 유틸리티 함수를 설정하는 것으로 시작합니다.
TensorFlow 1: SavedModel 저장 및 내보내기
TensorFlow 1에서는 tf.compat.v1.saved_model.Builder, tf.compat.v1.saved_model.simple_save 및 tf.estimator.Estimator.export_saved_model API를 사용하여 TensorFlow 그래프 및 세션을 빌드하고 저장하고 내보냅니다.
1. SavedModelBuilder를 사용하여 그래프를 SavedModel로 저장하기
2. 제공할 SavedModel 빌드하기
3. Estimator 추론 그래프를 SavedModel로 내보내기
Estimator model_fn의 정의(아래에서 정의됨)에서 tf.estimator.EstimatorSpec에서 export_outputs를 반환하여 모델의 서명을 정의할 수 있습니다. 출력 유형은 다음과 같이 다양합니다.
tf.estimator.export.ClassificationOutputtf.estimator.export.RegressionOutputtf.estimator.export.PredictOutput
이들은 각각 분류, 회귀, 예측 서명 유형을 생성합니다.
Estimator를 tf.estimator.Estimator.export_saved_model과 함께 내보내면 이러한 서명이 모델과 함께 저장됩니다.
TensorFlow 2: SavedModel 저장 및 내보내기
tf.Module로 정의한 SavedModel 저장 및 내보내기
TensorFlow 2에서 모델을 내보내려면 tf.Module 또는 tf.keras.Model을 정의하여 모델의 모든 변수와 함수를 보유해야 합니다. 그러면 tf.saved_model.save를 호출하여 SavedModel을 생성할 수 있습니다. 자세한 내용은 SavedModel 형식 사용하기 가이드의 사용자 정의 모델 저장하기 섹션을 참조하세요.
Keras로 정의한 SavedModel 저장 및 내보내기
사용이 중단: Keras 객체의 경우, 여기 가이드에 설명된 대로 새로운 상위 수준 .keras 형식과 tf.keras.Model.export를 사용하는 것이 좋습니다. 기존 코드에는 하위 수준 SavedModel 형식이 계속 지원됩니다
Mode.save 또는 tf.keras.models.save_model와 같은 저장 및 내보내기용 Keras API는 tf.keras.Model에서 SavedModel을 내보낼 수 있습니다. 자세한 내용은 Keras 모델 저장 및 로드하기를 확인하세요.
SavedModel 로드하기
위의 API로 저장한 SavedModel은 TensorFlow 1 또는 TensorFlow 2 API를 사용하여 로드할 수 있습니다.
TensorFlow 1 SavedModel은 일반적으로 TensorFlow 2에 로드될 때 추론에 사용할 수 있지만 훈련(그래디언트 생성)은 SavedModel이 리소스 변수를 포함하는 경우에만 가능합니다. 변수의 dtype을 확인할 수 있습니다. 변수 dtype에 "_ref"가 포함되어 있으면 참조 변수입니다.
TensorFlow 2 SavedModel은 SavedModel을 서명과 함께 저장한는 한 TensorFlow 1에서 로드하고 실행할 수 있습니다.
아래 섹션에는 이전 섹션에서 저장한 SavedModels을 로드하고, 내보낸 서명을 호출하는 방법을 보여주는 코드 샘플이 포함되어 있습니다.
TensorFlow 1: tf.saved_model.load로 저장한 모델 로드하기
TensorFlow 1에서는 tf.saved_model.load를 사용하여 SavedModel을 현재 그래프 및 세션으로 직접 가져올 수 있습니다. 다음과 같이 텐서 입력 및 출력 이름에서 Session.run을 호출할 수 있습니다.
TensorFlow 2: tf.saved_model로 저장한 모델 로드하기
TensorFlow 2에서 객체는 변수와 함수를 저장하는 Python 객체에 로드됩니다. 이것은 TensorFlow 1에서 저장한 모델과 호환됩니다.
자세한 내용은 SavedModel 형식 사용하기 가이드의 사용자 정의 모델 로드 및 사용하기 섹션과 tf.saved_model.load API 문서를 확인하세요.
TensorFlow 2 API로 저장한 모델은 모델에 연결된 tf.function 및 변수(서명으로 내보낸 항목 대신)에도 액세스할 수 있습니다. 예제는 다음과 같습니다.
TensorFlow 2: Keras로 저장한 모델 로드하기
사용이 중단됨: Keras 객체의 경우, 여기 가이드에 설명된 대로 새로운 상위 수준 .keras 형식과 tf.keras.Model.export를 사용하는 것이 좋습니다. 기존 코드에는 하위 수준 SavedModel 형식이 계속 지원됩니다
tf.keras.models.load_model과 같이 Keras로 로드하는 API를 사용하면 저장된 모델을 Keras 모델 객체로 다시 로드할 수 있습니다. Keras(Model.save 또는 tf.keras.models.save_model)로 저장한 SavedModels 만 로드할 수 있습니다.
tf.saved_model.save로 저장한 모델은 tf.saved_model.load로 로드되어야 합니다. tf.saved_model.load를 사용하여 Model.save로 저장한 Keras 모델은 로드할 수 있지만 TensorFlow 그래프만 갖게 됩니다. 자세한 내용은 tf.keras.models.load_model API 문서 및 Keras 모델 저장 및 로드하기 가이드를 참조하세요.
GraphDef 및 MetaGraphDef
<a name="graphdef_and_metagraphdef">
원시 GraphDef 또는 MetaGraphDef를 TF2에 로드하는 직접적인 방법은 없습니다. 그러나 v1.wrap_function을 사용하여 그래프를 TF2 concrete_function으로 가져오는 TF1 코드를 변환할 수 있습니다.
먼저 MetaGraphDef를 저장합니다.
TF1 API를 사용하면 tf1.train.import_meta_graph를 사용하여 그래프를 가져오고 값을 복원할 수 있습니다.
그래프를 로드할 때 사용하는 TF2 API는 없지만 즉시 실행 모드에서 실행할 수 있는 구체적인 함수로 그래프를 가져올 수 있습니다.
TensorFlow 1에서 TensorFlow 2로의 변경 사항
<a id="changes_from_tf1_to_tf2">
이 섹션에서는 TensorFlow 1의 주요 저장 및 로드 용어에 해당하는 TensorFlow 2 용어와 변경 사항을 나열합니다.
SavedModel
SavedModel은 매개변수 및 계산을 사용하여 전체 TensorFlow 프로그램을 저장하는 형식입니다. 여기에는 모델을 실행하기 위해 서비스 플랫폼에서 사용하는 서명이 포함되어 있습니다.
파일 형식 자체는 크게 변경되지 않았으므로 TensorFlow 1 또는 TensorFlow 2 API를 사용하여 SavedModel을 로드하고 제공할 수 있습니다.
TensorFlow 1과 TensorFlow 2의 차이점
서빙 및 추론 사용 사례는 API 변경 사항 외에는 TensorFlow 2에서 업데이트되지 않았습니다. 개선 사항은 SavedModel에서 로드한 재사용 및 구성 모델에 소개되었습니다.
TensorFlow 2에서 프로그램은 tf.Variable이나 tf.Module 혹은 고수준 Keras 모델(tf.keras.Model) 및 레이어(tf.keras.layers)와 같은 객체로 표현됩니다. 세션에 값이 저장된 전역 변수가 더 이상 없으며 이제 그래프가 다른 tf.function에 존재합니다. 결과적으로 모델을 내보내는 동안 SavedModel은 각 구성 요소와 함수 그래프를 별도로 저장합니다.
TensorFlow Python API를 사용하여 TensorFlow 프로그램을 작성할 때에는 변수, 함수 및 기타 리소스를 관리하는 객체를 빌드해야 합니다. 일반적으로 이는 Keras API를 사용하여 수행되지만 tf.Module을 생성하거나 하위 클래스화하여 객체를 빌드할 수도 있습니다.
Keras 모델(tf.keras.Model)과 tf.Module는 연결된 변수와 함수를 자동으로 추적합니다. SavedModel은 로드 시 복원할 수 있도록 모듈과 변수와 함수 사이의 이러한 연결을 저장합니다.
서명
서명은 SavedModel의 엔드포인트입니다. 서명은 사용자에게 모델을 실행하는 방법과 필요한 입력을 알려줍니다.
TensorFlow 1에서 서명은 입력 및 출력 텐서를 나열함으로써 생성됩니다. TensorFlow 2에서 서명은 구체적인 함수를 전달하여 생성됩니다(그래프 및 tf.function 소개 가이드, 특히 다형성: 하나의 함수, 많은 그래프 섹션에서 TensorFlow 함수에 대한 자세한 내용 참조). 간단히 말해서 tf.function에서 생성한 구체적인 함수는 다음과 같습니다.
Session.run
TensorFlow 1에서는 텐서 이름을 이미 알고 있는 한 가져온 그래프로 Session.run을 호출할 수 있습니다. 이렇게 하면 복원된 변수 값을 검색하거나 서명에서 내보내지 않은 모델의 일부를 실행할 수 있습니다.
TensorFlow 2에서는 가중치 행렬({code 0}kernel{/code 0})과 같은 변수에 직접 액세스할 수 있습니다.
또는, 모델 객체에 연결된 tf.function을 호출할 수 있습니다(예: loaded.__call__).
TF1과 달리 함수의 일부를 추출하고 중간 값에 액세스할 방법이 없습니다. 저장한 객체에 필요한 기능을 반드시 모두 내보내야 합니다.
TensorFlow Serving 마이그레이션 참고사항
SavedModel은 원래 TensorFlow Serving과 함께 작동하도록 제작되었습니다. 이 플랫폼은 분류, 회귀, 예측과 같은 다양한 유형의 예측 요청을 제공합니다.
TensorFlow 1 API를 사용하면 다음과 같은 유틸로 이러한 유형의 서명을 생성할 수 있습니다.
tf.compat.v1.saved_model.classification_signature_deftf.compat.v1.saved_model.regression_signature_deftf.compat.v1.saved_model.predict_signature_def
분류(classification_signature_def) 및 회귀(regression_signature_def)는 입력과 출력을 제한하므로 입력은 { code4}tf.Example이어야 하고 출력은 classes나 scores나 prediction이어야 합니다. 한편 예측 서명(predict_signature_def)에는 제한이 없습니다.
TensorFlow 2 API로 내보낸 SavedModels은 TensorFlow Serving과 호환되지만 예측 서명만 포함합니다. 분류 및 회귀 서명은 제거되었습니다.
분류 및 회귀 서명을 사용해야 하는 경우 tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater를 사용하여 내보낸 SavedModel을 수정할 수 있습니다.
다음 단계
TensorFlow 2의 SavedModels 에 대한 자세한 내용은 다음 가이드를 확인하세요.
TensorFlow Hub를 사용하는 경우 다음 가이드가 유용할 수 있습니다.
TensorFlow.org에서보기
Google Colab에서 실행하기
GitHub에서 소스 보기
노트북 다운로드하기