mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-11-03 09:22:01 +00:00 
			
		
		
		
	ggml : add more generic custom op, remove deprecated custom ops (ggml/1183)
* ggml : add more generic ggml_custom op * ggml : remove deprecated custom ops
This commit is contained in:
		
				
					committed by
					
						
						Georgi Gerganov
					
				
			
			
				
	
			
			
			
						parent
						
							e4bf72d631
						
					
				
				
					commit
					459895c326
				
			
							
								
								
									
										263
									
								
								ggml/src/ggml.c
									
									
									
									
									
								
							
							
						
						
									
										263
									
								
								ggml/src/ggml.c
									
									
									
									
									
								
							@@ -982,23 +982,18 @@ static const char * GGML_OP_NAME[GGML_OP_COUNT] = {
 | 
			
		||||
 | 
			
		||||
    "UNARY",
 | 
			
		||||
 | 
			
		||||
    "MAP_UNARY",
 | 
			
		||||
    "MAP_BINARY",
 | 
			
		||||
 | 
			
		||||
    "MAP_CUSTOM1_F32",
 | 
			
		||||
    "MAP_CUSTOM2_F32",
 | 
			
		||||
    "MAP_CUSTOM3_F32",
 | 
			
		||||
 | 
			
		||||
    "MAP_CUSTOM1",
 | 
			
		||||
    "MAP_CUSTOM2",
 | 
			
		||||
    "MAP_CUSTOM3",
 | 
			
		||||
 | 
			
		||||
    "CUSTOM",
 | 
			
		||||
 | 
			
		||||
    "CROSS_ENTROPY_LOSS",
 | 
			
		||||
    "CROSS_ENTROPY_LOSS_BACK",
 | 
			
		||||
    "OPT_STEP_ADAMW",
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static_assert(GGML_OP_COUNT == 85, "GGML_OP_COUNT != 85");
 | 
			
		||||
static_assert(GGML_OP_COUNT == 81, "GGML_OP_COUNT != 81");
 | 
			
		||||
 | 
			
		||||
static const char * GGML_OP_SYMBOL[GGML_OP_COUNT] = {
 | 
			
		||||
    "none",
 | 
			
		||||
@@ -1081,23 +1076,18 @@ static const char * GGML_OP_SYMBOL[GGML_OP_COUNT] = {
 | 
			
		||||
 | 
			
		||||
    "unary(x)",
 | 
			
		||||
 | 
			
		||||
    "f(x)",
 | 
			
		||||
    "f(x,y)",
 | 
			
		||||
 | 
			
		||||
    "custom_f32(x)",
 | 
			
		||||
    "custom_f32(x,y)",
 | 
			
		||||
    "custom_f32(x,y,z)",
 | 
			
		||||
    "map_custom(x)",
 | 
			
		||||
    "map_custom(x,y)",
 | 
			
		||||
    "map_custom(x,y,z)",
 | 
			
		||||
 | 
			
		||||
    "custom(x)",
 | 
			
		||||
    "custom(x,y)",
 | 
			
		||||
    "custom(x,y,z)",
 | 
			
		||||
 | 
			
		||||
    "cross_entropy_loss(x,y)",
 | 
			
		||||
    "cross_entropy_loss_back(x,y)",
 | 
			
		||||
    "adamw(x)",
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static_assert(GGML_OP_COUNT == 85, "GGML_OP_COUNT != 85");
 | 
			
		||||
static_assert(GGML_OP_COUNT == 81, "GGML_OP_COUNT != 81");
 | 
			
		||||
 | 
			
		||||
static_assert(GGML_OP_POOL_COUNT == 2, "GGML_OP_POOL_COUNT != 2");
 | 
			
		||||
 | 
			
		||||
@@ -4842,179 +4832,6 @@ struct ggml_tensor * ggml_unary_inplace(
 | 
			
		||||
    return ggml_unary_impl(ctx, a, op, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ggml_map_unary
 | 
			
		||||
 | 
			
		||||
static struct ggml_tensor * ggml_map_unary_impl_f32(
 | 
			
		||||
        struct ggml_context        * ctx,
 | 
			
		||||
        struct ggml_tensor         * a,
 | 
			
		||||
        const  ggml_unary_op_f32_t   fun,
 | 
			
		||||
        bool                         inplace) {
 | 
			
		||||
    struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
 | 
			
		||||
 | 
			
		||||
    ggml_set_op_params(result, (const void *) &fun, sizeof(fun));
 | 
			
		||||
 | 
			
		||||
    result->op     = GGML_OP_MAP_UNARY;
 | 
			
		||||
    result->src[0] = a;
 | 
			
		||||
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ggml_tensor * ggml_map_unary_f32(
 | 
			
		||||
        struct ggml_context        * ctx,
 | 
			
		||||
        struct ggml_tensor         * a,
 | 
			
		||||
        const  ggml_unary_op_f32_t   fun) {
 | 
			
		||||
    return ggml_map_unary_impl_f32(ctx, a, fun, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ggml_tensor * ggml_map_unary_inplace_f32(
 | 
			
		||||
        struct ggml_context        * ctx,
 | 
			
		||||
        struct ggml_tensor         * a,
 | 
			
		||||
        const  ggml_unary_op_f32_t   fun) {
 | 
			
		||||
    return ggml_map_unary_impl_f32(ctx, a, fun, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ggml_map_binary
 | 
			
		||||
 | 
			
		||||
static struct ggml_tensor * ggml_map_binary_impl_f32(
 | 
			
		||||
        struct ggml_context         * ctx,
 | 
			
		||||
        struct ggml_tensor          * a,
 | 
			
		||||
        struct ggml_tensor          * b,
 | 
			
		||||
        const  ggml_binary_op_f32_t   fun,
 | 
			
		||||
        bool                          inplace) {
 | 
			
		||||
    GGML_ASSERT(ggml_are_same_shape(a, b));
 | 
			
		||||
 | 
			
		||||
    struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
 | 
			
		||||
 | 
			
		||||
    ggml_set_op_params(result, (const void *) &fun, sizeof(fun));
 | 
			
		||||
 | 
			
		||||
    result->op     = GGML_OP_MAP_BINARY;
 | 
			
		||||
    result->src[0] = a;
 | 
			
		||||
    result->src[1] = b;
 | 
			
		||||
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ggml_tensor * ggml_map_binary_f32(
 | 
			
		||||
        struct ggml_context         * ctx,
 | 
			
		||||
        struct ggml_tensor          * a,
 | 
			
		||||
        struct ggml_tensor          * b,
 | 
			
		||||
        const  ggml_binary_op_f32_t   fun) {
 | 
			
		||||
    return ggml_map_binary_impl_f32(ctx, a, b, fun, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ggml_tensor * ggml_map_binary_inplace_f32(
 | 
			
		||||
        struct ggml_context         * ctx,
 | 
			
		||||
        struct ggml_tensor          * a,
 | 
			
		||||
        struct ggml_tensor          * b,
 | 
			
		||||
        const  ggml_binary_op_f32_t   fun) {
 | 
			
		||||
    return ggml_map_binary_impl_f32(ctx, a, b, fun, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ggml_map_custom1_f32
 | 
			
		||||
 | 
			
		||||
static struct ggml_tensor * ggml_map_custom1_impl_f32(
 | 
			
		||||
        struct ggml_context          * ctx,
 | 
			
		||||
        struct ggml_tensor           * a,
 | 
			
		||||
        const  ggml_custom1_op_f32_t   fun,
 | 
			
		||||
        bool                           inplace) {
 | 
			
		||||
    struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
 | 
			
		||||
 | 
			
		||||
    ggml_set_op_params(result, (const void *) &fun, sizeof(fun));
 | 
			
		||||
 | 
			
		||||
    result->op     = GGML_OP_MAP_CUSTOM1_F32;
 | 
			
		||||
    result->src[0] = a;
 | 
			
		||||
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ggml_tensor * ggml_map_custom1_f32(
 | 
			
		||||
        struct ggml_context          * ctx,
 | 
			
		||||
        struct ggml_tensor           * a,
 | 
			
		||||
        const  ggml_custom1_op_f32_t   fun) {
 | 
			
		||||
    return ggml_map_custom1_impl_f32(ctx, a, fun, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ggml_tensor * ggml_map_custom1_inplace_f32(
 | 
			
		||||
        struct ggml_context          * ctx,
 | 
			
		||||
        struct ggml_tensor           * a,
 | 
			
		||||
        const  ggml_custom1_op_f32_t   fun) {
 | 
			
		||||
    return ggml_map_custom1_impl_f32(ctx, a, fun, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ggml_map_custom2_f32
 | 
			
		||||
 | 
			
		||||
static struct ggml_tensor * ggml_map_custom2_impl_f32(
 | 
			
		||||
        struct ggml_context          * ctx,
 | 
			
		||||
        struct ggml_tensor           * a,
 | 
			
		||||
        struct ggml_tensor           * b,
 | 
			
		||||
        const  ggml_custom2_op_f32_t   fun,
 | 
			
		||||
        bool                           inplace) {
 | 
			
		||||
    struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
 | 
			
		||||
 | 
			
		||||
    ggml_set_op_params(result, (const void *) &fun, sizeof(fun));
 | 
			
		||||
 | 
			
		||||
    result->op     = GGML_OP_MAP_CUSTOM2_F32;
 | 
			
		||||
    result->src[0] = a;
 | 
			
		||||
    result->src[1] = b;
 | 
			
		||||
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ggml_tensor * ggml_map_custom2_f32(
 | 
			
		||||
        struct ggml_context          * ctx,
 | 
			
		||||
        struct ggml_tensor           * a,
 | 
			
		||||
        struct ggml_tensor           * b,
 | 
			
		||||
        const  ggml_custom2_op_f32_t   fun) {
 | 
			
		||||
    return ggml_map_custom2_impl_f32(ctx, a, b, fun, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ggml_tensor * ggml_map_custom2_inplace_f32(
 | 
			
		||||
        struct ggml_context          * ctx,
 | 
			
		||||
        struct ggml_tensor           * a,
 | 
			
		||||
        struct ggml_tensor           * b,
 | 
			
		||||
        const  ggml_custom2_op_f32_t   fun) {
 | 
			
		||||
    return ggml_map_custom2_impl_f32(ctx, a, b, fun, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ggml_map_custom3_f32
 | 
			
		||||
 | 
			
		||||
static struct ggml_tensor * ggml_map_custom3_impl_f32(
 | 
			
		||||
        struct ggml_context          * ctx,
 | 
			
		||||
        struct ggml_tensor           * a,
 | 
			
		||||
        struct ggml_tensor           * b,
 | 
			
		||||
        struct ggml_tensor           * c,
 | 
			
		||||
        const  ggml_custom3_op_f32_t   fun,
 | 
			
		||||
        bool                           inplace) {
 | 
			
		||||
    struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a);
 | 
			
		||||
 | 
			
		||||
    ggml_set_op_params(result, (const void *) &fun, sizeof(fun));
 | 
			
		||||
 | 
			
		||||
    result->op     = GGML_OP_MAP_CUSTOM3_F32;
 | 
			
		||||
    result->src[0] = a;
 | 
			
		||||
    result->src[1] = b;
 | 
			
		||||
    result->src[2] = c;
 | 
			
		||||
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ggml_tensor * ggml_map_custom3_f32(
 | 
			
		||||
        struct ggml_context          * ctx,
 | 
			
		||||
        struct ggml_tensor           * a,
 | 
			
		||||
        struct ggml_tensor           * b,
 | 
			
		||||
        struct ggml_tensor           * c,
 | 
			
		||||
        const  ggml_custom3_op_f32_t   fun) {
 | 
			
		||||
    return ggml_map_custom3_impl_f32(ctx, a, b, c, fun, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ggml_tensor * ggml_map_custom3_inplace_f32(
 | 
			
		||||
        struct ggml_context          * ctx,
 | 
			
		||||
        struct ggml_tensor           * a,
 | 
			
		||||
        struct ggml_tensor           * b,
 | 
			
		||||
        struct ggml_tensor           * c,
 | 
			
		||||
        const  ggml_custom3_op_f32_t   fun) {
 | 
			
		||||
    return ggml_map_custom3_impl_f32(ctx, a, b, c, fun, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ggml_map_custom1
 | 
			
		||||
 | 
			
		||||
static struct ggml_tensor * ggml_map_custom1_impl(
 | 
			
		||||
@@ -5033,7 +4850,7 @@ static struct ggml_tensor * ggml_map_custom1_impl(
 | 
			
		||||
        /*.n_tasks  =*/ n_tasks,
 | 
			
		||||
        /*.userdata =*/ userdata
 | 
			
		||||
    };
 | 
			
		||||
    ggml_set_op_params(result, (const void *) ¶ms, sizeof(params));
 | 
			
		||||
    ggml_set_op_params(result, ¶ms, sizeof(params));
 | 
			
		||||
 | 
			
		||||
    result->op     = GGML_OP_MAP_CUSTOM1;
 | 
			
		||||
    result->src[0] = a;
 | 
			
		||||
@@ -5078,7 +4895,7 @@ static struct ggml_tensor * ggml_map_custom2_impl(
 | 
			
		||||
        /*.n_tasks  =*/ n_tasks,
 | 
			
		||||
        /*.userdata =*/ userdata
 | 
			
		||||
    };
 | 
			
		||||
    ggml_set_op_params(result, (const void *) ¶ms, sizeof(params));
 | 
			
		||||
    ggml_set_op_params(result, ¶ms, sizeof(params));
 | 
			
		||||
 | 
			
		||||
    result->op     = GGML_OP_MAP_CUSTOM2;
 | 
			
		||||
    result->src[0] = a;
 | 
			
		||||
@@ -5127,7 +4944,7 @@ static struct ggml_tensor * ggml_map_custom3_impl(
 | 
			
		||||
        /*.n_tasks  =*/ n_tasks,
 | 
			
		||||
        /*.userdata =*/ userdata
 | 
			
		||||
    };
 | 
			
		||||
    ggml_set_op_params(result, (const void *) ¶ms, sizeof(params));
 | 
			
		||||
    ggml_set_op_params(result, ¶ms, sizeof(params));
 | 
			
		||||
 | 
			
		||||
    result->op     = GGML_OP_MAP_CUSTOM3;
 | 
			
		||||
    result->src[0] = a;
 | 
			
		||||
@@ -5159,6 +4976,66 @@ struct ggml_tensor * ggml_map_custom3_inplace(
 | 
			
		||||
    return ggml_map_custom3_impl(ctx, a, b, c, fun, n_tasks, userdata, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ggml_tensor * ggml_custom_4d(
 | 
			
		||||
        struct ggml_context * ctx,
 | 
			
		||||
        enum ggml_type        type,
 | 
			
		||||
        int64_t               ne0,
 | 
			
		||||
        int64_t               ne1,
 | 
			
		||||
        int64_t               ne2,
 | 
			
		||||
        int64_t               ne3,
 | 
			
		||||
        struct ggml_tensor ** args,
 | 
			
		||||
        int                   n_args,
 | 
			
		||||
        ggml_custom_op_t      fun,
 | 
			
		||||
        int                   n_tasks,
 | 
			
		||||
        void                * userdata) {
 | 
			
		||||
 | 
			
		||||
    GGML_ASSERT(n_args < GGML_MAX_SRC);
 | 
			
		||||
 | 
			
		||||
    struct ggml_tensor * result = ggml_new_tensor_4d(ctx, type, ne0, ne1, ne2, ne3);
 | 
			
		||||
 | 
			
		||||
    struct ggml_custom_op_params params = {
 | 
			
		||||
        /*.fun      =*/ fun,
 | 
			
		||||
        /*.n_tasks  =*/ n_tasks,
 | 
			
		||||
        /*.userdata =*/ userdata
 | 
			
		||||
    };
 | 
			
		||||
    ggml_set_op_params(result, ¶ms, sizeof(params));
 | 
			
		||||
 | 
			
		||||
    result->op = GGML_OP_CUSTOM;
 | 
			
		||||
    for (int i = 0; i < n_args; i++) {
 | 
			
		||||
        result->src[i] = args[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ggml_tensor * ggml_custom_inplace(
 | 
			
		||||
        struct ggml_context * ctx,
 | 
			
		||||
        struct ggml_tensor  * a,
 | 
			
		||||
        struct ggml_tensor ** args,
 | 
			
		||||
        int                   n_args,
 | 
			
		||||
        ggml_custom_op_t      fun,
 | 
			
		||||
        int                   n_tasks,
 | 
			
		||||
        void                * userdata) {
 | 
			
		||||
 | 
			
		||||
    GGML_ASSERT(n_args < GGML_MAX_SRC - 1);
 | 
			
		||||
 | 
			
		||||
    struct ggml_tensor * result = ggml_view_tensor(ctx, a);
 | 
			
		||||
 | 
			
		||||
    struct ggml_custom_op_params params = {
 | 
			
		||||
        /*.fun      =*/ fun,
 | 
			
		||||
        /*.n_tasks  =*/ n_tasks,
 | 
			
		||||
        /*.userdata =*/ userdata
 | 
			
		||||
    };
 | 
			
		||||
    ggml_set_op_params(result, ¶ms, sizeof(params));
 | 
			
		||||
 | 
			
		||||
    result->op = GGML_OP_CUSTOM;
 | 
			
		||||
    result->src[0] = a;
 | 
			
		||||
    for (int i = 0; i < n_args; i++) {
 | 
			
		||||
        result->src[i + 1] = args[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
// ggml_cross_entropy_loss
 | 
			
		||||
 | 
			
		||||
struct ggml_tensor * ggml_cross_entropy_loss(
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user