Вопрос или проблема
Я работаю над проектом на C++, который использует PyTorch, и пытаюсь настроить модульные тесты с помощью Google Test. Однако я сталкиваюсь с проблемой, когда при связывании библиотек PyTorch с моим тестовым исполняемым файлом возникает ошибка std::bad_alloc. Вот соответствующий код и конфигурация CMake:
// test.cpp
#include <gtest/gtest.h>
TEST(SimpleTest, BasicAssert) {
EXPECT_EQ(1, 1);
}
int main(int argc, char **argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
И соответствующая конфигурация CMake:
include(FetchContent)
set(LIBTORCH_CPU_URL "https://download.pytorch.org/libtorch/cpu/libtorch-shared-with-deps-2.5.1%2Bcpu.zip")
FetchContent_Declare(
Torch
URL ${LIBTORCH_CPU_URL}
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
)
FetchContent_MakeAvailable(Torch)
list(APPEND CMAKE_PREFIX_PATH "${torch_SOURCE_DIR}")
find_package(Torch REQUIRED)
find_package(benchmark REQUIRED)
find_package(GTest REQUIRED)
include(GoogleTest)
add_executable(lib_library_entry test.cpp)
target_link_libraries(lib_library_entry PRIVATE GTest::gtest "${TORCH_LIBRARIES}")
set_target_properties(lib_library_entry PROPERTIES CXX_STANDARD 23)
Проблема в том, что если я убираю ${TORCH_LIBRARIES} из команды target_link_libraries, тестовый исполняемый файл работает без каких-либо проблем. Однако, если я включаю библиотеки PyTorch, я получаю следующую ошибку:
(base) naseef@LAPTOP-RAFKQ2CB:~/git/sample-pytorch/build/Release$ ./lib_library_entry
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted (core dumped)
Я пытался упростить тестовый случай, и, похоже, что проблема конкретно связана с интеграцией PyTorch с модульными тестами на основе Google Test. Мое главное приложение, использующее PyTorch, работает нормально, поэтому проблема, похоже, изолирована в модульных тестах.
Буду признателен за любые предложения о том, как отладить эту проблему или найти обходные пути, чтобы модульные тесты на основе Google Test работали с библиотеками PyTorch. Когда я перегружал оператор new, он выделял 140 ТБ, что вызывает bad_alloc.
Ответ или решение
Проблема, с которой вы столкнулись, — это ошибка std::bad_alloc
, возникающая при связывании библиотек PyTorch с вашим исполняемым файлом тестов, созданным с использованием Google Test. Эта ошибка, как правило, указывает на то, что программа пытается выделить память, но не может этого сделать, часто из-за недостатка доступной памяти или несоответствия в библиотечных зависимостях. Давайте разберемся с возможными причинами возникновения этой ошибки и уточним шаги по её устранению.
Возможные причины возникновения ошибки
-
Конфликт в версиях библиотек: Когда вы используете разные версии библиотек, особенно если одна из библиотек ожидает другие зависимости, это может привести к ошибке выделения памяти. Убедитесь, что версии Google Test и PyTorch совместимы и действительно являются последними стабильными версиями.
-
Неправильная инициализация среды: PyTorch требует определённой инициализации своей среды. Когда вы запускаете тесты с Google Test, убедитесь, что PyTorch инициализирован должным образом, возможно, стоит добавить соответствующий код инициализации в вашу функцию
main
. -
Системные ограничения: Ошибка
std::bad_alloc
также может возникнуть, если ваша система пытается выделить больше памяти, чем доступно. В некоторых случаях библиотеки, такие как PyTorch, могут не учитывать доступные ресурсы, что приводит к попыткам выделения неоправданно больших объёмов памяти.
Шаги к решению проблемы
-
Просмотр конфигурации CMake: Убедитесь, что конфигурация CMake корректна. Обратите внимание на порядок подключения библиотек и порядок определения:
target_link_libraries(lib_library_entry PRIVATE GTest::gtest "${TORCH_LIBRARIES}")
Может потребоваться изменить порядок или добавить дополнительные библиотеки, чтобы избежать конфликтов.
-
Инициализация PyTorch: Попробуйте включить простую инициализацию PyTorch в
main
:#include <torch/torch.h> int main(int argc, char **argv) { torch::manual_seed(0); // Инициализация генератора случайных чисел testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
-
Отладка через перезапись оператора new: Вы упомянули, что при перезаписи оператора
new
, размер памяти, выделяемой для объектов, составляет 140 ТБ. Это может значить, что ваш код или одна из библиотек случайно создает бесконечный циклический вызов выделения памяти. Убедитесь, что в вашем коде нет ошибок, которые могут приводить к рекурсивным вызовамnew
, и в частности, внимательно проверьте инициализацию любых статических или глобальных объектов. -
Тестирование в минимальной конфигурации: Сначала попробуйте создать минимальное тестовое приложение, которое только инициализирует PyTorch и не делает ничего другого. Это поможет изолировать проблему и установить, действительно ли она связана с PyTorch или Google Test.
-
Ведение журнала и отладка: Попробуйте использовать инструменты отладки, такие как gdb или Valgrind, для отслеживания возникновения ошибки. Это может показать, какие именно вызовы оказываются причиной исключения.
-
Использование Docker или другой среды: Если проблема сохраняется, попробуйте воспроизвести её в другой среде, например, в Docker-контейнере. Это может помочь исключить проблемы с настройкой вашей системы.
Если вы будете следовать этим шагам, у вас появится больше шансов решить проблему с ошибкой std::bad_alloc
и настроить корректную интеграцию Google Test и PyTorch в вашем проекте. Если после выполнения всех действий ошибка сохраняется, рассмотрите возможность создания запроса в сообществе PyTorch с указанием версии библиотек и конфигурации проекта.