From 1151653b159a679a5ec47c177e7c8aab4b8ed2ad Mon Sep 17 00:00:00 2001 From: xaedes Date: Wed, 16 Aug 2023 21:36:40 +0200 Subject: [PATCH] replace llama API functions to get model tensors by one function to get model tensor by name LLAMA_API struct ggml_tensor * llama_get_model_tensor(struct llama_model * model, const char * name); --- examples/finetune/finetune.cpp | 51 ++++++++++++++++++++---------- llama.cpp | 58 ++-------------------------------- llama.h | 21 ++---------- 3 files changed, 38 insertions(+), 92 deletions(-) diff --git a/examples/finetune/finetune.cpp b/examples/finetune/finetune.cpp index 83ee4df02..05174b940 100644 --- a/examples/finetune/finetune.cpp +++ b/examples/finetune/finetune.cpp @@ -339,12 +339,12 @@ void init_model(struct llama_model * input, struct my_llama_model * model, uint3 auto & hparams = model->hparams; hparams.n_vocab = llama_n_vocab_from_model(input); - hparams.n_ctx = n_ctx; - hparams.n_embd = llama_n_embd_from_model(input); - hparams.n_mult = llama_n_mult_from_model(input); - hparams.n_head = llama_n_head_from_model(input); + hparams.n_ctx = n_ctx; + hparams.n_embd = llama_n_embd_from_model(input); + hparams.n_mult = llama_n_mult_from_model(input); + hparams.n_head = llama_n_head_from_model(input); hparams.n_layer = llama_n_layer_from_model(input); - hparams.n_rot = llama_n_rot_from_model(input); + hparams.n_rot = llama_n_rot_from_model(input); const uint32_t n_embd = hparams.n_embd; const uint32_t n_layer = hparams.n_layer; @@ -352,27 +352,44 @@ void init_model(struct llama_model * input, struct my_llama_model * model, uint3 const uint32_t n_ff = get_n_ff(&hparams); - model->tok_embeddings = llama_get_model_tok_embeddings(input); - model->norm = llama_get_model_norm(input); - model->output = llama_get_model_output(input); + model->tok_embeddings = llama_get_model_tensor(input, "tok_embeddings.weight"); + model->norm = llama_get_model_tensor(input, "norm.weight"); + model->output = llama_get_model_tensor(input, "output.weight"); model->layers.resize(n_layer); + + char name[GGML_MAX_NAME]; + for (uint32_t i = 0; i < n_layer; ++i) { struct llama_layer * ilayer = llama_get_layer_from_model(input, i); auto & layer = model->layers[i]; - layer.attention_norm = llama_get_layer_attention_norm(ilayer); + snprintf(name, GGML_MAX_NAME, "layers.%d.attention_norm.weight", i); + layer.attention_norm = llama_get_model_tensor(input, name); - layer.wq = llama_get_layer_wq(ilayer); - layer.wk = llama_get_layer_wk(ilayer); - layer.wv = llama_get_layer_wv(ilayer); - layer.wo = llama_get_layer_wo(ilayer); + snprintf(name, GGML_MAX_NAME, "layers.%d.attention.wq.weight", i); + layer.wq = llama_get_model_tensor(input, name); - layer.ffn_norm = llama_get_layer_ffn_norm(ilayer); + snprintf(name, GGML_MAX_NAME, "layers.%d.attention.wk.weight", i); + layer.wk = llama_get_model_tensor(input, name); - layer.w1 = llama_get_layer_w1(ilayer); - layer.w2 = llama_get_layer_w2(ilayer); - layer.w3 = llama_get_layer_w3(ilayer); + snprintf(name, GGML_MAX_NAME, "layers.%d.attention.wv.weight", i); + layer.wv = llama_get_model_tensor(input, name); + + snprintf(name, GGML_MAX_NAME, "layers.%d.attention.wo.weight", i); + layer.wo = llama_get_model_tensor(input, name); + + snprintf(name, GGML_MAX_NAME, "layers.%d.ffn_norm.weight", i); + layer.ffn_norm = llama_get_model_tensor(input, name); + + snprintf(name, GGML_MAX_NAME, "layers.%d.feed_forward.w1.weight", i); + layer.w1 = llama_get_model_tensor(input, name); + + snprintf(name, GGML_MAX_NAME, "layers.%d.feed_forward.w2.weight", i); + layer.w2 = llama_get_model_tensor(input, name); + + snprintf(name, GGML_MAX_NAME, "layers.%d.feed_forward.w3.weight", i); + layer.w3 = llama_get_model_tensor(input, name); } } diff --git a/llama.cpp b/llama.cpp index 35ea68075..6af1e003c 100644 --- a/llama.cpp +++ b/llama.cpp @@ -4213,62 +4213,8 @@ int llama_get_vocab( return llama_get_vocab_from_model(&ctx->model, strings, scores, capacity); } -struct llama_layer * llama_get_layer_from_model( - struct llama_model * model, - int layer_idx) { - if (layer_idx < 0 || layer_idx >= model->hparams.n_layer) { - return NULL; - } else { - return &model->layers[layer_idx]; - } -} - -struct ggml_tensor * llama_get_model_tok_embeddings(struct llama_model * model) { - return model->tok_embeddings; -} - -struct ggml_tensor * llama_get_model_norm(struct llama_model * model) { - return model->norm; -} - -struct ggml_tensor * llama_get_model_output(struct llama_model * model) { - return model->output; -} - -struct ggml_tensor * llama_get_layer_attention_norm(struct llama_layer * layer) { - return layer->attention_norm; -} - -struct ggml_tensor * llama_get_layer_wq(struct llama_layer * layer) { - return layer->wq; -} - -struct ggml_tensor * llama_get_layer_wk(struct llama_layer * layer) { - return layer->wk; -} - -struct ggml_tensor * llama_get_layer_wv(struct llama_layer * layer) { - return layer->wv; -} - -struct ggml_tensor * llama_get_layer_wo(struct llama_layer * layer) { - return layer->wo; -} - -struct ggml_tensor * llama_get_layer_ffn_norm(struct llama_layer * layer) { - return layer->ffn_norm; -} - -struct ggml_tensor * llama_get_layer_w1(struct llama_layer * layer) { - return layer->w1; -} - -struct ggml_tensor * llama_get_layer_w2(struct llama_layer * layer) { - return layer->w2; -} - -struct ggml_tensor * llama_get_layer_w3(struct llama_layer * layer) { - return layer->w3; +struct ggml_tensor * llama_get_model_tensor(struct llama_model * model, const char * name) { + return ggml_get_tensor(model->ctx, name); } float * llama_get_logits(struct llama_context * ctx) { diff --git a/llama.h b/llama.h index 365bb185f..bb6c3c107 100644 --- a/llama.h +++ b/llama.h @@ -69,7 +69,6 @@ extern "C" { struct llama_model; struct llama_context; - struct llama_layer; typedef int llama_token; @@ -357,24 +356,8 @@ extern "C" { float * scores, int capacity); - // Get a llama layer - LLAMA_API struct llama_layer * llama_get_layer_from_model( - struct llama_model * model, - int layer); - - LLAMA_API struct ggml_tensor * llama_get_model_tok_embeddings(struct llama_model * model); - LLAMA_API struct ggml_tensor * llama_get_model_norm (struct llama_model * model); - LLAMA_API struct ggml_tensor * llama_get_model_output (struct llama_model * model); - - LLAMA_API struct ggml_tensor * llama_get_layer_attention_norm(struct llama_layer * layer); - LLAMA_API struct ggml_tensor * llama_get_layer_wq (struct llama_layer * layer); - LLAMA_API struct ggml_tensor * llama_get_layer_wk (struct llama_layer * layer); - LLAMA_API struct ggml_tensor * llama_get_layer_wv (struct llama_layer * layer); - LLAMA_API struct ggml_tensor * llama_get_layer_wo (struct llama_layer * layer); - LLAMA_API struct ggml_tensor * llama_get_layer_ffn_norm (struct llama_layer * layer); - LLAMA_API struct ggml_tensor * llama_get_layer_w1 (struct llama_layer * layer); - LLAMA_API struct ggml_tensor * llama_get_layer_w2 (struct llama_layer * layer); - LLAMA_API struct ggml_tensor * llama_get_layer_w3 (struct llama_layer * layer); + // Get a llama model tensor + LLAMA_API struct ggml_tensor * llama_get_model_tensor(struct llama_model * model, const char * name); // Token logits obtained from the last call to llama_eval() // The logits for the last token are stored in the last row