Compare commits

...

6 Commits

Author SHA1 Message Date
Xuan Son Nguyen ff9e7673cf musaDeviceReset 2026-07-03 18:57:48 +02:00
Xuan Son Nguyen 74dc1670fe nits 2026-07-03 17:47:39 +02:00
Xuan Son Nguyen 8fb4063720 use CUDA_CHECK 2026-07-03 17:47:31 +02:00
Xuan Son Nguyen 602ceaca51 unimpl for other backend 2026-07-03 17:37:40 +02:00
Xuan Son Nguyen 2acfc61fe3 add hipDeviceReset() 2026-07-03 17:35:25 +02:00
Xuan Son Nguyen 893b45a626 add ggml_backend_dev_reset() for sleep mode 2026-07-03 17:25:58 +02:00
22 changed files with 49 additions and 2 deletions
+1
View File
@@ -190,6 +190,7 @@ extern "C" {
GGML_API bool ggml_backend_dev_supports_op(ggml_backend_dev_t device, const struct ggml_tensor * op);
GGML_API bool ggml_backend_dev_supports_buft(ggml_backend_dev_t device, ggml_backend_buffer_type_t buft);
GGML_API bool ggml_backend_dev_offload_op(ggml_backend_dev_t device, const struct ggml_tensor * op);
GGML_API bool ggml_backend_dev_reset(ggml_backend_dev_t device);
//
// Backend (reg)
+4
View File
@@ -199,6 +199,10 @@ extern "C" {
ggml_backend_event_t (*event_new) (ggml_backend_dev_t dev);
void (*event_free) (ggml_backend_dev_t dev, ggml_backend_event_t event);
void (*event_synchronize) (ggml_backend_dev_t dev, ggml_backend_event_t event);
// (optional) release all resources held for this device (eg. GPU memory/context), the device must remain usable afterwards
// returns false if unsupported
bool (*reset)(ggml_backend_dev_t dev);
};
struct ggml_backend_device {
+1
View File
@@ -191,6 +191,7 @@ static const ggml_backend_device_i ggml_backend_meta_device_iface = {
/* .event_new = */ nullptr,
/* .event_free = */ nullptr,
/* .event_synchronize = */ nullptr,
/* .reset = */ nullptr,
};
static bool ggml_backend_dev_is_meta(ggml_backend_dev_t dev) {
+9
View File
@@ -639,6 +639,15 @@ bool ggml_backend_dev_offload_op(ggml_backend_dev_t device, const struct ggml_te
return false;
}
bool ggml_backend_dev_reset(ggml_backend_dev_t device) {
GGML_ASSERT(device);
if (device->iface.reset != NULL) {
return device->iface.reset(device);
}
return false;
}
// Backend (reg)
const char * ggml_backend_reg_name(ggml_backend_reg_t reg) {
+1
View File
@@ -461,6 +461,7 @@ static const struct ggml_backend_device_i ggml_backend_blas_device_i = {
/* .event_new = */ NULL,
/* .event_free = */ NULL,
/* .event_synchronize = */ NULL,
/* .reset = */ NULL,
};
// backend reg interface
+1
View File
@@ -2944,6 +2944,7 @@ static const ggml_backend_device_i ggml_backend_cann_device_interface = {
/* .event_new = */ ggml_backend_cann_device_event_new,
/* .event_free = */ ggml_backend_cann_device_event_free,
/* .event_synchronize = */ ggml_backend_cann_device_event_synchronize,
/* .reset = */ NULL,
};
// backend reg
+1
View File
@@ -494,6 +494,7 @@ static const struct ggml_backend_device_i ggml_backend_cpu_device_i = {
/* .event_new = */ NULL,
/* .event_free = */ NULL,
/* .event_synchronize = */ NULL,
/* .reset = */ NULL,
};
// CPU backend - backend (reg)
+9
View File
@@ -5595,6 +5595,14 @@ static void ggml_backend_cuda_device_event_synchronize(ggml_backend_dev_t dev, g
CUDA_CHECK(cudaEventSynchronize((cudaEvent_t)event->context));
}
static bool ggml_backend_cuda_device_reset(ggml_backend_dev_t dev) {
ggml_backend_cuda_device_context * dev_ctx = (ggml_backend_cuda_device_context *) dev->context;
auto & device = dev_ctx->device;
CUDA_CHECK(cudaSetDevice(device));
CUDA_CHECK(cudaDeviceReset());
return true;
}
static const ggml_backend_device_i ggml_backend_cuda_device_interface = {
/* .get_name = */ ggml_backend_cuda_device_get_name,
/* .get_description = */ ggml_backend_cuda_device_get_description,
@@ -5611,6 +5619,7 @@ static const ggml_backend_device_i ggml_backend_cuda_device_interface = {
/* .event_new = */ ggml_backend_cuda_device_event_new,
/* .event_free = */ ggml_backend_cuda_device_event_free,
/* .event_synchronize = */ ggml_backend_cuda_device_event_synchronize,
/* .reset = */ ggml_backend_cuda_device_reset,
};
// backend reg
+1
View File
@@ -60,6 +60,7 @@
#define cudaDeviceGetPCIBusId hipDeviceGetPCIBusId
#define cudaDeviceProp hipDeviceProp_t
#define cudaDeviceSynchronize hipDeviceSynchronize
#define cudaDeviceReset hipDeviceReset
#define cudaError_t hipError_t
#define cudaErrorMemoryAllocation hipErrorOutOfMemory
#define cudaErrorPeerAccessAlreadyEnabled hipErrorPeerAccessAlreadyEnabled
+1
View File
@@ -44,6 +44,7 @@
#define cudaDeviceGetPCIBusId musaDeviceGetPCIBusId
#define cudaDeviceProp musaDeviceProp
#define cudaDeviceSynchronize musaDeviceSynchronize
#define cudaDeviceReset musaDeviceReset
#define cudaError_t musaError_t
#define cudaErrorMemoryAllocation musaErrorMemoryAllocation
#define cudaErrorPeerAccessAlreadyEnabled musaErrorPeerAccessAlreadyEnabled
+1
View File
@@ -4155,6 +4155,7 @@ static const struct ggml_backend_device_i ggml_backend_hexagon_device_i = {
/* .event_new = */ NULL,
/* .event_free = */ NULL,
/* .event_synchronize = */ NULL,
/* .reset = */ NULL,
};
//** backend registry
+1
View File
@@ -810,6 +810,7 @@ static ggml_backend_device_i ggml_backend_metal_device_i = {
/* .event_new = */ ggml_backend_metal_device_event_new,
/* .event_free = */ ggml_backend_metal_device_event_free,
/* .event_synchronize = */ ggml_backend_metal_device_event_synchronize,
/* .reset = */ NULL,
};
// backend registry
+1
View File
@@ -9454,6 +9454,7 @@ struct ggml_backend_device_i ggml_backend_opencl_device_i = {
/* .event_new = */ NULL,
/* .event_free = */ NULL,
/* .event_synchronize = */ NULL,
/* .reset = */ NULL,
};
}
+1
View File
@@ -1307,6 +1307,7 @@ static const struct ggml_backend_device_i ggml_backend_openvino_device_interface
/* .event_new = */ NULL,
/* .event_free = */ NULL,
/* .event_synchronize = */ NULL,
/* .reset = */ NULL,
};
struct ggml_backend_openvino_reg_context {
+1
View File
@@ -1851,6 +1851,7 @@ static const struct ggml_backend_device_i ggml_backend_rpc_device_i = {
/* .event_new = */ NULL,
/* .event_free = */ NULL,
/* .event_synchronize = */ NULL,
/* .reset = */ NULL,
};
// backend reg interface
+1
View File
@@ -5835,6 +5835,7 @@ static const ggml_backend_device_i ggml_backend_sycl_device_interface = {
/* .event_new = */ ggml_backend_sycl_device_event_new,
/* .event_free = */ ggml_backend_sycl_device_event_free,
/* .event_synchronize = */ ggml_backend_sycl_device_event_synchronize,
/* .reset = */ nullptr,
};
// backend reg
@@ -157,4 +157,5 @@ const ggml_backend_device_i ggml_backend_remoting_device_interface = {
/* .event_new = */ NULL,
/* .event_free = */ NULL,
/* .event_synchronize = */ NULL,
/* .reset = */ NULL,
};
+1
View File
@@ -17871,6 +17871,7 @@ static const struct ggml_backend_device_i ggml_backend_vk_device_i = {
/* .event_new = */ ggml_backend_vk_device_event_new,
/* .event_free = */ ggml_backend_vk_device_event_free,
/* .event_synchronize = */ ggml_backend_vk_device_event_synchronize,
/* .reset = */ nullptr,
};
static const char * ggml_backend_vk_reg_get_name(ggml_backend_reg_t reg) {
+1
View File
@@ -4457,6 +4457,7 @@ static struct ggml_backend_device_i ggml_backend_webgpu_device_i = {
/* .event_new = */ ggml_backend_webgpu_device_event_new,
/* .event_free = */ ggml_backend_webgpu_device_event_free,
/* .event_synchronize = */ ggml_backend_webgpu_device_event_synchronize,
/* .reset = */ NULL,
};
/* End GGML Backend Device Interface */
+1
View File
@@ -546,6 +546,7 @@ static ggml_backend_device_i ggml_backend_zdnn_device_i = {
/* .event_new = */ NULL,
/* .event_free = */ NULL,
/* .event_synchronize = */ NULL,
/* .reset = */ NULL,
};
//
+1
View File
@@ -646,6 +646,7 @@ static const struct ggml_backend_device_i ggml_backend_zendnn_device_i = {
/* .event_new = */ NULL,
/* .event_free = */ NULL,
/* .event_synchronize = */ NULL,
/* .reset = */ NULL,
};
// backend reg interface
+9 -2
View File
@@ -937,7 +937,7 @@ private:
int64_t t_last_load_progress_ms = 0;
void destroy() {
void destroy(bool reset_devices = false) {
spec.reset();
ctx_dft.reset();
model_dft.reset();
@@ -949,13 +949,20 @@ private:
mtmd_free(mctx);
mctx = nullptr;
// in sleep mode, we need to reset the devices to free up memory
if (reset_devices) {
for (size_t i = 0; i < ggml_backend_dev_count(); i++) {
ggml_backend_dev_reset(ggml_backend_dev_get(i));
}
}
}
void handle_sleeping_state(bool new_state) {
GGML_ASSERT(sleeping != new_state);
if (new_state) {
SRV_INF("%s", "server is entering sleeping state\n");
destroy();
destroy(true);
} else {
SRV_INF("%s", "server is exiting sleeping state\n");
if (!load_model(params_base)) {