안녕하세요.
LibTorch 를 이용해 비쥬얼 스튜디오 2019에서
Mfc의 cpp 환경에서 파이썬에서 훈련한 pth 파일을 이용해
추론을 하려고합니다.
환경 설정 및 간단한 랜덤 텐서 출력은 마친 상태입니다.
여기서 문제는 추론할 모댈에대해 입력 이미지의 사이즈나
출력할 클래스의 개수 및 이름 등의 메타데이터를 c++에서는
어떻게 더룰지 입니다.
파이썬의 경우 딕트형태로 저장하고 불러오는게 쉽지만
C++은 어떻게 쓰시고 계신지요.
Onnx의경우에도 메타데이터가 읽고 쓸 수 있었지만
메모리 문제로(1.12.1) 다른 방법을 알아보고 있는 중입니다.
아래 답변은 OpenAI의 GPT-4-Turbo 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다.
안녕하세요, 김재현님.
문의하신 내용을 정리해보면, LibTorch를 사용하여 C++ 환경에서 Python에서 훈련된 .pth 파일을 불러와 추론을 진행하고자 하시며, 특히 모델에 필요한 메타데이터(예: 입력 이미지의 사이즈, 클래스 개수 및 이름 등)를 C++에서 어떻게 다루는지에 대한 질문이신 것 같습니다.
PyTorch에서는 모델의 state_dict와 함께 메타데이터를 저장하고 불러오는 것이 가능합니다. Python에서는 이를 위해 torch.save 함수를 사용하여 딕셔너리 형태로 저장할 수 있으며, C++에서는 LibTorch의 직렬화 기능을 사용하여 이를 불러올 수 있습니다.
아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다.
안녕하세요, KimjaeHyun님.
문제 상황에 대해 정리해보겠습니다. LibTorch를 사용하여 Visual Studio 2019에서 MFC 기반의 C++ 환경에서 Python에서 훈련한 .pth 파일을 이용한 추론을 진행하고 계시며, 기본적인 환경 설정과 텐서 출력까지는 성공적으로 마치셨습니다. 그러나 C++ 환경에서 모델에 필요한 메타데이터(예: 입력 이미지의 사이즈, 출력 클래스의 개수 및 이름 등)를 어떻게 포함하고 불러올 수 있는지에 대한 질문을 주셨습니다.
C++에서 메타데이터를 다루는 방법은 여러 가지가 있을 수 있으나, 일반적으로는 파일 시스템을 이용하거나, 모델 파일 자체에 메타데이터를 포함시키는 방법을 사용할 수 있습니다. PyTorch의 torch::jit::script::Module을 사용하여 모델을 불러올 때, 추가적인 정보를 JSON 파일이나 별도의 설정 파일로 관리하거나, 모델 파일 내에 직접 저장하는 방법을 고려할 수 있습니다.
다음은 C++에서 JSON 파일을 이용하여 메타데이터를 불러오는 예시 코드입니다. 이를 위해 nlohmann/json 라이브러리를 사용할 수 있습니다.
nlohmann/json 라이브러리는 JSON 데이터를 쉽게 다룰 수 있게 해주는 C++ 라이브러리입니다. 이 라이브러리를 사용하려면 프로젝트에 포함시켜야 합니다. 라이브러리에 대한 자세한 정보는 다음 링크에서 확인하실 수 있습니다: GitHub - nlohmann/json: JSON for Modern C++
아래 답변은 Anthropic의 Claude-2 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다.
안녕하세요 KimjaeHyun 님,
LibTorch에서 pth 파일에 메타데이터를 포함하는 문제에 대해 질문해 주셔서 대단히 감사합니다.
제가 문제를 정확히 이해했다면, KimjaeHyun님은 Python에서 학습한 모델을 LibTorch와 C++을 사용하여 추론하려고 하시는데, 문제는 pth 파일에 입력 이미지 크기, 출력 클래스 수 및 이름과 같은 메타데이터를 어떻게 처리할 지 모르겠다는 것이 맞습니까?
Python에서는 딕셔너리와 같은 데이터 구조에 이 메타데이터를 저장하고 로드하기 쉽지만, C++에서는 어떻게 해야 할지 잘 모르겠다고 하셨습니다.
이 문제를 해결하기 위한 한 가지 방법은 pth 파일과 별도로 json 파일을 만들어 메타데이터를 저장하는 것입니다. 예를 들어 다음과 같은 json 파일을 만들 수 있습니다:
다른 한 가지 방법은 클래스의 serializing/deserializing 매커니즘을 사용하는 것입니다. 즉, 메타데이터를 포함하는 사용자 정의 C++ 클래스를 만들고 여기에 필요한 정보를 저장합니다. 그런 다음 이 클래스의 인스턴스를 serializing하여 pth 파일에 저장할 수 있습니다. deserializing 시에 이 데이터에 다시 접근할 수 있습니다.
아래는 간단한 사용자 정의 Serialization 클래스의 예시 코드입니다:
class ModelMetadata {
public:
int input_size[2];
int num_classes;
vector<string> classes;
// serializing/deserializing 함수
template <class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & input_size;
ar & num_classes;
ar & classes;
}
};
이 중 어느 것이든 KimjaeHyun님의 상황에 맞는 좋은 해결책이 될 수 있다고 생각합니다.
추가로 문의 사항이나 도움이 더 필요한 부분이 있으시면 언제든지 댓글 남겨주세요. 최대한 빠르게 답변 드리겠습니다.
안녕하세요
저도 오래전에 C++ 인퍼런스를 해봐서 기억이 가물가물한데요.
C++ 에서는 Pytorch jit, script 파일을 로드해서 interpreter의 forward 만 실행 가능했던걸로 기억납니다. 그래서 메타데이터가 포함되어 있어도 읽을 수가 없었던 것으로 기억합니다. 그래서 추가 정보를 별도의 파일로 같이 가지고 다녔습니다.
하지만 동일한 파일을 파이썬에서 로드를 한다면 메타데이터를 일어 오실수 있습니다. 변수가 바로 접근이 가능하기 때문이죠.