모델 계보, 재현성 및 거버넌스
弘益人間 · 널리 인간을 이롭게 하라
메타데이터는 모델에 대한 데이터입니다 - 모델이 어떻게 생성되었는지, 무엇을 하는지, 어떻게 사용하는지를 설명하는 정보입니다. 적절한 메타데이터는 재현성을 가능하게 하고, 협업을 촉진하며, 규정 준수를 보장하고, 프로덕션 환경에서 모델 거버넌스를 지원합니다.
신경망 모델을 위한 잘 구조화된 메타데이터 스키마:
{
"model_info": {
"name": "ResNet50-ImageNet",
"version": "2.1.0",
"description": "ImageNet-1K 데이터셋으로 훈련된 ResNet-50",
"task": "image_classification",
"domain": "computer_vision",
"license": "Apache-2.0",
"created_date": "2025-01-15T10:30:00Z",
"modified_date": "2025-01-20T14:22:00Z"
},
"authors": [
{
"name": "AI 연구팀",
"email": "research@company.com",
"organization": "회사 AI 연구소"
}
],
"training": {
"framework": "pytorch",
"framework_version": "2.1.0",
"dataset": {
"name": "ImageNet-1K",
"version": "2012",
"num_samples": 1281167,
"num_classes": 1000,
"split": "train",
"preprocessing": "resize_224_normalize"
},
"hyperparameters": {
"batch_size": 256,
"learning_rate": 0.1,
"optimizer": "SGD",
"momentum": 0.9,
"weight_decay": 0.0001,
"epochs": 90,
"lr_schedule": "step_decay",
"augmentation": ["random_crop", "horizontal_flip"]
},
"hardware": {
"gpus": "8x NVIDIA V100",
"training_time_hours": 48
}
},
"performance": {
"metrics": {
"top1_accuracy": 0.761,
"top5_accuracy": 0.931,
"loss": 0.932
},
"evaluation_dataset": "ImageNet-1K val",
"inference_latency_ms": {
"batch_1_cpu": 45.2,
"batch_1_gpu": 3.8,
"batch_32_gpu": 28.5
}
},
"deployment": {
"target_platforms": ["cloud", "edge", "mobile"],
"min_memory_mb": 256,
"recommended_hardware": "GPU with 4GB+ VRAM",
"serving_framework": ["torchserve", "tensorflow_serving", "onnx_runtime"]
}
}
모델 버전에 시맨틱 버저닝(SemVer)을 사용하세요:
MAJOR.MINOR.PATCH
예시:
1.0.0 → 초기 릴리스
1.1.0 → 새로운 기능 (데이터 증강 추가)
1.1.1 → 버그 수정 (전처리 수정)
2.0.0 → 호환성 없는 변경 (다른 입력 형식)
규칙:
MAJOR: 호환되지 않는 API/아키텍처 변경
MINOR: 하위 호환되는 기능 추가
PATCH: 하위 호환되는 버그 수정
import json
from pathlib import Path
from datetime import datetime
class ModelVersion:
"""모델 버전 관리 클래스"""
def __init__(self, major, minor, patch):
self.major = major
self.minor = minor
self.patch = patch
def __str__(self):
return f"{self.major}.{self.minor}.{self.patch}"
def bump_major(self):
return ModelVersion(self.major + 1, 0, 0)
def bump_minor(self):
return ModelVersion(self.major, self.minor + 1, 0)
def bump_patch(self):
return ModelVersion(self.major, self.minor, self.patch + 1)
class ModelRegistry:
"""모델 레지스트리"""
def __init__(self, registry_path="models/registry.json"):
self.registry_path = Path(registry_path)
self.load()
def load(self):
if self.registry_path.exists():
with open(self.registry_path) as f:
self.data = json.load(f)
else:
self.data = {"models": {}}
def save(self):
self.registry_path.parent.mkdir(parents=True, exist_ok=True)
with open(self.registry_path, 'w') as f:
json.dump(self.data, f, indent=2, ensure_ascii=False)
def register_model(self, name, version, metadata):
"""모델 등록"""
if name not in self.data["models"]:
self.data["models"][name] = {"versions": {}}
version_str = str(version)
self.data["models"][name]["versions"][version_str] = {
**metadata,
"registered_at": datetime.utcnow().isoformat()
}
self.save()
def get_latest_version(self, name):
"""최신 버전 가져오기"""
if name not in self.data["models"]:
return None
versions = self.data["models"][name]["versions"].keys()
latest = max(versions, key=lambda v: tuple(map(int, v.split('.'))))
return latest
# 사용 예
registry = ModelRegistry()
version = ModelVersion(1, 0, 0)
metadata = {
"description": "초기 ResNet50 모델",
"accuracy": 0.761,
"model_path": "models/resnet50_v1.0.0.pth"
}
registry.register_model("ResNet50", version, metadata)
print(f"최신 버전: {registry.get_latest_version('ResNet50')}")
모델 카드는 Google의 모델 카드 프레임워크를 따르는 표준화된 문서를 제공합니다:
# 모델 카드: ResNet50-ImageNet
## 모델 세부사항
- **개발자:** 회사 AI 연구소
- **모델 날짜:** 2025년 1월
- **모델 버전:** 2.1.0
- **모델 유형:** 합성곱 신경망 (CNN)
- **라이선스:** Apache 2.0
## 의도된 사용
- **주요 사용 목적:** 1000개 ImageNet 클래스의 이미지 분류
- **주요 사용자:** 연구자, 개발자, 기업
- **범위 외 사용:** 의료 진단, 감시, 해악
## 훈련 데이터
- 데이터셋: ImageNet-1K (ILSVRC 2012)
- 128만 훈련 이미지, 1000개 클래스
- 데이터 증강: 랜덤 크롭, 수평 뒤집기, 색상 지터
## 평가 데이터
- ImageNet-1K 검증 세트 (5만 이미지)
- 훈련과 동일한 전처리
## 성능
| 메트릭 | 값 |
|--------|-------|
| Top-1 정확도 | 76.1% |
| Top-5 정확도 | 93.1% |
| 추론 (GPU) | 3.8ms |
## 한계
- ImageNet 클래스로만 훈련됨
- 분포 외 이미지에서 성능 저하
- ImageNet 데이터셋의 편향 포함 가능
## 윤리적 고려사항
- ImageNet으로 훈련된 모델은 클래스 불균형 존재
- 얼굴 인식이나 감시에 사용 금지
- 편향 평가 완료 (규정 준수 문서 참조)
## 주의사항 및 권장사항
- 최상의 결과를 위해 도메인별 데이터로 미세 조정
- 프로덕션에서 분포 이동 모니터링
- 정기적 재훈련 권장 (분기별)
import hashlib
import json
from dataclasses import dataclass, asdict
from typing import List, Optional
@dataclass
class ModelLineage:
"""모델 계보 정보"""
model_id: str
version: str
parent_model_id: Optional[str]
parent_version: Optional[str]
training_data_hash: str
code_commit_hash: str
created_at: str
created_by: str
modifications: List[str]
def compute_fingerprint(self):
"""이 모델 버전의 고유 지문 계산"""
data = f"{self.model_id}{self.version}{self.training_data_hash}"
return hashlib.sha256(data.encode()).hexdigest()
class LineageTracker:
"""계보 추적 시스템"""
def __init__(self, storage_path="lineage.json"):
self.storage_path = storage_path
self.lineage_db = {}
self.load()
def load(self):
try:
with open(self.storage_path) as f:
data = json.load(f)
self.lineage_db = {
k: ModelLineage(**v) for k, v in data.items()
}
except FileNotFoundError:
pass
def save(self):
with open(self.storage_path, 'w') as f:
data = {k: asdict(v) for k, v in self.lineage_db.items()}
json.dump(data, f, indent=2, ensure_ascii=False)
def record(self, lineage: ModelLineage):
"""계보 기록"""
key = f"{lineage.model_id}:{lineage.version}"
self.lineage_db[key] = lineage
self.save()
def get_ancestry(self, model_id: str, version: str):
"""전체 조상 체인 가져오기"""
ancestry = []
current_id, current_version = model_id, version
while current_id:
key = f"{current_id}:{current_version}"
if key not in self.lineage_db:
break
lineage = self.lineage_db[key]
ancestry.append(lineage)
current_id = lineage.parent_model_id
current_version = lineage.parent_version
return ancestry
# 사용 예
tracker = LineageTracker()
# 초기 모델 기록
initial = ModelLineage(
model_id="resnet50",
version="1.0.0",
parent_model_id=None,
parent_version=None,
training_data_hash="a1b2c3...",
code_commit_hash="xyz789",
created_at="2025-01-15T10:00:00Z",
created_by="researcher@company.com",
modifications=["ImageNet에서 초기 훈련"]
)
tracker.record(initial)
# 미세 조정된 버전 기록
finetuned = ModelLineage(
model_id="resnet50",
version="1.1.0",
parent_model_id="resnet50",
parent_version="1.0.0",
training_data_hash="d4e5f6...",
code_commit_hash="abc123",
created_at="2025-01-20T14:00:00Z",
created_by="engineer@company.com",
modifications=["도메인별 데이터로 미세 조정", "데이터 증강 추가"]
)
tracker.record(finetuned)
# 조상 가져오기
ancestry = tracker.get_ancestry("resnet50", "1.1.0")
for i, lineage in enumerate(ancestry):
print(f"세대 {i}: {lineage.version} by {lineage.created_by}")
import mlflow
import mlflow.pytorch
# 실험 시작
mlflow.set_experiment("resnet50-imagenet")
with mlflow.start_run(run_name="v2.1.0"):
# 파라미터 로깅
mlflow.log_param("batch_size", 256)
mlflow.log_param("learning_rate", 0.1)
mlflow.log_param("optimizer", "SGD")
# 훈련 루프
for epoch in range(num_epochs):
train_loss = train_one_epoch()
val_acc = validate()
# 메트릭 로깅
mlflow.log_metric("train_loss", train_loss, step=epoch)
mlflow.log_metric("val_accuracy", val_acc, step=epoch)
# 모델 로깅
mlflow.pytorch.log_model(
model,
"model",
registered_model_name="ResNet50"
)
# 아티팩트 로깅
mlflow.log_artifact("config.yaml")
mlflow.log_artifact("training_log.txt")
# 태그 설정
mlflow.set_tag("version", "2.1.0")
mlflow.set_tag("task", "image_classification")
mlflow.set_tag("status", "production")
import torch
# 메타데이터와 함께 모델 저장
torch.save({
'model_state_dict': model.state_dict(),
'optimizer_state_dict': optimizer.state_dict(),
'epoch': epoch,
'metadata': {
'version': '2.1.0',
'accuracy': 0.761,
'training_data': 'ImageNet-1K',
'created_at': '2025-01-15',
'framework_version': torch.__version__
}
}, 'model_with_metadata.pth')
# 로드 및 메타데이터 액세스
checkpoint = torch.load('model_with_metadata.pth')
print(f"모델 버전: {checkpoint['metadata']['version']}")
print(f"정확도: {checkpoint['metadata']['accuracy']}")
import onnx
from onnx import helper
# 모델 로드
model = onnx.load("model.onnx")
# 메타데이터 추가 (doc_string 사용)
model.doc_string = """
모델: ResNet50
버전: 2.1.0
정확도: 76.1%
데이터셋: ImageNet-1K
생성일: 2025-01-15
"""
# 저장
onnx.save(model, "model_with_metadata.onnx")
import hashlib
from pathlib import Path
class DataVersioning:
"""데이터셋 버전 관리"""
@staticmethod
def hash_dataset(dataset_path):
"""전체 데이터셋 해시 계산"""
hasher = hashlib.sha256()
for file_path in sorted(Path(dataset_path).rglob('*')):
if file_path.is_file():
with open(file_path, 'rb') as f:
while chunk := f.read(8192):
hasher.update(chunk)
return hasher.hexdigest()
@staticmethod
def hash_file_list(file_list):
"""파일 목록 해시 계산 (대용량 데이터셋용)"""
hasher = hashlib.sha256()
for path in sorted(file_list):
hasher.update(str(path).encode())
return hasher.hexdigest()
# 모델과 함께 데이터 버전 추적
data_hash = DataVersioning.hash_dataset("./data/imagenet")
model_metadata = {
"model_version": "2.1.0",
"data_version": data_hash,
"data_source": "ImageNet-1K",
"data_download_date": "2025-01-10"
}
class ModelGovernance:
"""엔터프라이즈 모델 거버넌스 프레임워크"""
def __init__(self):
self.approval_workflow = [
"technical_review",
"security_review",
"bias_assessment",
"privacy_review",
"legal_approval"
]
def submit_for_approval(self, model_id, version):
"""승인 제출"""
approval_record = {
"model_id": model_id,
"version": version,
"submitted_at": datetime.utcnow().isoformat(),
"status": "pending",
"reviews": {}
}
for review_type in self.approval_workflow:
approval_record["reviews"][review_type] = {
"status": "pending",
"reviewer": None,
"comments": None,
"approved_at": None
}
return approval_record
def complete_review(self, approval_record, review_type,
approved, reviewer, comments):
"""검토 완료"""
approval_record["reviews"][review_type] = {
"status": "approved" if approved else "rejected",
"reviewer": reviewer,
"comments": comments,
"approved_at": datetime.utcnow().isoformat()
}
# 전체 상태 업데이트
all_approved = all(
review["status"] == "approved"
for review in approval_record["reviews"].values()
)
if all_approved:
approval_record["status"] = "approved"
elif any(review["status"] == "rejected"
for review in approval_record["reviews"].values()):
approval_record["status"] = "rejected"
return approval_record
한국 통신 인프라 — 과기정통부(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+개 한국 표준화 관련 법령이 운영된다.