【发布时间】:2022-11-18 10:07:27
【问题描述】:
我有一个项目使用 cmake 进行编译,然后进行单元测试。它的标准程序是
cmake .. -DUSE_CUDA=ON ; make ; make test ARGS="-j 10"
问题是在make test阶段,我的服务器上有4个GPU,只使用了一个GPU。我可以通过nvidia-smi 命令看到它。我想知道是否有一种方法可以在 Cmakefiles 中设置以更改正在使用的 GPU 并最终利用所有 GPU。
这是将执行所有测试用例的单元测试代码。我试图通过将环境变量 CUDA_VISIBLE_DEVICES 设置为 1 来强制它在 GPU 1 上运行。但是代码仍然在 GPU 核心 0 上运行。
function(py_test TARGET_NAME)
set(options "")
set(oneValueArgs "")
set(multiValueArgs SRCS DEPS ARGS ENVS)
set(ENV{CUDA_VISIBLE_DEVICES} 1)
cmake_parse_arguments(py_test "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
get_filename_component(work_dir ${py_test_SRCS} DIRECTORY)
add_test(NAME ${TARGET_NAME}
COMMAND ${COVERAGE_EXECUTABLE} run --parallel-mode --source=test_module "${py_test_SRCS}" ${py_test_ARGS}
WORKING_DIRECTORY ${work_dir})
endfunction()
function(add_files)
set(options "")
set(oneValueArgs "")
set(multiValueArgs SRCS)
cmake_parse_arguments(add_files "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
foreach(test_file ${add_files_SRCS})
get_filename_component(test ${test_file} NAME_WE)
get_filename_component(test_abs ${test_file} ABSOLUTE)
message(STATUS "test_file:${test_file}")
py_test(${test} SRCS ${test_abs})
endforeach()
endfunction()
# Put cases cost more time before the less ones
set(COVERAGE_EXECUTABLE /usr/local/bin/coverage-3.6)
# unit test
file(GLOB UNIT_TEST unit_test_folder/test_*.py)
add_files(SRCS ${UNIT_TEST})
在运行 cmake test 之前,我尝试在命令终端中设置 CUDA_VISIBLE_DEVICES 并且它起作用了。
另外,我是否必须将测试预先分配给不同的专用 GPU,或者它们是否可以动态分配。
【问题讨论】:
-
显卡? CMake 甚至不太关心 CPU。即使是
make也不太可能使用 GPU 本身。去阅读实际的测试代码。很明显,如果有一个问题你不能用那个代码解决,就把那个代码贴出来。我们无法调试看不见的代码。 -
@MSalters 我已经在此处发布了测试代码并更新了我的问题。抱歉,我对 cmake 了解不多。
-
我试图通过
message(STATUS CUDA_VISIBLE_DEVICES $ENV{CUDA_VISIBLE_DEVICES})查看环境设置,发现 env 变量设置正确但不工作。 -
我还尝试通过以下代码在 add_test 函数中设置它:
add_test(NAME ${TARGET_NAME} COMMAND CUDA_VISIBLE_DEVICES=1 ${COVERAGE_EXECUTABLE} run --parallel-mode --source=horizon_nn "${py_test_SRCS}" ${py_test_ARGS} WORKING_DIRECTORY ${work_dir})并得到错误:Could not find executable CUDA_VISIBLE_DEVICES=1 -
执行命令
CUDA_VISIBLE_DEVICES=1 make test ARGS="-j 10"为我工作,但我想知道我是否可以将它设置在 cmakelist 文件中。