이 모듈의 도달 목표

모델을 저장하고 같은 결과 재현하기

매개변수와 학습 설정·seed·버전을 JSON 체크포인트로 저장하고 다시 불러온 예측과 파일 무결성을 검증합니다.

결과물 · 재현 가능한 모델 체크포인트 검사기
약 5~7시간
  • 모델 state와 체크포인트에 포함할 정보를 구분한다
  • JSON으로 매개변수와 학습 설정을 안전하게 저장·복원한다
  • seed와 버전 정보가 재현성에 필요한 이유를 설명한다
  • 불러온 모델의 예측 일치와 체크섬을 검사한다
01

state는 학습된 숫자를 이름과 함께 보존한다

모델을 다시 쓰려면 weight와 bias 같은 매개변수를 어떤 값이 어떤 역할인지 알 수 있는 이름과 함께 저장해야 합니다. state_dict는 이 학습 상태를 딕셔너리로 표현해 파일 형식과 모델 코드 사이의 경계를 만듭니다.

일상에서 보면부품을 상자에 넣을 때 이름표 없이 숫자만 적지 않고 weight와 bias 라벨을 붙이는 것과 같습니다.
state = {'weight': 2.0, 'bias': 0.5}
print(state['weight'], state['bias'])
실행 결과
2.0 0.5
한 줄씩 보기
  1. 매개변수를 이름 있는 키로 묶습니다.
  2. 이름으로 정확한 값을 다시 꺼냅니다.
  3. 저장 순서가 달라도 역할을 구분할 수 있습니다.
직접 값 바꾸기hidden_weight 키를 추가해 더 큰 모델의 state를 표현해 보세요.
흔한 실수값 목록만 저장하면 모델 구조가 바뀌거나 순서를 잊었을 때 어떤 매개변수인지 알기 어렵습니다.

짧은 확인매개변수를 이름 있는 딕셔너리로 저장하는 장점은 무엇일까요?

02

체크포인트는 state보다 더 넓은 실행 기록이다

체크포인트에는 매개변수뿐 아니라 모델 이름과 버전, 학습률, epoch 수, seed, 평가 지표를 함께 넣습니다. 그래야 같은 숫자가 어떤 조건에서 만들어졌고 어느 코드 구조로 읽어야 하는지 판단할 수 있습니다.

일상에서 보면완성 요리만 냉동하는 대신 레시피 버전, 재료 양, 조리 시간과 맛 평가를 함께 붙이는 것과 같습니다.
checkpoint = {'version': 1, 'parameters': {'weight': 2.0}, 'training': {'epochs': 5, 'seed': 42}}
print(checkpoint['training'])
실행 결과
{'epochs': 5, 'seed': 42}
한 줄씩 보기
  1. 파일 형식 버전을 기록합니다.
  2. 학습된 매개변수를 넣습니다.
  3. 학습 조건과 seed를 함께 넣습니다.
직접 값 바꾸기평가 MAE를 evaluation 키 아래 추가하세요.
흔한 실수매개변수만으로는 데이터 순서와 학습 설정을 재현할 수 없습니다.

짧은 확인체크포인트가 state_dict보다 더 포함해야 하는 정보 세 가지는 무엇일까요?

03

JSON은 사람이 읽을 수 있지만 자료형을 확인해야 한다

JSON은 딕셔너리·목록·숫자·문자열을 파일로 저장하기 쉬운 형식입니다. 다만 따옴표 안의 2.0은 숫자가 아니라 문자열이므로 불러온 뒤 계산 전에 자료형을 확인하고 필요하면 float로 변환해야 합니다.

일상에서 보면가격표에 적힌 '2000' 글자와 계산기에 들어 있는 숫자 2000이 눈에는 같아도 역할이 다른 것과 같습니다.
import json
data = json.loads('{"weight": "2.0"}')
print(type(data['weight']).__name__)
print(float(data['weight']) * 3)
실행 결과
str
6.0
한 줄씩 보기
  1. 문자열 값을 가진 JSON을 읽습니다.
  2. 불러온 자료형이 str인지 확인합니다.
  3. float로 변환한 뒤 숫자 계산을 합니다.
