test1.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. #include "ggml/ggml.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int main(int argc, const char ** argv) {
  5. const int n_threads = 2;
  6. struct ggml_init_params params = {
  7. .mem_size = 128*1024*1024,
  8. .mem_buffer = NULL,
  9. .no_alloc = false,
  10. };
  11. struct ggml_context * ctx0 = ggml_init(params);
  12. {
  13. struct ggml_tensor * x = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 1);
  14. ggml_set_param(ctx0, x);
  15. struct ggml_tensor * a = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 1);
  16. struct ggml_tensor * b = ggml_mul(ctx0, x, x);
  17. struct ggml_tensor * f = ggml_mul(ctx0, b, a);
  18. // a*x^2
  19. // 2*a*x
  20. ggml_print_objects(ctx0);
  21. struct ggml_cgraph gf = ggml_build_forward(f);
  22. struct ggml_cgraph gb = ggml_build_backward(ctx0, &gf, false);
  23. ggml_set_f32(x, 2.0f);
  24. ggml_set_f32(a, 3.0f);
  25. ggml_graph_reset(&gf);
  26. ggml_set_f32(f->grad, 1.0f);
  27. ggml_graph_compute_with_ctx(ctx0, &gb, n_threads);
  28. printf("f = %f\n", ggml_get_f32_1d(f, 0));
  29. printf("df/dx = %f\n", ggml_get_f32_1d(x->grad, 0));
  30. GGML_ASSERT(ggml_get_f32_1d(f, 0) == 12.0f);
  31. GGML_ASSERT(ggml_get_f32_1d(x->grad, 0) == 12.0f);
  32. ggml_set_f32(x, 3.0f);
  33. ggml_graph_reset(&gf);
  34. ggml_set_f32(f->grad, 1.0f);
  35. ggml_graph_compute_with_ctx(ctx0, &gb, n_threads);
  36. printf("f = %f\n", ggml_get_f32_1d(f, 0));
  37. printf("df/dx = %f\n", ggml_get_f32_1d(x->grad, 0));
  38. GGML_ASSERT(ggml_get_f32_1d(f, 0) == 27.0f);
  39. GGML_ASSERT(ggml_get_f32_1d(x->grad, 0) == 18.0f);
  40. ggml_graph_dump_dot(&gf, NULL, "test1-1-forward.dot");
  41. ggml_graph_dump_dot(&gb, &gf, "test1-1-backward.dot");
  42. }
  43. ///////////////////////////////////////////////////////////////
  44. {
  45. struct ggml_tensor * x1 = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 1);
  46. struct ggml_tensor * x2 = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 1);
  47. struct ggml_tensor * x3 = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 1);
  48. ggml_set_f32(x1, 3.0f);
  49. ggml_set_f32(x2, 1.0f);
  50. ggml_set_f32(x3, 0.0f);
  51. ggml_set_param(ctx0, x1);
  52. ggml_set_param(ctx0, x2);
  53. struct ggml_tensor * y = ggml_add(ctx0, ggml_mul(ctx0, x1, x1), ggml_mul(ctx0, x1, x2));
  54. struct ggml_cgraph gf = ggml_build_forward(y);
  55. struct ggml_cgraph gb = ggml_build_backward(ctx0, &gf, false);
  56. ggml_graph_reset(&gf);
  57. ggml_set_f32(y->grad, 1.0f);
  58. ggml_graph_compute_with_ctx(ctx0, &gb, n_threads);
  59. printf("y = %f\n", ggml_get_f32_1d(y, 0));
  60. printf("df/dx1 = %f\n", ggml_get_f32_1d(x1->grad, 0));
  61. printf("df/dx2 = %f\n", ggml_get_f32_1d(x2->grad, 0));
  62. GGML_ASSERT(ggml_get_f32_1d(y, 0) == 12.0f);
  63. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 0) == 7.0f);
  64. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 0) == 3.0f);
  65. struct ggml_tensor * g1 = x1->grad;
  66. struct ggml_tensor * g2 = x2->grad;
  67. struct ggml_cgraph gbb = ggml_build_backward(ctx0, &gb, true);
  68. ggml_graph_reset(&gb);
  69. ggml_set_f32(g1->grad, 1.0f);
  70. ggml_set_f32(g2->grad, 1.0f);
  71. ggml_graph_compute_with_ctx(ctx0, &gbb, n_threads);
  72. printf("H * [1, 1] = [ %f %f ]\n", ggml_get_f32_1d(x1->grad, 0), ggml_get_f32_1d(x2->grad, 0));
  73. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 0) == 3.0f);
  74. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 0) == 1.0f);
  75. ggml_graph_dump_dot(&gf, NULL, "test1-2-forward.dot");
  76. ggml_graph_dump_dot(&gb, &gf, "test1-2-backward.dot");
  77. }
  78. ///////////////////////////////////////////////////////////////
  79. {
  80. struct ggml_tensor * x1 = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 1);
  81. struct ggml_tensor * x2 = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 1);
  82. ggml_set_param(ctx0, x1);
  83. ggml_set_param(ctx0, x2);
  84. struct ggml_tensor * y = ggml_mul(ctx0, ggml_add(ctx0, ggml_mul(ctx0, x1, x1), ggml_mul(ctx0, x1, x2)), x1);
  85. struct ggml_cgraph gf = ggml_build_forward(y);
  86. struct ggml_cgraph gb = ggml_build_backward(ctx0, &gf, false);
  87. ggml_set_f32(x1, 3.0f);
  88. ggml_set_f32(x2, 4.0f);
  89. ggml_graph_reset(&gf);
  90. ggml_set_f32(y->grad, 1.0f);
  91. ggml_graph_compute_with_ctx(ctx0, &gb, n_threads);
  92. printf("y = %f\n", ggml_get_f32_1d(y, 0));
  93. printf("df/dx1 = %f\n", ggml_get_f32_1d(x1->grad, 0));
  94. printf("df/dx2 = %f\n", ggml_get_f32_1d(x2->grad, 0));
  95. GGML_ASSERT(ggml_get_f32_1d(y, 0) == 63.0f);
  96. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 0) == 51.0f);
  97. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 0) == 9.0f);
  98. ggml_graph_dump_dot(&gf, NULL, "test1-3-forward.dot");
  99. ggml_graph_dump_dot(&gb, &gf, "test1-3-backward.dot");
  100. }
  101. ///////////////////////////////////////////////////////////////
  102. {
  103. struct ggml_tensor * x1 = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 1);
  104. struct ggml_tensor * x2 = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 1);
  105. struct ggml_tensor * x3 = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 1);
  106. ggml_set_param(ctx0, x1);
  107. ggml_set_param(ctx0, x2);
  108. ggml_set_param(ctx0, x3);
  109. struct ggml_tensor * y = ggml_mul(ctx0, ggml_mul(ctx0, ggml_mul(ctx0, x1, x1), ggml_mul(ctx0, x2, x2)), x3);
  110. struct ggml_cgraph gf = ggml_build_forward(y);
  111. struct ggml_cgraph gb = ggml_build_backward(ctx0, &gf, false);
  112. ggml_set_f32(x1, 1.0f);
  113. ggml_set_f32(x2, 2.0f);
  114. ggml_set_f32(x3, 3.0f);
  115. ggml_graph_reset(&gf);
  116. ggml_set_f32(y->grad, 1.0f);
  117. ggml_graph_compute_with_ctx(ctx0, &gb, n_threads);
  118. printf("y = %f\n", ggml_get_f32_1d(y, 0));
  119. printf("df/dx1 = %f\n", ggml_get_f32_1d(x1->grad, 0));
  120. printf("df/dx2 = %f\n", ggml_get_f32_1d(x2->grad, 0));
  121. printf("df/dx3 = %f\n", ggml_get_f32_1d(x3->grad, 0));
  122. GGML_ASSERT(ggml_get_f32_1d(y, 0) == 12.0f);
  123. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 0) == 24.0f);
  124. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 0) == 12.0f);
  125. GGML_ASSERT(ggml_get_f32_1d(x3->grad, 0) == 4.0f);
  126. struct ggml_tensor * g1 = x1->grad;
  127. struct ggml_tensor * g2 = x2->grad;
  128. struct ggml_tensor * g3 = x3->grad;
  129. struct ggml_cgraph gbb = ggml_build_backward(ctx0, &gb, true);
  130. ggml_graph_reset(&gb);
  131. ggml_set_f32(g1->grad, 1.0f);
  132. ggml_set_f32(g2->grad, 1.0f);
  133. ggml_set_f32(g3->grad, 1.0f);
  134. ggml_graph_compute_with_ctx(ctx0, &gbb, n_threads);
  135. printf("H * [1, 1, 1] = [ %f %f %f ]\n",
  136. ggml_get_f32_1d(x1->grad, 0),
  137. ggml_get_f32_1d(x2->grad, 0),
  138. ggml_get_f32_1d(x3->grad, 0));
  139. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 0) == 56.0f);
  140. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 0) == 34.0f);
  141. GGML_ASSERT(ggml_get_f32_1d(x3->grad, 0) == 12.0f);
  142. ggml_graph_dump_dot(&gf, NULL, "test1-4-forward.dot");
  143. ggml_graph_dump_dot(&gb, &gf, "test1-4-backward.dot");
  144. }
  145. ///////////////////////////////////////////////////////////////
  146. {
  147. struct ggml_tensor * x1 = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 3);
  148. struct ggml_tensor * x2 = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 3);
  149. ggml_set_param(ctx0, x1);
  150. ggml_set_param(ctx0, x2);
  151. struct ggml_tensor * y = ggml_sum(ctx0, ggml_mul(ctx0, x1, x2));
  152. struct ggml_cgraph gf = ggml_build_forward(y);
  153. struct ggml_cgraph gb = ggml_build_backward(ctx0, &gf, false);
  154. ggml_set_f32(x1, 3.0f);
  155. ggml_set_f32(x2, 5.0f);
  156. ggml_graph_reset(&gf);
  157. ggml_set_f32(y->grad, 1.0f);
  158. ggml_graph_compute_with_ctx(ctx0, &gb, n_threads);
  159. printf("y = %f\n", ggml_get_f32_1d(y, 0));
  160. printf("df/dx1 = %f %f %f\n",
  161. ggml_get_f32_1d(x1->grad, 0),
  162. ggml_get_f32_1d(x1->grad, 1),
  163. ggml_get_f32_1d(x1->grad, 2));
  164. printf("df/dx2 = %f %f %f\n",
  165. ggml_get_f32_1d(x2->grad, 0),
  166. ggml_get_f32_1d(x2->grad, 1),
  167. ggml_get_f32_1d(x2->grad, 2));
  168. GGML_ASSERT(ggml_get_f32_1d(y, 0) == 45.0f);
  169. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 0) == 5.0f);
  170. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 0) == 3.0f);
  171. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 1) == 5.0f);
  172. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 1) == 3.0f);
  173. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 2) == 5.0f);
  174. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 2) == 3.0f);
  175. ggml_graph_dump_dot(&gf, NULL, "test1-5-forward.dot");
  176. ggml_graph_dump_dot(&gb, &gf, "test1-5-backward.dot");
  177. }
  178. ///////////////////////////////////////////////////////////////
  179. {
  180. struct ggml_tensor * x1 = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 3);
  181. struct ggml_tensor * x2 = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 3);
  182. ggml_set_param(ctx0, x1);
  183. ggml_set_param(ctx0, x2);
  184. struct ggml_tensor * y =
  185. ggml_sum(ctx0,
  186. ggml_add(ctx0,
  187. ggml_mul(ctx0, x1, x2),
  188. ggml_mul(ctx0,
  189. ggml_repeat(ctx0, ggml_new_f32(ctx0, -2.0f), x1),
  190. ggml_mul(ctx0, x1, x1)
  191. )
  192. )
  193. );
  194. struct ggml_cgraph gf = ggml_build_forward(y);
  195. struct ggml_cgraph gb = ggml_build_backward(ctx0, &gf, false);
  196. ggml_set_f32(x1, 3.0f);
  197. ggml_set_f32(x2, 5.0f);
  198. ggml_graph_reset(&gf);
  199. ggml_set_f32(y->grad, 1.0f);
  200. ggml_graph_compute_with_ctx(ctx0, &gb, n_threads);
  201. printf("y = %f\n", ggml_get_f32_1d(y, 0));
  202. printf("df/dx1 = %f %f %f\n",
  203. ggml_get_f32_1d(x1->grad, 0),
  204. ggml_get_f32_1d(x1->grad, 1),
  205. ggml_get_f32_1d(x1->grad, 2));
  206. printf("df/dx2 = %f %f %f\n",
  207. ggml_get_f32_1d(x2->grad, 0),
  208. ggml_get_f32_1d(x2->grad, 1),
  209. ggml_get_f32_1d(x2->grad, 2));
  210. GGML_ASSERT(ggml_get_f32_1d(y, 0) == -9.0f);
  211. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 0) == -7.0f);
  212. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 1) == -7.0f);
  213. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 2) == -7.0f);
  214. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 0) == 3.0f);
  215. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 1) == 3.0f);
  216. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 2) == 3.0f);
  217. ggml_graph_dump_dot(&gf, NULL, "test1-6-forward.dot");
  218. ggml_graph_dump_dot(&gb, &gf, "test1-6-backward.dot");
  219. }
  220. ///////////////////////////////////////////////////////////////
  221. {
  222. struct ggml_tensor * x1 = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 3);
  223. struct ggml_tensor * x2 = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 3);
  224. ggml_set_param(ctx0, x1);
  225. ggml_set_param(ctx0, x2);
  226. struct ggml_tensor * y =
  227. ggml_sum(ctx0,
  228. ggml_sub(ctx0,
  229. ggml_mul(ctx0, x1, x2),
  230. ggml_mul(ctx0,
  231. ggml_mul(ctx0, x1, x1),
  232. ggml_repeat(ctx0, ggml_new_f32(ctx0, -2.0f), x1)
  233. )
  234. )
  235. );
  236. struct ggml_cgraph gf = ggml_build_forward(y);
  237. struct ggml_cgraph gb = ggml_build_backward(ctx0, &gf, false);
  238. ggml_set_f32(x1, 3.0f);
  239. ggml_set_f32(x2, 5.0f);
  240. ggml_graph_reset(&gf);
  241. ggml_set_f32(y->grad, 1.0f);
  242. ggml_graph_compute_with_ctx(ctx0, &gb, n_threads);
  243. printf("y = %f\n", ggml_get_f32_1d(y, 0));
  244. printf("df/dx1 = %f %f %f\n",
  245. ggml_get_f32_1d(x1->grad, 0),
  246. ggml_get_f32_1d(x1->grad, 1),
  247. ggml_get_f32_1d(x1->grad, 2));
  248. printf("df/dx2 = %f %f %f\n",
  249. ggml_get_f32_1d(x2->grad, 0),
  250. ggml_get_f32_1d(x2->grad, 1),
  251. ggml_get_f32_1d(x2->grad, 2));
  252. GGML_ASSERT(ggml_get_f32_1d(y, 0) == 99.0f);
  253. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 0) == 17.0f);
  254. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 1) == 17.0f);
  255. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 2) == 17.0f);
  256. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 0) == 3.0f);
  257. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 1) == 3.0f);
  258. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 2) == 3.0f);
  259. ggml_graph_dump_dot(&gf, NULL, "test1-7-forward.dot");
  260. ggml_graph_dump_dot(&gb, &gf, "test1-7-backward.dot");
  261. }
  262. ///////////////////////////////////////////////////////////////
  263. {
  264. struct ggml_tensor * x1 = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 3);
  265. struct ggml_tensor * x2 = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 3);
  266. ggml_set_param(ctx0, x1);
  267. ggml_set_param(ctx0, x2);
  268. struct ggml_tensor * y =
  269. ggml_abs(ctx0,
  270. ggml_sub(ctx0, x1, x2)
  271. );
  272. struct ggml_cgraph gf = ggml_build_forward(y);
  273. struct ggml_cgraph gb = ggml_build_backward(ctx0, &gf, false);
  274. ggml_set_f32(x1, 3.0f);
  275. ggml_set_f32(x2, 5.0f);
  276. ggml_graph_reset(&gf);
  277. ggml_set_f32(y->grad, 1.0f);
  278. ggml_graph_compute_with_ctx(ctx0, &gb, n_threads);
  279. printf("y = %f\n", ggml_get_f32_1d(y, 0));
  280. printf("df/dx1 = %f %f %f\n",
  281. ggml_get_f32_1d(x1->grad, 0),
  282. ggml_get_f32_1d(x1->grad, 1),
  283. ggml_get_f32_1d(x1->grad, 2));
  284. printf("df/dx2 = %f %f %f\n",
  285. ggml_get_f32_1d(x2->grad, 0),
  286. ggml_get_f32_1d(x2->grad, 1),
  287. ggml_get_f32_1d(x2->grad, 2));
  288. GGML_ASSERT(ggml_get_f32_1d(y, 0) == 2.0f);
  289. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 0) == -1.0f);
  290. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 1) == -1.0f);
  291. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 2) == -1.0f);
  292. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 0) == 1.0f);
  293. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 1) == 1.0f);
  294. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 2) == 1.0f);
  295. ggml_set_f32(x1, 7.0f);
  296. ggml_set_f32(x2, 5.0f);
  297. ggml_graph_reset(&gf);
  298. ggml_set_f32(y->grad, 1.0f);
  299. ggml_graph_compute_with_ctx(ctx0, &gb, n_threads);
  300. printf("y = %f\n", ggml_get_f32_1d(y, 0));
  301. printf("df/dx1 = %f %f %f\n",
  302. ggml_get_f32_1d(x1->grad, 0),
  303. ggml_get_f32_1d(x1->grad, 1),
  304. ggml_get_f32_1d(x1->grad, 2));
  305. printf("df/dx2 = %f %f %f\n",
  306. ggml_get_f32_1d(x2->grad, 0),
  307. ggml_get_f32_1d(x2->grad, 1),
  308. ggml_get_f32_1d(x2->grad, 2));
  309. GGML_ASSERT(ggml_get_f32_1d(y, 0) == 2.0f);
  310. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 0) == 1.0f);
  311. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 1) == 1.0f);
  312. GGML_ASSERT(ggml_get_f32_1d(x1->grad, 2) == 1.0f);
  313. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 0) == -1.0f);
  314. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 1) == -1.0f);
  315. GGML_ASSERT(ggml_get_f32_1d(x2->grad, 2) == -1.0f);
  316. ggml_graph_dump_dot(&gf, NULL, "test1-8-forward.dot");
  317. ggml_graph_dump_dot(&gb, &gf, "test1-8-backward.dot");
  318. }
  319. ggml_free(ctx0);
  320. return 0;
  321. }