@@ -18,6 +18,7 @@ int main(int argc, char **argv) {
18
18
.mem_buffer = NULL ,
19
19
};
20
20
struct ggml_context * ctx = ggml_init (params );
21
+ struct ggml_context * static_ctx = ggml_init (params );
21
22
22
23
// 'a' represents a parameter in the graph/neural network
23
24
struct ggml_tensor * a = ggml_new_tensor_1d (ctx , GGML_TYPE_F32 , 1 );
@@ -29,8 +30,8 @@ int main(int argc, char **argv) {
29
30
30
31
printf ("Parameter a:\n" );
31
32
printf ("a: %f\n" , ggml_get_f32_1d (a , 0 ));
32
- printf ("a->grad: %s\n" , a -> grad -> name );
33
- printf ("a->grad: %f\n" , ggml_get_f32_1d (a -> grad , 0 ));
33
+ // printf("a->grad: %s\n", ggml_graph_get_grad(b_graph, a->grad->name) );
34
+ // printf("a->grad: %f\n", ggml_get_f32_1d(a->grad, 0));
34
35
printf ("\n" );
35
36
36
37
// 'b' represents another parameter in the graph/neural network
@@ -41,8 +42,8 @@ int main(int argc, char **argv) {
41
42
ggml_set_param (ctx , b );
42
43
printf ("Parameter b:\n" );
43
44
printf ("b: %f\n" , ggml_get_f32_1d (b , 0 ));
44
- printf ("b->grad: %s\n" , b -> grad -> name );
45
- printf ("b->grad: %f\n" , ggml_get_f32_1d (b -> grad , 0 ));
45
+ // printf("b->grad: %s\n", b->grad->name);
46
+ // printf("b->grad: %f\n", ggml_get_f32_1d(b->grad, 0));
46
47
printf ("\n" );
47
48
48
49
printf ("Operation/Output tensor mul:\n" );
@@ -51,7 +52,7 @@ int main(int argc, char **argv) {
51
52
printf ("mul->op: %s\n" , ggml_op_name (mul -> op ));
52
53
printf ("mul->src0: %s\n" , mul -> src [0 ]-> name );
53
54
printf ("mul->src1: %s\n" , mul -> src [1 ]-> name );
54
- printf ("mul->grad: %s\n" , mul -> grad -> name );
55
+ // printf("mul->grad: %s\n", mul->grad->name);
55
56
printf ("\n" );
56
57
57
58
struct ggml_cgraph * f_graph = ggml_new_graph_custom (ctx , GGML_DEFAULT_GRAPH_SIZE , true);
@@ -74,25 +75,27 @@ int main(int argc, char **argv) {
74
75
ggml_graph_reset (f_graph );
75
76
76
77
struct ggml_cgraph * b_graph = ggml_graph_dup (ctx , f_graph );
77
- ggml_build_backward_expand (ctx , f_graph , b_graph , /*accumulate*/ false);
78
+ ggml_build_backward_expand (static_ctx , ctx , b_graph , /*accumulate*/ false);
78
79
ggml_graph_print (b_graph );
79
80
80
81
// Set the gradient of the output tensor (mul) which would be the value of
81
82
// the loss function.
82
- ggml_set_f32 (mul -> grad , 2.0f );
83
+ const ggml_tensor * a_grad = ggml_graph_get_grad (b_graph , a );
84
+ printf ("a->grad: %f\n" , ggml_get_f32_1d (a_grad , 0 ));
85
+ ggml_set_f32 (mul , 2.0f );
83
86
// Compute the gradients
84
87
printf ("[Perform backward pass]\n\n" );
85
88
ggml_graph_compute_with_ctx (ctx , b_graph , 1 );
86
89
87
90
printf ("Updated gradients:\n" );
88
- printf ("a->grad: %f\n" , ggml_get_f32_1d (a -> grad , 0 ));
89
- printf ("b->grad: %f\n" , ggml_get_f32_1d (b -> grad , 0 ));
91
+ // printf("a->grad: %f\n", ggml_get_f32_1d(static_ctx, ggml_graph_get_grad(b_graph, a) ));
92
+ // printf("b->grad: %f\n", ggml_get_f32_1d(b->grad, 0));
90
93
printf ("\n" );
91
94
92
95
// Now, a and b values would be updated using the gradients computed above.
93
96
float learning_rate = 0.01 ;
94
- ggml_set_f32_1d (a , 0 , ggml_get_f32_1d (a , 0 ) - learning_rate * ggml_get_f32_1d (a -> grad , 0 ));
95
- ggml_set_f32_1d (b , 0 , ggml_get_f32_1d (b , 0 ) - learning_rate * ggml_get_f32_1d (b -> grad , 0 ));
97
+ // ggml_set_f32_1d(a, 0, ggml_get_f32_1d(a, 0) - learning_rate * ggml_get_f32_1d(a->grad, 0));
98
+ // ggml_set_f32_1d(b, 0, ggml_get_f32_1d(b, 0) - learning_rate * ggml_get_f32_1d(b->grad, 0));
96
99
97
100
printf ("Updated parameters a and b:\n" );
98
101
printf ("a: %f\n" , ggml_get_f32_1d (a , 0 ));
0 commit comments