diff --git a/engine/services/engine_service.cc b/engine/services/engine_service.cc index a80c5fe60..6938a3005 100644 --- a/engine/services/engine_service.cc +++ b/engine/services/engine_service.cc @@ -404,17 +404,6 @@ cpp::result EngineService::DownloadCuda( auto suitable_toolkit_version = GetSuitableCudaVersion(engine, hw_inf_.cuda_driver_version); - // compare cuda driver version with cuda toolkit version - // cuda driver version should be greater than toolkit version to ensure compatibility - if (semantic_version_utils::CompareSemanticVersion( - hw_inf_.cuda_driver_version, suitable_toolkit_version) < 0) { - CTL_ERR("Your Cuda driver version " - << hw_inf_.cuda_driver_version - << " is not compatible with cuda toolkit version " - << suitable_toolkit_version); - return cpp::fail("Cuda driver is not compatible with cuda toolkit"); - } - auto url_obj = url_parser::Url{ .protocol = "https", .host = jan_host, diff --git a/engine/utils/hardware/gpu_info.h b/engine/utils/hardware/gpu_info.h index c6ffaa193..3c7ff8733 100644 --- a/engine/utils/hardware/gpu_info.h +++ b/engine/utils/hardware/gpu_info.h @@ -17,7 +17,7 @@ inline std::vector GetGPUInfo() { for (size_t i = 0; i < nvidia_gpus.size(); i++) { for (size_t j = 0; j < vulkan_gpus.size(); j++) { - if (nvidia_gpus[i].uuid == vulkan_gpus[j].uuid) { + if (nvidia_gpus[i].uuid.find(vulkan_gpus[j].uuid) != std::string::npos) { vulkan_gpus[j].version = nvidia_gpus[0].cuda_driver_version.value_or("unknown"); vulkan_gpus[j].add_info = NvidiaAddInfo{ diff --git a/engine/utils/system_info_utils.cc b/engine/utils/system_info_utils.cc index e80bce035..673a2a7b7 100644 --- a/engine/utils/system_info_utils.cc +++ b/engine/utils/system_info_utils.cc @@ -108,26 +108,32 @@ std::vector GetGpuInfoList() { auto [driver_version, cuda_version] = GetDriverAndCudaVersion(); if (driver_version.empty() || cuda_version.empty()) return gpuInfoList; - + bool need_fallback = false; CommandExecutor cmd(kGpuQueryCommand); auto output = cmd.execute(); + if (output.find("NVIDIA") == std::string::npos) { + need_fallback = true; + output = CommandExecutor(kGpuQueryCommandFb).execute(); + } - const std::regex gpu_info_reg(kGpuInfoRegex); + std::string rg = need_fallback ? kGpuInfoRegexFb : kGpuInfoRegex; + const std::regex gpu_info_reg(rg); std::smatch match; std::string::const_iterator search_start(output.cbegin()); + int rg_count = need_fallback ? 5 : 6; while ( std::regex_search(search_start, output.cend(), match, gpu_info_reg)) { GpuInfo gpuInfo = { - match[1].str(), // id - match[2].str(), // vram_total - match[3].str(), // vram_free - match[4].str(), // name - GetGpuArch(match[4].str()), // arch - driver_version, // driver_version - cuda_version, // cuda_driver_version - match[5].str(), // compute_cap - match[6].str() // uuid + match[1].str(), // id + match[2].str(), // vram_total + match[3].str(), // vram_free + match[4].str(), // name + GetGpuArch(match[4].str()), // arch + driver_version, // driver_version + cuda_version, // cuda_driver_version + need_fallback ? "0" : match[5].str(), // compute_cap + match[rg_count].str() // uuid }; gpuInfoList.push_back(gpuInfo); search_start = match.suffix().first; diff --git a/engine/utils/system_info_utils.h b/engine/utils/system_info_utils.h index 0907884be..79d5db2e1 100644 --- a/engine/utils/system_info_utils.h +++ b/engine/utils/system_info_utils.h @@ -25,6 +25,13 @@ constexpr static auto kGpuQueryCommand{ constexpr static auto kGpuInfoRegex{ R"((\d+),\s*(\d+),\s*(\d+),\s*([^,]+),\s*([\d\.]+),\s*([^\n,]+))"}; +constexpr static auto kGpuQueryCommandFb{ + "nvidia-smi " + "--query-gpu=index,memory.total,memory.free,name,uuid " + "--format=csv,noheader,nounits"}; +constexpr static auto kGpuInfoRegexFb{ + R"((\d+),\s*(\d+),\s*(\d+),\s*([^,]+),\s*([^\n,]+))"}; + struct SystemInfo { explicit SystemInfo(std::string os, std::string arch) : os(std::move(os)), arch(std::move(arch)) {}