직접 값 바꾸기weight를 JSON 숫자 2.0으로 저장했을 때 자료형이 어떻게 달라지는지 확인하세요.
흔한 실수JSON에 숫자를 따옴표로 감싸 저장하면 불러와도 문자열입니다.

짧은 확인JSON에서 2.0과 "2.0"의 차이는 무엇일까요?

04

seed와 버전이 같은 실행 조건을 설명한다

무작위 분할이나 초기화가 있다면 같은 seed로 같은 순서를 만들 수 있습니다. 버전은 파일 구조가 바뀌었을 때 현재 코드가 안전하게 읽을 수 있는지 판단하게 합니다. seed는 모든 환경 차이를 없애지는 않지만 재현 조건의 핵심 일부입니다.

일상에서 보면같은 카드 섞기 규칙과 레시피 판본을 기록해야 다른 사람이 같은 순서와 절차를 따라갈 수 있는 것과 같습니다.
import numpy as np
a = np.random.default_rng(42).permutation(5)
b = np.random.default_rng(42).permutation(5)
print(np.array_equal(a, b))
실행 결과
True
한 줄씩 보기
  1. seed 42로 첫 순서를 만듭니다.
  2. 새 generator에 같은 seed를 사용합니다.
  3. 두 순서가 같은지 확인합니다.
직접 값 바꾸기두 번째 seed를 43으로 바꾸고 순서가 달라질 수 있는지 확인하세요.
흔한 실수한 generator를 연속 두 번 호출하면 같은 seed로 만들었어도 내부 상태가 진행돼 순서가 달라집니다.

짧은 확인체크포인트의 version을 저장하는 이유는 무엇일까요?

05

불러온 뒤 예측과 무결성을 반드시 검사한다

파일이 열렸다는 사실만으로 모델이 올바르게 복원됐다고 볼 수 없습니다. 같은 평가 입력으로 원본과 불러온 모델의 예측을 비교하고, 저장 전 내용으로 만든 체크섬이 다시 계산한 값과 같은지 확인하면 값 손상과 잘못된 복원을 찾을 수 있습니다.

일상에서 보면이삿짐 상자가 도착했는지만 보지 않고 물건 수와 봉인 번호, 실제 작동 여부까지 확인하는 것과 같습니다.
original = [-2.0, 2.0]
loaded = [-2.0, 2.0]
print(original == loaded)
실행 결과
True
한 줄씩 보기
  1. 저장 전 기준 예측을 보관합니다.
  2. 불러온 매개변수로 만든 예측을 준비합니다.
  3. 두 결과가 같은지 검사합니다.
직접 값 바꾸기loaded의 한 값을 바꿔 재현 검사가 False가 되는지 확인하세요.
흔한 실수매개변수 키가 모두 있다는 검사만으로 숫자 값까지 정확히 복원됐다고 단정할 수 없습니다.

짧은 확인체크포인트를 불러온 직후 수행할 두 가지 검사는 무엇일까요?

매개변수를 state로 묶기

  1. 저장할 매개변수를 선택합니다.
  2. 숫자 자료형을 유지합니다.
  3. 키 이름을 고정합니다.
  4. 복원할 때 같은 키로 접근합니다.
def state_dict(weight, bias):
    return {'weight': weight, 'bias': bias}

weight, bias = map(float, input().split())
state = state_dict(weight, bias)
print(f"키: {sorted(state.keys())}")
print(f"weight: {state['weight']:.2f}")
print(f"bias: {state['bias']:.2f}")

핵심을 확인해 볼까요?

5문항 중 4문항 이상 정답이면 완료됩니다. 오답 후에도 다시 제출할 수 있습니다.

1state_dict가 주로 담는 것은?
2재현 가능한 체크포인트에 매개변수 외에 필요한 것은?
3JSON의 "2.0"을 계산에 쓰기 전에 필요한 것은?
4같은 seed가 도움을 주는 것은?
5모델을 불러온 뒤 가장 중요한 확인은?