11#include " ggml-rpc.h"
22#include " ggml-impl.h"
33#include " ggml-backend-impl.h"
4+ #include " ggml-cpp.h"
45
56#include < cinttypes>
67#include < string>
@@ -853,12 +854,13 @@ bool rpc_server::get_alloc_size(const rpc_msg_get_alloc_size_req & request, rpc_
853854 /* .no_alloc =*/ true ,
854855 };
855856
856- struct ggml_context * ctx = ggml_init (params);
857+ ggml_context_ptr ctx_ptr { ggml_init (params) };
858+ GGML_ASSERT (ctx_ptr != nullptr );
859+ ggml_context * ctx = ctx_ptr.get ();
857860 ggml_tensor * tensor = deserialize_tensor (ctx, &request.tensor );
858861
859862 if (tensor == nullptr ) {
860863 GGML_LOG_ERROR (" Null tensor pointer passed to server get_alloc_size function.\n " );
861- ggml_free (ctx);
862864 return false ;
863865 }
864866
@@ -871,7 +873,6 @@ bool rpc_server::get_alloc_size(const rpc_msg_get_alloc_size_req & request, rpc_
871873
872874 response.alloc_size = ggml_backend_buft_get_alloc_size (buft,tensor);
873875
874- ggml_free (ctx);
875876 return true ;
876877}
877878
@@ -985,11 +986,12 @@ bool rpc_server::set_tensor(const std::vector<uint8_t> & input) {
985986 /* .mem_buffer =*/ NULL ,
986987 /* .no_alloc =*/ true ,
987988 };
988- struct ggml_context * ctx = ggml_init (params);
989+ ggml_context_ptr ctx_ptr { ggml_init (params) };
990+ GGML_ASSERT (ctx_ptr != nullptr );
991+ ggml_context * ctx = ctx_ptr.get ();
989992 ggml_tensor * tensor = deserialize_tensor (ctx, in_tensor);
990993 if (tensor == nullptr ) {
991994 GGML_LOG_ERROR (" [%s] error deserializing tensor\n " , __func__);
992- ggml_free (ctx);
993995 return false ;
994996 }
995997 GGML_PRINT_DEBUG (" [%s] buffer: %p, data: %p, offset: %" PRIu64 " , size: %zu\n " , __func__, (void *)tensor->buffer , tensor->data , offset, size);
@@ -1016,7 +1018,6 @@ bool rpc_server::set_tensor(const std::vector<uint8_t> & input) {
10161018 printf (" [%s] saved to '%s'\n " , __func__, cache_file.c_str ());
10171019 }
10181020 ggml_backend_tensor_set (tensor, data, offset, size);
1019- ggml_free (ctx);
10201021 return true ;
10211022}
10221023
@@ -1060,11 +1061,12 @@ bool rpc_server::set_tensor_hash(const std::vector<uint8_t> & input, rpc_msg_set
10601061 /* .mem_buffer =*/ NULL ,
10611062 /* .no_alloc =*/ true ,
10621063 };
1063- struct ggml_context * ctx = ggml_init (params);
1064+ ggml_context_ptr ctx_ptr { ggml_init (params) };
1065+ GGML_ASSERT (ctx_ptr != nullptr );
1066+ ggml_context * ctx = ctx_ptr.get ();
10641067 ggml_tensor * tensor = deserialize_tensor (ctx, in_tensor);
10651068 if (tensor == nullptr ) {
10661069 GGML_LOG_ERROR (" [%s] error deserializing tensor\n " , __func__);
1067- ggml_free (ctx);
10681070 return false ;
10691071 }
10701072 GGML_PRINT_DEBUG (" [%s] buffer: %p, data: %p, offset: %" PRIu64 " , size: %zu, hash: %" PRIx64 " \n " , __func__, (void *)tensor->buffer , tensor->data , offset, size, *hash);
@@ -1080,7 +1082,6 @@ bool rpc_server::set_tensor_hash(const std::vector<uint8_t> & input, rpc_msg_set
10801082 }
10811083 ggml_backend_tensor_set (tensor, cached_file.data (), offset, size);
10821084 response.result = 1 ;
1083- ggml_free (ctx);
10841085 return true ;
10851086}
10861087
@@ -1090,11 +1091,12 @@ bool rpc_server::init_tensor(const rpc_msg_init_tensor_req & request) {
10901091 /* .mem_buffer =*/ NULL ,
10911092 /* .no_alloc =*/ true ,
10921093 };
1093- struct ggml_context * ctx = ggml_init (params);
1094+ ggml_context_ptr ctx_ptr { ggml_init (params) };
1095+ GGML_ASSERT (ctx_ptr != nullptr );
1096+ ggml_context * ctx = ctx_ptr.get ();
10941097 ggml_tensor * tensor = deserialize_tensor (ctx, &request.tensor );
10951098 if (tensor == nullptr ) {
10961099 GGML_LOG_ERROR (" Null tensor pointer passed to server init_tensor function.\n " );
1097- ggml_free (ctx);
10981100 return false ;
10991101 }
11001102
@@ -1110,11 +1112,9 @@ bool rpc_server::init_tensor(const rpc_msg_init_tensor_req & request) {
11101112 // This pointer can either be passed around client/server, or probably better stored server-side and kept track of.
11111113 // Currently unimplemented.
11121114 GGML_LOG_ERROR (" tensor->extra populated by the backend, this is currently unsupported.\n " );
1113- ggml_free (ctx);
11141115 return false ;
11151116 }
11161117
1117- ggml_free (ctx);
11181118 return true ;
11191119}
11201120
@@ -1124,11 +1124,12 @@ bool rpc_server::get_tensor(const rpc_msg_get_tensor_req & request, std::vector<
11241124 /* .mem_buffer =*/ NULL ,
11251125 /* .no_alloc =*/ true ,
11261126 };
1127- struct ggml_context * ctx = ggml_init (params);
1127+ ggml_context_ptr ctx_ptr { ggml_init (params) };
1128+ GGML_ASSERT (ctx_ptr != nullptr );
1129+ ggml_context * ctx = ctx_ptr.get ();
11281130 ggml_tensor * tensor = deserialize_tensor (ctx, &request.tensor );
11291131 if (tensor == nullptr ) {
11301132 GGML_LOG_ERROR (" [%s] error deserializing tensor\n " , __func__);
1131- ggml_free (ctx);
11321133 return false ;
11331134 }
11341135 GGML_PRINT_DEBUG (" [%s] buffer: %p, data: %p, offset: %" PRIu64 " , size: %" PRIu64 " \n " , __func__, (void *)tensor->buffer , tensor->data , request.offset , request.size );
@@ -1147,7 +1148,6 @@ bool rpc_server::get_tensor(const rpc_msg_get_tensor_req & request, std::vector<
11471148
11481149 response.resize (request.size , 0 );
11491150 ggml_backend_tensor_get (tensor, response.data (), request.offset , request.size );
1150- ggml_free (ctx);
11511151 return true ;
11521152}
11531153
@@ -1157,12 +1157,14 @@ bool rpc_server::copy_tensor(const rpc_msg_copy_tensor_req & request, rpc_msg_co
11571157 /* .mem_buffer =*/ NULL,
11581158 /* .no_alloc =*/ true,
11591159 };
1160- struct ggml_context * ctx = ggml_init(params);
1160+ ggml_context_ptr ctx_ptr { ggml_init (params) };
1161+ GGML_ASSERT (ctx_ptr != nullptr );
1162+ ggml_context * ctx = ctx_ptr.get();
1163+
11611164 ggml_tensor * src = deserialize_tensor(ctx, &request.src);
11621165 ggml_tensor * dst = deserialize_tensor(ctx, &request.dst);
11631166 if (src == nullptr || dst == nullptr ) {
11641167 GGML_LOG_ERROR (" [%s] error deserializing tensors\n " , __func__);
1165- ggml_free (ctx);
11661168 return false ;
11671169 }
11681170
@@ -1180,15 +1182,13 @@ bool rpc_server::copy_tensor(const rpc_msg_copy_tensor_req & request, rpc_msg_co
11801182 dst_data + src_size,
11811183 dst_base,
11821184 dst_base + dst_buf_sz);
1183- ggml_free (ctx);
11841185 return false ;
11851186 }
11861187
11871188 GGML_PRINT_DEBUG (" [%s] src->buffer: %p, dst->buffer: %p\n " ,
11881189 __func__, (void *) src->buffer, (void *) dst->buffer);
11891190
11901191 response.result = ggml_backend_buffer_copy_tensor(src, dst);
1191- ggml_free (ctx);
11921192 return true ;
11931193}
11941194
@@ -1242,7 +1242,9 @@ bool rpc_server::graph_compute(const std::vector<uint8_t> & input, rpc_msg_graph
12421242 /* .mem_buffer =*/ NULL ,
12431243 /* .no_alloc =*/ true ,
12441244 };
1245- struct ggml_context * ctx = ggml_init (params);
1245+ ggml_context_ptr ctx_ptr { ggml_init (params) };
1246+ GGML_ASSERT (ctx_ptr != nullptr );
1247+ ggml_context * ctx = ctx_ptr.get ();
12461248 struct ggml_cgraph * graph = ggml_new_graph_custom (ctx, n_nodes, false );
12471249 graph->n_nodes = n_nodes;
12481250 std::unordered_map<uint64_t , const rpc_tensor*> tensor_ptrs;
@@ -1257,7 +1259,6 @@ bool rpc_server::graph_compute(const std::vector<uint8_t> & input, rpc_msg_graph
12571259 }
12581260 ggml_status status = ggml_backend_graph_compute (backend, graph);
12591261 response.result = status;
1260- ggml_free (ctx);
12611262 return true ;
12621263}
12631264
0 commit comments