std::bad_alloc ошибка при связывании библиотек PyTorch в Google Test

Вопрос или проблема

Я работаю над проектом на 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. Эта ошибка, как правило, указывает на то, что программа пытается выделить память, но не может этого сделать, часто из-за недостатка доступной памяти или несоответствия в библиотечных зависимостях. Давайте разберемся с возможными причинами возникновения этой ошибки и уточним шаги по её устранению.

Возможные причины возникновения ошибки

  1. Конфликт в версиях библиотек: Когда вы используете разные версии библиотек, особенно если одна из библиотек ожидает другие зависимости, это может привести к ошибке выделения памяти. Убедитесь, что версии Google Test и PyTorch совместимы и действительно являются последними стабильными версиями.

  2. Неправильная инициализация среды: PyTorch требует определённой инициализации своей среды. Когда вы запускаете тесты с Google Test, убедитесь, что PyTorch инициализирован должным образом, возможно, стоит добавить соответствующий код инициализации в вашу функцию main.

  3. Системные ограничения: Ошибка std::bad_alloc также может возникнуть, если ваша система пытается выделить больше памяти, чем доступно. В некоторых случаях библиотеки, такие как PyTorch, могут не учитывать доступные ресурсы, что приводит к попыткам выделения неоправданно больших объёмов памяти.

Шаги к решению проблемы

  1. Просмотр конфигурации CMake: Убедитесь, что конфигурация CMake корректна. Обратите внимание на порядок подключения библиотек и порядок определения:

    target_link_libraries(lib_library_entry PRIVATE GTest::gtest "${TORCH_LIBRARIES}")

    Может потребоваться изменить порядок или добавить дополнительные библиотеки, чтобы избежать конфликтов.

  2. Инициализация 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();
    }
  3. Отладка через перезапись оператора new: Вы упомянули, что при перезаписи оператора new, размер памяти, выделяемой для объектов, составляет 140 ТБ. Это может значить, что ваш код или одна из библиотек случайно создает бесконечный циклический вызов выделения памяти. Убедитесь, что в вашем коде нет ошибок, которые могут приводить к рекурсивным вызовам new, и в частности, внимательно проверьте инициализацию любых статических или глобальных объектов.

  4. Тестирование в минимальной конфигурации: Сначала попробуйте создать минимальное тестовое приложение, которое только инициализирует PyTorch и не делает ничего другого. Это поможет изолировать проблему и установить, действительно ли она связана с PyTorch или Google Test.

  5. Ведение журнала и отладка: Попробуйте использовать инструменты отладки, такие как gdb или Valgrind, для отслеживания возникновения ошибки. Это может показать, какие именно вызовы оказываются причиной исключения.

  6. Использование Docker или другой среды: Если проблема сохраняется, попробуйте воспроизвести её в другой среде, например, в Docker-контейнере. Это может помочь исключить проблемы с настройкой вашей системы.

Если вы будете следовать этим шагам, у вас появится больше шансов решить проблему с ошибкой std::bad_alloc и настроить корректную интеграцию Google Test и PyTorch в вашем проекте. Если после выполнения всех действий ошибка сохраняется, рассмотрите возможность создания запроса в сообществе PyTorch с указанием версии библиотек и конфигурации проекта.

Оцените материал
Добавить комментарий

Капча загружается...