반응형

목차

더보기

모델 저장하고 불러오기(Save and load the model)

모델 가중치 저장하고 불러오기(Saving and Loading Model Weights)

모델의 형태를 포함하여 저장하고 불러오기(Saving and Loading Models with Shapes)

모델 추론(Model Inference)

모델을 ONNX로 내보내기(Exporting the model to ONNX)

 

keyword:

더보기

torch.save, model.state_dict(), model.load_state_dict(), torch.load(), pickle module, 직렬화(serialize), 역직렬화(deserialize), model.eval(), 드롭아웃(dropout), 배치 정규화(batch normalization), %matplotlib inline, ONNX(Open Neural Network Exchange), onnxruntime, torch.onnx, Java, JavaScript, C#, ML.NET, 실행 그래프(execution graph), ONNX 내보내기(ONNX export), Persist, model.onnx, onnx.export, onnxruntime.InferenceSession, onnxruntime.InferenceSession.get_inputs(), onnxruntime.InferenceSession.run()

 


모델 저장하고 불러오기(Save and load the model)

이번 장에서는 저장하기나 불러오기를 통해 모델의 상태를 유지(persist)하고 모델의 예측을 실행하는 방법을 알아보겠습니다.

import torch
import torchvision.models as models

 

모델 가중치 저장하고 불러오기(Saving and Loading Model Weights)

PyTorch 모델은 학습한 매개변수를 state_dict라고 불리는 내부 상태 사전(internal state dictionary)에 저장합니다. 이 상태 값들은 torch.save 메소드를 사용하여 저장(persist)할 수 있습니다.

model = models.vgg16(pretrained=True)
torch.save(model.state_dict(), 'model_weights.pth')

 

모델 가중치를 불러오기 위해서는, 먼저 동일한 모델의 인스턴스(instance)를 생성한 다음에 load_state_dict() 메소드를 사용하여 매개변수들을 불러옵니다.

model = models.vgg16() # 기본 가중치를 불러오지 않으므로 pretrained=True를 지정하지 않습니다.
model.load_state_dict(torch.load('model_weights.pth'))
model.eval()

추론(inference)을 하기 전에 model.eval() 메소드를 호출하여 드롭아웃(dropout)과 배치 정규화(batch normalization)를 평가 모드(evaluation mode)로 설정해야 합니다. 그렇지 않으면 일관성 없는 추론 결과가 생성됩니다.

 

모델의 형태를 포함하여 저장하고 불러오기(Saving and Loading Models with Shapes)

모델의 가중치를 불러올 때, 신경망의 구조를 정의하기 위해 모델 클래스를 먼저 생성(instantiate)해야 했습니다. 이 클래스의 구조를 모델과 함께 저장하고 싶으면, (model.state_dict()가 아닌) model 을 저장 함수에 전달합니다:

torch.save(model, 'model.pth')

다음과 같이 모델을 불러올 수 있습니다:

model = torch.load('model.pth')

이 접근 방식은 Python pickle 모듈을 사용하여 모델을 직렬화(serialize)하므로, 모델을 불러올 때 실제 클래스 정의(definition)를 적용(rely on)합니다.

 

