안녕하세요
python에서 Yolov8m 예제로 학습한 모델을 C++에 모델을 테스트 중 입니다.
사전 학습된 모델을 torch::jit::Load 함수에서 에러가 났습니다
(에러 : Microsoft C++ exception: c10::Error at memory location 0x0000004AA23DA1E0.)
문제가 되는 코드는 하기와 같습니다.
const string weight_path = "best.pt 의 경로";
//Use GPU
torch::Device device(torch::kCUDA);
// load the pretrained model
torch::jit::script::Module module = torch::jit::load(weight_path, device);
구성 환경은
Window 10
CUDA : 12.1
libtorch : libtorch-win-shared-with-deps-debug-2.2.0%2Bcu121
VisualStudio 2022, 언어 표준 C++ 17, MFC 구조
아래 답변은 OpenAI의 GPT-4-Turbo 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다.
안녕하세요!
문제 상황을 잘 설명해주셔서 감사합니다. PyTorch 기반의 Yolov8m 모델을 Python에서 학습시킨 후, C++ 환경에서 LibTorch를 사용하여 모델을 로드하려 할 때 torch::jit::load 함수에서 c10::Error 예외가 발생하는 문제를 겪고 계신 것으로 이해했습니다. 또한, 사용하고 계신 환경은 Windows 10, CUDA 12.1, LibTorch 2.2.0+cu121, Visual Studio 2022, C++17 표준, MFC 구조라고 말씀해주셨습니다.
먼저, c10::Error는 PyTorch의 C++ API에서 발생하는 일반적인 예외로, 다양한 원인에 의해 발생할 수 있습니다. 이러한 문제를 해결하기 위해 몇 가지 점검해볼 수 있는 사항들을 제안드리겠습니다.
모델 파일 호환성: best.pt 파일이 PyTorch의 JIT 컴파일러를 통해 생성된 TorchScript 모델인지 확인해야 합니다. Python에서 torch.jit.save를 사용하여 저장한 모델만이 C++에서 torch::jit::load로 로드될 수 있습니다.
LibTorch 버전 호환성: Python 환경에서 사용한 PyTorch 버전과 C++ 환경에서 사용하는 LibTorch 버전이 호환되는지 확인해야 합니다. 불일치하는 경우 모델 로드에 실패할 수 있습니다.
CUDA 버전 호환성: LibTorch와 CUDA 버전이 호환되는지 확인해야 합니다. CUDA 버전이 LibTorch에서 지원하는 범위 내에 있는지 확인하십시오.
예외 메시지 확인: 예외 메시지에 더 자세한 정보가 포함되어 있을 수 있습니다. Visual Studio의 디버거를 사용하여 예외가 발생한 정확한 위치와 메시지를 확인해보세요.
경로 문제: 모델 파일의 경로가 올바른지 확인해보세요. 경로에 문제가 있으면 파일을 찾을 수 없어 예외가 발생할 수 있습니다.
디버그 빌드 문제: 디버그 모드에서 LibTorch를 사용할 때 문제가 발생할 수 있습니다. 릴리즈 모드로 전환하여 테스트해보세요.
아래는 모델을 로드하는 기본적인 C++ 코드 예시입니다. 이 코드를 참고하여 문제를 해결해보시기 바랍니다.
#include <torch/script.h> // One-stop header.
#include <iostream>
#include <memory>
int main() {
// Set device to GPU if available
torch::Device device(torch::kCUDA);
// Load the model
try {
// Deserialize the ScriptModule from a file using torch::jit::load().
const std::string model_path = "path_to_your_model.pt";
torch::jit::script::Module module = torch::jit::load(model_path, device);
std::cout << "Model loaded successfully\n";
}
catch (const c10::Error& e) {
std::cerr << "Error loading the model\n";
return -1;
}
// Execute the model and turn its output into a tensor.
// ... (omitted for brevity)
return 0;
}
위 코드를 실행하기 전에 모델 경로를 올바르게 설정하고, 필요한 경우 CUDA 디바이스 인덱스를 지정해야 합니다.
추가적으로, LibTorch와 관련된 문제를 해결하기 위해 공식 PyTorch 튜토리얼을 참고하실 수 있습니다. 아래 링크에서 C++에 대한 자세한 정보를 얻을 수 있습니다.
아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다.
안녕하세요!
문제 상황을 잘 설명해주셔서 감사합니다. PyTorch 기반의 Yolov8m 모델을 Python에서 학습시킨 후, C++ 환경에서 LibTorch를 사용하여 모델을 로드하려 할 때 torch::jit::load 함수에서 c10::Error 예외가 발생하는 문제를 겪고 계신 것으로 이해했습니다. 또한, 사용하고 계신 환경은 Windows 10, CUDA 12.1, LibTorch 2.2.0 (CUDA 12.1 버전), Visual Studio 2022, C++17 표준, MFC 구조라고 말씀해주셨습니다.
이 문제를 해결하기 위해 몇 가지 점을 살펴볼 필요가 있습니다.
모델 파일 호환성: best.pt 파일이 PyTorch의 어떤 버전으로 학습되었는지 확인해야 합니다. LibTorch 버전과 학습된 모델의 PyTorch 버전이 호환되지 않을 수 있습니다. 예를 들어, PyTorch 1.8로 학습된 모델은 LibTorch 1.4에서 로드할 수 없습니다.
LibTorch 버전: LibTorch의 버전이 모델을 학습시킨 PyTorch 버전과 일치하는지 확인해야 합니다. 만약 일치하지 않는다면, 모델을 학습시킨 PyTorch 버전과 동일한 버전의 LibTorch를 사용해야 합니다.
CUDA 버전 호환성: 사용하고 있는 CUDA 버전과 LibTorch가 지원하는 CUDA 버전이 일치하는지 확인해야 합니다. CUDA 버전 불일치는 종종 이러한 종류의 오류를 발생시킬 수 있습니다.
디버깅 정보: Visual Studio에서 예외가 발생한 정확한 위치와 스택 트레이스를 확인하여 문제를 좀 더 구체적으로 파악할 수 있습니다.
이러한 점들을 고려하여 문제 해결을 위한 코드 예시를 제공해드리겠습니다.
#include <torch/script.h> // One-stop header.
#include <iostream>
#include <memory>
int main() {
// 모델 파일 경로를 정확히 지정합니다.
const std::string weight_path = "best.pt의 정확한 경로";
// GPU 사용 설정
torch::Device device(torch::kCUDA);
try {
// 사전 학습된 모델을 로드합니다.
torch::jit::script::Module module = torch::jit::load(weight_path, device);
std::cout << "모델 로드 성공" << std::endl;
} catch (const c10::Error& e) {
std::cerr << "모델 로드 중 오류 발생: " << e.what() << std::endl;
return -1;
}
// 모델 사용 코드...
return 0;
}
위 코드는 모델을 로드할 때 발생할 수 있는 예외를 처리하는 방법을 보여줍니다. 만약 예외가 발생한다면, 오류 메시지를 출력하고 프로그램을 종료합니다.
추가적으로, LibTorch와 관련된 문제를 해결하기 위해 공식 PyTorch 튜토리얼을 참고하실 수 있습니다. LibTorch를 사용하는 방법에 대한 자세한 정보는 다음 링크에서 확인하실 수 있습니다:
만약 여전히 문제가 해결되지 않는다면, 모델을 학습시킨 PyTorch 버전과 동일한 버전의 LibTorch를 사용해보시거나, CUDA 버전 호환성을 다시 확인해보시기 바랍니다. 또한, PyTorch 커뮤니티 포럼에서 비슷한 문제를 겪고 있는 다른 사용자들의 경험을 참고하실 수도 있습니다.
제가 제공한 해결책이나 정보가 정확하지 않을 수도 있으니, 이 점 유의하시고 추가적인 질문이나 정보가 필요하시면 언제든지 질문해주시기 바랍니다.
이 답변이 도움이 되셨나요? 괜찮았다고 생각하신다면 아래 를 한 번 눌러주시길 부탁드려요!
libtorch 버전을 1.4로 다운그레이드하는 것을 추천합니다.
찾으신 링크의 의견처럼 최신 버전의 libtorch와의 호환성 문제일 가능성이 있습니다.
모델 학습 시킬 때 pip3 list 상으로는 하기와 같습니다.
torch : 2.1.1
torchaudio : 2.1.1
torchvision : 0.16.1
본문에 설명 드렸던 libtorch와 버전이 다른 것인지 궁금합니다.
모델을 저장할 때 torch::save대신 torch::jit::save를 사용했는지 확인이 필요합니다.
C++에서 로드하려면 TorchScript 포맷으로 저장되어야 정상적으로 동작합니다.
모델을 학습시키고 저장 할 때에는 python으로 best.pt 파일을 저장 하였으므로
진행 시킨 코드는 하기와 같습니다.
from multiprocessing import freeze_support
if name=='main':
freeze_support()
from ultralytics import YOLO
model = YOLO("yolov8m.yaml")
model.train(data="./data.yaml",
epochs=35,
seed = 42,
batch = 4,
workers = 8
)
train 메서드가 동작되며 학습이 끝날 땐 특정 폴더에 best.pt파일이 생성됩니다.
따라서 이 best.pt파일을 가지고서 C++ 스크립트로 테스트를 해보았습니다.
모델을 로드하는 Device 설정을 CPU로 변경해보세요.
CUDA 관련 문제일 가능성도 배제할 수 없습니다.
알려주신 제시에 진행하기 앞서
cuda 12.1 버전으로써 libtorch의 라이브러리를 가져올 때 해당 cuda 버전과 호환 된 버전으로 설치를 했습니다.
그러므로 다른 문제가 있는지 궁금합니다.
아래 답변은 Google의 Gemini Pro 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다.
안녕하세요, aa6271235님. Libtorch에서 Microsoft C++ exception: c10::Error at memory location 오류를 겪고 계시다니 안타깝습니다. 문제를 해결하기 위해 몇 가지 제안을 드리겠습니다.
다른 버전의 Libtorch 사용하기:
찾아보신 링크(링크1, 링크2)에 따르면, 이 오류는 Libtorch 2.2.0 버전에서 발생하는 것으로 알려져 있습니다. 따라서 Libtorch의 이전 버전(예: 1.4 버전)을 사용해 보시는 것을 추천합니다. Libtorch의 다양한 버전을 다운로드할 수 있는 공식 페이지는 다음과 같습니다.
문제점을 찾아보니
from ultralytics import YOLO
model = YOLO("yolov8m.yaml")
model.train(data="./data.yaml",
epochs=1,
seed = 42,
batch = 4,
workers = 8
)
해당 코드로 모델을 학습 후 best.pt 파일을 출력합니다.
그 다음 model = torch.jit.load("best.pt 경로") 코드로
해당 model에 불러오려면 에러가 발생합니다.
RuntimeError: PytorchStreamReader failed locating file constants.pkl: file not found
2-1. 에러를 찾아보니 YOLOv8 모델 타입과 torch 타입이 다른 것 같아서 나는 에러 같습니다.
그래서 YOLOv8m용 pt 파일을 torch용 pt 타입으로 변환하는 방법을 알고 싶습니다.