PyTorch, TensorFlow 및 그 너머
弘益人間 · 널리 인간을 이롭게 하라
현대 AI 개발에는 여러 프레임워크가 관여합니다. 연구자는 실험을 위해 PyTorch를 사용할 수 있지만 프로덕션 시스템은 TensorFlow Serving을 실행합니다. 크로스 프레임워크 변환은 원활한 모델 전송을 가능하게 하여 팀이 ML 라이프사이클의 각 단계에 가장 적합한 도구를 활용할 수 있게 합니다.
ONNX는 대부분의 변환을 위한 중앙 허브 역할을 합니다:
변환 그래프:
PyTorch ←→ ONNX ←→ TensorFlow
↓ ↓ ↓
TorchScript ↓ SavedModel
↓ ↓ ↓
Mobile TFLite TF.js
↓ ↓ ↓
└──────→ CoreML ←──┘
ONNX → TensorRT (NVIDIA)
ONNX → OpenVINO (Intel)
ONNX → ONNX.js (웹)
import torch
import torch.onnx
# PyTorch 모델
class ResNetBlock(torch.nn.Module):
def __init__(self, channels):
super().__init__()
self.conv1 = torch.nn.Conv2d(channels, channels, 3, padding=1)
self.bn1 = torch.nn.BatchNorm2d(channels)
self.conv2 = torch.nn.Conv2d(channels, channels, 3, padding=1)
self.bn2 = torch.nn.BatchNorm2d(channels)
def forward(self, x):
residual = x
out = torch.nn.functional.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
return torch.nn.functional.relu(out + residual)
model = ResNetBlock(64)
dummy_input = torch.randn(1, 64, 56, 56)
# ONNX로 내보내기
torch.onnx.export(
model,
dummy_input,
"resnet_block.onnx",
export_params=True, # 파라미터 내보내기
opset_version=17, # ONNX opset 버전
do_constant_folding=True, # 상수 폴딩 최적화
input_names=['input'], # 입력 이름
output_names=['output'], # 출력 이름
dynamic_axes={ # 동적 축
'input': {0: 'batch'},
'output': {0: 'batch'}
}
)
import onnx
from onnx_tf.backend import prepare
# ONNX 모델 로드
onnx_model = onnx.load("resnet_block.onnx")
# TensorFlow로 변환
tf_rep = prepare(onnx_model)
# SavedModel로 내보내기
tf_rep.export_graph("resnet_block_tf")
# 또는 Python에서 직접 사용
import numpy as np
output = tf_rep.run(np.random.randn(1, 64, 56, 56).astype(np.float32))
print(output)
import tensorflow as tf
import tf2onnx
# TensorFlow 모델 생성
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(64, 3, padding='same', input_shape=(224, 224, 3)),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.ReLU(),
tf.keras.layers.GlobalAveragePooling2D(),
tf.keras.layers.Dense(1000)
])
# ONNX로 변환
spec = (tf.TensorSpec((None, 224, 224, 3), tf.float32, name="input"),)
model_proto, _ = tf2onnx.convert.from_keras(
model,
input_signature=spec,
opset=17,
output_path="tf_model.onnx"
)
import onnx
import torch
from onnx2pytorch import ConvertModel
# ONNX 모델 로드
onnx_model = onnx.load("tf_model.onnx")
# PyTorch로 변환
pytorch_model = ConvertModel(onnx_model)
# 모델 사용
test_input = torch.randn(1, 3, 224, 224)
output = pytorch_model(test_input)
print(f"출력 형상: {output.shape}")
모든 연산이 프레임워크 간에 직접적인 대응 관계를 갖는 것은 아닙니다:
| PyTorch | ONNX | TensorFlow | 참고사항 |
|---|---|---|---|
| F.interpolate | Resize | tf.image.resize | 정렬 방식 차이 |
| torch.einsum | Einsum | tf.einsum | Opset 12+ |
| torch.nn.GELU | Gelu | tf.nn.gelu | 근사 방법 차이 |
import torch
import math
# 변환 전: 지원되지 않는 연산 교체
class ModelWithCompatibleOps(torch.nn.Module):
def forward(self, x):
# 대신: x = torch.special.erf(x)
# 지원되는 연산 사용:
x = 0.5 * (1.0 + torch.erf(x / math.sqrt(2.0))) # GELU 근사
return x
# 또는 사용자 정의 ONNX 연산자 사용
@torch.onnx.symbolic_helper.parse_args('v', 'f')
def custom_op(g, input, scale):
return g.op("CustomNamespace::CustomOp", input, scale_f=scale)
PyTorch는 NCHW(배치, 채널, 높이, 너비)를 사용하는 반면 TensorFlow는 NHWC를 선호합니다:
import torch
import numpy as np
# PyTorch: NCHW
pytorch_tensor = torch.randn(1, 3, 224, 224)
# TensorFlow로 변환: NHWC
tf_tensor = pytorch_tensor.permute(0, 2, 3, 1) # [1, 224, 224, 3]
# TensorFlow 처리 후 다시 변환
pytorch_result = tf_output.permute(0, 3, 1, 2) # [1, 3, H, W]
# ONNX에서 자동 변환
torch.onnx.export(
model,
dummy_input,
"model.onnx",
input_names=['input'],
output_names=['output']
)
# ONNX가 자동으로 레이아웃 변환 처리
변환된 모델의 수치 정확도를 보장하기 위해 항상 검증하세요:
import torch
import numpy as np
import onnxruntime as ort
class ModelValidator:
"""모델 변환 검증 도구"""
def __init__(self, original_model, onnx_path):
self.pt_model = original_model
self.ort_session = ort.InferenceSession(onnx_path)
def validate(self, test_inputs, tolerance=1e-5):
results = []
for i, test_input in enumerate(test_inputs):
# PyTorch 추론
self.pt_model.eval()
with torch.no_grad():
pt_output = self.pt_model(test_input).numpy()
# ONNX 추론
ort_input = {
self.ort_session.get_inputs()[0].name: test_input.numpy()
}
ort_output = self.ort_session.run(None, ort_input)[0]
# 비교
diff = np.abs(pt_output - ort_output)
max_diff = diff.max()
mean_diff = diff.mean()
passed = max_diff < tolerance
results.append({
'test_id': i,
'passed': passed,
'max_diff': max_diff,
'mean_diff': mean_diff
})
print(f"테스트 {i}: {'✓ 통과' if passed else '✗ 실패'}")
print(f" 최대 차이: {max_diff:.2e}, 평균 차이: {mean_diff:.2e}")
return results
# 사용 예
validator = ModelValidator(pytorch_model, "model.onnx")
test_data = [torch.randn(1, 3, 224, 224) for _ in range(10)]
results = validator.validate(test_data)
import tensorflow as tf
# SavedModel에서
converter = tf.lite.TFLiteConverter.from_saved_model('model_tf')
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
with open('model.tflite', 'wb') as f:
f.write(tflite_model)
# ONNX에서 (TensorFlow 경유)
# 1. ONNX → TensorFlow
# 2. TensorFlow → TFLite (위와 같음)
import coremltools as ct
# ONNX에서
from onnx_coreml import convert
# 변환
coreml_model = convert(
model='model.onnx',
minimum_ios_deployment_target='13',
preprocessing_args={
'image_scale': 1.0/255.0,
'red_bias': -0.485/0.229,
'green_bias': -0.456/0.224,
'blue_bias': -0.406/0.225
}
)
# 저장
coreml_model.save('model.mlmodel')
# PyTorch에서 (ONNX 경유)
# 1. PyTorch → ONNX
# 2. ONNX → CoreML (위와 같음)
from pathlib import Path
import torch
import onnx
import tensorflow as tf
class ModelConverter:
"""다중 형식 모델 변환기"""
def __init__(self, output_dir="converted_models"):
self.output_dir = Path(output_dir)
self.output_dir.mkdir(exist_ok=True)
def pytorch_to_all(self, model, dummy_input, name="model"):
"""PyTorch 모델을 여러 형식으로 변환"""
results = {}
# PyTorch → ONNX
onnx_path = self.output_dir / f"{name}.onnx"
torch.onnx.export(model, dummy_input, onnx_path, opset_version=17)
results['onnx'] = onnx_path
# ONNX → TensorFlow
try:
from onnx_tf.backend import prepare
onnx_model = onnx.load(str(onnx_path))
tf_path = self.output_dir / f"{name}_tf"
tf_rep = prepare(onnx_model)
tf_rep.export_graph(str(tf_path))
results['tensorflow'] = tf_path
except Exception as e:
print(f"TensorFlow 변환 실패: {e}")
# ONNX → TFLite
try:
converter = tf.lite.TFLiteConverter.from_saved_model(str(tf_path))
tflite_model = converter.convert()
tflite_path = self.output_dir / f"{name}.tflite"
with open(tflite_path, 'wb') as f:
f.write(tflite_model)
results['tflite'] = tflite_path
except Exception as e:
print(f"TFLite 변환 실패: {e}")
return results
# 사용 예
converter = ModelConverter()
results = converter.pytorch_to_all(
pytorch_model,
torch.randn(1, 3, 224, 224),
name="resnet50"
)
print(f"변환된 형식: {list(results.keys())}")
한국 통신 인프라 — 과기정통부(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+개 한국 표준화 관련 법령이 운영된다.