diff --git a/Dockerfile b/Dockerfile index 416e1bb0a..e0d568066 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,7 +20,7 @@ ENV PATH=/opt/rh/gcc-toolset-10/root/usr/bin:$PATH ARG VULKANVERSION RUN wget https://sdk.lunarg.com/sdk/download/${VULKANVERSION}/linux/vulkansdk-linux-x86_64-${VULKANVERSION}.tar.xz -O /tmp/vulkansdk-linux-x86_64-${VULKANVERSION}.tar.xz \ && tar xvf /tmp/vulkansdk-linux-x86_64-${VULKANVERSION}.tar.xz \ - && dnf -y install ninja-build libcap-devel \ + && dnf -y install ninja-build \ && ln -s /usr/bin/python3 /usr/bin/python \ && /${VULKANVERSION}/vulkansdk -j 8 vulkan-headers \ && /${VULKANVERSION}/vulkansdk -j 8 shaderc @@ -126,7 +126,7 @@ COPY --from=build /bin/ollama /bin/ollama FROM ubuntu:24.04 RUN apt-get update \ - && apt-get install -y ca-certificates libcap2 libvulkan1 \ + && apt-get install -y ca-certificates libvulkan1 \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* COPY --from=archive /bin /usr/bin diff --git a/discover/gpu.go b/discover/gpu.go index 72011e699..056191f6a 100644 --- a/discover/gpu.go +++ b/discover/gpu.go @@ -57,7 +57,6 @@ var ( cudartLibPath string oneapiLibPath string vulkanLibPath string - libcapLibPath string nvmlLibPath string rocmGPUs []RocmGPUInfo oneapiGPUs []OneapiGPUInfo @@ -187,19 +186,18 @@ func initVulkanHandles() *vulkanHandles { vHandles := &vulkanHandles{} // Short Circuit if we already know which library to use - if vulkanLibPath != "" && libcapLibPath != "" { - vHandles.deviceCount, vHandles.vulkan, _, _ = LoadVulkanMgmt([]string{vulkanLibPath}, []string{libcapLibPath}) + if vulkanLibPath != "" { + vHandles.deviceCount, vHandles.vulkan, _ = LoadVulkanMgmt([]string{vulkanLibPath}) return vHandles } vulkanPaths := FindGPULibs(VulkanMgmtName, VulkanGlobs) - libcapPaths := FindLibCapLibs() - if len(vulkanPaths) > 0 && len(libcapPaths) > 0 { - slog.Info("vulkan: load libvulkan and libcap ok") - vHandles.deviceCount, vHandles.vulkan, vulkanLibPath, libcapLibPath = LoadVulkanMgmt(vulkanPaths, libcapPaths) + if len(vulkanPaths) > 0 { + slog.Info("vulkan: load libvulkan ok") + vHandles.deviceCount, vHandles.vulkan, vulkanLibPath = LoadVulkanMgmt(vulkanPaths) } else { - slog.Info("vulkan: failed to load libvulkan or libcap") + slog.Info("vulkan: failed to load libvulkan") } return vHandles @@ -760,32 +758,27 @@ func loadOneapiMgmt(oneapiLibPaths []string) (int, *C.oneapi_handle_t, string, e return 0, nil, "", err } -func LoadVulkanMgmt(vulkanLibPaths []string, capLibPaths []string) (int, *C.vk_handle_t, string, string) { +func LoadVulkanMgmt(vulkanLibPaths []string) (int, *C.vk_handle_t, string) { var resp C.vk_init_resp_t resp.ch.verbose = getVerboseState() for _, vkLibPath := range vulkanLibPaths { - for _, capLibPath := range capLibPaths { - vkLib := C.CString(vkLibPath) - capLib := C.CString(capLibPath) - defer C.free(unsafe.Pointer(vkLib)) - defer C.free(unsafe.Pointer(capLib)) + vkLib := C.CString(vkLibPath) + defer C.free(unsafe.Pointer(vkLib)) - C.vk_init(vkLib, capLib, &resp) - if resp.err != nil { - slog.Error( - "Unable to load vulkan", - "vulkan_library", vkLibPath, - "cap_library", capLibPath, - "error", C.GoString(resp.err), - ) - C.free(unsafe.Pointer(resp.err)) - } else { - return int(resp.num_devices), &resp.ch, vkLibPath, capLibPath - } + C.vk_init(vkLib, &resp) + if resp.err != nil { + slog.Error( + "Unable to load vulkan", + "vulkan_library", vkLibPath, + "error", C.GoString(resp.err), + ) + C.free(unsafe.Pointer(resp.err)) + } else { + return int(resp.num_devices), &resp.ch, vkLibPath } } - return 0, nil, "", "" + return 0, nil, "" } func getVerboseState() C.uint16_t { diff --git a/discover/gpu_info_vulkan.c b/discover/gpu_info_vulkan.c index 29eaaeb7f..b520c8436 100644 --- a/discover/gpu_info_vulkan.c +++ b/discover/gpu_info_vulkan.c @@ -2,28 +2,6 @@ #include -int check_perfmon(vk_handle_t* rh) { -#ifdef __linux__ - cap_t caps; - const cap_value_t cap_list[1] = {CAP_PERFMON}; - - caps = (*rh->cap_get_proc)(); - if (caps == NULL) - return -1; - - if ((*rh->cap_set_flag)(caps, CAP_EFFECTIVE, 1, cap_list, CAP_SET) == -1) - return -1; - - if ((*rh->cap_set_proc)(caps) == -1) - return -1; - - if ((*rh->cap_free)(caps) == -1) - return -1; -#endif - - return 0; -} - int is_extension_supported(vk_handle_t* rh, VkPhysicalDevice device, char* extension) { VkPhysicalDeviceProperties properties; (*rh->vkGetPhysicalDeviceProperties)(device, &properties); @@ -53,30 +31,22 @@ int is_extension_supported(vk_handle_t* rh, VkPhysicalDevice device, char* exten return 0; } -void vk_init(char* vk_lib_path, char* cap_lib_path, vk_init_resp_t *resp) { +void vk_init(char* vk_lib_path, vk_init_resp_t *resp) { const int buflen = 256; char buf[buflen + 1]; int i; struct lookup { - int is_cap; char *s; void **p; } l[] = { -#ifdef __linux__ - {1, "cap_get_proc", (void *)&resp->ch.cap_get_proc}, - {1, "cap_get_bound", (void *)&resp->ch.cap_get_bound}, - {1, "cap_set_flag", (void *)&resp->ch.cap_set_flag}, - {1, "cap_set_proc", (void *)&resp->ch.cap_set_proc}, - {1, "cap_free", (void *)&resp->ch.cap_free}, -#endif - {0, "vkGetPhysicalDeviceProperties", (void *)&resp->ch.vkGetPhysicalDeviceProperties}, - {0, "vkEnumerateDeviceExtensionProperties", (void *)&resp->ch.vkEnumerateDeviceExtensionProperties}, - {0, "vkCreateInstance", (void *)&resp->ch.vkCreateInstance}, - {0, "vkEnumeratePhysicalDevices", (void *)&resp->ch.vkEnumeratePhysicalDevices}, - {0, "vkGetPhysicalDeviceMemoryProperties2", (void *)&resp->ch.vkGetPhysicalDeviceMemoryProperties2}, - {0, "vkDestroyInstance", (void *)&resp->ch.vkDestroyInstance}, - {0, NULL, NULL}, + {"vkGetPhysicalDeviceProperties", (void *)&resp->ch.vkGetPhysicalDeviceProperties}, + {"vkEnumerateDeviceExtensionProperties", (void *)&resp->ch.vkEnumerateDeviceExtensionProperties}, + {"vkCreateInstance", (void *)&resp->ch.vkCreateInstance}, + {"vkEnumeratePhysicalDevices", (void *)&resp->ch.vkEnumeratePhysicalDevices}, + {"vkGetPhysicalDeviceMemoryProperties2", (void *)&resp->ch.vkGetPhysicalDeviceMemoryProperties2}, + {"vkDestroyInstance", (void *)&resp->ch.vkDestroyInstance}, + {NULL, NULL}, }; resp->ch.vk_handle = LOAD_LIBRARY(vk_lib_path, RTLD_LAZY); @@ -91,39 +61,13 @@ void vk_init(char* vk_lib_path, char* cap_lib_path, vk_init_resp_t *resp) { return; } -#ifdef __linux__ - resp->ch.cap_handle = LOAD_LIBRARY(cap_lib_path, RTLD_LAZY); - if (!resp->ch.cap_handle) { - char *msg = LOAD_ERR(); - LOG(resp->ch.verbose, "library %s load err: %s\n", cap_lib_path, msg); - snprintf(buf, buflen, - "Unable to load %s library to query for Vulkan GPUs: %s", - cap_lib_path, msg); - free(msg); - resp->err = strdup(buf); - return; - } -#endif - for (i = 0; l[i].s != NULL; i++) { - if (l[i].is_cap) -#ifdef __linux__ - *l[i].p = LOAD_SYMBOL(resp->ch.cap_handle, l[i].s); -#else - continue; -#endif - else - *l[i].p = LOAD_SYMBOL(resp->ch.vk_handle, l[i].s); + *l[i].p = LOAD_SYMBOL(resp->ch.vk_handle, l[i].s); if (!*l[i].p) { char *msg = LOAD_ERR(); LOG(resp->ch.verbose, "dlerr: %s\n", msg); - if (l[i].is_cap) { - UNLOAD_LIBRARY(resp->ch.cap_handle); - resp->ch.cap_handle = NULL; - } else { - UNLOAD_LIBRARY(resp->ch.vk_handle); - resp->ch.vk_handle = NULL; - } + UNLOAD_LIBRARY(resp->ch.vk_handle); + resp->ch.vk_handle = NULL; snprintf(buf, buflen, "symbol lookup for %s failed: %s", l[i].s, msg); free(msg); @@ -132,12 +76,6 @@ void vk_init(char* vk_lib_path, char* cap_lib_path, vk_init_resp_t *resp) { } } - if (check_perfmon(&resp->ch) != 0) { - resp->err = strdup("performance monitoring is not allowed. Please enable CAP_PERFMON or run as root to use Vulkan."); - LOG(resp->ch.verbose, "vulkan: %s", resp->err); - return; - } - VkInstance instance; VkApplicationInfo appInfo = {}; @@ -277,10 +215,4 @@ void vk_release(vk_handle_t rh) { (*rh.vkDestroyInstance)(rh.vk, NULL); UNLOAD_LIBRARY(rh.vk_handle); rh.vk_handle = NULL; - -#ifdef __linux__ - LOG(rh.verbose, "releasing libcap library\n"); - UNLOAD_LIBRARY(rh.cap_handle); - rh.cap_handle = NULL; -#endif } diff --git a/discover/gpu_info_vulkan.h b/discover/gpu_info_vulkan.h index 1f19be58e..245d58f1f 100644 --- a/discover/gpu_info_vulkan.h +++ b/discover/gpu_info_vulkan.h @@ -4,29 +4,15 @@ #include "gpu_info.h" -#ifdef __linux__ -#include -#endif - #include typedef struct { void* vk_handle; - void* cap_handle; uint16_t verbose; VkInstance vk; int num_devices; -#ifdef __linux__ - cap_t (*cap_get_proc)(void); - - int (*cap_get_bound)(cap_value_t); - int (*cap_set_flag)(cap_t, cap_flag_t, int, const cap_value_t *, cap_flag_value_t); - int (*cap_set_proc)(cap_t); - int (*cap_free)(cap_t); -#endif - void (*vkGetPhysicalDeviceProperties)( VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties); @@ -58,7 +44,7 @@ typedef struct vk_init_resp vk_handle_t ch; } vk_init_resp_t; -void vk_init(char* vk_lib_path, char* cap_lib_path, vk_init_resp_t *resp); +void vk_init(char* vk_lib_path, vk_init_resp_t *resp); void vk_check_vram(vk_handle_t rh, int i, mem_info_t *resp); int vk_check_flash_attention(vk_handle_t rh, int i); void vk_release(vk_handle_t rh); diff --git a/discover/gpu_linux.go b/discover/gpu_linux.go index c603ecea9..2631dd2cf 100644 --- a/discover/gpu_linux.go +++ b/discover/gpu_linux.go @@ -53,7 +53,6 @@ var ( NvmlMgmtName = "" // not currently wired on linux OneapiMgmtName = "libze_intel_gpu.so*" VulkanMgmtName = "libvulkan.so*" - libcapMgmtName = "libcap.so*" ) var VulkanGlobs = []string{ @@ -62,16 +61,6 @@ var VulkanGlobs = []string{ "/usr/lib*/libvulkan.so*", } -var capLinuxGlobs = []string{ - "/usr/lib/x86_64-linux-gnu/libcap.so*", - "/usr/lib/aarch64-linux-gnu/libvulkan.so*", - "/usr/lib*/libcap.so*", -} - -func FindLibCapLibs() []string { - return FindGPULibs(libcapMgmtName, capLinuxGlobs) -} - func GetCPUMem() (memInfo, error) { var mem memInfo var total, available, free, buffers, cached, freeSwap uint64