keyword: torch.save, model.state_dict(), model.load_state_dict(), torch.load(), pickle module, 직렬화(serialize), 역직렬화(deserialize), model.eval(), 드롭아웃(dropout), 배치 정규화(batch normalization)

  • torch.save:
    모델의 매개변수와 옵티마이저의 상태를 포함하여 PyTorch 모델의 상태를 저장하는 데 사용되는 함수
    나중에 torch.load 기능을 사용하여 로드할 수 있는 파일에 모델을 저장
    또한 옵티마이저의 state_dict를 저장하므로 옵티마이저는 중단된 위치에서 학습을 다시 시작할 수 있음
    모델을 함께 저장할 수 있으며, 이때는 매개변수로 model을 입력하면 됨
  • model.state_dict():
    모델의 학습 가능한 모든 매개변수를 포함하는 정렬된 사전(ordered dictionary)을 반환하는 함수
    리턴 값인 정렬된 사전은 torch.save 함수를 사용하여 모델의 현재 상태를 저장하거나 model.load_state_dict() 함수를 사용하여 사전 훈련된 모델을 로드하는 데 사용할 수 있음
    키: 매개변수의 이름
    값: 해당 매개변수 값을 포함하는 텐서
  • model.load_state_dict():
    이전에 저장된 state_dict에서 모델의 상태를 로드하는 데 사용되는 함수
    state_dict를 가져와 저장된 매개변수 값을 모델의 매개변수에 매핑함
  • torch.load():
    모델의 매개변수와 옵티마이저의 상태를 포함하여 이전에 저장된 PyTorch 모델을 로드하는 함수
    파일 경로를 인수로 사용하고 model.load_state_dict()에 전달할 수 있는 사전을 반환
    모델을 함께 불러올 수 있으며, 이때는 매개변수로 모델이 함께 저장된 path를 입력하면 됨
  • pickle module:
    Python dictionary 및 list와 같은 개체를 직렬화(serialize) 및 역직렬화(deserialize)하는 데 사용됨
    PyTorch 모델을 저장하고 로드하는 데에도 사용할 수 있음
    torch.save 및 torch.load 함수보다 효율성이 떨어지므로 사용하지 않는 것이 좋음
    --
    피클 모듈을 사용하여 PyTorch 모델을 저장하고 로드하는 것은 일반적으로 권장되지 않음
    옵티마이저의 내부 상태(internal state) 및 모델의 역방향 전달 기록(backward pass history of the model)과 같이 모델을 올바르게 재구성하는 데 필요한 모든 정보를 처리하지 못할 수 있기 때문
    대신 PyTorch 모델을 처리하도록 특별히 설계되었으며 모델을 올바르게 재구성하는 데 필요한 모든 정보를 저장하고 로드할 수 있는 torch.save 및 torch.load 함수를 사용하는 것이 좋음
    --
    그러나 이전에 pickle 모듈을 사용하여 모델을 저장한 경우 pickle.load() 함수를 사용하여 객체를 역직렬화하고 모델과 해당 속성을 다시 가져올 수 있음
    그런 다음 model.load_state_dict()를 사용하여 모델의 상태 사전(state dictionary)을 로드하고 optimizer.load_state_dict()를 사용하여 옵티마이저의 상태 사전을 로드하고 옵티마이저를 모델로 설정할 수 있음
    pickle로 모델을 저장한 후 PyTorch 버전이 변경되면 로드 프로세스가 제대로 작동하지 않을 수 있다는 점 유의
  • 직렬화(serialize):
    PyTorch 모델과 같은 복잡한 개체 또는 데이터 구조를 저장하거나 전송할 수 있는 형식으로 변환하는 프로세스
    이 프로세스를 개체 "pickling" 또는 "flattening"라고도 함
    torch.save 함수는 PyTorch 모델을 직렬화하는 데 사용할 수 있음
  • 역직렬화(deserialize):
    PyTorch 모델과 같은 직렬화된 개체 또는 데이터 구조를 다시 원래 형식으로 변환하는 프로세스
    이 프로세스를 개체 "unpickling" 또는 "inflating"이라고도 힘
    torch.load 함수는 PyTorch 모델을 역직렬화하는 데 사용할 수 있음
  • model.eval():
    모델을 평가 모드로 설정하는 메서드
    테스트 데이터에 대한 모델의 성능을 평가할 때 사용됨
    평가 모드는 드롭아웃 및 배치 정규화와 같은 특정 기능을 해제하는 데 사용됨
  • 드롭아웃(dropout):
    훈련 중에 입력 단위의 일부를 무작위로 0으로 설정하는 정규화 기술
    모델의 복잡성을 줄이고 활성화에 약간의 노이즈를 도입하여 과적합을 방지하는 데 도움을 줌
    일반적으로 학습 중에만 사용되며 평가 또는 추론 중에는 사용되지 않음
  • 배치 정규화(batch normalization):
    평균을 빼고 표준 편차로 나누어 계층의 활성화(activations of layer)를 정규화하는 기술
    내부 공변량 변화(internal covariate shift)를 줄여 훈련 과정을 안정화하는 데 도움을 줌
    일반적으로 훈련 중에만 사용되며 평가 또는 추론 중에는 사용되지 않음

모델 추론(Model Inference)

  • 모델 최적화: 어려운 작업, 다양한 프레임워크 및 하드웨어에서 성능을 최대화하는 데 시간이 많이 소요됨
  • ONNX(Open Neural Network Exchange) 런타임: 모든 하드웨어, 클라우드 또는 에지 장치에서 한 번 훈련하고 추론을 가속화하는 솔루션
  • ONNX: 신경망 및 기타 기계 학습 모델을 공유하기 위해 여러 공급업체에서 지원하는 공통 형식
  • ONNX 이점: Java, JavaScript, C# 및 ML.NET과 같은 다른 프로그래밍 언어 및 프레임워크에서 모델로 추론 가능

 

