fairseq2.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include "ggml.h"
  2. #include "fairseq2.h"
  3. fairseq2_model fairseq2_model_init(ggml_context* ctx, void* hparams) {
  4. // TODO? allocate the model in the ggml_context
  5. fairseq2_model model;
  6. model.ctx = ctx;
  7. model.hparams = hparams;
  8. // TODO:
  9. // init_model_tensors(model);
  10. return model;
  11. };
  12. // Linear
  13. std::size_t Linear_size(int32_t input_dim, int32_t output_dim)
  14. {
  15. return (input_dim * output_dim * ggml_type_size(GGML_TYPE_F32)) // weight
  16. + (output_dim * ggml_type_size(GGML_TYPE_F32)); // bias
  17. };
  18. void Linear_init(
  19. Linear* self,
  20. fairseq2_model& model,
  21. const std::string &prefix,
  22. int input_dim,
  23. int output_dim,
  24. bool bias
  25. ) {
  26. self->weight = ggml_new_tensor_2d(model.ctx, GGML_TYPE_F32, output_dim, input_dim);
  27. model.tensors[prefix + ".weight"] = self->weight;
  28. if (bias) {
  29. self->bias = ggml_new_tensor_1d(model.ctx, GGML_TYPE_F32, output_dim);
  30. model.tensors[prefix + ".inner_proj.bias"] = self->bias;
  31. }
  32. }
  33. // LayerNorm
  34. std::size_t LayerNorm_size(int32_t dim)
  35. {
  36. return 2 * dim * ggml_type_size(GGML_TYPE_F32); // weight and bias
  37. };
  38. void LayerNorm_init(
  39. LayerNorm* self,
  40. fairseq2_model& model,
  41. const std::string &prefix,
  42. int dim
  43. ) {
  44. self->weight = ggml_new_tensor_1d(model.ctx, GGML_TYPE_F32, dim);
  45. model.tensors[prefix + ".weight"] = self->weight;
  46. self->bias = ggml_new_tensor_1d(model.ctx, GGML_TYPE_F32, dim);
  47. model.tensors[prefix + ".bias"] = self->bias;
  48. }
  49. std::size_t StandardFeedForwardNetwork_size(int32_t dim, int32_t inner_dim)
  50. {
  51. return LayerNorm_size(dim) + Linear_size(dim, inner_dim) + Linear_size(inner_dim, dim);
  52. };
  53. void StandardFeedForwardNetwork_init(
  54. StandardFeedForwardNetwork* self,
  55. fairseq2_model& model,
  56. const std::string &prefix,
  57. int model_dim,
  58. int inner_dim
  59. ) {
  60. Linear_init(&self->inner_proj, model, prefix + ".inner_proj", model_dim, inner_dim, true);
  61. LayerNorm_init(&self->inner_layer_norm, model, prefix + ".inner_layer_norm", inner_dim);
  62. Linear_init(&self->output_proj, model, prefix + ".output_proj", inner_dim, model_dim, true);
  63. }
  64. ggml_tensor* StandardFeedForwardNetwork_forward(
  65. StandardFeedForwardNetwork* self,
  66. ggml_tensor* seqs
  67. ) {
  68. return seqs;
  69. }