mirror of
https://github.com/ikawrakow/ik_llama.cpp.git
synced 2026-02-24 15:14:10 +00:00
WIP: graph appears to work, layer is broken
This commit is contained in:
@@ -1421,6 +1421,28 @@ static void ggml_backend_sched_split_graph(ggml_backend_sched_t sched, struct gg
|
||||
for (int i = 0; i < graph->n_nodes; i++) {
|
||||
struct ggml_tensor * node = graph->nodes[i];
|
||||
int * node_backend_id = &tensor_backend_id(node);
|
||||
if (node->op == GGML_OP_REDUCE) {
|
||||
auto view_src = node->view_src;
|
||||
int src_id = -1;
|
||||
for (int j = 0; j < node->op_params[1]; ++j) {
|
||||
if (node->src[j]) {
|
||||
int * this_node_backend_id = &tensor_backend_id(node->src[j]);
|
||||
if (*this_node_backend_id == -1) {
|
||||
*this_node_backend_id = j;
|
||||
} else {
|
||||
GGML_ASSERT(*this_node_backend_id == j);
|
||||
}
|
||||
if (view_src == node->src[j]) {
|
||||
src_id = j;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (src_id >= 0) {
|
||||
int * this_node_backend_id = &tensor_backend_id(view_src);
|
||||
*this_node_backend_id = tensor_backend_id(node->src[src_id]);
|
||||
*node_backend_id = *this_node_backend_id;
|
||||
}
|
||||
}
|
||||
// do not overwrite user assignments
|
||||
if (*node_backend_id == -1) {
|
||||
*node_backend_id = ggml_backend_sched_backend_id_from_cur(sched, node);
|
||||
@@ -1652,6 +1674,8 @@ static void ggml_backend_sched_split_graph(ggml_backend_sched_t sched, struct gg
|
||||
// check if we should start a new split based on the sources of the current node
|
||||
bool need_new_split = false;
|
||||
if ((node->op == GGML_OP_ADD && node->op_params[0] == 0xff) ||
|
||||
node->op == GGML_OP_REDUCE ||
|
||||
node->op == GGML_OP_FAKE_CPY ||
|
||||
node->op_params[GGML_MAX_OP_PARAMS / sizeof(int32_t) - 1] == 0xff) {
|
||||
need_new_split = true;
|
||||
}
|
||||
@@ -1739,6 +1763,13 @@ static void ggml_backend_sched_split_graph(ggml_backend_sched_t sched, struct gg
|
||||
if (src_backend_id != cur_backend_id && !ggml_backend_sched_buffer_supported(sched, src, cur_backend_id)) {
|
||||
// create a copy of the input in the split's backend
|
||||
if (tensor_id_copy(src_id, cur_backend_id, 0) == NULL) {
|
||||
if (node->op == GGML_OP_REDUCE) {
|
||||
//printf("setting tensor_id_copy(reduce, %zu, %d, %s) to %s\n", src_id, cur_backend_id, node->name, src->name);
|
||||
tensor_id_copy(src_id, cur_backend_id, 0) = src;
|
||||
} else if (node->op == GGML_OP_FAKE_CPY && src->op == GGML_OP_REDUCE) {
|
||||
//printf("setting tensor_id_copy(fake_cpy, %zu, %d, %s) to %s\n", src_id, cur_backend_id, node->name, src->src[j]->name);
|
||||
tensor_id_copy(src_id, cur_backend_id, 0) = src->src[j];
|
||||
} else {
|
||||
ggml_backend_t backend = sched->backends[cur_backend_id];
|
||||
for (int c = 0; c < sched->n_copies; c++) {
|
||||
struct ggml_tensor * tensor_copy = ggml_dup_tensor_layout(sched->ctx, src);
|
||||
@@ -1753,6 +1784,7 @@ static void ggml_backend_sched_split_graph(ggml_backend_sched_t sched, struct gg
|
||||
int n_inputs = split->n_inputs++;
|
||||
GGML_ASSERT(n_inputs < GGML_SCHED_MAX_SPLIT_INPUTS);
|
||||
split->inputs[n_inputs] = src;
|
||||
}
|
||||
}
|
||||
node->src[j] = tensor_id_copy(src_id, cur_backend_id, sched->cur_copy);
|
||||
}
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
#include "ggml-cuda/argmax.cuh"
|
||||
#include "ggml-cuda/multiadd.cuh"
|
||||
#include "ggml-cuda/hadamard.cuh"
|
||||
#include "ggml-cuda/reduce.cuh"
|
||||
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
@@ -2956,6 +2957,11 @@ static bool ggml_cuda_compute_forward(ggml_backend_cuda_context & ctx, struct gg
|
||||
|
||||
//printf("%4d %s(%s) on device %d. time = %ld\n", i, ggml_op_name(dst->op), dst->name, ctx.device, ggml_time_us());
|
||||
switch (dst->op) {
|
||||
case GGML_OP_REDUCE:
|
||||
ggml_cuda_op_reduce(ctx, dst);
|
||||
break;
|
||||
case GGML_OP_FAKE_CPY:
|
||||
break;
|
||||
case GGML_OP_ARGMAX:
|
||||
ggml_cuda_argmax(ctx, dst);
|
||||
break;
|
||||
@@ -4066,6 +4072,8 @@ GGML_CALL static bool ggml_backend_cuda_supports_op(ggml_backend_t backend, cons
|
||||
}
|
||||
return false;
|
||||
} break;
|
||||
case GGML_OP_REDUCE:
|
||||
case GGML_OP_FAKE_CPY:
|
||||
case GGML_OP_ARGMAX:
|
||||
return true;
|
||||
case GGML_OP_HADAMARD:
|
||||
|
||||
@@ -17,7 +17,7 @@ void ggml_cuda_op_reduce([[maybe_unused]] ggml_backend_cuda_context & ctx, ggml_
|
||||
GGML_ASSERT(ggml_is_contiguous(dst));
|
||||
GGML_ASSERT(nhave >=2 && nhave <= nreduce);
|
||||
|
||||
//printf("============================== %s on device %d\n", __func__, ctx.device);
|
||||
//printf("============================== %s on device %d with %d sources\n", __func__, ctx.device, nreduce);
|
||||
|
||||
#ifdef GGML_USE_NCCL
|
||||
auto & info = ggml_cuda_info();
|
||||
|
||||
@@ -4290,10 +4290,10 @@ static const char * GGML_OP_NAME[GGML_OP_COUNT] = {
|
||||
"CROSS_ENTROPY_LOSS",
|
||||
"CROSS_ENTROPY_LOSS_BACK",
|
||||
|
||||
"GLU",
|
||||
|
||||
"REDUCE",
|
||||
"FAKE_CPY",
|
||||
|
||||
"GLU",
|
||||
};
|
||||
|
||||
static_assert(GGML_OP_COUNT == 94, "GGML_OP_COUNT != 94");
|
||||
@@ -6080,6 +6080,7 @@ struct ggml_tensor * ggml_reduce(
|
||||
if (a[j]) ++nhave;
|
||||
}
|
||||
GGML_ASSERT(nhave > 1);
|
||||
result->op = GGML_OP_REDUCE;
|
||||
result->op_params[0] = (int)op;
|
||||
result->op_params[1] = n;
|
||||
result->op_params[2] = nhave;
|
||||
@@ -6091,9 +6092,9 @@ struct ggml_tensor * ggml_fake_cpy(
|
||||
struct ggml_tensor * dst,
|
||||
struct ggml_tensor * src) {
|
||||
struct ggml_tensor * result = ggml_view_tensor(ctx, dst);
|
||||
result->op = GGML_OP_FAKE_CPY;
|
||||
result->src[0] = dst;
|
||||
result->src[1] = src;
|
||||
result->op = GGML_OP_FAKE_CPY;
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -8471,6 +8472,21 @@ struct ggml_tensor * ggml_get_rows(
|
||||
if (a->type == GGML_TYPE_I32) {
|
||||
type = a->type;
|
||||
}
|
||||
|
||||
if (a->op == GGML_OP_REDUCE) {
|
||||
//printf("======================= %s(%s)\n", __func__, a->name);
|
||||
struct ggml_tensor * result = NULL;
|
||||
for (int j = a->op_params[1]-1; j >= 0; --j) {
|
||||
if (a->src[j]) {
|
||||
struct ggml_tensor * aj = ggml_get_rows(ctx, a->src[j], b);
|
||||
if (result == NULL) result = ggml_view_tensor(ctx, aj);
|
||||
result->src[j] = aj;
|
||||
}
|
||||
}
|
||||
GGML_ASSERT(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
struct ggml_tensor * result = ggml_new_tensor_4d(ctx, type, a->ne[0], b->ne[0], b->ne[1], b->ne[2]);
|
||||
|
||||
result->op = GGML_OP_GET_ROWS;
|
||||
|
||||
Reference in New Issue
Block a user