다른 예제 코드

%matplotlib inline
import torch
import onnxruntime
from torch import nn
import torch.onnx as onnx
import torchvision.models as models
from torchvision import datasets
from torchvision.transforms import ToTensor

class NeuralNetwork(nn.Module):
    def __init__(self):
        super(NeuralNetwork, self).__init__()
        self.flatten = nn.Flatten()
        self.linear_relu_stack = nn.Sequential(
            nn.Linear(28*28, 512),
            nn.ReLU(),
            nn.Linear(512, 512),
            nn.ReLU(),
            nn.Linear(512, 10),
            nn.ReLU()
        )

    def forward(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits


model = NeuralNetwork()
model.load_state_dict(torch.load('data/model.pth'))
model.eval()
 
keyword: %matplotlib inline, Open Neural Network Exchange (ONNX), onnxruntime, torch.onnx, Java, JavaScript, C#, ML.NET
  • %matplotlib inline:
    Jupyter 노트북에서 matplotlib 라이브러리로 생성된 플롯을 별도의 창이 아닌 노트북 내에서 표시하는 데 사용되는 명령
    일반적으로 시간 경과에 따른 손실 또는 정확도와 같은 모델의 성능을 시각화하는 데 사용됨
  • ONNX(Open Neural Network Exchange):
    딥 러닝 모델을 나타내는 개방형 형식
    PyTorch 및 TensorFlow와 같은 서로 다른 프레임워크 간의 상호 운용성을 허용하고 모델을 내보내고 가져올 수 있음
  • onnxruntime:
    ONNX 모델을 위한 고성능 추론 엔진
    다양한 플랫폼과 하드웨어를 지원하며 모델의 추론 프로세스를 가속화하는 데 사용할 수 있음
  • torch.onnx:
    모델을 ONNX 형식으로 내보낼 수 있는 PyTorch 패키지
    PyTorch 모델을 ONNX로 변환하기 위한 간단한 API를 제공
    모델을 ONNX를 지원하는 다른 프레임워크 또는 플랫폼으로 쉽게 내보낼 수 있음
  • Java:
    모바일 및 웹 애플리케이션에서 엔터프라이즈 소프트웨어 및 과학 시뮬레이션에 이르기까지 광범위한 애플리케이션을 개발하는 데 널리 사용되는 널리 사용되는 프로그래밍 언어
    Weka, Deeplearning4j 및 MLlib와 같은 기계 학습에 사용할 수 있는 라이브러리 및 프레임워크의 대규모 에코시스템 존재
  • JavaScript:
    주로 웹 애플리케이션 개발에 사용되는 인기 있는 프로그래밍 언어
    TensorFlow.js, Brain.js 및 ML.js와 같은 라이브러리의 도움으로 기계 학습 애플리케이션 개발에도 사용할 수 있음
  • C#:
    주로 Windows 데스크톱 응용 프로그램, 모바일 앱 및 게임 개발에 사용되는 널리 사용되는 프로그래밍 언어
    Accord.NET, ML.NET 및 CNTK와 같은 라이브러리의 도움으로 기계 학습 응용 프로그램 개발에도 사용할 수 있음
  • ML.NET:
    .NET 개발자를 위한 오픈 소스 기계 학습 프레임워크
    기계 학습에 대한 전문 지식 없이도 C# 또는 F#을 사용하여 기계 학습 모델을 개발할 수 있음
    초보자와 전문가 모두를 위해 설계되었으며 분류, 회귀 및 이상 탐지와 같은 광범위한 기계 학습 작업을 지원
 
 

모델을 ONNX로 내보내기(Exporting the model to ONNX)

  • PyTorch: 기본 ONNX 내보내기 지원
  • PyTorch 실행 그래프의 동적 특성(Dynamic nature of PyTorch execution graph):
    내보내기 프로세스는 유지되는(persisted) ONNX 모델을 생성하기 위해 실행 그래프를 통과해야 함
  • 테스트 변수: 내보내기 루틴에 전달, 올바른 크기의 더미 제로 텐서(훈련 데이터 세트의 shape에서 얻을 수 있음)
input_image = torch.zeros((1,28,28))
onnx_model = 'data/model.onnx'
onnx.export(model, input_image, onnx_model)
  • 테스트 데이터 세트: 예측을 위해 ONNX 모델에서 추론하기 위한 샘플 데이터로 사용
  • 추론 세션: onnxruntime.InferenceSession으로 생성됨
  • 추론: 원하는 출력 목록과 입력 값 맵을 전달하여 run() 메서드를 사용하여 ONNX 모델에서 수행됨
  • 결과: 출력 목록
session = onnxruntime.InferenceSession(onnx_model, None)
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name

result = session.run([output_name], {input_name: x.numpy()})
predicted, actual = classes[result[0][0].argmax(0)], classes[y]
print(f'Predicted: "{predicted}", Actual: "{actual}"')

 

  • ONNX 모델: 다양한 플랫폼과 다양한 프로그래밍 언어에서 추론을 실행하는 데 사용할 수 있음

keyword: 실행 그래프(execution graph), ONNX 내보내기(ONNX export), Persist, model.onnx, onnx.export, onnxruntime.InferenceSession, onnxruntime.InferenceSession.get_inputs(), onnxruntime.InferenceSession.run()

  1. 실행 그래프(execution graph):
    모델이 수행하는 계산을 그래프 기반으로 표현한 것
    입력에 대해 수행되는 작업과 실행 순서를 설명함
    모델의 성능을 최적화하고 모델을 다른 프레임워크나 플랫폼으로 내보낼 수 있도록 하는 데 사용됨
  2. ONNX 내보내기(ONNX export):
    하나의 프레임워크에서 딥 러닝 모델을 표현하기 위한 개방형 형식인 ONNX 형식으로 모델을 변환하는 프로세스
    이를 통해 PyTorch 및 TensorFlow와 같은 서로 다른 프레임워크 간의 상호 운용성을 허용하고 모델을 내보내고 가져올 수 있음
    일반적으로 PyTorch의 torch.onnx 패키지를 사용하여 수행됨
  3. Persist:
    나중에 로드하여 사용할 수 있도록 모델의 상태를 파일에 저장하는 프로세스
    이를 통해 학습 후 모델을 저장하여 추론 또는 추가 학습에 사용할 수 있음
    PyTorch에서 torch.save() 및 torch.load() 함수를 사용하거나 모델에서 state_dict() 및 load_state_dict() 메서드를 사용하여 state_dict를 저장 및 로드함으로써 수행할 수 있음
  1. model.onnx:
    훈련된 모델을 ONNX 형식으로 저장하기 위한 파일 형식
    딥 러닝 모델을 표현하기 위한 개방형 형식으로, PyTorch 및 TensorFlow와 같은 서로 다른 프레임워크 간의 상호 운용성을 허용
  2. onnx.export:
    PyTorch의 torch.onnx 패키지에서 제공하는 함수
    PyTorch 모델을 ONNX 형식으로 내보낼 수 있음
     모델, 예제 입력 텐서 및 파일 경로를 인수로 사용
    모델을 지정된 파일 경로로 내보냄
    제공한 코드 스니펫에서 모델은 'data/model.onnx' 파일로 내보내지며 입력 텐서는 모양이 (1, 28, 28)이고 0으로 채워져 있ㅇ,ㅁ
  1. onnxruntime.InferenceSession:
    ONNX 모델 실행을 위한 세션을 나타내는 ONNX 런타임 라이브러리의 클래스
    ONNX 모델을 로드하고, 추론을 위해 준비하고, 모델에서 추론을 실행하는 데 사용됨
    ONNX 모델 파일의 경로를 가져와서 모델에서 추론을 실행하는 데 사용할 수 있는 세션 개체를 만듬
  2. onnxruntime.InferenceSession.get_inputs():
    모델의 입력 텐서 목록을 반환하는 onnxruntime.InferenceSession 클래스의 메서드
    모델의 입력 텐서를 가져오고 올바른 형식으로 입력 데이터를 준비하는 데 사용됨
  3. onnxruntime.InferenceSession.run():
    모델에서 추론을 실행하는 onnxruntime.InferenceSession 클래스의 메서드
    입력 및 출력 텐서의 이름과 입력 데이터를 받아 출력 데이터를 반환
    주어진 입력 데이터로 모델에 대한 추론을 수행하는 데 사용됨
    모델에서 생성된 출력 데이터를 반환
반응형

+ Recent posts