From c3b94c7bd180e9e930d49debfbb590cd2eebecac Mon Sep 17 00:00:00 2001 From: Wei-Chen Wang Date: Tue, 21 Nov 2023 21:39:00 -0500 Subject: [PATCH] Support StarCoder on CPU (#78) --- .gitignore | 2 + kernels/avx/matmul_avx_int8_int4.cc | 2 +- kernels/neon/matmul_neon_int8_int4.cc | 8 +- llm/application/chat.cc | 78 ++++- llm/include/GPTBigCodeTokenizer.h | 52 ++++ llm/include/Generate.h | 7 +- llm/include/model.h | 7 +- .../nn_modules/Fp32GPTBigCodeAttention.h | 47 +++ .../nn_modules/Fp32GPTBigCodeDecoder.h | 44 +++ .../nn_modules/Fp32GPTBigCodeDecoderLayer.h | 49 +++ .../nn_modules/Fp32GPTBigCodeForCausalLM.h | 32 ++ .../nn_modules/Int4GPTBigCodeAttention.h | 46 +++ .../nn_modules/Int4GPTBigCodeDecoder.h | 44 +++ .../nn_modules/Int4GPTBigCodeDecoderLayer.h | 49 +++ .../nn_modules/Int4GPTBigCodeForCausalLM.h | 32 ++ llm/include/ops/linear.h | 5 +- llm/models/starcoder_vocab.bin | Bin 0 -> 492917 bytes llm/src/GPTBigCodeGenerate.cc | 193 ++++++++++++ llm/src/GPTBigCodeTokenizer.cc | 131 ++++++++ llm/src/nn_modules/Fp32GPTBigCodeAttention.cc | 286 +++++++++++++++++ llm/src/nn_modules/Fp32GPTBigCodeDecoder.cc | 157 ++++++++++ .../nn_modules/Fp32GPTBigCodeDecoderLayer.cc | 125 ++++++++ .../nn_modules/Fp32GPTBigCodeForCausalLM.cc | 38 +++ llm/src/nn_modules/Int4GPTBigCodeAttention.cc | 292 ++++++++++++++++++ llm/src/nn_modules/Int4GPTBigCodeDecoder.cc | 160 ++++++++++ .../nn_modules/Int4GPTBigCodeDecoderLayer.cc | 128 ++++++++ .../nn_modules/Int4GPTBigCodeForCausalLM.cc | 40 +++ llm/tools/model_quantizer.py | 97 +++++- llm/tools/starcoder_exporter.py | 170 ++++++++++ 29 files changed, 2310 insertions(+), 11 deletions(-) create mode 100644 llm/include/GPTBigCodeTokenizer.h create mode 100644 llm/include/nn_modules/Fp32GPTBigCodeAttention.h create mode 100644 llm/include/nn_modules/Fp32GPTBigCodeDecoder.h create mode 100644 llm/include/nn_modules/Fp32GPTBigCodeDecoderLayer.h create mode 100644 llm/include/nn_modules/Fp32GPTBigCodeForCausalLM.h create mode 100644 llm/include/nn_modules/Int4GPTBigCodeAttention.h create mode 100644 llm/include/nn_modules/Int4GPTBigCodeDecoder.h create mode 100644 llm/include/nn_modules/Int4GPTBigCodeDecoderLayer.h create mode 100644 llm/include/nn_modules/Int4GPTBigCodeForCausalLM.h create mode 100644 llm/models/starcoder_vocab.bin create mode 100644 llm/src/GPTBigCodeGenerate.cc create mode 100644 llm/src/GPTBigCodeTokenizer.cc create mode 100644 llm/src/nn_modules/Fp32GPTBigCodeAttention.cc create mode 100644 llm/src/nn_modules/Fp32GPTBigCodeDecoder.cc create mode 100644 llm/src/nn_modules/Fp32GPTBigCodeDecoderLayer.cc create mode 100644 llm/src/nn_modules/Fp32GPTBigCodeForCausalLM.cc create mode 100644 llm/src/nn_modules/Int4GPTBigCodeAttention.cc create mode 100644 llm/src/nn_modules/Int4GPTBigCodeDecoder.cc create mode 100644 llm/src/nn_modules/Int4GPTBigCodeDecoderLayer.cc create mode 100644 llm/src/nn_modules/Int4GPTBigCodeForCausalLM.cc create mode 100644 llm/tools/starcoder_exporter.py diff --git a/.gitignore b/.gitignore index da1afdc4..58a3408e 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,8 @@ assets/ *.bin +!llama_vocab.bin +!starcoder_vocab.bin *.zip *.txt !requirements.txt diff --git a/kernels/avx/matmul_avx_int8_int4.cc b/kernels/avx/matmul_avx_int8_int4.cc index 2eda1726..eceaecc4 100644 --- a/kernels/avx/matmul_avx_int8_int4.cc +++ b/kernels/avx/matmul_avx_int8_int4.cc @@ -349,7 +349,7 @@ void MatmulOperator::mat_mul_accelerator_int8_int4_fast_no_offset(struct matmul_ } threads_args[j].params = params; // pthread_create(&thread_pool[j], NULL, fast_int8_int4_zp_no_offset_over_column_unroll2block, &threads_args[j]); - pool_enqueue(pool, &threads_args[j], NULL); + pool_enqueue(pool, &threads_args[j], '\0'); } // // Join threads // for (j = 0; j < num_thread; j++) pthread_join(thread_pool[j], NULL); diff --git a/kernels/neon/matmul_neon_int8_int4.cc b/kernels/neon/matmul_neon_int8_int4.cc index a1089599..3fa783d3 100644 --- a/kernels/neon/matmul_neon_int8_int4.cc +++ b/kernels/neon/matmul_neon_int8_int4.cc @@ -357,12 +357,14 @@ inline static void* matmul_int8_int4_no_offset_over_column_unroll128(void* args) sumv2 = vmlaq_n_f32(sumv2, vcvtq_f32_s32(int_sum2), s_2); sumv3 = vmlaq_n_f32(sumv3, vcvtq_f32_s32(int_sum3), s_3); } - if (params->bias.data_ptr) + if (params->bias.data_ptr) { params->C.data_ptr[i * n + j] = params->bias.data_ptr[j] + vaddvq_f32(sumv0) + vaddvq_f32(sumv1) + vaddvq_f32(sumv2) + vaddvq_f32(sumv3); - else + } + else { params->C.data_ptr[i * n + j] = vaddvq_f32(sumv0) + vaddvq_f32(sumv1) + vaddvq_f32(sumv2) + vaddvq_f32(sumv3); + } } } @@ -586,7 +588,7 @@ void MatmulOperator::mat_mul_accelerator_int8_int4_fast_no_offset(struct matmul_ // #else // pthread_create(&thread_pool[j], NULL, matmul_int8_int4_no_offset_over_column_unroll128, &threads_args[j]); // #endif - pool_enqueue(pool, &threads_args[j], NULL); + pool_enqueue(pool, &threads_args[j], '\0'); } // Join threads // for (j = 0; j < num_thread; j++) pthread_join(thread_pool[j], NULL); diff --git a/llm/application/chat.cc b/llm/application/chat.cc index fe35a4b1..5b12f98d 100644 --- a/llm/application/chat.cc +++ b/llm/application/chat.cc @@ -7,7 +7,9 @@ std::map model_config = { {"OPT_125m", OPT_125M}, {"OPT_1.3B", OPT_1_3B}, {"OPT_6.7B", OPT_6_7B}, {"LLaMA_7B", LLaMA_7B}, {"LLaMA2_7B_chat", LLaMA_7B}, {"7b", LLaMA_7B}, {"LLaMA2_13B_chat", LLaMA_13B}, {"13b", LLaMA_13B}, - {"CodeLLaMA_7B_Instruct", CodeLLaMA_7B}, {"CodeLLaMA_13B_Instruct", CodeLLaMA_13B}}; + {"CodeLLaMA_7B_Instruct", CodeLLaMA_7B}, {"CodeLLaMA_13B_Instruct", CodeLLaMA_13B}, + {"StarCoder", StarCoder_15_5B}, {"StarCoder_15.5B", StarCoder_15_5B} + }; std::map model_path = {{"OPT_125m", "models/OPT_125m"}, {"OPT_1.3B", "models/OPT_1.3B"}, @@ -18,7 +20,10 @@ std::map model_path = {{"OPT_125m", "models/OPT_125m"} {"7b", "models/LLaMA_7B_2_chat"}, {"13b", "models/LLaMA_13B_2_chat"}, {"CodeLLaMA_7B_Instruct", "models/CodeLLaMA_7B_Instruct"}, - {"CodeLLaMA_13B_Instruct", "models/CodeLLaMA_13B_Instruct"}}; + {"CodeLLaMA_13B_Instruct", "models/CodeLLaMA_13B_Instruct"}, + {"StarCoder", "models/StarCoder"}, + {"StarCoder_15.5B", "models/StarCoder"} + }; std::map data_format_list = { {"FP32", FP32}, {"INT8", QINT8}, {"INT4", INT4}, {"int4", INT4}, {"fp32", FP32}, @@ -43,6 +48,15 @@ bool isCodeLLaMA(std::string s) { return false; } +bool isStarCoder(std::string s) { + std::string StarCoder_prefix = "StarCoder"; + + if (s.substr(0, StarCoder_prefix.size()) == StarCoder_prefix) + return true; + else + return false; +} + bool convertToBool(const char* str) { if (strcmp(str, "true") == 0 || strcmp(str, "1") == 0) { return true; @@ -124,7 +138,15 @@ int main(int argc, char* argv[]) { std::cout << "Using AWQ for 4bit quantization: https://github.com/mit-han-lab/llm-awq" << std::endl; else std::cout << "Using data format: " << target_data_format << std::endl; - } else { // OPT + } + else if (isStarCoder(target_model)) { + std::cout << "Using model: " + target_model << std::endl; + if (target_data_format == "INT4" || target_data_format == "int4") + std::cout << "Using AWQ for 4bit quantization: https://github.com/mit-han-lab/llm-awq" << std::endl; + else + std::cout << "Using data format: " << target_data_format << std::endl; + } + else { // OPT target_model = "OPT6.7B"; target_data_format = "INT8"; std::cout << "Using model: " + target_model << std::endl; @@ -241,6 +263,56 @@ int main(int argc, char* argv[]) { std::cout << std::endl; std::cerr << "At this time, we only support FP32 and INT4 for LLaMA7B." << std::endl; } + } else if (isStarCoder(target_model)) { + int format_id = data_format_list[target_data_format]; + + // Load model + std::cout << "Loading model... " << std::flush; + int model_id = model_config[target_model]; + std::string m_path = model_path[target_model]; + + #ifdef MODEL_PREFIX + m_path = MODEL_PREFIX + m_path; + #endif + + struct opt_params generation_config; + generation_config.n_predict = 128; + // generation_config.repeat_penalty = 1.1f; + generation_config.top_k = 0; + generation_config.temp = 0.2f; + generation_config.n_vocab = 49152; + + if (format_id == FP32) { + Fp32GPTBigCodeForCausalLM model = Fp32GPTBigCodeForCausalLM(m_path, get_opt_model_config(model_id)); + std::cout << "Finished!" << std::endl; + + // Get input from the user + while (true) { + std::cout << "USER: "; + std::string input; + std::getline(std::cin, input); + std::cout << input; + + GPTBigCodeGenerate(m_path, &model, StarCoder_FP32, input, generation_config, "models/starcoder_vocab.bin", true, false); + } + } else if (format_id == INT4) { + m_path = "INT4/" + m_path; + Int4GPTBigCodeForCausalLM model = Int4GPTBigCodeForCausalLM(m_path, get_opt_model_config(model_id)); + std::cout << "Finished!" << std::endl; + + // Get input from the user + while (true) { + std::cout << "USER: "; + std::string input; + std::getline(std::cin, input); + std::cout << input; + + GPTBigCodeGenerate(m_path, &model, StarCoder_INT4, input, generation_config, "models/starcoder_vocab.bin", true, false); + } + } else { + std::cout << std::endl; + std::cerr << "At this time, we only support FP32 and INT4 for StarCoder." << std::endl; + } } else { // OPT #ifdef QM_CUDA printf("OPT is not supported with CUDA backend yet."); diff --git a/llm/include/GPTBigCodeTokenizer.h b/llm/include/GPTBigCodeTokenizer.h new file mode 100644 index 00000000..07549123 --- /dev/null +++ b/llm/include/GPTBigCodeTokenizer.h @@ -0,0 +1,52 @@ +/* + +Adapted from llama.cpp and starcoder.cpp: +https://github.com/ggerganov/llama.cpp +https://github.com/bigcode-project/starcoder.cpp + +*/ + +#ifndef GPTBIGCODE_TOKENIZER_H +#define GPTBIGCODE_TOKENIZER_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// Vocab utils +// + +std::string trim(const std::string & s); + +std::string replace( + const std::string & s, + const std::string & from, + const std::string & to); + +struct starcoder_vocab { + std::map token_to_id; + std::map id_to_token; + std::vector special_tokens; + + void add_special_token(const std::string & token); +}; + +/* + * Tokenizer + */ +starcoder_vocab starcoder_init_vocab(const std::string & vocab_file); + +const char* starcoder_id_to_token(starcoder_vocab& vocab, int id); + +int starcoder_tokenize(const starcoder_vocab &vocab, const std::string &text, std::vector &final_tokens, int n_max_tokens); + +#endif diff --git a/llm/include/Generate.h b/llm/include/Generate.h index b772714d..76c764b9 100644 --- a/llm/include/Generate.h +++ b/llm/include/Generate.h @@ -20,8 +20,10 @@ Adapted from llama.cpp: #include "Fp32OPTForCausalLM.h" #include "Fp32llamaForCausalLM.h" +#include "Fp32GPTBigCodeForCausalLM.h" #include "Int4OPTForCausalLM.h" #include "Int4llamaForCausalLM.h" +#include "Int4GPTBigCodeForCausalLM.h" #include "OPTForCausalLM.h" #include "OPTTokenizer.h" #include "operators.h" @@ -98,8 +100,11 @@ std::vector OPTGenerate(void* model, int model_type, std::vector input const struct opt_params generation_config, Encoder* encoder = NULL, bool interactive = false, bool voicechat = false); -enum { OPT_INT8, LLaMA_FP32, LLaMA_INT4, OPT_FP32, OPT_INT4 }; +enum { OPT_INT8, LLaMA_FP32, LLaMA_INT4, OPT_FP32, OPT_INT4, StarCoder_FP32, StarCoder_INT4 }; std::string LLaMAGenerate(std::string param_path, void* model, int model_type, std::string text, const struct opt_params generation_config, std::string voc_path, bool interactive, bool voicechat); +std::string GPTBigCodeGenerate(std::string param_path, void *model_ptr, int model_type, std::string text, const struct opt_params generation_config, + std::string voc_path, bool interactive, bool voicechat); + #endif // GENERATE_H diff --git a/llm/include/model.h b/llm/include/model.h index 507f2304..27f1c193 100644 --- a/llm/include/model.h +++ b/llm/include/model.h @@ -27,7 +27,7 @@ struct model_config { rms_norm_eps(rms_norm_eps) {} }; -enum { OPT_125M, OPT_1_3B, OPT_6_7B, LLaMA_7B, LLaMA_13B, CodeLLaMA_7B, CodeLLaMA_13B }; +enum { OPT_125M, OPT_1_3B, OPT_6_7B, LLaMA_7B, LLaMA_13B, CodeLLaMA_7B, CodeLLaMA_13B, StarCoder_15_5B }; enum { FP32, QINT8, INT4 }; const struct model_config opt_6_7B(1, 32, 32, 2048, 4096, 16384, 50272, 1, 0); @@ -37,6 +37,8 @@ const struct model_config llama_7B(1, 32, 32, 2048, 4096, 11008, 32000, 1, 1e-6) const struct model_config llama_13B(1, 40, 40, 2048, 5120, 13824, 32000, 1, 1e-6); const struct model_config codellama_7B(1, 32, 32, 2048, 4096, 11008, 32016, 1, 1e-5); const struct model_config codellama_13B(1, 40, 40, 2048, 5120, 13824, 32016, 1, 1e-5); +// const struct model_config starcoder_15_5B(1, 32, 32, 2048, 4096, 11008, 32000, 1, 0); // temporary +const struct model_config starcoder_15_5B(1, 48, 40, 2048, 6144, 24576, 49152, 1, 0); static struct model_config get_opt_model_config(int choise) { struct model_config ret; switch (choise) { @@ -61,6 +63,9 @@ static struct model_config get_opt_model_config(int choise) { case CodeLLaMA_13B: ret = codellama_13B; break; + case StarCoder_15_5B: + ret = starcoder_15_5B; + break; default: throw("Unsupported model choice."); break; diff --git a/llm/include/nn_modules/Fp32GPTBigCodeAttention.h b/llm/include/nn_modules/Fp32GPTBigCodeAttention.h new file mode 100644 index 00000000..3f27aa18 --- /dev/null +++ b/llm/include/nn_modules/Fp32GPTBigCodeAttention.h @@ -0,0 +1,47 @@ +#include + +#include "common.h" +#include "operators.h" + +struct Fp32GPTBigCodeAttention_output { + Matrix3D attn_output; + Matrix3D attn_probs_reshaped; + std::pair, Matrix3D> past_key_value; +}; +struct Fp32GPTBigCodeAttention_input { + Matrix3D hidden_states; + Matrix3D attention_mask; + Matrix3D past_key, past_value; + bool has_past_key_value = false; + int layer_idx; + + Fp32GPTBigCodeAttention_input(Matrix3D hidden_states_, Matrix3D attention_mask_, int layer_idx_) + : hidden_states(hidden_states_), attention_mask(attention_mask_), layer_idx(layer_idx_) {} + + Fp32GPTBigCodeAttention_input(Matrix3D hidden_states_, Matrix3D attention_mask_, Matrix3D past_key_, + Matrix3D past_value_, bool has_past_key_value_, int layer_idx_) + : hidden_states(hidden_states_), + attention_mask(attention_mask_), + past_key(past_key_), + past_value(past_value_), + has_past_key_value(has_past_key_value_), + layer_idx(layer_idx_) {} +}; + +class Fp32GPTBigCodeAttention { + public: + Fp32GPTBigCodeAttention(std::string param_path, const struct model_config config); + Fp32GPTBigCodeAttention() {} + static void initialized_memory(const struct model_config config); + struct Fp32GPTBigCodeAttention_output forward(const struct Fp32GPTBigCodeAttention_input &input); + + private: + void unshape(Matrix3D shaped, Matrix3D unshape, int sqlen); + void shape_qkv(Matrix3D unshape, Matrix3D shaped_q, Matrix3D shaped_k, + Matrix3D shaped_v, int sqlen); + float scaling; + int embed_dim, num_heads, head_dim, kv_heads, kv_dim; + BMM_F32T qk_bmm, pv_bmm; + Linear_FP c_attn, c_proj; + std::string profile_name = "Fp32GPTBigCodeAttention"; +}; diff --git a/llm/include/nn_modules/Fp32GPTBigCodeDecoder.h b/llm/include/nn_modules/Fp32GPTBigCodeDecoder.h new file mode 100644 index 00000000..0e52e918 --- /dev/null +++ b/llm/include/nn_modules/Fp32GPTBigCodeDecoder.h @@ -0,0 +1,44 @@ +#include +#include +#include + +#include "Fp32GPTBigCodeDecoderLayer.h" +#include "common.h" +#include "operators.h" + +struct Fp32GPTBigCodeDecoder_output { + Matrix3D last_hidden_state; + std::vector> past_keys, past_values; +}; +struct Fp32GPTBigCodeDecoder_input { + Matrix3D input_ids; + std::vector> past_keys, past_values; + bool has_past_keys_values; + + Fp32GPTBigCodeDecoder_input(Matrix3D input_ids_) : input_ids(input_ids_) { has_past_keys_values = false; } + Fp32GPTBigCodeDecoder_input(Matrix3D input_ids_, std::vector> past_keys_, + std::vector> past_values_) + : input_ids(input_ids_), past_keys(past_keys_), past_values(past_values_) { + has_past_keys_values = true; + } +}; + +class Fp32GPTBigCodeDecoder { + public: + Fp32GPTBigCodeDecoder(std::string param_path, const struct model_config config); + Fp32GPTBigCodeDecoder(){}; + Matrix3D prepare_decoder_attention_mask(int length, int past_length); + Matrix3D get_position_embed(int sql_length, int past_length); + struct Fp32GPTBigCodeDecoder_output forward(const struct Fp32GPTBigCodeDecoder_input& input); + Embedding wte, wpe; + int voc_size, embed_dim, padding_idx, hidden_dim, num_heads, max_position_embeddings; + std::vector layers; + LayerNorm ln_f; + std::string profile_name = "Fp32GPTBigCodeDecoder"; + + private: + float* attention_mask_buf; + float* pos_embeds_buf; + float* last_hidden_states_buf; + float* hidden_states_buf; +}; diff --git a/llm/include/nn_modules/Fp32GPTBigCodeDecoderLayer.h b/llm/include/nn_modules/Fp32GPTBigCodeDecoderLayer.h new file mode 100644 index 00000000..247ce8df --- /dev/null +++ b/llm/include/nn_modules/Fp32GPTBigCodeDecoderLayer.h @@ -0,0 +1,49 @@ +#include "Fp32GPTBigCodeAttention.h" +#include "common.h" +#include "operators.h" + +struct Fp32GPTBigCodeDecoderLayer_output { + Matrix3D hidden_states; + Matrix3D attentions; + std::pair, Matrix3D> past_key_value; + + Fp32GPTBigCodeDecoderLayer_output(Matrix3D hidden_states_, Matrix3D attentions_, + std::pair, Matrix3D> past_key_value_) { + hidden_states = hidden_states_; + attentions = attentions_; + past_key_value = past_key_value_; + }; +}; +struct Fp32GPTBigCodeDecoderLayer_input { + Matrix3D hidden_states; + Matrix3D attention_mask; + Matrix3D past_key, past_value; + bool has_past_key_value = false; + + Fp32GPTBigCodeDecoderLayer_input(Matrix3D &hidden_states_, Matrix3D &attention_mask_) { + hidden_states = hidden_states_; + attention_mask = attention_mask_; + has_past_key_value = false; + } + + Fp32GPTBigCodeDecoderLayer_input(Matrix3D &hidden_states_, Matrix3D &attention_mask_, + Matrix3D past_key_, Matrix3D past_value_) { + hidden_states = hidden_states_; + attention_mask = attention_mask_; + past_key = past_key_; + past_value = past_value_; + has_past_key_value = true; + } +}; + +class Fp32GPTBigCodeDecoderLayer { + public: + Fp32GPTBigCodeDecoderLayer(std::string param_path, const struct model_config config, int layer_idx); + struct Fp32GPTBigCodeDecoderLayer_output forward(const struct Fp32GPTBigCodeDecoderLayer_input &input); + + int embed_dim, num_attention_heads, hidden_dim, layer_idx; + LayerNorm ln_1, ln_2; // from torch_int.nn + Linear_FP fc1, fc2; + Fp32GPTBigCodeAttention attn; + std::string profile_name = "Fp32GPTBigCodeDecoderLayer"; +}; diff --git a/llm/include/nn_modules/Fp32GPTBigCodeForCausalLM.h b/llm/include/nn_modules/Fp32GPTBigCodeForCausalLM.h new file mode 100644 index 00000000..1f1d9a10 --- /dev/null +++ b/llm/include/nn_modules/Fp32GPTBigCodeForCausalLM.h @@ -0,0 +1,32 @@ +#include "Fp32GPTBigCodeDecoder.h" + +struct Fp32GPTBigCodeForCausalLM_output { + Matrix3D logits; + std::vector> past_keys, past_values; +}; +struct Fp32GPTBigCodeForCausalLM_input { + Matrix3D input_ids; + std::vector> past_keys, past_values; + bool has_past_keys_values; + + Fp32GPTBigCodeForCausalLM_input() {} + Fp32GPTBigCodeForCausalLM_input(Matrix3D input_ids_) : input_ids(input_ids_) { has_past_keys_values = false; } + Fp32GPTBigCodeForCausalLM_input(Matrix3D input_ids_, std::vector> past_keys_, + std::vector> past_values_) + : input_ids(input_ids_), past_keys(past_keys_), past_values(past_values_) { + has_past_keys_values = true; + } +}; + +class Fp32GPTBigCodeForCausalLM { + public: + Fp32GPTBigCodeForCausalLM(std::string param_path, const struct model_config config); + struct Fp32GPTBigCodeForCausalLM_output forward(const struct Fp32GPTBigCodeForCausalLM_input& input); + + private: + Fp32GPTBigCodeDecoder decoder; + Linear_FP lm_head; + std::string profile_name = "Fp32GPTBigCodeForCausalLM"; + float* logits_output; + float* lm_head_weight; +}; diff --git a/llm/include/nn_modules/Int4GPTBigCodeAttention.h b/llm/include/nn_modules/Int4GPTBigCodeAttention.h new file mode 100644 index 00000000..d10259ba --- /dev/null +++ b/llm/include/nn_modules/Int4GPTBigCodeAttention.h @@ -0,0 +1,46 @@ +#include + +#include "common.h" +#include "operators.h" + +struct Int4GPTBigCodeAttention_output { + Matrix3D attn_output; + Matrix3D attn_probs_reshaped; + std::pair, Matrix3D> past_key_value; +}; +struct Int4GPTBigCodeAttention_input { + Matrix3D hidden_states; + Matrix3D attention_mask; + Matrix3D past_key, past_value; + bool has_past_key_value = false; + int layer_idx; + + Int4GPTBigCodeAttention_input(Matrix3D hidden_states_, Matrix3D attention_mask_, int layer_idx_) + : hidden_states(hidden_states_), attention_mask(attention_mask_), layer_idx(layer_idx_) {} + + Int4GPTBigCodeAttention_input(Matrix3D hidden_states_, Matrix3D attention_mask_, Matrix3D past_key_, + Matrix3D past_value_, bool has_past_key_value_, int layer_idx_) + : hidden_states(hidden_states_), + attention_mask(attention_mask_), + past_key(past_key_), + past_value(past_value_), + has_past_key_value(has_past_key_value_), + layer_idx(layer_idx_) {} +}; + +class Int4GPTBigCodeAttention { + public: + Int4GPTBigCodeAttention(std::string param_path, const struct model_config config); + Int4GPTBigCodeAttention() {} + static void initialized_memory(const struct model_config config); + struct Int4GPTBigCodeAttention_output forward(const struct Int4GPTBigCodeAttention_input &input); + + private: + void unshape(Matrix3D shaped, Matrix3D unshape, int sqlen); + void shape_qkv(Matrix3D unshape, Matrix3D shaped_q, Matrix3D shaped_k, + Matrix3D shaped_v, int sqlen); + int embed_dim, num_heads, head_dim, kv_heads, kv_dim; + BMM_F32T qk_bmm, pv_bmm; + Linear_FP_int4 c_attn, c_proj; + std::string profile_name = "Int4GPTBigCodeAttention"; +}; diff --git a/llm/include/nn_modules/Int4GPTBigCodeDecoder.h b/llm/include/nn_modules/Int4GPTBigCodeDecoder.h new file mode 100644 index 00000000..538877c3 --- /dev/null +++ b/llm/include/nn_modules/Int4GPTBigCodeDecoder.h @@ -0,0 +1,44 @@ +#include +#include +#include + +#include "Int4GPTBigCodeDecoderLayer.h" +#include "common.h" +#include "operators.h" + +struct Int4GPTBigCodeDecoder_output { + Matrix3D last_hidden_state; + std::vector> past_keys, past_values; +}; +struct Int4GPTBigCodeDecoder_input { + Matrix3D input_ids; + std::vector> past_keys, past_values; + bool has_past_keys_values; + + Int4GPTBigCodeDecoder_input(Matrix3D input_ids_) : input_ids(input_ids_) { has_past_keys_values = false; } + Int4GPTBigCodeDecoder_input(Matrix3D input_ids_, std::vector> past_keys_, + std::vector> past_values_) + : input_ids(input_ids_), past_keys(past_keys_), past_values(past_values_) { + has_past_keys_values = true; + } +}; + +class Int4GPTBigCodeDecoder { + public: + Int4GPTBigCodeDecoder(std::string param_path, const struct model_config config); + Int4GPTBigCodeDecoder(){}; + Matrix3D prepare_decoder_attention_mask(int length, int past_length); + Matrix3D get_position_embed(int sql_length, int past_length); + struct Int4GPTBigCodeDecoder_output forward(const struct Int4GPTBigCodeDecoder_input& input); + Embedding wte, wpe; + int voc_size, embed_dim, padding_idx, hidden_dim, num_heads, max_position_embeddings; + std::vector layers; + LayerNorm ln_f; + std::string profile_name = "Int4GPTBigCodeDecoder"; + + private: + float* attention_mask_buf; + float* pos_embeds_buf; + float* last_hidden_states_buf; + float* hidden_states_buf; +}; diff --git a/llm/include/nn_modules/Int4GPTBigCodeDecoderLayer.h b/llm/include/nn_modules/Int4GPTBigCodeDecoderLayer.h new file mode 100644 index 00000000..0364b1d3 --- /dev/null +++ b/llm/include/nn_modules/Int4GPTBigCodeDecoderLayer.h @@ -0,0 +1,49 @@ +#include "Int4GPTBigCodeAttention.h" +#include "common.h" +#include "operators.h" + +struct Int4GPTBigCodeDecoderLayer_output { + Matrix3D hidden_states; + Matrix3D attentions; + std::pair, Matrix3D> past_key_value; + + Int4GPTBigCodeDecoderLayer_output(Matrix3D hidden_states_, Matrix3D attentions_, + std::pair, Matrix3D> past_key_value_) { + hidden_states = hidden_states_; + attentions = attentions_; + past_key_value = past_key_value_; + }; +}; +struct Int4GPTBigCodeDecoderLayer_input { + Matrix3D hidden_states; + Matrix3D attention_mask; + Matrix3D past_key, past_value; + bool has_past_key_value = false; + + Int4GPTBigCodeDecoderLayer_input(Matrix3D &hidden_states_, Matrix3D &attention_mask_) { + hidden_states = hidden_states_; + attention_mask = attention_mask_; + has_past_key_value = false; + } + + Int4GPTBigCodeDecoderLayer_input(Matrix3D &hidden_states_, Matrix3D &attention_mask_, + Matrix3D past_key_, Matrix3D past_value_) { + hidden_states = hidden_states_; + attention_mask = attention_mask_; + past_key = past_key_; + past_value = past_value_; + has_past_key_value = true; + } +}; + +class Int4GPTBigCodeDecoderLayer { + public: + Int4GPTBigCodeDecoderLayer(std::string param_path, const struct model_config config, int layer_idx); + struct Int4GPTBigCodeDecoderLayer_output forward(const struct Int4GPTBigCodeDecoderLayer_input &input); + + int embed_dim, num_attention_heads, hidden_dim, layer_idx; + LayerNorm ln_1, ln_2; // from torch_int.nn + Linear_FP_int4 fc1, fc2; + Int4GPTBigCodeAttention attn; + std::string profile_name = "Int4GPTBigCodeDecoderLayer"; +}; diff --git a/llm/include/nn_modules/Int4GPTBigCodeForCausalLM.h b/llm/include/nn_modules/Int4GPTBigCodeForCausalLM.h new file mode 100644 index 00000000..8d866a23 --- /dev/null +++ b/llm/include/nn_modules/Int4GPTBigCodeForCausalLM.h @@ -0,0 +1,32 @@ +#include "Int4GPTBigCodeDecoder.h" + +struct Int4GPTBigCodeForCausalLM_output { + Matrix3D logits; + std::vector> past_keys, past_values; +}; +struct Int4GPTBigCodeForCausalLM_input { + Matrix3D input_ids; + std::vector> past_keys, past_values; + bool has_past_keys_values; + + Int4GPTBigCodeForCausalLM_input() {} + Int4GPTBigCodeForCausalLM_input(Matrix3D input_ids_) : input_ids(input_ids_) { has_past_keys_values = false; } + Int4GPTBigCodeForCausalLM_input(Matrix3D input_ids_, std::vector> past_keys_, + std::vector> past_values_) + : input_ids(input_ids_), past_keys(past_keys_), past_values(past_values_) { + has_past_keys_values = true; + } +}; + +class Int4GPTBigCodeForCausalLM { + public: + Int4GPTBigCodeForCausalLM(std::string param_path, const struct model_config config); + struct Int4GPTBigCodeForCausalLM_output forward(std::string param_path, const struct Int4GPTBigCodeForCausalLM_input& input); + + private: + Int4GPTBigCodeDecoder decoder; + Linear_FP_int4 lm_head; + std::string profile_name = "Int4GPTBigCodeForCausalLM"; + float* logits_output; + uint8_t* lm_head_weight; +}; diff --git a/llm/include/ops/linear.h b/llm/include/ops/linear.h index 71cdcc5d..37c3d623 100644 --- a/llm/include/ops/linear.h +++ b/llm/include/ops/linear.h @@ -66,9 +66,12 @@ class Linear_FP_int4 { : weight(weight_), bias(bias_) { float *scale_ptr, *zero_point_ptr; // float *offset_ptr; + // length of int8_t weight = elements / 2 + // length of scales/offset = elements / QK = weight / (QK/2) // TODO: Currently, we don't need offset + // length of zero_point = 1 assert((weight.m_dim_z * 2) % (QK) == 0); allocate_aligned_memory(scale_ptr, (this->weight.length() * 2 * sizeof(float)) / QK); - // allocate_aligned_memory(offset_ptr, (this->weight.length() * 2 * sizeof(float)) / QK); // TODO: Currently, we don't need offset + // allocate_aligned_memory(offset_ptr, (this->weight.length() * 2 * sizeof(float)) / QK); allocate_aligned_memory(zero_point_ptr, 1 * sizeof(float)); int x = this->weight.m_dim_x, y = this->weight.m_dim_y, z = (this->weight.m_dim_z * 2) / QK; diff --git a/llm/models/starcoder_vocab.bin b/llm/models/starcoder_vocab.bin new file mode 100644 index 0000000000000000000000000000000000000000..1c4e80deab07ed17d7221af15f17aa4b1de7494c GIT binary patch literal 492917 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 literal 0 HcmV?d00001 diff --git a/llm/src/GPTBigCodeGenerate.cc b/llm/src/GPTBigCodeGenerate.cc new file mode 100644 index 00000000..65f50c2f --- /dev/null +++ b/llm/src/GPTBigCodeGenerate.cc @@ -0,0 +1,193 @@ + +#include "Generate.h" +#include "GPTBigCodeTokenizer.h" +#include "common.h" +#include "utils.h" +#include +#include +#include + +std::string GPTBigCodeGenerate(std::string param_path, void *model_ptr, int model_type, std::string text, const struct opt_params generation_config, + std::string voc_path, bool interactive, bool voicechat) { + std::vector last_n_tokens(generation_config.n_ctx); + std::fill(last_n_tokens.begin(), last_n_tokens.end(), 0); + std::vector embd; + std::vector generate_ids; + + const int max_token = 2048; + std::vector input_ids(max_token); + starcoder_vocab vocab = starcoder_init_vocab(voc_path); + const int n = starcoder_tokenize(vocab, text, input_ids, input_ids.size()); + // printf("n = %d\n", n); + input_ids.resize(n); + + int n_consumed = 0; + while ((int)input_ids.size() > n_consumed) { + embd.push_back(input_ids[n_consumed]); + last_n_tokens.erase(last_n_tokens.begin()); + last_n_tokens.push_back(input_ids[n_consumed]); + ++n_consumed; + + if ((int)embd.size() >= generation_config.n_batch) { + break; + } + } + // if (interactive) std::cout << "ASSISTANT: " << std::endl; + + bool previous_two_hash = false; + int break_cnt = 2; + bool new_prompt = true; + static bool has_past_kv = false; + static std::vector> past_keys, past_values; + int n_remain = generation_config.n_predict; + std::string output; + while (n_remain != 0 && break_cnt) { + std::vector logits(generation_config.n_vocab); + + int sqlen = 1; + if (new_prompt) { + sqlen = input_ids.size(); + } + if (model_type == StarCoder_INT4) { + Int4GPTBigCodeForCausalLM *model = static_cast(model_ptr); + struct Int4GPTBigCodeForCausalLM_output model_output; + struct Int4GPTBigCodeForCausalLM_input model_input; + if (has_past_kv) { + Matrix3D input_ids_mat(input_ids.data(), 1, 1, sqlen); + model_input = {input_ids_mat, past_keys, past_values}; + } else { + Matrix3D input_ids_mat(input_ids.data(), 1, 1, sqlen); + model_input = {input_ids_mat}; + } + if (!new_prompt) STATS_START("Inference latency"); + // printf("Before model->forward\n"); + model_output = model->forward(param_path, model_input); + // printf("After model->forward\n"); + if (!new_prompt) STATS_END("Inference latency"); + past_keys = model_output.past_keys; + past_values = model_output.past_values; + // memcpy model_ouput.logits[-1] to logits + // printf("Before memcpy\n"); + memcpy(logits.data(), &model_output.logits.m_data[(sqlen - 1) * generation_config.n_vocab], + generation_config.n_vocab * sizeof(float)); + // printf("After memcpy\n"); + } else if (model_type == StarCoder_FP32) { + Fp32GPTBigCodeForCausalLM *model = static_cast(model_ptr); + struct Fp32GPTBigCodeForCausalLM_output model_output; + struct Fp32GPTBigCodeForCausalLM_input model_input; + if (has_past_kv) { + Matrix3D input_ids_mat(input_ids.data(), 1, 1, sqlen); + model_input = {input_ids_mat, past_keys, past_values}; + } else { + Matrix3D input_ids_mat(input_ids.data(), 1, 1, sqlen); + model_input = {input_ids_mat}; + } + if (!new_prompt) STATS_START("Inference latency"); + model_output = model->forward(model_input); + if (!new_prompt) STATS_END("Inference latency"); + past_keys = model_output.past_keys; + past_values = model_output.past_values; + // memcpy model_ouput.logits[-1] to logits + memcpy(logits.data(), &model_output.logits.m_data[(sqlen - 1) * generation_config.n_vocab], + generation_config.n_vocab * sizeof(float)); + } + has_past_kv = true; + + // Generate + const int n_ctx = generation_config.n_ctx; + const float temp = generation_config.temp; + const int32_t top_k = generation_config.top_k <= 0 ? generation_config.n_vocab : generation_config.top_k; + const float top_p = generation_config.top_p; + const float tfs_z = generation_config.tfs_z; + const float typical_p = generation_config.typical_p; + const int32_t repeat_last_n = generation_config.repeat_last_n < 0 ? n_ctx : generation_config.repeat_last_n; + const float repeat_penalty = generation_config.repeat_penalty; + const float alpha_presence = generation_config.presence_penalty; + const float alpha_frequency = generation_config.frequency_penalty; + const int mirostat = generation_config.mirostat; + const float mirostat_tau = generation_config.mirostat_tau; + const float mirostat_eta = generation_config.mirostat_eta; + const int n_vocab = generation_config.n_vocab; + + std::vector candidates; + candidates.reserve(n_vocab); + for (int token_id = 0; token_id < n_vocab; token_id++) { + candidates.emplace_back(OPT_token_data{token_id, logits[token_id], 0.0f}); + } + + OPT_token_data_array candidates_p = {candidates.data(), candidates.size(), false}; + + // Apply penalties + auto last_n_repeat = std::min(std::min((int)last_n_tokens.size(), repeat_last_n), n_ctx); + sample_repetition_penalty(&candidates_p, last_n_tokens.data() + last_n_tokens.size() - last_n_repeat, + last_n_repeat, repeat_penalty); + sample_frequency_and_presence_penalties(&candidates_p, + last_n_tokens.data() + last_n_tokens.size() - last_n_repeat, + last_n_repeat, alpha_frequency, alpha_presence); + + int id = 0; + if (temp <= 0) { + id = sample_token_greedy(&candidates_p); + } else { + if (mirostat == 1) { + static float mirostat_mu = 2.0f * mirostat_tau; + const int mirostat_m = 100; + sample_temperature(&candidates_p, temp); + id = + sample_token_mirostat(n_vocab, &candidates_p, mirostat_tau, mirostat_eta, mirostat_m, &mirostat_mu); + } else if (mirostat == 2) { + static float mirostat_mu = 2.0f * mirostat_tau; + sample_temperature(&candidates_p, temp); + id = sample_token_mirostat_v2(&candidates_p, mirostat_tau, mirostat_eta, &mirostat_mu); + } else { + // Temperature sampling + sample_top_k(&candidates_p, top_k, 1); + sample_tail_free(&candidates_p, tfs_z, 1); + sample_typical(&candidates_p, typical_p, 1); + sample_top_p(&candidates_p, top_p, 1); + sample_temperature(&candidates_p, temp); + id = sample_token(&candidates_p); + } + } + + if (id == 2) { + break_cnt--; + continue; + } // eos + else if (id == 1) + continue; + break_cnt = 2; + + bool skip = false; + if (id == 2277 && !previous_two_hash) { + previous_two_hash = true; + skip = true; + } else if (previous_two_hash && id == 29937) { // token = # + break_cnt = 0; + skip = true; + } else { + if (previous_two_hash) std::cout << "##" << std::endl; + previous_two_hash = false; + } + + last_n_tokens.erase(last_n_tokens.begin()); + last_n_tokens.push_back(id); + embd.push_back(id); + generate_ids.push_back(id); + input_ids = std::vector{id}; + + if (interactive && !skip) { + output += starcoder_id_to_token(vocab, id); + std::cout << starcoder_id_to_token(vocab, id) << std::flush; + } + + new_prompt = false; + --n_remain; + } + + if (interactive) std::cout << std::endl; + + if (!voicechat) Profiler::getInstance().report_internal(); + Profiler::getInstance().reset(); + return output; +} diff --git a/llm/src/GPTBigCodeTokenizer.cc b/llm/src/GPTBigCodeTokenizer.cc new file mode 100644 index 00000000..ea7ea92c --- /dev/null +++ b/llm/src/GPTBigCodeTokenizer.cc @@ -0,0 +1,131 @@ +/* + +Adapted from llama.cpp and starcoder.cpp: +https://github.com/ggerganov/llama.cpp +https://github.com/bigcode-project/starcoder.cpp + +*/ + +#include +#include + +#include "GPTBigCodeTokenizer.h" + +/* + * Interface implementation + */ +starcoder_vocab starcoder_init_vocab(const std::string & vocab_file) { + starcoder_vocab vocab; + int n_vocab = 49152; + + auto fin = std::ifstream(vocab_file, std::ios::binary); + if (!fin) { + fprintf(stderr, "%s: failed to open '%s'\n", __func__, vocab_file.c_str()); + } + + // Read dummy data + for (int i = 0; i < 8; i++) { + uint32_t dummy; + fin.read((char *) &dummy, sizeof(dummy)); + } + + std::string word; + std::vector buf(128); + for (uint32_t i = 0; i < n_vocab; i++) { + uint32_t len; + fin.read((char *) &len, sizeof(len)); + + buf.resize(len); + fin.read((char *) buf.data(), len); + word.assign(buf.data(), len); + + vocab.token_to_id[word] = i; + vocab.id_to_token[i] = word; + } + + return vocab; +} + +/* + * Tokenizer + */ +const char *starcoder_id_to_token(starcoder_vocab &vocab, int id) { + if (id >= 49152) { + return nullptr; + } + + return vocab.id_to_token[id].c_str(); +} + +int starcoder_tokenize(const starcoder_vocab &vocab, const std::string &text, std::vector &final_tokens, int n_max_tokens) { + std::vector words; + std::vector tokens; + + // first split the text into words + { + std::string str = text; + std::string pat = R"('s|'t|'re|'ve|'m|'ll|'d| ?[[:alpha:]]+| ?[[:digit:]]+| ?[^\s[:alpha:][:digit:]]+|\s+(?!\S)|\s+)"; + + // Generate the subpattern from the special_tokens vector if it's not empty + if (!vocab.special_tokens.empty()) { + std::string special_tokens_subpattern; + for (const auto & token : vocab.special_tokens) { + if (!special_tokens_subpattern.empty()) { + special_tokens_subpattern += "|"; + } + special_tokens_subpattern += token; + } + + // Modify the regex pattern with the generated special tokens subpattern + pat = special_tokens_subpattern + "|" + pat; + } + + std::regex re(pat); + std::smatch m; + + while (std::regex_search(str, m, re)) { + for (auto x : m) { + words.push_back(x); + } + str = m.suffix(); + } + } + + // find the longest tokens that form the words: + for (const auto & word : words) { + if (word.size() == 0) continue; + + int i = 0; + int n = word.size(); + while (i < n) { + int j = n; + while (j > i) { + auto it = vocab.token_to_id.find(word.substr(i, j-i)); + if (it != vocab.token_to_id.end()) { + tokens.push_back(it->second); + i = j; + break; + } + --j; + } + if (i == n) { + break; + } + if (j == i) { + auto sub = word.substr(i, 1); + if (vocab.token_to_id.find(sub) != vocab.token_to_id.end()) { + tokens.push_back(vocab.token_to_id.at(sub)); + } else { + fprintf(stderr, "%s: unknown token '%s'\n", __func__, sub.data()); + } + ++i; + } + } + } + + for (size_t i = 0; i < tokens.size(); i++) { + final_tokens[i] = tokens[i]; + } + + return tokens.size(); +} diff --git a/llm/src/nn_modules/Fp32GPTBigCodeAttention.cc b/llm/src/nn_modules/Fp32GPTBigCodeAttention.cc new file mode 100644 index 00000000..9e5b783f --- /dev/null +++ b/llm/src/nn_modules/Fp32GPTBigCodeAttention.cc @@ -0,0 +1,286 @@ +#include "Fp32GPTBigCodeAttention.h" + +#include + +#include + +#include "operators.h" +#include "utils.h" + +static float *attn_weights_arr; +static float *attn_probs_arr; +// static float *attn_probs_int8_arr; +static float ***key_states_arr_cache; +static float ***value_states_arr_cache; +static float *attn_output_fp_arr; +static int *cache_num; +static float *attn_output_arr; +static float *attn_output_transpose_arr; +static float *key_states_arr; +static float *value_states_arr; +static float *query_states_arr; +static float *value_states_transpose_arr; +// static float *query_states_unshape_arr; +// static float *key_states_unshape_arr; +// static float *value_states_unshape_arr; +static float *qkv_states_unshape_arr; + +void Fp32GPTBigCodeAttention::initialized_memory(const struct model_config config) { + allocate_aligned_memory(attn_weights_arr, config.num_heads * config.max_sqlen * config.max_sqlen * sizeof(float)); + allocate_aligned_memory(attn_probs_arr, config.num_heads * config.max_sqlen * config.max_sqlen * sizeof(float)); + // allocate_aligned_memory(attn_probs_int8_arr, + // config.num_heads * config.max_sqlen * config.max_sqlen * sizeof(float)); + allocate_aligned_memory(attn_output_fp_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(attn_output_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(attn_output_transpose_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(key_states_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(value_states_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(query_states_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(value_states_transpose_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + cache_num = new int[config.num_layers]; + for (int i = 0; i < config.num_layers; i++) cache_num[i] = 0; + allocate_aligned_memory(qkv_states_unshape_arr, config.max_sqlen * (config.embed_dim + 2 * config.embed_dim / config.num_heads) * sizeof(float)); + key_states_arr_cache = new float **[config.num_layers]; + for (int i = 0; i < config.num_layers; ++i) { + key_states_arr_cache[i] = new float *[2]; + for (int j = 0; j < 2; ++j) { + allocate_aligned_memory(key_states_arr_cache[i][j], config.max_sqlen * config.embed_dim * sizeof(float)); + } + } + value_states_arr_cache = new float **[config.num_layers]; + for (int i = 0; i < config.num_layers; ++i) { + value_states_arr_cache[i] = new float *[2]; + for (int j = 0; j < 2; ++j) { + allocate_aligned_memory(value_states_arr_cache[i][j], config.max_sqlen * config.embed_dim * sizeof(float)); + } + } + + // allocate_aligned_memory(query_states_unshape_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + // allocate_aligned_memory(key_states_unshape_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + // allocate_aligned_memory(value_states_unshape_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(qkv_states_unshape_arr, config.max_sqlen * config.embed_dim * 3 * sizeof(float)); +} + +Fp32GPTBigCodeAttention::Fp32GPTBigCodeAttention(std::string param_path, const struct model_config config) { + this->embed_dim = config.embed_dim; + this->num_heads = config.num_heads; + this->head_dim = config.embed_dim / config.num_heads; + this->kv_heads = 1; + this->kv_dim = this->kv_heads * this->head_dim; + assert(config.embed_dim % config.num_heads == 0); + + float *c_attn_weight, *c_proj_weight; + // allocate_aligned_memory(c_attn_weight, (config.embed_dim * (config.embed_dim + 2 * this->kv_dim) * sizeof(float))); + allocate_aligned_memory(c_attn_weight, (config.embed_dim * config.embed_dim * 3 * sizeof(float)) / 2); + allocate_aligned_memory(c_proj_weight, (config.embed_dim * config.embed_dim * sizeof(float))); + float *c_attn_bias, *c_proj_bias; + // allocate_aligned_memory(c_attn_bias, ((config.embed_dim + 2 * this->kv_dim) * sizeof(float))); + allocate_aligned_memory(c_attn_bias, (config.embed_dim * 3 * sizeof(float)) / 2); + allocate_aligned_memory(c_proj_bias, (config.embed_dim * sizeof(float))); + + // this->c_attn = + // Linear_FP(Matrix3D(c_attn_weight, 1, (config.embed_dim + 2 * this->kv_dim), config.embed_dim), param_path + "/c_attn/weight.bin", + // Matrix3D(c_attn_bias, 1, 1, (config.embed_dim + 2 * this->kv_dim)), param_path + "/c_attn/bias.bin"); + this->c_attn = + Linear_FP(Matrix3D(c_attn_weight, 1, (config.embed_dim * 3), config.embed_dim), param_path + "/c_attn/weight.bin", + Matrix3D(c_attn_bias, 1, 1, (config.embed_dim * 3)), param_path + "/c_attn/bias.bin"); + this->c_attn.has_bias = true; + + this->c_proj = + Linear_FP(Matrix3D(c_proj_weight, 1, config.embed_dim, config.embed_dim), param_path + "/c_proj/weight.bin", + Matrix3D(c_proj_bias, 1, 1, config.embed_dim), param_path + "/c_proj/bias.bin"); + this->c_proj.has_bias = true; + + float qk_bmm_alpha; + read_to_array((param_path + "/qk_bmm/alpha.bin").c_str(), &qk_bmm_alpha, 1); + this->qk_bmm = BMM_F32T(qk_bmm_alpha); + this->pv_bmm = BMM_F32T(1.0f); +} + +inline void Fp32GPTBigCodeAttention::shape_qkv(Matrix3D unshape, Matrix3D shaped_q, Matrix3D shaped_k, + Matrix3D shaped_v, int sqlen) { + PROFILE_START("Fp32GPTBigCodeAttention::shape_qkv"); + assert(unshape.m_dim_x == 1); // bsz == 1 + assert(unshape.m_dim_y == sqlen); + assert(unshape.m_dim_z == this->num_heads * this->head_dim * 3); + assert(shaped_q.m_dim_x == this->num_heads); + assert(shaped_q.m_dim_y == sqlen); + assert(shaped_q.m_dim_z == this->head_dim); + assert(shaped_k.m_dim_x == this->num_heads); + assert(shaped_k.m_dim_y == sqlen); + assert(shaped_k.m_dim_z == this->head_dim); + assert(shaped_v.m_dim_x == this->num_heads); + assert(shaped_v.m_dim_y == sqlen); + assert(shaped_v.m_dim_z == this->head_dim); + + for (int i = 0; i < this->num_heads; i++) { + for (int j = 0; j < sqlen; j++) { + for (int k = 0; k < this->head_dim; k++) { + shaped_q(i, j, k) = unshape(0, j, i * this->head_dim + k); + } + for (int k = this->embed_dim; k < this->embed_dim + this->head_dim; k++) { + shaped_k(i, j, k - this->embed_dim) = unshape(0, j, i * this->head_dim + k); + } + for (int k = this->embed_dim * 2; k < this->embed_dim * 2 + this->head_dim; k++) { + shaped_v(i, j, k - this->embed_dim * 2) = unshape(0, j, i * this->head_dim + k); + } + } + } + + PROFILE_END("Fp32GPTBigCodeAttention::shape_qkv"); +} + +inline void Fp32GPTBigCodeAttention::unshape(Matrix3D shaped, Matrix3D unshape, int sqlen) { + PROFILE_START("Fp32GPTBigCodeAttention::unshpae"); + assert(unshape.m_dim_x == 1); // bsz == 1 + assert(unshape.m_dim_y == sqlen); + assert(unshape.m_dim_z == this->num_heads * this->head_dim); + assert(shaped.m_dim_x == this->num_heads); + assert(shaped.m_dim_y == sqlen); + assert(shaped.m_dim_z == this->head_dim); + + for (int i = 0; i < this->num_heads; i++) { + for (int j = 0; j < sqlen; j++) { + for (int k = 0; k < this->head_dim; k++) { + unshape(0, j, i * this->head_dim + k) = shaped(i, j, k); + } + } + } + PROFILE_END("Fp32GPTBigCodeAttention::unshpae"); +} + +struct transpose_1_2idx_arg { + int start_idx, end_idx; + Matrix3D input, output; +}; + +template +inline void transpose_1_2idx(Matrix3D &input, Matrix3D &output) { + PROFILE_START("Fp32GPTBigCodeAttention::transpose_1_2idx"); + assert(input.m_dim_x == output.m_dim_x); + assert(input.m_dim_y == output.m_dim_z); + assert(input.m_dim_z == output.m_dim_y); + + for (int i = 0; i < input.m_dim_x; i++) { + for (int j = 0; j < input.m_dim_y; j++) { + for (int k = 0; k < input.m_dim_z; k++) { + output(i, k, j) = input(i, j, k); + } + } + } + PROFILE_END("Fp32GPTBigCodeAttention::transpose_1_2idx"); +} + +struct Fp32GPTBigCodeAttention_output Fp32GPTBigCodeAttention::forward(const struct Fp32GPTBigCodeAttention_input &input) { + PROFILE_START(profile_name); + struct Fp32GPTBigCodeAttention_output output; + const int sqlen = input.hidden_states.m_dim_y, b = input.hidden_states.m_dim_x; + assert(b == 1); + + // Fused QKV + Matrix3D qkv_states_unshape(qkv_states_unshape_arr, b, sqlen, embed_dim * 3); + this->c_attn.forward(input.hidden_states, qkv_states_unshape); + Matrix3D query_states(query_states_arr, this->num_heads, sqlen, this->head_dim); + Matrix3D key_states(key_states_arr, this->num_heads, sqlen, this->head_dim); + Matrix3D value_states(value_states_arr, this->num_heads, sqlen, this->head_dim); + this->shape_qkv(qkv_states_unshape, query_states, key_states, value_states, sqlen); + + // // Query, Key and Value states + // Matrix3D qkv_states_unshape(qkv_states_unshape_arr, b, sqlen, this->embed_dim + 2 * this->kv_dim); + // this->c_attn.forward(input.hidden_states, qkv_states_unshape); + // // for (int i = 0; i < sqlen * embed_dim; i++) qkv_states_unshape.m_data[i] *= this->scaling; // To be checked + // Matrix3D key_states(key_states_arr, this->kv_heads, sqlen, this->head_dim); + // Matrix3D value_states(value_states_arr, this->kv_heads, sqlen, this->head_dim); + // assert(!std::isnan(qkv_states_unshape_arr[0])); + + // // Reshape + // Matrix3D query_states(query_states_arr, this->num_heads, sqlen, this->head_dim); + // this->shape_MQA_qkv(qkv_states_unshape, query_states, sqlen); + + // Get the memory buffer + float *ret_value_states, *ret_key_states; + if (cache_num[input.layer_idx] == 1) { + ret_value_states = value_states_arr_cache[input.layer_idx][1]; + ret_key_states = key_states_arr_cache[input.layer_idx][1]; + cache_num[input.layer_idx] = 0; + } else { + ret_value_states = value_states_arr_cache[input.layer_idx][0]; + ret_key_states = key_states_arr_cache[input.layer_idx][0]; + cache_num[input.layer_idx] = 1; + } + + // // Key states + // Matrix3D key_states_unshape(key_states_unshape_arr, b, sqlen, embed_dim); + // this->k_proj.forward(input.hidden_states, key_states_unshape); + // Matrix3D key_states(key_states_arr, this->num_heads, sqlen, this->head_dim); + // this->shpae(key_states_unshape, key_states, sqlen); + + // assert(!std::isnan(key_states_unshape.sum())); + + // // Value states + // Matrix3D value_states_unshape(value_states_unshape_arr, b, sqlen, embed_dim); + // this->v_proj.forward(input.hidden_states, value_states_unshape); + // Matrix3D value_states(value_states_arr, this->num_heads, sqlen, this->head_dim); + // this->shpae(value_states_unshape, value_states, sqlen); + + // assert(!std::isnan(value_states_unshape_arr[0])); + + // Concate with past key, value if exists + PROFILE_START(profile_name + "::cat_past_keys_values"); + int tgz = sqlen; + if (input.has_past_key_value) { + assert(input.past_key.m_dim_z == this->head_dim); + tgz += input.past_key.m_dim_y; + float *val_ptr = ret_value_states, *key_ptr = ret_key_states; + int past_block = input.past_key.m_dim_y * input.past_key.m_dim_z; + int sq_block = sqlen * this->head_dim; + for (int i = 0; i < input.past_key.m_dim_x; i++) { + memcpy(val_ptr, &input.past_value.m_data[past_block * i], past_block * sizeof(float)); + val_ptr += past_block; + memcpy(val_ptr, &value_states.m_data[sq_block * i], sq_block * sizeof(float)); + val_ptr += sq_block; + memcpy(key_ptr, &input.past_key.m_data[past_block * i], past_block * sizeof(float)); + key_ptr += past_block; + memcpy(key_ptr, &key_states.m_data[sq_block * i], sq_block * sizeof(float)); + key_ptr += sq_block; + } + } else { + // Put the data into the buffer + memcpy(ret_value_states, value_states_arr, (this->num_heads * tgz * this->head_dim) * sizeof(float)); + memcpy(ret_key_states, key_states_arr, (this->num_heads * tgz * this->head_dim) * sizeof(float)); + } + Matrix3D final_value_states(ret_value_states, this->num_heads, tgz, this->head_dim); + Matrix3D final_key_states(ret_key_states, this->num_heads, tgz, this->head_dim); + PROFILE_END(profile_name + "::cat_past_keys_values"); + + // QK_BMM + Matrix3D attn_weights(attn_weights_arr, this->num_heads, sqlen, tgz); + this->qk_bmm.forward(query_states, final_key_states, attn_weights); + + // Add mask + batch_Add(attn_weights, input.attention_mask, attn_weights); + + // Softmax QK + Matrix3D attn_probs(attn_weights_arr, this->num_heads, sqlen, tgz); + softmax(attn_weights, attn_probs, 2); + + // Transpose V for PV_BMM + Matrix3D value_states_transpose(value_states_transpose_arr, this->num_heads, this->head_dim, tgz); + transpose_1_2idx(final_value_states, value_states_transpose); + Matrix3D attn_output(attn_output_arr, this->num_heads, sqlen, this->head_dim); + this->pv_bmm.forward(attn_probs, value_states_transpose, attn_output); + + Matrix3D attn_output_transpose(attn_output_transpose_arr, 1, sqlen, this->num_heads * this->head_dim); + this->unshape(attn_output, attn_output_transpose, sqlen); + + // Output projection + Matrix3D attn_output_fp(attn_output_fp_arr, 1, sqlen, this->num_heads * this->head_dim); + this->c_proj.forward(attn_output_transpose, attn_output_fp); + + // Output assignment + output.attn_output = attn_output_fp; + output.past_key_value = {final_key_states, final_value_states}; + + PROFILE_END(profile_name); + return output; +} diff --git a/llm/src/nn_modules/Fp32GPTBigCodeDecoder.cc b/llm/src/nn_modules/Fp32GPTBigCodeDecoder.cc new file mode 100644 index 00000000..0db391cb --- /dev/null +++ b/llm/src/nn_modules/Fp32GPTBigCodeDecoder.cc @@ -0,0 +1,157 @@ +#include "Fp32GPTBigCodeDecoder.h" + +#include +#include + +#include "utils.h" + +Matrix3D Fp32GPTBigCodeDecoder::prepare_decoder_attention_mask(int length, int past_length) { + PROFILE_START("Fp32GPTBigCodeDecoder::prepare_decoder_attention_mask"); + assert(length - past_length > 0); + Matrix3D causal_attention_mask(attention_mask_buf, 1, length - past_length, length); + for (int i = 0; i < length - past_length; i++) { + for (int j = 0; j < length; j++) { + if (i + past_length < j) { + causal_attention_mask(0, i, j) = -65504.0; + } else { + causal_attention_mask(0, i, j) = 0.0; + } + } + } + + PROFILE_END("Fp32GPTBigCodeDecoder::prepare_decoder_attention_mask"); + return causal_attention_mask; +} + +// Matrix3D Fp32GPTBigCodeDecoder::get_position_embed(int sql_length, int past_length) { +// PROFILE_START("Fp32GPTBigCodeDecoder::get_position_embed"); +// const int offset = 2; // This is specific for GPTBigCode model +// Matrix3D pos_embeds(pos_embeds_buf, 1, sql_length, this->embed_dim); + +// int start_idx = past_length + offset, end_idx = past_length + sql_length + offset; +// assert(end_idx < this->embed_positions.lookup.m_dim_y); + +// memcpy(pos_embeds.m_data, &this->embed_positions.lookup.m_data[start_idx * this->embed_dim], +// sql_length * this->embed_dim * sizeof(float)); + +// PROFILE_END("Fp32GPTBigCodeDecoder::get_position_embed"); +// return pos_embeds; +// } + +Fp32GPTBigCodeDecoder::Fp32GPTBigCodeDecoder(std::string param_path, const struct model_config config) { + allocate_aligned_memory(attention_mask_buf, config.max_sqlen * config.max_sqlen * sizeof(float)); + allocate_aligned_memory(pos_embeds_buf, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(last_hidden_states_buf, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(hidden_states_buf, config.max_sqlen * config.embed_dim * sizeof(float)); + + this->voc_size = config.vocsize; + this->embed_dim = config.embed_dim; + this->hidden_dim = config.hidden_dim; + this->num_heads = config.num_heads; + this->padding_idx = config.padding_idx; + this->max_position_embeddings = 8192; // To be fixed + + // Embedding + Matrix3D embweight(new float[voc_size * embed_dim], 1, voc_size, embed_dim); + this->wte = Embedding(embed_dim, voc_size, padding_idx, embweight); + load_Embedding_params(this->wte, param_path + "/wte"); + Matrix3D posweight(new float[max_position_embeddings * embed_dim], 1, max_position_embeddings, embed_dim); + this->wpe = Embedding(embed_dim, max_position_embeddings, padding_idx, posweight); + load_Embedding_params(this->wpe, param_path + "/wpe"); + + // LayerNorm + Matrix3D LN_weight(new float[config.embed_dim], 1, 1, config.embed_dim); + Matrix3D LN_bias(new float[config.embed_dim], 1, 1, config.embed_dim); + struct LayerNorm_params LN_params = {LN_weight, LN_bias}; + this->ln_f = LayerNorm(LN_params); + load_LayerNorm(this->ln_f, param_path + "/ln_f"); + + // Load all the decoder layers + for (int layer_idx = 0; layer_idx < config.num_layers; layer_idx++) { + DEBUG_INS(std::cout << "Start loading layer:" << layer_idx << "..." << std::endl;) + + std::string path = param_path + "/layer" + std::to_string(layer_idx); + + Fp32GPTBigCodeDecoderLayer layer = Fp32GPTBigCodeDecoderLayer(path, config, layer_idx); + + this->layers.push_back(layer); + } +}; + +// GPTBigCodeDecoder: +struct Fp32GPTBigCodeDecoder_output Fp32GPTBigCodeDecoder::forward(const struct Fp32GPTBigCodeDecoder_input &input) { + PROFILE_START(profile_name); + int sqlen = input.input_ids.m_dim_z, batch_size = input.input_ids.m_dim_x, past_key_values_length = 0; + + // Input token -> Embedding +#ifdef _WIN32 + std::vector inputs_embeds_buf_vec(sqlen * this->embed_dim); + float *inputs_embeds_buf = &inputs_embeds_buf_vec.front(); +#else + float inputs_embeds_buf[sqlen * this->embed_dim]; +#endif + Matrix3D inputs_embeds(inputs_embeds_buf, 1, sqlen, this->embed_dim); + this->wte.forward(input.input_ids, inputs_embeds); + + if (input.has_past_keys_values) { + past_key_values_length = input.past_keys[0].m_dim_y; + } + + // Attention mask // To be checked + Matrix3D causal_attention_mask = + this->prepare_decoder_attention_mask(sqlen + past_key_values_length, past_key_values_length); + + // Position embeddings + // Matrix3D pos_embeds = this->get_position_embed(sqlen, past_key_values_length); +#ifdef _WIN32 + std::vector position_ids_buf_vec(sqlen); + float *position_ids_buf = &position_ids_buf_vec.front(); + std::vector pos_embeds_buf_vec(sqlen * this->embed_dim); + float *pos_embeds_buf = &pos_embeds_buf_vec.front(); +#else + int position_ids_buf[sqlen]; + float pos_embeds_buf[sqlen * this->embed_dim]; +#endif + Matrix3D position_ids(position_ids_buf, 1, 1, sqlen); + for (int i = 0; i < sqlen; i++) position_ids.m_data[i] = i + past_key_values_length; + Matrix3D pos_embeds(pos_embeds_buf, 1, sqlen, this->embed_dim); + this->wpe.forward(position_ids, pos_embeds); + + if (input.has_past_keys_values) { + past_key_values_length = input.past_keys[0].m_dim_y; + } + + assert(inputs_embeds.m_dim_x == pos_embeds.m_dim_x); + assert(inputs_embeds.m_dim_y == pos_embeds.m_dim_y); + assert(inputs_embeds.m_dim_z == pos_embeds.m_dim_z); + Matrix3D hidden_states(hidden_states_buf, 1, sqlen, this->embed_dim); + for (int i = 0; i < inputs_embeds.length(); i++) + hidden_states.m_data[i] = inputs_embeds.m_data[i] + pos_embeds.m_data[i]; + + // Go through each layer + std::vector> past_keys, past_values; + for (int i = 0; i < this->layers.size(); i++) { + if (!input.has_past_keys_values) { + struct Fp32GPTBigCodeDecoderLayer_input l_i = {hidden_states, causal_attention_mask}; + struct Fp32GPTBigCodeDecoderLayer_output l_o = this->layers[i].forward(l_i); + hidden_states = l_o.hidden_states; + past_keys.push_back(l_o.past_key_value.first); + past_values.push_back(l_o.past_key_value.second); + } else { + struct Fp32GPTBigCodeDecoderLayer_input l_i = {hidden_states, causal_attention_mask, input.past_keys[i], + input.past_values[i]}; + struct Fp32GPTBigCodeDecoderLayer_output l_o = this->layers[i].forward(l_i); + hidden_states = l_o.hidden_states; + past_keys.push_back(l_o.past_key_value.first); + past_values.push_back(l_o.past_key_value.second); + } + } + + // Layernorm + Matrix3D last_hidden_states(last_hidden_states_buf, 1, sqlen, this->embed_dim); + this->ln_f.forward(hidden_states, last_hidden_states); + + struct Fp32GPTBigCodeDecoder_output output = {last_hidden_states, past_keys, past_values}; + PROFILE_END(profile_name); + return output; +} diff --git a/llm/src/nn_modules/Fp32GPTBigCodeDecoderLayer.cc b/llm/src/nn_modules/Fp32GPTBigCodeDecoderLayer.cc new file mode 100644 index 00000000..8a9339ad --- /dev/null +++ b/llm/src/nn_modules/Fp32GPTBigCodeDecoderLayer.cc @@ -0,0 +1,125 @@ +#include "Fp32GPTBigCodeDecoderLayer.h" + +#include "utils.h" + +// Shared memory space across all layers +static float *hidden_states_float_arr; +static float *ln_2_arr; +static float *fc_1_arr; +static float *fc_2_arr; +static float *temp; +static float *hidden_states_arr; + +template +void add(Matrix3D a, Matrix3D b, Matrix3D c) { + PROFILE_START("Fp32GPTBigCodeDecoderLayer::add"); + assert(c.length() == a.length() && a.length() == b.length()); + + for (int i = 0; i < a.length(); i++) { + c.m_data[i] = a.m_data[i] + b.m_data[i]; + } + PROFILE_END("Fp32GPTBigCodeDecoderLayer::add"); +} + +static const float GELU_COEF_A = 0.044715f; +static const float SQRT_2_OVER_PI = 0.79788456080286535587989211986876f; +inline static float Gelu_imp(float x) { + return 0.5f * x * (1.0f + tanhf(SQRT_2_OVER_PI * x * (1.0f + GELU_COEF_A * x * x))); +} +inline static void Gelu(Matrix3D a) { + PROFILE_START("Fp32GPTBigCodeDecoderLayer::Gelu"); + for (int i = 0; i < a.length(); i++) { + a.m_data[i] = Gelu_imp(a.m_data[i]); + } + PROFILE_END("Fp32GPTBigCodeDecoderLayer::Gelu"); +} + +struct Fp32GPTBigCodeDecoderLayer_output Fp32GPTBigCodeDecoderLayer::forward(const struct Fp32GPTBigCodeDecoderLayer_input &input) { + PROFILE_START(profile_name); + // Layernorm + Matrix3D hidden_states(hidden_states_arr, input.hidden_states.m_dim_x, input.hidden_states.m_dim_y, + input.hidden_states.m_dim_z); + this->ln_1.forward(input.hidden_states, hidden_states); + + // Attention + struct Fp32GPTBigCodeAttention_input attn_param(hidden_states, input.attention_mask, input.past_key, input.past_value, + input.has_past_key_value, this->layer_idx); + struct Fp32GPTBigCodeAttention_output attn_output = this->attn.forward(attn_param); + + // Residual add + Matrix3D residual_add(hidden_states_float_arr, input.hidden_states.m_dim_x, input.hidden_states.m_dim_y, + input.hidden_states.m_dim_z); + add(input.hidden_states, attn_output.attn_output, residual_add); + + // Layernorm + Matrix3D ln_2(ln_2_arr, input.hidden_states.m_dim_x, input.hidden_states.m_dim_y, + input.hidden_states.m_dim_z); + this->ln_2.forward(residual_add, ln_2); + + // FC 1 + Matrix3D fc1_out(fc_1_arr, input.hidden_states.m_dim_x, input.hidden_states.m_dim_y, this->hidden_dim); + this->fc1.forward(ln_2, fc1_out); + + // GELU + Gelu(fc1_out); + + // FC 2 + Matrix3D fc2_out(fc_2_arr, input.hidden_states.m_dim_x, input.hidden_states.m_dim_y, + input.hidden_states.m_dim_z); + this->fc2.forward(fc1_out, fc2_out); + + // Reidual add + add(residual_add, fc2_out, residual_add); + + struct Fp32GPTBigCodeDecoderLayer_output output(residual_add, attn_output.attn_probs_reshaped, attn_output.past_key_value); + PROFILE_END(profile_name); + return output; +} + +Fp32GPTBigCodeDecoderLayer::Fp32GPTBigCodeDecoderLayer(std::string param_path, const model_config config, int layer_idx) { + if (layer_idx == 0) { + allocate_aligned_memory(hidden_states_float_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(ln_2_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(fc_1_arr, config.max_sqlen * config.hidden_dim * sizeof(float)); + allocate_aligned_memory(fc_2_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(hidden_states_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + Fp32GPTBigCodeAttention::initialized_memory(config); + } + + struct LayerNorm_params ln_1, ln_2; + Matrix3D ln_1_weight(new float[config.embed_dim], 1, 1, config.embed_dim); + Matrix3D ln_1_bias(new float[config.embed_dim], 1, 1, config.embed_dim); + ln_1.weight = ln_1_weight; + ln_1.bias = ln_1_bias; + + Matrix3D ln_2_weight(new float[config.embed_dim], 1, 1, config.embed_dim); + Matrix3D ln_2_bias(new float[config.embed_dim], 1, 1, config.embed_dim); + ln_2.weight = ln_2_weight; + ln_2.bias = ln_2_bias; + this->ln_1 = LayerNorm(ln_1); + load_LayerNorm(this->ln_1, param_path + "/ln_1"); + this->ln_2 = LayerNorm(ln_2); + load_LayerNorm(this->ln_2, param_path + "/ln_2"); + + float *fc1_weight, *fc2_weight; + allocate_aligned_memory(fc1_weight, (config.embed_dim * config.hidden_dim * sizeof(float))); + allocate_aligned_memory(fc2_weight, (config.embed_dim * config.hidden_dim * sizeof(float))); + float *fc1_bias, *fc2_bias; + allocate_aligned_memory(fc1_bias, (config.hidden_dim * sizeof(float))); + allocate_aligned_memory(fc2_bias, (config.embed_dim * sizeof(float))); + this->fc1 = + Linear_FP(Matrix3D(fc1_weight, 1, config.hidden_dim, config.embed_dim), param_path + "/c_fc/weight.bin", + Matrix3D(fc1_bias, 1, 1, config.hidden_dim), param_path + "/c_fc/bias.bin"); + this->fc1.has_bias = true; + this->fc2 = + Linear_FP(Matrix3D(fc2_weight, 1, config.embed_dim, config.hidden_dim), param_path + "/c_proj/weight.bin", + Matrix3D(fc2_bias, 1, 1, config.embed_dim), param_path + "/c_proj/bias.bin"); + this->fc2.has_bias = true; + + this->embed_dim = config.embed_dim; + this->num_attention_heads = config.num_heads; + this->hidden_dim = config.hidden_dim; + this->layer_idx = layer_idx; + + this->attn = Fp32GPTBigCodeAttention(param_path + "/attn", config); +} diff --git a/llm/src/nn_modules/Fp32GPTBigCodeForCausalLM.cc b/llm/src/nn_modules/Fp32GPTBigCodeForCausalLM.cc new file mode 100644 index 00000000..52f2a2e7 --- /dev/null +++ b/llm/src/nn_modules/Fp32GPTBigCodeForCausalLM.cc @@ -0,0 +1,38 @@ +#include "Fp32GPTBigCodeForCausalLM.h" + +#include + +#include "operators.h" +#include "utils.h" + +Fp32GPTBigCodeForCausalLM::Fp32GPTBigCodeForCausalLM(std::string param_path, const struct model_config config) { + allocate_aligned_memory(logits_output, config.max_sqlen * config.vocsize * sizeof(float)); + allocate_aligned_memory(lm_head_weight, config.embed_dim * config.vocsize * sizeof(float)); + + this->decoder = Fp32GPTBigCodeDecoder(param_path + "/decoder", config); + this->lm_head = + Linear_FP(Matrix3D(lm_head_weight, 1, config.vocsize, config.embed_dim), param_path + "/lm_head.bin"); +} + +struct Fp32GPTBigCodeForCausalLM_output Fp32GPTBigCodeForCausalLM::forward(const struct Fp32GPTBigCodeForCausalLM_input &input) { + PROFILE_START(profile_name); + int sqlen = input.input_ids.m_dim_z; + + struct Fp32GPTBigCodeDecoder_output decoder_output; + + if (input.has_past_keys_values) { + struct Fp32GPTBigCodeDecoder_input decoder_input = {input.input_ids, input.past_keys, input.past_values}; + decoder_output = this->decoder.forward(decoder_input); + + } else { + struct Fp32GPTBigCodeDecoder_input decoder_input = {input.input_ids}; + decoder_output = this->decoder.forward(decoder_input); + } + + Matrix3D logits(logits_output, 1, sqlen, this->decoder.voc_size); + this->lm_head.forward(decoder_output.last_hidden_state, logits); + + struct Fp32GPTBigCodeForCausalLM_output LMoutput = {logits, decoder_output.past_keys, decoder_output.past_values}; + PROFILE_END(profile_name); + return LMoutput; +} diff --git a/llm/src/nn_modules/Int4GPTBigCodeAttention.cc b/llm/src/nn_modules/Int4GPTBigCodeAttention.cc new file mode 100644 index 00000000..cbcb9e42 --- /dev/null +++ b/llm/src/nn_modules/Int4GPTBigCodeAttention.cc @@ -0,0 +1,292 @@ +#include "Int4GPTBigCodeAttention.h" + +#include + +#include + +#include "operators.h" +#include "utils.h" + +static float *attn_weights_arr; +static float *attn_probs_arr; +// static float *attn_probs_int8_arr; +static float ***key_states_arr_cache; +static float ***value_states_arr_cache; +static float *attn_output_fp_arr; +static int *cache_num; +static float *attn_output_arr; +static float *attn_output_transpose_arr; +static float *key_states_arr; +static float *value_states_arr; +static float *query_states_arr; +static float *value_states_transpose_arr; +// static float *query_states_unshape_arr; +// static float *key_states_unshape_arr; +// static float *value_states_unshape_arr; +static float *qkv_states_unshape_arr; + +void Int4GPTBigCodeAttention::initialized_memory(const struct model_config config) { + allocate_aligned_memory(attn_weights_arr, config.num_heads * config.max_sqlen * config.max_sqlen * sizeof(float)); + allocate_aligned_memory(attn_probs_arr, config.num_heads * config.max_sqlen * config.max_sqlen * sizeof(float)); + // allocate_aligned_memory(attn_probs_int8_arr, + // config.num_heads * config.max_sqlen * config.max_sqlen * sizeof(float)); + allocate_aligned_memory(attn_output_fp_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(attn_output_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(attn_output_transpose_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(key_states_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(value_states_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(query_states_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(value_states_transpose_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + cache_num = new int[config.num_layers]; + for (int i = 0; i < config.num_layers; i++) cache_num[i] = 0; + key_states_arr_cache = new float **[config.num_layers]; + for (int i = 0; i < config.num_layers; ++i) { + key_states_arr_cache[i] = new float *[2]; + for (int j = 0; j < 2; ++j) { + allocate_aligned_memory(key_states_arr_cache[i][j], config.max_sqlen * config.embed_dim * sizeof(float)); + } + } + value_states_arr_cache = new float **[config.num_layers]; + for (int i = 0; i < config.num_layers; ++i) { + value_states_arr_cache[i] = new float *[2]; + for (int j = 0; j < 2; ++j) { + allocate_aligned_memory(value_states_arr_cache[i][j], config.max_sqlen * config.embed_dim * sizeof(float)); + } + } + + // allocate_aligned_memory(query_states_unshape_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + // allocate_aligned_memory(key_states_unshape_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + // allocate_aligned_memory(value_states_unshape_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(qkv_states_unshape_arr, config.max_sqlen * config.embed_dim * 3 * sizeof(float)); +} + +Int4GPTBigCodeAttention::Int4GPTBigCodeAttention(std::string param_path, const struct model_config config) { + this->embed_dim = config.embed_dim; + this->num_heads = config.num_heads; + this->head_dim = config.embed_dim / config.num_heads; + this->kv_heads = 1; + this->kv_dim = this->kv_heads * this->head_dim; + assert(config.embed_dim % config.num_heads == 0); + + uint8_t *c_attn_weight, *c_proj_weight; + // allocate_aligned_memory(c_attn_weight, (config.embed_dim * (config.embed_dim + 2 * this->kv_dim) * sizeof(float))); + allocate_aligned_memory(c_attn_weight, (config.embed_dim * config.embed_dim * 3 * sizeof(uint8_t)) / 2); + allocate_aligned_memory(c_proj_weight, (config.embed_dim * config.embed_dim * sizeof(uint8_t) / 2)); + float *c_attn_bias, *c_proj_bias; + // allocate_aligned_memory(c_attn_bias, ((config.embed_dim + 2 * this->kv_dim) * sizeof(float))); + allocate_aligned_memory(c_attn_bias, (config.embed_dim * 3 * sizeof(float))); + allocate_aligned_memory(c_proj_bias, (config.embed_dim * sizeof(float))); + + // this->c_attn = + // Linear_FP_int4(Matrix3D(c_attn_weight, 1, (config.embed_dim + 2 * this->kv_dim), config.embed_dim), param_path + "/c_attn/weight.bin", + // Matrix3D(c_attn_bias, 1, 1, (config.embed_dim + 2 * this->kv_dim)), param_path + "/c_attn/bias.bin"); + this->c_attn = + Linear_FP_int4(Matrix3D(c_attn_weight, 1, (config.embed_dim * 3), config.embed_dim / 2), param_path + "/c_attn", + Matrix3D(c_attn_bias, 1, 1, (config.embed_dim * 3)), param_path + "/c_attn/bias.bin"); + this->c_attn.has_bias = true; + + this->c_proj = + Linear_FP_int4(Matrix3D(c_proj_weight, 1, config.embed_dim, config.embed_dim / 2), param_path + "/c_proj", + Matrix3D(c_proj_bias, 1, 1, config.embed_dim), param_path + "/c_proj/bias.bin"); + this->c_proj.has_bias = true; + + float qk_bmm_alpha; + read_to_array((param_path + "/qk_bmm/alpha.bin").c_str(), &qk_bmm_alpha, 1); + this->qk_bmm = BMM_F32T(qk_bmm_alpha); + this->pv_bmm = BMM_F32T(1.0f); +} + +inline void Int4GPTBigCodeAttention::shape_qkv(Matrix3D unshape, Matrix3D shaped_q, Matrix3D shaped_k, + Matrix3D shaped_v, int sqlen) { + PROFILE_START("Int4GPTBigCodeAttention::shape_qkv"); + assert(unshape.m_dim_x == 1); // bsz == 1 + assert(unshape.m_dim_y == sqlen); + assert(unshape.m_dim_z == this->num_heads * this->head_dim * 3); + assert(shaped_q.m_dim_x == this->num_heads); + assert(shaped_q.m_dim_y == sqlen); + assert(shaped_q.m_dim_z == this->head_dim); + assert(shaped_k.m_dim_x == this->num_heads); + assert(shaped_k.m_dim_y == sqlen); + assert(shaped_k.m_dim_z == this->head_dim); + assert(shaped_v.m_dim_x == this->num_heads); + assert(shaped_v.m_dim_y == sqlen); + assert(shaped_v.m_dim_z == this->head_dim); + + for (int i = 0; i < this->num_heads; i++) { + for (int j = 0; j < sqlen; j++) { + for (int k = 0; k < this->head_dim; k++) { + shaped_q(i, j, k) = unshape(0, j, i * this->head_dim + k); + } + for (int k = this->embed_dim; k < this->embed_dim + this->head_dim; k++) { + shaped_k(i, j, k - this->embed_dim) = unshape(0, j, i * this->head_dim + k); + } + for (int k = this->embed_dim * 2; k < this->embed_dim * 2 + this->head_dim; k++) { + shaped_v(i, j, k - this->embed_dim * 2) = unshape(0, j, i * this->head_dim + k); + } + } + } + + PROFILE_END("Int4GPTBigCodeAttention::shape_qkv"); +} + +inline void Int4GPTBigCodeAttention::unshape(Matrix3D shaped, Matrix3D unshape, int sqlen) { + PROFILE_START("Int4GPTBigCodeAttention::unshpae"); + assert(unshape.m_dim_x == 1); // bsz == 1 + assert(unshape.m_dim_y == sqlen); + assert(unshape.m_dim_z == this->num_heads * this->head_dim); + assert(shaped.m_dim_x == this->num_heads); + assert(shaped.m_dim_y == sqlen); + assert(shaped.m_dim_z == this->head_dim); + + for (int i = 0; i < this->num_heads; i++) { + for (int j = 0; j < sqlen; j++) { + for (int k = 0; k < this->head_dim; k++) { + unshape(0, j, i * this->head_dim + k) = shaped(i, j, k); + } + } + } + PROFILE_END("Int4GPTBigCodeAttention::unshpae"); +} + +struct transpose_1_2idx_arg { + int start_idx, end_idx; + Matrix3D input, output; +}; + +template +inline void transpose_1_2idx(Matrix3D &input, Matrix3D &output) { + PROFILE_START("Int4GPTBigCodeAttention::transpose_1_2idx"); + assert(input.m_dim_x == output.m_dim_x); + assert(input.m_dim_y == output.m_dim_z); + assert(input.m_dim_z == output.m_dim_y); + + for (int i = 0; i < input.m_dim_x; i++) { + for (int j = 0; j < input.m_dim_y; j++) { + for (int k = 0; k < input.m_dim_z; k++) { + output(i, k, j) = input(i, j, k); + } + } + } + PROFILE_END("Int4GPTBigCodeAttention::transpose_1_2idx"); +} + +struct Int4GPTBigCodeAttention_output Int4GPTBigCodeAttention::forward(const struct Int4GPTBigCodeAttention_input &input) { + PROFILE_START(profile_name); + struct Int4GPTBigCodeAttention_output output; + const int sqlen = input.hidden_states.m_dim_y, b = input.hidden_states.m_dim_x; + assert(b == 1); + + // Fused QKV + // printf(("Before c_attn\n"); + Matrix3D qkv_states_unshape(qkv_states_unshape_arr, b, sqlen, embed_dim * 3); + this->c_attn.forward(input.hidden_states, qkv_states_unshape); + Matrix3D query_states(query_states_arr, this->num_heads, sqlen, this->head_dim); + Matrix3D key_states(key_states_arr, this->num_heads, sqlen, this->head_dim); + Matrix3D value_states(value_states_arr, this->num_heads, sqlen, this->head_dim); + // printf(("After c_attn\n"); + this->shape_qkv(qkv_states_unshape, query_states, key_states, value_states, sqlen); + + // // Query, Key and Value states + // Matrix3D qkv_states_unshape(qkv_states_unshape_arr, b, sqlen, this->embed_dim + 2 * this->kv_dim); + // this->c_attn.forward(input.hidden_states, qkv_states_unshape); + // // for (int i = 0; i < sqlen * embed_dim; i++) qkv_states_unshape.m_data[i] *= this->scaling; // To be checked + // Matrix3D key_states(key_states_arr, this->kv_heads, sqlen, this->head_dim); + // Matrix3D value_states(value_states_arr, this->kv_heads, sqlen, this->head_dim); + // assert(!std::isnan(qkv_states_unshape_arr[0])); + + // // Reshape + // Matrix3D query_states(query_states_arr, this->num_heads, sqlen, this->head_dim); + // this->shape_MQA_qkv(qkv_states_unshape, query_states, sqlen); + + // Get the memory buffer + float *ret_value_states, *ret_key_states; + if (cache_num[input.layer_idx] == 1) { + ret_value_states = value_states_arr_cache[input.layer_idx][1]; + ret_key_states = key_states_arr_cache[input.layer_idx][1]; + cache_num[input.layer_idx] = 0; + } else { + ret_value_states = value_states_arr_cache[input.layer_idx][0]; + ret_key_states = key_states_arr_cache[input.layer_idx][0]; + cache_num[input.layer_idx] = 1; + } + + // // Key states + // Matrix3D key_states_unshape(key_states_unshape_arr, b, sqlen, embed_dim); + // this->k_proj.forward(input.hidden_states, key_states_unshape); + // Matrix3D key_states(key_states_arr, this->num_heads, sqlen, this->head_dim); + // this->shpae(key_states_unshape, key_states, sqlen); + + // assert(!std::isnan(key_states_unshape.sum())); + + // // Value states + // Matrix3D value_states_unshape(value_states_unshape_arr, b, sqlen, embed_dim); + // this->v_proj.forward(input.hidden_states, value_states_unshape); + // Matrix3D value_states(value_states_arr, this->num_heads, sqlen, this->head_dim); + // this->shpae(value_states_unshape, value_states, sqlen); + + // assert(!std::isnan(value_states_unshape_arr[0])); + + // Concate with past key, value if exists + PROFILE_START(profile_name + "::cat_past_keys_values"); + int tgz = sqlen; + if (input.has_past_key_value) { + assert(input.past_key.m_dim_z == this->head_dim); + tgz += input.past_key.m_dim_y; + float *val_ptr = ret_value_states, *key_ptr = ret_key_states; + int past_block = input.past_key.m_dim_y * input.past_key.m_dim_z; + int sq_block = sqlen * this->head_dim; + for (int i = 0; i < input.past_key.m_dim_x; i++) { + memcpy(val_ptr, &input.past_value.m_data[past_block * i], past_block * sizeof(float)); + val_ptr += past_block; + memcpy(val_ptr, &value_states.m_data[sq_block * i], sq_block * sizeof(float)); + val_ptr += sq_block; + memcpy(key_ptr, &input.past_key.m_data[past_block * i], past_block * sizeof(float)); + key_ptr += past_block; + memcpy(key_ptr, &key_states.m_data[sq_block * i], sq_block * sizeof(float)); + key_ptr += sq_block; + } + } else { + // Put the data into the buffer + memcpy(ret_value_states, value_states_arr, (this->num_heads * tgz * this->head_dim) * sizeof(float)); + memcpy(ret_key_states, key_states_arr, (this->num_heads * tgz * this->head_dim) * sizeof(float)); + } + Matrix3D final_value_states(ret_value_states, this->num_heads, tgz, this->head_dim); + Matrix3D final_key_states(ret_key_states, this->num_heads, tgz, this->head_dim); + PROFILE_END(profile_name + "::cat_past_keys_values"); + + // QK_BMM + // printf(("Before qk_bmm\n"); + Matrix3D attn_weights(attn_weights_arr, this->num_heads, sqlen, tgz); + this->qk_bmm.forward(query_states, final_key_states, attn_weights); + + // Add mask + // printf(("Before add_mask\n"); + batch_Add(attn_weights, input.attention_mask, attn_weights); + + // Softmax QK + // printf(("Before softmax\n"); + Matrix3D attn_probs(attn_weights_arr, this->num_heads, sqlen, tgz); + softmax(attn_weights, attn_probs, 2); + + // Transpose V for PV_BMM + // printf(("Before transpose\n"); + Matrix3D value_states_transpose(value_states_transpose_arr, this->num_heads, this->head_dim, tgz); + transpose_1_2idx(final_value_states, value_states_transpose); + Matrix3D attn_output(attn_output_arr, this->num_heads, sqlen, this->head_dim); + this->pv_bmm.forward(attn_probs, value_states_transpose, attn_output); + + Matrix3D attn_output_transpose(attn_output_transpose_arr, 1, sqlen, this->num_heads * this->head_dim); + this->unshape(attn_output, attn_output_transpose, sqlen); + + // Output projection + // printf(("Before c_proj\n"); + Matrix3D attn_output_fp(attn_output_fp_arr, 1, sqlen, this->num_heads * this->head_dim); + this->c_proj.forward(attn_output_transpose, attn_output_fp); + + // Output assignment + output.attn_output = attn_output_fp; + output.past_key_value = {final_key_states, final_value_states}; + + PROFILE_END(profile_name); + return output; +} diff --git a/llm/src/nn_modules/Int4GPTBigCodeDecoder.cc b/llm/src/nn_modules/Int4GPTBigCodeDecoder.cc new file mode 100644 index 00000000..9684ca53 --- /dev/null +++ b/llm/src/nn_modules/Int4GPTBigCodeDecoder.cc @@ -0,0 +1,160 @@ +#include "Int4GPTBigCodeDecoder.h" + +#include +#include + +#include "utils.h" + +Matrix3D Int4GPTBigCodeDecoder::prepare_decoder_attention_mask(int length, int past_length) { + PROFILE_START("Int4GPTBigCodeDecoder::prepare_decoder_attention_mask"); + assert(length - past_length > 0); + Matrix3D causal_attention_mask(attention_mask_buf, 1, length - past_length, length); + for (int i = 0; i < length - past_length; i++) { + for (int j = 0; j < length; j++) { + if (i + past_length < j) { + causal_attention_mask(0, i, j) = -65504.0; + } else { + causal_attention_mask(0, i, j) = 0.0; + } + } + } + + PROFILE_END("Int4GPTBigCodeDecoder::prepare_decoder_attention_mask"); + return causal_attention_mask; +} + +// Matrix3D Int4GPTBigCodeDecoder::get_position_embed(int sql_length, int past_length) { +// PROFILE_START("Int4GPTBigCodeDecoder::get_position_embed"); +// const int offset = 2; // This is specific for GPTBigCode model +// Matrix3D pos_embeds(pos_embeds_buf, 1, sql_length, this->embed_dim); + +// int start_idx = past_length + offset, end_idx = past_length + sql_length + offset; +// assert(end_idx < this->embed_positions.lookup.m_dim_y); + +// memcpy(pos_embeds.m_data, &this->embed_positions.lookup.m_data[start_idx * this->embed_dim], +// sql_length * this->embed_dim * sizeof(float)); + +// PROFILE_END("Int4GPTBigCodeDecoder::get_position_embed"); +// return pos_embeds; +// } + +Int4GPTBigCodeDecoder::Int4GPTBigCodeDecoder(std::string param_path, const struct model_config config) { + allocate_aligned_memory(attention_mask_buf, config.max_sqlen * config.max_sqlen * sizeof(float)); + allocate_aligned_memory(pos_embeds_buf, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(last_hidden_states_buf, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(hidden_states_buf, config.max_sqlen * config.embed_dim * sizeof(float)); + + this->voc_size = config.vocsize; + this->embed_dim = config.embed_dim; + this->hidden_dim = config.hidden_dim; + this->num_heads = config.num_heads; + this->padding_idx = config.padding_idx; + this->max_position_embeddings = 2048; // To be fixed + + // Embedding + Matrix3D embweight(new float[voc_size * embed_dim], 1, voc_size, embed_dim); + this->wte = Embedding(embed_dim, voc_size, padding_idx, embweight); + load_Embedding_params(this->wte, param_path + "/wte"); + Matrix3D posweight(new float[max_position_embeddings * embed_dim], 1, max_position_embeddings, embed_dim); + this->wpe = Embedding(embed_dim, max_position_embeddings, padding_idx, posweight); + load_Embedding_params(this->wpe, param_path + "/wpe"); + + // LayerNorm + Matrix3D LN_weight(new float[config.embed_dim], 1, 1, config.embed_dim); + Matrix3D LN_bias(new float[config.embed_dim], 1, 1, config.embed_dim); + struct LayerNorm_params LN_params = {LN_weight, LN_bias}; + this->ln_f = LayerNorm(LN_params); + load_LayerNorm(this->ln_f, param_path + "/ln_f"); + + // Load all the decoder layers + for (int layer_idx = 0; layer_idx < config.num_layers; layer_idx++) { + DEBUG_INS(std::cout << "Start loading layer:" << layer_idx << "..." << std::endl;) + + std::string path = param_path + "/layer" + std::to_string(layer_idx); + + Int4GPTBigCodeDecoderLayer layer = Int4GPTBigCodeDecoderLayer(path, config, layer_idx); + this->layers.push_back(layer); + } +}; + +// GPTBigCodeDecoder: +struct Int4GPTBigCodeDecoder_output Int4GPTBigCodeDecoder::forward(const struct Int4GPTBigCodeDecoder_input &input) { + PROFILE_START(profile_name); + int sqlen = input.input_ids.m_dim_z, batch_size = input.input_ids.m_dim_x, past_key_values_length = 0; + + // Input token -> Embedding + // printf(("Int4GPTBigCodeDecoder starts\n"); +#ifdef _WIN32 + std::vector inputs_embeds_buf_vec(sqlen * this->embed_dim); + float *inputs_embeds_buf = &inputs_embeds_buf_vec.front(); +#else + // printf(("uou\n"); + float inputs_embeds_buf[sqlen * this->embed_dim]; + // printf(("wowwww\n"); +#endif + Matrix3D inputs_embeds(inputs_embeds_buf, 1, sqlen, this->embed_dim); + // printf(("lolll\n"); + this->wte.forward(input.input_ids, inputs_embeds); + // printf(("aaaaaaa\n"); + + if (input.has_past_keys_values) { + past_key_values_length = input.past_keys[0].m_dim_y; + } + + // Attention mask // To be checked + // printf(("Before prepare_decoder_attention_mask\n"); + Matrix3D causal_attention_mask = + this->prepare_decoder_attention_mask(sqlen + past_key_values_length, past_key_values_length); + + // Position embeddings + // printf(("Before get_position_embed\n"); + // Matrix3D pos_embeds = this->get_position_embed(sqlen, past_key_values_length); +#ifdef _WIN32 + std::vector position_ids_buf_vec(sqlen); + float *position_ids_buf = &position_ids_buf_vec.front(); + std::vector pos_embeds_buf_vec(sqlen * this->embed_dim); + float *pos_embeds_buf = &pos_embeds_buf_vec.front(); +#else + int position_ids_buf[sqlen]; + float pos_embeds_buf[sqlen * this->embed_dim]; +#endif + Matrix3D position_ids(position_ids_buf, 1, 1, sqlen); + for (int i = 0; i < sqlen; i++) position_ids.m_data[i] = i + past_key_values_length; + Matrix3D pos_embeds(pos_embeds_buf, 1, sqlen, this->embed_dim); + this->wpe.forward(position_ids, pos_embeds); + + assert(inputs_embeds.m_dim_x == pos_embeds.m_dim_x); + assert(inputs_embeds.m_dim_y == pos_embeds.m_dim_y); + assert(inputs_embeds.m_dim_z == pos_embeds.m_dim_z); + Matrix3D hidden_states(hidden_states_buf, 1, sqlen, this->embed_dim); + for (int i = 0; i < inputs_embeds.length(); i++) + hidden_states.m_data[i] = inputs_embeds.m_data[i] + pos_embeds.m_data[i]; + + // Go through each layer + // printf(("Before layers\n"); + std::vector> past_keys, past_values; + for (int i = 0; i < this->layers.size(); i++) { + if (!input.has_past_keys_values) { + struct Int4GPTBigCodeDecoderLayer_input l_i = {hidden_states, causal_attention_mask}; + struct Int4GPTBigCodeDecoderLayer_output l_o = this->layers[i].forward(l_i); + hidden_states = l_o.hidden_states; + past_keys.push_back(l_o.past_key_value.first); + past_values.push_back(l_o.past_key_value.second); + } else { + struct Int4GPTBigCodeDecoderLayer_input l_i = {hidden_states, causal_attention_mask, input.past_keys[i], + input.past_values[i]}; + struct Int4GPTBigCodeDecoderLayer_output l_o = this->layers[i].forward(l_i); + hidden_states = l_o.hidden_states; + past_keys.push_back(l_o.past_key_value.first); + past_values.push_back(l_o.past_key_value.second); + } + } + + // Layernorm + Matrix3D last_hidden_states(last_hidden_states_buf, 1, sqlen, this->embed_dim); + this->ln_f.forward(hidden_states, last_hidden_states); + + struct Int4GPTBigCodeDecoder_output output = {last_hidden_states, past_keys, past_values}; + PROFILE_END(profile_name); + return output; +} diff --git a/llm/src/nn_modules/Int4GPTBigCodeDecoderLayer.cc b/llm/src/nn_modules/Int4GPTBigCodeDecoderLayer.cc new file mode 100644 index 00000000..c7a77d19 --- /dev/null +++ b/llm/src/nn_modules/Int4GPTBigCodeDecoderLayer.cc @@ -0,0 +1,128 @@ +#include "Int4GPTBigCodeDecoderLayer.h" + +#include "utils.h" + +// Shared memory space across all layers +static float *hidden_states_float_arr; +static float *ln_2_arr; +static float *fc_1_arr; +static float *fc_2_arr; +static float *temp; +static float *hidden_states_arr; + +template +void add(Matrix3D a, Matrix3D b, Matrix3D c) { + PROFILE_START("Int4GPTBigCodeDecoderLayer::add"); + assert(c.length() == a.length() && a.length() == b.length()); + + for (int i = 0; i < a.length(); i++) { + c.m_data[i] = a.m_data[i] + b.m_data[i]; + } + PROFILE_END("Int4GPTBigCodeDecoderLayer::add"); +} + +static const float GELU_COEF_A = 0.044715f; +static const float SQRT_2_OVER_PI = 0.79788456080286535587989211986876f; +inline static float Gelu_imp(float x) { + return 0.5f * x * (1.0f + tanhf(SQRT_2_OVER_PI * x * (1.0f + GELU_COEF_A * x * x))); +} +inline static void Gelu(Matrix3D a) { + PROFILE_START("Int4GPTBigCodeDecoderLayer::Gelu"); + for (int i = 0; i < a.length(); i++) { + a.m_data[i] = Gelu_imp(a.m_data[i]); + } + PROFILE_END("Int4GPTBigCodeDecoderLayer::Gelu"); +} + +Int4GPTBigCodeDecoderLayer::Int4GPTBigCodeDecoderLayer(std::string param_path, const model_config config, int layer_idx) { + if (layer_idx == 0) { + allocate_aligned_memory(hidden_states_float_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(ln_2_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(fc_1_arr, config.max_sqlen * config.hidden_dim * sizeof(float)); + allocate_aligned_memory(fc_2_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + allocate_aligned_memory(hidden_states_arr, config.max_sqlen * config.embed_dim * sizeof(float)); + Int4GPTBigCodeAttention::initialized_memory(config); + } + + struct LayerNorm_params ln_1, ln_2; + Matrix3D ln_1_weight(new float[config.embed_dim], 1, 1, config.embed_dim); + Matrix3D ln_1_bias(new float[config.embed_dim], 1, 1, config.embed_dim); + ln_1.weight = ln_1_weight; + ln_1.bias = ln_1_bias; + + Matrix3D ln_2_weight(new float[config.embed_dim], 1, 1, config.embed_dim); + Matrix3D ln_2_bias(new float[config.embed_dim], 1, 1, config.embed_dim); + ln_2.weight = ln_2_weight; + ln_2.bias = ln_2_bias; + this->ln_1 = LayerNorm(ln_1); + load_LayerNorm(this->ln_1, param_path + "/ln_1"); + this->ln_2 = LayerNorm(ln_2); + load_LayerNorm(this->ln_2, param_path + "/ln_2"); + + uint8_t *fc1_weight, *fc2_weight; + allocate_aligned_memory(fc1_weight, (config.embed_dim * config.hidden_dim * sizeof(uint8_t) / 2)); + allocate_aligned_memory(fc2_weight, (config.embed_dim * config.hidden_dim * sizeof(uint8_t) / 2)); + float *fc1_bias, *fc2_bias; + allocate_aligned_memory(fc1_bias, (config.hidden_dim * sizeof(float))); + allocate_aligned_memory(fc2_bias, (config.embed_dim * sizeof(float))); + this->fc1 = + Linear_FP_int4(Matrix3D(fc1_weight, 1, config.hidden_dim, config.embed_dim / 2), param_path + "/c_fc", + Matrix3D(fc1_bias, 1, 1, config.hidden_dim), param_path + "/c_fc/bias.bin"); + this->fc1.has_bias = true; + this->fc2 = + Linear_FP_int4(Matrix3D(fc2_weight, 1, config.embed_dim, config.hidden_dim / 2), param_path + "/c_proj", + Matrix3D(fc2_bias, 1, 1, config.embed_dim), param_path + "/c_proj/bias.bin"); + this->fc2.has_bias = true; + + this->embed_dim = config.embed_dim; + this->num_attention_heads = config.num_heads; + this->hidden_dim = config.hidden_dim; + this->layer_idx = layer_idx; + + this->attn = Int4GPTBigCodeAttention(param_path + "/attn", config); +} + +struct Int4GPTBigCodeDecoderLayer_output Int4GPTBigCodeDecoderLayer::forward(const struct Int4GPTBigCodeDecoderLayer_input &input) { + PROFILE_START(profile_name); + // Layernorm + // printf(("Before ln_1\n"); + Matrix3D hidden_states(hidden_states_arr, input.hidden_states.m_dim_x, input.hidden_states.m_dim_y, + input.hidden_states.m_dim_z); + this->ln_1.forward(input.hidden_states, hidden_states); + + // Attention + // printf(("Before attn\n"); + struct Int4GPTBigCodeAttention_input attn_param(hidden_states, input.attention_mask, input.past_key, input.past_value, + input.has_past_key_value, this->layer_idx); + struct Int4GPTBigCodeAttention_output attn_output = this->attn.forward(attn_param); + // printf(("After attn\n"); + + // Residual add + Matrix3D residual_add(hidden_states_float_arr, input.hidden_states.m_dim_x, input.hidden_states.m_dim_y, + input.hidden_states.m_dim_z); + add(input.hidden_states, attn_output.attn_output, residual_add); + + // Layernorm + Matrix3D ln_2(ln_2_arr, input.hidden_states.m_dim_x, input.hidden_states.m_dim_y, + input.hidden_states.m_dim_z); + this->ln_2.forward(residual_add, ln_2); + + // FC 1 + Matrix3D fc1_out(fc_1_arr, input.hidden_states.m_dim_x, input.hidden_states.m_dim_y, this->hidden_dim); + this->fc1.forward(ln_2, fc1_out); + + // GELU + Gelu(fc1_out); + + // FC 2 + Matrix3D fc2_out(fc_2_arr, input.hidden_states.m_dim_x, input.hidden_states.m_dim_y, + input.hidden_states.m_dim_z); + this->fc2.forward(fc1_out, fc2_out); + + // Reidual add + add(residual_add, fc2_out, residual_add); + + struct Int4GPTBigCodeDecoderLayer_output output(residual_add, attn_output.attn_probs_reshaped, attn_output.past_key_value); + PROFILE_END(profile_name); + return output; +} diff --git a/llm/src/nn_modules/Int4GPTBigCodeForCausalLM.cc b/llm/src/nn_modules/Int4GPTBigCodeForCausalLM.cc new file mode 100644 index 00000000..75ea3a79 --- /dev/null +++ b/llm/src/nn_modules/Int4GPTBigCodeForCausalLM.cc @@ -0,0 +1,40 @@ +#include "Int4GPTBigCodeForCausalLM.h" + +#include + +#include "operators.h" +#include "utils.h" + +Int4GPTBigCodeForCausalLM::Int4GPTBigCodeForCausalLM(std::string param_path, const struct model_config config) { + allocate_aligned_memory(logits_output, config.max_sqlen * config.vocsize * sizeof(float)); + allocate_aligned_memory(lm_head_weight, config.embed_dim * config.vocsize * sizeof(uint8_t) / 2); + this->decoder = Int4GPTBigCodeDecoder(param_path + "/decoder", config); + this->lm_head = + Linear_FP_int4(Matrix3D(lm_head_weight, 1, config.vocsize, config.embed_dim / 2), param_path + "/lm_head"); +} + +struct Int4GPTBigCodeForCausalLM_output Int4GPTBigCodeForCausalLM::forward(std::string param_path, const struct Int4GPTBigCodeForCausalLM_input &input) { + // printf(("Int4GPTBigCodeForCausalLM::forward\n"); + PROFILE_START(profile_name); + // printf(("Int4GPTBigCodeForCausalLM starts\n"); + int sqlen = input.input_ids.m_dim_z; + + struct Int4GPTBigCodeDecoder_output decoder_output; + // printf(("Before this->decoder.forward\n"); + if (input.has_past_keys_values) { + struct Int4GPTBigCodeDecoder_input decoder_input = {input.input_ids, input.past_keys, input.past_values}; + decoder_output = this->decoder.forward(decoder_input); + } else { + // printf(("00000000\n"); + struct Int4GPTBigCodeDecoder_input decoder_input = {input.input_ids}; + // printf(("11111111\n"); + decoder_output = this->decoder.forward(decoder_input); + } + + Matrix3D logits(logits_output, 1, sqlen, this->decoder.voc_size); + this->lm_head.forward(decoder_output.last_hidden_state, logits); + + struct Int4GPTBigCodeForCausalLM_output LMoutput = {logits, decoder_output.past_keys, decoder_output.past_values}; + PROFILE_END(profile_name); + return LMoutput; +} diff --git a/llm/tools/model_quantizer.py b/llm/tools/model_quantizer.py index 7201cc51..66632edd 100644 --- a/llm/tools/model_quantizer.py +++ b/llm/tools/model_quantizer.py @@ -128,9 +128,11 @@ def _quantize_model( layer_num = 32 elif model_name_size.startswith("LLaMA_13B") or model_name_size.startswith("CodeLLaMA_13B"): layer_num = 40 + elif model_name_size.startswith("StarCoder"): + layer_num = 40 else: raise ValueError( - "Invalid model name. Expected 'OPT_125m', 'OPT_1.3B', 'OPT_6.7B', or 'LLaMA_7B', or 'LLaMA_7B'." + "Invalid model name. Expected 'OPT_125m', 'OPT_1.3B', 'OPT_6.7B', 'LLaMA_7B', 'LLaMA_13B', 'CodeLLaMA_7B', 'CodeLLaMA_13B', or 'StarCoder'." ) # Check quantization method @@ -425,6 +427,99 @@ def _quantize_model( _rm_and_cp_dir_if_exist(file_path, os.path.join(output_path, file_path)) print("Quantization of norm finished.") + # StarCoder + elif model_name.startswith("StarCoder"): + # Quantize lm_head + file_path = f"{prefix}" + weight_path = f"{file_path}/lm_head.bin" + file_size_bytes = os.path.getsize(weight_path) + if file_size_bytes % bytes_per_element != 0: + raise ValueError(f"Invalid file size of {weight_path}. Expected multiple of element number.") + array_size = file_size_bytes // bytes_per_element + qs, d, m, zp = quantize_method(weight_path, array_size, data_type, 1, array_size) # TODO: fix this for QM_CUDA + _write_weight_to_file(os.path.join(output_path, file_path), qs, d, m, zp, is_cuda, True) + print("Quantization of lm_head finished.") + + # Quantize wpe + dir_path = f"{prefix}/decoder/wpe" + _rm_and_cp_dir_if_exist(dir_path, os.path.join(output_path, dir_path)) + + # wte + dir_path = f"{prefix}/decoder/wte" + _rm_and_cp_dir_if_exist(dir_path, os.path.join(output_path, dir_path)) + + # ln_f + dir_path = f"{prefix}/decoder/ln_f" + _rm_and_cp_dir_if_exist(dir_path, os.path.join(output_path, dir_path)) + + # Quantize layers + for idx in range(layer_num): + # Quantize c_fc + file_path = f"{prefix}/decoder/layer{idx}/c_fc" + weight_path = f"{file_path}/weight.bin" + file_size_bytes = os.path.getsize(weight_path) + if file_size_bytes % bytes_per_element != 0: + raise ValueError(f"Invalid file size of {weight_path}. Expected multiple of element number.") + array_size = file_size_bytes // bytes_per_element + qs, d, m, zp = quantize_method( + weight_path, array_size, data_type, 1, array_size + ) # TODO: fix this for QM_CUDA + _write_weight_to_file(os.path.join(output_path, file_path), qs, d, m, zp, is_cuda) + os.system(f"cp {os.path.join(file_path, 'bias.bin')} {os.path.join(output_path, file_path, 'bias.bin')}") + + # Quantize c_proj + file_path = f"{prefix}/decoder/layer{idx}/c_proj" + weight_path = f"{file_path}/weight.bin" + file_size_bytes = os.path.getsize(weight_path) + if file_size_bytes % bytes_per_element != 0: + raise ValueError(f"Invalid file size of {weight_path}. Expected multiple of element number.") + array_size = file_size_bytes // bytes_per_element + qs, d, m, zp = quantize_method( + weight_path, array_size, data_type, 1, array_size + ) # TODO: fix this for QM_CUDA + _write_weight_to_file(os.path.join(output_path, file_path), qs, d, m, zp, is_cuda) + os.system(f"cp {os.path.join(file_path, 'bias.bin')} {os.path.join(output_path, file_path, 'bias.bin')}") + + # ln_1 + dir_path = f"{prefix}/decoder/layer{idx}/ln_1" + _rm_and_cp_dir_if_exist(dir_path, os.path.join(output_path, dir_path)) + + # ln_2 + dir_path = f"{prefix}/decoder/layer{idx}/ln_2" + _rm_and_cp_dir_if_exist(dir_path, os.path.join(output_path, dir_path)) + + # Quantize attn/c_attn + file_path = f"{prefix}/decoder/layer{idx}/attn/c_attn" + weight_path = f"{file_path}/weight.bin" + file_size_bytes = os.path.getsize(weight_path) + if file_size_bytes % bytes_per_element != 0: + raise ValueError(f"Invalid file size of {weight_path}. Expected multiple of element number.") + array_size = file_size_bytes // bytes_per_element + qs, d, m, zp = quantize_method( + weight_path, array_size, data_type, 1, array_size + ) # TODO: fix this for QM_CUDA + _write_weight_to_file(os.path.join(output_path, file_path), qs, d, m, zp, is_cuda) + os.system(f"cp {os.path.join(file_path, 'bias.bin')} {os.path.join(output_path, file_path, 'bias.bin')}") + + # Quantize attn/c_proj + file_path = f"{prefix}/decoder/layer{idx}/attn/c_proj" + weight_path = f"{file_path}/weight.bin" + file_size_bytes = os.path.getsize(weight_path) + if file_size_bytes % bytes_per_element != 0: + raise ValueError(f"Invalid file size of {weight_path}. Expected multiple of element number.") + array_size = file_size_bytes // bytes_per_element + qs, d, m, zp = quantize_method( + weight_path, array_size, data_type, 1, array_size + ) # TODO: fix this for QM_CUDA + _write_weight_to_file(os.path.join(output_path, file_path), qs, d, m, zp, is_cuda) + os.system(f"cp {os.path.join(file_path, 'bias.bin')} {os.path.join(output_path, file_path, 'bias.bin')}") + + # cp attn/qk_bmm + dir_path = f"{prefix}/decoder/layer{idx}/attn/qk_bmm" + _rm_and_cp_dir_if_exist(dir_path, os.path.join(output_path, dir_path)) + + print(f"Quantization of layer {idx} finished.") + print(f"All the weights of {model_name_size} has been quantized with {method} method.") diff --git a/llm/tools/starcoder_exporter.py b/llm/tools/starcoder_exporter.py new file mode 100644 index 00000000..8172fc13 --- /dev/null +++ b/llm/tools/starcoder_exporter.py @@ -0,0 +1,170 @@ +"""Implementation of exporting StarCoder PyTorch model to TinyChatEngine format. + +Usage: + python starcoder_exporter.py + +Example commandline: + python starcoder_exporter.py ~/starcoder models/StarCoder +""" +import argparse +import math +import os +import struct +import numpy as np + +import torch +from transformers import AutoModelForCausalLM, AutoConfig + +n_head = 48 +embed_dim = 6144 +head_dim = embed_dim // n_head + +@torch.no_grad() +def _export_model(model, prefix): + + outpath = prefix + os.makedirs(outpath, exist_ok=True) + with open(os.path.join(f"{outpath}", "lm_head.bin"), "wb") as f: + f.write(model.lm_head._parameters["weight"].cpu().float().numpy().tobytes()) + _export_starcoder_model(model.transformer, os.path.join(f"{outpath}", "decoder")) + + +def _export_wte_wpe(embed_tokens, prefix): + outpath = prefix + os.makedirs(outpath, exist_ok=True) + with open(os.path.join(f"{outpath}", "weight.bin"), "wb") as f: + f.write(embed_tokens.weight.cpu().float().numpy().tobytes()) + + +def _export_starcoder_model(model, prefix): + outpath = prefix + os.makedirs(outpath, exist_ok=True) + + _export_wte_wpe(model.wte, os.path.join(outpath, "wte")) + _export_wte_wpe(model.wpe, os.path.join(outpath, "wpe")) + _export_LayerNorm(model.ln_f, os.path.join(f"{outpath}", "ln_f")) + for idx, layer in enumerate(model.h): + _export_starcoder_layer(layer, os.path.join(outpath, f"layer{idx}")) + +def _export_LayerNorm(op, prefix): + outpath = prefix + os.makedirs(outpath, exist_ok=True) + with open(os.path.join(f"{outpath}", "weight.bin"), "wb") as f: + f.write(op.weight.cpu().float().numpy().tobytes()) + with open(os.path.join(f"{outpath}", "bias.bin"), "wb") as f: + f.write(op.bias.cpu().float().numpy().tobytes()) + +def _export_starcoder_layer(layer, prefix): + outpath = prefix + os.makedirs(outpath, exist_ok=True) + _export_attention_params(layer.attn, os.path.join(outpath, "attn")) + _export_LayerNorm(layer.ln_1, os.path.join(f"{outpath}", "ln_1")) + _export_LinearFP(layer.mlp.c_fc, os.path.join(outpath, "c_fc")) + _export_LinearFP(layer.mlp.c_proj, os.path.join(outpath, "c_proj")) + _export_LayerNorm(layer.ln_2, os.path.join(f"{outpath}", "ln_2")) + +def _export_LinearFP(op, prefix): + outpath = prefix + os.makedirs(outpath, exist_ok=True) + with open(os.path.join(f"{outpath}", "weight.bin"), "wb") as f: + f.write(op._parameters["weight"].cpu().float().numpy().tobytes()) + with open(os.path.join(f"{outpath}", "bias.bin"), "wb") as f: + f.write(op._parameters["bias"].cpu().float().numpy().tobytes()) + +def _export_LinearFP_MQAtoMHA(op, prefix): + outpath = prefix + os.makedirs(outpath, exist_ok=True) + + # Weight + weight_data = op._parameters["weight"].cpu().float().squeeze().numpy() + # ((n_heads + 2) * head_dim, hidden_dim) -> (3 * n_heads * head_dim, hidden_dim) + q, k, v = np.split(weight_data, (n_head * head_dim, (n_head + 1) * head_dim), axis=0) + # duplicate k, v along the first axis (head_dim, hidden_dim) -> (n_heads * head_dim, hidden_dim) + if len(k.shape) == 2: + k = np.tile(k, (n_head, 1)) + v = np.tile(v, (n_head, 1)) + elif len(k.shape) == 1: + k = np.tile(k, (n_head)) + v = np.tile(v, (n_head)) + # concat q, k, v along the first axis (n_heads * head_dim, hidden_dim) -> (3 * n_heads * head_dim, hidden_dim) + weight_data = np.concatenate((q, k, v), axis=0) + + # Bias + bias_data = op._parameters["bias"].cpu().float().squeeze().numpy() + # ((n_heads + 2) * head_dim, hidden_dim) -> (3 * n_heads * head_dim, hidden_dim) + q, k, v = np.split(bias_data, (n_head * head_dim, (n_head + 1) * head_dim), axis=0) + # duplicate k, v along the first axis (head_dim, hidden_dim) -> (n_heads * head_dim, hidden_dim) + if len(k.shape) == 2: + k = np.tile(k, (n_head, 1)) + v = np.tile(v, (n_head, 1)) + elif len(k.shape) == 1: + k = np.tile(k, (n_head)) + v = np.tile(v, (n_head)) + # concat q, k, v along the first axis (n_heads * head_dim, hidden_dim) -> (3 * n_heads * head_dim, hidden_dim) + bias_data = np.concatenate((q, k, v), axis=0) + + with open(os.path.join(f"{outpath}", "weight.bin"), "wb") as f: + f.write(weight_data.tobytes()) + with open(os.path.join(f"{outpath}", "bias.bin"), "wb") as f: + f.write(bias_data.tobytes()) + +def _export_BMM_F32T(alpha, prefix): + outpath = prefix + os.makedirs(outpath, exist_ok=True) + with open(os.path.join(f"{outpath}", "alpha.bin"), "wb") as f: + f.write(struct.pack("f", alpha)) + + +def _export_attention_params(attn, prefix: str): + outpath = prefix + os.makedirs(outpath, exist_ok=True) + # with open(os.path.join(outpath, "scaling.bin"), "wb") as f: + # f.write(bytearray(struct.pack("f", attn.scaling))) + _export_LinearFP_MQAtoMHA(attn.c_attn, os.path.join(outpath, "c_attn")) + _export_LinearFP(attn.c_proj, os.path.join(outpath, "c_proj")) + qk_bmm_alpha = 1 / math.sqrt(head_dim) + _export_BMM_F32T(qk_bmm_alpha, os.path.join(outpath, "qk_bmm")) + + +def main(): + """Export a StarCoder model to TinyChatEngine format.""" + parser = argparse.ArgumentParser(description="export StarCoder pytorch model to TinyChatEngine format.") + parser.add_argument("--hf_path", type=str, help="Path to huggingface model hub", default=None) + parser.add_argument("--model", type=str, help="Path of the StarCoder torch model") + parser.add_argument("--output", type=str, help="Output directory of the exported model") + + args = parser.parse_args() + + if args.hf_path is None: + if not os.path.exists(args.model): + print(f"The model path '{args.model}' does not exist.") + return + + if not os.path.exists(args.output): + print(f"The model path '{args.output}' does not exist.") + return + + print("Loading model...") + if args.model.endswith(".pt"): + if args.model.split("/")[-1].lower().startswith("starcoder"): + print("Loading StarCoder model..."); + config = AutoConfig.from_pretrained("models/starcoder", trust_remote_code=True) + model = AutoModelForCausalLM.from_pretrained("models/starcoder", config=config, torch_dtype=torch.float16, low_cpu_mem_usage=True, trust_remote_code=True, offload_state_dict=True) + else: + print("Model not supported.") + return + + model.load_state_dict(torch.load(args.model)) + else: + print("Loading StarCoder model..."); + config = AutoConfig.from_pretrained(args.model, trust_remote_code=True) + model = AutoModelForCausalLM.from_pretrained(args.model, config=config, torch_dtype=torch.float32, low_cpu_mem_usage=True, trust_remote_code=True, offload_state_dict=True) + else: + model = AutoModelForCausalLM.from_pretrained(args.hf_path, torch_dtype=torch.float32) + + print("Start exporting the model...") + _export_model(model, args.output) + + +if __name__ == "__main__": + main()