02-cudaleaks.diff 3.89 KB
Newer Older
Daniel Hiltgen's avatar
Daniel Hiltgen committed
1
diff --git a/examples/server/server.cpp b/examples/server/server.cpp
2
index 8fe5e0b1..53bf39c1 100644
Daniel Hiltgen's avatar
Daniel Hiltgen committed
3
4
--- a/examples/server/server.cpp
+++ b/examples/server/server.cpp
5
6
@@ -31,6 +31,10 @@
 #include <atomic>
7
 #include <signal.h>
Daniel Hiltgen's avatar
Daniel Hiltgen committed
8
9
10
11
12
 
+#ifdef GGML_USE_CUBLAS
+extern "C" GGML_CALL void ggml_free_cublas(void);
+#endif
+
13
14
 using json = nlohmann::json;
 
15
16
 struct server_params {
@@ -363,6 +367,10 @@ struct llama_server_context
Daniel Hiltgen's avatar
Daniel Hiltgen committed
17
18
19
             llama_free_model(model);
             model = nullptr;
         }
20
+
Daniel Hiltgen's avatar
Daniel Hiltgen committed
21
22
23
24
25
+#ifdef GGML_USE_CUBLAS
+        ggml_free_cublas();
+#endif
     }
 
26
27
     bool load_model(const gpt_params &params_)
@@ -3543,6 +3551,7 @@ int main(int argc, char **argv)
Daniel Hiltgen's avatar
Daniel Hiltgen committed
28
29
30
31
32
33
34
35
     sigemptyset (&sigint_action.sa_mask);
     sigint_action.sa_flags = 0;
     sigaction(SIGINT, &sigint_action, NULL);
+    sigaction(SIGUSR1, &sigint_action, NULL);
 #elif defined (_WIN32)
     auto console_ctrl_handler = +[](DWORD ctrl_type) -> BOOL {
         return (ctrl_type == CTRL_C_EVENT) ? (signal_handler(SIGINT), true) : false;
diff --git a/ggml-cuda.cu b/ggml-cuda.cu
36
index 72bcec8c..6c934e8c 100644
Daniel Hiltgen's avatar
Daniel Hiltgen committed
37
38
--- a/ggml-cuda.cu
+++ b/ggml-cuda.cu
39
@@ -43,6 +43,7 @@
Daniel Hiltgen's avatar
Daniel Hiltgen committed
40
41
42
43
44
45
46
 #define __shfl_xor_sync(mask, var, laneMask, width) __shfl_xor(var, laneMask, width)
 #define cublasComputeType_t hipblasDatatype_t //deprecated, new hipblasComputeType_t not in 5.6
 #define cublasCreate hipblasCreate
+#define cublasDestroy hipblasDestroy
 #define cublasGemmEx hipblasGemmEx
 #define cublasGemmBatchedEx hipblasGemmBatchedEx
 #define cublasGemmStridedBatchedEx hipblasGemmStridedBatchedEx
47
@@ -8751,10 +8752,10 @@ GGML_CALL bool ggml_cublas_loaded(void) {
Daniel Hiltgen's avatar
Daniel Hiltgen committed
48
49
50
     return g_cublas_loaded;
 }
 
51
-GGML_CALL void ggml_init_cublas() {
Daniel Hiltgen's avatar
Daniel Hiltgen committed
52
-    static bool initialized = false;
53
+static bool g_cublas_initialized = false;
Daniel Hiltgen's avatar
Daniel Hiltgen committed
54
55
 
-    if (!initialized) {
56
+GGML_CALL void ggml_init_cublas() {
Daniel Hiltgen's avatar
Daniel Hiltgen committed
57
58
59
60
+    if (!g_cublas_initialized) {
 
 #ifdef __HIP_PLATFORM_AMD__
         // Workaround for a rocBLAS bug when using multiple graphics cards:
61
@@ -8764,7 +8765,7 @@ GGML_CALL void ggml_init_cublas() {
Daniel Hiltgen's avatar
Daniel Hiltgen committed
62
63
64
65
66
67
 #endif
 
         if (cudaGetDeviceCount(&g_device_count) != cudaSuccess) {
-            initialized = true;
+            g_cublas_initialized = true;
             g_cublas_loaded = false;
68
             fprintf(stderr, "%s: no " GGML_CUDA_NAME " devices found, " GGML_CUDA_NAME " will be disabled\n", __func__);
Daniel Hiltgen's avatar
Daniel Hiltgen committed
69
             return;
70
@@ -8835,7 +8836,7 @@ GGML_CALL void ggml_init_cublas() {
Daniel Hiltgen's avatar
Daniel Hiltgen committed
71
72
73
74
75
76
77
78
         // configure logging to stdout
         // CUBLAS_CHECK(cublasLoggerConfigure(1, 1, 0, nullptr));
 
-        initialized = true;
+        g_cublas_initialized = true;
         g_cublas_loaded = true;
     }
 }
79
@@ -12490,3 +12491,23 @@ GGML_CALL int ggml_backend_cuda_reg_devices() {
Daniel Hiltgen's avatar
Daniel Hiltgen committed
80
81
82
83
     }
     return device_count;
 }
+
84
+
Daniel Hiltgen's avatar
Daniel Hiltgen committed
85
86
87
+extern "C" GGML_CALL void ggml_free_cublas(void);
+GGML_CALL void ggml_free_cublas(void) {
+    for (int id = 0; id < g_device_count; ++id) {
88
89
90
91
92
93
+#if !(defined(GGML_USE_HIPBLAS) && defined(__HIP_PLATFORM_AMD__))
+        if (g_device_caps[id].vmm) {
+            CU_CHECK(cuMemUnmap(g_cuda_pool_addr[id], g_cuda_pool_size[id]));
+            g_cuda_pool_size[id] = 0;
+            g_cuda_pool_addr[id] = 0;
+        }
Daniel Hiltgen's avatar
Daniel Hiltgen committed
94
+#endif
95
96
+        // TODO: free legacy non-vmm memory
+        // destroy cublas handle
Daniel Hiltgen's avatar
Daniel Hiltgen committed
97
98
99
+        CUBLAS_CHECK(cublasDestroy(g_cublas_handles[id]));
+        g_cublas_handles[id] = nullptr;
+    }
100
+
Daniel Hiltgen's avatar
Daniel Hiltgen committed
101
102
+    g_cublas_initialized = false;
+}
103
\ No newline at end of file
Daniel Hiltgen's avatar
Daniel Hiltgen committed
104
diff --git a/ggml-cuda.h b/ggml-cuda.h
105
index b1ebd61d..6dd58ddf 100644
Daniel Hiltgen's avatar
Daniel Hiltgen committed
106
107
--- a/ggml-cuda.h
+++ b/ggml-cuda.h
108
109
110
@@ -23,6 +23,9 @@ GGML_API GGML_CALL void   ggml_init_cublas(void);
 // Returns `true` if there are available CUDA devices and cublas loads successfully; otherwise, it returns `false`.
 GGML_API GGML_CALL bool   ggml_cublas_loaded(void);
Daniel Hiltgen's avatar
Daniel Hiltgen committed
111
112
113
114
 
+// Release CUDA resources
+GGML_API GGML_CALL void   ggml_free_cublas(void);
+
115
116
 GGML_API GGML_CALL void * ggml_cuda_host_malloc(size_t size);
 GGML_API GGML_CALL void   ggml_cuda_host_free(void * ptr);
Daniel Hiltgen's avatar
Daniel Hiltgen committed
117