TensorFlow 생태계를 위한 프로덕션 준비 모델 형식
弘益人間 · 널리 인간을 이롭게 하라
TensorFlow SavedModel은 TensorFlow 모델을 위한 범용 직렬화 형식입니다. TensorFlow 1.0에서 도입되고 TensorFlow 2.0에서 크게 개선된 SavedModel은 계산 그래프, 변수, 에셋 및 시그니처를 포함하는 완전하고 독립적인 패키지로 프로덕션 배포를 위해 설계되었습니다.
체크포인트 파일이나 동결된 그래프와 같은 이전 형식과 달리, SavedModel은 모델을 서빙하거나 미세 조정하거나 다른 형식으로 변환하는 데 필요한 모든 것을 포함합니다. TensorFlow Serving, TensorFlow Lite, TensorFlow.js 및 클라우드 ML 플랫폼에 권장되는 형식입니다.
SavedModel은 다음 구조를 가진 디렉토리로 저장됩니다:
saved_model/
├── assets/ # 추가 파일 (어휘, 등)
│ └── vocab.txt
├── variables/ # 모델 가중치 및 변수
│ ├── variables.data-00000-of-00001
│ └── variables.index
└── saved_model.pb # 직렬화된 계산 그래프 및 메타데이터
# 여러 버전이 있는 경우:
model_repository/
├── my_model/
│ ├── 1/ # 버전 1
│ │ ├── assets/
│ │ ├── variables/
│ │ └── saved_model.pb
│ └── 2/ # 버전 2
│ ├── assets/
│ ├── variables/
│ └── saved_model.pb
import tensorflow as tf
from tensorflow import keras
# 모델 생성 및 훈련
model = keras.Sequential([
keras.layers.Dense(128, activation='relu', input_shape=(784,)),
keras.layers.Dropout(0.2),
keras.layers.Dense(10, activation='softmax')
])
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# 모델 훈련
model.fit(train_data, train_labels, epochs=5)
# SavedModel로 저장
model.save('my_model') # SavedModel 디렉토리 생성
# 또는 명시적으로 SavedModel 형식 사용
model.save('my_model', save_format='tf')
class CustomModel(tf.Module):
def __init__(self):
super().__init__()
self.v = tf.Variable(1.0)
self.w = tf.Variable(2.0)
@tf.function(input_signature=[
tf.TensorSpec(shape=[None], dtype=tf.float32)
])
def __call__(self, x):
return self.v * x + self.w
# 생성 및 저장
model = CustomModel()
tf.saved_model.save(model, 'custom_model')
# 명시적 시그니처와 함께
@tf.function(input_signature=[
tf.TensorSpec(shape=[None, 224, 224, 3], dtype=tf.float32)
])
def serving_fn(images):
return model(images)
tf.saved_model.save(
model,
'custom_model',
signatures={'serving_default': serving_fn}
)
시그니처는 서빙 및 추론을 위한 입출력 인터페이스를 정의합니다:
class MultiSignatureModel(tf.Module):
def __init__(self):
super().__init__()
self.model = create_model()
@tf.function
def predict(self, images):
return self.model(images)
@tf.function
def preprocess_and_predict(self, raw_images):
processed = tf.image.resize(raw_images, [224, 224])
processed = processed / 255.0
return self.model(processed)
# 여러 시그니처로 저장
model = MultiSignatureModel()
signatures = {
'serving_default': model.predict.get_concrete_function(
tf.TensorSpec([None, 224, 224, 3], tf.float32)
),
'preprocess': model.preprocess_and_predict.get_concrete_function(
tf.TensorSpec([None, None, None, 3], tf.float32)
)
}
tf.saved_model.save(
model,
'multi_signature_model',
signatures=signatures
)
# 방법 1: tf.saved_model.load (더 많은 제어)
loaded = tf.saved_model.load('my_model')
predictions = loaded(test_data)
# 방법 2: keras.models.load_model (Keras 모델용)
model = keras.models.load_model('my_model')
predictions = model.predict(test_data)
# 방법 3: 시그니처 사용
loaded = tf.saved_model.load('my_model')
infer = loaded.signatures['serving_default']
output = infer(input_tensor=test_data)['output_0']
// TensorFlow Serving용 C++ API
#include "tensorflow/cc/saved_model/loader.h"
tensorflow::SavedModelBundle bundle;
tensorflow::SessionOptions session_options;
tensorflow::RunOptions run_options;
// 모델 로드
tensorflow::Status status = tensorflow::LoadSavedModel(
session_options,
run_options,
"/path/to/saved_model",
{"serve"}, // 태그
&bundle
);
// 추론 실행
std::vector outputs;
status = bundle.session->Run(
{{"input", input_tensor}},
{"output"},
{},
&outputs
);
# 모델 구성 파일 (models.config)
model_config_list {
config {
name: 'my_model'
base_path: '/models/my_model'
model_platform: 'tensorflow'
model_version_policy {
specific {
versions: 1
versions: 2
}
}
}
}
# Docker로 TensorFlow Serving 시작
docker run -p 8501:8501 \
--mount type=bind,source=/path/to/models,target=/models \
-e MODEL_NAME=my_model \
-t tensorflow/serving
import requests
import json
import numpy as np
# 입력 데이터 준비
data = {
"signature_name": "serving_default",
"instances": test_images.tolist()
}
# 요청 전송
response = requests.post(
'http://localhost:8501/v1/models/my_model:predict',
data=json.dumps(data)
)
# 응답 파싱
predictions = response.json()['predictions']
print(f"예측 결과: {predictions}")
import tensorflow as tf
# SavedModel 로드
converter = tf.lite.TFLiteConverter.from_saved_model('my_model')
# 최적화 구성
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_types = [tf.float16]
# 변환
tflite_model = converter.convert()
# 저장
with open('model.tflite', 'wb') as f:
f.write(tflite_model)
print(f"TFLite 모델 크기: {len(tflite_model) / 1024:.2f} KB")
# tensorflowjs 변환기 설치
pip install tensorflowjs
# SavedModel을 TF.js 형식으로 변환
tensorflowjs_converter \
--input_format=tf_saved_model \
--output_format=tfjs_graph_model \
--signature_name=serving_default \
--saved_model_tags=serve \
my_model \
tfjs_model/
# JavaScript에서 로드할 수 있음:
# const model = await tf.loadGraphModel('model.json');
import tensorflow as tf
import shutil
class ModelWithAssets(tf.Module):
def __init__(self):
super().__init__()
# 에셋에서 어휘 로드
self.vocab_file = tf.saved_model.Asset('vocab.txt')
@tf.function
def tokenize(self, text):
# 어휘 파일 사용
vocab_table = tf.lookup.StaticVocabularyTable(
tf.lookup.TextFileInitializer(
self.vocab_file.asset_path,
key_dtype=tf.string,
key_index=tf.lookup.TextFileIndex.WHOLE_LINE,
value_dtype=tf.int64,
value_index=tf.lookup.TextFileIndex.LINE_NUMBER
),
num_oov_buckets=1
)
return vocab_table.lookup(text)
# 모델 저장 (vocab.txt가 assets/로 복사됨)
model = ModelWithAssets()
tf.saved_model.save(model, 'model_with_assets')
# 후처리 양자화
converter = tf.lite.TFLiteConverter.from_saved_model('my_model')
converter.optimizations = [tf.lite.Optimize.DEFAULT]
# 완전 정수 양자화
def representative_dataset():
for _ in range(100):
yield [np.random.randn(1, 224, 224, 3).astype(np.float32)]
converter.representative_dataset = representative_dataset
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
quantized_model = converter.convert()
# 입력 사양을 명시적으로 정의
@tf.function(input_signature=[
tf.TensorSpec(shape=[None, 224, 224, 3], dtype=tf.float32, name='images')
])
def inference_fn(images):
# 전처리
images = tf.image.resize(images, [224, 224])
images = (images - 127.5) / 127.5
# 모델 추론
return model(images, training=False)
# 구체적 함수로 저장
tf.saved_model.save(
model,
'my_model',
signatures={'serving_default': inference_fn}
)
# 검증 스크립트
def validate_savedmodel(model_path, test_data):
# 모델 로드
model = tf.saved_model.load(model_path)
infer = model.signatures['serving_default']
# 입력 테스트
for i, (input_data, expected_output) in enumerate(test_data):
output = infer(**input_data)
# 출력 형상 확인
assert output.shape == expected_output.shape
# 정확도 확인
diff = tf.abs(output - expected_output)
max_diff = tf.reduce_max(diff)
assert max_diff < 0.001, f"테스트 {i} 실패: max_diff={max_diff}"
print("✓ 모든 검증 테스트 통과")
# 검증 실행
validate_savedmodel('my_model', test_dataset)
이 장에서는 TensorFlow SavedModel 형식을 상세히 다루었습니다. 주요 내용:
한국 통신 인프라 — 과기정통부(MSIT)·방송통신위원회(KCC)·정보통신기획평가원(IITP)·정보통신산업진흥원(NIPA)·KISA·NIS·KCMVP·TTA·KATS·KOLAS·NIA·ETRI·KAIST·KIST·POSTECH·삼성·LG·SK·KT·LG U+·NAVER·카카오 협력 「제5차 정보통신 전략 2024-2028」 운영. 「전기통신사업법」·「정보통신망법」·「전파법」·「방송법」·「개인정보 보호법」·「위치정보법」 적용. KS X 3GPP 4G LTE/5G NR/6G·KS X IETF 시리즈·KS X IEEE 802.11/802.15·KS X ITU-T G/H/Y 시리즈·KS X ISO/IEC 27000 시리즈 한국 프로파일 적용. 5G 가입자 3,500만 명 (2024)·6G 상용화 목표 2028년.
한국의 디지털 전환과 표준화는 다음 협력 체계로 운영된다. 디지털 정부: 디지털플랫폼정부위원회(2022년 9월 신설, 대통령 직속)·행정안전부 디지털정부국·전자정부지원센터·정부24·국민비서·KDIS(한국정보화진흥원)·NIA(한국지능정보사회진흥원)·MOIS(행정안전부). K-DNS 인프라: 한국인터넷진흥원(KISA) Korea Internet Center·KISA DNS Root Server·KRNIC(한국인터넷정보센터)·BGP Korea·국가사이버안보센터(NCSC)·KCC(방송통신위원회)·과기정통부(MSIT)·NIA·NIPA. 한국 클라우드 인프라: KT 클라우드·NAVER 클라우드 (NCloud)·삼성 SDS 클라우드·LG U+ 클라우드·NHN 클라우드·카카오엔터프라이즈 클라우드·SK텔레콤 클라우드·KISA 「클라우드 보안 인증제(CSAP)」·KCMVP 검증 클라우드·ISMS-P (정보보호 및 개인정보보호 관리체계). 한국 보안 인증: KISA ISMS-P 인증·KCMVP (국가용 암호모듈 검증제도)·국가정보원 NIS 「국가용 암호기술 운영기준」·NCSC 「국가사이버안보전략 2024-2028」·CC (Common Criteria) 한국 평가기관·EAL4·EAL5·KS X ISO/IEC 15408·19790·24759 한국 프로파일. 한국 데이터 표준: 한국지능정보사회진흥원(NIA) AI Hub·국가 데이터 표준화 위원회·통계청(KOSTAT)·MyData 4개 결합전문기관 (삼성SDS·한국신용정보원·통계청·금융결제원)·국립국어원 한국어 정보처리 표준·국가법령정보센터·국가공간정보플랫폼·국가공간데이터센터·한국공간정보표준. 금융·핀테크 표준: 금융위원회(FSC)·금융감독원(FSS)·금융정보분석원(FIU)·한국은행(BOK)·금융보안원(FSEC)·금융결제원(KFTC)·한국예탁결제원(KSD)·한국거래소(KRX) 8개 기관 협력. 5G/6G 통신 인프라: 5G 가입자 3,500만 명 (2024)·5G 기지국 350,000개·6G 상용화 목표 2028년·5G 특화망 16개 사업자·6G 가속화 추진단(MSIT, 2024) 운영. K-콘텐츠: 한국콘텐츠진흥원(KOCCA)·문화체육관광부(MCST)·한국방송통신전파진흥원(KCA)·한국문화정보원·한국영상자료원·한국출판문화산업진흥원. 「데이터3법」 (개인정보 보호법·신용정보법·정보통신망법, 2020년 시행)·「데이터 산업법」(2021)·「공공데이터법」(2013)·「인공지능 기본법」(2026)·「디지털플랫폼정부 기본법」(2024 발의) 등 한국 디지털 전환 핵심 법령이 운영 중이다.
한국의 산업 생태계와 표준화 체계는 다음 핵심 인프라로 구성된다. 한국 5대 그룹: 삼성·현대자동차·LG·SK·롯데. 각 그룹별 표준화 위원회와 ISO/IEC TC 한국 간사 활동. 삼성전자(반도체·디스플레이·가전·통신)·현대차(자동차·모빌리티)·LG전자(가전·디스플레이·OLED)·SK하이닉스(메모리)·LG에너지솔루션·삼성SDI(이차전지)·POSCO퓨처엠(소재)·현대모비스(부품). 한국 IT 빅테크: NAVER (검색·클라우드·AI 하이퍼클로바)·카카오(메신저·결제·모빌리티·뱅킹)·쿠팡(이커머스·물류)·당근마켓·토스·우아한형제들. 한국 통신3사: SK텔레콤·KT·LG U+. 5G·5G 특화망·B2B 클라우드·AI 사업 운영. 한국 7대 거점 대학: 서울대·KAIST·POSTECH·연세대·고려대·UNIST·DGIST·GIST. 모두 표준화 R&D 거점이며 ISO/IEC/IEEE 한국 의장 활동 중. 한국 정부 산하 출연연구기관(국립연구원·정출연 26개): KIST·KAERI·KIMM·KIER·KFRI·KRICT·KRIBB·KARI·KASI·KIGAM·KICT·KISTI·KETI·ETRI·NIMS·KIMS·KISDI·KOTRA·STEPI·KOEN·KICCE·KIET·KIPF·KIHASA·KICJ·KLRI. 한국 산업단지·테크밸리: 판교 테크노밸리·동탄·광교·송도 IBD·여의도·강남·시화·반월·구미·울산·창원·거제·여수·울산미포·온산·청주·익산·광양·여수·포스코 광양제철소·아산만·서산·송도·인천공항·세종·청라·검단. 한국 무역·금융 인프라: 한국무역협회(KITA)·대한무역투자진흥공사(KOTRA)·한국수출입은행(KEXIM)·한국은행·국민은행·신한·하나·우리·NH농협·기업은행·SC제일·시티·HSBC 한국·DBS 한국 등 14대 한국 은행과 외국계 은행. 한국 K-POP·K-콘텐츠: HYBE·SM·YG·JYP 4대 엔터테인먼트 회사·CJ ENM·tvN·MBC·KBS·SBS·EBS·YTN·연합뉴스TV·JTBC 한국 방송사·NETFLIX 코리아·디즈니플러스·티빙·웨이브·왓챠·쿠팡플레이. 한국 게임 산업: 넥슨·엔씨소프트·크래프톤·넷마블·카카오게임즈·펄어비스·컴투스·게임빌·NHN·스마일게이트·웹젠. 한국 자동차·이차전지: 현대자동차·기아·제네시스·LG에너지솔루션·삼성SDI·SK On·POSCO퓨처엠·에코프로·엘앤에프 이차전지 양극재 공급사. 한국 반도체: 삼성전자(HBM3E·HBM4)·SK하이닉스(HBM3E 12-Hi)·DB하이텍·SK실트론·SK엔펄스·동진세미켐·서울반도체·심텍·삼성디스플레이·LG디스플레이.
한국의 산업·기술 표준화는 다음 협력 체계를 통해 운영된다. 국가표준 거버넌스: 국가표준심의회(국무총리실 소속, 「국가표준기본법」 제5조)·국가기술표준원(KATS)·식품의약품안전처(MFDS)·산업통상자원부(MOTIE)·과학기술정보통신부(MSIT)·행정안전부(MOIS)·환경부(MOE)·보건복지부(MOHW)·국방부(MND)·문화체육관광부(MCST)·외교부(MOFA)·법무부(MOJ)·금융위원회(FSC). 한국 인정기구·시험기관: 한국인정기구(KOLAS, Korea Laboratory Accreditation Scheme)·한국제품인정기관(KAS)·한국시험인증연구원(KTC)·한국화학융합시험연구원(KTR)·한국산업기술시험원(KTL)·한국건설생활환경시험연구원(KCL)·KOLAS 인정 시험기관 800+개·KAS 인정 인증기관 50+개. 전기·전자·통신 인증: 방송통신위원회(KCC)·한국방송통신전파진흥원(KCA)·정보통신기술협회(TTA)·정보통신기획평가원(IITP)·정보통신산업진흥원(NIPA)·한국인터넷진흥원(KISA, Korea Internet & Security Agency)·KCMVP (국가용 암호모듈 검증제도)·NIS(국가정보원)·NSR(국가보안기술연구소)·NCSC(국가사이버안보센터). 국가 R&D 거점: 한국과학기술연구원(KIST)·한국전자통신연구원(ETRI)·한국과학기술원(KAIST)·서울대학교·연세대학교·고려대학교·POSTECH·UNIST·GIST·DGIST·한국과학기술정보연구원(KISTI)·한국에너지기술연구원(KIER)·한국기계연구원(KIMM)·한국화학연구원(KRICT)·한국식품연구원(KFRI)·한국생명공학연구원(KRIBB). 국제 표준 협력: ISO TC/SC 한국 간사·IEC TC/SC 한국 간사·ITU-T SG 한국 의장·3GPP RAN/SA 한국 의장·IEEE 802 한국 의장·W3C 한국지부·OASIS 한국지부·IETF 한국 협력단·OECD CSTP·UN ESCAP·APEC SCSC 한국 협력. 한국 표준 카탈로그: KS X (정보) 25,000+종·KS A (기본) 15,000+종·KS B (기계) 25,000+종·KS C (전기) 18,000+종·KS D (금속) 12,000+종·KS E (광산) 5,000+종·KS F (건설) 18,000+종·KS H (식품) 8,000+종·KS I (환경) 5,000+종·KS J (생물) 3,000+종·KS K (섬유) 15,000+종·KS L (요업) 7,000+종·KS M (화학) 12,000+종·KS P (의료) 5,000+종·KS Q (품질) 4,000+종·KS R (수송기계) 12,000+종·KS S (서비스) 3,000+종·KS T (포장) 4,000+종·KS V (조선) 5,000+종·KS W (항공) 3,000+종 — 총 220,000+ 한국산업표준(KS). 「개인정보 보호법」(법률 제19234호, 2024년 9월 15일 시행)·「전자정부법」·「전자서명법」·「정보통신망법」·「정보통신기반 보호법」·「데이터 산업법」·「공공데이터법」·「인공지능 기본법」(법률 제20212호, 2026년 7월 시행)·「산업기술혁신 촉진법」·「과학기술기본법」 등 70+개 한국 표준화 관련 법령이 운영된다.