【问题标题】:what is the proper way to set CUDA_VISIBLE_DEVICES in cmake file to use different GPU core在 cmake 文件中设置 CUDA_VISIBLE_DEVICES 以使用不同的 GPU 核心的正确方法是什么
【发布时间】: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 文件中。

标签: cmake cuda gpu


【解决方案1】:

我能够使用如下代码将测试预分配给不同的 GPU:

function(py_test TARGET_NAME) 
  set(options "")
  set(oneValueArgs "")
  set(multiValueArgs SRCS DEPS ARGS ENVS)
  MATH(EXPR CUDA_ID "(${CUDA_ID}+1)%4")
  set(CUDA_ID ${CUDA_ID} PARENT_SCOPE)
  cmake_parse_arguments(py_test "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  get_filename_component(work_dir ${py_test_SRCS} DIRECTORY)
  add_test(NAME ${TARGET_NAME}
           COMMAND ${CMAKE_COMMAND} -E env CUDA_VISIBLE_DEVICES=${CUDA_ID} ${COVERAGE_EXECUTABLE} run --parallel-mode --source=horizon_nn "${py_test_SRCS}" ${py_test_ARGS} 
           WORKING_DIRECTORY ${work_dir})
  message(STATUS CUDA_ID ${CUDA_ID})
endfunction()

set(CUDA_ID 0)

但是,动态分配仍然无法实现,因为所有这些测试都是在 cmake 阶段预先分配的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2015-05-25
    相关资源
    最近更新 更多