diff --git a/ggml/src/ggml-alloc.c b/ggml/src/ggml-alloc.c index 65eeaedc42..3bda9abbe0 100644 --- a/ggml/src/ggml-alloc.c +++ b/ggml/src/ggml-alloc.c @@ -805,14 +805,11 @@ static void ggml_gallocr_alloc_graph_impl(ggml_gallocr_t galloc, struct ggml_cgr if (ggml_impl_is_view(parent)) { struct ggml_tensor * view_src = parent->view_src; struct hash_node * view_src_hn = ggml_gallocr_hash_get(galloc, view_src); - // output views keep their source alive until graph completion - if (!(parent->flags & GGML_TENSOR_FLAG_OUTPUT)) { - view_src_hn->n_views -= 1; - AT_PRINTF("view_src %s: %d children, %d views\n", - view_src->name, view_src_hn->n_children, view_src_hn->n_views); - if (view_src_hn->n_views == 0 && view_src_hn->n_children == 0 && view_src_hn->allocated) { - ggml_gallocr_free_node(galloc, view_src); - } + view_src_hn->n_views -= 1; + AT_PRINTF("view_src %s: %d children, %d views\n", + view_src->name, view_src_hn->n_children, view_src_hn->n_views); + if (view_src_hn->n_views == 0 && view_src_hn->n_children == 0 && view_src_hn->allocated) { + ggml_gallocr_free_node(galloc, view_src); } } else if (p_hn->allocated) { diff --git a/src/llama-sampler.cpp b/src/llama-sampler.cpp index b3f57f123c..cc9630c832 100644 --- a/src/llama-sampler.cpp +++ b/src/llama-sampler.cpp @@ -570,7 +570,8 @@ struct llama_sampler_backend_probe { static llama_sampler_backend_probe llama_sampler_backend_probe_graph( llama_sampler * sampler, int64_t n_candidates, - uint32_t max_nodes) { + uint32_t max_nodes, + bool with_candidates) { ggml_init_params params = { /*.mem_size =*/ max_nodes * ggml_tensor_overhead() + ggml_graph_overhead_custom(max_nodes, false), /*.mem_buffer =*/ nullptr, @@ -589,7 +590,7 @@ static llama_sampler_backend_probe llama_sampler_backend_probe_graph( /*.logits =*/ ggml_new_tensor_1d(ctx, GGML_TYPE_F32, n_candidates), /*.probs =*/ nullptr, /*.sampled =*/ nullptr, - /*.candidates =*/ ggml_new_tensor_1d(ctx, GGML_TYPE_I32, n_candidates), + /*.candidates =*/ with_candidates ? ggml_new_tensor_1d(ctx, GGML_TYPE_I32, n_candidates) : nullptr, }; if (sampler->iface->backend_reset) { @@ -630,7 +631,7 @@ static bool llama_sampler_backend_support( return true; } - auto probe = llama_sampler_backend_probe_graph(smpl, 1024*1024, GGML_DEFAULT_GRAPH_SIZE); + auto probe = llama_sampler_backend_probe_graph(smpl, 1024*1024, GGML_DEFAULT_GRAPH_SIZE, true); for (int i = 0; i < ggml_graph_n_nodes(probe.gf); i++) { struct ggml_tensor * op = ggml_graph_node(probe.gf, i); @@ -750,7 +751,7 @@ static bool llama_sampler_chain_backend_init( res = res && res_cur; } - auto probe = llama_sampler_backend_probe_graph(smpl, 1024*1024, GGML_DEFAULT_GRAPH_SIZE); + auto probe = llama_sampler_backend_probe_graph(smpl, 1024*1024, GGML_DEFAULT_GRAPH_SIZE, false); chain->n_nodes = llama_sampler_backend_probe_n_nodes(probe); return res; diff --git a/tests/test-alloc.cpp b/tests/test-alloc.cpp index ad8dd21c97..6d5428493e 100644 --- a/tests/test-alloc.cpp +++ b/tests/test-alloc.cpp @@ -388,25 +388,6 @@ static void test_view_inplace() { GGML_ASSERT(backend.context->allocated_total() <= 24); } -static void test_output_view_lifetime() { - dummy_backend backend = dummy_backend_init(SIZE_MAX); - auto [ctx, graph, ctx_ptr] = make_context(); - - ggml_tensor * x[5]; - x[0] = make_input_1d(ctx, 4); - x[1] = ggml_scale(ctx, x[0], 2.0f); - x[2] = ggml_reshape_2d(ctx, x[1], 2, 2); - x[3] = ggml_sum(ctx, x[2]); - x[4] = ggml_pad(ctx, x[3], 3, 0, 0, 0); - assign_names(ctx); - - ggml_set_output(x[2]); - ggml_gallocr_ptr galloc = allocate_graph(graph, x[4], &backend.buffer_type); - check_all_allocated(graph); - check_max_size(ctx); - GGML_ASSERT(!memory_overlap(x[2], x[4])); -} - static void test_reuse_and_free() { dummy_backend backend = dummy_backend_init(40); auto [ctx, graph, ctx_ptr] = make_context(); @@ -616,7 +597,6 @@ int main() { run("test_not_enough_chunks", test_not_enough_chunks); run("test_fill_leftover_space", test_fill_leftover_space); run("test_view_inplace", test_view_inplace); - run("test_output_view_lifetime", test_output_view_lifetime); run("test_reuse_and_free", test_reuse_and_free); run("test_merge_free_block(32)", []() { test_merge_free_block(32); }); run("test_merge_free_block(SIZE_MAX)", []() { test_merge_free_block(SIZE_MAX); }); diff --git a/tests/test-backend-sampler.cpp b/tests/test-backend-sampler.cpp index 8820248303..f244c7e944 100644 --- a/tests/test-backend-sampler.cpp +++ b/tests/test-backend-sampler.cpp @@ -1924,11 +1924,9 @@ static void test_backend_multi_output_sampling_chain(const test_params & params) llama_batch_free(batch); - const int32_t n_reused_before_repeat = llama_perf_context(test_ctx.ctx.get()).n_reused; batch = make_batch(2); GGML_ASSERT(llama_decode(test_ctx.ctx.get(), batch) == 0); llama_batch_free(batch); - GGML_ASSERT(llama_perf_context(test_ctx.ctx.get()).n_reused > n_reused_before_repeat); printf("backend multi-output sampling chain test PASSED\n"); }