Skip to content

Commit 62ea09b

Browse files
committed
fix: use C++ heap (new/delete) instead of ggml_context for deep-copy (#huanglawsded)
- Replaced ggml_dup_tensor+ggml_context with copy-constructor new ggml_tensor(*src) - Avoids ggml context corruption that caused SIGSEGV in split_graph - All fields (name, op, data, extra, flags, op_params, ne, nb, view_offs, buffer) copied via default memberwise copy; src[] and view_src fixed up separately - release() deletes individual tensors + graph buffer
1 parent c0a925a commit 62ea09b

2 files changed

Lines changed: 8 additions & 30 deletions

File tree

src/moe-hijacker.cpp

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,9 @@ void cascade_force_moe_consumers(
190190
// ---- Phase 2 Graph Deep-Copy ----
191191

192192
void phase2_graph_cache::release() {
193-
if (persistent_gf) { delete[] (char *)persistent_gf; persistent_gf = nullptr; }
194-
if (persistent_ctx) { ggml_free(persistent_ctx); persistent_ctx = nullptr; }
193+
for (auto * t : persistent_tensors) delete t;
195194
persistent_tensors.clear();
195+
if (persistent_gf) { delete[] (char *)persistent_gf; persistent_gf = nullptr; }
196196
valid = false;
197197
}
198198

@@ -206,28 +206,12 @@ void deep_copy_phase2_graph(
206206
int n_leafs = ggml_graph_n_leafs(src_gf);
207207
int total_t = n_nodes + n_leafs;
208208

209-
const size_t tensor_bytes = (size_t)total_t * 1024;
210-
struct ggml_init_params params = { tensor_bytes, nullptr, true };
211-
cache.persistent_ctx = ggml_init(params);
212-
if (!cache.persistent_ctx) {
213-
fprintf(stderr, "deep_copy_phase2_graph: ggml_init(%zu) failed\n", tensor_bytes);
214-
return;
215-
}
216-
217209
std::unordered_map<const ggml_tensor *, ggml_tensor *> map;
218210

219211
auto dup_tensor = [&](const ggml_tensor * src) -> ggml_tensor * {
220-
auto * dst = ggml_dup_tensor(cache.persistent_ctx, src);
221-
if (!dst) return nullptr;
222-
strncpy(dst->name, src->name, GGML_MAX_NAME - 1);
223-
dst->name[GGML_MAX_NAME - 1] = '\0';
224-
dst->op = src->op;
225-
dst->data = src->data;
226-
dst->flags = src->flags;
227-
dst->view_offs = src->view_offs;
228-
dst->extra = src->extra;
229-
memcpy(dst->op_params, src->op_params, sizeof(dst->op_params));
230-
for (int d = 0; d < GGML_MAX_DIMS; d++) dst->nb[d] = src->nb[d];
212+
auto * dst = new ggml_tensor(*src);
213+
for (int s = 0; s < GGML_MAX_SRC; s++) dst->src[s] = src->src[s];
214+
dst->view_src = src->view_src;
231215
map[src] = dst;
232216
cache.persistent_tensors.push_back(dst);
233217
return dst;
@@ -257,11 +241,8 @@ void deep_copy_phase2_graph(
257241
cache.persistent_gf->n_leafs = 0;
258242
cache.persistent_gf->nodes = (ggml_tensor **)(buf + sizeof(ggml_cgraph));
259243
cache.persistent_gf->leafs = cache.persistent_gf->nodes + total_t;
260-
cache.persistent_gf->grads = nullptr;
261-
cache.persistent_gf->grad_accs = nullptr;
262-
cache.persistent_gf->use_counts = nullptr;
263-
cache.persistent_gf->order = GGML_CGRAPH_EVAL_ORDER_LEFT_TO_RIGHT;
264-
cache.persistent_gf->uid = 0;
244+
cache.persistent_gf->order = src_gf->order;
245+
cache.persistent_gf->uid = 0;
265246

266247
for (int i = 0; i < n_leafs; i++) {
267248
auto it = map.find(ggml_graph_leaf(src_gf, i));
@@ -273,8 +254,7 @@ void deep_copy_phase2_graph(
273254
}
274255

275256
cache.valid = true;
276-
fprintf(stderr, "deep_copy_phase2_graph: copied %d nodes + %d leafs (%zu KB ctx, %zu B graph)\n",
277-
n_nodes, n_leafs, tensor_bytes / 1024, graph_bytes);
257+
fprintf(stderr, "deep_copy_phase2_graph: copied %d nodes + %d leafs\n", n_nodes, n_leafs);
278258
}
279259

280260
} // namespace moe

src/moe-hijacker.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
struct phase2_hijack;
1616
struct ggml_cgraph;
17-
struct ggml_context;
1817
struct ggml_tensor;
1918

2019
namespace moe {
@@ -38,7 +37,6 @@ void cascade_force_moe_consumers(
3837
struct phase2_graph_cache {
3938
bool valid = false;
4039
ggml_cgraph * persistent_gf = nullptr;
41-
struct ggml_context * persistent_ctx = nullptr;
4240
std::vector<ggml_tensor *> persistent_tensors;
4341

4442
void capture() { valid = true; }

0 commit comments

Comments
 (0)