fairseq2.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #pragma once
  2. #include <map>
  3. #include <string>
  4. #include <vector>
  5. #include "ggml.h"
  6. struct fairseq2_model {
  7. ggml_context* ctx;
  8. std::map<std::string, struct ggml_tensor *> tensors;
  9. void* arch;
  10. void* hparams;
  11. };
  12. /// allocate the fairseq2 model and hyperparameters
  13. extern "C" fairseq2_model* fairseq2_model_alloc();
  14. extern "C" void fairseq2_model_free(fairseq2_model* model);
  15. struct Linear {
  16. struct ggml_tensor* weight; // out_dim * in_dim
  17. struct ggml_tensor* bias; // out_dim
  18. };
  19. std::size_t Linear_size(int32_t input_dim, int32_t output_dim);
  20. void Linear_init(Linear& self,fairseq2_model& model, const std::string &prefix, int input_dim, int output_dim, bool bias);
  21. // LayerNorm
  22. struct LayerNorm {
  23. struct ggml_tensor* weight; // model_dim
  24. struct ggml_tensor* bias; // model_dim
  25. };
  26. std::size_t LayerNorm_size(int32_t dim);
  27. void LayerNorm_init(LayerNorm& self, fairseq2_model& model, const std::string &prefix, int dim);
  28. // ConformerConvolution
  29. // struct ConformerConvolution {
  30. // // pointwise_conv1: Conv1d
  31. // // pointwise_conv1_activation: GLU
  32. // // depthwise_conv: Conv1d
  33. // // batch_norm: BatchNorm1d
  34. // // depthwise_activation: Module
  35. // // pointwise_conv2: Conv1d
  36. // };
  37. // std::size_t ConformerConvolution_size(int32_t dim);
  38. // void ConformerConvolution_init(ConformerConvolution* self, fairseq2_model& model, const std::string &prefix, int dim);
  39. struct MultiheadAttention {
  40. // num_key_value_heads: int
  41. struct Linear q_proj;
  42. struct Linear k_proj;
  43. struct Linear v_proj;
  44. // pos_encoder: Optional[PositionEncoder]
  45. struct ggml_tensor* bias_k;
  46. struct ggml_tensor* bias_v;
  47. // add_zero_attn: bool
  48. // head_scale_weight: Optional[Parameter]
  49. struct Linear output_proj;
  50. };
  51. void MultiheadAttention_init(MultiheadAttention& self, fairseq2_model& model, const std::string &prefix, int model_dim, int num_heads);
  52. struct StandardFeedForwardNetwork {
  53. struct Linear inner_proj; // ffn_inner_dim x model_dim
  54. // inner_activation -> Relu for unity
  55. // struct Dropout inner_dropout;
  56. struct LayerNorm inner_layer_norm; // ffn_inner_dim
  57. struct Linear output_proj; // model_dim x ffn_inner_dim
  58. };
  59. std::size_t StandardFeedForwardNetwork_size(int32_t dim, int32_t inner_dim);
  60. void StandardFeedForwardNetwork_init(
  61. StandardFeedForwardNetwork& self,
  62. fairseq2_model& model,
  63. const std::string &prefix,
  64. int model_dim,
  65. int inner_dim
  66. );
  67. ggml_tensor* StandardFeedForwardNetwork_forward(
  68. StandardFeedForwardNetwork* self,
  69. ggml_tensor* seqs
  70. );
  71. // Transformer
  72. enum TransformerNormOrder {
  73. TRANSFORMER_NORM_ORDER_POST = 0,
  74. TRANSFORMER_NORM_ORDER_PRE = 1,
  75. TRANSFORMER_NORM_ORDER_PRE_WITH_NORMFORMER = 2
  76. };
  77. struct TransformerDecoderLayer {
  78. struct MultiheadAttention self_attn;
  79. struct LayerNorm self_attn_norm;
  80. // self_attn_dropout: Optional[Dropout]
  81. struct LayerNorm self_attn_layer_norm;
  82. struct MultiheadAttention encoder_decoder_attn;
  83. // encoder_decoder_dropout: Optional[Dropout]
  84. struct LayerNorm encoder_decoder_attn_layer_norm;
  85. struct StandardFeedForwardNetwork ffn;
  86. // ffn_dropout: Optional[Dropout]
  87. // residual_scale: Optional[Parameter]
  88. struct LayerNorm ffn_layer_norm;
  89. // norm_order: TransformerNormOrder
  90. };
  91. void TransformerDecoderLayer_init();
  92. struct TransformerDecoder {
  93. std::vector<TransformerDecoderLayer> layers;
  94. struct LayerNorm layer_norm;
  95. };
  96. // std::size_t TransformerDecoder_size(int32_t input_dim, int32_t output_dim);
  97. // void TransformerDecoder_init(TransformerEncoder* self, fairseq2_model& model, const std::string &prefix, TransformerNormOrder norm_order);
  98. // std::size_t TransformerEncoder_size(int32_t input_dim, int32_t output_dim);
  99. // void TransformerEncoder_init(TransformerEncoder* self, fairseq2_model& model, const std::string &prefix, TransformerNormOrder norm_order);
  100. //