From 2619109ad57d7a75388a9cce51e5da645410d92e Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Thu, 28 Sep 2023 19:36:36 +0300 Subject: [PATCH 01/73] ci : disable freeBSD builds due to lack of VMs (#3381) --- .github/workflows/build.yml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aecebaf93..bf7d94c72 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -457,22 +457,22 @@ jobs: path: | cudart-llama-bin-win-cu${{ matrix.cuda }}-x64.zip - freeBSD-latest: - runs-on: macos-12 - steps: - - name: Clone - uses: actions/checkout@v3 - - - name: Build - uses: cross-platform-actions/action@v0.19.0 - with: - operating_system: freebsd - version: '13.2' - hypervisor: 'qemu' - run: | - sudo pkg update - sudo pkg install -y gmake automake autoconf pkgconf llvm15 clinfo clover opencl clblast openblas - gmake CC=/usr/local/bin/clang15 CXX=/usr/local/bin/clang++15 +# freeBSD-latest: +# runs-on: macos-12 +# steps: +# - name: Clone +# uses: actions/checkout@v3 +# +# - name: Build +# uses: cross-platform-actions/action@v0.19.0 +# with: +# operating_system: freebsd +# version: '13.2' +# hypervisor: 'qemu' +# run: | +# sudo pkg update +# sudo pkg install -y gmake automake autoconf pkgconf llvm15 clinfo clover opencl clblast openblas +# gmake CC=/usr/local/bin/clang15 CXX=/usr/local/bin/clang++15 release: if: ${{ ( github.event_name == 'push' && github.ref == 'refs/heads/master' ) || github.event.inputs.create_release == 'true' }} From ecf90b1a5114034bc0939b3968f549fe4d63cf6d Mon Sep 17 00:00:00 2001 From: Cebtenzzre Date: Thu, 28 Sep 2023 14:30:15 -0400 Subject: [PATCH 02/73] gguf : make token scores and types optional (#3347) --- convert-falcon-hf-to-gguf.py | 6 ------ convert-starcoder-hf-to-gguf.py | 6 ------ llama.cpp | 18 ++++++++---------- 3 files changed, 8 insertions(+), 22 deletions(-) diff --git a/convert-falcon-hf-to-gguf.py b/convert-falcon-hf-to-gguf.py index 88338d823..958358563 100755 --- a/convert-falcon-hf-to-gguf.py +++ b/convert-falcon-hf-to-gguf.py @@ -133,8 +133,6 @@ gguf_writer.add_file_type(ftype) print("gguf: get tokenizer metadata") tokens: list[bytearray] = [] -scores: list[float] = [] -toktypes: list[int] = [] tokenizer_json_file = dir_model / 'tokenizer.json' if not tokenizer_json_file.is_file(): @@ -177,12 +175,8 @@ for i in range(vocab_size): text = bytearray(pad_token) tokens.append(text) - scores.append(0.0) # dymmy - toktypes.append(gguf.TokenType.NORMAL) # dummy gguf_writer.add_token_list(tokens) -gguf_writer.add_token_scores(scores) -gguf_writer.add_token_types(toktypes) special_vocab = gguf.SpecialVocab(dir_model, load_merges = True) special_vocab.add_to_gguf(gguf_writer) diff --git a/convert-starcoder-hf-to-gguf.py b/convert-starcoder-hf-to-gguf.py index 331e84e98..48e88a777 100755 --- a/convert-starcoder-hf-to-gguf.py +++ b/convert-starcoder-hf-to-gguf.py @@ -117,8 +117,6 @@ gguf_writer.add_file_type(ftype) print("gguf: get tokenizer metadata") tokens: list[bytearray] = [] -scores: list[float] = [] -toktypes: list[int] = [] tokenizer_json_file = dir_model / 'tokenizer.json' if not tokenizer_json_file.is_file(): @@ -161,12 +159,8 @@ for i in range(vocab_size): text = bytearray(pad_token) tokens.append(text) - scores.append(0.0) # dymmy - toktypes.append(gguf.TokenType.NORMAL) # dummy gguf_writer.add_token_list(tokens) -gguf_writer.add_token_scores(scores) -gguf_writer.add_token_types(toktypes) special_vocab = gguf.SpecialVocab(dir_model, load_merges = True) special_vocab.add_to_gguf(gguf_writer) diff --git a/llama.cpp b/llama.cpp index 140533553..15de7600c 100644 --- a/llama.cpp +++ b/llama.cpp @@ -1931,20 +1931,18 @@ static void llm_load_vocab( throw std::runtime_error("cannot find tokenizer vocab in model file\n"); } + const float * scores = nullptr; const int score_idx = gguf_find_key(ctx, kv(LLM_KV_TOKENIZER_SCORES).c_str()); - if (score_idx == -1) { - throw std::runtime_error("cannot find tokenizer scores in model file\n"); + if (score_idx != -1) { + scores = (const float * ) gguf_get_arr_data(ctx, score_idx); } - const float * scores = (const float * ) gguf_get_arr_data(ctx, score_idx); - + const int * toktypes = nullptr; const int toktype_idx = gguf_find_key(ctx, kv(LLM_KV_TOKENIZER_TOKEN_TYPE).c_str()); - if (toktype_idx == -1) { - throw std::runtime_error("cannot find token type list in GGUF file\n"); + if (toktype_idx != -1) { + toktypes = (const int * ) gguf_get_arr_data(ctx, toktype_idx); } - const int * toktypes = (const int * ) gguf_get_arr_data(ctx, toktype_idx); - // determine vocab type { std::string tokenizer_name; @@ -2012,8 +2010,8 @@ static void llm_load_vocab( auto & token_data = vocab.id_to_token[i]; token_data.text = std::move(word); - token_data.score = scores[i]; - token_data.type = (llama_token_type) toktypes[i]; + token_data.score = scores ? scores[i] : 0.0f; + token_data.type = toktypes ? (llama_token_type) toktypes[i] : LLAMA_TOKEN_TYPE_NORMAL; } // determine the newline token: LLaMA "<0x0A>" == 10 == '\n', Falcon 193 == '\n' From 2db94d98eda56982d80238840b0652b4137a2a84 Mon Sep 17 00:00:00 2001 From: Cebtenzzre Date: Thu, 28 Sep 2023 14:30:31 -0400 Subject: [PATCH 03/73] gguf : basic type checking in gguf_get_* (#3346) --- ggml.c | 84 ++++++++++++++++++++++++++++++++++------------------------ ggml.h | 36 ++++++++++++------------- 2 files changed, 68 insertions(+), 52 deletions(-) diff --git a/ggml.c b/ggml.c index 35751342f..3fcc44bdb 100644 --- a/ggml.c +++ b/ggml.c @@ -20211,78 +20211,94 @@ int gguf_find_key(const struct gguf_context * ctx, const char * key) { return keyfound; } -const char * gguf_get_key(const struct gguf_context * ctx, int i) { - return ctx->kv[i].key.data; +const char * gguf_get_key(const struct gguf_context * ctx, int key_id) { + return ctx->kv[key_id].key.data; } -enum gguf_type gguf_get_kv_type(const struct gguf_context * ctx, int i) { - return ctx->kv[i].type; +enum gguf_type gguf_get_kv_type(const struct gguf_context * ctx, int key_id) { + return ctx->kv[key_id].type; } -enum gguf_type gguf_get_arr_type(const struct gguf_context * ctx, int i) { - return ctx->kv[i].value.arr.type; +enum gguf_type gguf_get_arr_type(const struct gguf_context * ctx, int key_id) { + GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY); + return ctx->kv[key_id].value.arr.type; } -const void * gguf_get_arr_data(const struct gguf_context * ctx, int i) { - return ctx->kv[i].value.arr.data; +const void * gguf_get_arr_data(const struct gguf_context * ctx, int key_id) { + GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY); + return ctx->kv[key_id].value.arr.data; } const char * gguf_get_arr_str(const struct gguf_context * ctx, int key_id, int i) { + GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY); struct gguf_kv * kv = &ctx->kv[key_id]; struct gguf_str * str = &((struct gguf_str *) kv->value.arr.data)[i]; return str->data; } -int gguf_get_arr_n(const struct gguf_context * ctx, int i) { - return ctx->kv[i].value.arr.n; +int gguf_get_arr_n(const struct gguf_context * ctx, int key_id) { + GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY); + return ctx->kv[key_id].value.arr.n; } -uint8_t gguf_get_val_u8(const struct gguf_context * ctx, int i) { - return ctx->kv[i].value.uint8; +uint8_t gguf_get_val_u8(const struct gguf_context * ctx, int key_id) { + GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_UINT8); + return ctx->kv[key_id].value.uint8; } -int8_t gguf_get_val_i8(const struct gguf_context * ctx, int i) { - return ctx->kv[i].value.int8; +int8_t gguf_get_val_i8(const struct gguf_context * ctx, int key_id) { + GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_INT8); + return ctx->kv[key_id].value.int8; } -uint16_t gguf_get_val_u16(const struct gguf_context * ctx, int i) { - return ctx->kv[i].value.uint16; +uint16_t gguf_get_val_u16(const struct gguf_context * ctx, int key_id) { + GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_UINT16); + return ctx->kv[key_id].value.uint16; } -int16_t gguf_get_val_i16(const struct gguf_context * ctx, int i) { - return ctx->kv[i].value.int16; +int16_t gguf_get_val_i16(const struct gguf_context * ctx, int key_id) { + GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_INT16); + return ctx->kv[key_id].value.int16; } -uint32_t gguf_get_val_u32(const struct gguf_context * ctx, int i) { - return ctx->kv[i].value.uint32; +uint32_t gguf_get_val_u32(const struct gguf_context * ctx, int key_id) { + GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_UINT32); + return ctx->kv[key_id].value.uint32; } -int32_t gguf_get_val_i32(const struct gguf_context * ctx, int i) { - return ctx->kv[i].value.int32; +int32_t gguf_get_val_i32(const struct gguf_context * ctx, int key_id) { + GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_INT32); + return ctx->kv[key_id].value.int32; } -float gguf_get_val_f32(const struct gguf_context * ctx, int i) { - return ctx->kv[i].value.float32; +float gguf_get_val_f32(const struct gguf_context * ctx, int key_id) { + GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_FLOAT32); + return ctx->kv[key_id].value.float32; } -uint64_t gguf_get_val_u64(const struct gguf_context * ctx, int i) { - return ctx->kv[i].value.uint64; +uint64_t gguf_get_val_u64(const struct gguf_context * ctx, int key_id) { + GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_UINT64); + return ctx->kv[key_id].value.uint64; } -int64_t gguf_get_val_i64(const struct gguf_context * ctx, int i) { - return ctx->kv[i].value.int64; +int64_t gguf_get_val_i64(const struct gguf_context * ctx, int key_id) { + GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_INT64); + return ctx->kv[key_id].value.int64; } -double gguf_get_val_f64(const struct gguf_context * ctx, int i) { - return ctx->kv[i].value.float64; +double gguf_get_val_f64(const struct gguf_context * ctx, int key_id) { + GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_FLOAT64); + return ctx->kv[key_id].value.float64; } -bool gguf_get_val_bool(const struct gguf_context * ctx, int i) { - return ctx->kv[i].value.bool_; +bool gguf_get_val_bool(const struct gguf_context * ctx, int key_id) { + GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_BOOL); + return ctx->kv[key_id].value.bool_; } -const char * gguf_get_val_str (const struct gguf_context * ctx, int i) { - return ctx->kv[i].value.str.data; +const char * gguf_get_val_str(const struct gguf_context * ctx, int key_id) { + GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_STRING); + return ctx->kv[key_id].value.str.data; } int gguf_get_n_tensors(const struct gguf_context * ctx) { diff --git a/ggml.h b/ggml.h index 73198dc61..d1086173d 100644 --- a/ggml.h +++ b/ggml.h @@ -1916,26 +1916,26 @@ extern "C" { GGML_API int gguf_get_n_kv(const struct gguf_context * ctx); GGML_API int gguf_find_key(const struct gguf_context * ctx, const char * key); - GGML_API const char * gguf_get_key (const struct gguf_context * ctx, int i); + GGML_API const char * gguf_get_key (const struct gguf_context * ctx, int key_id); - GGML_API enum gguf_type gguf_get_kv_type (const struct gguf_context * ctx, int i); - GGML_API enum gguf_type gguf_get_arr_type(const struct gguf_context * ctx, int i); + GGML_API enum gguf_type gguf_get_kv_type (const struct gguf_context * ctx, int key_id); + GGML_API enum gguf_type gguf_get_arr_type(const struct gguf_context * ctx, int key_id); - // results are undefined if the wrong type is used for the key - GGML_API uint8_t gguf_get_val_u8 (const struct gguf_context * ctx, int i); - GGML_API int8_t gguf_get_val_i8 (const struct gguf_context * ctx, int i); - GGML_API uint16_t gguf_get_val_u16 (const struct gguf_context * ctx, int i); - GGML_API int16_t gguf_get_val_i16 (const struct gguf_context * ctx, int i); - GGML_API uint32_t gguf_get_val_u32 (const struct gguf_context * ctx, int i); - GGML_API int32_t gguf_get_val_i32 (const struct gguf_context * ctx, int i); - GGML_API float gguf_get_val_f32 (const struct gguf_context * ctx, int i); - GGML_API uint64_t gguf_get_val_u64 (const struct gguf_context * ctx, int i); - GGML_API int64_t gguf_get_val_i64 (const struct gguf_context * ctx, int i); - GGML_API double gguf_get_val_f64 (const struct gguf_context * ctx, int i); - GGML_API bool gguf_get_val_bool(const struct gguf_context * ctx, int i); - GGML_API const char * gguf_get_val_str (const struct gguf_context * ctx, int i); - GGML_API int gguf_get_arr_n (const struct gguf_context * ctx, int i); - GGML_API const void * gguf_get_arr_data(const struct gguf_context * ctx, int i); + // will abort if the wrong type is used for the key + GGML_API uint8_t gguf_get_val_u8 (const struct gguf_context * ctx, int key_id); + GGML_API int8_t gguf_get_val_i8 (const struct gguf_context * ctx, int key_id); + GGML_API uint16_t gguf_get_val_u16 (const struct gguf_context * ctx, int key_id); + GGML_API int16_t gguf_get_val_i16 (const struct gguf_context * ctx, int key_id); + GGML_API uint32_t gguf_get_val_u32 (const struct gguf_context * ctx, int key_id); + GGML_API int32_t gguf_get_val_i32 (const struct gguf_context * ctx, int key_id); + GGML_API float gguf_get_val_f32 (const struct gguf_context * ctx, int key_id); + GGML_API uint64_t gguf_get_val_u64 (const struct gguf_context * ctx, int key_id); + GGML_API int64_t gguf_get_val_i64 (const struct gguf_context * ctx, int key_id); + GGML_API double gguf_get_val_f64 (const struct gguf_context * ctx, int key_id); + GGML_API bool gguf_get_val_bool(const struct gguf_context * ctx, int key_id); + GGML_API const char * gguf_get_val_str (const struct gguf_context * ctx, int key_id); + GGML_API int gguf_get_arr_n (const struct gguf_context * ctx, int key_id); + GGML_API const void * gguf_get_arr_data(const struct gguf_context * ctx, int key_id); GGML_API const char * gguf_get_arr_str (const struct gguf_context * ctx, int key_id, int i); GGML_API int gguf_get_n_tensors (const struct gguf_context * ctx); From 0e76a8992c8200237bbc6471a53fb8796b3872f7 Mon Sep 17 00:00:00 2001 From: xaedes Date: Thu, 28 Sep 2023 20:40:11 +0200 Subject: [PATCH 04/73] train : finetune LORA (#2632) * fix track_max_mem in forward_batch_wo_cache_flash_attn_train * remove unnecessary Adam(W) optimizer tensors. reduces optimizer memory overhead from 7*modelsize to 2*modelsize. additionally allows to optimize models with more than 2^31 parameters by replacing int with int64_t. bumps training checkpoint file version, but old checkpoints can still be read. new version with less tensors is saved. * add gradient clipping to AdamW * Fix reset of unused g->nodes and g->grads to NULL * implement gradient checkpointing for training reduces memory overhead from O(n_layer) to O(sqrt(n_layer)) as explained in readme of https://github.com/cybertronai/gradient-checkpointing * remove unused compute buffer 3 * add and use function ggml_build_backward_expand to avoid stack overflows with large maximum number of nodes GGML_API void ggml_build_backward_expand(struct ggml_context * ctx, struct ggml_cgraph * gf, struct ggml_cgraph * gb, bool keep); * change AdamW decay parameter to work like the torch AdamW decay parameter It is now relative to Adam learning rate `alpha*sched`. Before that it was relative to `sched` only. `alpha` being the maximum learning rate and `sched` being a scaling parameter in [0..1] * change default AdamW weight decay parameter used in training to 0.1 as used in nanoGPT * change default AdamW weight decay parameter defined in ggml to 0.0, making Adam default instead of AdamW btw: the default weight decay parameter for torch.optim.AdamW is 0.01 * bug fixes for cross entropy loss ggml_cross_entropy_loss: sums where not correctly added in workload of each thread ggml_cross_entropy_loss_back: simplify backward process, reducing numerical issues guard usage of exp f16 lookup in cross entropy by #define GGML_CROSS_ENTROPY_EXP_FP16 cross entropy loss is only used once during training, but it is quite sensitive to numerical errors introduced by exp-f16-lookup. so exp-f16-lookup for cross entropy loss is disabled by default, trading better gradients for very slightly worse runtime performance. * fix test-grad0 for cross_entropy_loss the second argument to cross_entropy_loss must sum up to 1 for each row * fix test-grad0 for soft_max dont use only sum as aggregation, because sum of softmax is always 1 -> finite differences should not work instead use sum(log(soft_max()*(1-eps)+eps)); use eps to avoid log(0) * improve finite differences of test-grad0 by using double instead of float * change cross_entropy_loss to output average over all rows this helps keeping the loss and gradients in a sane range * improve gradient checkpointing sqrt(n_layers) is only the best checkpoint step when mem size of checkpoints and mem size of layers are equal. since layers require more memory than the single-tensor-checkpoint we use, the optimal values are compute different: ``` given: n, u, v objective: minimize(a*u+b*v) where a*b=n, a>0, b>0 b=n/a minimize(a*u+v*n/a) diff(a*u+v*n/a, a) = u - (v*n/a)/a diff(a*u+v*n/a, a) == 0 u - (v*n/a)/a == 0 u == v*n/(a*a) u*a*a = v*n a*a = v*n/u a = sqrt(n*v/u) ``` this change results in more checkpoints, requiring less layers to store between checkpoints, overall improving memory usage. * disable gradient checkpointing debug output * llama : fix rope usage in train-text-from-scratch after ChatGLM change * add more training parameters: --enable-restart N Only for Adam optimizer. Enable restarts of cos-decay --disable-restart N Only for Adam optimizer. Disable restarts of cos-decay --opt-past N Number of optimization iterations to track for delta convergence test. Disabled when zero. --opt-delta N Maximum delta for delta convergence test. Disabled when <= zero. --opt-max-no-improvement N Maximum number of optimization iterations with no improvement. Disabled when <= zero. --adam-epsf N AdamW epsilon for convergence test. Disabled when <= zero. --adam-min-alpha N Adam minimum learning rate alpha, usually 0.1 * alpha * replace memcpy with reshape operation so that the graph is not cut at the input this makes it possible to store other values into the input tensor and then simply recompute the graph without rebuilding it * remove unused function argument from get_example_targets_batch * measure and print total training time * add optimization callback to ggml_opt_resume_g this callback is called before each iteration with custom data and pointer to learning schedule parameter (only used in Adam(W)). can be used for dynamic learning schedule and setting input data for batches before each iteration * use optimization callback in training allows dynamic learning schedule and different batch data for each iteration without relying on low n_iter and high n_examples parameters reduces runtime by avoiding restart of optimization function and improves training convergence by providing a different batch for each iteration * add minimum number of tensor dimensions to apply weight decay (default 2) this allows to not apply weight decay to bias parameters * rename training parameter cos-decay-alpha to cos-decay-min and clarify that adam-min-alpha also applies to warmup * fix increase of model.train_samples and model.train_tokens now that each optimizer iteration gets its own batch we need to multiply by number of opt iterations * change sampling parameters for prediction after training to defaults of common.h and clarify what is context for prediction and what are generated tokens * tighten abs error bounds for cross_entropy_loss in test-grad0 * add conditional compilation of using F16 exp in flash attention uncomment `// #define GGML_FLASH_ATTN_EXP_FP16` to enable usage of f16 exp in flash attention * tighten abs error bounds for flash_attn in test-grad0 * tighten abs error bounds for sqrt in test-grad0 * remove out-commented vectorized code of opt_adam the vectorized code might be bit faster for low number of parameters, but it had a big memory usage overhead * ggml : update ggml_rms_norm_back with configurable eps * llama training : fix ggml_rms_norm_back calls to pass configurable eps * remove trailing whitespace * add train function using automatic gradient checkpointing backward pass and allocator * in train function replace add_inplace by regular add because using add_inplace seems to result in different gradients * don't use allocate hash_map on context because the context has no_alloc=True when using memory allocator resulting in NULL data pointers * correctly clone reshape and permute operations by also cloning tensor->nb values * fix variable name and add missing type cast * terminate recursive tensor cloning when reaching tensor without src tensors * correctly clone view tensors by setting data pointers without this the checkpointing would only work when being used together with memory allocator * fix variable names * swap arguments to commutative ops to be the same as in `forward_batch_wo_cache_flash_attn` * add input tensors as checkpoints so that recursive tensor cloning of gradient checkpointing terminates on input tensors * fix variable name and add missing boolean negation * make sure some tensors are not reallocated by inserting new temporary nodes depending on them: output and parameter gradient tensors need to be available at the end of the graph execution parameter gradient tensors also need to be available before the graph execution because they are set to zero before each optimizer iteration checkpoint tensors are allocated all together to reduce memory allocator fragmentation afterwards, in addition to the temporary nodes, we also need to reset the temporary leafs * fix ASSERT to work with zero layers * add training options whether to use allocator and/or unified training function * integrate unified training function which may use memory allocator the unified training function also supports arguments whether to use flash attention and/or gradient checkpointing * format name of cloned tensors with " (clone)" suffix * set names for tensors in unified train function for easier debugging * allocate graph on context using ggml_new_graph * remove handwritten training functions * remove unused training parameters "use_scratch" and "use_unified" * remove trailing whitespace * remove unused train params: mem_compute1_gb & mem_compute2_gb mem_compute_gb is used for compute when automatic memory allocator is not enabled, otherwise it can be very small to only hold the tensor definitions mem_compute0_gb is used for automatic memory allocator (as long as measurement of max required size is not implemented) * remove unused forward_batch function * add debug asserts in ggml_allocr_alloc to some common pitfalls when using this function directly * only use ggml_allocr_alloc when tensor has NULL data and is no view * fix test when to create temporary backward graph temporary backward graph is only necessary when using checkpointing * fix memory "leak" in optimizers each iteration a new cplan with new memory for work data was allocated. now cplan creation only happens at the start of optimization, with each iteration reusing the cplan and its work data. * reverse order of for loop in ggml_build_backward_expand to save memory when using gradient checkpointing and allocator with this loop order gradient checkpointing with allocator on 16 layer model saves 13% memory; 2 layer memory it saves 2% memory. the computation results are the same * add API functions to access llama model tensors * add stub example for finetuning, based on train-text-from-scratch * move and remove code * add API functions to access remaining model parameters: mult, head and rot * first draft for LORA finetune training * remove const model and layer arguments in API functions for accessing model tensors * bug fixes to make finetune compile automatic allocator does not work yet * add debug prints for training memory improvements * fix names of lora tensors * avoid stack overflow resulting from big ggml_cgraph replace stack allocation and ggml_build_forward by ggml_new_graph in combination with ggml_build_forward_expand * 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); * remove unused call to not existing llama_get_layer_from_model * implement ggml_compute_forward_out_prod_q_f32 * remove trailing whitespace * add lora finetune support on quantized base model tensors * add ggml_add_cast API function this function works like ggml_add, but accepts a data type for the resulting tensor. only supported for quantized src0 input. * use ggml_add_cast in finetuning lora-applied weights will now have data type F32, which improves gradients when finetuning quantized base models * bug fix: actually use result type passed to ggml_add_cast * make sure base model tensors data cannot be used in viewable operations memory allocator would try to make lora application inplace on base model tensors. since those are memory mapped this will result in memory access violations * fix bug in ggml_out_prod which resulted in wrong n_dims of result tensors * avoid keeping in memory ALL of the gradients The problem here stems from ggml_graph_reset. This function is called in the optimization function, before each graph computation, to reset the gradients to zero. This required a unique memory slot for each gradient: allocating memory from a previosly freed memory location might lead to non-zero input gradients. During ggml_compute_backward the gradients are build stepwise by adding or substracting new values, starting from a OP_NONE tensor which needs to contain zero-values. This requires the graph reset. To avoid this I now remember in ggml_build_backward_expand the original OP_NONE gradient tensors in a hash table, which is passed to ggml_compute_backward. There instead of using add (or sub or similar) I test whether the existing gradient to be changed is a zero-valued-tensor by looking up its existence in the hash table. When it is such a zero-tensor it will not be modified, but replaced by the value to be added, otherwise the regular add (not inplace, allocator will take care of this) will be used. This way none of those zero-tensor values will be necessary in the final backward graph and more importantly they won't need a unique memory slot, just to make them zero. * remove trailing whitespace * remove debug prints and function to compute tensor data hash * improve optimization iteration prints * adjust maximal values to support finetuning 3B models * change default finetune params lora_r and lora_alpha to match the n_rank parameters of 4 * bug fix: make sure finetune input gradient is allocated at begin and kept until end * remove unnecessary src tensor from ggml_get_rows_back we don't need data of src[2] for computation, only to setup the correct output shape. remove dependency on src[2], so that allocator can work more freely. the computational graph is still completely determined, because the output shape is naturally included. this is similar to how ggml_reshape does it. * remove unnecessary src tensor from ggml_repeat & ggml_repeat_back we don't need data of src[1] for computation, only to setup the correct output shape. remove dependency on src[1], so that allocator can work more freely. the computational graph is still completely determined, because the output shape is naturally included * resolve todo allocator will only make it inplace when they are of the same type * mixing multiple LORA adapters is now possible pass more than one '--lora FNAME' argument to apply more than one LORA. use '--lora-scaled FNAME S' when you want to specify a user-defined scale for an adapter. * add option to save finetune output every N iterations * also save latest finetune output with ITERATION="LATEST" and print where files are saved saving with LATEST makes it easier to resume training from the latest checkpoint the string "LATEST" can be configured with command line option "--fn-latest STR" * update checkpoint train stats before saving via "--save-every" * add command line option `--rank-wo N` for rank of wo tensor * update finetune README * fix dump_non_result_info_yaml to output multiple lora adapters * bug fix: replace GGML_TYPE_SIZE[t] by ggml_type_size(t) * replace llama_n_mult by llama_n_ff * finetune bug fixes to compile with merged in code from master * remove prediction related code to reduce duplicated code with main use main instead * reduce large memory overhead in train-text-from-scratch all gradients had to be pinned so that graph_reset works correctly. this is no longer necessary with the changes to ggml_compute_backward introduced in this PR. * add comment explaining why finetune checkpoints are allocated in one block * make default value of float member a float literal * handle rms_norm and rope parameters the same as in train-text-from-scratch * remove unused code * remove vocab related code as it is unnecessary * add LLM_KV_TRAINING_TYPE to train-text-from-scratch checkpoints so that they can be differentiated from lora finetune checkpoints * add gguf constants and load/save functions from train-text-from-scratch * add load & save lora finetune checkpoints via gguf * add python script to convert old finetune checkpoint files to gguf * remove old checkpoint save & load code * remove code to print data checksums which was used to verify correctness of new gguf code * omit tokenization when training is disabled, only save llama lora adapter training can be disabled by passing '-n 0' to finetune * remove trailing whitespace * update README.md * implement ggml_compute_forward_repeat_f16 * avoid stack overflow of large cgraphs in test-grad0 * add ggml API functions ggml_unravel_index, ggml_get_i32_nd and its analogs for set and for f32 ggml_get_i32_1d, ggml_set_i32_1d, ggml_get_f32_1d, ggml_set_f32_1d now support non-contiguous tensors. in case of non-contiguous tensor, the 1d index is unraveled into a multi index using ggml_unravel_index to be passed to '_nd' function equivalent. this fixes a bug in test-grad0 which happens due to ggml_build_backward not building purely contiguous tensors anymore * increase test-grad0 context mem size to accommodate for bigger cgraph * add sanity check to ggml_compute_backward, asserting the correct shape of gradients * fix ggml_acc_or_set to return tensor of correct shape * remove unused 'inplace' argument from ggml_compute_backward function inplace operations to add gradients are no longer created by ggml_compute_backward use allocator to automatically make inplace operations * add missing argument 'int i0' to ggml_get_i32_nd & ggml_set_i32_nd header declarations * fix error message in ggml_allocr_alloc to display actual max_avail * fix check_gradient ggml_build_backward_expand was previously replaced by ggml_build_backward, but the assignment of forward graph to backward graph missing * use tensor->view_src instead of ggml_is_view and get_view_source * move gradient checkpointing code into ggml, new API function: // build gradient checkpointing backward graph gb for gf using provided checkpoints // gb_tmp will contain original backward graph with rewritten backward process nodes, // but without the second forward pass nodes. GGML_API void ggml_build_backward_gradient_checkpointing( struct ggml_context * ctx, struct ggml_cgraph * gf, struct ggml_cgraph * gb, struct ggml_cgraph * gb_tmp, struct ggml_tensor * * checkpoints, int n_checkpoints); * replace custom data getters and setters by ggml functions * train-text-from-scratch can train (full finetune) gguf models just pass the gguf model via `--checkpoint-in FN`. after this, to continue training, pass the generated checkpoint instead of the original gguf model. tested with smaller models, bigger models may exceed available memory. use (LORA) finetune for those. * remove trailing whitespace * add option to save train-text-from-scratch output every N iterations * update README.md * fix warnings * fix warnings * remove finetune option to disable allocator the allocator should always be used. by making sure that it is always used it gets easier to implement automatic memory requirements computation * add tensor checkpoints only when gradient checkpointing is enabled * initialize opt ggml context if none was provided * add ggml-alloc API function 'ggml_allocr_max_size' to get max size of alloc GGML_API size_t ggml_allocr_max_size(struct ggml_allocr * alloc); * finetune: automatically allocate all memory and changes to command line options remove '--n_examples N' parameter, as it no longer makes sense to call optimization process multiple times in a loop. add '--only_write_lora' command line option: will skip tokenization and training, to only write a llama.cpp comptabile LORA adapter. remove memory buffer related command line options. improve iteration console output. * add finetune to Makefile * update README.md * print time per iteration and estimate remaining time * increase measured alloc size by tensor_alignment ggml_allocr_reset will reduce the given size by up to tensor_alignment-1 * fix README.md * add some more allocator debug prints * bug fix, probably solves the 'ggml_allocr_alloc: not enough space in the buffer' issue * revert last commit "bug fix, probably solves the 'ggml_allocr_alloc: not enough space in the buffer' issue" "alloc was freeing an externally allocated tensor, because it calculated the end of allocator memory as alloc->data + alloc->max_size instead of alloc->data + alloc->size." This is intentional to reduce the risk of freeing external tensors when measuring. Unless max_size is not properly calculated, I don't see why this is an issue. * remove unnecessary "0x" before "%p" output * move measurement memory segment to upper region of the address space * update README.md * fix printf format warnings * add missing gguf_free in load_checkpoint_lora_file * load default rms_norm and rope parameters from base model * add gradient accumulation specify number accumulation steps with '--grad-acc N'. this will simulate a bigger batch size of grad_acc*batch. * fix tracking of train_samples and train_tokens * build : fix compile warnings * ggml : fix L-BFGS linesearch loop * improve finetune time measurement fix printf warnings on system where int64_t is (long int). change time datatypes to double because values get big with long training times. exclude file saving from time measurement. converge faster to actual time per iteration by removing very small first duration before first iteration was performed. fix bug in output of total training time, the reported value was 1000 times to small. * specify default lora rank with '--lora-r N' '--lora-r N' will specify default rank for all tensors '--rank-wq N', etc. will override this default rank for specific tensor types. * fix gradient accumulation bug where the same batch was used for each microstep * fix gradient accumulation bug where the same batch was used for each microstep * support grouped-query-attention in ggml_flash_attn and ggml_flash_attn_back k and v can now be repeated in q along ne[2] in forward pass just use modulo to compute k and v indices, like ik2 = iq2 % nek2. in backard pass this won't work as easy, because multiple threads will compete to accumulate to the same k->grad[:,ik1,ik2,ik3] and v->grad[:,iv1,iv2,iv3]. so we change the parallelization over q rows to be over k rows. this ensures non-overlapping (ik2,ik3) across threads. in each thread we then iterate over the number of repetitions of k/v in q to compute iq2 as iq2 = ik2 + irep*nek2. since ne2 is not the same for q,k and v we also change how the gradients are concatenated into the result tensor. additionally the offsets of gradq, gradk and gradv in the result tensor are now memory aligned. we also simplify the compute_backward part of flash_attn to use ggml_reshape instead of switching over the number of dimensions. this needs a small change to ggml_reshape, removing the assertion of second argument to be contiguous. since only the shape (ne) of the second reshape argument is of relevance, its memory layout (nb) is irrelevant -> it can very well be non-contiguous. change test-grad0 to also test for repeated k/v in q. this changes the rng and now results in small gradient differences in softmax. these solely come from using f16 exp table lookup in forward softmax: when temporarily changing softmax to use actual exp function, the reported gradient differences go away. gradient differences coming solely from f16 table lookup are acceptable. added a note to explain this. * add llama API functions to get grouped-query-attention n_head parameter 'n_head_kv'. * fix finetune to support grouped-query-attention (using flash-attention) note: ggml changes to ggml_out_prod are necessary to support grouped-query-attention without flash-attention. * support broadcastable a in out_prod(a, b) and backward pass of broadcasting mul_mat(a, b) * test broadcasting mul_mat backward pass * decouple random number generator of each operation test when changing one test the rng of others tests is not influenced anymore * add comment briefly describing what ggml_repeat_back does * simplify broadcasting mul_mat backward using ggml_repeat_back * add cgraph evaluation order member and corresponding enum type this controls in which order ggml_build_forward visits source nodes. by default the nodes are visited left to right, i.e. src[0] first. in some cases it is beneficial for ggml-alloc to visit in a different order. two possible orders are supported: left-to-right (src[0] first) and right-to-left (src[0] last). * measure max compute size for each cgraph eval order and use best order this can bring huge memory savings: e.g. codellama-34b with n_ctx=64, n_batch=1 goes from 92927.8mb down to 4627.6 MB * remove unused command line options * add sample start patterns and options to force new or by default resume last shuffling * update shuffle rng state on reshuffle * exclude known zero values from computations in flash_attn_f32 & flash_attn_back_f32 * remove probably unnecessary exception type flags from stringstream * pass correct max number of tokens to llama_tokenize * account for possible leading whitespace that will be added by tokenizer e.g. '\t' will be tokenized by llama spm tokenizer to [29871, 12] * use unrolled vec_mad in out_prod y is vec_mad result vec. x is vec_mad input vec. v is vec_mad input scalar. ggml_vec_mad_f32_unroll will internally loop over x and v with same y. GGML_VEC_MAD_UNROLL is by default defined to 32. This value is empirical optimized using performance test runs of out-prod in openllama-3b finetune with 256 context length and batch size 1. It gives 23% performance boost for out_prod. Full measurements of out-prod runtime in ms: unroll_xv unroll_yv 1 67014.643 87826.469 2 77117.552 89077.656 4 72091.311 109121.657 8 61077.543 88678.334 16 56914.67 79514.947 24 59024.595 84350.254 28 55952.446 83368.73 32 51476.658 85177.745 36 55973.792 84659.92 40 55139.616 93844.738 48 60736.392 93330.267 64 99856.878 116994.99 Second column is when unrollying yv instead of xv * set lora_alpha to value of lora_r if it is not set via command line otherwise only changing lora_r will change scaling of lora adapter used in prediction * reshuffle original sample order instead of the previous shuffled order otherwise resumed reshuffle will not result in same sample order * block tiling for out-prod inspired by mul-mat block sizes are empirically optimized roughly doubles the flops of out-prod * exclude some more known zero values from computations in flash_attn_f32 & flash_attn_back_f32 * add static keywords * remove outcommented old code * update train-text-from-scratch with tokenization, sample selection and shuffling from finetune * remove lbfgs related train parameters * move common train functions into common/train.[h|cpp] * move train state into struct train_state * move train data saving code into callback to unify code of opt_callback train_params are still different in finetune and train-text-from-scratch, so it can't yet be moved to train.h|cpp * move common train params into common/train * move common opt_callback into common/train * fix consume_common_train_arg * save and load head_count_kv in lora checkpoints * increase train_samples by used_samples instead of number of batches on batch can contain more than one sample when option "fill_with_next_samples" is used * fix usage of llama_tokenize * remove static from process_escape since we need it exposed in header * fix code formating of long function declarations * fix condition in load_train_state_gguf * use die("msg") instead of replace GGML_ASSERT(!"msg") or throw std::runtime_error("msg") * fix saving and loading of training type * remove terminating '\0' from tokenization (llama_tokenize is now passed the string length instead of relying on terminating '\0') * fix compile warnings * fix compile warnings * use new/delete for train_state instead of malloc/free using malloc may result in seg faults when trying to assign string fields * assert that sample_count > 0, avoiding division by zero * fix frand to return value in interval [0,1) * add train option "--sample-random-offsets" Use samples beginning at random offsets. The offset is only applied to the first sample in each batch context window. Together with "--fill-with-next-samples" this may help for training endless text generation. For example given a dataset containing samples "abcd", "ABCD", "0123". With context size of 8 and options "--fill-with-next-samples", "--no-separate-with-eos", "--no-separate-with-bos", the context windows of batches could only be filled with "abcdABCD", "ABCDabcd", "0123abcd", etc. With "--sample-random-offsets" it can also be filled with "23abcdAB", "bcd0123A", etc. * deduplicate code into function * remove n_rot hparam, as it must always be hparam.n_embd_head() * align code * assert correct base model tensor shapes * move some params from lora hparams into model hparams and load model params from gguf this equalizes the model definition in finetune and text-from-scratch and removes the need for additional llama api functions to get model parameters * remove now unnecessary llama API functions to get model params that where added by this PR * train-text-from-scratch: automatically allocate model tensors, remove option '--mem-model N' * train-text-from-scratch: automatically allocate opt context * train-text-from-scratch: automatically allocate input tensors * train-text-from-scratch: automatically allocate compute memory * remove unused options and equalize train-text-from-scratch with finetune * initialize opt->loss_after with zero * add export-lora program * remove trailing whitespace * add export-lora build in Makefile * remove unused struct tensor_info from export-lora * add export-lora build dependency to llama because it depends on common, which depends on llama * update finetune README.md * cancel optimization when specified number of epochs is completed * improve handling of export-lora arguments print errors and warnings when files could not be read or created * Fix export-lora.cpp "not enough space in the context's memory pool" (#1) * Fix export-lora.cpp "not enough space in the context's memory pool" Without this patch, export-lora would sometimes error with "not enough space in the context's memory pool (needed 656784, available 656800)". * increase required context size by 5*GGML_MEM_ALIGN instead of plain 16 --------- Co-authored-by: xaedes * improve handling of not yet supported tensor types --------- Co-authored-by: Georgi Gerganov Co-authored-by: meatbag-18a <145869052+meatbag-18a@users.noreply.github.com> --- .gitignore | 2 + Makefile | 15 +- common/CMakeLists.txt | 2 + common/common.cpp | 43 +- common/common.h | 6 +- common/train.cpp | 1496 ++++++++++++ common/train.h | 230 ++ examples/CMakeLists.txt | 2 + examples/baby-llama/baby-llama.cpp | 170 +- examples/export-lora/CMakeLists.txt | 5 + examples/export-lora/README.md | 26 + examples/export-lora/export-lora.cpp | 474 ++++ examples/finetune/CMakeLists.txt | 5 + examples/finetune/README.md | 90 + .../convert-finetune-checkpoint-to-gguf.py | 489 ++++ examples/finetune/finetune.cpp | 1935 ++++++++++++++++ examples/server/server.cpp | 18 +- examples/train-text-from-scratch/README.md | 11 +- .../convert-train-checkpoint-to-gguf.py | 12 +- .../train-text-from-scratch.cpp | 1996 +++++------------ ggml-alloc.c | 10 +- ggml-alloc.h | 1 + ggml.c | 1964 ++++++++++------ ggml.h | 47 +- llama.cpp | 21 +- llama.h | 11 +- tests/test-grad0.cpp | 173 +- 27 files changed, 6921 insertions(+), 2333 deletions(-) create mode 100644 common/train.cpp create mode 100644 common/train.h create mode 100644 examples/export-lora/CMakeLists.txt create mode 100644 examples/export-lora/README.md create mode 100644 examples/export-lora/export-lora.cpp create mode 100644 examples/finetune/CMakeLists.txt create mode 100644 examples/finetune/README.md create mode 100644 examples/finetune/convert-finetune-checkpoint-to-gguf.py create mode 100644 examples/finetune/finetune.cpp diff --git a/.gitignore b/.gitignore index b54723a15..8ba3b9f4b 100644 --- a/.gitignore +++ b/.gitignore @@ -52,6 +52,8 @@ models-mnt /server /simple /batched +/export-lora +/finetune /speculative /parallel /train-text-from-scratch diff --git a/Makefile b/Makefile index c7f6a808e..53af3c692 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # Define the default target now so that it is always the first target -BUILD_TARGETS = main quantize quantize-stats perplexity embedding vdot train-text-from-scratch convert-llama2c-to-ggml simple batched save-load-state server embd-input-test gguf llama-bench baby-llama beam-search speculative parallel tests/test-c.o +BUILD_TARGETS = main quantize quantize-stats perplexity embedding vdot train-text-from-scratch convert-llama2c-to-ggml simple batched save-load-state server embd-input-test gguf llama-bench baby-llama beam-search speculative parallel finetune export-lora tests/test-c.o # Binaries only useful for tests TEST_TARGETS = tests/test-llama-grammar tests/test-grammar-parser tests/test-double-float tests/test-grad0 tests/test-opt tests/test-quantize-fns tests/test-quantize-perf tests/test-sampling tests/test-tokenizer-0-llama tests/test-tokenizer-0-falcon tests/test-tokenizer-1-llama @@ -500,6 +500,9 @@ console.o: common/console.cpp common/console.h grammar-parser.o: common/grammar-parser.cpp common/grammar-parser.h $(CXX) $(CXXFLAGS) -c $< -o $@ +train.o: common/train.cpp common/train.h + $(CXX) $(CXXFLAGS) -c $< -o $@ + libllama.so: llama.o ggml.o $(OBJS) $(CXX) $(CXXFLAGS) -shared -fPIC -o $@ $^ $(LDFLAGS) @@ -550,7 +553,7 @@ embd-input-test: $(LIB_PRE)embdinput$(DSO_EXT) examples/embd-input/embd-input-te gguf: examples/gguf/gguf.cpp ggml.o llama.o $(OBJS) $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) -train-text-from-scratch: examples/train-text-from-scratch/train-text-from-scratch.cpp ggml.o llama.o common.o $(OBJS) +train-text-from-scratch: examples/train-text-from-scratch/train-text-from-scratch.cpp ggml.o llama.o common.o train.o $(OBJS) $(CXX) $(TTFS_CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) convert-llama2c-to-ggml: examples/convert-llama2c-to-ggml/convert-llama2c-to-ggml.cpp ggml.o llama.o $(OBJS) @@ -559,12 +562,18 @@ convert-llama2c-to-ggml: examples/convert-llama2c-to-ggml/convert-llama2c-to-ggm llama-bench: examples/llama-bench/llama-bench.cpp build-info.h ggml.o llama.o common.o $(OBJS) $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) -baby-llama: examples/baby-llama/baby-llama.cpp ggml.o llama.o common.o $(OBJS) +baby-llama: examples/baby-llama/baby-llama.cpp ggml.o llama.o common.o train.o $(OBJS) $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) beam-search: examples/beam-search/beam-search.cpp build-info.h ggml.o llama.o common.o $(OBJS) $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) +finetune: examples/finetune/finetune.cpp build-info.h ggml.o llama.o common.o train.o $(OBJS) + $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) + +export-lora: examples/export-lora/export-lora.cpp build-info.h ggml.o llama.o common.o $(OBJS) + $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) + speculative: examples/speculative/speculative.cpp build-info.h ggml.o llama.o common.o grammar-parser.o $(OBJS) $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index dead56118..951aa8340 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -9,6 +9,8 @@ add_library(${TARGET} OBJECT console.cpp grammar-parser.h grammar-parser.cpp + train.h + train.cpp ) if (BUILD_SHARED_LIBS) diff --git a/common/common.cpp b/common/common.cpp index 7c3e11875..8764a7be3 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -78,7 +78,7 @@ int32_t get_num_physical_cores() { return n_threads > 0 ? (n_threads <= 4 ? n_threads : n_threads / 2) : 4; } -static void process_escapes(std::string& input) { +void process_escapes(std::string& input) { std::size_t input_len = input.length(); std::size_t output_idx = 0; @@ -352,7 +352,19 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) { invalid_param = true; break; } - params.lora_adapter = argv[i]; + params.lora_adapter.push_back({argv[i], 1.0f}); + params.use_mmap = false; + } else if (arg == "--lora-scaled") { + if (++i >= argc) { + invalid_param = true; + break; + } + const char * lora_adapter = argv[i]; + if (++i >= argc) { + invalid_param = true; + break; + } + params.lora_adapter.push_back({lora_adapter, std::stof(argv[i])}); params.use_mmap = false; } else if (arg == "--lora-base") { if (++i >= argc) { @@ -703,6 +715,7 @@ void gpt_print_usage(int /*argc*/, char ** argv, const gpt_params & params) { printf(" --verbose-prompt print prompt before generation\n"); fprintf(stderr, " --simple-io use basic IO for better compatibility in subprocesses and limited consoles\n"); printf(" --lora FNAME apply LoRA adapter (implies --no-mmap)\n"); + printf(" --lora-scaled FNAME S apply LoRA adapter with user defined scaling S (implies --no-mmap)\n"); printf(" --lora-base FNAME optional model to use as a base for the layers modified by the LoRA adapter\n"); printf(" -m FNAME, --model FNAME\n"); printf(" model path (default: %s)\n", params.model.c_str()); @@ -776,10 +789,15 @@ std::tuple llama_init_from_gpt_par return std::make_tuple(nullptr, nullptr); } - if (!params.lora_adapter.empty()) { + for (unsigned int i = 0; i < params.lora_adapter.size(); ++i) { + const std::string& lora_adapter = std::get<0>(params.lora_adapter[i]); + float lora_scale = std::get<1>(params.lora_adapter[i]); int err = llama_model_apply_lora_from_file(model, - params.lora_adapter.c_str(), - params.lora_base.empty() ? NULL : params.lora_base.c_str(), + lora_adapter.c_str(), + lora_scale, + ((i > 0) || params.lora_base.empty()) + ? NULL + : params.lora_base.c_str(), params.n_threads); if (err != 0) { fprintf(stderr, "%s: error: failed to apply lora adapter\n", __func__); @@ -1225,7 +1243,20 @@ void dump_non_result_info_yaml(FILE * stream, const gpt_params & params, const l fprintf(stream, " %d: %f", lb.first, lb.second); } - fprintf(stream, "lora: %s\n", params.lora_adapter.c_str()); + fprintf(stream, "lora:\n"); + for (std::tuple la : params.lora_adapter) { + if (std::get<1>(la) != 1.0f) { + continue; + } + fprintf(stream, " - %s\n", std::get<0>(la).c_str()); + } + fprintf(stream, "lora_scaled:\n"); + for (std::tuple la : params.lora_adapter) { + if (std::get<1>(la) == 1.0f) { + continue; + } + fprintf(stream, " - %s: %f\n", std::get<0>(la).c_str(), std::get<1>(la)); + } fprintf(stream, "lora_base: %s\n", params.lora_base.c_str()); fprintf(stream, "low_vram: %s # default: false\n", params.low_vram ? "true" : "false"); fprintf(stream, "main_gpu: %d # default: 0\n", params.main_gpu); diff --git a/common/common.h b/common/common.h index 16e30b2f5..64601f997 100644 --- a/common/common.h +++ b/common/common.h @@ -85,8 +85,8 @@ struct gpt_params { std::vector antiprompt; // string upon seeing which more user input is prompted std::string logdir = ""; // directory in which to save YAML log files - std::string lora_adapter = ""; // lora adapter path - std::string lora_base = ""; // base model path for the lora adapter + std::vector> lora_adapter; // lora adapter path with user defined scale + std::string lora_base = ""; // base model path for the lora adapter int ppl_stride = 0; // stride for perplexity calculations. If left at 0, the pre-existing approach will be used. int ppl_output_type = 0; // = 0 -> ppl output is as usual, = 1 -> ppl output is num_tokens, ppl, one per line @@ -128,6 +128,8 @@ void gpt_print_usage(int argc, char ** argv, const gpt_params & params); std::string gpt_random_prompt(std::mt19937 & rng); +void process_escapes(std::string& input); + // // Model utils // diff --git a/common/train.cpp b/common/train.cpp new file mode 100644 index 000000000..4a1280966 --- /dev/null +++ b/common/train.cpp @@ -0,0 +1,1496 @@ +#include "train.h" +#include "common.h" + +#include +#include +#include + +struct random_normal_distribution { + std::mt19937 gen; + std::normal_distribution rd; + float min; + float max; +}; + +struct random_uniform_distribution { + std::mt19937 gen; + std::uniform_real_distribution rd; +}; + +struct train_state * init_train_state() { + struct train_state * state = new struct train_state; + state->train_its = 0; + state->train_samples = 0; + state->train_tokens = 0; + state->train_epochs = 0; + state->shuffle_samples_hash = 0; + state->shuffle_sample_count = 0; + state->shuffle_next_sample = 0; + state->shuffle_rng_state_current = ""; + state->shuffle_rng_state_next = ""; + + state->opt = new struct ggml_opt_context; + state->opt->ctx = NULL; + state->opt->params = ggml_opt_default_params(GGML_OPT_ADAM); + state->opt->loss_after = 0.0f; + + return state; +} + +void free_train_state(struct train_state * state) { + delete state->opt; + delete state; +} + +struct random_normal_distribution * init_random_normal_distribution( + int seed, float mean, float std, float min, float max +) { + struct random_normal_distribution * rnd = (struct random_normal_distribution *) malloc(sizeof(struct random_normal_distribution)); + rnd->gen = std::mt19937(seed); + rnd->rd = std::normal_distribution{mean, std}; + rnd->min = min; + rnd->max = max; + return rnd; +} + +struct random_uniform_distribution * init_random_uniform_distribution(int seed, float min, float max) { + struct random_uniform_distribution * rnd = (struct random_uniform_distribution *) malloc(sizeof(struct random_uniform_distribution)); + rnd->gen = std::mt19937(seed); + rnd->rd = std::uniform_real_distribution{min, max}; + return rnd; +} + +void free_random_normal_distribution (struct random_normal_distribution * rnd) { + free(rnd); +} + +void free_random_uniform_distribution(struct random_uniform_distribution * rnd) { + free(rnd); +} + +struct ggml_tensor * randomize_tensor_normal(struct ggml_tensor * tensor, struct random_normal_distribution * rnd) { + float scale = 1.0f; // xavier + switch (tensor->n_dims) { + case 1: + scale /= sqrtf((float) tensor->ne[0]); + for (int i0 = 0; i0 < tensor->ne[0]; i0++) { + float * dst = (float *) ((char *) tensor->data + i0*tensor->nb[0]); + *dst = scale * frand_normal(rnd); + } + break; + case 2: + scale /= sqrtf((float) tensor->ne[0]+tensor->ne[1]); + for (int i1 = 0; i1 < tensor->ne[1]; i1++) { + for (int i0 = 0; i0 < tensor->ne[0]; i0++) { + float * dst = (float *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1]); + *dst = scale * frand_normal(rnd); + } + } + break; + case 3: + scale /= sqrtf((float) tensor->ne[0]+tensor->ne[1]); + for (int i2 = 0; i2 < tensor->ne[2]; i2++) { + for (int i1 = 0; i1 < tensor->ne[1]; i1++) { + for (int i0 = 0; i0 < tensor->ne[0]; i0++) { + float * dst = (float *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1] + i2*tensor->nb[2]); + *dst = scale * frand_normal(rnd); + } + } + } + break; + case 4: + scale /= sqrtf((float) tensor->ne[0]+tensor->ne[1]); + for (int i3 = 0; i3 < tensor->ne[3]; i3++) { + for (int i2 = 0; i2 < tensor->ne[2]; i2++) { + for (int i1 = 0; i1 < tensor->ne[1]; i1++) { + for (int i0 = 0; i0 < tensor->ne[0]; i0++) { + float * dst = (float *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1] + i2*tensor->nb[2] + i3*tensor->nb[3]); + *dst = scale * frand_normal(rnd); + } + } + } + } + break; + default: + die("Unsupported tensor->n_dims"); + }; + return tensor; +} + +struct ggml_tensor * randomize_tensor_uniform(struct ggml_tensor * tensor, struct random_uniform_distribution * rnd) { + switch (tensor->n_dims) { + case 1: + for (int i0 = 0; i0 < tensor->ne[0]; i0++) { + float * dst = (float *) ((char *) tensor->data + i0*tensor->nb[0]); + *dst = frand_uniform(rnd); + } + break; + case 2: + for (int i1 = 0; i1 < tensor->ne[1]; i1++) { + for (int i0 = 0; i0 < tensor->ne[0]; i0++) { + float * dst = (float *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1]); + *dst = frand_uniform(rnd); + } + } + break; + case 3: + for (int i2 = 0; i2 < tensor->ne[2]; i2++) { + for (int i1 = 0; i1 < tensor->ne[1]; i1++) { + for (int i0 = 0; i0 < tensor->ne[0]; i0++) { + float * dst = (float *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1] + i2*tensor->nb[2]); + *dst = frand_uniform(rnd); + } + } + } + break; + case 4: + for (int i3 = 0; i3 < tensor->ne[3]; i3++) { + for (int i2 = 0; i2 < tensor->ne[2]; i2++) { + for (int i1 = 0; i1 < tensor->ne[1]; i1++) { + for (int i0 = 0; i0 < tensor->ne[0]; i0++) { + float * dst = (float *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1] + i2*tensor->nb[2] + i3*tensor->nb[3]); + *dst = frand_uniform(rnd); + } + } + } + } + break; + default: + die("Unsupported tensor->n_dims"); + }; + return tensor; +} + +float frand() { + return (float)rand()/((float)(RAND_MAX) + 1.0f); +} + +float frand_normal(struct random_normal_distribution * rnd) { + return fclamp(rnd->rd(rnd->gen), rnd->min, rnd->max); +} + +float frand_uniform(struct random_uniform_distribution * rnd) { + return rnd->rd(rnd->gen); +} + +int clamp(const int v, const int min, const int max) { + return ((v < min) ? (min) : (v > max) ? (max) : v); +} + +float fclamp(const float v, const float min, const float max) { + return ((v < min) ? (min) : (v > max) ? (max) : v); +} + +void assert_shape_1d(struct ggml_tensor * tensor, int64_t ne0) { + GGML_ASSERT(tensor->n_dims == 1); + GGML_ASSERT(tensor->ne[0] == ne0); +} + +void assert_shape_2d(struct ggml_tensor * tensor, int64_t ne0, int64_t ne1) { + GGML_ASSERT(tensor->n_dims == 2); + GGML_ASSERT(tensor->ne[0] == ne0); + GGML_ASSERT(tensor->ne[1] == ne1); +} + +void assert_shape_3d(struct ggml_tensor * tensor, int64_t ne0, int64_t ne1, int64_t ne2) { + GGML_ASSERT(tensor->n_dims == 3); + GGML_ASSERT(tensor->ne[0] == ne0); + GGML_ASSERT(tensor->ne[1] == ne1); + GGML_ASSERT(tensor->ne[2] == ne2); +} + +void assert_shape_4d(struct ggml_tensor * tensor, int64_t ne0, int64_t ne1, int64_t ne2, int64_t ne3) { + GGML_ASSERT(tensor->n_dims == 4); + GGML_ASSERT(tensor->ne[0] == ne0); + GGML_ASSERT(tensor->ne[1] == ne1); + GGML_ASSERT(tensor->ne[2] == ne2); + GGML_ASSERT(tensor->ne[3] == ne3); +} + +int64_t get_example_targets_batch( + struct llama_context * lctx, + struct ggml_tensor * tokens_input, + struct ggml_tensor * target_probs, + int64_t example_id, + const size_t * samples_offs, + const size_t * samples_begin, + const size_t * samples_size, + size_t samples_count, + const llama_token * train_data, + size_t n_train_data, + bool separate_with_eos, + bool separate_with_bos, + bool fill_with_next_samples, + bool sample_random_offsets +) { + GGML_ASSERT(samples_count > 0); + GGML_ASSERT(tokens_input->n_dims == 2); + GGML_ASSERT(target_probs->n_dims == 3); + int64_t n_vocab = target_probs->ne[0]; + int64_t n_tokens = tokens_input->ne[0]; + int64_t n_batch = tokens_input->ne[1]; + GGML_ASSERT(n_vocab == target_probs->ne[0]); + GGML_ASSERT(n_tokens == target_probs->ne[1]); + GGML_ASSERT(n_batch == target_probs->ne[2]); + + int64_t used_samples = 0; + + ggml_set_f32(target_probs, 0.0f); + llama_token bos = llama_token_bos(lctx); + llama_token eos = llama_token_eos(lctx); + // printf("%s: example_id=%d n_batch=%d n_train_samples=%zu\n", __func__, example_id, n_batch, n_train_samples); + for (int k=0; k= sample_size && fill_with_next_samples) { + if (!sample_separation_eos) { + // insert eos token to separate samples + sample_separation_eos = true; + } else if (!sample_separation_bos) { + // insert bos token to separate samples + sample_separation_bos = true; + token = bos; + } else { + // sample separation is done, continue with next sample + sample_separation_eos = !separate_with_eos; + sample_separation_bos = !separate_with_bos; + sample_offs = 0; + sample_idx = (example_id + used_samples) % samples_count; + sample_begin = samples_begin[sample_idx]; + sample_size = samples_size[sample_idx]; + ++used_samples; + } + } + // note: no else-if here + if (sample_offs < sample_size) { + token = clamp(train_data[sample_begin+sample_offs], 0, (llama_token) (n_vocab - 1)); + ++sample_offs; + } + ggml_set_f32_nd(target_probs, token, (int) i, (int) k, 0, +1.0f); + if (i+1> rng; +} + +std::string mt19937_get_state(const std::mt19937& rng) { + std::stringstream s_rng_state; + s_rng_state.imbue(std::locale::classic()); + s_rng_state << rng; + return s_rng_state.str(); +} + +std::string mt19937_seed_to_state(unsigned seed) { + std::mt19937 rng(seed); + return mt19937_get_state(rng); +} + +std::string shuffle_samples( + const std::string & rng_state, + size_t * shuffled_offs, + size_t * shuffled_begins, + size_t * shuffled_sizes, + const size_t * begins, + const size_t * sizes, + size_t count) { + if (count == 0) return rng_state; + + std::mt19937 rng; + mt19937_set_state(rng, rng_state); + + // sort indices by random value for each index + std::vector idcs; + { + std::vector rnd; + idcs.resize(count); + rnd.resize(count); + for (unsigned i=0; i h_string; + std::hash h_ull; + size_t h = h_string(std::string(fn)); + h = hash_combine(h, h_ull((unsigned long long) sample_count)); + for (size_t i=0; i< sample_count; ++i) { + h = hash_combine(h, h_ull((unsigned long long) samples_begin[i])); + h = hash_combine(h, h_ull((unsigned long long) samples_size[i])); + } + return h; +} + +std::string replace_str(const char * s, const char * needle, const char * replacement) { + std::string str = s; + size_t pos = str.find(needle); + if (pos != std::string::npos) { + str.replace(pos, strlen(needle), replacement); + } + return str; +} + +void print_duration(double fmillis) { + if (fmillis < 1000.0f) { + printf("%.1fms", (float) fmillis); + return; + } + const int64_t one_sec = 1000; + const int64_t one_min = one_sec * 60; + const int64_t one_hour = one_min * 60; + const int64_t one_day = one_hour * 24; + + int64_t millis = (int64_t) fmillis; + int64_t days = millis/one_day; + int64_t hours = (millis - days*one_day)/one_hour; + int64_t minutes = (millis - days*one_day - hours*one_hour)/one_min; + int64_t seconds = (millis - days*one_day - hours*one_hour - minutes*one_min)/one_sec; + + // to print int64_t either cast to (long long int) or use macro PRId64 from + if (days > 0) { + printf("%lldd ", (long long int) days); + } + printf("%02lld:%02lld:%02lld", (long long int) hours, (long long int) minutes, (long long int) seconds); +} + +float cosine_decay(int64_t step, int64_t decay_steps, float minimum) { + if (step > decay_steps) { + step = decay_steps; + } + const float cosine_decay = 0.50f*(1.0f + cosf(3.14159265359f*step/decay_steps)); + const float decay = (1 - minimum)*cosine_decay + minimum; + return decay; +} + +float cosine_decay_restart(int64_t step, int64_t decay_steps, float minimum, float restart_step_mult) { + while (step > decay_steps) { + step -= decay_steps; + decay_steps = (int64_t) (restart_step_mult * decay_steps); + } + return cosine_decay(step, decay_steps, minimum); +} + +float learning_schedule( + int64_t step, + int64_t warmup_steps, + int64_t cos_decay_steps, + float learning_rate, + float overall_minimum, + float cos_decay_minimum, + float cos_decay_restart_step_mult, + bool enable_restart) { + + float result = + (step < warmup_steps) + ? (float) step / (float) warmup_steps + : enable_restart + ? cosine_decay_restart( + step - warmup_steps, + cos_decay_steps, + cos_decay_minimum, + cos_decay_restart_step_mult) + : cosine_decay( + step, + cos_decay_steps, + cos_decay_minimum); + + float min = overall_minimum / learning_rate; + result = min + result * (1.0f - min); + return result; +} + +static bool are_same_layout(struct ggml_tensor * a, struct ggml_tensor * b) { + GGML_ASSERT(a != NULL); + GGML_ASSERT(b != NULL); + GGML_ASSERT(a->type == b->type); + GGML_ASSERT(ggml_are_same_shape(a, b)); + GGML_ASSERT(ggml_is_contiguous(a) && ggml_is_contiguous(b)); + + return true; +} + +void copy_tensor_by_name(struct ggml_tensor * dst, struct ggml_context * ctx, const char * name) { + if (dst == NULL) { + return; + } + struct ggml_tensor * t = ggml_get_tensor(ctx, name); + GGML_ASSERT(are_same_layout(dst, t)); + memcpy(dst->data, t->data, ggml_nbytes(t)); + + if (strlen(ggml_get_name(dst)) == 0) { + ggml_set_name(dst, name); + } +} + +// gguf constants +static const char * LLM_KV_OPTIMIZER_TYPE = "optimizer.type"; +static const char * LLM_KV_OPTIMIZER_TYPE_ADAM = "adam"; +static const char * LLM_KV_OPTIMIZER_TYPE_LBFGS = "lbfgs"; +static const char * LLM_KV_OPTIMIZER_FILE_VERSION = "optimizer.file_version"; +static const char * LLM_KV_OPTIMIZER_CONVERGENCE_PAST_COUNT = "optimizer.convergence_past_count"; +static const char * LLM_KV_OPTIMIZER_PARAMETER_COUNT = "optimizer.parameter_count"; +static const char * LLM_KV_OPTIMIZER_ITERATION_COUNT = "optimizer.iteration_count"; +static const char * LLM_KV_OPTIMIZER_JUST_INITIALIZED = "optimizer.just_initialized"; +static const char * LLM_KV_OPTIMIZER_ADAM_BEST_LOSS = "optimizer.adam.best_loss"; +static const char * LLM_KV_OPTIMIZER_ADAM_PREVIOUS_LOSS = "optimizer.adam.previous_loss"; +static const char * LLM_KV_OPTIMIZER_ADAM_NO_IMPROVEMENT_COUNT = "optimizer.adam.no_improvement_count"; +static const char * LLM_KV_OPTIMIZER_LBFGS_APPROX_HESSIAN_COUNT = "optimizer.lbfgs.approx_hessian_count"; +static const char * LLM_KV_OPTIMIZER_LBFGS_BEST_LOSS = "optimizer.lbfgs.best_loss"; +static const char * LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_STEP = "optimizer.lbfgs.line_search_step"; +static const char * LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_J = "optimizer.lbfgs.line_search_j"; +static const char * LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_K = "optimizer.lbfgs.line_search_k"; +static const char * LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_END = "optimizer.lbfgs.line_search_end"; +static const char * LLM_KV_OPTIMIZER_LBFGS_NO_IMPROVEMENT_COUNT = "optimizer.lbfgs.no_improvement_count"; + +static const char * LLM_TENSOR_OPTIMIZER_ADAM_FIRST_MOMENTS = "optimizer.adam.first_moments"; +static const char * LLM_TENSOR_OPTIMIZER_ADAM_SECOND_MOMENTS = "optimizer.adam.second_moments"; +static const char * LLM_TENSOR_OPTIMIZER_ADAM_PAST_LOSS_VALUES = "optimizer.adam.past_loss_values"; + +static const char * LLM_TENSOR_OPTIMIZER_LBFGS_CURRENT_PARAMETERS = "optimizer.lbfgs.current_parameters"; +static const char * LLM_TENSOR_OPTIMIZER_LBFGS_PREVIOUS_PARAMETERS = "optimizer.lbfgs.previous_parameters"; +static const char * LLM_TENSOR_OPTIMIZER_LBFGS_CURRENT_GRADIENTS = "optimizer.lbfgs.current_gradients"; +static const char * LLM_TENSOR_OPTIMIZER_LBFGS_PREVIOUS_GRADIENTS = "optimizer.lbfgs.previous_gradients"; +static const char * LLM_TENSOR_OPTIMIZER_LBFGS_SEARCH_DIRECTION = "optimizer.lbfgs.search_direction"; +static const char * LLM_TENSOR_OPTIMIZER_LBFGS_PAST_LOSS_VALUES = "optimizer.lbfgs.past_loss_values"; +static const char * LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_ALPHA = "optimizer.lbfgs.memory_alpha"; +static const char * LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_YS = "optimizer.lbfgs.memory_ys"; +static const char * LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_S = "optimizer.lbfgs.memory_s"; +static const char * LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_Y = "optimizer.lbfgs.memory_y"; + +static const char * LLM_KV_TRAINING_FILE_VERSION = "training.file_version"; +static const char * LLM_KV_TRAINING_ITERATION_COUNT = "training.iteration_count"; +static const char * LLM_KV_TRAINING_SAMPLE_COUNT = "training.sample_count"; +static const char * LLM_KV_TRAINING_TOKEN_COUNT = "training.token_count"; +static const char * LLM_KV_TRAINING_EPOCH_COUNT = "training.epoch_count"; +static const char * LLM_KV_TRAINING_SHUFFLE_SAMPLES_HASH = "training.shuffle.samples_hash"; +static const char * LLM_KV_TRAINING_SHUFFLE_RNG_STATE = "training.shuffle.rng_state"; +static const char * LLM_KV_TRAINING_SHUFFLE_SAMPLE_COUNT = "training.shuffle.sample_count"; +static const char * LLM_KV_TRAINING_SHUFFLE_NEXT_SAMPLE = "training.shuffle.next_sample"; + +#define GGUF_GET_KEY(ctx, dst, func, type, req, key) \ +{ \ + const std::string skey(key); \ + const int kid = gguf_find_key(ctx, skey.c_str()); \ + if (kid >= 0) { \ + enum gguf_type ktype = gguf_get_kv_type(ctx, kid); \ + if (ktype != (type)) { \ + die_fmt("key %s has wrong type: %s", skey.c_str(), gguf_type_name(ktype)); \ + } \ + (dst) = func(ctx, kid); \ + } else if (req) { \ + die_fmt("key not found in model: %s", skey.c_str()); \ + } \ +} + +void load_opt_context_gguf(struct gguf_context * fctx, struct ggml_context * f_ggml_ctx, struct ggml_opt_context * opt) { + // NOTE: gguf_context must be initialized with f_ggml_ctx and no_alloc=false, otherwise tensor data can not be read + + uint32_t file_version; + GGUF_GET_KEY(fctx, file_version, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_OPTIMIZER_FILE_VERSION); + GGML_ASSERT(file_version == 0); + + GGUF_GET_KEY(fctx, opt->params.past, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_OPTIMIZER_CONVERGENCE_PAST_COUNT); + GGUF_GET_KEY(fctx, opt->iter, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_OPTIMIZER_ITERATION_COUNT); + GGUF_GET_KEY(fctx, opt->just_initialized, gguf_get_val_bool, GGUF_TYPE_BOOL, true, LLM_KV_OPTIMIZER_JUST_INITIALIZED); + + uint64_t nx; + GGUF_GET_KEY(fctx, nx, gguf_get_val_u64, GGUF_TYPE_UINT64, true, LLM_KV_OPTIMIZER_PARAMETER_COUNT); + opt->nx = (size_t) nx; + + // don't call ggml_opt_init until optimizer type and optimizer specific parameters are know + + std::string opt_type; + GGUF_GET_KEY(fctx, opt_type, gguf_get_val_str, GGUF_TYPE_STRING, true, LLM_KV_OPTIMIZER_TYPE); + if (opt_type == LLM_KV_OPTIMIZER_TYPE_ADAM) { + opt->params.type = GGML_OPT_ADAM; + + GGUF_GET_KEY(fctx, opt->adam.fx_best, gguf_get_val_f32, GGUF_TYPE_FLOAT32, true, LLM_KV_OPTIMIZER_ADAM_BEST_LOSS); + GGUF_GET_KEY(fctx, opt->adam.fx_prev, gguf_get_val_f32, GGUF_TYPE_FLOAT32, true, LLM_KV_OPTIMIZER_ADAM_PREVIOUS_LOSS); + GGUF_GET_KEY(fctx, opt->adam.n_no_improvement, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_OPTIMIZER_ADAM_NO_IMPROVEMENT_COUNT); + + ggml_opt_init(opt->ctx, opt, opt->params, opt->nx); + + copy_tensor_by_name(opt->adam.m, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_ADAM_FIRST_MOMENTS); + copy_tensor_by_name(opt->adam.v, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_ADAM_SECOND_MOMENTS); + copy_tensor_by_name(opt->adam.pf, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_ADAM_PAST_LOSS_VALUES); + } else if (opt_type == LLM_KV_OPTIMIZER_TYPE_LBFGS) { + opt->params.type = GGML_OPT_LBFGS; + + GGUF_GET_KEY(fctx, opt->params.lbfgs.m, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_OPTIMIZER_LBFGS_APPROX_HESSIAN_COUNT); + GGUF_GET_KEY(fctx, opt->lbfgs.fx_best, gguf_get_val_f32, GGUF_TYPE_FLOAT32, true, LLM_KV_OPTIMIZER_LBFGS_BEST_LOSS); + GGUF_GET_KEY(fctx, opt->lbfgs.step, gguf_get_val_f32, GGUF_TYPE_FLOAT32, true, LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_STEP); + GGUF_GET_KEY(fctx, opt->lbfgs.j, gguf_get_val_i32, GGUF_TYPE_INT32, true, LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_J); + GGUF_GET_KEY(fctx, opt->lbfgs.k, gguf_get_val_i32, GGUF_TYPE_INT32, true, LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_K); + GGUF_GET_KEY(fctx, opt->lbfgs.end, gguf_get_val_i32, GGUF_TYPE_INT32, true, LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_END); + GGUF_GET_KEY(fctx, opt->lbfgs.n_no_improvement, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_OPTIMIZER_LBFGS_NO_IMPROVEMENT_COUNT); + + ggml_opt_init(opt->ctx, opt, opt->params, opt->nx); + + copy_tensor_by_name(opt->lbfgs.x, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_CURRENT_PARAMETERS); + copy_tensor_by_name(opt->lbfgs.xp, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_PREVIOUS_PARAMETERS); + copy_tensor_by_name(opt->lbfgs.g, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_CURRENT_GRADIENTS); + copy_tensor_by_name(opt->lbfgs.gp, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_PREVIOUS_GRADIENTS); + copy_tensor_by_name(opt->lbfgs.d, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_SEARCH_DIRECTION); + copy_tensor_by_name(opt->lbfgs.pf, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_PAST_LOSS_VALUES); + copy_tensor_by_name(opt->lbfgs.lmal, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_ALPHA); + copy_tensor_by_name(opt->lbfgs.lmys, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_YS); + copy_tensor_by_name(opt->lbfgs.lms, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_S); + copy_tensor_by_name(opt->lbfgs.lmy, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_Y); + } else { + die("unknown optimizer type\n"); + } +} + +void save_opt_context_gguf(struct gguf_context * fctx, struct ggml_opt_context * opt) { + gguf_set_val_u32(fctx, LLM_KV_OPTIMIZER_FILE_VERSION, 0); + gguf_set_val_u32(fctx, LLM_KV_OPTIMIZER_CONVERGENCE_PAST_COUNT, opt->params.past); + gguf_set_val_u64(fctx, LLM_KV_OPTIMIZER_PARAMETER_COUNT, (uint64_t) opt->nx); + gguf_set_val_u32(fctx, LLM_KV_OPTIMIZER_ITERATION_COUNT, opt->iter); + gguf_set_val_bool(fctx, LLM_KV_OPTIMIZER_JUST_INITIALIZED, opt->just_initialized); + + switch (opt->params.type) { + case GGML_OPT_ADAM: + { + gguf_set_val_str(fctx, LLM_KV_OPTIMIZER_TYPE, LLM_KV_OPTIMIZER_TYPE_ADAM); + gguf_set_val_f32(fctx, LLM_KV_OPTIMIZER_ADAM_BEST_LOSS, opt->adam.fx_best); + gguf_set_val_f32(fctx, LLM_KV_OPTIMIZER_ADAM_PREVIOUS_LOSS, opt->adam.fx_prev); + gguf_set_val_u32(fctx, LLM_KV_OPTIMIZER_ADAM_NO_IMPROVEMENT_COUNT, opt->adam.n_no_improvement); + + ggml_set_name(opt->adam.m, LLM_TENSOR_OPTIMIZER_ADAM_FIRST_MOMENTS); + ggml_set_name(opt->adam.v, LLM_TENSOR_OPTIMIZER_ADAM_SECOND_MOMENTS); + if (opt->adam.pf) { + ggml_set_name(opt->adam.pf, LLM_TENSOR_OPTIMIZER_ADAM_PAST_LOSS_VALUES); + } + + gguf_add_tensor(fctx, opt->adam.m); + gguf_add_tensor(fctx, opt->adam.v); + if (opt->adam.pf) { + gguf_add_tensor(fctx, opt->adam.pf); + } + } break; + case GGML_OPT_LBFGS: + { + gguf_set_val_str(fctx, LLM_KV_OPTIMIZER_TYPE, LLM_KV_OPTIMIZER_TYPE_LBFGS); + gguf_set_val_u32(fctx, LLM_KV_OPTIMIZER_LBFGS_APPROX_HESSIAN_COUNT, opt->params.lbfgs.m); + gguf_set_val_f32(fctx, LLM_KV_OPTIMIZER_LBFGS_BEST_LOSS, opt->lbfgs.fx_best); + gguf_set_val_f32(fctx, LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_STEP, opt->lbfgs.step); + gguf_set_val_i32(fctx, LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_J, opt->lbfgs.j); + gguf_set_val_i32(fctx, LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_K, opt->lbfgs.k); + gguf_set_val_i32(fctx, LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_END, opt->lbfgs.end); + gguf_set_val_u32(fctx, LLM_KV_OPTIMIZER_LBFGS_NO_IMPROVEMENT_COUNT, opt->lbfgs.n_no_improvement); + + ggml_set_name(opt->lbfgs.x, LLM_TENSOR_OPTIMIZER_LBFGS_CURRENT_PARAMETERS); + ggml_set_name(opt->lbfgs.xp, LLM_TENSOR_OPTIMIZER_LBFGS_PREVIOUS_PARAMETERS); + ggml_set_name(opt->lbfgs.g, LLM_TENSOR_OPTIMIZER_LBFGS_CURRENT_GRADIENTS); + ggml_set_name(opt->lbfgs.gp, LLM_TENSOR_OPTIMIZER_LBFGS_PREVIOUS_GRADIENTS); + ggml_set_name(opt->lbfgs.d, LLM_TENSOR_OPTIMIZER_LBFGS_SEARCH_DIRECTION); + if (opt->lbfgs.pf) { + ggml_set_name(opt->lbfgs.pf, LLM_TENSOR_OPTIMIZER_LBFGS_PAST_LOSS_VALUES); + } + ggml_set_name(opt->lbfgs.lmal, LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_ALPHA); + ggml_set_name(opt->lbfgs.lmys, LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_YS); + ggml_set_name(opt->lbfgs.lms, LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_S); + ggml_set_name(opt->lbfgs.lmy, LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_Y); + + gguf_add_tensor(fctx, opt->lbfgs.x); + gguf_add_tensor(fctx, opt->lbfgs.xp); + gguf_add_tensor(fctx, opt->lbfgs.g); + gguf_add_tensor(fctx, opt->lbfgs.gp); + gguf_add_tensor(fctx, opt->lbfgs.d); + if (opt->lbfgs.pf) { + gguf_add_tensor(fctx, opt->lbfgs.pf); + } + gguf_add_tensor(fctx, opt->lbfgs.lmal); + gguf_add_tensor(fctx, opt->lbfgs.lmys); + gguf_add_tensor(fctx, opt->lbfgs.lms); + gguf_add_tensor(fctx, opt->lbfgs.lmy); + } break; + } +} + +bool load_train_state_gguf(struct gguf_context * fctx, struct ggml_context * f_ggml_ctx, struct train_state * train) { + if (gguf_find_key(fctx, LLM_KV_TRAINING_FILE_VERSION) < 0) { + return false; + } + + uint32_t file_version; + GGUF_GET_KEY(fctx, file_version, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_FILE_VERSION); + GGML_ASSERT(file_version <= 1); + + if (file_version == 0) { + + GGUF_GET_KEY(fctx, train->train_its, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_ITERATION_COUNT); + GGUF_GET_KEY(fctx, train->train_samples, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_SAMPLE_COUNT); + GGUF_GET_KEY(fctx, train->train_tokens, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_TOKEN_COUNT); + + } else if (file_version == 1) { + + GGUF_GET_KEY(fctx, train->train_its, gguf_get_val_u64, GGUF_TYPE_UINT64, true, LLM_KV_TRAINING_ITERATION_COUNT); + GGUF_GET_KEY(fctx, train->train_samples, gguf_get_val_u64, GGUF_TYPE_UINT64, true, LLM_KV_TRAINING_SAMPLE_COUNT); + GGUF_GET_KEY(fctx, train->train_tokens, gguf_get_val_u64, GGUF_TYPE_UINT64, true, LLM_KV_TRAINING_TOKEN_COUNT); + GGUF_GET_KEY(fctx, train->train_epochs, gguf_get_val_u64, GGUF_TYPE_UINT64, true, LLM_KV_TRAINING_EPOCH_COUNT); + + GGUF_GET_KEY(fctx, train->shuffle_samples_hash, gguf_get_val_u64, GGUF_TYPE_UINT64, false, LLM_KV_TRAINING_SHUFFLE_SAMPLES_HASH); + GGUF_GET_KEY(fctx, train->shuffle_rng_state_current, gguf_get_val_str, GGUF_TYPE_STRING, false, LLM_KV_TRAINING_SHUFFLE_RNG_STATE); + GGUF_GET_KEY(fctx, train->shuffle_sample_count, gguf_get_val_u64, GGUF_TYPE_UINT64, false, LLM_KV_TRAINING_SHUFFLE_SAMPLE_COUNT); + GGUF_GET_KEY(fctx, train->shuffle_next_sample, gguf_get_val_u64, GGUF_TYPE_UINT64, false, LLM_KV_TRAINING_SHUFFLE_NEXT_SAMPLE); + } + + load_opt_context_gguf(fctx, f_ggml_ctx, train->opt); + return true; +} + +void save_train_state_gguf(struct gguf_context * fctx, struct train_state * train) { + gguf_set_val_u32(fctx, LLM_KV_TRAINING_FILE_VERSION, 1); + gguf_set_val_u64(fctx, LLM_KV_TRAINING_ITERATION_COUNT, train->train_its); + gguf_set_val_u64(fctx, LLM_KV_TRAINING_SAMPLE_COUNT, train->train_samples); + gguf_set_val_u64(fctx, LLM_KV_TRAINING_TOKEN_COUNT, train->train_tokens); + gguf_set_val_u64(fctx, LLM_KV_TRAINING_EPOCH_COUNT, train->train_epochs); + + gguf_set_val_u64(fctx, LLM_KV_TRAINING_SHUFFLE_SAMPLES_HASH, (uint64_t) train->shuffle_samples_hash); + gguf_set_val_str(fctx, LLM_KV_TRAINING_SHUFFLE_RNG_STATE, train->shuffle_rng_state_current.c_str()); + gguf_set_val_u64(fctx, LLM_KV_TRAINING_SHUFFLE_SAMPLE_COUNT, (uint64_t) train->shuffle_sample_count); + gguf_set_val_u64(fctx, LLM_KV_TRAINING_SHUFFLE_NEXT_SAMPLE, (uint64_t) train->shuffle_next_sample); + + save_opt_context_gguf(fctx, train->opt); +} + + +struct llama_file { + // use FILE * so we don't have to re-open the file to mmap + FILE * fp; + size_t size; + + llama_file(const char * fname, const char * mode) { + fp = std::fopen(fname, mode); + if (fp == NULL) { + size = 0; + } else { + seek(0, SEEK_END); + size = tell(); + seek(0, SEEK_SET); + } + } + + size_t tell() const { +#ifdef _WIN32 + __int64 ret = _ftelli64(fp); +#else + long ret = std::ftell(fp); +#endif + GGML_ASSERT(ret != -1); // this really shouldn't fail + return (size_t) ret; + } + + void seek(size_t offset, int whence) { +#ifdef _WIN32 + int ret = _fseeki64(fp, (__int64) offset, whence); +#else + int ret = std::fseek(fp, (long) offset, whence); +#endif + GGML_ASSERT(ret == 0); // same + } + + void read_raw(void * ptr, size_t size) { + if (size == 0) { + return; + } + errno = 0; + std::size_t ret = std::fread(ptr, size, 1, fp); + if (ferror(fp)) { + die_fmt("read error: %s", strerror(errno)); + } + if (ret != 1) { + die("unexpectedly reached end of file"); + } + } + + std::uint32_t read_u32() { + std::uint32_t ret; + read_raw(&ret, sizeof(ret)); + return ret; + } + + std::string read_string(std::uint32_t len) { + std::vector chars(len); + read_raw(chars.data(), len); + return std::string(chars.data(), len); + } + + void write_raw(const void * ptr, size_t size) { + if (size == 0) { + return; + } + errno = 0; + size_t ret = std::fwrite(ptr, size, 1, fp); + if (ret != 1) { + die_fmt("write error: %s", strerror(errno)); + } + } + + void write_u32(std::uint32_t val) { + write_raw(&val, sizeof(val)); + } + + ~llama_file() { + if (fp) { + std::fclose(fp); + } + } +}; + +static size_t utf8_len(char src) { + const size_t lookup[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 4 }; + uint8_t highbits = static_cast(src) >> 4; + return lookup[highbits]; +} + +// mark each byte with its utf8 unit number. +// returns the number of utf8 characters. +// e.g. when bytes == '\x61\xD0\xB0\x62', +// then utf8_units will become [0,0,1,0] +// utf8_nunits will become [1,2,2,1] and 3 is returned. +// bytes where utf8_units is zero, are the begin of an utf8 character. +static size_t mark_utf8_units(const char* bytes, int * utf8_units, int * utf8_nunits, size_t count) { + size_t offs = 0; + size_t count_utf8 = 0; + while(offs < count) { + int len = (int) utf8_len(bytes[offs]); + for (int i=0; i & out_tokens, + std::vector & out_samples_begin, + std::vector & out_samples_size) { + struct llama_file f(filename, "rb"); + + if (f.size == 0) { + out_tokens.clear(); + out_samples_begin.clear(); + out_samples_size.clear(); + printf("%s: warning: empty or not existing training data file '%s'\n", + __func__, filename); + return out_tokens.size(); + } + + // account for possible leading whitespace that will be added by tokenizer + // e.g. '\t' will be tokenized by llama spm tokenizer to [29871, 12] + const int n_max_tokens_overhead = 1; + + std::vector buf; + buf.resize(f.size); + + f.read_raw(buf.data(), f.size); + + std::vector utf8_units; + std::vector utf8_nunits; + utf8_units.resize(buf.size()); + utf8_nunits.resize(buf.size()); + mark_utf8_units(buf.data(), utf8_units.data(), utf8_nunits.data(), buf.size()); + + if (sample_start.size() == 0) { + // tokenize all data at once + out_tokens.resize(buf.size() + n_max_tokens_overhead); + + int n_tokens = llama_tokenize( + lctx, + buf.data(), + (int) buf.size(), + out_tokens.data(), + (int) out_tokens.size(), + false); + if (n_tokens < 0) { + out_tokens.resize(-n_tokens); + n_tokens = llama_tokenize( + lctx, + buf.data(), + (int) buf.size(), + out_tokens.data(), + (int) out_tokens.size(), + false); + } + if (n_tokens >= 0) { + out_tokens.resize(n_tokens); + } + + // generate sample starts at all token positions + out_samples_begin.clear(); + out_samples_begin.push_back(0); + out_samples_size.push_back(std::min((size_t) context_length, out_tokens.size())); + size_t end = (out_tokens.size() >= context_length) ? (out_tokens.size() - context_length) : 0; + for (size_t sample_begin = 1; sample_begin < end; ++sample_begin) { + out_samples_begin.push_back(sample_begin); + out_samples_size.push_back(context_length); + } + } else { + // split data into samples and tokenize each sample + std::string data_str(buf.data(), buf.size()); + out_samples_begin.clear(); + out_samples_size.clear(); + out_tokens.clear(); + + // find all positions of pattern sample_start + size_t sample_begin = data_str.find(sample_start, 0); + while (sample_begin != std::string::npos) { + out_samples_begin.push_back(sample_begin); + const size_t search_start = sample_begin + sample_start.size(); + sample_begin = data_str.find(sample_start, search_start); + } + if (out_samples_begin.size() == 0) { + printf("%s: warning: sample start pattern '%s' not found. inserting single sample at data begin\n", + __func__, sample_start.c_str()); + out_samples_begin.push_back(0); + } + + out_samples_size.resize(out_samples_begin.size(), 0); + + std::vector buf_sample; + std::vector tok_sample; + + const size_t sample_begin_offset = (include_sample_start ? 0 : sample_start.size()); + size_t found_too_big_sample = 0; + size_t found_too_small_sample = 0; + size_t found_empty_sample = 0; + size_t found_min_sample_size = SIZE_MAX; + size_t found_max_sample_size = 0; + + size_t max_token_text_size = 0; + int n_vocab = llama_n_vocab(lctx); + for (llama_token token=0; token < n_vocab; ++token) { + max_token_text_size = std::max( + max_token_text_size, + strlen(llama_token_get_text(lctx, token))); + } + + // upper bound of context byte length. + // strings with this byte length should always tokenize to at least context_length tokens. + size_t context_byte_len = max_token_text_size*context_length; + + for (unsigned i=0; i 0) { + // sample end is in the middle of an utf8 character. + // advance sample_end to the begin of the next utf8 character. + sample_end += utf8_nunits[sample_end] - utf8_units[sample_end]; + } + size_t sample_size = sample_end - sample_begin; + if (sample_size == 0) { + ++found_empty_sample; + } + + if (sample_size > 0) { + // llama_tokenize expects zero terminated string, + // copy sample into buffer and zero terminate it. + buf_sample.resize(sample_size); + memcpy(buf_sample.data(), data_str.data() + sample_begin, sample_size); + + // printf("sample: '%s'\n", buf_sample.data()); + + // tokenize the sample + tok_sample.resize(buf_sample.size() + n_max_tokens_overhead); + int n_tokens = llama_tokenize(lctx, + buf_sample.data(), + (int) buf_sample.size(), + tok_sample.data(), + (int) tok_sample.size(), + false); + if (n_tokens < 0) { + tok_sample.resize(-n_tokens); + n_tokens = llama_tokenize(lctx, + buf_sample.data(), + (int) buf_sample.size(), + tok_sample.data(), + (int) tok_sample.size(), + false); + GGML_ASSERT(n_tokens >= 0); + } + GGML_ASSERT(n_tokens <= (int) tok_sample.size()); + + if ((size_t) n_tokens > context_length) { + ++found_too_big_sample; + } else if ((size_t) n_tokens < context_length) { + ++found_too_small_sample; + } + found_max_sample_size = std::max(found_max_sample_size, (size_t) n_tokens); + found_min_sample_size = std::min(found_min_sample_size, (size_t) n_tokens); + + // write out tokens, start and size of sample + // overwrite the string start position with the token start position + out_samples_begin[i] = out_tokens.size(); + out_samples_size[i] = (size_t) n_tokens; + out_tokens.insert(out_tokens.end(), tok_sample.begin(), tok_sample.begin() + n_tokens); + } else { + out_samples_begin[i] = out_tokens.size(); + out_samples_size[i] = 0; + } + + } + if (found_too_big_sample > 0) { + printf("%s: warning: found %zu samples (max length %zu) that exceed context length of %u. samples will be cut off.\n", + __func__, found_too_big_sample, found_max_sample_size, context_length); + } + + if (found_too_small_sample > 0) { + printf("%s: warning: found %zu samples (min length %zu) that are shorter than context length of %u.\n", + __func__, found_too_small_sample, found_min_sample_size, context_length); + } + + if (found_empty_sample) { + printf("%s: warning: found %zu empty samples.\n", + __func__, found_empty_sample); + } + } + printf("%s: total number of samples: %zu\n", + __func__, out_samples_begin.size()); + + GGML_ASSERT(out_samples_begin.size() == out_samples_size.size()); + + return out_tokens.size(); +} + +std::string get_train_filename(const char * filename, const char * pattern_it, const char * latest, int64_t iteration) { + std::string sit = (iteration >= 0) ? std::to_string(iteration) : std::string(latest); + return replace_str(filename, pattern_it, sit.c_str()); +} + +struct train_params_common get_default_train_params_common() { + struct train_params_common params; + params.fn_train_data = "shakespeare.txt"; + params.fn_checkpoint_in = "checkpoint.gguf"; + params.fn_checkpoint_out = "checkpoint-ITERATION.gguf"; + params.pattern_fn_it = "ITERATION"; + params.fn_latest = "LATEST"; + + params.print_usage = false; + + params.save_every = 10; + + params.seed = -1; + + params.n_ctx = 128; + params.n_threads = 6; + params.n_batch = 8; + params.n_gradient_accumulation = 1; + params.n_epochs = -1; + + params.custom_n_ctx = false; + + params.use_flash = true; + params.use_checkpointing = true; + + params.sample_start = ""; + params.include_sample_start = false; + params.escape = false; + params.overlapping_samples = false; + params.fill_with_next_samples = false; + params.separate_with_eos = false; + params.separate_with_bos = true; + params.sample_random_offsets = false; + params.force_reshuffle = false; + + params.opt_past = 0; + params.opt_delta = 1e-5f; + params.opt_max_no_improvement = 0; + + params.warmup = 100; + params.cos_decay_steps = 1000; + params.cos_decay_restart = 1.1f; + params.cos_decay_min = 0.1f; + params.enable_restart = false; + + params.adam_n_iter = 256; + params.adam_alpha = 1e-3f; + params.adam_min_alpha = 0; + params.adam_decay = 1e-1f; + params.adam_decay_min_ndim = 2; + params.adam_beta1 = 0.9f; + params.adam_beta2 = 0.999f; + params.adam_gclip = 1.0f; + params.adam_eps_f = 0.0f; + return params; +} + +void print_common_train_usage(int /*argc*/, char ** /*argv*/, const struct train_params_common * params) { + // fprintf(stderr, "usage: %s [options]\n", argv[0]); + // fprintf(stderr, "\n"); + // fprintf(stderr, "options:\n"); + // fprintf(stderr, " -h, --help show this help message and exit\n"); + fprintf(stderr, " --train-data FNAME path from which to load training data (default '%s')\n", params->fn_train_data); + fprintf(stderr, " --checkpoint-in FNAME path from which to load training checkpoint (default '%s')\n", params->fn_checkpoint_in); + fprintf(stderr, " --checkpoint-out FNAME path to save training checkpoint (default '%s')\n", params->fn_checkpoint_out); + fprintf(stderr, " --pattern-fn-it STR pattern in output filenames to be replaced by iteration number (default '%s')\n", params->pattern_fn_it); + fprintf(stderr, " --fn-latest STR string to use instead of iteration number for saving latest output (default '%s')\n", params->fn_latest); + fprintf(stderr, " --save-every N save checkpoint and lora every N iterations. Disabled when N <= 0. (default '%d')\n", params->save_every); + fprintf(stderr, " -s SEED, --seed SEED RNG seed (default: -1, use random seed for -1)\n"); + fprintf(stderr, " -c N, --ctx N Context size used during training (default %d)\n", params->n_ctx); + fprintf(stderr, " -t N, --threads N Number of threads (default %d)\n", params->n_threads); + fprintf(stderr, " -b N, --batch N Parallel batch size (default %d)\n", params->n_batch); + fprintf(stderr, " --grad-acc N Number of gradient accumulation steps (simulates larger batch size of batch*gradacc) (default %d)\n", params->n_gradient_accumulation); + fprintf(stderr, " --sample-start STR Sets the starting point for samples after the specified pattern. If empty use every token position as sample start. (default '%s')\n", params->sample_start.c_str()); + fprintf(stderr, " --include-sample-start Include the sample start in the samples. (default off)\n"); + fprintf(stderr, " --escape process sample start escapes sequences (\\n, \\r, \\t, \\', \\\", \\\\)\n"); + fprintf(stderr, " --overlapping-samples Samples my overlap, will include sample-start of second and following samples. When off, samples will end at begin of next sample. (default off)\n"); + fprintf(stderr, " --fill-with-next-samples Samples shorter than context length will be followed by the next (shuffled) samples. (default off)\n"); + fprintf(stderr, " --separate-with-eos When fill-with-next-samples, insert end-of-sequence token between samples.%s\n", params->separate_with_eos ? " (default)" : ""); + fprintf(stderr, " --separate-with-bos When fill-with-next-samples, insert begin-of-sequence token between samples.%s\n", params->separate_with_bos ? " (default)" : ""); + fprintf(stderr, " --no-separate-with-eos When fill-with-next-samples, don't insert end-of-sequence token between samples.%s\n", !params->separate_with_eos ? " (default)" : ""); + fprintf(stderr, " --no-separate-with-bos When fill-with-next-samples, don't insert begin-of-sequence token between samples.%s\n", !params->separate_with_bos ? " (default)" : ""); + fprintf(stderr, " --sample-random-offsets Use samples beginning at random offsets. Together with fill-with-next-samples this may help for training endless text generation.%s\n", params->sample_random_offsets ? " (default)" : ""); + fprintf(stderr, " --force-reshuffle Force a reshuffling of data at program start, otherwise the shuffling of loaded checkpoint is resumed.\n"); + fprintf(stderr, " --no-flash Don't use flash attention \n"); + fprintf(stderr, " --use-flash Use flash attention (default)\n"); + fprintf(stderr, " --no-checkpointing Don't use gradient checkpointing\n"); + fprintf(stderr, " --use-checkpointing Use gradient checkpointing (default)\n"); + fprintf(stderr, " --warmup N Only for Adam optimizer. Number of warmup steps (default %d)\n", params->warmup); + fprintf(stderr, " --cos-decay-steps N Only for Adam optimizer. Number of cosine decay steps (default %d)\n", params->cos_decay_steps); + fprintf(stderr, " --cos-decay-restart N Only for Adam optimizer. Increase of cosine decay steps after restart (default %f)\n", params->cos_decay_restart); + fprintf(stderr, " --cos-decay-min N Only for Adam optimizer. Cosine decay minimum (default %f)\n", params->cos_decay_min); + fprintf(stderr, " --enable-restart N Only for Adam optimizer. Enable restarts of cos-decay %s\n", params->enable_restart ? "(default)" : ""); + fprintf(stderr, " --disable-restart N Only for Adam optimizer. Disable restarts of cos-decay %s\n", !params->enable_restart ? "(default)" : ""); + fprintf(stderr, " --opt-past N Number of optimization iterations to track for delta convergence test. Disabled when zero. (default %d)\n", params->opt_past); + fprintf(stderr, " --opt-delta N Maximum delta for delta convergence test. Disabled when <= zero. (default %f)\n", params->opt_delta); + fprintf(stderr, " --opt-max-no-improvement N Maximum number of optimization iterations with no improvement. Disabled when <= zero. (default %d)\n", params->opt_max_no_improvement); + fprintf(stderr, " --epochs N Maximum number epochs to process. (default %d)\n", params->n_epochs); + fprintf(stderr, " --adam-iter N Maximum number of Adam optimization iterations for each batch (default %d)\n", params->adam_n_iter); + fprintf(stderr, " --adam-alpha N Adam learning rate alpha (default %f)\n", params->adam_alpha); + fprintf(stderr, " --adam-min-alpha N Adam minimum learning rate alpha - including warmup phase (default %f)\n", params->adam_min_alpha); + fprintf(stderr, " --adam-decay N AdamW weight decay. Values greater zero enable AdamW instead of regular Adam. (default %f)\n", params->adam_decay); + fprintf(stderr, " --adam-decay-min-ndim N Minimum number of tensor dimensions to apply AdamW weight decay. Weight decay is not applied to tensors with less n_dims. (default %d)\n", params->adam_decay_min_ndim); + fprintf(stderr, " --adam-beta1 N AdamW beta1 in interval [0,1). How much to smooth the first moment of gradients. (default %f)\n", params->adam_beta1); + fprintf(stderr, " --adam-beta2 N AdamW beta2 in interval [0,1). How much to smooth the second moment of gradients. (default %f)\n", params->adam_beta2); + fprintf(stderr, " --adam-gclip N AdamW gradient clipping. Disabled when zero. (default %f)\n", params->adam_gclip); + fprintf(stderr, " --adam-epsf N AdamW epsilon for convergence test. Disabled when <= zero. (default %f)\n", params->adam_eps_f); + fprintf(stderr, "\n"); +} + +bool consume_common_train_arg( + int argc, char ** argv, int * idx, struct train_params_common * params, bool * invalid_param +) { + int& i = *idx; + std::string arg = argv[i]; + const std::string arg_prefix = "--"; + if (arg.compare(0, arg_prefix.size(), arg_prefix) == 0) { + std::replace(arg.begin(), arg.end(), '_', '-'); + } + if (arg == "--train-data") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->fn_train_data = argv[i]; + } else if (arg == "--checkpoint-in") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->fn_checkpoint_in = argv[i]; + } else if (arg == "--checkpoint-out") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->fn_checkpoint_out = argv[i]; + } else if (arg == "--pattern-fn-it") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->pattern_fn_it = argv[i]; + } else if (arg == "--fn-latest") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->fn_latest = argv[i]; + } else if (arg == "--save-every") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->save_every = std::stoi(argv[i]); + } else if (arg == "-s" || arg == "--seed") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->seed = std::stoi(argv[i]); + } else if (arg == "-c" || arg == "--ctx") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->n_ctx = std::stoi(argv[i]); + params->custom_n_ctx = true; + } else if (arg == "-t" || arg == "--threads") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->n_threads = std::stoi(argv[i]); + } else if (arg == "-b" || arg == "--batch") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->n_batch = std::stoi(argv[i]); + } else if (arg == "--grad-acc") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->n_gradient_accumulation = std::max(1, std::stoi(argv[i])); + } else if (arg == "--sample-start") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->sample_start = std::string(argv[i]); + } else if (arg == "--escape") { + params->escape = true; + } else if (arg == "--include-sample-start") { + params->include_sample_start = true; + } else if (arg == "--overlapping-samples") { + params->overlapping_samples = true; + } else if (arg == "--fill-with-next-samples") { + params->fill_with_next_samples = true; + } else if (arg == "--separate-with-eos") { + params->separate_with_eos = true; + } else if (arg == "--separate-with-bos") { + params->separate_with_bos = true; + } else if (arg == "--no-separate-with-eos") { + params->separate_with_eos = false; + } else if (arg == "--no-separate-with-bos") { + params->separate_with_bos = false; + } else if (arg == "--sample-random-offsets") { + params->sample_random_offsets = true; + } else if (arg == "--force-reshuffle") { + params->force_reshuffle = true; + } else if (arg == "--no-flash") { + params->use_flash = false; + } else if (arg == "--use-flash") { + params->use_flash = true; + } else if (arg == "--no-checkpointing") { + params->use_checkpointing = false; + } else if (arg == "--use-checkpointing") { + params->use_checkpointing = true; + } else if (arg == "--warmup") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->warmup = std::stoi(argv[i]); + } else if (arg == "--cos-decay-steps") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->cos_decay_steps = std::stoi(argv[i]); + } else if (arg == "--cos-decay-restart") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->cos_decay_restart = std::stof(argv[i]); + } else if (arg == "--cos-decay-min") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->cos_decay_min = std::stof(argv[i]); + } else if (arg == "--enable-restart") { + params->enable_restart = true; + } else if (arg == "--disable-restart") { + params->enable_restart = false; + } else if (arg == "--opt-past") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->opt_past = std::stoi(argv[i]); + } else if (arg == "--opt-delta") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->opt_delta = std::stof(argv[i]); + } else if (arg == "--opt-max-no-improvement") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->opt_max_no_improvement = std::stoi(argv[i]); + } else if (arg == "--adam-epsf") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->adam_eps_f = std::stof(argv[i]); + } else if (arg == "--epochs") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->n_epochs = std::stoi(argv[i]); + } else if (arg == "--adam-iter") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->adam_n_iter = std::stoi(argv[i]); + } else if (arg == "--adam-alpha") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->adam_alpha = std::stof(argv[i]); + } else if (arg == "--adam-min-alpha") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->adam_min_alpha = std::stof(argv[i]); + } else if (arg == "--adam-decay") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->adam_decay = std::stof(argv[i]); + } else if (arg == "--adam-decay-min-ndim") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->adam_decay_min_ndim = std::stoi(argv[i]); + } else if (arg == "--adam-beta1") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->adam_beta1 = std::stof(argv[i]); + } else if (arg == "--adam-beta2") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->adam_beta2 = std::stof(argv[i]); + } else if (arg == "--adam-gclip") { + if (++i >= argc) { + *invalid_param = true; + return true; + } + params->adam_gclip = std::stof(argv[i]); + } else if (arg == "-h" || arg == "--help") { + params->print_usage = true; + return true; + } else { + return false; + } + return true; +} + +void finish_processing_train_args(struct train_params_common * params) { + if (params->escape) { + process_escapes(params->sample_start); + } +} + +void train_opt_callback(void * vdata, int accum_step, float * sched, bool * cancel) { + struct train_opt_callback_data * data = (struct train_opt_callback_data *) vdata; + struct train_params_common * params = data->params; + struct train_state * train = data->train; + struct ggml_opt_context * opt = train->opt; + int n_batch = params->n_batch; + int n_ctx = params->n_ctx; + + if (accum_step == 0) { + // time measurement + int64_t now = ggml_time_ms(); + if (now > data->last_time && opt->iter > data->first_iter) { + double dt = (double) (now - data->last_time); + if (data->millis_per_iter == 0.0) { + data->millis_per_iter = dt; + } else { + const double gain = 0.7; + data->millis_per_iter = data->millis_per_iter*(1.0-gain) + dt*gain; + } + } + + double remaining_millis = 0.0; + if (data->millis_per_iter > 0.0) { + const int n_iter = params->adam_n_iter; + const int done_iter = opt->iter - data->first_iter; + const int remaining_iter = n_iter - done_iter; + remaining_millis = remaining_iter * data->millis_per_iter; + } + + // file saving + const bool save_now = (params->save_every > 0) && (opt->iter - data->last_save_iter >= params->save_every); + if (save_now) { + int new_iters = opt->iter - data->last_save_iter; + train->train_its += new_iters; + train->train_tokens += new_iters * opt->params.n_gradient_accumulation * n_batch * n_ctx; + + if (data->save_cb) { + data->save_cb(data->save_data, train); + } + + data->last_save_iter = opt->iter; + } + + // exclude file saving from time measurement, by measuring last_time after saving + data->last_time = ggml_time_ms(); + + *sched = learning_schedule( + opt->iter, + params->warmup, + params->cos_decay_steps, + params->adam_alpha, + params->adam_min_alpha, + params->cos_decay_min, + params->cos_decay_restart, + params->enable_restart); + + int impr_plot = -(int)(1 + (opt->loss_before - opt->loss_after) * 10.0f + 0.5f); + if (impr_plot > 0) impr_plot = 0; + if (std::isnan(opt->loss_before) || std::isnan(opt->loss_before)) impr_plot = 0; + printf("%s: iter=%6d sample=%zu/%zu sched=%f loss=%f", + __func__, opt->iter, std::min(1+train->shuffle_next_sample, train->shuffle_sample_count), train->shuffle_sample_count, + *sched, opt->loss_after); + + + if (data->millis_per_iter > 0) { + printf(" dt="); + print_duration(data->millis_per_iter); + printf(" eta="); + print_duration(remaining_millis); + } + + float improvement = opt->loss_before - opt->loss_after; + const float plot_scale = 10.0f; + int bar_len = (int)(1 + improvement*plot_scale + 0.5); + printf(" |"); + for (int i=0; i"); + printf("\n"); + } + + int64_t used_samples = get_example_targets_batch( + data->lctx, + data->tokens_input, + data->target_probs, + train->shuffle_next_sample, + data->shuffled_samples_offs, + data->shuffled_samples_begin, + data->shuffled_samples_size, + data->samples_count, + data->tokens_data, + data->tokens_size, + params->separate_with_eos, + params->separate_with_bos, + params->fill_with_next_samples, + params->sample_random_offsets); + + train->train_samples += used_samples; + train->shuffle_next_sample += used_samples; + + if (train->shuffle_next_sample >= train->shuffle_sample_count) { + ++train->train_epochs; + printf("%s: reshuffle samples. completed epochs: %llu\n", __func__, (long long unsigned) train->train_epochs); + // note: we may have used some samples from the current shuffling more than once + train->shuffle_rng_state_current = train->shuffle_rng_state_next; + train->shuffle_rng_state_next = shuffle_samples( + train->shuffle_rng_state_current, + data->shuffled_samples_offs, + data->shuffled_samples_begin, + data->shuffled_samples_size, + data->samples_begin, + data->samples_size, + data->samples_count); + train->shuffle_next_sample = 0; + } + + const bool last_epoch_reached = (params->n_epochs > 0 && (int64_t) train->train_epochs - data->first_epoch >= params->n_epochs); + if (last_epoch_reached) { + // allow optimization iteration at last epoch to be completed before canceling + if (data->iter_at_last_epoch < 0) { + data->iter_at_last_epoch = opt->iter; + } else if (opt->iter > data->iter_at_last_epoch) { + *cancel = true; + } + } +} diff --git a/common/train.h b/common/train.h new file mode 100644 index 000000000..42fa704b8 --- /dev/null +++ b/common/train.h @@ -0,0 +1,230 @@ +// Various helper functions and utilities for training + +#pragma once + +#include +#include +#include + +#include "ggml.h" +#include "llama.h" + +typedef std::string mt19937_state; + +struct train_state { + struct ggml_opt_context * opt; + + uint64_t train_its; + uint64_t train_samples; + uint64_t train_tokens; + uint64_t train_epochs; + + size_t shuffle_samples_hash; // fn, sample_count, *zip(sample_begins, sample_sizes) + mt19937_state shuffle_rng_state_current; + mt19937_state shuffle_rng_state_next; + size_t shuffle_sample_count; + size_t shuffle_next_sample; +}; + +struct train_params_common { + const char * fn_train_data; + const char * fn_checkpoint_in; + const char * fn_checkpoint_out; + const char * pattern_fn_it; + const char * fn_latest; + + bool print_usage; + + int save_every; + + uint32_t seed; + + int n_ctx; + int n_threads; + int n_batch; + int n_gradient_accumulation; + int n_epochs; + + bool custom_n_ctx; + + bool use_flash; + bool use_checkpointing; + + std::string sample_start; + bool include_sample_start; + bool escape; + bool overlapping_samples; + bool fill_with_next_samples; + bool separate_with_eos; + bool separate_with_bos; + bool sample_random_offsets; + + bool force_reshuffle; + + int warmup; + int cos_decay_steps; + float cos_decay_restart; + float cos_decay_min; + bool enable_restart; + + int opt_past; + float opt_delta; + int opt_max_no_improvement; + + int adam_n_iter; + float adam_alpha; + float adam_min_alpha; + float adam_decay; + int adam_decay_min_ndim; + float adam_beta1; + float adam_beta2; + float adam_gclip; + float adam_eps_f; +}; + +typedef void (*save_train_files_callback)(void * data, struct train_state * train); + +struct train_opt_callback_data { + struct train_params_common * params; + struct train_state * train; + save_train_files_callback save_cb; + void * save_data; + struct llama_context * lctx; + int last_save_iter; + llama_token * tokens_data; + size_t tokens_size; + size_t * samples_begin; + size_t * samples_size; + size_t * shuffled_samples_offs; + size_t * shuffled_samples_begin; + size_t * shuffled_samples_size; + size_t samples_count; + struct ggml_tensor * tokens_input; + struct ggml_tensor * target_probs; + int first_iter; + int first_epoch; + int iter_at_last_epoch; + int64_t last_time; + double millis_per_iter; +}; + +struct train_state * init_train_state(); +void free_train_state(struct train_state * state); + +struct train_params_common get_default_train_params_common(); +void print_common_train_usage(int /*argc*/, char ** argv, const struct train_params_common * params); + +bool consume_common_train_arg(int argc, char ** argv, int * idx, struct train_params_common * params, bool * invalid_param); +void finish_processing_train_args(struct train_params_common * params); + +struct random_normal_distribution; +struct random_uniform_distribution; + +struct random_normal_distribution * init_random_normal_distribution (int seed, float mean, float std, float min, float max); +struct random_uniform_distribution * init_random_uniform_distribution(int seed, float min, float max); + +void free_random_normal_distribution (struct random_normal_distribution * rnd); +void free_random_uniform_distribution(struct random_uniform_distribution * rnd); + +struct ggml_tensor * randomize_tensor_normal (struct ggml_tensor * tensor, struct random_normal_distribution * rnd); +struct ggml_tensor * randomize_tensor_uniform(struct ggml_tensor * tensor, struct random_uniform_distribution * rnd); + +// generate random float in interval [0,1) +float frand(); +float frand_normal (struct random_normal_distribution * rnd); +float frand_uniform(struct random_uniform_distribution * rnd); + +int clamp (const int v, const int min, const int max); +float fclamp(const float v, const float min, const float max); + +void assert_shape_1d(struct ggml_tensor * tensor, int64_t ne0); +void assert_shape_2d(struct ggml_tensor * tensor, int64_t ne0, int64_t ne1); +void assert_shape_3d(struct ggml_tensor * tensor, int64_t ne0, int64_t ne1, int64_t ne2); +void assert_shape_4d(struct ggml_tensor * tensor, int64_t ne0, int64_t ne1, int64_t ne2, int64_t ne3); + +size_t tokenize_file( + struct llama_context * lctx, + const char * filename, + const std::string & sample_start, + bool include_sample_start, + bool overlapping_samples, + unsigned context_length, + std::vector & out_tokens, + std::vector & out_samples_begin, + std::vector & out_samples_size); + +int64_t get_example_targets_batch( + struct llama_context * lctx, + struct ggml_tensor * tokens_input, + struct ggml_tensor * target_probs, + int64_t example_id, + const size_t * samples_offs, + const size_t * samples_begin, + const size_t * samples_size, + size_t samples_count, + const llama_token * train_data, + size_t n_train_data, + bool separate_with_eos, + bool separate_with_bos, + bool fill_with_next_samples, + bool sample_random_offsets); + + +void mt19937_set_state(std::mt19937& rng, const mt19937_state& rng_state); +mt19937_state mt19937_get_state(const std::mt19937& rng); +mt19937_state mt19937_seed_to_state(unsigned seed); + +mt19937_state shuffle_samples( + const mt19937_state & rng_state, + size_t * shuffled_offs, + size_t * shuffled_begins, + size_t * shuffled_sizes, + const size_t * begins, + const size_t * sizes, + size_t count); + +size_t hash_combine(size_t h1, size_t h2); + +size_t compute_samples_hash( + const char* fn, + const size_t* samples_begin, + const size_t* samples_size, + size_t sample_count); + + +std::string replace_str(const char * s, const char * needle, const char * replacement); + +void print_duration(double milliseconds); + +float cosine_decay( + int64_t step, + int64_t decay_steps, + float minimum); + +float cosine_decay_restart( + int64_t step, + int64_t decay_steps, + float minimum, + float restart_step_mult); + +float learning_schedule( + int64_t step, + int64_t warmup_steps, + int64_t decay_steps, + float learning_rate, + float overall_minimum, + float cos_decay_minimum, + float cos_decay_restart_step_mult, + bool enable_restart); + +void copy_tensor_by_name(struct ggml_tensor * dst, struct ggml_context * ctx, const char * name); + +void load_opt_context_gguf(struct gguf_context * fctx, struct ggml_context * f_ggml_ctx, struct ggml_opt_context * opt); +void save_opt_context_gguf(struct gguf_context * fctx, struct ggml_opt_context * opt); + +bool load_train_state_gguf(struct gguf_context * fctx, struct ggml_context * f_ggml_ctx, struct train_state * train); +void save_train_state_gguf(struct gguf_context * fctx, struct train_state * train); + +std::string get_train_filename(const char * filename, const char * pattern_it, const char * latest, int64_t iteration); + +void train_opt_callback(void * vdata, int accum_step, float * sched, bool * cancel); diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 129cc0116..de4cf7a69 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -21,6 +21,7 @@ else() add_subdirectory(benchmark) add_subdirectory(baby-llama) add_subdirectory(train-text-from-scratch) + add_subdirectory(finetune) add_subdirectory(convert-llama2c-to-ggml) add_subdirectory(simple) add_subdirectory(batched) @@ -35,4 +36,5 @@ else() if (LLAMA_BUILD_SERVER) add_subdirectory(server) endif() + add_subdirectory(export-lora) endif() diff --git a/examples/baby-llama/baby-llama.cpp b/examples/baby-llama/baby-llama.cpp index b02a80863..fb1a15c47 100644 --- a/examples/baby-llama/baby-llama.cpp +++ b/examples/baby-llama/baby-llama.cpp @@ -1,4 +1,5 @@ #include "ggml.h" +#include "train.h" #include #include #include @@ -14,31 +15,6 @@ constexpr float rms_norm_eps = LLAMA_DEFAULT_RMS_EPS; constexpr float rms_norm_eps = 5e-6f; #endif -static float frand() { - return (float)rand()/(float)RAND_MAX; -} - -struct random_normal_distribution { - std::mt19937 gen; - std::normal_distribution nd; - float min; - float max; -}; - -static void init_random_normal_distribution( - struct random_normal_distribution * rnd, int seed, float mean, float std, float min, float max -) { - rnd->gen = std::mt19937(seed); - rnd->nd = std::normal_distribution{mean, std}; - rnd->min = min; - rnd->max = max; -} - -static float frand_normal(struct random_normal_distribution * rnd) { - const float r = rnd->nd(rnd->gen); - return ((r < rnd->min) ? (rnd->min) : (r > rnd->max) ? (rnd->max) : r); -} - static void ggml_graph_compute_helper(std::vector & buf, ggml_cgraph * graph, int n_threads) { struct ggml_cplan plan = ggml_graph_plan(graph, n_threads); @@ -93,54 +69,6 @@ static struct ggml_tensor * randomize_tensor( return tensor; } -static struct ggml_tensor * randomize_tensor_normal( - struct ggml_tensor * tensor, int ndims, const int64_t ne[], struct random_normal_distribution * rnd -) { - float scale = 1.0; // xavier - switch (ndims) { - case 1: - scale /= sqrtf(ne[0]); - for (int i0 = 0; i0 < ne[0]; i0++) { - ((float *)tensor->data)[i0] = scale * frand_normal(rnd); - } - break; - case 2: - scale /= sqrtf(ne[0]+ne[1]); - for (int i1 = 0; i1 < ne[1]; i1++) { - for (int i0 = 0; i0 < ne[0]; i0++) { - ((float *)tensor->data)[i1*ne[0] + i0] = scale * frand_normal(rnd); - } - } - break; - case 3: - scale /= sqrtf(ne[0]+ne[1]); - for (int i2 = 0; i2 < ne[2]; i2++) { - for (int i1 = 0; i1 < ne[1]; i1++) { - for (int i0 = 0; i0 < ne[0]; i0++) { - ((float *)tensor->data)[i2*ne[1]*ne[0] + i1*ne[0] + i0] = scale * frand_normal(rnd); - } - } - } - break; - case 4: - scale /= sqrtf(ne[0]+ne[1]); - for (int i3 = 0; i3 < ne[3]; i3++) { - for (int i2 = 0; i2 < ne[2]; i2++) { - for (int i1 = 0; i1 < ne[1]; i1++) { - for (int i0 = 0; i0 < ne[0]; i0++) { - ((float *)tensor->data)[i3*ne[2]*ne[1]*ne[0] + i2*ne[1]*ne[0] + i1*ne[0] + i0] = scale * frand_normal(rnd); - } - } - } - } - break; - default: - assert(false); - }; - - return tensor; -} - struct llama_hparams { uint32_t n_vocab = 32000; uint32_t n_ctx = 512; // this is provided as user input? @@ -398,27 +326,29 @@ static void randomize_model(struct llama_model * model, int seed, float mean, fl const uint32_t n_layer = hparams.n_layer; - struct random_normal_distribution rnd; - init_random_normal_distribution(&rnd, seed, mean, std, min, max); - randomize_tensor_normal(model->tok_embeddings, model->tok_embeddings->n_dims, model->tok_embeddings->ne, &rnd); - randomize_tensor_normal(model->norm, model->norm->n_dims, model->norm->ne, &rnd); - randomize_tensor_normal(model->output, model->output->n_dims, model->output->ne, &rnd); + struct random_normal_distribution * rnd = init_random_normal_distribution(seed, mean, std, min, max); + + randomize_tensor_normal(model->tok_embeddings , rnd); + randomize_tensor_normal(model->norm , rnd); + randomize_tensor_normal(model->output , rnd); for (uint32_t i = 0; i < n_layer; ++i) { auto & layer = model->layers[i]; - randomize_tensor_normal(layer.attention_norm, layer.attention_norm->n_dims, layer.attention_norm->ne, &rnd); + randomize_tensor_normal(layer.attention_norm, rnd); - randomize_tensor_normal(layer.wq, layer.wq->n_dims, layer.wq->ne, &rnd); - randomize_tensor_normal(layer.wk, layer.wk->n_dims, layer.wk->ne, &rnd); - randomize_tensor_normal(layer.wv, layer.wv->n_dims, layer.wv->ne, &rnd); - randomize_tensor_normal(layer.wo, layer.wo->n_dims, layer.wo->ne, &rnd); + randomize_tensor_normal(layer.wq, rnd); + randomize_tensor_normal(layer.wk, rnd); + randomize_tensor_normal(layer.wv, rnd); + randomize_tensor_normal(layer.wo, rnd); - randomize_tensor_normal(layer.ffn_norm, layer.ffn_norm->n_dims, layer.ffn_norm->ne, &rnd); + randomize_tensor_normal(layer.ffn_norm, rnd); - randomize_tensor_normal(layer.w1, layer.w1->n_dims, layer.w1->ne, &rnd); - randomize_tensor_normal(layer.w2, layer.w2->n_dims, layer.w2->ne, &rnd); - randomize_tensor_normal(layer.w3, layer.w3->n_dims, layer.w3->ne, &rnd); + randomize_tensor_normal(layer.w1, rnd); + randomize_tensor_normal(layer.w2, rnd); + randomize_tensor_normal(layer.w3, rnd); } + + free_random_normal_distribution(rnd); } @@ -429,32 +359,34 @@ static void randomize_model_lora( const uint32_t n_layer = hparams.n_layer; - struct random_normal_distribution rnd; - init_random_normal_distribution(&rnd, seed, mean, std, min, max); - randomize_tensor_normal(model->tok_embeddings, model->tok_embeddings->n_dims, model->tok_embeddings->ne, &rnd); - randomize_tensor_normal(model->norm, model->norm->n_dims, model->norm->ne, &rnd); - randomize_tensor_normal(model->outputa, model->outputa->n_dims, model->outputa->ne, &rnd); - randomize_tensor_normal(model->outputb, model->outputb->n_dims, model->outputb->ne, &rnd); + struct random_normal_distribution * rnd = init_random_normal_distribution(seed, mean, std, min, max); + + randomize_tensor_normal(model->tok_embeddings, rnd); + randomize_tensor_normal(model->norm , rnd); + randomize_tensor_normal(model->outputa , rnd); + randomize_tensor_normal(model->outputb , rnd); for (uint32_t i = 0; i < n_layer; ++i) { auto & layer = model->layers[i]; - randomize_tensor_normal(layer.attention_norm, layer.attention_norm->n_dims, layer.attention_norm->ne, &rnd); + randomize_tensor_normal(layer.attention_norm, rnd); - randomize_tensor_normal(layer.wqa, layer.wqa->n_dims, layer.wqa->ne, &rnd); - randomize_tensor_normal(layer.wqb, layer.wqb->n_dims, layer.wqb->ne, &rnd); - randomize_tensor_normal(layer.wka, layer.wka->n_dims, layer.wka->ne, &rnd); - randomize_tensor_normal(layer.wkb, layer.wkb->n_dims, layer.wkb->ne, &rnd); - randomize_tensor_normal(layer.wva, layer.wva->n_dims, layer.wva->ne, &rnd); - randomize_tensor_normal(layer.wvb, layer.wvb->n_dims, layer.wvb->ne, &rnd); - randomize_tensor_normal(layer.woa, layer.woa->n_dims, layer.woa->ne, &rnd); - randomize_tensor_normal(layer.wob, layer.wob->n_dims, layer.wob->ne, &rnd); + randomize_tensor_normal(layer.wqa, rnd); + randomize_tensor_normal(layer.wqb, rnd); + randomize_tensor_normal(layer.wka, rnd); + randomize_tensor_normal(layer.wkb, rnd); + randomize_tensor_normal(layer.wva, rnd); + randomize_tensor_normal(layer.wvb, rnd); + randomize_tensor_normal(layer.woa, rnd); + randomize_tensor_normal(layer.wob, rnd); - randomize_tensor_normal(layer.ffn_norm, layer.ffn_norm->n_dims, layer.ffn_norm->ne, &rnd); + randomize_tensor_normal(layer.ffn_norm, rnd); - randomize_tensor_normal(layer.w1, layer.w1->n_dims, layer.w1->ne, &rnd); - randomize_tensor_normal(layer.w2, layer.w2->n_dims, layer.w2->ne, &rnd); - randomize_tensor_normal(layer.w3, layer.w3->n_dims, layer.w3->ne, &rnd); + randomize_tensor_normal(layer.w1, rnd); + randomize_tensor_normal(layer.w2, rnd); + randomize_tensor_normal(layer.w3, rnd); } + + free_random_normal_distribution(rnd); } static bool init_kv_cache(struct llama_kv_cache* cache, struct llama_model * model, int n_batch) { @@ -762,32 +694,6 @@ static struct ggml_tensor * forward( return inpL; } -static void assert_shape_1d(struct ggml_tensor * tensor, int64_t ne0) { - GGML_ASSERT(tensor->n_dims == 1); - GGML_ASSERT(tensor->ne[0] == ne0); -} - -static void assert_shape_2d(struct ggml_tensor * tensor, int64_t ne0, int64_t ne1) { - GGML_ASSERT(tensor->n_dims == 2); - GGML_ASSERT(tensor->ne[0] == ne0); - GGML_ASSERT(tensor->ne[1] == ne1); -} - -static void assert_shape_3d(struct ggml_tensor * tensor, int64_t ne0, int64_t ne1, int64_t ne2) { - GGML_ASSERT(tensor->n_dims == 3); - GGML_ASSERT(tensor->ne[0] == ne0); - GGML_ASSERT(tensor->ne[1] == ne1); - GGML_ASSERT(tensor->ne[2] == ne2); -} - -static void assert_shape_4d(struct ggml_tensor * tensor, int64_t ne0, int64_t ne1, int64_t ne2, int64_t ne3) { - GGML_ASSERT(tensor->n_dims == 4); - GGML_ASSERT(tensor->ne[0] == ne0); - GGML_ASSERT(tensor->ne[1] == ne1); - GGML_ASSERT(tensor->ne[2] == ne2); - GGML_ASSERT(tensor->ne[3] == ne3); -} - static struct ggml_tensor * forward_batch( struct llama_model * model, struct llama_kv_cache * cache, diff --git a/examples/export-lora/CMakeLists.txt b/examples/export-lora/CMakeLists.txt new file mode 100644 index 000000000..cbbdaec67 --- /dev/null +++ b/examples/export-lora/CMakeLists.txt @@ -0,0 +1,5 @@ +set(TARGET export-lora) +add_executable(${TARGET} export-lora.cpp) +install(TARGETS ${TARGET} RUNTIME) +target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT}) +target_compile_features(${TARGET} PRIVATE cxx_std_11) diff --git a/examples/export-lora/README.md b/examples/export-lora/README.md new file mode 100644 index 000000000..0cf3e8e45 --- /dev/null +++ b/examples/export-lora/README.md @@ -0,0 +1,26 @@ +# export-lora + +Apply LORA adapters to base model and export the resulting model. + +``` +usage: export-lora [options] + +options: + -h, --help show this help message and exit + -m FNAME, --model-base FNAME model path from which to load base model (default '') + -o FNAME, --model-out FNAME path to save exported model (default '') + -l FNAME, --lora FNAME apply LoRA adapter + -s FNAME S, --lora-scaled FNAME S apply LoRA adapter with user defined scaling S + -t N, --threads N number of threads to use during computation (default: 4) +``` + +For example: + +```bash +./bin/export-lora \ + -m open-llama-3b-v2-q8_0.gguf \ + -o open-llama-3b-v2-q8_0-english2tokipona-chat.gguf \ + -l lora-open-llama-3b-v2-q8_0-english2tokipona-chat-LATEST.bin +``` + +Multiple LORA adapters can be applied by passing multiple `-l FN` or `-s FN S` command line parameters. diff --git a/examples/export-lora/export-lora.cpp b/examples/export-lora/export-lora.cpp new file mode 100644 index 000000000..d803cfd5c --- /dev/null +++ b/examples/export-lora/export-lora.cpp @@ -0,0 +1,474 @@ + +#include "common.h" +#include "ggml.h" +#include "ggml-alloc.h" + +#include +#include +#include + +static const size_t tensor_alignment = 32; + +struct lora_info { + std::string filename; + float scale; +}; + +struct export_lora_params { + std::string fn_model_base; + std::string fn_model_out; + std::vector lora; + int n_threads; +}; + +struct lora_data { + struct lora_info info; + std::vector data; + struct ggml_context * ctx; + + uint32_t lora_r; + uint32_t lora_alpha; +}; + +struct llama_file { + // use FILE * so we don't have to re-open the file to mmap + FILE * fp; + size_t size; + + llama_file(const char * fname, const char * mode) { + fp = std::fopen(fname, mode); + if (fp == NULL) { + size = 0; + } else { + seek(0, SEEK_END); + size = tell(); + seek(0, SEEK_SET); + } + } + + size_t tell() const { +#ifdef _WIN32 + __int64 ret = _ftelli64(fp); +#else + long ret = std::ftell(fp); +#endif + GGML_ASSERT(ret != -1); // this really shouldn't fail + return (size_t) ret; + } + + void seek(size_t offset, int whence) { +#ifdef _WIN32 + int ret = _fseeki64(fp, (__int64) offset, whence); +#else + int ret = std::fseek(fp, (long) offset, whence); +#endif + GGML_ASSERT(ret == 0); // same + } + + void read_raw(void * ptr, size_t size) { + if (size == 0) { + return; + } + errno = 0; + std::size_t ret = std::fread(ptr, size, 1, fp); + if (ferror(fp)) { + die_fmt("read error: %s", strerror(errno)); + } + if (ret != 1) { + die("unexpectedly reached end of file"); + } + } + + std::uint32_t read_u32() { + std::uint32_t ret; + read_raw(&ret, sizeof(ret)); + return ret; + } + + std::string read_string(std::uint32_t len) { + std::vector chars(len); + read_raw(chars.data(), len); + return std::string(chars.data(), len); + } + + void write_raw(const void * ptr, size_t size) { + if (size == 0) { + return; + } + errno = 0; + size_t ret = std::fwrite(ptr, size, 1, fp); + if (ret != 1) { + die_fmt("write error: %s", strerror(errno)); + } + } + + void write_u32(std::uint32_t val) { + write_raw(&val, sizeof(val)); + } + + bool eof() { + return tell() >= size; + } + + ~llama_file() { + if (fp) { + std::fclose(fp); + } + } +}; + +static struct export_lora_params get_default_export_lora_params() { + struct export_lora_params result; + result.fn_model_base = ""; + result.fn_model_out = ""; + result.n_threads = GGML_DEFAULT_N_THREADS; + return result; +} + +static void export_lora_print_usage(int /*argc*/, char ** argv, const struct export_lora_params * params) { + fprintf(stderr, "usage: %s [options]\n", argv[0]); + fprintf(stderr, "\n"); + fprintf(stderr, "options:\n"); + fprintf(stderr, " -h, --help show this help message and exit\n"); + fprintf(stderr, " -m FNAME, --model-base FNAME model path from which to load base model (default '%s')\n", params->fn_model_base.c_str()); + fprintf(stderr, " -o FNAME, --model-out FNAME path to save exported model (default '%s')\n", params->fn_model_out.c_str()); + fprintf(stderr, " -l FNAME, --lora FNAME apply LoRA adapter\n"); + fprintf(stderr, " -s FNAME S, --lora-scaled FNAME S apply LoRA adapter with user defined scaling S\n"); + fprintf(stderr, " -t N, --threads N number of threads to use during computation (default: %d)\n", params->n_threads); +} + +static bool export_lora_params_parse(int argc, char ** argv, struct export_lora_params * params) { + bool invalid_param = false; + std::string arg; + struct export_lora_params default_params = get_default_export_lora_params(); + const std::string arg_prefix = "--"; + + for (int i = 1; i < argc; i++) { + arg = argv[i]; + if (arg.compare(0, arg_prefix.size(), arg_prefix) == 0) { + std::replace(arg.begin(), arg.end(), '_', '-'); + } + + if (arg == "-m" || arg == "--model-base") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->fn_model_base = argv[i]; + } else if (arg == "-o" || arg == "--model-out") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->fn_model_out = argv[i]; + } else if (arg == "-l" || arg == "--lora") { + if (++i >= argc) { + invalid_param = true; + break; + } + struct lora_info lora; + lora.filename = argv[i]; + lora.scale = 1.0f; + params->lora.push_back(lora); + } else if (arg == "-s" || arg == "--lora-scaled") { + if (++i >= argc) { + invalid_param = true; + break; + } + struct lora_info lora; + lora.filename = argv[i]; + if (++i >= argc) { + invalid_param = true; + break; + } + lora.scale = std::stof(argv[i]); + params->lora.push_back(lora); + } else if (arg == "-t" || arg == "--threads") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->n_threads = std::stoi(argv[i]); + if (params->n_threads <= 0) { + params->n_threads = std::thread::hardware_concurrency(); + } + } else { + fprintf(stderr, "error: unknown argument: '%s'\n", arg.c_str()); + export_lora_print_usage(argc, argv, &default_params); + exit(1); + } + } + + if (params->fn_model_base == default_params.fn_model_base) { + fprintf(stderr, "error: please specify a filename for model-base.\n"); + export_lora_print_usage(argc, argv, &default_params); + exit(1); + } + if (params->fn_model_out == default_params.fn_model_out) { + fprintf(stderr, "error: please specify a filename for model-out.\n"); + export_lora_print_usage(argc, argv, &default_params); + exit(1); + } + if (invalid_param) { + fprintf(stderr, "error: invalid parameter for argument: '%s'\n", arg.c_str()); + export_lora_print_usage(argc, argv, &default_params); + exit(1); + } + return true; +} + +static void free_lora(struct lora_data * lora) { + if (lora->ctx != NULL) { + ggml_free(lora->ctx); + } + delete lora; +} + +static struct lora_data * load_lora(struct lora_info * info) { + struct lora_data * result = new struct lora_data; + result->info = *info; + result->ctx = NULL; + result->lora_r = 1; + result->lora_alpha = 1; + + struct llama_file file(info->filename.c_str(), "rb"); + if (file.fp == NULL) { + fprintf(stderr, "warning: Could not open lora adapter '%s'. Ignoring this adapter.\n", + info->filename.c_str()); + free_lora(result); + return NULL; + } + + struct ggml_init_params params_ggml; + params_ggml.mem_size = ggml_tensor_overhead() * GGML_MAX_NODES; + params_ggml.mem_buffer = NULL; + params_ggml.no_alloc = true; + result->ctx = ggml_init(params_ggml); + + uint32_t LLAMA_FILE_MAGIC_LORA = 0x67676C61; // 'ggla' + uint32_t magic = file.read_u32(); + if (magic != LLAMA_FILE_MAGIC_LORA) { + die_fmt("unexpected lora header file magic in '%s'", info->filename.c_str()); + } + uint32_t version = file.read_u32(); + if (version != 1) { + die_fmt("unexpected lora file version '%u' in '%s'", (unsigned) version, info->filename.c_str()); + } + result->lora_r = file.read_u32(); + result->lora_alpha = file.read_u32(); + // read tensor infos from file + std::vector name_buf; + std::vector tensors; + std::vector tensors_offset; + size_t total_nbytes_pad = 0; + while(!file.eof()) { + int64_t ne[4] = {1,1,1,1}; + uint32_t n_dims = file.read_u32(); + uint32_t namelen = file.read_u32(); + uint32_t type = file.read_u32(); + for (uint32_t k = 0; k < n_dims; ++k) { + ne[k] = (int64_t)file.read_u32(); + } + name_buf.clear(); + name_buf.resize(namelen + 1, '\0'); + file.read_raw(name_buf.data(), namelen); + file.seek((0-file.tell()) & 31, SEEK_CUR); + size_t offset = file.tell(); + struct ggml_tensor * tensor = ggml_new_tensor(result->ctx, (enum ggml_type) type, n_dims, ne); + ggml_set_name(tensor, name_buf.data()); + size_t nbytes = ggml_nbytes(tensor); + size_t nbytes_pad = ggml_nbytes_pad(tensor); + total_nbytes_pad += nbytes_pad; + tensors.push_back(tensor); + tensors_offset.push_back(offset); + file.seek(nbytes, SEEK_CUR); + } + // read tensor data + result->data.resize(total_nbytes_pad); + size_t data_offset = 0; + for (size_t i = 0; i < tensors.size(); ++i) { + struct ggml_tensor * tensor = tensors[i]; + size_t offset = tensors_offset[i]; + size_t nbytes = ggml_nbytes(tensor); + size_t nbytes_pad = ggml_nbytes_pad(tensor); + file.seek(offset, SEEK_SET); + tensor->data = result->data.data() + data_offset; + file.read_raw(tensor->data, nbytes); + data_offset += nbytes_pad; + } + return result; +} + + +static struct ggml_cgraph * build_graph_lora( + struct ggml_context * ctx, + struct ggml_tensor * tensor, + struct ggml_tensor * lora_a, + struct ggml_tensor * lora_b, + float scaling +) { + struct ggml_tensor * ab = ggml_mul_mat(ctx, lora_a, lora_b); + if (scaling != 1.0f) { + ab = ggml_scale(ctx, ab, ggml_new_f32(ctx, scaling)); + } + struct ggml_tensor * res = ggml_add_inplace(ctx, tensor, ab); + + struct ggml_cgraph * gf = ggml_new_graph(ctx); + ggml_build_forward_expand (gf, res); + return gf; +} + +static bool apply_lora(struct ggml_tensor * tensor, struct lora_data * lora, int n_threads) { + if (lora->ctx == NULL) { + return false; + } + std::string name = ggml_get_name(tensor); + std::string name_a = name + std::string(".loraA"); + std::string name_b = name + std::string(".loraB"); + struct ggml_tensor * lora_a = ggml_get_tensor(lora->ctx, name_a.c_str()); + struct ggml_tensor * lora_b = ggml_get_tensor(lora->ctx, name_b.c_str()); + if (lora_a == NULL || lora_b == NULL) { + return false; + } + + float scaling = lora->info.scale * (float)lora->lora_alpha / (float)lora->lora_r; + + struct ggml_init_params params; + params.mem_size = GGML_OBJECT_SIZE + GGML_GRAPH_SIZE + ggml_tensor_overhead()*4 + GGML_MEM_ALIGN*5; + params.mem_buffer = NULL; + params.no_alloc = true; + struct ggml_context * ctx = NULL; + struct ggml_allocr * alloc = NULL; + struct ggml_cgraph * gf = NULL; + + ctx = ggml_init(params); + alloc = ggml_allocr_new_measure(tensor_alignment); + gf = build_graph_lora(ctx, tensor, lora_a, lora_b, scaling); + size_t alloc_size = ggml_allocr_alloc_graph(alloc, gf); + ggml_allocr_free(alloc); + ggml_free(ctx); + + static std::vector data_compute; + data_compute.resize(alloc_size + tensor_alignment); + + ctx = ggml_init(params); + alloc = ggml_allocr_new(data_compute.data(), data_compute.size(), tensor_alignment); + gf = build_graph_lora(ctx, tensor, lora_a, lora_b, scaling); + ggml_allocr_alloc_graph(alloc, gf); + ggml_allocr_free(alloc); + + struct ggml_cplan cplan = ggml_graph_plan(gf, n_threads); + static std::vector data_work; + data_work.resize(cplan.work_size); + cplan.work_data = data_work.data(); + + ggml_graph_compute(gf, &cplan); + + ggml_free(ctx); + return true; +} + +static void export_lora(struct export_lora_params * params) { + // load all loras + std::vector loras; + for (size_t i = 0; i < params->lora.size(); ++i) { + struct lora_data * lora = load_lora(¶ms->lora[i]); + if (lora != NULL) { + loras.push_back(lora); + } + } + if (loras.size() == 0) { + fprintf(stderr, "warning: no lora adapters will be applied.\n"); + } + + // open input file + struct llama_file fin(params->fn_model_base.c_str(), "rb"); + if (!fin.fp) { + die_fmt("Could not open file '%s'\n", params->fn_model_base.c_str()); + } + + // open base model gguf, read tensors without their data + struct ggml_context * ctx_in; + struct gguf_init_params params_gguf; + params_gguf.no_alloc = true; + params_gguf.ctx = &ctx_in; + struct gguf_context * gguf_in = gguf_init_from_file(params->fn_model_base.c_str(), params_gguf); + + // create new gguf + struct gguf_context * gguf_out = gguf_init_empty(); + + // copy meta data from base model: kv and tensors + gguf_set_kv(gguf_out, gguf_in); + int n_tensors = gguf_get_n_tensors(gguf_in); + for (int i=0; i < n_tensors; ++i) { + const char * name = gguf_get_tensor_name(gguf_in, i); + struct ggml_tensor * tensor = ggml_get_tensor(ctx_in, name); + gguf_add_tensor(gguf_out, tensor); + } + + // create output file + struct llama_file fout(params->fn_model_out.c_str(), "wb"); + if (!fout.fp) { + die_fmt("Could not create file '%s'\n", params->fn_model_out.c_str()); + } + + // write gguf meta data + std::vector meta; + meta.resize(gguf_get_meta_size(gguf_out)); + gguf_get_meta_data(gguf_out, meta.data()); + fout.write_raw(meta.data(), meta.size()); + + std::vector data; + std::vector padding; + for (int i=0; i < n_tensors; ++i) { + const char * name = gguf_get_tensor_name(gguf_in, i); + struct ggml_tensor * tensor = ggml_get_tensor(ctx_in, name); + + // read tensor data + data.resize(ggml_nbytes(tensor)); + tensor->data = data.data(); + size_t offset = gguf_get_tensor_offset(gguf_in, i); + fin.seek(offset + meta.size(), SEEK_SET); + fin.read_raw(data.data(), data.size()); + + // apply all loras + for (size_t k = 0; k < loras.size(); ++k) { + apply_lora(tensor, loras[k], params->n_threads); + } + + // write tensor data + padding + padding.clear(); + padding.resize(GGML_PAD(data.size(), gguf_get_alignment(gguf_out)) - data.size(), 0); + + GGML_ASSERT(fout.tell() == offset + meta.size()); + // fout.seek(offset + meta.size(), SEEK_SET); + fout.write_raw(data.data(), data.size()); + fout.write_raw(padding.data(), padding.size()); + + if (i % 2 == 0) { + printf("."); + } + } + printf("\n"); + + // close gguf + gguf_free(gguf_out); + gguf_free(gguf_in); + + // free loras + for (size_t i = 0; i < loras.size(); ++i) { + free_lora(loras[i]); + } +} + +int main(int argc, char ** argv) { + struct export_lora_params params = get_default_export_lora_params(); + + if (!export_lora_params_parse(argc, argv, ¶ms)) { + return 1; + } + + export_lora(¶ms); + + return 0; +} diff --git a/examples/finetune/CMakeLists.txt b/examples/finetune/CMakeLists.txt new file mode 100644 index 000000000..2b52d21cf --- /dev/null +++ b/examples/finetune/CMakeLists.txt @@ -0,0 +1,5 @@ +set(TARGET finetune) +add_executable(${TARGET} finetune.cpp) +install(TARGETS ${TARGET} RUNTIME) +target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT}) +target_compile_features(${TARGET} PRIVATE cxx_std_11) diff --git a/examples/finetune/README.md b/examples/finetune/README.md new file mode 100644 index 000000000..b7347c20c --- /dev/null +++ b/examples/finetune/README.md @@ -0,0 +1,90 @@ +# finetune + +Basic usage instructions: + +```bash +# get training data +wget https://raw.githubusercontent.com/brunoklein99/deep-learning-notes/master/shakespeare.txt + +# finetune LORA adapter +./bin/finetune \ + --model-base open-llama-3b-v2-q8_0.gguf \ + --checkpoint-in chk-lora-open-llama-3b-v2-q8_0-shakespeare-LATEST.gguf \ + --checkpoint-out chk-lora-open-llama-3b-v2-q8_0-shakespeare-ITERATION.gguf \ + --lora-out lora-open-llama-3b-v2-q8_0-shakespeare-ITERATION.bin \ + --train-data "shakespeare.txt" \ + --save-every 10 \ + --threads 6 --adam-iter 30 --batch 4 --ctx 64 \ + --use-checkpointing + +# predict +./bin/main -m open-llama-3b-v2-q8_0.gguf --lora lora-open-llama-3b-v2-q8_0-shakespeare-LATEST.bin +``` + +Finetune output files will be saved every N iterations (config with `--save-every N`). +The pattern 'ITERATION' in the output filenames will be replaced with the iteration number and with 'LATEST' for the latest output. +So in above example after 10 iterations these files will be written: +- chk-lora-open-llama-3b-v2-q8_0-shakespeare-10.gguf +- chk-lora-open-llama-3b-v2-q8_0-shakespeare-LATEST.gguf +- lora-open-llama-3b-v2-q8_0-shakespeare-10.bin +- lora-open-llama-3b-v2-q8_0-shakespeare-LATEST.bin + +After 10 more iterations: +- chk-lora-open-llama-3b-v2-q8_0-shakespeare-20.gguf +- chk-lora-open-llama-3b-v2-q8_0-shakespeare-LATEST.gguf +- lora-open-llama-3b-v2-q8_0-shakespeare-20.bin +- lora-open-llama-3b-v2-q8_0-shakespeare-LATEST.bin + +Checkpoint files (`--checkpoint-in FN`, `--checkpoint-out FN`) store the training process. When the input checkpoint file does not exist, it will begin finetuning a new randomly initialized adapter. + +llama.cpp compatible LORA adapters will be saved with filename specified by `--lora-out FN`. +These LORA adapters can then be used by `main` together with the base model, like in the 'predict' example command above. + +In `main` you can also load multiple LORA adapters, which will then be mixed together. + +For example if you have two LORA adapters `lora-open-llama-3b-v2-q8_0-shakespeare-LATEST.bin` and `lora-open-llama-3b-v2-q8_0-bible-LATEST.bin`, you can mix them together like this: + +```bash +./bin/main -m open-llama-3b-v2-q8_0.gguf \ + --lora lora-open-llama-3b-v2-q8_0-shakespeare-LATEST.bin \ + --lora lora-open-llama-3b-v2-q8_0-bible-LATEST.bin +``` + +You can change how strong each LORA adapter is applied to the base model by using `--lora-scaled FN SCALE` instead of `--lora FN`. + +For example to apply 40% of the 'shakespeare' LORA adapter, 80% of the 'bible' LORA adapter and 100% of yet another one: + +```bash +./bin/main -m open-llama-3b-v2-q8_0.gguf \ + --lora-scaled lora-open-llama-3b-v2-q8_0-shakespeare-LATEST.bin 0.4 \ + --lora-scaled lora-open-llama-3b-v2-q8_0-bible-LATEST.bin 0.8 \ + --lora lora-open-llama-3b-v2-q8_0-yet-another-one-LATEST.bin +``` + +The scale numbers don't need to add up to one, and you can also use numbers creater than 1 to further increase the influence of an adapter. But making the values to big will sometimes result in worse output. Play around to find good values. + +Gradient checkpointing reduces the memory requirements by ~50% but increases the runtime. +If you have enough RAM, you can make finetuning a bit faster by disabling checkpointing with `--no-checkpointing`. + +The default LORA rank can be specified with `--lora-r N`. +The LORA rank can be configured for each model tensor type separately with these command line options: + +```bash + --lora-r N LORA r: default rank. Also specifies resulting scaling together with lora-alpha. (default 4) + --rank-att-norm N LORA rank for attention norm tensor (default 1) + --rank-ffn-norm N LORA rank for feed-forward norm tensor (default 1) + --rank-out-norm N LORA rank for output norm tensor (default 1) + --rank-tok-embd N LORA rank for token embeddings tensor (default 4) + --rank-out N LORA rank for output tensor (default 4) + --rank-wq N LORA rank for wq tensor (default 4) + --rank-wk N LORA rank for wk tensor (default 4) + --rank-wv N LORA rank for wv tensor (default 4) + --rank-wo N LORA rank for wo tensor (default 4) + --rank-w1 N LORA rank for w1 tensor (default 4) + --rank-w2 N LORA rank for w2 tensor (default 4) + --rank-w3 N LORA rank for w3 tensor (default 4) +``` + +The LORA rank of 'norm' tensors should always be 1. + +To see all available options use `finetune --help`. diff --git a/examples/finetune/convert-finetune-checkpoint-to-gguf.py b/examples/finetune/convert-finetune-checkpoint-to-gguf.py new file mode 100644 index 000000000..96d6633ed --- /dev/null +++ b/examples/finetune/convert-finetune-checkpoint-to-gguf.py @@ -0,0 +1,489 @@ +#!/usr/bin/env python3 +# finetune checkpoint --> gguf conversion + +import argparse +import gguf +import os +import struct +import sys +import numpy as np +from pathlib import Path + +# gguf constants +LLM_KV_OPTIMIZER_TYPE = "optimizer.type" +LLM_KV_OPTIMIZER_TYPE_ADAM = "adam" +LLM_KV_OPTIMIZER_TYPE_LBFGS = "lbfgs" +LLM_KV_OPTIMIZER_FILE_VERSION = "optimizer.file_version" +LLM_KV_OPTIMIZER_CONVERGENCE_PAST_COUNT = "optimizer.convergence_past_count" +LLM_KV_OPTIMIZER_PARAMETER_COUNT = "optimizer.parameter_count" +LLM_KV_OPTIMIZER_ITERATION_COUNT = "optimizer.iteration_count" +LLM_KV_OPTIMIZER_JUST_INITIALIZED = "optimizer.just_initialized" +LLM_KV_OPTIMIZER_ADAM_BEST_LOSS = "optimizer.adam.best_loss" +LLM_KV_OPTIMIZER_ADAM_PREVIOUS_LOSS = "optimizer.adam.previous_loss" +LLM_KV_OPTIMIZER_ADAM_NO_IMPROVEMENT_COUNT = "optimizer.adam.no_improvement_count" +LLM_KV_OPTIMIZER_LBFGS_APPROX_HESSIAN_COUNT = "optimizer.lbfgs.approx_hessian_count" +LLM_KV_OPTIMIZER_LBFGS_BEST_LOSS = "optimizer.lbfgs.best_loss" +LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_STEP = "optimizer.lbfgs.line_search_step" +LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_J = "optimizer.lbfgs.line_search_j" +LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_K = "optimizer.lbfgs.line_search_k" +LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_END = "optimizer.lbfgs.line_search_end" +LLM_KV_OPTIMIZER_LBFGS_NO_IMPROVEMENT_COUNT = "optimizer.lbfgs.no_improvement_count" + +LLM_TENSOR_OPTIMIZER_ADAM_FIRST_MOMENTS = "optimizer.adam.first_moments" +LLM_TENSOR_OPTIMIZER_ADAM_SECOND_MOMENTS = "optimizer.adam.second_moments" +LLM_TENSOR_OPTIMIZER_ADAM_PAST_LOSS_VALUES = "optimizer.adam.past_loss_values" + +LLM_TENSOR_OPTIMIZER_LBFGS_CURRENT_PARAMETERS = "optimizer.lbfgs.current_parameters" +LLM_TENSOR_OPTIMIZER_LBFGS_PREVIOUS_PARAMETERS = "optimizer.lbfgs.previous_parameters" +LLM_TENSOR_OPTIMIZER_LBFGS_CURRENT_GRADIENTS = "optimizer.lbfgs.current_gradients" +LLM_TENSOR_OPTIMIZER_LBFGS_PREVIOUS_GRADIENTS = "optimizer.lbfgs.previous_gradients" +LLM_TENSOR_OPTIMIZER_LBFGS_SEARCH_DIRECTION = "optimizer.lbfgs.search_direction" +LLM_TENSOR_OPTIMIZER_LBFGS_PAST_LOSS_VALUES = "optimizer.lbfgs.past_loss_values" +LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_ALPHA = "optimizer.lbfgs.memory_alpha" +LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_YS = "optimizer.lbfgs.memory_ys" +LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_S = "optimizer.lbfgs.memory_s" +LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_Y = "optimizer.lbfgs.memory_y" + +LLM_KV_TRAINING_TYPE_TRAIN_MODEL = "train_model" +LLM_KV_TRAINING_TYPE_FINETUNE_LORA = "finetune_lora" +LLM_KV_TRAINING_TYPE = "training.type" +LLM_KV_TRAINING_FILE_VERSION = "training.file_version" +LLM_KV_TRAINING_ITERATION_COUNT = "training.iteration_count" +LLM_KV_TRAINING_SAMPLE_COUNT = "training.sample_count" +LLM_KV_TRAINING_TOKEN_COUNT = "training.token_count" + +LLM_KV_TRAINING_LORA_RANK_TOKEN_EMBD = "training.lora.rank.token_embd" +LLM_KV_TRAINING_LORA_RANK_OUTPUT_NORM = "training.lora.rank.output_norm" +LLM_KV_TRAINING_LORA_RANK_OUTPUT = "training.lora.rank.output" +LLM_KV_TRAINING_LORA_RANK_ATTN_NORM = "training.lora.rank.attn_norm" +LLM_KV_TRAINING_LORA_RANK_ATTN_Q = "training.lora.rank.attn_q" +LLM_KV_TRAINING_LORA_RANK_ATTN_K = "training.lora.rank.attn_k" +LLM_KV_TRAINING_LORA_RANK_ATTN_V = "training.lora.rank.attn_v" +LLM_KV_TRAINING_LORA_RANK_ATTN_OUT = "training.lora.rank.attn_output" +LLM_KV_TRAINING_LORA_RANK_FFN_NORM = "training.lora.rank.ffn_norm" +LLM_KV_TRAINING_LORA_RANK_FFN_GATE = "training.lora.rank.ffn_gate" +LLM_KV_TRAINING_LORA_RANK_FFN_DOWN = "training.lora.rank.ffn_down" +LLM_KV_TRAINING_LORA_RANK_FFN_UP = "training.lora.rank.ffn_up" + +class Tensor: + def __init__(self, dtype='f', ne=None): + if ne is None: + ne = [] + self.dtype = dtype + self.ne = ne + self.nbytes = 0 + if self.dtype == 'f': + if len(self.ne) == 0: + self.nbytes = 0 + else: + self.nbytes = int(np.product(self.ne)) * 4 + else: + raise ValueError(f"Unhandled data type '{self.dtype}'") + + def load(self, data, offset): + nd = struct.unpack(' 0 else []) + + self.lbfgs_x = Tensor('f', [self.nx]) + self.lbfgs_xp = Tensor('f', [self.nx]) + self.lbfgs_g = Tensor('f', [self.nx]) + self.lbfgs_gp = Tensor('f', [self.nx]) + self.lbfgs_d = Tensor('f', [self.nx]) + self.lbfgs_pf = Tensor('f', [self.past] if self.past > 0 else []) + self.lbfgs_lmal = Tensor('f', [self.lbfgs_m]) + self.lbfgs_lmys = Tensor('f', [self.lbfgs_m]) + self.lbfgs_lms = Tensor('f', [self.nx, self.lbfgs_m]) + self.lbfgs_lmy = Tensor('f', [self.nx, self.lbfgs_m]) + + # forgot to save type in version 1: + # guess self.type from number of remaining bytes + size_type_0 = 12 + sum([t.max_storage_size() for t in + [self.adam_m, self.adam_v] + +([self.adam_pf] if (self.past > 0) else [])]) + size_type_1 = 24 + sum([t.max_storage_size() for t in + [self.lbfgs_x, self.lbfgs_xp, self.lbfgs_g, + self.lbfgs_gp, self.lbfgs_d, self.lbfgs_pf, + self.lbfgs_lmal, self.lbfgs_lmys, + self.lbfgs_lms, self.lbfgs_lmy] + +([self.lbfgs_pf] if (self.past > 0) else [])]) + # due to alignment padding the size might not by exact + # but the difference in size for both types is significant, + # so we can just use whichever is closest + remaining = len(data) - offset + if abs(remaining - size_type_0) < abs(remaining - size_type_1): + self.type = 0 + else: + self.type = 1 + + if self.type == 0: + offset = self.adam_m.load(data, offset) + offset = self.adam_v.load(data, offset) + offset = self.adam_pf.load(data,offset) + + self.adam_fx_best = struct.unpack(' 0: + self.adam_pf.save_gguf(gguf_writer, name=LLM_TENSOR_OPTIMIZER_ADAM_PAST_LOSS_VALUES) + + elif self.type == 1: + gguf_writer.add_string(LLM_KV_OPTIMIZER_TYPE, LLM_KV_OPTIMIZER_TYPE_LBFGS) + gguf_writer.add_uint32(LLM_KV_OPTIMIZER_LBFGS_APPROX_HESSIAN_COUNT, self.lbfgs_m) + gguf_writer.add_float32(LLM_KV_OPTIMIZER_LBFGS_BEST_LOSS, self.lbfgs_fx_best) + gguf_writer.add_float32(LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_STEP, self.lbfgs_step) + gguf_writer.add_int32(LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_J, self.lbfgs_j) + gguf_writer.add_int32(LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_K, self.lbfgs_k) + gguf_writer.add_int32(LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_END, self.lbfgs_end) + gguf_writer.add_uint32(LLM_KV_OPTIMIZER_LBFGS_NO_IMPROVEMENT_COUNT, self.lbfgs_n_no_improvement) + + self.lbfgs_x.save_gguf(gguf_writer, name=LLM_TENSOR_OPTIMIZER_LBFGS_CURRENT_PARAMETERS) + self.lbfgs_xp.save_gguf(gguf_writer, name=LLM_TENSOR_OPTIMIZER_LBFGS_PREVIOUS_PARAMETERS) + self.lbfgs_g.save_gguf(gguf_writer, name=LLM_TENSOR_OPTIMIZER_LBFGS_CURRENT_GRADIENTS) + self.lbfgs_gp.save_gguf(gguf_writer, name=LLM_TENSOR_OPTIMIZER_LBFGS_PREVIOUS_GRADIENTS) + self.lbfgs_d.save_gguf(gguf_writer, name=LLM_TENSOR_OPTIMIZER_LBFGS_SEARCH_DIRECTION) + if self.past > 0: + self.lbfgs_pf.save_gguf(gguf_writer, name=LLM_TENSOR_OPTIMIZER_LBFGS_PAST_LOSS_VALUES) + self.lbfgs_lmal.save_gguf(gguf_writer, name=LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_ALPHA) + self.lbfgs_lmys.save_gguf(gguf_writer, name=LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_YS) + self.lbfgs_lms.save_gguf(gguf_writer, name=LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_S) + self.lbfgs_lmy.save_gguf(gguf_writer, name=LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_Y) + else: + raise ValueError('Unknown optimizer type') + +class LoraParams: + def __init__(self): + pass + + def load(self, data, offset): + self.n_rank_attention_norm = struct.unpack(' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(_MSC_VER) +#pragma warning(disable: 4244 4267) // possible loss of data +#endif + +static const size_t tensor_alignment = 32; + +struct my_llama_hparams { + uint32_t n_vocab = 32000; + uint32_t n_ctx = 512; + uint32_t n_embd = 4096; + uint32_t n_ff = 11008; + uint32_t n_head = 32; + uint32_t n_head_kv = 32; + uint32_t n_layer = 32; + + // float f_norm_eps = 1e-5f; // falcon + float f_norm_rms_eps = 1e-5f; // llama + + float rope_freq_base = 10000.0f; + float rope_freq_scale = 1.0f; + + uint32_t n_gqa() const { + return n_head/n_head_kv; + } + + uint32_t n_embd_head() const { + return n_embd/n_head; + } + + uint32_t n_embd_gqa() const { + return n_embd/n_gqa(); + } + + bool operator!=(const my_llama_hparams& other) const { + return memcmp(this, &other, sizeof(other)); + } +}; + +struct my_llama_layer { + // normalization + struct ggml_tensor * attention_norm; + + // attention + struct ggml_tensor * wq; + struct ggml_tensor * wk; + struct ggml_tensor * wv; + struct ggml_tensor * wo; + + // normalization + struct ggml_tensor * ffn_norm; + + // ff + struct ggml_tensor * w1; + struct ggml_tensor * w2; + struct ggml_tensor * w3; +}; + +struct my_llama_model { + struct my_llama_hparams hparams; + + struct ggml_tensor * tok_embeddings; + + struct ggml_tensor * norm; + struct ggml_tensor * output; + + std::vector layers; +}; + +struct my_llama_lora_hparams { + uint32_t lora_r = 1; + uint32_t lora_alpha = 1; + uint32_t n_rank_attention_norm = 1; + uint32_t n_rank_wq = 4; + uint32_t n_rank_wk = 4; + uint32_t n_rank_wv = 4; + uint32_t n_rank_wo = 4; + uint32_t n_rank_ffn_norm = 1; + uint32_t n_rank_w1 = 4; + uint32_t n_rank_w2 = 4; + uint32_t n_rank_w3 = 4; + uint32_t n_rank_tok_embeddings = 4; + uint32_t n_rank_norm = 1; + uint32_t n_rank_output = 4; + + bool operator!=(const my_llama_lora_hparams& other) const { + return memcmp(this, &other, sizeof(other)); + } +}; + +struct my_llama_lora_layer { + // normalization + struct ggml_tensor * attention_norm_a; + struct ggml_tensor * attention_norm_b; + + // attention + struct ggml_tensor * wq_a; + struct ggml_tensor * wq_b; + struct ggml_tensor * wk_a; + struct ggml_tensor * wk_b; + struct ggml_tensor * wv_a; + struct ggml_tensor * wv_b; + struct ggml_tensor * wo_a; + struct ggml_tensor * wo_b; + + // normalization + struct ggml_tensor * ffn_norm_a; + struct ggml_tensor * ffn_norm_b; + + // ff + struct ggml_tensor * w1_a; + struct ggml_tensor * w1_b; + struct ggml_tensor * w2_a; + struct ggml_tensor * w2_b; + struct ggml_tensor * w3_a; + struct ggml_tensor * w3_b; +}; + +struct my_llama_lora { + struct ggml_context * ctx = NULL; + std::vector data; + + my_llama_lora_hparams hparams; + + struct ggml_tensor * tok_embeddings_a; + struct ggml_tensor * tok_embeddings_b; + + struct ggml_tensor * norm_a; + struct ggml_tensor * norm_b; + struct ggml_tensor * output_a; + struct ggml_tensor * output_b; + + std::vector layers; +}; + +// gguf constants +static const char * LLM_KV_TRAINING_TYPE_FINETUNE_LORA = "finetune_lora"; +static const char * LLM_KV_TRAINING_TYPE = "training.type"; + +static const char * LLM_KV_TRAINING_LORA_RANK_TOKEN_EMBD = "training.lora.rank.token_embd"; +static const char * LLM_KV_TRAINING_LORA_RANK_OUTPUT_NORM = "training.lora.rank.output_norm"; +static const char * LLM_KV_TRAINING_LORA_RANK_OUTPUT = "training.lora.rank.output"; +static const char * LLM_KV_TRAINING_LORA_RANK_ATTN_NORM = "training.lora.rank.attn_norm"; +static const char * LLM_KV_TRAINING_LORA_RANK_ATTN_Q = "training.lora.rank.attn_q"; +static const char * LLM_KV_TRAINING_LORA_RANK_ATTN_K = "training.lora.rank.attn_k"; +static const char * LLM_KV_TRAINING_LORA_RANK_ATTN_V = "training.lora.rank.attn_v"; +static const char * LLM_KV_TRAINING_LORA_RANK_ATTN_OUT = "training.lora.rank.attn_output"; +static const char * LLM_KV_TRAINING_LORA_RANK_FFN_NORM = "training.lora.rank.ffn_norm"; +static const char * LLM_KV_TRAINING_LORA_RANK_FFN_GATE = "training.lora.rank.ffn_gate"; +static const char * LLM_KV_TRAINING_LORA_RANK_FFN_DOWN = "training.lora.rank.ffn_down"; +static const char * LLM_KV_TRAINING_LORA_RANK_FFN_UP = "training.lora.rank.ffn_up"; + +// gguf constants (sync with gguf.py) + +static const char * LLM_KV_GENERAL_ARCHITECTURE = "general.architecture"; +static const char * LLM_KV_GENERAL_FILE_TYPE = "general.file_type"; + +static const char * LLM_KV_CONTEXT_LENGTH = "%s.context_length"; +static const char * LLM_KV_EMBEDDING_LENGTH = "%s.embedding_length"; +static const char * LLM_KV_BLOCK_COUNT = "%s.block_count"; +static const char * LLM_KV_FEED_FORWARD_LENGTH = "%s.feed_forward_length"; +static const char * LLM_KV_ATTENTION_HEAD_COUNT = "%s.attention.head_count"; +static const char * LLM_KV_ATTENTION_HEAD_COUNT_KV = "%s.attention.head_count_kv"; +static const char * LLM_KV_ATTENTION_LAYERNORM_RMS_EPS = "%s.attention.layer_norm_rms_epsilon"; +static const char * LLM_KV_ROPE_DIMENSION_COUNT = "%s.rope.dimension_count"; +static const char * LLM_KV_ROPE_FREQ_BASE = "%s.rope.freq_base"; // TODO load in llama.cpp +static const char * LLM_KV_ROPE_SCALE_LINEAR = "%s.rope.scale_linear"; + +static const char * LLM_TENSOR_TOKEN_EMBD = "token_embd"; +static const char * LLM_TENSOR_OUTPUT_NORM = "output_norm"; +static const char * LLM_TENSOR_OUTPUT = "output"; +static const char * LLM_TENSOR_ATTN_NORM = "blk.%d.attn_norm"; +static const char * LLM_TENSOR_ATTN_Q = "blk.%d.attn_q"; +static const char * LLM_TENSOR_ATTN_K = "blk.%d.attn_k"; +static const char * LLM_TENSOR_ATTN_V = "blk.%d.attn_v"; +static const char * LLM_TENSOR_ATTN_OUT = "blk.%d.attn_output"; +static const char * LLM_TENSOR_FFN_NORM = "blk.%d.ffn_norm"; +static const char * LLM_TENSOR_FFN_GATE = "blk.%d.ffn_gate"; +static const char * LLM_TENSOR_FFN_DOWN = "blk.%d.ffn_down"; +static const char * LLM_TENSOR_FFN_UP = "blk.%d.ffn_up"; + +static void print_params(struct my_llama_hparams * params) { + printf("%s: n_vocab: %u\n", __func__, params->n_vocab); + printf("%s: n_ctx: %u\n", __func__, params->n_ctx); + printf("%s: n_embd: %u\n", __func__, params->n_embd); + printf("%s: n_ff: %u\n", __func__, params->n_ff); + printf("%s: n_head: %u\n", __func__, params->n_head); + printf("%s: n_head_kv: %u\n", __func__, params->n_head_kv); + printf("%s: n_layer: %u\n", __func__, params->n_layer); + printf("%s: norm_rms_eps : %f\n", __func__, params->f_norm_rms_eps); + printf("%s: rope_freq_base : %f\n", __func__, params->rope_freq_base); + printf("%s: rope_freq_scale : %f\n", __func__, params->rope_freq_scale); +} + +static void print_lora_params(struct my_llama_lora_hparams * params) { + printf("%s: n_rank_attention_norm : %u\n", __func__, params->n_rank_attention_norm); + printf("%s: n_rank_wq : %u\n", __func__, params->n_rank_wq); + printf("%s: n_rank_wk : %u\n", __func__, params->n_rank_wk); + printf("%s: n_rank_wv : %u\n", __func__, params->n_rank_wv); + printf("%s: n_rank_wo : %u\n", __func__, params->n_rank_wo); + printf("%s: n_rank_ffn_norm : %u\n", __func__, params->n_rank_ffn_norm); + printf("%s: n_rank_w1 : %u\n", __func__, params->n_rank_w1); + printf("%s: n_rank_w2 : %u\n", __func__, params->n_rank_w2); + printf("%s: n_rank_w3 : %u\n", __func__, params->n_rank_w3); + printf("%s: n_rank_tok_embeddings : %u\n", __func__, params->n_rank_tok_embeddings); + printf("%s: n_rank_norm : %u\n", __func__, params->n_rank_norm); + printf("%s: n_rank_output : %u\n", __func__, params->n_rank_output); +} + +#define GGUF_GET_KEY(ctx, dst, func, type, req, key) \ +{ \ + const std::string skey(key); \ + const int kid = gguf_find_key(ctx, skey.c_str()); \ + if (kid >= 0) { \ + enum gguf_type ktype = gguf_get_kv_type(ctx, kid); \ + if (ktype != (type)) { \ + die_fmt("key %s has wrong type: %s", skey.c_str(), gguf_type_name(ktype)); \ + } \ + (dst) = func(ctx, kid); \ + } else if (req) { \ + die_fmt("key not found in model: %s", skey.c_str()); \ + } \ +} + +static void load_model_hparams_gguf(struct gguf_context * ctx, struct my_llama_hparams * hparams, const char * expected_arch) { + std::string arch; + + GGUF_GET_KEY(ctx, arch, gguf_get_val_str, GGUF_TYPE_STRING, true, LLM_KV_GENERAL_ARCHITECTURE); + if (expected_arch != NULL) { + if (arch != expected_arch) { + printf("%s: arch=%s expected_arch=%s\n", __func__, arch.c_str(), expected_arch); + } + GGML_ASSERT(arch == expected_arch); + } + + std::vector keybuf; + keybuf.resize(512); + auto kv = [&arch, &keybuf](const char * key) -> const char * { + snprintf(keybuf.data(), keybuf.size(), key, arch.c_str()); + return keybuf.data(); + }; + + GGUF_GET_KEY(ctx, hparams->n_embd, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_EMBEDDING_LENGTH)); + GGUF_GET_KEY(ctx, hparams->n_ctx, gguf_get_val_u32, GGUF_TYPE_UINT32, false, kv(LLM_KV_CONTEXT_LENGTH)); + GGUF_GET_KEY(ctx, hparams->n_ff, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_FEED_FORWARD_LENGTH)); + GGUF_GET_KEY(ctx, hparams->n_head, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_ATTENTION_HEAD_COUNT)); + GGUF_GET_KEY(ctx, hparams->n_layer, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_BLOCK_COUNT)); + + // n_head_kv is optional, default to n_head + hparams->n_head_kv = hparams->n_head; + GGUF_GET_KEY(ctx, hparams->n_head_kv, gguf_get_val_u32, GGUF_TYPE_UINT32, false, kv(LLM_KV_ATTENTION_HEAD_COUNT_KV)); + + float rope_freq_scale = 1.0f; + GGUF_GET_KEY(ctx, hparams->f_norm_rms_eps, gguf_get_val_f32, GGUF_TYPE_FLOAT32, false, kv(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS)); + GGUF_GET_KEY(ctx, hparams->rope_freq_base, gguf_get_val_f32, GGUF_TYPE_FLOAT32, false, kv(LLM_KV_ROPE_FREQ_BASE)); + GGUF_GET_KEY(ctx, rope_freq_scale, gguf_get_val_f32, GGUF_TYPE_FLOAT32, false, kv(LLM_KV_ROPE_SCALE_LINEAR)); + if (rope_freq_scale != 1.0f) { + hparams->rope_freq_scale = 1.0f / rope_freq_scale; + } +} + +static void init_model(struct llama_model * input, struct my_llama_model * model, const char * fn_model, uint32_t n_ctx) { + auto & hparams = model->hparams; + + std::vector tn_buf; + tn_buf.resize(GGML_MAX_NAME); + auto tn = [&tn_buf](const char * key) -> const char * { + snprintf(tn_buf.data(), tn_buf.size(), "%s.weight", key); + return tn_buf.data(); + }; + auto tni = [&tn_buf](const char * key, int bid) -> const char * { + snprintf(tn_buf.data(), tn_buf.size(), key, bid); + std::string s = tn_buf.data(); + snprintf(tn_buf.data(), tn_buf.size(), "%s.weight", s.c_str()); + return tn_buf.data(); + }; + + + // get parameters directly from gguf file + { + struct gguf_init_params params = { + /*.no_alloc = */ false, + /*.ctx = */ NULL, + }; + struct gguf_context * mctx = gguf_init_from_file(fn_model, params); + + load_model_hparams_gguf(mctx, &hparams, "llama"); + + gguf_free(mctx); + } + hparams.n_vocab = llama_model_n_vocab(input); + hparams.n_ctx = n_ctx; + + // get tensors from llama_model (possibly mmapped) + model->tok_embeddings = llama_get_model_tensor(input, tn(LLM_TENSOR_TOKEN_EMBD)); + model->norm = llama_get_model_tensor(input, tn(LLM_TENSOR_OUTPUT_NORM)); + model->output = llama_get_model_tensor(input, tn(LLM_TENSOR_OUTPUT)); + + assert_shape_2d(model->tok_embeddings, hparams.n_embd, hparams.n_vocab); + assert_shape_1d(model->norm, hparams.n_embd); + assert_shape_2d(model->output, hparams.n_embd, hparams.n_vocab); + + model->layers.resize(hparams.n_layer); + for (uint32_t i = 0; i < hparams.n_layer; ++i) { + auto & layer = model->layers[i]; + + layer.attention_norm = llama_get_model_tensor(input, tni(LLM_TENSOR_ATTN_NORM, i)); + layer.wq = llama_get_model_tensor(input, tni(LLM_TENSOR_ATTN_Q, i)); + layer.wk = llama_get_model_tensor(input, tni(LLM_TENSOR_ATTN_K, i)); + layer.wv = llama_get_model_tensor(input, tni(LLM_TENSOR_ATTN_V, i)); + layer.wo = llama_get_model_tensor(input, tni(LLM_TENSOR_ATTN_OUT, i)); + layer.ffn_norm = llama_get_model_tensor(input, tni(LLM_TENSOR_FFN_NORM, i)); + layer.w1 = llama_get_model_tensor(input, tni(LLM_TENSOR_FFN_GATE, i)); + layer.w2 = llama_get_model_tensor(input, tni(LLM_TENSOR_FFN_DOWN, i)); + layer.w3 = llama_get_model_tensor(input, tni(LLM_TENSOR_FFN_UP, i)); + + assert_shape_1d(layer.attention_norm, hparams.n_embd); + assert_shape_2d(layer.wq, hparams.n_embd, hparams.n_embd); + assert_shape_2d(layer.wk, hparams.n_embd, hparams.n_embd); + assert_shape_2d(layer.wv, hparams.n_embd, hparams.n_embd); + assert_shape_2d(layer.wo, hparams.n_embd, hparams.n_embd); + assert_shape_1d(layer.ffn_norm, hparams.n_embd); + assert_shape_2d(layer.w1, hparams.n_embd, hparams.n_ff); + assert_shape_2d(layer.w2, hparams.n_ff, hparams.n_embd); + assert_shape_2d(layer.w3, hparams.n_embd, hparams.n_ff); + } +} + +static void set_param_lora(struct my_llama_lora * lora) { + const uint32_t n_layer = lora->layers.size(); + + struct ggml_context* ctx = lora->ctx; + + ggml_set_param(ctx, lora->tok_embeddings_a); + ggml_set_param(ctx, lora->tok_embeddings_b); + ggml_set_param(ctx, lora->norm_a); + ggml_set_param(ctx, lora->norm_b); + ggml_set_param(ctx, lora->output_a); + ggml_set_param(ctx, lora->output_b); + + for (uint32_t i = 0; i < n_layer; ++i) { + auto & layer = lora->layers[i]; + + ggml_set_param(ctx, layer.attention_norm_a); + ggml_set_param(ctx, layer.attention_norm_b); + ggml_set_param(ctx, layer.wq_a); + ggml_set_param(ctx, layer.wq_b); + ggml_set_param(ctx, layer.wk_a); + ggml_set_param(ctx, layer.wk_b); + ggml_set_param(ctx, layer.wv_a); + ggml_set_param(ctx, layer.wv_b); + ggml_set_param(ctx, layer.wo_a); + ggml_set_param(ctx, layer.wo_b); + ggml_set_param(ctx, layer.ffn_norm_a); + ggml_set_param(ctx, layer.ffn_norm_b); + ggml_set_param(ctx, layer.w1_a); + ggml_set_param(ctx, layer.w1_b); + ggml_set_param(ctx, layer.w2_a); + ggml_set_param(ctx, layer.w2_b); + ggml_set_param(ctx, layer.w3_a); + ggml_set_param(ctx, layer.w3_b); + } +} + +static void alloc_lora(struct ggml_allocr * alloc, struct my_llama_lora * lora) { + ggml_allocr_alloc(alloc, lora->tok_embeddings_a); + ggml_allocr_alloc(alloc, lora->tok_embeddings_b); + ggml_allocr_alloc(alloc, lora->norm_a); + ggml_allocr_alloc(alloc, lora->norm_b); + ggml_allocr_alloc(alloc, lora->output_a); + ggml_allocr_alloc(alloc, lora->output_b); + for (uint32_t i = 0; i < lora->layers.size(); ++i) { + auto & layer = lora->layers[i]; + ggml_allocr_alloc(alloc, layer.attention_norm_a); + ggml_allocr_alloc(alloc, layer.attention_norm_b); + ggml_allocr_alloc(alloc, layer.wq_a); + ggml_allocr_alloc(alloc, layer.wq_b); + ggml_allocr_alloc(alloc, layer.wk_a); + ggml_allocr_alloc(alloc, layer.wk_b); + ggml_allocr_alloc(alloc, layer.wv_a); + ggml_allocr_alloc(alloc, layer.wv_b); + ggml_allocr_alloc(alloc, layer.wo_a); + ggml_allocr_alloc(alloc, layer.wo_b); + ggml_allocr_alloc(alloc, layer.ffn_norm_a); + ggml_allocr_alloc(alloc, layer.ffn_norm_b); + ggml_allocr_alloc(alloc, layer.w1_a); + ggml_allocr_alloc(alloc, layer.w1_b); + ggml_allocr_alloc(alloc, layer.w2_a); + ggml_allocr_alloc(alloc, layer.w2_b); + ggml_allocr_alloc(alloc, layer.w3_a); + ggml_allocr_alloc(alloc, layer.w3_b); + } + ggml_allocr_alloc(alloc, lora->tok_embeddings_a->grad); + ggml_allocr_alloc(alloc, lora->tok_embeddings_b->grad); + ggml_allocr_alloc(alloc, lora->norm_a->grad); + ggml_allocr_alloc(alloc, lora->norm_b->grad); + ggml_allocr_alloc(alloc, lora->output_a->grad); + ggml_allocr_alloc(alloc, lora->output_b->grad); + for (uint32_t i = 0; i < lora->layers.size(); ++i) { + auto & layer = lora->layers[i]; + ggml_allocr_alloc(alloc, layer.attention_norm_a->grad); + ggml_allocr_alloc(alloc, layer.attention_norm_b->grad); + ggml_allocr_alloc(alloc, layer.wq_a->grad); + ggml_allocr_alloc(alloc, layer.wq_b->grad); + ggml_allocr_alloc(alloc, layer.wk_a->grad); + ggml_allocr_alloc(alloc, layer.wk_b->grad); + ggml_allocr_alloc(alloc, layer.wv_a->grad); + ggml_allocr_alloc(alloc, layer.wv_b->grad); + ggml_allocr_alloc(alloc, layer.wo_a->grad); + ggml_allocr_alloc(alloc, layer.wo_b->grad); + ggml_allocr_alloc(alloc, layer.ffn_norm_a->grad); + ggml_allocr_alloc(alloc, layer.ffn_norm_b->grad); + ggml_allocr_alloc(alloc, layer.w1_a->grad); + ggml_allocr_alloc(alloc, layer.w1_b->grad); + ggml_allocr_alloc(alloc, layer.w2_a->grad); + ggml_allocr_alloc(alloc, layer.w2_b->grad); + ggml_allocr_alloc(alloc, layer.w3_a->grad); + ggml_allocr_alloc(alloc, layer.w3_b->grad); + } +} + +static void init_lora(const struct my_llama_model * model, struct my_llama_lora * lora) { + const auto & lparams = lora->hparams; + + const uint32_t n_embd = model->hparams.n_embd; + const uint32_t n_embd_gqa = model->hparams.n_embd_gqa(); + const uint32_t n_layer = model->hparams.n_layer; + const uint32_t n_vocab = model->hparams.n_vocab; + const uint32_t n_ff = model->hparams.n_ff; + + std::vector tn_buf; + tn_buf.resize(GGML_MAX_NAME); + auto tn = [&tn_buf](const char * key, const char * suffix) -> const char * { + snprintf(tn_buf.data(), tn_buf.size(), "%s%s", key, suffix); + return tn_buf.data(); + }; + auto tni = [&tn_buf](const char * key, const char * suffix, int bid) -> const char * { + snprintf(tn_buf.data(), tn_buf.size(), key, bid); + std::string s = tn_buf.data(); + snprintf(tn_buf.data(), tn_buf.size(), "%s%s", s.c_str(), suffix); + return tn_buf.data(); + }; + + // context for lora tensors without their data + struct ggml_init_params ctx_lora_params; + ctx_lora_params.mem_size = ggml_tensor_overhead()*2*(6 + n_layer*18); + ctx_lora_params.mem_buffer = NULL; + ctx_lora_params.no_alloc = true; + + struct ggml_context * ctx = ggml_init(ctx_lora_params); + lora->ctx = ctx; + + lora->tok_embeddings_a = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_tok_embeddings, n_embd); + lora->tok_embeddings_b = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_tok_embeddings, n_vocab); + lora->norm_a = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_norm, n_embd); + lora->norm_b = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_norm, 1); + lora->output_a = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_output, n_embd); + lora->output_b = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_output, n_vocab); + + ggml_set_name(lora->tok_embeddings_a, tn(LLM_TENSOR_TOKEN_EMBD, ".weight.lora_a")); + ggml_set_name(lora->tok_embeddings_b, tn(LLM_TENSOR_TOKEN_EMBD, ".weight.lora_b")); + ggml_set_name(lora->norm_a, tn(LLM_TENSOR_OUTPUT_NORM, ".weight.lora_a")); + ggml_set_name(lora->norm_b, tn(LLM_TENSOR_OUTPUT_NORM, ".weight.lora_b")); + ggml_set_name(lora->output_a, tn(LLM_TENSOR_OUTPUT, ".weight.lora_a")); + ggml_set_name(lora->output_b, tn(LLM_TENSOR_OUTPUT, ".weight.lora_b")); + + lora->layers.resize(n_layer); + for (uint32_t i = 0; i < n_layer; ++i) { + auto & layer = lora->layers[i]; + + layer.attention_norm_a = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_attention_norm, n_embd); + layer.attention_norm_b = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_attention_norm, 1); + + layer.wq_a = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_wq, n_embd); + layer.wq_b = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_wq, n_embd); + layer.wk_a = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_wk, n_embd); + layer.wk_b = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_wk, n_embd_gqa); + layer.wv_a = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_wv, n_embd); + layer.wv_b = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_wv, n_embd_gqa); + layer.wo_a = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_wo, n_embd); + layer.wo_b = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_wo, n_embd); + + layer.ffn_norm_a = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_ffn_norm, n_embd); + layer.ffn_norm_b = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_ffn_norm, 1); + + layer.w1_a = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_w1, n_embd); + layer.w1_b = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_w1, n_ff); + layer.w2_a = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_w2, n_ff); + layer.w2_b = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_w2, n_embd); + layer.w3_a = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_w3, n_embd); + layer.w3_b = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, lparams.n_rank_w3, n_ff); + + ggml_set_name(layer.attention_norm_a, tni(LLM_TENSOR_ATTN_NORM, ".weight.lora_a", i)); + ggml_set_name(layer.attention_norm_b, tni(LLM_TENSOR_ATTN_NORM, ".weight.lora_b", i)); + ggml_set_name(layer.wq_a, tni(LLM_TENSOR_ATTN_Q, ".weight.lora_a", i)); + ggml_set_name(layer.wq_b, tni(LLM_TENSOR_ATTN_Q, ".weight.lora_b", i)); + ggml_set_name(layer.wk_a, tni(LLM_TENSOR_ATTN_K, ".weight.lora_a", i)); + ggml_set_name(layer.wk_b, tni(LLM_TENSOR_ATTN_K, ".weight.lora_b", i)); + ggml_set_name(layer.wv_a, tni(LLM_TENSOR_ATTN_V, ".weight.lora_a", i)); + ggml_set_name(layer.wv_b, tni(LLM_TENSOR_ATTN_V, ".weight.lora_b", i)); + ggml_set_name(layer.wo_a, tni(LLM_TENSOR_ATTN_OUT, ".weight.lora_a", i)); + ggml_set_name(layer.wo_b, tni(LLM_TENSOR_ATTN_OUT, ".weight.lora_b", i)); + ggml_set_name(layer.ffn_norm_a, tni(LLM_TENSOR_FFN_NORM, ".weight.lora_a", i)); + ggml_set_name(layer.ffn_norm_b, tni(LLM_TENSOR_FFN_NORM, ".weight.lora_b", i)); + ggml_set_name(layer.w1_a, tni(LLM_TENSOR_FFN_GATE, ".weight.lora_a", i)); + ggml_set_name(layer.w1_b, tni(LLM_TENSOR_FFN_GATE, ".weight.lora_b", i)); + ggml_set_name(layer.w2_a, tni(LLM_TENSOR_FFN_DOWN, ".weight.lora_a", i)); + ggml_set_name(layer.w2_b, tni(LLM_TENSOR_FFN_DOWN, ".weight.lora_b", i)); + ggml_set_name(layer.w3_a, tni(LLM_TENSOR_FFN_UP, ".weight.lora_a", i)); + ggml_set_name(layer.w3_b, tni(LLM_TENSOR_FFN_UP, ".weight.lora_b", i)); + } + + set_param_lora(lora); + + // measure data size + struct ggml_allocr * alloc = NULL; + alloc = ggml_allocr_new_measure(tensor_alignment); + alloc_lora(alloc, lora); + + // allocate data + lora->data.resize(ggml_allocr_max_size(alloc) + tensor_alignment); + ggml_allocr_free(alloc); + alloc = ggml_allocr_new(lora->data.data(), lora->data.size(), tensor_alignment); + alloc_lora(alloc, lora); + ggml_allocr_free(alloc); +} + +static void randomize_lora(struct my_llama_lora * lora, int seed, float mean, float std, float min, float max) { + const uint32_t n_layer = lora->layers.size(); + + struct random_normal_distribution * rnd = init_random_normal_distribution(seed, mean, std, min, max); + + randomize_tensor_normal(lora->tok_embeddings_a, rnd); + randomize_tensor_normal(lora->tok_embeddings_b, rnd); + randomize_tensor_normal(lora->norm_a, rnd); + randomize_tensor_normal(lora->norm_b, rnd); + randomize_tensor_normal(lora->output_a, rnd); + randomize_tensor_normal(lora->output_b, rnd); + + for (uint32_t i = 0; i < n_layer; ++i) { + auto & layer = lora->layers[i]; + randomize_tensor_normal(layer.attention_norm_a, rnd); + randomize_tensor_normal(layer.attention_norm_b, rnd); + + randomize_tensor_normal(layer.wq_a, rnd); + randomize_tensor_normal(layer.wq_b, rnd); + randomize_tensor_normal(layer.wk_a, rnd); + randomize_tensor_normal(layer.wk_b, rnd); + randomize_tensor_normal(layer.wv_a, rnd); + randomize_tensor_normal(layer.wv_b, rnd); + randomize_tensor_normal(layer.wo_a, rnd); + randomize_tensor_normal(layer.wo_b, rnd); + + randomize_tensor_normal(layer.ffn_norm_a, rnd); + randomize_tensor_normal(layer.ffn_norm_b, rnd); + + randomize_tensor_normal(layer.w1_a, rnd); + randomize_tensor_normal(layer.w1_b, rnd); + randomize_tensor_normal(layer.w2_a, rnd); + randomize_tensor_normal(layer.w2_b, rnd); + randomize_tensor_normal(layer.w3_a, rnd); + randomize_tensor_normal(layer.w3_b, rnd); + } + + free_random_normal_distribution(rnd); +} + +static struct ggml_tensor * llama_build_lora_finetune_graphs( + struct my_llama_model * model, + struct my_llama_lora * lora, + struct ggml_allocr * alloc, + struct ggml_context * ctx, + struct ggml_cgraph * gf, + struct ggml_cgraph * gb, + struct ggml_cgraph * gb_tmp, + struct ggml_tensor * * logits, + struct ggml_tensor * tokens_input, + struct ggml_tensor * targets, + const int n_tokens, + const int n_batch, + const bool enable_flash_attn, + const bool enable_checkpointing) { + + ggml_set_scratch(ctx, { 0, 0, nullptr, }); + const int n_past = 0; + const int N = n_tokens; + const auto & hparams = model->hparams; + const int n_ctx = hparams.n_ctx; + const int n_vocab = hparams.n_vocab; + const int n_embd = hparams.n_embd; + const int n_layer = hparams.n_layer; + const int n_head = hparams.n_head; + const int n_head_kv = hparams.n_head_kv; + const int n_ff = hparams.n_ff; + const int n_rot = hparams.n_embd_head(); + const int n_embd_head = hparams.n_embd_head(); + const int n_embd_gqa = hparams.n_embd_gqa(); + const float rms_norm_eps = hparams.f_norm_rms_eps; + const float rope_freq_base = hparams.rope_freq_base; + const float rope_freq_scale = hparams.rope_freq_scale; + + GGML_ASSERT((size_t) n_layer == lora->layers.size()); + + auto set_name = [](struct ggml_tensor * t, const char * n) { + ggml_set_name(t, n); + if (t->grad) { + ggml_format_name(t->grad, "%s->grad", n); + } + }; + + // KQ_pos - contains the positions + struct ggml_tensor * KQ_pos = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, N); + { + int * data = (int *) KQ_pos->data; + for (int i = 0; i < N; ++i) { + data[i] = n_past + i; + } + } + + // rope has so much parameters that we make a custom function for it + auto rope = [ctx, KQ_pos, n_rot, n_ctx, rope_freq_base, rope_freq_scale] + (struct ggml_tensor * t) -> struct ggml_tensor * { + // not capturing these, to silcence warnings + const int rope_mode = 0; + + return ggml_rope_custom(ctx, + t, KQ_pos, n_rot, rope_mode, n_ctx, + rope_freq_base, rope_freq_scale); + }; + + set_name(tokens_input, "tokens_input"); + set_name(targets, "targets"); + + GGML_ASSERT(tokens_input->type == GGML_TYPE_I32); + + auto add_to_f32 = [] (struct ggml_context * ctx, struct ggml_tensor * a, struct ggml_tensor * b) { + if (ggml_is_quantized(a->type)) { + return ggml_add_cast(ctx, a, b, GGML_TYPE_F32); + } else if (a->type == GGML_TYPE_F32) { + return ggml_add(ctx, a, b); + } else { + die_fmt("%s: Finetuning on tensors with type '%s' is not yet supported.\n", + __func__, ggml_type_name(a->type)); + } + }; + + struct ggml_tensor * tok_embeddings = add_to_f32(ctx, model->tok_embeddings, ggml_mul_mat(ctx, lora->tok_embeddings_a, lora->tok_embeddings_b)); + struct ggml_tensor * norm = add_to_f32(ctx, model->norm, ggml_mul_mat(ctx, lora->norm_a, lora->norm_b)); + struct ggml_tensor * output = add_to_f32(ctx, model->output, ggml_mul_mat(ctx, lora->output_a, lora->output_b)); + + struct ggml_tensor * t00 = ggml_reshape_1d(ctx, tokens_input, N*n_batch); set_name(t00, "t00"); assert_shape_1d(t00, N*n_batch); + struct ggml_tensor * t01 = ggml_get_rows(ctx, tok_embeddings, t00); set_name(t01, "t01"); assert_shape_2d(t01, n_embd, N*n_batch); + + struct ggml_tensor * cur = t01; + + std::vector checkpoints; + if (enable_checkpointing) { + checkpoints.push_back(tokens_input); + checkpoints.push_back(targets); + checkpoints.push_back(t00); + checkpoints.push_back(t01); + } + + struct ggml_tensor * kv_scale = NULL; + if (!enable_flash_attn) { + kv_scale = ggml_new_f32(ctx, 1.0f/sqrtf(float(n_embd)/n_head)); + } + + for (int il = 0; il < n_layer; ++il) { + struct my_llama_layer & layer = model->layers[il]; + struct my_llama_lora_layer & llayer = lora->layers[il]; + + struct ggml_tensor * attention_norm = add_to_f32(ctx, layer.attention_norm, ggml_mul_mat(ctx, llayer.attention_norm_a, llayer.attention_norm_b)); + struct ggml_tensor * ffn_norm = add_to_f32(ctx, layer.ffn_norm, ggml_mul_mat(ctx, llayer.ffn_norm_a, llayer.ffn_norm_b)); + struct ggml_tensor * wq = add_to_f32(ctx, layer.wq, ggml_mul_mat(ctx, llayer.wq_a, llayer.wq_b)); + struct ggml_tensor * wk = add_to_f32(ctx, layer.wk, ggml_mul_mat(ctx, llayer.wk_a, llayer.wk_b)); + struct ggml_tensor * wv = add_to_f32(ctx, layer.wv, ggml_mul_mat(ctx, llayer.wv_a, llayer.wv_b)); + struct ggml_tensor * wo = add_to_f32(ctx, layer.wo, ggml_mul_mat(ctx, llayer.wo_a, llayer.wo_b)); + struct ggml_tensor * w1 = add_to_f32(ctx, layer.w1, ggml_mul_mat(ctx, llayer.w1_a, llayer.w1_b)); + struct ggml_tensor * w2 = add_to_f32(ctx, layer.w2, ggml_mul_mat(ctx, llayer.w2_a, llayer.w2_b)); + struct ggml_tensor * w3 = add_to_f32(ctx, layer.w3, ggml_mul_mat(ctx, llayer.w3_a, llayer.w3_b)); + + struct ggml_tensor * t02 = ggml_rms_norm (ctx, cur, rms_norm_eps); set_name(t02, "t02"); assert_shape_2d(t02, n_embd, N*n_batch); + struct ggml_tensor * t03 = ggml_repeat (ctx, attention_norm, t02); set_name(t03, "t03"); assert_shape_2d(t03, n_embd, N*n_batch); + struct ggml_tensor * t04 = ggml_mul (ctx, t03, t02); set_name(t04, "t04"); assert_shape_2d(t04, n_embd, N*n_batch); + struct ggml_tensor * t05 = ggml_mul_mat (ctx, wq, t04); set_name(t05, "t05"); assert_shape_2d(t05, n_embd, N*n_batch); + struct ggml_tensor * t06 = ggml_reshape_4d (ctx, t05, n_embd_head, n_head, N, n_batch); set_name(t06, "t06"); assert_shape_4d(t06, n_embd_head, n_head, N, n_batch); + struct ggml_tensor * t07 = rope (t06); set_name(t07, "t07"); assert_shape_4d(t07, n_embd_head, n_head, N, n_batch); + struct ggml_tensor * t08 = ggml_mul_mat (ctx, wk, t04); set_name(t08, "t08"); assert_shape_2d(t08, n_embd_gqa, N*n_batch); + struct ggml_tensor * t09 = ggml_reshape_4d (ctx, t08, n_embd_head, n_head_kv, N, n_batch); set_name(t09, "t09"); assert_shape_4d(t09, n_embd_head, n_head_kv, N, n_batch); + struct ggml_tensor * t10 = rope (t09); set_name(t10, "t10"); assert_shape_4d(t10, n_embd_head, n_head_kv, N, n_batch); + + struct ggml_tensor * t11; + if (ggml_is_quantized(wv->type)) { + struct ggml_tensor * t11_1 = ggml_mul_mat (ctx, wv, t04); set_name(t11_1, "t11_1"); assert_shape_2d(t11_1, n_embd_gqa, N*n_batch); + struct ggml_tensor * t11_2 = ggml_transpose(ctx, t11_1); set_name(t11_2, "t11_2"); assert_shape_2d(t11_2, N*n_batch, n_embd_gqa); + t11 = ggml_cont (ctx, t11_2); set_name(t11, "t11"); assert_shape_2d(t11, N*n_batch, n_embd_gqa); + } else { + t11 = ggml_mul_mat (ctx, t04, wv); set_name(t11, "t11"); assert_shape_2d(t11, N*n_batch, n_embd_gqa); + } + + struct ggml_tensor * t12 = ggml_reshape_4d (ctx, t11, N, n_batch, n_embd_head, n_head_kv); set_name(t12, "t12"); assert_shape_4d(t12, N, n_batch, n_embd_head, n_head_kv); + struct ggml_tensor * t13 = ggml_permute (ctx, t07, 0, 2, 1, 3); set_name(t13, "t13"); assert_shape_4d(t13, n_embd_head, N, n_head, n_batch); + struct ggml_tensor * t14 = ggml_permute (ctx, t10, 0, 2, 1, 3); set_name(t14, "t14"); assert_shape_4d(t14, n_embd_head, N, n_head_kv, n_batch); + struct ggml_tensor * t15 = ggml_permute (ctx, t12, 0, 3, 1, 2); set_name(t15, "t15"); assert_shape_4d(t15, N, n_embd_head, n_head_kv, n_batch); + struct ggml_tensor * t16; + if (enable_flash_attn) { + t16 = ggml_flash_attn(ctx, t13, t14, t15, true); set_name(t16, "t16"); assert_shape_4d(t16, n_embd_head, N, n_head, n_batch); + } else { + struct ggml_tensor * t16_0 = ggml_mul_mat (ctx, t14, t13); set_name(t16_0, "t16_0"); assert_shape_4d(t16_0, N, N, n_head, n_batch); + struct ggml_tensor * t16_1 = ggml_scale_inplace (ctx, t16_0, kv_scale); set_name(t16_1, "t16_1"); assert_shape_4d(t16_1, N, N, n_head, n_batch); + struct ggml_tensor * t16_2 = ggml_diag_mask_inf_inplace(ctx, t16_1, n_past); set_name(t16_2, "t16_2"); assert_shape_4d(t16_2, N, N, n_head, n_batch); + struct ggml_tensor * t16_3 = ggml_soft_max_inplace (ctx, t16_2); set_name(t16_3, "t16_3"); assert_shape_4d(t16_3, N, N, n_head, n_batch); + t16 = ggml_mul_mat(ctx, t15, t16_3); set_name(t16, "t16"); assert_shape_4d(t16, n_embd_head, N, n_head, n_batch); + } + struct ggml_tensor * t17 = ggml_permute (ctx, t16, 0, 2, 1, 3); set_name(t17, "t17"); assert_shape_4d(t17, n_embd_head, n_head, N, n_batch); + struct ggml_tensor * t18 = ggml_cont (ctx, t17); set_name(t18, "t18"); assert_shape_4d(t18, n_embd_head, n_head, N, n_batch); + struct ggml_tensor * t19 = ggml_reshape_2d (ctx, t18, n_embd, N*n_batch); set_name(t19, "t19"); assert_shape_2d(t19, n_embd, N*n_batch); + struct ggml_tensor * t20 = ggml_mul_mat (ctx, wo, t19); set_name(t20, "t20"); assert_shape_2d(t20, n_embd, N*n_batch); + struct ggml_tensor * t21 = ggml_add (ctx, t20, cur); set_name(t21, "t21"); assert_shape_2d(t21, n_embd, N*n_batch); + struct ggml_tensor * t22 = ggml_rms_norm (ctx, t21, rms_norm_eps); set_name(t22, "t22"); assert_shape_2d(t22, n_embd, N*n_batch); + struct ggml_tensor * t23 = ggml_repeat (ctx, ffn_norm, t22); set_name(t23, "t23"); assert_shape_2d(t23, n_embd, N*n_batch); + struct ggml_tensor * t24 = ggml_mul (ctx, t23, t22); set_name(t24, "t24"); assert_shape_2d(t24, n_embd, N*n_batch); + struct ggml_tensor * t25 = ggml_mul_mat (ctx, w3, t24); set_name(t25, "t25"); assert_shape_2d(t25, n_ff, N*n_batch); + struct ggml_tensor * t26 = ggml_mul_mat (ctx, w1, t24); set_name(t26, "t26"); assert_shape_2d(t26, n_ff, N*n_batch); + struct ggml_tensor * t27 = ggml_silu (ctx, t26); set_name(t27, "t27"); assert_shape_2d(t27, n_ff, N*n_batch); + struct ggml_tensor * t28 = ggml_mul (ctx, t27, t25); set_name(t28, "t28"); assert_shape_2d(t28, n_ff, N*n_batch); + struct ggml_tensor * t29 = ggml_mul_mat (ctx, w2, t28); set_name(t29, "t29"); assert_shape_2d(t29, n_embd, N*n_batch); + struct ggml_tensor * t30 = ggml_add (ctx, t29, t21); set_name(t30, "t30"); assert_shape_2d(t30, n_embd, N*n_batch); + cur = t30; + if (enable_checkpointing) { + checkpoints.push_back(cur); + } + } + struct ggml_tensor * t31 = ggml_rms_norm (ctx, cur, rms_norm_eps); set_name(t31, "t31"); assert_shape_2d(t31, n_embd, N*n_batch); + struct ggml_tensor * t32 = ggml_repeat (ctx, norm, t31); set_name(t32, "t32"); assert_shape_2d(t32, n_embd, N*n_batch); + struct ggml_tensor * t33 = ggml_mul (ctx, t32, t31); set_name(t33, "t33"); assert_shape_2d(t33, n_embd, N*n_batch); + struct ggml_tensor * t34 = ggml_mul_mat (ctx, output, t33); set_name(t34, "t34"); assert_shape_2d(t34, n_vocab, N*n_batch); + struct ggml_tensor * t35 = ggml_reshape_3d (ctx, t34, n_vocab, N, n_batch); set_name(t35, "t35"); assert_shape_3d(t35, n_vocab, N, n_batch); + struct ggml_tensor * t36 = ggml_cross_entropy_loss(ctx, t35, targets); set_name(t36, "t36"); assert_shape_1d(t36, 1); + + if (enable_checkpointing) { + checkpoints.push_back(t31); + checkpoints.push_back(t32); + checkpoints.push_back(t33); + checkpoints.push_back(t34); + checkpoints.push_back(t35); + checkpoints.push_back(t36); + } + + ggml_build_forward_expand(gf, t36); + + if (enable_checkpointing) { + ggml_build_backward_gradient_checkpointing(ctx, gf, gb, gb_tmp, checkpoints.data(), (int) checkpoints.size()); + } else { + *gb = *gf; + ggml_build_backward_expand(ctx, gf, gb, true); + } + + GGML_ASSERT(alloc != NULL); + + // make sure some tensors are not reallocated by inserting new temporary nodes depending on them + int n_leafs_before = gb->n_leafs; + int n_nodes_before = gb->n_nodes; + struct ggml_tensor * one = ggml_new_f32(ctx, 1.0f); + // output tensors + ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, t35, one)); + ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, t36, one)); + // input gradient + ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, t36->grad, one)); + GGML_ASSERT(t36->grad->data == NULL && t36->grad->view_src == NULL); + ggml_allocr_alloc(alloc, t36->grad); + + // make sure base model tensors data cannot be used in viewable operations + ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, model->tok_embeddings, one)); + ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, model->norm, one)); + ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, model->output, one)); + for (int il = 0; il < n_layer; ++il) { + struct my_llama_layer & layer = model->layers[il]; + ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, layer.attention_norm, one)); + ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, layer.ffn_norm, one)); + ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, layer.wq, one)); + ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, layer.wk, one)); + ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, layer.wv, one)); + ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, layer.wo, one)); + ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, layer.w1, one)); + ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, layer.w2, one)); + ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, layer.w3, one)); + } + + // allocating checkpoints in one block to reduce memory fragmentation + // note: they will be freed in reverse order + for (unsigned int i = 0; i < checkpoints.size(); ++i) { + if (checkpoints[i]->data == NULL && checkpoints[i]->view_src == NULL) { + ggml_allocr_alloc(alloc, checkpoints[i]); + } + } + + ggml_allocr_alloc_graph(alloc, gb); + + // remove the additional nodes and leafs + for (int i = n_leafs_before; i < gb->n_leafs; ++i) { + gb->leafs[i] = NULL; + } + for (int i = n_nodes_before; i < gb->n_nodes; ++i) { + gb->nodes[i] = NULL; + } + gb->n_leafs = n_leafs_before; + gb->n_nodes = n_nodes_before; + + *logits = t35; + return t36; +} + +static void load_llama_lora_gguf(struct gguf_context * fctx, struct ggml_context * f_ggml_ctx, struct my_llama_model * model, struct my_llama_lora * lora) { + // NOTE: gguf_context must be initialized with f_ggml_ctx and no_alloc=false, otherwise tensor data can not be read + + std::string arch; + + std::vector keybuf; + keybuf.resize(512); + + GGUF_GET_KEY(fctx, arch, gguf_get_val_str, GGUF_TYPE_STRING, true, LLM_KV_GENERAL_ARCHITECTURE); + GGML_ASSERT(arch == "llama"); + + uint32_t ftype_u; + GGUF_GET_KEY(fctx, ftype_u, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_GENERAL_FILE_TYPE); + GGML_ASSERT((enum llama_ftype) ftype_u == LLAMA_FTYPE_ALL_F32); + + struct my_llama_hparams hparams; + load_model_hparams_gguf(fctx, &hparams, arch.c_str()); + + // parameters that define tensor shapes must match + GGML_ASSERT(hparams.n_embd == model->hparams.n_embd); + GGML_ASSERT(hparams.n_ff == model->hparams.n_ff); + GGML_ASSERT(hparams.n_head == model->hparams.n_head); + GGML_ASSERT(hparams.n_head_kv == model->hparams.n_head_kv); + GGML_ASSERT(hparams.n_layer == model->hparams.n_layer); + + GGUF_GET_KEY(fctx, lora->hparams.n_rank_tok_embeddings, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_LORA_RANK_TOKEN_EMBD); + GGUF_GET_KEY(fctx, lora->hparams.n_rank_norm, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_LORA_RANK_OUTPUT_NORM); + GGUF_GET_KEY(fctx, lora->hparams.n_rank_output, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_LORA_RANK_OUTPUT); + GGUF_GET_KEY(fctx, lora->hparams.n_rank_attention_norm, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_LORA_RANK_ATTN_NORM); + GGUF_GET_KEY(fctx, lora->hparams.n_rank_wq, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_LORA_RANK_ATTN_Q); + GGUF_GET_KEY(fctx, lora->hparams.n_rank_wk, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_LORA_RANK_ATTN_K); + GGUF_GET_KEY(fctx, lora->hparams.n_rank_wv, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_LORA_RANK_ATTN_V); + GGUF_GET_KEY(fctx, lora->hparams.n_rank_wo, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_LORA_RANK_ATTN_OUT); + GGUF_GET_KEY(fctx, lora->hparams.n_rank_ffn_norm, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_LORA_RANK_FFN_NORM); + GGUF_GET_KEY(fctx, lora->hparams.n_rank_w1, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_LORA_RANK_FFN_GATE); + GGUF_GET_KEY(fctx, lora->hparams.n_rank_w2, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_LORA_RANK_FFN_DOWN); + GGUF_GET_KEY(fctx, lora->hparams.n_rank_w3, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_LORA_RANK_FFN_UP); + + init_lora(model, lora); + + copy_tensor_by_name(lora->tok_embeddings_a, f_ggml_ctx, ggml_get_name(lora->tok_embeddings_a)); + copy_tensor_by_name(lora->tok_embeddings_b, f_ggml_ctx, ggml_get_name(lora->tok_embeddings_b)); + copy_tensor_by_name(lora->norm_a, f_ggml_ctx, ggml_get_name(lora->norm_a)); + copy_tensor_by_name(lora->norm_b, f_ggml_ctx, ggml_get_name(lora->norm_b)); + copy_tensor_by_name(lora->output_a, f_ggml_ctx, ggml_get_name(lora->output_a)); + copy_tensor_by_name(lora->output_b, f_ggml_ctx, ggml_get_name(lora->output_b)); + + for (uint32_t i = 0; i < lora->layers.size(); ++i) { + auto & layer = lora->layers[i]; + copy_tensor_by_name(layer.attention_norm_a, f_ggml_ctx, ggml_get_name(layer.attention_norm_a)); + copy_tensor_by_name(layer.attention_norm_b, f_ggml_ctx, ggml_get_name(layer.attention_norm_b)); + copy_tensor_by_name(layer.wq_a, f_ggml_ctx, ggml_get_name(layer.wq_a)); + copy_tensor_by_name(layer.wq_b, f_ggml_ctx, ggml_get_name(layer.wq_b)); + copy_tensor_by_name(layer.wk_a, f_ggml_ctx, ggml_get_name(layer.wk_a)); + copy_tensor_by_name(layer.wk_b, f_ggml_ctx, ggml_get_name(layer.wk_b)); + copy_tensor_by_name(layer.wv_a, f_ggml_ctx, ggml_get_name(layer.wv_a)); + copy_tensor_by_name(layer.wv_b, f_ggml_ctx, ggml_get_name(layer.wv_b)); + copy_tensor_by_name(layer.wo_a, f_ggml_ctx, ggml_get_name(layer.wo_a)); + copy_tensor_by_name(layer.wo_b, f_ggml_ctx, ggml_get_name(layer.wo_b)); + copy_tensor_by_name(layer.ffn_norm_a, f_ggml_ctx, ggml_get_name(layer.ffn_norm_a)); + copy_tensor_by_name(layer.ffn_norm_b, f_ggml_ctx, ggml_get_name(layer.ffn_norm_b)); + copy_tensor_by_name(layer.w1_a, f_ggml_ctx, ggml_get_name(layer.w1_a)); + copy_tensor_by_name(layer.w1_b, f_ggml_ctx, ggml_get_name(layer.w1_b)); + copy_tensor_by_name(layer.w2_a, f_ggml_ctx, ggml_get_name(layer.w2_a)); + copy_tensor_by_name(layer.w2_b, f_ggml_ctx, ggml_get_name(layer.w2_b)); + copy_tensor_by_name(layer.w3_a, f_ggml_ctx, ggml_get_name(layer.w3_a)); + copy_tensor_by_name(layer.w3_b, f_ggml_ctx, ggml_get_name(layer.w3_b)); + } +} + +static void save_llama_lora_gguf(struct gguf_context * fctx, struct my_llama_model * model, struct my_llama_lora * lora) { + const char * arch = "llama"; + enum llama_ftype ftype = LLAMA_FTYPE_ALL_F32; + + std::vector keybuf; + keybuf.resize(512); + auto kv = [arch, &keybuf](const char * key) -> const char * { + snprintf(keybuf.data(), keybuf.size(), key, arch); + return keybuf.data(); + }; + + gguf_set_val_str(fctx, LLM_KV_GENERAL_ARCHITECTURE, arch); + gguf_set_val_u32(fctx, LLM_KV_GENERAL_FILE_TYPE, ftype); + + gguf_set_val_u32(fctx, kv(LLM_KV_CONTEXT_LENGTH), model->hparams.n_ctx); + gguf_set_val_u32(fctx, kv(LLM_KV_EMBEDDING_LENGTH), model->hparams.n_embd); + gguf_set_val_u32(fctx, kv(LLM_KV_FEED_FORWARD_LENGTH), model->hparams.n_ff); + gguf_set_val_u32(fctx, kv(LLM_KV_ATTENTION_HEAD_COUNT), model->hparams.n_head); + gguf_set_val_u32(fctx, kv(LLM_KV_ATTENTION_HEAD_COUNT_KV), model->hparams.n_head_kv); + gguf_set_val_u32(fctx, kv(LLM_KV_BLOCK_COUNT), model->hparams.n_layer); + gguf_set_val_u32(fctx, kv(LLM_KV_ROPE_DIMENSION_COUNT), model->hparams.n_embd_head()); + gguf_set_val_f32(fctx, kv(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS), model->hparams.f_norm_rms_eps); + gguf_set_val_f32(fctx, kv(LLM_KV_ROPE_FREQ_BASE), model->hparams.rope_freq_base); + gguf_set_val_f32(fctx, kv(LLM_KV_ROPE_SCALE_LINEAR), model->hparams.rope_freq_scale); + + gguf_set_val_u32(fctx, LLM_KV_TRAINING_LORA_RANK_TOKEN_EMBD, lora->hparams.n_rank_tok_embeddings); + gguf_set_val_u32(fctx, LLM_KV_TRAINING_LORA_RANK_OUTPUT_NORM, lora->hparams.n_rank_norm); + gguf_set_val_u32(fctx, LLM_KV_TRAINING_LORA_RANK_OUTPUT, lora->hparams.n_rank_output); + gguf_set_val_u32(fctx, LLM_KV_TRAINING_LORA_RANK_ATTN_NORM, lora->hparams.n_rank_attention_norm); + gguf_set_val_u32(fctx, LLM_KV_TRAINING_LORA_RANK_ATTN_Q, lora->hparams.n_rank_wq); + gguf_set_val_u32(fctx, LLM_KV_TRAINING_LORA_RANK_ATTN_K, lora->hparams.n_rank_wk); + gguf_set_val_u32(fctx, LLM_KV_TRAINING_LORA_RANK_ATTN_V, lora->hparams.n_rank_wv); + gguf_set_val_u32(fctx, LLM_KV_TRAINING_LORA_RANK_ATTN_OUT, lora->hparams.n_rank_wo); + gguf_set_val_u32(fctx, LLM_KV_TRAINING_LORA_RANK_FFN_NORM, lora->hparams.n_rank_ffn_norm); + gguf_set_val_u32(fctx, LLM_KV_TRAINING_LORA_RANK_FFN_GATE, lora->hparams.n_rank_w1); + gguf_set_val_u32(fctx, LLM_KV_TRAINING_LORA_RANK_FFN_DOWN, lora->hparams.n_rank_w2); + gguf_set_val_u32(fctx, LLM_KV_TRAINING_LORA_RANK_FFN_UP, lora->hparams.n_rank_w3); + + gguf_add_tensor(fctx, lora->tok_embeddings_a); + gguf_add_tensor(fctx, lora->tok_embeddings_b); + gguf_add_tensor(fctx, lora->norm_a); + gguf_add_tensor(fctx, lora->norm_b); + gguf_add_tensor(fctx, lora->output_a); + gguf_add_tensor(fctx, lora->output_b); + + for (uint32_t i = 0; i < lora->layers.size(); ++i) { + auto & layer = lora->layers[i]; + + gguf_add_tensor(fctx, layer.attention_norm_a); + gguf_add_tensor(fctx, layer.attention_norm_b); + gguf_add_tensor(fctx, layer.wq_a); + gguf_add_tensor(fctx, layer.wq_b); + gguf_add_tensor(fctx, layer.wk_a); + gguf_add_tensor(fctx, layer.wk_b); + gguf_add_tensor(fctx, layer.wv_a); + gguf_add_tensor(fctx, layer.wv_b); + gguf_add_tensor(fctx, layer.wo_a); + gguf_add_tensor(fctx, layer.wo_b); + gguf_add_tensor(fctx, layer.ffn_norm_a); + gguf_add_tensor(fctx, layer.ffn_norm_b); + gguf_add_tensor(fctx, layer.w1_a); + gguf_add_tensor(fctx, layer.w1_b); + gguf_add_tensor(fctx, layer.w2_a); + gguf_add_tensor(fctx, layer.w2_b); + gguf_add_tensor(fctx, layer.w3_a); + gguf_add_tensor(fctx, layer.w3_b); + } +} + +static void load_checkpoint_lora_gguf(struct gguf_context * fctx, struct ggml_context * f_ggml_ctx, struct my_llama_model * model, struct my_llama_lora * lora, struct train_state * train) { + std::string train_type = LLM_KV_TRAINING_TYPE_FINETUNE_LORA; + GGUF_GET_KEY(fctx, train_type, gguf_get_val_str, GGUF_TYPE_STRING, false, LLM_KV_TRAINING_TYPE); + GGML_ASSERT(train_type == LLM_KV_TRAINING_TYPE_FINETUNE_LORA); + + load_train_state_gguf(fctx, f_ggml_ctx, train); + load_llama_lora_gguf(fctx, f_ggml_ctx, model, lora); +} + +static void save_checkpoint_lora_gguf(struct gguf_context * fctx, struct my_llama_model * model, struct my_llama_lora * lora, struct train_state * train) { + gguf_set_val_str(fctx, LLM_KV_TRAINING_TYPE, LLM_KV_TRAINING_TYPE_FINETUNE_LORA); + save_llama_lora_gguf(fctx, model, lora); + save_train_state_gguf(fctx, train); +} + +static bool load_checkpoint_lora_file(const char * filename, struct my_llama_model * model, struct my_llama_lora * lora, struct train_state * train) { + struct ggml_context * f_ggml_ctx; + struct gguf_init_params params; + params.no_alloc = false; + params.ctx = &f_ggml_ctx; + struct gguf_context * fctx = gguf_init_from_file(filename, params); + if (fctx == NULL) { + return false; + } + + load_checkpoint_lora_gguf(fctx, f_ggml_ctx, model, lora, train); + + gguf_free(fctx); + return true; +} + +static void save_checkpoint_lora_file(const char * filename, struct my_llama_model * model, struct my_llama_lora * lora, struct train_state * train) { + printf("%s: saving to %s\n", __func__, filename); + struct gguf_context * fctx = gguf_init_empty(); + + save_checkpoint_lora_gguf(fctx, model, lora, train); + + // write file + const bool only_meta = false; + gguf_write_to_file(fctx, filename, only_meta); + gguf_free(fctx); +} + +struct llama_file { + // use FILE * so we don't have to re-open the file to mmap + FILE * fp; + size_t size; + + llama_file(const char * fname, const char * mode) { + fp = std::fopen(fname, mode); + if (fp == NULL) { + size = 0; + } else { + seek(0, SEEK_END); + size = tell(); + seek(0, SEEK_SET); + } + } + + size_t tell() const { +#ifdef _WIN32 + __int64 ret = _ftelli64(fp); +#else + long ret = std::ftell(fp); +#endif + GGML_ASSERT(ret != -1); // this really shouldn't fail + return (size_t) ret; + } + + void seek(size_t offset, int whence) { +#ifdef _WIN32 + int ret = _fseeki64(fp, (__int64) offset, whence); +#else + int ret = std::fseek(fp, (long) offset, whence); +#endif + GGML_ASSERT(ret == 0); // same + } + + void read_raw(void * ptr, size_t size) { + if (size == 0) { + return; + } + errno = 0; + std::size_t ret = std::fread(ptr, size, 1, fp); + if (ferror(fp)) { + die_fmt("read error: %s", strerror(errno)); + } + if (ret != 1) { + die("unexpectedly reached end of file"); + } + } + + std::uint32_t read_u32() { + std::uint32_t ret; + read_raw(&ret, sizeof(ret)); + return ret; + } + + std::string read_string(std::uint32_t len) { + std::vector chars(len); + read_raw(chars.data(), len); + return std::string(chars.data(), len); + } + + void write_raw(const void * ptr, size_t size) { + if (size == 0) { + return; + } + errno = 0; + size_t ret = std::fwrite(ptr, size, 1, fp); + if (ret != 1) { + die_fmt("write error: %s", strerror(errno)); + } + } + + void write_u32(std::uint32_t val) { + write_raw(&val, sizeof(val)); + } + + ~llama_file() { + if (fp) { + std::fclose(fp); + } + } +}; + +static void write_tensor(struct llama_file * file, struct ggml_tensor * tensor, const char * name) { + if (tensor == NULL) { + file->write_u32(0); + file->write_u32(0); + file->write_u32(GGML_TYPE_F32); + file->seek((0-file->tell()) & 31, SEEK_CUR); + return; + } + if (name == NULL) { + name = ggml_get_name(tensor); + } + uint32_t name_len = strlen(name); + uint32_t nd = tensor->n_dims; + uint32_t ne[4] = { (uint32_t)tensor->ne[0], + (uint32_t)tensor->ne[1], + (uint32_t)tensor->ne[2], + (uint32_t)tensor->ne[3] }; + file->write_u32(nd); + file->write_u32(name_len); + file->write_u32(tensor->type); + file->write_raw(ne, sizeof(ne[0]) * nd); + file->write_raw(name, name_len); + file->seek((0-file->tell()) & 31, SEEK_CUR); + file->write_raw(tensor->data, ggml_nbytes(tensor)); +} + +static void save_as_llama_lora(const char * filename, struct my_llama_lora * lora) { + printf("%s: saving to %s\n", __func__, filename); + struct llama_file file(filename, "wb"); + if (file.fp == NULL) { + return; + } + + std::vector tn_buf; + tn_buf.resize(GGML_MAX_NAME); + + auto tn = [&tn_buf](const char * key, const char * suffix) -> const char * { + snprintf(tn_buf.data(), tn_buf.size(), "%s%s", key, suffix); + return tn_buf.data(); + }; + + auto tni = [&tn_buf](const char * key, int bid, const char * suffix) -> const char * { + snprintf(tn_buf.data(), tn_buf.size(), key, bid); + std::string s = tn_buf.data(); + snprintf(tn_buf.data(), tn_buf.size(), "%s%s", s.c_str(), suffix); + return tn_buf.data(); + }; + + uint32_t LLAMA_FILE_MAGIC_LORA = 0x67676C61; // 'ggla' + // write_magic + file.write_u32(LLAMA_FILE_MAGIC_LORA); // magic + file.write_u32(1); // version + // write_hparams + file.write_u32(lora->hparams.lora_r); + file.write_u32(lora->hparams.lora_alpha); + // write tensors + write_tensor(&file, lora->tok_embeddings_a, tn(LLM_TENSOR_TOKEN_EMBD, ".weight.loraA")); + write_tensor(&file, lora->tok_embeddings_b, tn(LLM_TENSOR_TOKEN_EMBD, ".weight.loraB")); + write_tensor(&file, lora->norm_a, tn(LLM_TENSOR_OUTPUT_NORM, ".weight.loraA")); + write_tensor(&file, lora->norm_b, tn(LLM_TENSOR_OUTPUT_NORM, ".weight.loraB")); + write_tensor(&file, lora->output_a, tn(LLM_TENSOR_OUTPUT, ".weight.loraA")); + write_tensor(&file, lora->output_b, tn(LLM_TENSOR_OUTPUT, ".weight.loraB")); + for (uint32_t i = 0; i < lora->layers.size(); ++i) { + auto & layer = lora->layers[i]; + write_tensor(&file, layer.attention_norm_a, tni(LLM_TENSOR_ATTN_NORM, i, ".weight.loraA")); + write_tensor(&file, layer.attention_norm_b, tni(LLM_TENSOR_ATTN_NORM, i, ".weight.loraB")); + write_tensor(&file, layer.wq_a, tni(LLM_TENSOR_ATTN_Q, i, ".weight.loraA")); + write_tensor(&file, layer.wq_b, tni(LLM_TENSOR_ATTN_Q, i, ".weight.loraB")); + write_tensor(&file, layer.wk_a, tni(LLM_TENSOR_ATTN_K, i, ".weight.loraA")); + write_tensor(&file, layer.wk_b, tni(LLM_TENSOR_ATTN_K, i, ".weight.loraB")); + write_tensor(&file, layer.wv_a, tni(LLM_TENSOR_ATTN_V, i, ".weight.loraA")); + write_tensor(&file, layer.wv_b, tni(LLM_TENSOR_ATTN_V, i, ".weight.loraB")); + write_tensor(&file, layer.wo_a, tni(LLM_TENSOR_ATTN_OUT, i, ".weight.loraA")); + write_tensor(&file, layer.wo_b, tni(LLM_TENSOR_ATTN_OUT, i, ".weight.loraB")); + write_tensor(&file, layer.ffn_norm_a, tni(LLM_TENSOR_FFN_NORM, i, ".weight.loraA")); + write_tensor(&file, layer.ffn_norm_b, tni(LLM_TENSOR_FFN_NORM, i, ".weight.loraB")); + write_tensor(&file, layer.w1_a, tni(LLM_TENSOR_FFN_GATE, i, ".weight.loraA")); + write_tensor(&file, layer.w1_b, tni(LLM_TENSOR_FFN_GATE, i, ".weight.loraB")); + write_tensor(&file, layer.w2_a, tni(LLM_TENSOR_FFN_DOWN, i, ".weight.loraA")); + write_tensor(&file, layer.w2_b, tni(LLM_TENSOR_FFN_DOWN, i, ".weight.loraB")); + write_tensor(&file, layer.w3_a, tni(LLM_TENSOR_FFN_UP, i, ".weight.loraA")); + write_tensor(&file, layer.w3_b, tni(LLM_TENSOR_FFN_UP, i, ".weight.loraB")); + } +} + +struct train_params { + struct train_params_common common; + + const char * fn_model_base; + const char * fn_lora_out; + + bool only_write_lora; + + float f_norm_rms_eps; + float rope_freq_base; + float rope_freq_scale; + + bool custom_f_norm_rms_eps; + bool custom_rope_freq_base; + bool custom_rope_freq_scale; + + int32_t lora_r; + int32_t lora_alpha; + bool custom_lora_alpha; + + uint32_t n_rank_attention_norm; + uint32_t n_rank_wq; + uint32_t n_rank_wk; + uint32_t n_rank_wv; + uint32_t n_rank_wo; + uint32_t n_rank_ffn_norm; + uint32_t n_rank_w1; + uint32_t n_rank_w2; + uint32_t n_rank_w3; + uint32_t n_rank_tok_embeddings; + uint32_t n_rank_norm; + uint32_t n_rank_output; + + bool custom_n_rank_attention_norm; + bool custom_n_rank_wq; + bool custom_n_rank_wk; + bool custom_n_rank_wv; + bool custom_n_rank_wo; + bool custom_n_rank_ffn_norm; + bool custom_n_rank_w1; + bool custom_n_rank_w2; + bool custom_n_rank_w3; + bool custom_n_rank_tok_embeddings; + bool custom_n_rank_norm; + bool custom_n_rank_output; +}; + +static struct train_params get_default_train_params() { + struct train_params params; + params.common = get_default_train_params_common(); + params.fn_model_base = ""; + params.fn_lora_out = "ggml-lora-ITERATION-f32.gguf"; + + params.only_write_lora = false; + + params.f_norm_rms_eps = 1e-5f; + params.rope_freq_base = 10000.0f; + params.rope_freq_scale = 1.0f; + + params.custom_f_norm_rms_eps = false; + params.custom_rope_freq_base = false; + params.custom_rope_freq_scale = false; + + params.lora_r = 4; + params.lora_alpha = 4; + params.custom_lora_alpha = false; + + params.n_rank_attention_norm = 1; + params.n_rank_wq = 4; + params.n_rank_wk = 4; + params.n_rank_wv = 4; + params.n_rank_wo = 4; + params.n_rank_ffn_norm = 1; + params.n_rank_w1 = 4; + params.n_rank_w2 = 4; + params.n_rank_w3 = 4; + params.n_rank_tok_embeddings = 4; + params.n_rank_norm = 1; + params.n_rank_output = 4; + + params.custom_n_rank_attention_norm = false; + params.custom_n_rank_wq = false; + params.custom_n_rank_wk = false; + params.custom_n_rank_wv = false; + params.custom_n_rank_wo = false; + params.custom_n_rank_ffn_norm = false; + params.custom_n_rank_w1 = false; + params.custom_n_rank_w2 = false; + params.custom_n_rank_w3 = false; + params.custom_n_rank_tok_embeddings = false; + params.custom_n_rank_norm = false; + params.custom_n_rank_output = false; + + return params; +} + +static void train_print_usage(int argc, char ** argv, const struct train_params * params) { + fprintf(stderr, "usage: %s [options]\n", argv[0]); + fprintf(stderr, "\n"); + fprintf(stderr, "options:\n"); + fprintf(stderr, " -h, --help show this help message and exit\n"); + + fprintf(stderr, " --model-base FNAME model path from which to load base model (default '%s')\n", params->fn_model_base); + fprintf(stderr, " --lora-out FNAME path to save llama lora (default '%s')\n", params->fn_lora_out); + fprintf(stderr, " --only-write-lora only save llama lora, don't do any training. use this if you only want to convert a checkpoint to a lora adapter.\n"); + fprintf(stderr, " --norm-rms-eps F RMS-Norm epsilon value (default %f)\n", params->f_norm_rms_eps); + fprintf(stderr, " --rope-freq-base F Frequency base for ROPE (default %f)\n", params->rope_freq_base); + fprintf(stderr, " --rope-freq-scale F Frequency scale for ROPE (default %f)\n", params->rope_freq_scale); + fprintf(stderr, " --lora-alpha N LORA alpha : resulting LORA scaling is alpha/r. (default %d)\n", params->lora_alpha); + fprintf(stderr, " --lora-r N LORA r: default rank. Also specifies resulting scaling together with lora-alpha. (default %d)\n", params->lora_r); + fprintf(stderr, " --rank-att-norm N LORA rank for attention norm tensor, overrides default rank. Norm tensors should generally have rank 1.\n"); + fprintf(stderr, " --rank-ffn-norm N LORA rank for feed-forward norm tensor, overrides default rank. Norm tensors should generally have rank 1.\n"); + fprintf(stderr, " --rank-out-norm N LORA rank for output norm tensor, overrides default rank. Norm tensors should generally have rank 1.\n"); + fprintf(stderr, " --rank-tok-embd N LORA rank for token embeddings tensor, overrides default rank.\n"); + fprintf(stderr, " --rank-out N LORA rank for output tensor, overrides default rank.\n"); + fprintf(stderr, " --rank-wq N LORA rank for wq tensor, overrides default rank.\n"); + fprintf(stderr, " --rank-wk N LORA rank for wk tensor, overrides default rank.\n"); + fprintf(stderr, " --rank-wv N LORA rank for wv tensor, overrides default rank.\n"); + fprintf(stderr, " --rank-wo N LORA rank for wo tensor, overrides default rank.\n"); + fprintf(stderr, " --rank-w1 N LORA rank for w1 tensor, overrides default rank.\n"); + fprintf(stderr, " --rank-w2 N LORA rank for w2 tensor, overrides default rank.\n"); + fprintf(stderr, " --rank-w3 N LORA rank for w3 tensor, overrides default rank.\n"); + + print_common_train_usage(argc, argv, ¶ms->common); +} + +static bool train_params_parse(int argc, char ** argv, struct train_params * params) { + bool invalid_param = false; + std::string arg; + struct train_params default_params = get_default_train_params(); + const std::string arg_prefix = "--"; + + for (int i = 1; i < argc; i++) { + arg = argv[i]; + if (arg.compare(0, arg_prefix.size(), arg_prefix) == 0) { + std::replace(arg.begin(), arg.end(), '_', '-'); + } + + if (consume_common_train_arg(argc, argv, &i, ¶ms->common, &invalid_param)) { + if (invalid_param) { + break; + } else if (params->common.print_usage) { + train_print_usage(argc, argv, &default_params); + exit(0); + } + } else if (arg == "--model-base") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->fn_model_base = argv[i]; + } else if (arg == "--lora-out") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->fn_lora_out = argv[i]; + } else if (arg == "--only-write-lora") { + params->only_write_lora = true; + } else if (arg == "--norm-rms-eps") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->f_norm_rms_eps = std::stof(argv[i]); + params->custom_f_norm_rms_eps = true; + } else if (arg == "--rope-freq-base") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->rope_freq_base = std::stof(argv[i]); + params->custom_rope_freq_base = true; + } else if (arg == "--rope-freq-scale") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->rope_freq_scale = std::stof(argv[i]); + params->custom_rope_freq_scale = true; + } else if (arg == "--lora-alpha") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->lora_alpha = std::stoi(argv[i]); + params->custom_lora_alpha = true; + } else if (arg == "--lora-r") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->lora_r = std::stoi(argv[i]); + } else if (arg == "--rank-att-norm") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->n_rank_attention_norm = std::stoi(argv[i]); + params->custom_n_rank_attention_norm = true; + } else if (arg == "--rank-ffn-norm") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->n_rank_ffn_norm = std::stoi(argv[i]); + params->custom_n_rank_ffn_norm = true; + } else if (arg == "--rank-out-norm") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->n_rank_norm = std::stoi(argv[i]); + params->custom_n_rank_norm = true; + } else if (arg == "--rank-tok-embd") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->n_rank_tok_embeddings = std::stoi(argv[i]); + params->custom_n_rank_tok_embeddings = true; + } else if (arg == "--rank-out") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->n_rank_output = std::stoi(argv[i]); + params->custom_n_rank_output = true; + } else if (arg == "--rank-wq") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->n_rank_wq = std::stoi(argv[i]); + params->custom_n_rank_wq = true; + } else if (arg == "--rank-wk") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->n_rank_wk = std::stoi(argv[i]); + params->custom_n_rank_wk = true; + } else if (arg == "--rank-wv") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->n_rank_wv = std::stoi(argv[i]); + params->custom_n_rank_wv = true; + } else if (arg == "--rank-wo") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->n_rank_wo = std::stoi(argv[i]); + params->custom_n_rank_wo = true; + } else if (arg == "--rank-w1") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->n_rank_w1 = std::stoi(argv[i]); + params->custom_n_rank_w1 = true; + } else if (arg == "--rank-w2") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->n_rank_w2 = std::stoi(argv[i]); + params->custom_n_rank_w2 = true; + } else if (arg == "--rank-w3") { + if (++i >= argc) { + invalid_param = true; + break; + } + params->n_rank_w3 = std::stoi(argv[i]); + params->custom_n_rank_w3 = true; + } else { + fprintf(stderr, "error: unknown argument: %s\n", arg.c_str()); + train_print_usage(argc, argv, &default_params); + exit(1); + } + } + if (invalid_param) { + fprintf(stderr, "error: invalid parameter for argument: %s\n", arg.c_str()); + train_print_usage(argc, argv, &default_params); + exit(1); + } + finish_processing_train_args(¶ms->common); + return true; +} + +struct save_train_files_data { + const char * fn_checkpoint_out; + const char * fn_lora_out; + const char * pattern_fn_it; + const char * fn_latest; + struct my_llama_model * model; + struct my_llama_lora * lora; +}; + +static void save_train_files(void * vdata, struct train_state * train) { + struct save_train_files_data * data = (struct save_train_files_data *) vdata; + + int64_t iter = train->opt->iter; + + if (strlen(data->fn_checkpoint_out) > 0) { + save_checkpoint_lora_file(get_train_filename(data->fn_checkpoint_out, data->pattern_fn_it, data->fn_latest, iter).c_str(), data->model, data->lora, train); + save_checkpoint_lora_file(get_train_filename(data->fn_checkpoint_out, data->pattern_fn_it, data->fn_latest, -1 ).c_str(), data->model, data->lora, train); + } + if (strlen(data->fn_lora_out) > 0) { + save_as_llama_lora(get_train_filename(data->fn_lora_out, data->pattern_fn_it, data->fn_latest, iter).c_str(), data->lora); + save_as_llama_lora(get_train_filename(data->fn_lora_out, data->pattern_fn_it, data->fn_latest, -1 ).c_str(), data->lora); + } +} + +static int64_t get_parameter_count(struct my_llama_lora* lora) { + int64_t nx = 0; + nx += ggml_nelements(lora->tok_embeddings_a); + nx += ggml_nelements(lora->tok_embeddings_b); + nx += ggml_nelements(lora->norm_a); + nx += ggml_nelements(lora->norm_b); + nx += ggml_nelements(lora->output_a); + nx += ggml_nelements(lora->output_b); + + for (uint32_t i = 0; i < lora->layers.size(); ++i) { + auto & layer = lora->layers[i]; + nx += ggml_nelements(layer.attention_norm_a); + nx += ggml_nelements(layer.attention_norm_b); + nx += ggml_nelements(layer.wq_a); + nx += ggml_nelements(layer.wq_b); + nx += ggml_nelements(layer.wk_a); + nx += ggml_nelements(layer.wk_b); + nx += ggml_nelements(layer.wv_a); + nx += ggml_nelements(layer.wv_b); + nx += ggml_nelements(layer.wo_a); + nx += ggml_nelements(layer.wo_b); + nx += ggml_nelements(layer.ffn_norm_a); + nx += ggml_nelements(layer.ffn_norm_b); + nx += ggml_nelements(layer.w1_a); + nx += ggml_nelements(layer.w1_b); + nx += ggml_nelements(layer.w2_a); + nx += ggml_nelements(layer.w2_b); + nx += ggml_nelements(layer.w3_a); + nx += ggml_nelements(layer.w3_b); + } + return nx; +} + +int main(int argc, char ** argv) { + struct train_params params = get_default_train_params(); + + if (!train_params_parse(argc, argv, ¶ms)) { + return 1; + } + + if (params.common.seed == LLAMA_DEFAULT_SEED) { + params.common.seed = time(NULL); + } + printf("%s: seed: %u\n", __func__, params.common.seed); + srand(params.common.seed); + + struct llama_context_params llama_params = llama_context_default_params(); + llama_params.vocab_only = false; + + printf("%s: model base = '%s'\n", __func__, params.fn_model_base); + struct llama_model * lmodel = llama_load_model_from_file(params.fn_model_base, llama_params); + struct llama_context * lctx = llama_new_context_with_model(lmodel, llama_params); + + struct my_llama_model model; + init_model(lmodel, &model, params.fn_model_base, params.common.n_ctx); + + struct my_llama_lora lora; + + struct train_state * train = init_train_state(); + struct ggml_opt_context * opt = train->opt; + + // set params from command line + if (params.custom_f_norm_rms_eps) { + model.hparams.f_norm_rms_eps = params.f_norm_rms_eps; + } + if (params.custom_rope_freq_base) { + model.hparams.rope_freq_base = params.rope_freq_base; + } + if (params.custom_rope_freq_scale) { + model.hparams.rope_freq_scale = params.rope_freq_scale; + } + lora.hparams.lora_r = params.lora_r; + lora.hparams.lora_alpha = params.custom_lora_alpha ? params.lora_alpha : params.lora_r; + uint32_t n_rank_attention_norm = params.custom_n_rank_attention_norm ? params.n_rank_attention_norm : 1; + uint32_t n_rank_wq = params.custom_n_rank_wq ? params.n_rank_wq : params.lora_r; + uint32_t n_rank_wk = params.custom_n_rank_wk ? params.n_rank_wk : params.lora_r; + uint32_t n_rank_wv = params.custom_n_rank_wv ? params.n_rank_wv : params.lora_r; + uint32_t n_rank_wo = params.custom_n_rank_wo ? params.n_rank_wo : params.lora_r; + uint32_t n_rank_ffn_norm = params.custom_n_rank_ffn_norm ? params.n_rank_ffn_norm : 1; + uint32_t n_rank_w1 = params.custom_n_rank_w1 ? params.n_rank_w1 : params.lora_r; + uint32_t n_rank_w2 = params.custom_n_rank_w2 ? params.n_rank_w2 : params.lora_r; + uint32_t n_rank_w3 = params.custom_n_rank_w3 ? params.n_rank_w3 : params.lora_r; + uint32_t n_rank_tok_embeddings = params.custom_n_rank_tok_embeddings ? params.n_rank_tok_embeddings : params.lora_r; + uint32_t n_rank_norm = params.custom_n_rank_norm ? params.n_rank_norm : 1; + uint32_t n_rank_output = params.custom_n_rank_output ? params.n_rank_output : params.lora_r; + lora.hparams.n_rank_attention_norm = n_rank_attention_norm; + lora.hparams.n_rank_wq = n_rank_wq; + lora.hparams.n_rank_wk = n_rank_wk; + lora.hparams.n_rank_wv = n_rank_wv; + lora.hparams.n_rank_wo = n_rank_wo; + lora.hparams.n_rank_ffn_norm = n_rank_ffn_norm; + lora.hparams.n_rank_w1 = n_rank_w1; + lora.hparams.n_rank_w2 = n_rank_w2; + lora.hparams.n_rank_w3 = n_rank_w3; + lora.hparams.n_rank_tok_embeddings = n_rank_tok_embeddings; + lora.hparams.n_rank_norm = n_rank_norm; + lora.hparams.n_rank_output = n_rank_output; + + // set opt params from command line + opt->params = ggml_opt_default_params(GGML_OPT_ADAM); + opt->params.print_forward_graph = false; + opt->params.print_backward_graph = false; + opt->params.n_threads = params.common.n_threads; + opt->params.past = params.common.opt_past; + opt->params.delta = params.common.opt_delta; + opt->params.max_no_improvement = params.common.opt_max_no_improvement; + opt->params.n_gradient_accumulation = params.common.n_gradient_accumulation; + opt->params.adam.n_iter = params.common.adam_n_iter; + opt->params.adam.sched = 1.0f; + opt->params.adam.alpha = params.common.adam_alpha; + opt->params.adam.decay = params.common.adam_decay; + opt->params.adam.decay_min_ndim = params.common.adam_decay_min_ndim; + opt->params.adam.beta1 = params.common.adam_beta1; + opt->params.adam.beta2 = params.common.adam_beta2; + opt->params.adam.gclip = params.common.adam_gclip; + opt->params.adam.eps_f = params.common.adam_eps_f; + + ggml_allocr * alloc = NULL; + + printf("%s: init model\n", __func__); + bool existed = load_checkpoint_lora_file(params.common.fn_checkpoint_in, &model, &lora, train); + + if (existed) { + // overwrite last n_ctx with user provided n_ctx + if (params.common.custom_n_ctx) { + model.hparams.n_ctx = params.common.n_ctx; + } + + const bool opt_param_count_changed = ( + (lora.hparams.n_rank_attention_norm != n_rank_attention_norm) + || (lora.hparams.n_rank_wq != n_rank_wq) + || (lora.hparams.n_rank_wk != n_rank_wk) + || (lora.hparams.n_rank_wv != n_rank_wv) + || (lora.hparams.n_rank_wo != n_rank_wo) + || (lora.hparams.n_rank_ffn_norm != n_rank_ffn_norm) + || (lora.hparams.n_rank_w1 != n_rank_w1) + || (lora.hparams.n_rank_w2 != n_rank_w2) + || (lora.hparams.n_rank_w3 != n_rank_w3) + || (lora.hparams.n_rank_tok_embeddings != n_rank_tok_embeddings) + || (lora.hparams.n_rank_norm != n_rank_norm) + || (lora.hparams.n_rank_output != n_rank_output) + ); + + const bool opt_past_changed = opt->params.past != params.common.opt_past; + + if (opt_param_count_changed) { + print_lora_params(&lora.hparams); + die("Provided rank differs from checkpoint file. To use different rank start finetune from scratch with empty input checkpoint, e.g --checkpoint-in ''. Aborting."); + // need to discard previous optimizer gradient statistics and opt_init with new shapes + // TODO + } + if (opt_past_changed) { + die("Optimizer parameter '--opt-past N' differs from checkpoint file. To use different value finetune from scratch with empty input checkpoint, e.g --checkpoint-in ''. Aborting"); + // need to discard previous optimizer past function value statistics and opt_init with new shapes + // TODO + } + } else { // existed == false + init_lora(&model, &lora); + randomize_lora(&lora, params.common.seed, 0.0f, 1.0f, -1.0f, +1.0f); + if (!params.only_write_lora) { + ggml_opt_init(opt->ctx, opt, opt->params, get_parameter_count(&lora)); + } + } + opt->iter = train->train_its; + + print_params(&model.hparams); + print_lora_params(&lora.hparams); + printf("%s: total train_iterations %llu\n", __func__, (long long unsigned) train->train_its); + printf("%s: seen train_samples %llu\n", __func__, (long long unsigned) train->train_samples); + printf("%s: seen train_tokens %llu\n", __func__, (long long unsigned) train->train_tokens); + printf("%s: completed train_epochs %llu\n", __func__, (long long unsigned) train->train_epochs); + printf("%s: lora_size = %zu bytes (%.1f MB)\n", __func__, (ggml_used_mem(lora.ctx) + lora.data.size()), (float) (ggml_used_mem(lora.ctx) + lora.data.size()) / (1024.0f*1024.0f)); + + if (params.only_write_lora) { + save_train_files_data save_data; + save_data.fn_checkpoint_out = ""; + save_data.fn_lora_out = params.fn_lora_out; + save_data.pattern_fn_it = params.common.pattern_fn_it; + save_data.fn_latest = params.common.fn_latest; + save_data.model = &model; + save_data.lora = &lora; + + save_train_files(&save_data, train); + + free_train_state(train); + ggml_free(lora.ctx); + llama_free(lctx); + llama_free_model(lmodel); + return 0; + } + + printf("%s: opt_size = %zu bytes (%.1f MB)\n", __func__, ggml_get_mem_size(opt->ctx), (float) ggml_get_mem_size(opt->ctx) / (1024.0f*1024.0f)); + printf("%s: opt iter %d\n", __func__, opt->iter); + + int n_tokens = model.hparams.n_ctx; + int n_vocab = model.hparams.n_vocab; + int n_batch = params.common.n_batch; + + + std::vector mem_input_data; + std::vector mem_compute_data; + + // context for input tensors without their data + struct ggml_init_params ctx_input_params = { + ggml_tensor_overhead() * 2, // mem_size + NULL, // mem_buffer + true, // no_alloc + }; + struct ggml_context * ctx_input = ggml_init(ctx_input_params); + + // the input tensors + struct ggml_tensor * tokens_input = ggml_new_tensor_2d(ctx_input, GGML_TYPE_I32, n_tokens, n_batch); + struct ggml_tensor * target_probs = ggml_new_tensor_3d(ctx_input, GGML_TYPE_F32, n_vocab, n_tokens, n_batch); + + // measure required memory for input tensors + alloc = ggml_allocr_new_measure(tensor_alignment); + ggml_allocr_alloc(alloc, tokens_input); + ggml_allocr_alloc(alloc, target_probs); + size_t max_input_size = ggml_allocr_max_size(alloc) + tensor_alignment; + ggml_allocr_free(alloc); + printf("%s: input_size = %zu bytes (%.1f MB)\n", __func__, max_input_size, (float) max_input_size / (1024.0f*1024.0f)); + + // allocate input tensors + mem_input_data.resize(max_input_size); + alloc = ggml_allocr_new(mem_input_data.data(), mem_input_data.size(), tensor_alignment); + ggml_allocr_alloc(alloc, tokens_input); + ggml_allocr_alloc(alloc, target_probs); + ggml_allocr_free(alloc); + + // context for compute tensors without their data + size_t estimated_compute_size_wo_data = ( + ggml_tensor_overhead()*GGML_MAX_NODES*2 + + (GGML_OBJECT_SIZE+GGML_GRAPH_SIZE)*( + params.common.use_checkpointing ? 3 : 2 + ) + ); + struct ggml_init_params ctx_compute_params = { + estimated_compute_size_wo_data, // mem_size + NULL, // mem_buffer + true, // no_alloc + }; + struct ggml_context * ctx_compute = NULL; + + struct ggml_tensor * loss = NULL; + struct ggml_tensor * logits = NULL; + + struct ggml_cgraph * gf = NULL; + struct ggml_cgraph * gb = NULL; + struct ggml_cgraph * gb_tmp = NULL; + + // measure required memory for compute tensors + size_t best_compute_size = SIZE_MAX; + enum ggml_cgraph_eval_order best_order = GGML_CGRAPH_EVAL_ORDER_COUNT; + // find best evaluation order + for (unsigned order = 0; order < (unsigned) GGML_CGRAPH_EVAL_ORDER_COUNT; ++order) { + ctx_compute = ggml_init(ctx_compute_params); + alloc = ggml_allocr_new_measure(tensor_alignment); + gf = ggml_new_graph(ctx_compute); + gf->order = (enum ggml_cgraph_eval_order) order; + gb = ggml_new_graph(ctx_compute); + gb_tmp = params.common.use_checkpointing + ? ggml_new_graph(ctx_compute) + : NULL; + loss = llama_build_lora_finetune_graphs( + &model, &lora, alloc, ctx_compute, + gf, gb, gb_tmp, + &logits, tokens_input, target_probs, + n_tokens, n_batch, + params.common.use_flash, + params.common.use_checkpointing + ); + size_t max_compute_size = ggml_allocr_max_size(alloc) + tensor_alignment; + if (max_compute_size < best_compute_size) { + best_compute_size = max_compute_size; + best_order = gf->order; + } + ggml_allocr_free(alloc); + ggml_free(ctx_compute); + } + size_t max_compute_size = best_compute_size; + printf("%s: compute_size = %zu bytes (%.1f MB)\n", __func__, max_compute_size, (float) max_compute_size / (1024.0f*1024.0f)); + printf("%s: evaluation order = %s\n", __func__, + (best_order == GGML_CGRAPH_EVAL_ORDER_LEFT_TO_RIGHT) ? "LEFT_TO_RIGHT" : + (best_order == GGML_CGRAPH_EVAL_ORDER_RIGHT_TO_LEFT) ? "RIGHT_TO_LEFT" : + "invalid"); + + // allocate compute tensors + mem_compute_data.resize(max_compute_size); + ctx_compute = ggml_init(ctx_compute_params); + alloc = ggml_allocr_new(mem_compute_data.data(), mem_compute_data.size(), tensor_alignment); + gf = ggml_new_graph(ctx_compute); + gf->order = best_order; + gb = ggml_new_graph(ctx_compute); + gb_tmp = params.common.use_checkpointing + ? ggml_new_graph(ctx_compute) + : NULL; + loss = llama_build_lora_finetune_graphs( + &model, &lora, alloc, ctx_compute, + gf, gb, gb_tmp, + &logits, tokens_input, target_probs, + n_tokens, n_batch, + params.common.use_flash, + params.common.use_checkpointing + ); + ggml_allocr_free(alloc); + + // tokenize data + std::vector train_tokens; + std::vector train_samples_begin; + std::vector train_samples_size; + printf("%s: tokenize training data\n", __func__); + tokenize_file(lctx, + params.common.fn_train_data, + params.common.sample_start, + params.common.include_sample_start, + params.common.overlapping_samples, + n_tokens, + train_tokens, + train_samples_begin, + train_samples_size); + GGML_ASSERT(train_samples_begin.size() == train_samples_size.size()); + + printf("%s: number of training tokens: %zu\n", __func__, train_tokens.size()); + + std::vector token_noccurs; + token_noccurs.resize(model.hparams.n_vocab, 0); + for (unsigned int i = 0; i < train_tokens.size(); ++i) { + ++token_noccurs[train_tokens[i]]; + } + int n_unique_tokens = 0; + for (unsigned int i = 0; i < token_noccurs.size(); ++i) { + if (token_noccurs[i] == 0) continue; + ++n_unique_tokens; + } + printf("%s: number of unique tokens: %d\n", __func__, n_unique_tokens); + + size_t shuffle_samples_hash = compute_samples_hash(params.common.fn_train_data, train_samples_begin.data(), train_samples_size.data(), train_samples_size.size()); + const bool changed_train_data = (shuffle_samples_hash != train->shuffle_samples_hash) || (train->shuffle_sample_count != train_samples_size.size()); + if (changed_train_data) { + printf("%s: train data seems to have changed. restarting shuffled epoch.\n", __func__); + } + if (params.common.force_reshuffle) { + printf("%s: forced reshuffling of data. restarting with newly shuffled epoch.\n", __func__); + } + if ((train->shuffle_rng_state_current == "") || changed_train_data || params.common.force_reshuffle) { + train->shuffle_rng_state_current = mt19937_seed_to_state(params.common.seed); + train->shuffle_sample_count = train_samples_size.size(); + train->shuffle_next_sample = 0; + train->shuffle_samples_hash = shuffle_samples_hash; + } + std::vector train_shuffled_samples_offs; + std::vector train_shuffled_samples_begin; + std::vector train_shuffled_samples_size; + train_shuffled_samples_offs.resize(train_samples_begin.size()); + train_shuffled_samples_begin.resize(train_samples_begin.size()); + train_shuffled_samples_size.resize(train_samples_size.size()); + train->shuffle_rng_state_next = shuffle_samples( + train->shuffle_rng_state_current, + train_shuffled_samples_offs.data(), + train_shuffled_samples_begin.data(), + train_shuffled_samples_size.data(), + train_samples_begin.data(), + train_samples_size.data(), + train_samples_size.size()); + + printf("%s: begin training\n", __func__); + + save_train_files_data save_data; + save_data.fn_checkpoint_out = params.common.fn_checkpoint_out; + save_data.fn_lora_out = params.fn_lora_out; + save_data.pattern_fn_it = params.common.pattern_fn_it; + save_data.fn_latest = params.common.fn_latest; + save_data.model = &model; + save_data.lora = &lora; + + struct train_opt_callback_data opt_cb_data; + opt_cb_data.params = ¶ms.common; + opt_cb_data.train = train; + opt_cb_data.save_cb = &save_train_files; + opt_cb_data.save_data = &save_data; + opt_cb_data.lctx = lctx; + opt_cb_data.last_save_iter = opt->iter; + opt_cb_data.tokens_data = train_tokens.data(); + opt_cb_data.tokens_size = train_tokens.size(); + opt_cb_data.samples_begin = train_samples_begin.data(); + opt_cb_data.samples_size = train_samples_size.data(); + opt_cb_data.shuffled_samples_offs = train_shuffled_samples_offs.data(); + opt_cb_data.shuffled_samples_begin = train_shuffled_samples_begin.data(); + opt_cb_data.shuffled_samples_size = train_shuffled_samples_size.data(); + opt_cb_data.samples_count = train_samples_size.size(); + opt_cb_data.tokens_input = tokens_input; + opt_cb_data.target_probs = target_probs; + opt_cb_data.first_iter = opt->iter; + opt_cb_data.first_epoch = train->train_epochs; + opt_cb_data.iter_at_last_epoch = -1; + opt_cb_data.last_time = ggml_time_ms(); + opt_cb_data.millis_per_iter = 0.0; + + // measure required memory for work buffer + size_t max_work_size = ggml_graph_plan(gb, params.common.n_threads).work_size + GGML_OBJECT_SIZE; + printf("%s: work_size = %zu bytes (%.1f MB)\n", __func__, max_work_size, (float) max_work_size / (1024.0f*1024.0f)); + + // context for work buffer + struct ggml_init_params ctx_work_params = { + max_work_size, // mem_size + NULL, // mem_buffer + false, // no_alloc + }; + struct ggml_context * ctx_work = ggml_init(ctx_work_params); + + int64_t t0 = ggml_time_ms(); + + ggml_opt_resume_g(ctx_work, opt, loss, gf, gb, &train_opt_callback, (void *) &opt_cb_data); + + ggml_free(ctx_work); + ggml_free(ctx_compute); + ggml_free(ctx_input); + + int64_t t1 = ggml_time_ms(); + printf("%s: total training time: ", __func__); + print_duration((double) (t1 - t0)); + printf("\n"); + + int new_iters = opt->iter - opt_cb_data.last_save_iter; + if (new_iters > 0) { + train->train_its += new_iters; + train->train_tokens += new_iters * opt->params.n_gradient_accumulation * n_batch * n_tokens; + + save_train_files(&save_data, train); + opt_cb_data.last_save_iter = opt->iter; + } + + ggml_free(opt->ctx); + free_train_state(train); + ggml_free(lora.ctx); + llama_free(lctx); + llama_free_model(lmodel); + return 0; +} diff --git a/examples/server/server.cpp b/examples/server/server.cpp index 273eb36f4..9b9624832 100644 --- a/examples/server/server.cpp +++ b/examples/server/server.cpp @@ -956,7 +956,23 @@ static void server_params_parse(int argc, char **argv, server_params &sparams, invalid_param = true; break; } - params.lora_adapter = argv[i]; + params.lora_adapter.push_back({argv[i], 1.0f}); + params.use_mmap = false; + } + else if (arg == "--lora-scaled") + { + if (++i >= argc) + { + invalid_param = true; + break; + } + const char * lora_adapter = argv[i]; + if (++i >= argc) + { + invalid_param = true; + break; + } + params.lora_adapter.push_back({lora_adapter, std::stof(argv[i])}); params.use_mmap = false; } else if (arg == "--lora-base") diff --git a/examples/train-text-from-scratch/README.md b/examples/train-text-from-scratch/README.md index f4ffcd987..1b3454069 100644 --- a/examples/train-text-from-scratch/README.md +++ b/examples/train-text-from-scratch/README.md @@ -10,9 +10,9 @@ wget https://raw.githubusercontent.com/brunoklein99/deep-learning-notes/master/s ./bin/train-text-from-scratch \ --vocab-model ../models/ggml-vocab-llama.gguf \ --ctx 64 --embd 256 --head 8 --layer 16 \ - --checkpoint-in chk-shakespeare-256x16.gguf \ - --checkpoint-out chk-shakespeare-256x16.gguf \ - --model-out ggml-shakespeare-256x16-f32.gguf \ + --checkpoint-in chk-shakespeare-256x16-LATEST.gguf \ + --checkpoint-out chk-shakespeare-256x16-ITERATION.gguf \ + --model-out ggml-shakespeare-256x16-f32-ITERATION.gguf \ --train-data "shakespeare.txt" \ -t 6 -b 16 --seed 1 --adam-iter 256 \ --no-checkpointing @@ -20,3 +20,8 @@ wget https://raw.githubusercontent.com/brunoklein99/deep-learning-notes/master/s # predict ./bin/main -m ggml-shakespeare-256x16-f32.gguf ``` + +Output files will be saved every N iterations (config with `--save-every N`). +The pattern "ITERATION" in the output filenames will be replaced with the iteration number and "LATEST" for the latest output. + +To train GGUF models just pass them to `--checkpoint-in FN`. diff --git a/examples/train-text-from-scratch/convert-train-checkpoint-to-gguf.py b/examples/train-text-from-scratch/convert-train-checkpoint-to-gguf.py index a527d6153..351e7bc2d 100644 --- a/examples/train-text-from-scratch/convert-train-checkpoint-to-gguf.py +++ b/examples/train-text-from-scratch/convert-train-checkpoint-to-gguf.py @@ -47,10 +47,13 @@ LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_YS = "optimizer.lbfgs.memory_ys" LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_S = "optimizer.lbfgs.memory_s" LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_Y = "optimizer.lbfgs.memory_y" -LLM_KV_TRAINING_FILE_VERSION = "training.file_version" -LLM_KV_TRAINING_ITERATION_COUNT = "training.iteration_count" -LLM_KV_TRAINING_SAMPLE_COUNT = "training.sample_count" -LLM_KV_TRAINING_TOKEN_COUNT = "training.token_count" +LLM_KV_TRAINING_TYPE_TRAIN_MODEL = "train_model" +LLM_KV_TRAINING_TYPE_FINETUNE_LORA = "finetune_lora" +LLM_KV_TRAINING_TYPE = "training.type" +LLM_KV_TRAINING_FILE_VERSION = "training.file_version" +LLM_KV_TRAINING_ITERATION_COUNT = "training.iteration_count" +LLM_KV_TRAINING_SAMPLE_COUNT = "training.sample_count" +LLM_KV_TRAINING_TOKEN_COUNT = "training.token_count" class Tensor: def __init__(self, dtype='f', ne=None): @@ -460,6 +463,7 @@ class Checkpoint: gguf_writer.add_file_type(gguf.GGMLQuantizationType.F32) gguf_writer.add_layer_norm_rms_eps(1e-5) gguf_writer.add_uint32(LLM_KV_TRAINING_FILE_VERSION, 0) + gguf_writer.add_string(LLM_KV_TRAINING_TYPE, LLM_KV_TRAINING_TYPE_TRAIN_MODEL) gguf_writer.add_uint32(LLM_KV_TRAINING_ITERATION_COUNT, self.train_its) gguf_writer.add_uint32(LLM_KV_TRAINING_SAMPLE_COUNT, self.train_samples) gguf_writer.add_uint32(LLM_KV_TRAINING_TOKEN_COUNT, self.train_tokens) diff --git a/examples/train-text-from-scratch/train-text-from-scratch.cpp b/examples/train-text-from-scratch/train-text-from-scratch.cpp index 5f541a141..d5205aff6 100644 --- a/examples/train-text-from-scratch/train-text-from-scratch.cpp +++ b/examples/train-text-from-scratch/train-text-from-scratch.cpp @@ -1,6 +1,7 @@ #include "ggml.h" #include "ggml-alloc.h" #include "common.h" +#include "train.h" #include "llama.h" #include #include @@ -18,142 +19,7 @@ #pragma warning(disable: 4244 4267) // possible loss of data #endif -struct random_normal_distribution { - std::mt19937 gen; - std::normal_distribution rd; - float min; - float max; -}; - -struct random_uniform_distribution { - std::mt19937 gen; - std::uniform_real_distribution rd; -}; - -void init_random_normal_distribution(struct random_normal_distribution * rnd, int seed, float mean, float std, float min, float max) { - rnd->gen = std::mt19937(seed); - rnd->rd = std::normal_distribution{mean, std}; - rnd->min = min; - rnd->max = max; -} - -void init_random_uniform_distribution(struct random_uniform_distribution * rnd, int seed, float min, float max) { - rnd->gen = std::mt19937(seed); - rnd->rd = std::uniform_real_distribution{min, max}; -} - -int clamp(const int v, const int min, const int max) { - return ((v < min) ? (min) : (v > max) ? (max) : v); -} - -float fclamp(const float v, const float min, const float max) { - return ((v < min) ? (min) : (v > max) ? (max) : v); -} - -float frand() { - return (float)rand()/(float)RAND_MAX; -} - -float frand_normal(struct random_normal_distribution * rnd) { - return fclamp(rnd->rd(rnd->gen), rnd->min, rnd->max); -} - -float frand_uniform(struct random_uniform_distribution * rnd) { - return rnd->rd(rnd->gen); -} - -struct ggml_tensor * randomize_tensor_normal(struct ggml_tensor * tensor, struct random_normal_distribution * rnd) { - float scale = 1.0f; // xavier - switch (tensor->n_dims) { - case 1: - scale /= sqrtf(tensor->ne[0]); - for (int i0 = 0; i0 < tensor->ne[0]; i0++) { - float * dst = (float *) ((char *) tensor->data + i0*tensor->nb[0]); - *dst = scale * frand_normal(rnd); - } - break; - case 2: - scale /= sqrtf(tensor->ne[0]+tensor->ne[1]); - for (int i1 = 0; i1 < tensor->ne[1]; i1++) { - for (int i0 = 0; i0 < tensor->ne[0]; i0++) { - float * dst = (float *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1]); - *dst = scale * frand_normal(rnd); - } - } - break; - case 3: - scale /= sqrtf(tensor->ne[0]+tensor->ne[1]); - for (int i2 = 0; i2 < tensor->ne[2]; i2++) { - for (int i1 = 0; i1 < tensor->ne[1]; i1++) { - for (int i0 = 0; i0 < tensor->ne[0]; i0++) { - float * dst = (float *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1] + i2*tensor->nb[2]); - *dst = scale * frand_normal(rnd); - } - } - } - break; - case 4: - scale /= sqrtf(tensor->ne[0]+tensor->ne[1]); - for (int i3 = 0; i3 < tensor->ne[3]; i3++) { - for (int i2 = 0; i2 < tensor->ne[2]; i2++) { - for (int i1 = 0; i1 < tensor->ne[1]; i1++) { - for (int i0 = 0; i0 < tensor->ne[0]; i0++) { - float * dst = (float *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1] + i2*tensor->nb[2] + i3*tensor->nb[3]); - *dst = scale * frand_normal(rnd); - } - } - } - } - break; - default: - assert(false); - }; - return tensor; -} - -struct ggml_tensor * randomize_tensor_uniform(struct ggml_tensor * tensor, struct random_uniform_distribution * rnd) { - switch (tensor->n_dims) { - case 1: - for (int i0 = 0; i0 < tensor->ne[0]; i0++) { - float * dst = (float *) ((char *) tensor->data + i0*tensor->nb[0]); - *dst = frand_uniform(rnd); - } - break; - case 2: - for (int i1 = 0; i1 < tensor->ne[1]; i1++) { - for (int i0 = 0; i0 < tensor->ne[0]; i0++) { - float * dst = (float *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1]); - *dst = frand_uniform(rnd); - } - } - break; - case 3: - for (int i2 = 0; i2 < tensor->ne[2]; i2++) { - for (int i1 = 0; i1 < tensor->ne[1]; i1++) { - for (int i0 = 0; i0 < tensor->ne[0]; i0++) { - float * dst = (float *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1] + i2*tensor->nb[2]); - *dst = frand_uniform(rnd); - } - } - } - break; - case 4: - for (int i3 = 0; i3 < tensor->ne[3]; i3++) { - for (int i2 = 0; i2 < tensor->ne[2]; i2++) { - for (int i1 = 0; i1 < tensor->ne[1]; i1++) { - for (int i0 = 0; i0 < tensor->ne[0]; i0++) { - float * dst = (float *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1] + i2*tensor->nb[2] + i3*tensor->nb[3]); - *dst = frand_uniform(rnd); - } - } - } - } - break; - default: - assert(false); - }; - return tensor; -} +static const size_t tensor_alignment = 32; struct my_llama_hparams { uint32_t n_vocab = 32000; @@ -164,8 +30,8 @@ struct my_llama_hparams { uint32_t n_rot = 64; uint32_t n_ff = 11008; - // float f_norm_eps = 1e-5; // falcon - float f_norm_rms_eps = 1e-5; // llama + // float f_norm_eps = 1e-5f; // falcon + float f_norm_rms_eps = 1e-5f; // llama float rope_freq_base = 10000.0f; float rope_freq_scale = 1.0f; @@ -192,6 +58,7 @@ struct my_llama_layer { struct my_llama_model { struct ggml_context * ctx = NULL; + std::vector data; my_llama_hparams hparams; @@ -201,92 +68,50 @@ struct my_llama_model { struct ggml_tensor * output; std::vector layers; - - uint32_t train_its = 0; - uint32_t train_samples = 0; - uint32_t train_tokens = 0; }; -// gguf constants -const char * LLM_KV_OPTIMIZER_TYPE = "optimizer.type"; -const char * LLM_KV_OPTIMIZER_TYPE_ADAM = "adam"; -const char * LLM_KV_OPTIMIZER_TYPE_LBFGS = "lbfgs"; -const char * LLM_KV_OPTIMIZER_FILE_VERSION = "optimizer.file_version"; -const char * LLM_KV_OPTIMIZER_CONVERGENCE_PAST_COUNT = "optimizer.convergence_past_count"; -const char * LLM_KV_OPTIMIZER_PARAMETER_COUNT = "optimizer.parameter_count"; -const char * LLM_KV_OPTIMIZER_ITERATION_COUNT = "optimizer.iteration_count"; -const char * LLM_KV_OPTIMIZER_JUST_INITIALIZED = "optimizer.just_initialized"; -const char * LLM_KV_OPTIMIZER_ADAM_BEST_LOSS = "optimizer.adam.best_loss"; -const char * LLM_KV_OPTIMIZER_ADAM_PREVIOUS_LOSS = "optimizer.adam.previous_loss"; -const char * LLM_KV_OPTIMIZER_ADAM_NO_IMPROVEMENT_COUNT = "optimizer.adam.no_improvement_count"; -const char * LLM_KV_OPTIMIZER_LBFGS_APPROX_HESSIAN_COUNT = "optimizer.lbfgs.approx_hessian_count"; -const char * LLM_KV_OPTIMIZER_LBFGS_BEST_LOSS = "optimizer.lbfgs.best_loss"; -const char * LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_STEP = "optimizer.lbfgs.line_search_step"; -const char * LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_J = "optimizer.lbfgs.line_search_j"; -const char * LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_K = "optimizer.lbfgs.line_search_k"; -const char * LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_END = "optimizer.lbfgs.line_search_end"; -const char * LLM_KV_OPTIMIZER_LBFGS_NO_IMPROVEMENT_COUNT = "optimizer.lbfgs.no_improvement_count"; - -const char * LLM_TENSOR_OPTIMIZER_ADAM_FIRST_MOMENTS = "optimizer.adam.first_moments"; -const char * LLM_TENSOR_OPTIMIZER_ADAM_SECOND_MOMENTS = "optimizer.adam.second_moments"; -const char * LLM_TENSOR_OPTIMIZER_ADAM_PAST_LOSS_VALUES = "optimizer.adam.past_loss_values"; - -const char * LLM_TENSOR_OPTIMIZER_LBFGS_CURRENT_PARAMETERS = "optimizer.lbfgs.current_parameters"; -const char * LLM_TENSOR_OPTIMIZER_LBFGS_PREVIOUS_PARAMETERS = "optimizer.lbfgs.previous_parameters"; -const char * LLM_TENSOR_OPTIMIZER_LBFGS_CURRENT_GRADIENTS = "optimizer.lbfgs.current_gradients"; -const char * LLM_TENSOR_OPTIMIZER_LBFGS_PREVIOUS_GRADIENTS = "optimizer.lbfgs.previous_gradients"; -const char * LLM_TENSOR_OPTIMIZER_LBFGS_SEARCH_DIRECTION = "optimizer.lbfgs.search_direction"; -const char * LLM_TENSOR_OPTIMIZER_LBFGS_PAST_LOSS_VALUES = "optimizer.lbfgs.past_loss_values"; -const char * LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_ALPHA = "optimizer.lbfgs.memory_alpha"; -const char * LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_YS = "optimizer.lbfgs.memory_ys"; -const char * LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_S = "optimizer.lbfgs.memory_s"; -const char * LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_Y = "optimizer.lbfgs.memory_y"; - -const char * LLM_KV_TRAINING_FILE_VERSION = "training.file_version"; -const char * LLM_KV_TRAINING_ITERATION_COUNT = "training.iteration_count"; -const char * LLM_KV_TRAINING_SAMPLE_COUNT = "training.sample_count"; -const char * LLM_KV_TRAINING_TOKEN_COUNT = "training.token_count"; - // gguf constants (sync with gguf.py) +static const char * LLM_KV_TRAINING_TYPE_TRAIN_MODEL = "train_model"; +static const char * LLM_KV_TRAINING_TYPE = "training.type"; -const char * LLM_KV_GENERAL_ARCHITECTURE = "general.architecture"; -const char * LLM_KV_GENERAL_FILE_TYPE = "general.file_type"; +static const char * LLM_KV_GENERAL_ARCHITECTURE = "general.architecture"; +static const char * LLM_KV_GENERAL_FILE_TYPE = "general.file_type"; -const char * LLM_KV_CONTEXT_LENGTH = "%s.context_length"; -const char * LLM_KV_EMBEDDING_LENGTH = "%s.embedding_length"; -const char * LLM_KV_BLOCK_COUNT = "%s.block_count"; -const char * LLM_KV_FEED_FORWARD_LENGTH = "%s.feed_forward_length"; -const char * LLM_KV_ATTENTION_HEAD_COUNT = "%s.attention.head_count"; -const char * LLM_KV_ATTENTION_LAYERNORM_RMS_EPS = "%s.attention.layer_norm_rms_epsilon"; -const char * LLM_KV_ROPE_DIMENSION_COUNT = "%s.rope.dimension_count"; -const char * LLM_KV_ROPE_FREQ_BASE = "%s.rope.freq_base"; // TODO load in llama.cpp -const char * LLM_KV_ROPE_SCALE_LINEAR = "%s.rope.scale_linear"; +static const char * LLM_KV_CONTEXT_LENGTH = "%s.context_length"; +static const char * LLM_KV_EMBEDDING_LENGTH = "%s.embedding_length"; +static const char * LLM_KV_BLOCK_COUNT = "%s.block_count"; +static const char * LLM_KV_FEED_FORWARD_LENGTH = "%s.feed_forward_length"; +static const char * LLM_KV_ATTENTION_HEAD_COUNT = "%s.attention.head_count"; +static const char * LLM_KV_ATTENTION_LAYERNORM_RMS_EPS = "%s.attention.layer_norm_rms_epsilon"; +static const char * LLM_KV_ROPE_DIMENSION_COUNT = "%s.rope.dimension_count"; +static const char * LLM_KV_ROPE_FREQ_BASE = "%s.rope.freq_base"; // TODO load in llama.cpp +static const char * LLM_KV_ROPE_SCALE_LINEAR = "%s.rope.scale_linear"; -const char * LLM_KV_TOKENIZER_MODEL = "tokenizer.ggml.model"; -const char * LLM_KV_TOKENIZER_LIST = "tokenizer.ggml.tokens"; -const char * LLM_KV_TOKENIZER_TOKEN_TYPE = "tokenizer.ggml.token_type"; -const char * LLM_KV_TOKENIZER_SCORES = "tokenizer.ggml.scores"; -const char * LLM_KV_TOKENIZER_MERGES = "tokenizer.ggml.merges"; -const char * LLM_KV_TOKENIZER_BOS_ID = "tokenizer.ggml.bos_token_id"; -const char * LLM_KV_TOKENIZER_EOS_ID = "tokenizer.ggml.eos_token_id"; -const char * LLM_KV_TOKENIZER_UNK_ID = "tokenizer.ggml.unknown_token_id"; -const char * LLM_KV_TOKENIZER_SEP_ID = "tokenizer.ggml.seperator_token_id"; -const char * LLM_KV_TOKENIZER_PAD_ID = "tokenizer.ggml.padding_token_id"; +static const char * LLM_KV_TOKENIZER_MODEL = "tokenizer.ggml.model"; +static const char * LLM_KV_TOKENIZER_LIST = "tokenizer.ggml.tokens"; +static const char * LLM_KV_TOKENIZER_TOKEN_TYPE = "tokenizer.ggml.token_type"; +static const char * LLM_KV_TOKENIZER_SCORES = "tokenizer.ggml.scores"; +static const char * LLM_KV_TOKENIZER_MERGES = "tokenizer.ggml.merges"; +static const char * LLM_KV_TOKENIZER_BOS_ID = "tokenizer.ggml.bos_token_id"; +static const char * LLM_KV_TOKENIZER_EOS_ID = "tokenizer.ggml.eos_token_id"; +static const char * LLM_KV_TOKENIZER_UNK_ID = "tokenizer.ggml.unknown_token_id"; +static const char * LLM_KV_TOKENIZER_SEP_ID = "tokenizer.ggml.seperator_token_id"; +static const char * LLM_KV_TOKENIZER_PAD_ID = "tokenizer.ggml.padding_token_id"; -const char * LLM_TENSOR_TOKEN_EMBD = "token_embd"; -const char * LLM_TENSOR_OUTPUT_NORM = "output_norm"; -const char * LLM_TENSOR_OUTPUT = "output"; -const char * LLM_TENSOR_ATTN_NORM = "blk.%d.attn_norm"; -const char * LLM_TENSOR_ATTN_Q = "blk.%d.attn_q"; -const char * LLM_TENSOR_ATTN_K = "blk.%d.attn_k"; -const char * LLM_TENSOR_ATTN_V = "blk.%d.attn_v"; -const char * LLM_TENSOR_ATTN_OUT = "blk.%d.attn_output"; -const char * LLM_TENSOR_FFN_NORM = "blk.%d.ffn_norm"; -const char * LLM_TENSOR_FFN_GATE = "blk.%d.ffn_gate"; -const char * LLM_TENSOR_FFN_DOWN = "blk.%d.ffn_down"; -const char * LLM_TENSOR_FFN_UP = "blk.%d.ffn_up"; +static const char * LLM_TENSOR_TOKEN_EMBD = "token_embd"; +static const char * LLM_TENSOR_OUTPUT_NORM = "output_norm"; +static const char * LLM_TENSOR_OUTPUT = "output"; +static const char * LLM_TENSOR_ATTN_NORM = "blk.%d.attn_norm"; +static const char * LLM_TENSOR_ATTN_Q = "blk.%d.attn_q"; +static const char * LLM_TENSOR_ATTN_K = "blk.%d.attn_k"; +static const char * LLM_TENSOR_ATTN_V = "blk.%d.attn_v"; +static const char * LLM_TENSOR_ATTN_OUT = "blk.%d.attn_output"; +static const char * LLM_TENSOR_FFN_NORM = "blk.%d.ffn_norm"; +static const char * LLM_TENSOR_FFN_GATE = "blk.%d.ffn_gate"; +static const char * LLM_TENSOR_FFN_DOWN = "blk.%d.ffn_down"; +static const char * LLM_TENSOR_FFN_UP = "blk.%d.ffn_up"; -void print_params(struct my_llama_hparams * params) { +static void print_params(struct my_llama_hparams * params) { printf("%s: n_vocab: %d\n", __func__, params->n_vocab); printf("%s: n_ctx: %d\n", __func__, params->n_ctx); printf("%s: n_embd: %d\n", __func__, params->n_embd); @@ -296,7 +121,66 @@ void print_params(struct my_llama_hparams * params) { printf("%s: n_rot: %d\n", __func__, params->n_rot); } -void init_model(struct my_llama_model * model) { +static void set_param_model(struct my_llama_model * model) { + const auto& hparams = model->hparams; + + const uint32_t n_layer = hparams.n_layer; + + struct ggml_context* ctx = model->ctx; + + ggml_set_param(ctx, model->tok_embeddings); + ggml_set_param(ctx, model->norm); + ggml_set_param(ctx, model->output); + + for (uint32_t i = 0; i < n_layer; ++i) { + auto & layer = model->layers[i]; + + ggml_set_param(ctx, layer.attention_norm); + ggml_set_param(ctx, layer.wq); + ggml_set_param(ctx, layer.wk); + ggml_set_param(ctx, layer.wv); + ggml_set_param(ctx, layer.wo); + ggml_set_param(ctx, layer.ffn_norm); + ggml_set_param(ctx, layer.w1); + ggml_set_param(ctx, layer.w2); + ggml_set_param(ctx, layer.w3); + } +} + +static void alloc_model(struct ggml_allocr * alloc, struct my_llama_model * model) { + ggml_allocr_alloc(alloc, model->tok_embeddings); + ggml_allocr_alloc(alloc, model->norm); + ggml_allocr_alloc(alloc, model->output); + for (uint32_t i = 0; i < model->layers.size(); ++i) { + auto & layer = model->layers[i]; + ggml_allocr_alloc(alloc, layer.attention_norm); + ggml_allocr_alloc(alloc, layer.wq); + ggml_allocr_alloc(alloc, layer.wk); + ggml_allocr_alloc(alloc, layer.wv); + ggml_allocr_alloc(alloc, layer.wo); + ggml_allocr_alloc(alloc, layer.ffn_norm); + ggml_allocr_alloc(alloc, layer.w1); + ggml_allocr_alloc(alloc, layer.w2); + ggml_allocr_alloc(alloc, layer.w3); + } + ggml_allocr_alloc(alloc, model->tok_embeddings->grad); + ggml_allocr_alloc(alloc, model->norm->grad); + ggml_allocr_alloc(alloc, model->output->grad); + for (uint32_t i = 0; i < model->layers.size(); ++i) { + auto & layer = model->layers[i]; + ggml_allocr_alloc(alloc, layer.attention_norm->grad); + ggml_allocr_alloc(alloc, layer.wq->grad); + ggml_allocr_alloc(alloc, layer.wk->grad); + ggml_allocr_alloc(alloc, layer.wv->grad); + ggml_allocr_alloc(alloc, layer.wo->grad); + ggml_allocr_alloc(alloc, layer.ffn_norm->grad); + ggml_allocr_alloc(alloc, layer.w1->grad); + ggml_allocr_alloc(alloc, layer.w2->grad); + ggml_allocr_alloc(alloc, layer.w3->grad); + } +} + +static void init_model(struct my_llama_model * model) { const auto & hparams = model->hparams; const uint32_t n_embd = hparams.n_embd; @@ -304,11 +188,6 @@ void init_model(struct my_llama_model * model) { const uint32_t n_vocab = hparams.n_vocab; const uint32_t n_ff = hparams.n_ff; - struct ggml_context * ctx = model->ctx; - - model->train_its = 0; - model->train_samples = 0; - model->train_tokens = 0; std::vector tn_buf; tn_buf.resize(GGML_MAX_NAME); @@ -323,6 +202,15 @@ void init_model(struct my_llama_model * model) { return tn_buf.data(); }; + // context for model tensors without their data + struct ggml_init_params ctx_model_params; + ctx_model_params.mem_size = ggml_tensor_overhead()*2*(6 + n_layer*18); + ctx_model_params.mem_buffer = NULL; + ctx_model_params.no_alloc = true; + + struct ggml_context * ctx = ggml_init(ctx_model_params); + model->ctx = ctx; + model->tok_embeddings = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, n_embd, n_vocab); model->norm = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, n_embd); model->output = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, n_embd, n_vocab); @@ -361,288 +249,53 @@ void init_model(struct my_llama_model * model) { ggml_set_name(layer.w2, tni(LLM_TENSOR_FFN_DOWN, i)); ggml_set_name(layer.w3, tni(LLM_TENSOR_FFN_UP, i)); } + + set_param_model(model); + + // measure data size + struct ggml_allocr * alloc = NULL; + alloc = ggml_allocr_new_measure(tensor_alignment); + alloc_model(alloc, model); + + // allocate data + model->data.resize(ggml_allocr_max_size(alloc) + tensor_alignment); + ggml_allocr_free(alloc); + alloc = ggml_allocr_new(model->data.data(), model->data.size(), tensor_alignment); + alloc_model(alloc, model); + ggml_allocr_free(alloc); } -void set_param_model(struct my_llama_model * model) { - const auto& hparams = model->hparams; - - const uint32_t n_layer = hparams.n_layer; - - struct ggml_context* ctx = model->ctx; - - ggml_set_param(ctx, model->tok_embeddings); - ggml_set_param(ctx, model->norm); - ggml_set_param(ctx, model->output); - - for (uint32_t i = 0; i < n_layer; ++i) { - auto & layer = model->layers[i]; - - ggml_set_param(ctx, layer.attention_norm); - ggml_set_param(ctx, layer.wq); - ggml_set_param(ctx, layer.wk); - ggml_set_param(ctx, layer.wv); - ggml_set_param(ctx, layer.wo); - ggml_set_param(ctx, layer.ffn_norm); - ggml_set_param(ctx, layer.w1); - ggml_set_param(ctx, layer.w2); - ggml_set_param(ctx, layer.w3); - } -} - -void randomize_model(struct my_llama_model * model, int seed, float mean, float std, float min, float max) { +static void randomize_model(struct my_llama_model * model, int seed, float mean, float std, float min, float max) { const auto & hparams = model->hparams; const uint32_t n_layer = hparams.n_layer; - struct random_normal_distribution rnd; - init_random_normal_distribution(&rnd, seed, mean, std, min, max); + struct random_normal_distribution * rnd = init_random_normal_distribution(seed, mean, std, min, max); - randomize_tensor_normal(model->tok_embeddings, &rnd); - randomize_tensor_normal(model->norm, &rnd); - randomize_tensor_normal(model->output, &rnd); + randomize_tensor_normal(model->tok_embeddings, rnd); + randomize_tensor_normal(model->norm, rnd); + randomize_tensor_normal(model->output, rnd); for (uint32_t i = 0; i < n_layer; ++i) { auto & layer = model->layers[i]; - randomize_tensor_normal(layer.attention_norm, &rnd); + randomize_tensor_normal(layer.attention_norm, rnd); - randomize_tensor_normal(layer.wq, &rnd); - randomize_tensor_normal(layer.wk, &rnd); - randomize_tensor_normal(layer.wv, &rnd); - randomize_tensor_normal(layer.wo, &rnd); + randomize_tensor_normal(layer.wq, rnd); + randomize_tensor_normal(layer.wk, rnd); + randomize_tensor_normal(layer.wv, rnd); + randomize_tensor_normal(layer.wo, rnd); - randomize_tensor_normal(layer.ffn_norm, &rnd); + randomize_tensor_normal(layer.ffn_norm, rnd); - randomize_tensor_normal(layer.w1, &rnd); - randomize_tensor_normal(layer.w2, &rnd); - randomize_tensor_normal(layer.w3, &rnd); + randomize_tensor_normal(layer.w1, rnd); + randomize_tensor_normal(layer.w2, rnd); + randomize_tensor_normal(layer.w3, rnd); } + + free_random_normal_distribution(rnd); } -void assert_shape_1d(struct ggml_tensor * tensor, int64_t ne0) { - GGML_ASSERT(tensor->n_dims == 1); - GGML_ASSERT(tensor->ne[0] == ne0); -} - -void assert_shape_2d(struct ggml_tensor * tensor, int64_t ne0, int64_t ne1) { - GGML_ASSERT(tensor->n_dims == 2); - GGML_ASSERT(tensor->ne[0] == ne0); - GGML_ASSERT(tensor->ne[1] == ne1); -} - -void assert_shape_3d(struct ggml_tensor * tensor, int64_t ne0, int64_t ne1, int64_t ne2) { - GGML_ASSERT(tensor->n_dims == 3); - GGML_ASSERT(tensor->ne[0] == ne0); - GGML_ASSERT(tensor->ne[1] == ne1); - GGML_ASSERT(tensor->ne[2] == ne2); -} - -void assert_shape_4d(struct ggml_tensor * tensor, int64_t ne0, int64_t ne1, int64_t ne2, int64_t ne3) { - GGML_ASSERT(tensor->n_dims == 4); - GGML_ASSERT(tensor->ne[0] == ne0); - GGML_ASSERT(tensor->ne[1] == ne1); - GGML_ASSERT(tensor->ne[2] == ne2); - GGML_ASSERT(tensor->ne[3] == ne3); -} - -static size_t hash(void * p) { - return (size_t)p % GGML_GRAPH_HASHTABLE_SIZE; -} - -static size_t hash_find(void * hash_table[], void * p) { - size_t h = hash(p); - - // linear probing - size_t i = h; - while (hash_table[i] != NULL && hash_table[i] != p) { - i = (i + 1) % GGML_GRAPH_HASHTABLE_SIZE; - if (i == h) { - // visited all hash table entries -> not found - return GGML_GRAPH_HASHTABLE_SIZE; - } - } - return i; -} - -static bool hash_insert(void * hash_table[], void * p) { - //size_t h = hash(p); - size_t i = hash_find(hash_table, p); - - GGML_ASSERT(i < GGML_GRAPH_HASHTABLE_SIZE); // assert that not full - - if (hash_table[i] == p) { - return true; - } - - // insert - GGML_ASSERT(hash_table[i] == NULL); - hash_table[i] = p; - return false; -} - -static bool hash_contains(void * hash_table[], void * p) { - size_t i = hash_find(hash_table, p); - return (i < GGML_GRAPH_HASHTABLE_SIZE) && (hash_table[i] == p); -} - -struct hash_map { - void * keys[GGML_GRAPH_HASHTABLE_SIZE]; - void * vals[GGML_GRAPH_HASHTABLE_SIZE]; -}; -//static const size_t HASH_MAP_SIZE = sizeof(struct hash_map); - -struct hash_map * new_hash_map() { - struct hash_map * result = new struct hash_map; - for (int i=0; ikeys[i] = NULL; - result->vals[i] = NULL; - } - return result; -}; - -void free_hash_map(struct hash_map * map) { - delete map; -} - -static bool ggml_is_view(struct ggml_tensor * t) { - return t->op == GGML_OP_RESHAPE || t->op == GGML_OP_VIEW || t->op == GGML_OP_TRANSPOSE || - t->op == GGML_OP_PERMUTE || t->op == GGML_OP_CPY; -} - -static struct ggml_tensor * get_view_parent(struct ggml_tensor * t) { - switch (t->op) { - case GGML_OP_PERMUTE: - case GGML_OP_RESHAPE: - case GGML_OP_TRANSPOSE: - case GGML_OP_VIEW: - return t->src[0]; - case GGML_OP_CPY: - return t->src[1]; - default: - return NULL; - } -} - -static struct ggml_tensor * get_view_source(struct ggml_tensor * t) { - struct ggml_tensor * parent = t; - do { - parent = get_view_parent(parent); - } while (ggml_is_view(parent)); - return parent; -} - -struct ggml_tensor * ggml_recompute_graph_node( - struct ggml_context * ctx, - struct ggml_cgraph * graph, - struct hash_map * replacements, - struct ggml_tensor * node) { - - if (node == NULL) { - return NULL; - } - - if (node->is_param) { - return node; - } - - if (!hash_contains(graph->visited_hash_table, node)) { - return node; - } - - int count_children = 0; - for (int k = 0; k < GGML_MAX_SRC; ++k) { - if (node->src[k]) { - ++count_children; - } - } - - if (count_children == 0) { - return node; - } - - size_t i = hash_find(replacements->keys, node); - GGML_ASSERT(i < GGML_GRAPH_HASHTABLE_SIZE); // assert that not full - if (replacements->keys[i] == node) { - return (struct ggml_tensor *) replacements->vals[i]; - } - - struct ggml_tensor * clone = ggml_new_tensor(ctx, node->type, node->n_dims, node->ne); - - // insert clone into replacements - GGML_ASSERT(replacements->keys[i] == NULL); // assert that we don't overwrite - replacements->keys[i] = node; - replacements->vals[i] = clone; - - clone->op = node->op; - clone->grad = node->grad; - clone->is_param = node->is_param; - clone->extra = node->extra; - for (int k = 0; k < GGML_MAX_DIMS; ++k) { - clone->nb[k] = node->nb[k]; - } - for (int k = 0; k < GGML_MAX_SRC; ++k) { - clone->src[k] = ggml_recompute_graph_node(ctx, graph, replacements, node->src[k]); - } - if (ggml_is_view(clone)) { - struct ggml_tensor * source = get_view_source(clone); - GGML_ASSERT(source != NULL); - clone->data = source->data; - } - - GGML_ASSERT(sizeof(node->op_params) == sizeof(int32_t) * (GGML_MAX_OP_PARAMS / sizeof(int32_t))); - GGML_ASSERT(sizeof(node->name) == GGML_MAX_NAME); - memcpy(clone->op_params, node->op_params, sizeof(node->op_params)); - ggml_format_name(clone, "%s (clone)", ggml_get_name(node)); - - return clone; -}; - -void ggml_build_backward_gradient_checkpointing( - struct ggml_context * ctx, - struct ggml_cgraph * gf, - struct ggml_cgraph * gb, - struct ggml_cgraph * gb_tmp, - struct ggml_tensor * * checkpoints, - int n_checkpoints) { - *gb_tmp = *gf; - ggml_build_backward_expand(ctx, gf, gb_tmp, true); - - if (n_checkpoints <= 0) { - *gb = *gb_tmp; - return; - } - - struct hash_map * replacements = new_hash_map(); - - // insert checkpoints in replacements - for (int i = 0; i < n_checkpoints; ++i) { - size_t k = hash_find(replacements->keys, checkpoints[i]); - GGML_ASSERT(k < GGML_GRAPH_HASHTABLE_SIZE); // assert that not full - GGML_ASSERT(replacements->keys[k] == NULL); // assert that we don't overwrite - replacements->keys[k] = checkpoints[i]; - replacements->vals[k] = checkpoints[i]; - } - - *gb = *gf; - // rewrite gb_tmp->nodes[gf->n_nodes:gb_tmp->n_nodes], - // replacing references to gb_tmp->nodes[0:gf->n_nodes] ( == gf->nodes[0:gf->n_nodes]), - // by recomputing them from checkpoints - for (int i = gf->n_nodes; in_nodes; ++i) { - struct ggml_tensor * node = gb_tmp->nodes[i]; - for (int k = 0; k < GGML_MAX_SRC; ++k) { - // insert new tensors recomputing src, reusing already made replacements, - // remember replacements: remember new tensors with mapping from corresponding gf nodes - // recurse for input tensors, - // unless (i.e. terminating when) input tensors are checkpoints - node->src[k] = ggml_recompute_graph_node(ctx, gf, replacements, node->src[k]); - } - // insert rewritten backward node with replacements made into resulting backward graph gb - ggml_build_forward_expand(gb, node); - } - - free_hash_map(replacements); -} - -struct ggml_tensor * llama_build_train_graphs( +static struct ggml_tensor * llama_build_train_graphs( struct my_llama_model * model, struct ggml_allocr * alloc, struct ggml_context * ctx, @@ -714,7 +367,7 @@ struct ggml_tensor * llama_build_train_graphs( checkpoints.push_back(t00); checkpoints.push_back(t01); - struct ggml_tensor * kv_scale; + struct ggml_tensor * kv_scale = NULL; if (!enable_flash_attn) { kv_scale = ggml_new_f32(ctx, 1.0f/sqrtf(float(n_embd)/n_head)); } @@ -797,21 +450,14 @@ struct ggml_tensor * llama_build_train_graphs( ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, t36->grad, one)); // KQ_pos ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, KQ_pos, one)); - GGML_ASSERT(t36->grad->data == NULL && !ggml_is_view(t36->grad)); + GGML_ASSERT(t36->grad->data == NULL && t36->grad->view_src == NULL); + ggml_allocr_alloc(alloc, t36->grad); - // gradient tensors (will be set to zero by ggml_graph_reset) - // pinning these produces large unnecessary memory overhead, which will be resolved by PR 2632 - for (int i = 0; i < gf->n_nodes; ++i) { - if (!gf->grads[i]) continue; - if (gf->grads[i]->data == NULL && !ggml_is_view(gf->grads[i])) { - ggml_allocr_alloc(alloc, gf->grads[i]); - } - ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, gf->grads[i], one)); - } + // allocating checkpoints in one block to reduce memory fragmentation // note: they will be freed in reverse order for (int i = 0; i < (int) checkpoints.size(); ++i) { - if (checkpoints[i]->data == NULL && !ggml_is_view(checkpoints[i])) { + if (checkpoints[i]->data == NULL && checkpoints[i]->view_src == NULL) { ggml_allocr_alloc(alloc, checkpoints[i]); } } @@ -836,194 +482,6 @@ struct ggml_tensor * llama_build_train_graphs( return t36; } -void set_f32_3d(struct ggml_tensor * tensor, int64_t i0, int64_t i1, int64_t i2, float value) { - float * ptr = (float *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1] + i2*tensor->nb[2]); - *ptr = value; -} - -void set_f32_2d(struct ggml_tensor * tensor, int64_t i0, int64_t i1, float value) { - float * ptr = (float *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1]); - *ptr = value; -} - -void set_i32_2d(struct ggml_tensor * tensor, int64_t i0, int64_t i1, int32_t value) { - int32_t * ptr = (int32_t *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1]); - *ptr = value; -} - -float get_f32_2d(struct ggml_tensor * tensor, int64_t i0, int64_t i1) { - float * ptr = (float *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1]); - return *ptr; -} - -int32_t get_i32_2d(struct ggml_tensor * tensor, int64_t i0, int64_t i1) { - int32_t * ptr = (int32_t *) ((char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1]); - return *ptr; -} - -void print_row(struct ggml_tensor * probs, int i) { - for (int k = 0; k < probs->ne[0]; ++k) { - float p = get_f32_2d(probs, k, i); - printf(" %.2f", p); - } - printf("\n"); -} - -void print_matrix(struct ggml_tensor * probs) { - assert(probs->n_dims == 2); - for (int i = 0; i < probs->ne[1]; ++i) { - for (int k = 0; k < probs->ne[0]; ++k) { - float p = get_f32_2d(probs, k, i); - printf(" %.2f", p); - } - printf("\n"); - } -} - -void get_example_targets(struct llama_context * lctx, const int * train_samples, size_t n_train_samples, const llama_token * train_data, size_t n_train_data, int example_id, struct ggml_tensor * tokens_input, struct ggml_tensor * target_logits, struct ggml_tensor * target_probs) { - int n_tokens = tokens_input->ne[0]; - int n_vocab = target_logits->ne[0]; - - size_t sample = train_samples[example_id % n_train_samples]; - GGML_ASSERT(sample+n_tokens-1 < n_train_data); - - ggml_set_f32(target_logits, -1.0f/n_vocab); - ggml_set_f32(target_probs, 0.0f); - ggml_set_i32_1d(tokens_input, 0, llama_token_bos(lctx)); - for (int i=1; in_dims == 2); - GGML_ASSERT(target_logits->n_dims == 3); - GGML_ASSERT(target_probs->n_dims == 3); - int n_vocab = target_logits->ne[0]; - int n_tokens = tokens_input->ne[0]; - int n_batch = tokens_input->ne[1]; - GGML_ASSERT(n_tokens == target_logits->ne[1]); - GGML_ASSERT(n_batch == target_logits->ne[2]); - GGML_ASSERT(n_vocab == target_probs->ne[0]); - GGML_ASSERT(n_tokens == target_probs->ne[1]); - GGML_ASSERT(n_batch == target_probs->ne[2]); - - ggml_set_f32(target_logits, -1.0f/n_vocab); - ggml_set_f32(target_probs, 0.0f); - // printf("%s: example_id=%d n_batch=%d n_train_samples=%zu\n", __func__, example_id, n_batch, n_train_samples); - for (int k=0; k& out) { - FILE * fp = std::fopen(filename, "rb"); - if (fp == NULL) { - return 0; - } - -#ifdef _WIN32 - GGML_ASSERT(_fseeki64(fp, (__int64) 0, SEEK_END) == 0); -#else - GGML_ASSERT(std::fseek(fp, (long) 0, SEEK_END) == 0); -#endif - - size_t size = 0; -#ifdef _WIN32 - __int64 ret = _ftelli64(fp); - size = ret; -#else - long ret = std::ftell(fp); - size = ret; -#endif - -#ifdef _WIN32 - GGML_ASSERT(_fseeki64(fp, (__int64) 0, SEEK_SET) == 0); -#else - GGML_ASSERT(std::fseek(fp, (long) 0, SEEK_SET) == 0); -#endif - - std::vector buf; - buf.resize(size+1); - out.resize(size+1); - - if (std::fread(buf.data(), size, 1, fp) != 1) { - die("unexpectedly reached end of file"); - } - if (ferror(fp)) { - die_fmt("fread failed: %s", strerror(errno)); - } - - buf[size] = '\0'; - - int n_tokens = llama_tokenize(lctx, buf.data(), buf.size(), out.data(), out.size(), false); - if (n_tokens < 0) { - out.resize(-n_tokens); - n_tokens = llama_tokenize(lctx, buf.data(), buf.size(), out.data(), out.size(), false); - } - GGML_ASSERT(n_tokens >= 0); - out.resize(n_tokens); - - bool verify = false; - if (verify) { - const char * in = buf.data(); - const char * end = buf.data() + buf.size(); - for (int i = 0; i < (int) out.size(); ++i) { - std::string s = llama_token_to_piece(lctx, out[i]); - int len = s.length(); - if (in >= end) { - printf("%s: unexpected end of original text.\n", __func__); - break; - } - const bool matches = (strncmp(in, s.c_str(), len) == 0); - if (matches) { - in += len; - } else { - printf("%s: mismatch: expected '%s', but got '%s'\n", __func__, std::string(in, len).c_str(), s.c_str()); - } - } - } - - return n_tokens; -} - -void shuffle_ints(int * begin, int * end) { - if (end <= begin) return; - int max=begin[0]; - for (int i=1; i max) { - max = begin[i]; - } - } - std::vector vals; - vals.resize(max+1); - for (int i=0; itype == b->type); - GGML_ASSERT(ggml_are_same_shape(a, b)); - GGML_ASSERT(ggml_is_contiguous(a) && ggml_is_contiguous(b)); - - return true; -} - -void read_tensor_by_name(struct ggml_tensor * dst, struct ggml_context * ctx, const char * name) { - if (dst == NULL) { - return; - } - struct ggml_tensor * t = ggml_get_tensor(ctx, name); - GGML_ASSERT(are_same_layout(dst, t)); - memcpy(dst->data, t->data, ggml_nbytes(t)); - - if (strlen(ggml_get_name(dst)) == 0) { - ggml_set_name(dst, name); - } -} - -void load_opt_context_gguf(struct gguf_context * fctx, struct ggml_context * f_ggml_ctx, struct ggml_opt_context * opt) { - // NOTE: gguf_context must be initialized with f_ggml_ctx and no_alloc=false, otherwise tensor data can not be read - - uint32_t file_version; - GGUF_GET_KEY(fctx, file_version, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_OPTIMIZER_FILE_VERSION); - GGML_ASSERT(file_version == 0); - - GGUF_GET_KEY(fctx, opt->params.past, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_OPTIMIZER_CONVERGENCE_PAST_COUNT); - GGUF_GET_KEY(fctx, opt->iter, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_OPTIMIZER_ITERATION_COUNT); - GGUF_GET_KEY(fctx, opt->just_initialized, gguf_get_val_bool, GGUF_TYPE_BOOL, true, LLM_KV_OPTIMIZER_JUST_INITIALIZED); - - uint64_t nx; - GGUF_GET_KEY(fctx, nx, gguf_get_val_u64, GGUF_TYPE_UINT64, true, LLM_KV_OPTIMIZER_PARAMETER_COUNT); - opt->nx = (size_t) nx; - - // don't call ggml_opt_init until optimizer type and optimizer specific parameters are know - - std::string opt_type; - GGUF_GET_KEY(fctx, opt_type, gguf_get_val_str, GGUF_TYPE_STRING, true, LLM_KV_OPTIMIZER_TYPE); - if (opt_type == LLM_KV_OPTIMIZER_TYPE_ADAM) { - opt->params.type = GGML_OPT_ADAM; - - GGUF_GET_KEY(fctx, opt->adam.fx_best, gguf_get_val_f32, GGUF_TYPE_FLOAT32, true, LLM_KV_OPTIMIZER_ADAM_BEST_LOSS); - GGUF_GET_KEY(fctx, opt->adam.fx_prev, gguf_get_val_f32, GGUF_TYPE_FLOAT32, true, LLM_KV_OPTIMIZER_ADAM_PREVIOUS_LOSS); - GGUF_GET_KEY(fctx, opt->adam.n_no_improvement, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_OPTIMIZER_ADAM_NO_IMPROVEMENT_COUNT); - - GGML_ASSERT(opt->ctx != NULL); - ggml_opt_init(opt->ctx, opt, opt->params, opt->nx); - - read_tensor_by_name(opt->adam.m, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_ADAM_FIRST_MOMENTS); - read_tensor_by_name(opt->adam.v, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_ADAM_SECOND_MOMENTS); - read_tensor_by_name(opt->adam.pf, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_ADAM_PAST_LOSS_VALUES); - } else if (opt_type == LLM_KV_OPTIMIZER_TYPE_LBFGS) { - opt->params.type = GGML_OPT_LBFGS; - - GGUF_GET_KEY(fctx, opt->params.lbfgs.m, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_OPTIMIZER_LBFGS_APPROX_HESSIAN_COUNT); - GGUF_GET_KEY(fctx, opt->lbfgs.fx_best, gguf_get_val_f32, GGUF_TYPE_FLOAT32, true, LLM_KV_OPTIMIZER_LBFGS_BEST_LOSS); - GGUF_GET_KEY(fctx, opt->lbfgs.step, gguf_get_val_f32, GGUF_TYPE_FLOAT32, true, LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_STEP); - GGUF_GET_KEY(fctx, opt->lbfgs.j, gguf_get_val_i32, GGUF_TYPE_INT32, true, LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_J); - GGUF_GET_KEY(fctx, opt->lbfgs.k, gguf_get_val_i32, GGUF_TYPE_INT32, true, LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_K); - GGUF_GET_KEY(fctx, opt->lbfgs.end, gguf_get_val_i32, GGUF_TYPE_INT32, true, LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_END); - GGUF_GET_KEY(fctx, opt->lbfgs.n_no_improvement, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_OPTIMIZER_LBFGS_NO_IMPROVEMENT_COUNT); - - GGML_ASSERT(opt->ctx != NULL); - ggml_opt_init(opt->ctx, opt, opt->params, opt->nx); - - read_tensor_by_name(opt->lbfgs.x, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_CURRENT_PARAMETERS); - read_tensor_by_name(opt->lbfgs.xp, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_PREVIOUS_PARAMETERS); - read_tensor_by_name(opt->lbfgs.g, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_CURRENT_GRADIENTS); - read_tensor_by_name(opt->lbfgs.gp, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_PREVIOUS_GRADIENTS); - read_tensor_by_name(opt->lbfgs.d, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_SEARCH_DIRECTION); - read_tensor_by_name(opt->lbfgs.pf, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_PAST_LOSS_VALUES); - read_tensor_by_name(opt->lbfgs.lmal, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_ALPHA); - read_tensor_by_name(opt->lbfgs.lmys, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_YS); - read_tensor_by_name(opt->lbfgs.lms, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_S); - read_tensor_by_name(opt->lbfgs.lmy, f_ggml_ctx, LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_Y); - } else { - die("unknown optimizer type"); - } -} - -void save_opt_context_gguf(struct gguf_context * fctx, struct ggml_opt_context * opt) { - gguf_set_val_u32(fctx, LLM_KV_OPTIMIZER_FILE_VERSION, 0); - gguf_set_val_u32(fctx, LLM_KV_OPTIMIZER_CONVERGENCE_PAST_COUNT, opt->params.past); - gguf_set_val_u64(fctx, LLM_KV_OPTIMIZER_PARAMETER_COUNT, (uint64_t) opt->nx); - gguf_set_val_u32(fctx, LLM_KV_OPTIMIZER_ITERATION_COUNT, opt->iter); - gguf_set_val_bool(fctx, LLM_KV_OPTIMIZER_JUST_INITIALIZED, opt->just_initialized); - - switch (opt->params.type) { - case GGML_OPT_ADAM: - { - gguf_set_val_str(fctx, LLM_KV_OPTIMIZER_TYPE, LLM_KV_OPTIMIZER_TYPE_ADAM); - gguf_set_val_f32(fctx, LLM_KV_OPTIMIZER_ADAM_BEST_LOSS, opt->adam.fx_best); - gguf_set_val_f32(fctx, LLM_KV_OPTIMIZER_ADAM_PREVIOUS_LOSS, opt->adam.fx_prev); - gguf_set_val_u32(fctx, LLM_KV_OPTIMIZER_ADAM_NO_IMPROVEMENT_COUNT, opt->adam.n_no_improvement); - - ggml_set_name(opt->adam.m, LLM_TENSOR_OPTIMIZER_ADAM_FIRST_MOMENTS); - ggml_set_name(opt->adam.v, LLM_TENSOR_OPTIMIZER_ADAM_SECOND_MOMENTS); - if (opt->adam.pf) { - ggml_set_name(opt->adam.pf, LLM_TENSOR_OPTIMIZER_ADAM_PAST_LOSS_VALUES); - } - - gguf_add_tensor(fctx, opt->adam.m); - gguf_add_tensor(fctx, opt->adam.v); - if (opt->adam.pf) { - gguf_add_tensor(fctx, opt->adam.pf); - } - } break; - case GGML_OPT_LBFGS: - { - gguf_set_val_str(fctx, LLM_KV_OPTIMIZER_TYPE, LLM_KV_OPTIMIZER_TYPE_LBFGS); - gguf_set_val_u32(fctx, LLM_KV_OPTIMIZER_LBFGS_APPROX_HESSIAN_COUNT, opt->params.lbfgs.m); - gguf_set_val_f32(fctx, LLM_KV_OPTIMIZER_LBFGS_BEST_LOSS, opt->lbfgs.fx_best); - gguf_set_val_f32(fctx, LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_STEP, opt->lbfgs.step); - gguf_set_val_i32(fctx, LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_J, opt->lbfgs.j); - gguf_set_val_i32(fctx, LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_K, opt->lbfgs.k); - gguf_set_val_i32(fctx, LLM_KV_OPTIMIZER_LBFGS_LINE_SEARCH_END, opt->lbfgs.end); - gguf_set_val_u32(fctx, LLM_KV_OPTIMIZER_LBFGS_NO_IMPROVEMENT_COUNT, opt->lbfgs.n_no_improvement); - - ggml_set_name(opt->lbfgs.x, LLM_TENSOR_OPTIMIZER_LBFGS_CURRENT_PARAMETERS); - ggml_set_name(opt->lbfgs.xp, LLM_TENSOR_OPTIMIZER_LBFGS_PREVIOUS_PARAMETERS); - ggml_set_name(opt->lbfgs.g, LLM_TENSOR_OPTIMIZER_LBFGS_CURRENT_GRADIENTS); - ggml_set_name(opt->lbfgs.gp, LLM_TENSOR_OPTIMIZER_LBFGS_PREVIOUS_GRADIENTS); - ggml_set_name(opt->lbfgs.d, LLM_TENSOR_OPTIMIZER_LBFGS_SEARCH_DIRECTION); - if (opt->lbfgs.pf) { - ggml_set_name(opt->lbfgs.pf, LLM_TENSOR_OPTIMIZER_LBFGS_PAST_LOSS_VALUES); - } - ggml_set_name(opt->lbfgs.lmal, LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_ALPHA); - ggml_set_name(opt->lbfgs.lmys, LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_YS); - ggml_set_name(opt->lbfgs.lms, LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_S); - ggml_set_name(opt->lbfgs.lmy, LLM_TENSOR_OPTIMIZER_LBFGS_MEMORY_Y); - - gguf_add_tensor(fctx, opt->lbfgs.x); - gguf_add_tensor(fctx, opt->lbfgs.xp); - gguf_add_tensor(fctx, opt->lbfgs.g); - gguf_add_tensor(fctx, opt->lbfgs.gp); - gguf_add_tensor(fctx, opt->lbfgs.d); - if (opt->lbfgs.pf) { - gguf_add_tensor(fctx, opt->lbfgs.pf); - } - gguf_add_tensor(fctx, opt->lbfgs.lmal); - gguf_add_tensor(fctx, opt->lbfgs.lmys); - gguf_add_tensor(fctx, opt->lbfgs.lms); - gguf_add_tensor(fctx, opt->lbfgs.lmy); - } break; - } -} - -void load_llama_model_gguf(struct gguf_context * fctx, struct ggml_context * f_ggml_ctx, struct my_llama_model * model) { +static void load_llama_model_gguf(struct gguf_context * fctx, struct ggml_context * f_ggml_ctx, struct my_llama_model * model) { // NOTE: gguf_context must be initialized with f_ggml_ctx and no_alloc=false, otherwise tensor data can not be read std::string arch; @@ -1243,26 +549,26 @@ void load_llama_model_gguf(struct gguf_context * fctx, struct ggml_context * f_g init_model(model); - read_tensor_by_name(model->tok_embeddings, f_ggml_ctx, tn(LLM_TENSOR_TOKEN_EMBD)); - read_tensor_by_name(model->norm, f_ggml_ctx, tn(LLM_TENSOR_OUTPUT_NORM)); - read_tensor_by_name(model->output, f_ggml_ctx, tn(LLM_TENSOR_OUTPUT)); + copy_tensor_by_name(model->tok_embeddings, f_ggml_ctx, tn(LLM_TENSOR_TOKEN_EMBD)); + copy_tensor_by_name(model->norm, f_ggml_ctx, tn(LLM_TENSOR_OUTPUT_NORM)); + copy_tensor_by_name(model->output, f_ggml_ctx, tn(LLM_TENSOR_OUTPUT)); for (uint32_t i = 0; i < model->hparams.n_layer; ++i) { auto & layer = model->layers[i]; - read_tensor_by_name(layer.attention_norm, f_ggml_ctx, tni(LLM_TENSOR_ATTN_NORM, i)); - read_tensor_by_name(layer.wq, f_ggml_ctx, tni(LLM_TENSOR_ATTN_Q, i)); - read_tensor_by_name(layer.wk, f_ggml_ctx, tni(LLM_TENSOR_ATTN_K, i)); - read_tensor_by_name(layer.wv, f_ggml_ctx, tni(LLM_TENSOR_ATTN_V, i)); - read_tensor_by_name(layer.wo, f_ggml_ctx, tni(LLM_TENSOR_ATTN_OUT, i)); - read_tensor_by_name(layer.ffn_norm, f_ggml_ctx, tni(LLM_TENSOR_FFN_NORM, i)); - read_tensor_by_name(layer.w1, f_ggml_ctx, tni(LLM_TENSOR_FFN_GATE, i)); - read_tensor_by_name(layer.w2, f_ggml_ctx, tni(LLM_TENSOR_FFN_DOWN, i)); - read_tensor_by_name(layer.w3, f_ggml_ctx, tni(LLM_TENSOR_FFN_UP, i)); + copy_tensor_by_name(layer.attention_norm, f_ggml_ctx, tni(LLM_TENSOR_ATTN_NORM, i)); + copy_tensor_by_name(layer.wq, f_ggml_ctx, tni(LLM_TENSOR_ATTN_Q, i)); + copy_tensor_by_name(layer.wk, f_ggml_ctx, tni(LLM_TENSOR_ATTN_K, i)); + copy_tensor_by_name(layer.wv, f_ggml_ctx, tni(LLM_TENSOR_ATTN_V, i)); + copy_tensor_by_name(layer.wo, f_ggml_ctx, tni(LLM_TENSOR_ATTN_OUT, i)); + copy_tensor_by_name(layer.ffn_norm, f_ggml_ctx, tni(LLM_TENSOR_FFN_NORM, i)); + copy_tensor_by_name(layer.w1, f_ggml_ctx, tni(LLM_TENSOR_FFN_GATE, i)); + copy_tensor_by_name(layer.w2, f_ggml_ctx, tni(LLM_TENSOR_FFN_DOWN, i)); + copy_tensor_by_name(layer.w3, f_ggml_ctx, tni(LLM_TENSOR_FFN_UP, i)); } } -void save_llama_model_gguf(struct gguf_context * fctx, const char * fn_vocab_model, struct my_llama_model * model) { +static void save_llama_model_gguf(struct gguf_context * fctx, const char * fn_vocab_model, struct my_llama_model * model) { const char * arch = "llama"; enum llama_ftype ftype = LLAMA_FTYPE_ALL_F32; @@ -1405,7 +711,8 @@ void save_llama_model_gguf(struct gguf_context * fctx, const char * fn_vocab_mod } } -void save_llama_model_file(const char * filename, const char * fn_vocab_model, struct my_llama_model * model) { +static void save_llama_model_file(const char * filename, const char * fn_vocab_model, struct my_llama_model * model) { + printf("%s: saving to %s\n", __func__, filename); struct gguf_context * fctx = gguf_init_empty(); save_llama_model_gguf(fctx, fn_vocab_model, model); @@ -1416,32 +723,24 @@ void save_llama_model_file(const char * filename, const char * fn_vocab_model, s gguf_free(fctx); } -void load_checkpoint_gguf(struct gguf_context * fctx, struct ggml_context * f_ggml_ctx, struct my_llama_model * model, struct ggml_opt_context * opt) { +static void load_checkpoint_gguf(struct gguf_context * fctx, struct ggml_context * f_ggml_ctx, struct my_llama_model * model, struct train_state * train) { load_llama_model_gguf(fctx, f_ggml_ctx, model); - - uint32_t file_version; - GGUF_GET_KEY(fctx, file_version, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_FILE_VERSION); - GGML_ASSERT(file_version == 0); - - GGUF_GET_KEY(fctx, model->train_its, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_ITERATION_COUNT); - GGUF_GET_KEY(fctx, model->train_samples, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_SAMPLE_COUNT); - GGUF_GET_KEY(fctx, model->train_tokens, gguf_get_val_u32, GGUF_TYPE_UINT32, true, LLM_KV_TRAINING_TOKEN_COUNT); - - load_opt_context_gguf(fctx, f_ggml_ctx, opt); + if (load_train_state_gguf(fctx, f_ggml_ctx, train)) { + std::string train_type = LLM_KV_TRAINING_TYPE_TRAIN_MODEL; + GGUF_GET_KEY(fctx, train_type, gguf_get_val_str, GGUF_TYPE_STRING, false, LLM_KV_TRAINING_TYPE); + GGML_ASSERT(train_type == LLM_KV_TRAINING_TYPE_TRAIN_MODEL); + } else { + printf("%s: loaded llama model as checkpoint\n", __func__); + } } -void save_checkpoint_gguf(struct gguf_context * fctx, const char * fn_vocab_model, struct my_llama_model * model, struct ggml_opt_context * opt) { +static void save_checkpoint_gguf(struct gguf_context * fctx, const char * fn_vocab_model, struct my_llama_model * model, struct train_state * train) { + gguf_set_val_str(fctx, LLM_KV_TRAINING_TYPE, LLM_KV_TRAINING_TYPE_TRAIN_MODEL); save_llama_model_gguf(fctx, fn_vocab_model, model); - - gguf_set_val_u32(fctx, LLM_KV_TRAINING_FILE_VERSION, 0); - gguf_set_val_u32(fctx, LLM_KV_TRAINING_ITERATION_COUNT, model->train_its); - gguf_set_val_u32(fctx, LLM_KV_TRAINING_SAMPLE_COUNT, model->train_samples); - gguf_set_val_u32(fctx, LLM_KV_TRAINING_TOKEN_COUNT, model->train_tokens); - - save_opt_context_gguf(fctx, opt); + save_train_state_gguf(fctx, train); } -bool load_checkpoint_file(const char * filename, struct my_llama_model * model, struct ggml_opt_context * opt) { +static bool load_checkpoint_file(const char * filename, struct my_llama_model * model, struct train_state * train) { struct ggml_context * f_ggml_ctx; struct gguf_init_params params; params.no_alloc = false; @@ -1451,15 +750,16 @@ bool load_checkpoint_file(const char * filename, struct my_llama_model * model, return false; } - load_checkpoint_gguf(fctx, f_ggml_ctx, model, opt); + load_checkpoint_gguf(fctx, f_ggml_ctx, model, train); return true; } -void save_checkpoint_file(const char * filename, const char * fn_vocab_model, struct my_llama_model * model, struct ggml_opt_context * opt) { +static void save_checkpoint_file(const char * filename, const char * fn_vocab_model, struct my_llama_model * model, struct train_state * train) { + printf("%s: saving to %s\n", __func__, filename); struct gguf_context * fctx = gguf_init_empty(); - save_checkpoint_gguf(fctx, fn_vocab_model, model, opt); + save_checkpoint_gguf(fctx, fn_vocab_model, model, train); // write file const bool only_meta = false; @@ -1467,33 +767,13 @@ void save_checkpoint_file(const char * filename, const char * fn_vocab_model, st gguf_free(fctx); } -float cosine_decay(const int decay_steps, const float minimum, int step) { - if (step > decay_steps) { - step = decay_steps; - } - const float cosine_decay = 0.50f*(1.0f + cosf(3.14159265359f*step/decay_steps)); - const float decay = (1 - minimum)*cosine_decay + minimum; - return decay; -} - -float cosine_decay_restart(int decay_steps, const float minimum, int step, float restart_step_mult, bool enable_restart) { - if (enable_restart) { - while (step > decay_steps) { - step -= decay_steps; - decay_steps = (int) restart_step_mult * decay_steps; - } - } - return cosine_decay(decay_steps, minimum, step); -} - struct train_params { + struct train_params_common common; + const char * fn_vocab_model; - const char * fn_train_data; - const char * fn_checkpoint_in; - const char * fn_checkpoint_out; const char * fn_model_out; - uint32_t seed; + bool only_write_model; int n_ctx; int n_embd; @@ -1501,58 +781,18 @@ struct train_params { int n_layer; int n_ff; - int n_threads; - int n_batch; - int n_examples; - float f_norm_rms_eps; float rope_freq_base; float rope_freq_scale; - - int print_info_interval; - - bool samples_start_after_nl; - bool use_adam; - bool use_flash; - bool use_checkpointing; - bool use_alloc; - - // only adam - int warmup; - int cos_decay_steps; - float cos_decay_restart; - float cos_decay_min; - bool enable_restart; - - int opt_past; - float opt_delta; - int opt_max_no_improvement; - - int lbfgs_n_iter; - int adam_n_iter; - float adam_alpha; - float adam_min_alpha; - float adam_decay; - int adam_decay_min_ndim; - float adam_beta1; - float adam_beta2; - float adam_gclip; - float adam_eps_f; - - int mem_model_gb; - int mem_compute_gb; - int mem_compute0_gb; }; struct train_params get_default_train_params() { struct train_params params; + params.common = get_default_train_params_common(); params.fn_vocab_model = "ggml-vic7b-uncensored-q4_0.bin"; - params.fn_train_data = "shakespeare.txt"; - params.fn_checkpoint_in = "checkpoint.bin"; - params.fn_checkpoint_out = "checkpoint.bin"; params.fn_model_out = "ggml-checkpoint-f32.bin"; - params.seed = -1; + params.only_write_model = false; params.n_ctx = 128; params.n_embd = 256; @@ -1560,62 +800,22 @@ struct train_params get_default_train_params() { params.n_layer = 16; params.n_ff = 768; - params.n_threads = 6; - params.n_batch = 8; - params.n_examples = 1; - - params.f_norm_rms_eps = 1e-5; + params.f_norm_rms_eps = 1e-5f; params.rope_freq_base = 10000.0f; params.rope_freq_scale = 1.0f; - params.print_info_interval = 1; - - params.samples_start_after_nl = false; - params.use_adam = true; - params.use_flash = true; - params.use_checkpointing = true; - params.use_alloc = true; - - params.opt_past = 0; - params.opt_delta = 1e-5f; - params.opt_max_no_improvement = 0; - - // only adam - params.warmup = 100; - params.cos_decay_steps = 1000; - params.cos_decay_restart = 1.1f; - params.cos_decay_min = 0.1f; - params.enable_restart = false; - - params.lbfgs_n_iter = 256; - params.adam_n_iter = 256; - params.adam_alpha = 1e-3f; - params.adam_min_alpha = 0; - params.adam_decay = 1e-1f; - params.adam_decay_min_ndim = 2; - params.adam_beta1 = 0.9f; - params.adam_beta2 = 0.999f; - params.adam_gclip = 1.0f; - params.adam_eps_f = 0.0f; - - params.mem_model_gb = 2; - params.mem_compute_gb = 24; - params.mem_compute0_gb = 8; return params; } -void train_print_usage(int /*argc*/, char ** argv, const struct train_params * params) { +static void train_print_usage(int argc, char ** argv, const struct train_params * params) { fprintf(stderr, "usage: %s [options]\n", argv[0]); fprintf(stderr, "\n"); fprintf(stderr, "options:\n"); fprintf(stderr, " -h, --help show this help message and exit\n"); + fprintf(stderr, " --vocab-model FNAME model path from which to load vocab (default '%s')\n", params->fn_vocab_model); - fprintf(stderr, " --train-data FNAME path from which to load training data (default '%s')\n", params->fn_train_data); - fprintf(stderr, " --checkpoint-in FNAME path from which to load training checkpoint (default '%s')\n", params->fn_checkpoint_in); - fprintf(stderr, " --checkpoint-out FNAME path to save training checkpoint (default '%s')\n", params->fn_checkpoint_out); fprintf(stderr, " --model-out FNAME path to save ggml model (default '%s')\n", params->fn_model_out); - fprintf(stderr, " -s SEED, --seed SEED RNG seed (default: -1, use random seed for -1)\n"); - fprintf(stderr, " -c N, --ctx N Context size used during training (default %d)\n", params->n_ctx); + fprintf(stderr, " --only-write-model only save llama model, don't do any training. use this if you only want to convert a checkpoint to a model.\n"); fprintf(stderr, " --embd N Embedding size used for new models (default %d)\n", params->n_embd); fprintf(stderr, " --ff N Feedforward size used for new models. (default %d)\n", params->n_ff); fprintf(stderr, " --head N Number of heads for new models (default %d)\n", params->n_head); @@ -1623,45 +823,11 @@ void train_print_usage(int /*argc*/, char ** argv, const struct train_params * p fprintf(stderr, " --norm-rms-eps F RMS-Norm epsilon value (default %f)\n", params->f_norm_rms_eps); fprintf(stderr, " --rope-freq-base F Frequency base for ROPE (default %f)\n", params->rope_freq_base); fprintf(stderr, " --rope-freq-scale F Frequency scale for ROPE (default %f)\n", params->rope_freq_scale); - fprintf(stderr, " -t N, --threads N Number of threads (default %d)\n", params->n_threads); - fprintf(stderr, " -b N, --batch N Parallel batch size (default %d)\n", params->n_batch); - fprintf(stderr, " -n N, --examples N Number of examples to train (default %d)\n", params->n_examples); - fprintf(stderr, " --print-info-interval N Print infos during training each N examples (default %d)\n", params->print_info_interval); - fprintf(stderr, " --samples-after-nl Training samples start after newlines. (default %s)\n", params->samples_start_after_nl ? "on" : "off"); - fprintf(stderr, " --use-lbfgs Use LBFGS optimizer instead of default Adam\n"); - fprintf(stderr, " --use-adam Use Adam optimizer (default)\n"); - fprintf(stderr, " --no-flash Don't use flash attention \n"); - fprintf(stderr, " --use-flash Use flash attention (default)\n"); - fprintf(stderr, " --no-checkpointing Don't use gradient checkpointing\n"); - fprintf(stderr, " --use-checkpointing Use gradient checkpointing (default)\n"); - fprintf(stderr, " --no-alloc Don't use allocator\n"); - fprintf(stderr, " --use-alloc Use allocator (default)\n"); - fprintf(stderr, " --warmup N Only for Adam optimizer. Number of warmup steps (default %d)\n", params->warmup); - fprintf(stderr, " --cos-decay-steps N Only for Adam optimizer. Number of cosine decay steps (default %d)\n", params->cos_decay_steps); - fprintf(stderr, " --cos-decay-restart N Only for Adam optimizer. Increase of cosine decay steps after restart (default %f)\n", params->cos_decay_restart); - fprintf(stderr, " --cos-decay-min N Only for Adam optimizer. Cosine decay minimum (default %f)\n", params->cos_decay_min); - fprintf(stderr, " --enable-restart N Only for Adam optimizer. Enable restarts of cos-decay %s\n", params->enable_restart ? "(default)" : ""); - fprintf(stderr, " --disable-restart N Only for Adam optimizer. Disable restarts of cos-decay %s\n", !params->enable_restart ? "(default)" : ""); - fprintf(stderr, " --opt-past N Number of optimization iterations to track for delta convergence test. Disabled when zero. (default %d)\n", params->opt_past); - fprintf(stderr, " --opt-delta N Maximum delta for delta convergence test. Disabled when <= zero. (default %f)\n", params->opt_delta); - fprintf(stderr, " --opt-max-no-improvement N Maximum number of optimization iterations with no improvement. Disabled when <= zero. (default %d)\n", params->opt_max_no_improvement); - fprintf(stderr, " --adam-epsf N AdamW epsilon for convergence test. Disabled when <= zero. (default %f)\n", params->adam_eps_f); - fprintf(stderr, " --adam-iter N Maximum number of Adam optimization iterations for each batch (default %d)\n", params->adam_n_iter); - fprintf(stderr, " --adam-alpha N Adam learning rate alpha (default %f)\n", params->adam_alpha); - fprintf(stderr, " --adam-min-alpha N Adam minimum learning rate alpha - including warmup phase (default %f)\n", params->adam_min_alpha); - fprintf(stderr, " --adam-decay N AdamW weight decay. Values greater zero enable AdamW instead of regular Adam. (default %f)\n", params->adam_decay); - fprintf(stderr, " --adam-decay-min-ndim N Minimum number of tensor dimensions to apply AdamW weight decay. Weight decay is not applied to tensors with less n_dims. (default %d)\n", params->adam_decay_min_ndim); - fprintf(stderr, " --adam-beta1 N AdamW beta1 in interval [0,1). How much to smooth the first moment of gradients. (default %f)\n", params->adam_beta1); - fprintf(stderr, " --adam-beta2 N AdamW beta2 in interval [0,1). How much to smooth the second moment of gradients. (default %f)\n", params->adam_beta2); - fprintf(stderr, " --adam-gclip N AdamW gradient clipping. Disabled when zero. (default %f)\n", params->adam_gclip); - fprintf(stderr, " --lbfgs-iter N Maximum number of LBFGS optimization iterations for each batch (default %d)\n", params->lbfgs_n_iter); - fprintf(stderr, " --mem-model N Memory to allocate for model and cache in gigabytes. (default %d)\n", params->mem_model_gb); - fprintf(stderr, " --mem-compute N Memory to allocate for compute in gigabytes. (default %d)\n", params->mem_compute_gb); - fprintf(stderr, " --mem-compute0 N Memory to allocate for automatic memory allocator in gigabytes. (default %d)\n", params->mem_compute0_gb); - fprintf(stderr, "\n"); + + print_common_train_usage(argc, argv, ¶ms->common); } -bool train_params_parse(int argc, char ** argv, struct train_params * params) { +static bool train_params_parse(int argc, char ** argv, struct train_params * params) { bool invalid_param = false; std::string arg; struct train_params default_params = get_default_train_params(); @@ -1673,48 +839,27 @@ bool train_params_parse(int argc, char ** argv, struct train_params * params) { std::replace(arg.begin(), arg.end(), '_', '-'); } - if (arg == "--vocab-model") { + if (consume_common_train_arg(argc, argv, &i, ¶ms->common, &invalid_param)) { + if (invalid_param) { + break; + } else if (params->common.print_usage) { + train_print_usage(argc, argv, &default_params); + exit(0); + } + } else if (arg == "--vocab-model") { if (++i >= argc) { invalid_param = true; break; } params->fn_vocab_model = argv[i]; - } else if (arg == "--train-data") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->fn_train_data = argv[i]; - } else if (arg == "--checkpoint-in") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->fn_checkpoint_in = argv[i]; - } else if (arg == "--checkpoint-out") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->fn_checkpoint_out = argv[i]; } else if (arg == "--model-out") { if (++i >= argc) { invalid_param = true; break; } params->fn_model_out = argv[i]; - } else if (arg == "-s" || arg == "--seed") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->seed = std::stoi(argv[i]); - } else if (arg == "-c" || arg == "--ctx") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->n_ctx = std::stoi(argv[i]); + } else if (arg == "--only-write-model") { + params->only_write_model = true; } else if (arg == "--embd") { if (++i >= argc) { invalid_param = true; @@ -1757,175 +902,6 @@ bool train_params_parse(int argc, char ** argv, struct train_params * params) { break; } params->rope_freq_scale = std::stof(argv[i]); - } else if (arg == "-t" || arg == "--threads") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->n_threads = std::stoi(argv[i]); - } else if (arg == "-b" || arg == "--batch") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->n_batch = std::stoi(argv[i]); - } else if (arg == "-n" || arg == "--examples") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->n_examples = std::stoi(argv[i]); - } else if (arg == "--print-info-interval") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->print_info_interval = std::stoi(argv[i]); - } else if (arg == "--samples-after-nl") { - params->samples_start_after_nl = true; - } else if (arg == "--use-lbfgs") { - params->use_adam = false; - } else if (arg == "--use-adam") { - params->use_adam = true; - } else if (arg == "--no-flash") { - params->use_flash = false; - } else if (arg == "--use-flash") { - params->use_flash = true; - } else if (arg == "--no-checkpointing") { - params->use_checkpointing = false; - } else if (arg == "--use-checkpointing") { - params->use_checkpointing = true; - } else if (arg == "--no-alloc") { - params->use_alloc = false; - } else if (arg == "--use-alloc") { - params->use_alloc = true; - } else if (arg == "--warmup") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->warmup = std::stoi(argv[i]); - } else if (arg == "--cos-decay-steps") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->cos_decay_steps = std::stof(argv[i]); - } else if (arg == "--cos-decay-restart") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->cos_decay_restart = std::stof(argv[i]); - } else if (arg == "--cos-decay-min") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->cos_decay_min = std::stof(argv[i]); - } else if (arg == "--enable-restart") { - params->enable_restart = true; - } else if (arg == "--disable-restart") { - params->enable_restart = false; - } else if (arg == "--opt-past") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->opt_past = std::stoi(argv[i]); - } else if (arg == "--opt-delta") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->opt_delta = std::stof(argv[i]); - } else if (arg == "--opt-max-no-improvement") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->opt_max_no_improvement = std::stoi(argv[i]); - } else if (arg == "--adam-epsf") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->adam_eps_f = std::stof(argv[i]); - } else if (arg == "--adam-iter") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->adam_n_iter = std::stoi(argv[i]); - } else if (arg == "--adam-alpha") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->adam_alpha = std::stof(argv[i]); - } else if (arg == "--adam-min-alpha") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->adam_min_alpha = std::stof(argv[i]); - } else if (arg == "--adam-decay") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->adam_decay = std::stof(argv[i]); - } else if (arg == "--adam-decay-min-ndim") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->adam_decay_min_ndim = std::stoi(argv[i]); - } else if (arg == "--adam-beta1") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->adam_beta1 = std::stof(argv[i]); - } else if (arg == "--adam-beta2") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->adam_beta2 = std::stof(argv[i]); - } else if (arg == "--adam-gclip") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->adam_gclip = std::stof(argv[i]); - } else if (arg == "--lbfgs-iter") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->lbfgs_n_iter = std::stoi(argv[i]); - } else if (arg == "--mem-model") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->mem_model_gb = std::stoi(argv[i]); - } else if (arg == "--mem-compute") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->mem_compute_gb = std::stoi(argv[i]); - } else if (arg == "--mem-compute0") { - if (++i >= argc) { - invalid_param = true; - break; - } - params->mem_compute0_gb = std::stoi(argv[i]); - } else if (arg == "-h" || arg == "--help") { - train_print_usage(argc, argv, &default_params); - exit(0); } else { fprintf(stderr, "error: unknown argument: %s\n", arg.c_str()); train_print_usage(argc, argv, &default_params); @@ -1937,65 +913,54 @@ bool train_params_parse(int argc, char ** argv, struct train_params * params) { train_print_usage(argc, argv, &default_params); exit(1); } + finish_processing_train_args(¶ms->common); return true; } -struct opt_callback_data { - struct train_params * params; - struct ggml_opt_context * opt; - struct llama_context * lctx; - llama_token * tokens_data; - size_t tokens_size; - int * samples_data; - size_t samples_size; - int shuffle_countdown; - struct ggml_tensor * tokens_input; - struct ggml_tensor * target_logits; - struct ggml_tensor * target_probs; +struct save_train_files_data { + const char * fn_checkpoint_out; + const char * fn_model_out; + const char * fn_vocab_model; + const char * pattern_fn_it; + const char * fn_latest; + struct my_llama_model * model; }; -void opt_callback(void * vdata, float * sched) { - struct opt_callback_data * data = (struct opt_callback_data *) vdata; - struct train_params * params = data->params; - struct ggml_opt_context * opt = data->opt; - int n_batch = params->n_batch; +static void save_train_files(void * vdata, struct train_state * train) { + struct save_train_files_data * data = (struct save_train_files_data *) vdata; + int64_t iter = train->opt->iter; - *sched = (opt->iter < params->warmup) - ? (float) opt->iter / (float) params->warmup - : cosine_decay_restart( - params->cos_decay_steps, - params->cos_decay_min, - opt->iter - params->warmup, - params->cos_decay_restart, - params->enable_restart); - float min_sched = params->adam_min_alpha / params->adam_alpha; - *sched = min_sched + *sched * (1.0f - min_sched); + if (strlen(data->fn_checkpoint_out) > 0) { + save_checkpoint_file(get_train_filename(data->fn_checkpoint_out, data->pattern_fn_it, data->fn_latest, iter).c_str(), data->fn_vocab_model, data->model, train); + save_checkpoint_file(get_train_filename(data->fn_checkpoint_out, data->pattern_fn_it, data->fn_latest, -1 ).c_str(), data->fn_vocab_model, data->model, train); - int impr_plot = std::isnan(opt->loss_after) ? 0 : -std::lround(1 + (opt->loss_before - opt->loss_after) * 10.0f); - printf("%s: iter=%*d, sched=%f loss0=%f loss=%f | improvement: %*d>\n", __func__, 6, opt->iter, *sched, opt->loss_before, opt->loss_after, impr_plot, (int)0); - - if (data->shuffle_countdown < n_batch) { - printf("%s: reshuffle samples\n", __func__); - shuffle_ints(data->samples_data, data->samples_data + data->samples_size); - for (int i = 0; i < (int) data->samples_size; ++i) { - GGML_ASSERT(data->samples_data[i]+params->n_ctx-1 < (int) data->tokens_size); - } - data->shuffle_countdown = data->samples_size; } + if (strlen(data->fn_model_out) > 0) { + save_llama_model_file(get_train_filename(data->fn_model_out, data->pattern_fn_it, data->fn_latest, iter).c_str(), data->fn_vocab_model, data->model); + save_llama_model_file(get_train_filename(data->fn_model_out, data->pattern_fn_it, data->fn_latest, -1 ).c_str(), data->fn_vocab_model, data->model); + } +} - get_example_targets_batch( - data->lctx, - data->samples_data, - data->samples_size, - data->tokens_data, - data->tokens_size, - opt->iter, - data->tokens_input, - data->target_logits, - data->target_probs); +static int64_t get_parameter_count(struct my_llama_model* model) { + int64_t nx = 0; + nx += ggml_nelements(model->tok_embeddings); + nx += ggml_nelements(model->norm); + nx += ggml_nelements(model->output); - data->shuffle_countdown -= n_batch; + for (uint32_t i = 0; i < model->layers.size(); ++i) { + auto & layer = model->layers[i]; + nx += ggml_nelements(layer.attention_norm); + nx += ggml_nelements(layer.wq); + nx += ggml_nelements(layer.wk); + nx += ggml_nelements(layer.wv); + nx += ggml_nelements(layer.wo); + nx += ggml_nelements(layer.ffn_norm); + nx += ggml_nelements(layer.w1); + nx += ggml_nelements(layer.w2); + nx += ggml_nelements(layer.w3); + } + return nx; } int main(int argc, char ** argv) { @@ -2005,11 +970,11 @@ int main(int argc, char ** argv) { return 1; } - if (params.seed == LLAMA_DEFAULT_SEED) { - params.seed = time(NULL); + if (params.common.seed == LLAMA_DEFAULT_SEED) { + params.common.seed = time(NULL); } - printf("%s: seed: %u\n", __func__, params.seed); - srand(params.seed); + printf("%s: seed: %u\n", __func__, params.common.seed); + srand(params.common.seed); struct llama_context_params llama_params = llama_context_default_params(); llama_params.vocab_only = true; @@ -2017,16 +982,9 @@ int main(int argc, char ** argv) { struct llama_model * lmodel = llama_load_model_from_file(params.fn_vocab_model, llama_params); struct llama_context * lctx = llama_new_context_with_model(lmodel, llama_params); - printf("%s: tokenize training data\n", __func__); - std::vector train_tokens; - if (tokenize_file(lctx, params.fn_train_data, train_tokens) < 0) { - fprintf(stderr, "%s: failed to tokenize file '%s'\n", __func__, params.fn_train_data); - } - printf("%s: number of training tokens: %d\n", __func__, (int) train_tokens.size()); - struct my_llama_model model; model.hparams.n_vocab = llama_n_vocab(lctx); - model.hparams.n_ctx = params.n_ctx; + model.hparams.n_ctx = params.common.n_ctx; model.hparams.n_embd = params.n_embd; model.hparams.n_head = params.n_head; model.hparams.n_layer = params.n_layer; @@ -2037,243 +995,311 @@ int main(int argc, char ** argv) { model.hparams.rope_freq_base = params.rope_freq_base; model.hparams.rope_freq_scale = params.rope_freq_scale; + struct train_state * train = init_train_state(); + struct ggml_opt_context * opt = train->opt; + + // set opt params from command line + opt->params = ggml_opt_default_params(GGML_OPT_ADAM); + opt->params.print_forward_graph = false; + opt->params.print_backward_graph = false; + opt->params.n_threads = params.common.n_threads; + opt->params.past = params.common.opt_past; + opt->params.delta = params.common.opt_delta; + opt->params.max_no_improvement = params.common.opt_max_no_improvement; + opt->params.n_gradient_accumulation = params.common.n_gradient_accumulation; + opt->params.adam.n_iter = params.common.adam_n_iter; + opt->params.adam.sched = 1.0f; + opt->params.adam.alpha = params.common.adam_alpha; + opt->params.adam.decay = params.common.adam_decay; + opt->params.adam.decay_min_ndim = params.common.adam_decay_min_ndim; + opt->params.adam.beta1 = params.common.adam_beta1; + opt->params.adam.beta2 = params.common.adam_beta2; + opt->params.adam.gclip = params.common.adam_gclip; + opt->params.adam.eps_f = params.common.adam_eps_f; + + printf("%s: init model\n", __func__); + bool existed = load_checkpoint_file(params.common.fn_checkpoint_in, &model, train); + if (existed) { + // overwrite last n_ctx with user provided n_ctx + if (params.common.custom_n_ctx) { + model.hparams.n_ctx = params.common.n_ctx; + } + + const bool opt_past_changed = opt->params.past != params.common.opt_past; + + if (opt_past_changed) { + die("Optimizer parameter '--opt-past N' differs from checkpoint file. To use different value train from scratch with empty input checkpoint, e.g --checkpoint-in ''. Aborting"); + // need to discard previous optimizer past function value statistics and opt_init with new shapes + // TODO + } + } else { + init_model(&model); + randomize_model(&model, params.common.seed, 0.0f, 1.0f, -1.0f, +1.0f); + if (!params.only_write_model) { + ggml_opt_init(opt->ctx, opt, opt->params, get_parameter_count(&model)); + } + } + opt->iter = train->train_its; + print_params(&model.hparams); + printf("%s: total train_iterations %llu\n", __func__, (long long unsigned) train->train_its); + printf("%s: seen train_samples %llu\n", __func__, (long long unsigned) train->train_samples); + printf("%s: seen train_tokens %llu\n", __func__, (long long unsigned) train->train_tokens); + printf("%s: completed train_epochs %llu\n", __func__, (long long unsigned) train->train_epochs); + printf("%s: model_size = %zu bytes (%.1f MB)\n", __func__, (ggml_used_mem(model.ctx) + model.data.size()), (float) (ggml_used_mem(model.ctx) + model.data.size()) / (1024.0f*1024.0f)); - std::vector token_noccurs; - std::vector token_notavail; - token_noccurs.resize(model.hparams.n_vocab, 0); - token_notavail.resize(model.hparams.n_vocab, true); - for (int i = 0; i < (int) train_tokens.size(); ++i) { - ++token_noccurs[train_tokens[i]]; - token_notavail[train_tokens[i]] = false; + if (params.only_write_model) { + save_train_files_data save_data; + save_data.fn_checkpoint_out = ""; + save_data.fn_model_out = params.fn_model_out; + save_data.fn_vocab_model = params.fn_vocab_model; + save_data.pattern_fn_it = params.common.pattern_fn_it; + save_data.fn_latest = params.common.fn_latest; + save_data.model = &model; + + save_train_files(&save_data, train); + + free_train_state(train); + ggml_free(model.ctx); + llama_free(lctx); + llama_free_model(lmodel); + return 0; } - std::vector token_freq; - token_freq.resize(model.hparams.n_vocab, 0); - int n_unique_tokens = 0; - for (int i = 0; i < (int) token_noccurs.size(); ++i) { - token_freq[i] = (float) token_noccurs[i] / (float) train_tokens.size(); - n_unique_tokens += (token_noccurs[i] > 0) ? 1 : 0; - } - printf("%s: number of unique tokens: %d\n", __func__, n_unique_tokens); - - struct ggml_init_params lcparams; - lcparams.mem_size = 1024ll*1024ll*1024ll*((size_t) params.mem_model_gb); - lcparams.mem_buffer = NULL; - lcparams.no_alloc = false; - - model.ctx = ggml_init(lcparams); + printf("%s: opt_size = %zu bytes (%.1f MB)\n", __func__, ggml_get_mem_size(opt->ctx), (float) ggml_get_mem_size(opt->ctx) / (1024.0f*1024.0f)); + printf("%s: opt iter %d\n", __func__, opt->iter); int n_tokens = model.hparams.n_ctx; int n_vocab = model.hparams.n_vocab; - int n_batch = params.n_batch; + int n_batch = params.common.n_batch; - struct ggml_opt_context * opt = (struct ggml_opt_context *) alloca(sizeof(struct ggml_opt_context)); - memset(opt, 0, sizeof(struct ggml_opt_context)); - - struct ggml_opt_params opt_params_adam = ggml_opt_default_params(GGML_OPT_ADAM); - struct ggml_opt_params opt_params_lbfgs = ggml_opt_default_params(GGML_OPT_LBFGS); - opt_params_adam.print_forward_graph = false; - opt_params_adam.print_backward_graph = false; - opt_params_adam.n_threads = params.n_threads; - opt_params_adam.past = params.opt_past; - opt_params_adam.delta = params.opt_delta; - opt_params_adam.max_no_improvement = params.opt_max_no_improvement; - opt_params_adam.adam.n_iter = params.adam_n_iter; - opt_params_adam.adam.sched = 1.0f; - opt_params_adam.adam.alpha = params.adam_alpha; - opt_params_adam.adam.decay = params.adam_decay; - opt_params_adam.adam.decay_min_ndim = params.adam_decay_min_ndim; - opt_params_adam.adam.beta1 = params.adam_beta1; - opt_params_adam.adam.beta2 = params.adam_beta2; - opt_params_adam.adam.gclip = params.adam_gclip; - opt_params_adam.adam.eps_f = params.adam_eps_f; - - opt_params_lbfgs.print_forward_graph = false; - opt_params_lbfgs.print_backward_graph = false; - opt_params_lbfgs.n_threads = params.n_threads; - opt_params_adam.past = params.opt_past; - opt_params_adam.delta = params.opt_delta; - opt_params_adam.max_no_improvement = params.opt_max_no_improvement; - opt_params_lbfgs.lbfgs.n_iter = params.lbfgs_n_iter; - - opt->ctx = model.ctx; - opt->params = params.use_adam ? opt_params_adam : opt_params_lbfgs; - - printf("%s: init model\n", __func__); - bool existed = load_checkpoint_file(params.fn_checkpoint_in, &model, opt); - if (!existed) { - init_model(&model); - } - set_param_model(&model); - - opt->params = params.use_adam ? opt_params_adam : opt_params_lbfgs; - - opt->iter = model.train_its; - printf("%s: opt iter %d\n", __func__, opt->iter); - - bool from_scratch = !existed; - if (from_scratch) { - randomize_model(&model, params.seed, 0.0f, 1.0f, -1.0f, +1.0f); - } - - printf("used_mem model: %zu bytes\n", ggml_used_mem(model.ctx)); - // ggml_print_tensor_objects(model.ctx); - - // TODO: use std::vector intead of "new" - size_t compute_size = 1024ll*1024ll*1024ll*((size_t) params.mem_compute_gb); - uint8_t * compute_addr = new uint8_t[compute_size]; - - size_t size_buf_0 = 1024ll*1024ll*1024ll*((size_t) params.mem_compute0_gb); - uint8_t * compute_buf_0 = new uint8_t[size_buf_0]; + std::vector mem_input_data; + std::vector mem_compute_data; ggml_allocr * alloc = NULL; - if (params.use_alloc) { - static const size_t tensor_alignment = 32; - alloc = ggml_allocr_new(compute_buf_0, size_buf_0, tensor_alignment); - } - GGML_ASSERT(n_tokens < (int) train_tokens.size()); - std::vector train_samples; - train_samples.push_back(0); - for (int i = 1; i < (int) train_tokens.size() - n_tokens; ++i) { - if (!params.samples_start_after_nl || (train_tokens[i-1] == llama_token_nl(lctx))) { - train_samples.push_back(i); - } - } - shuffle_ints(train_samples.data(), train_samples.data() + train_samples.size()); - for (int i = 0; i < (int) train_samples.size(); ++i) { - GGML_ASSERT(train_samples[i]+n_tokens-1 < (int) train_tokens.size()); - } + // context for input tensors without their data + struct ggml_init_params ctx_input_params = { + ggml_tensor_overhead() * 2, // mem_size + NULL, // mem_buffer + true, // no_alloc + }; + struct ggml_context * ctx_input = ggml_init(ctx_input_params); - printf("%s: begin training\n", __func__); + // the input tensors + struct ggml_tensor * tokens_input = ggml_new_tensor_2d(ctx_input, GGML_TYPE_I32, n_tokens, n_batch); + struct ggml_tensor * target_probs = ggml_new_tensor_3d(ctx_input, GGML_TYPE_F32, n_vocab, n_tokens, n_batch); - struct opt_callback_data opt_cb_data; - opt_cb_data.params = ¶ms; - opt_cb_data.opt = opt; - opt_cb_data.lctx = lctx; - opt_cb_data.tokens_data = train_tokens.data(); - opt_cb_data.tokens_size = train_tokens.size(); - opt_cb_data.samples_data = train_samples.data(); - opt_cb_data.samples_size = train_samples.size(); - opt_cb_data.shuffle_countdown = train_samples.size(); - opt_cb_data.tokens_input = NULL; - opt_cb_data.target_logits = NULL; - opt_cb_data.target_probs = NULL; + // measure required memory for input tensors + alloc = ggml_allocr_new_measure(tensor_alignment); + ggml_allocr_alloc(alloc, tokens_input); + ggml_allocr_alloc(alloc, target_probs); + size_t max_input_size = ggml_allocr_max_size(alloc) + tensor_alignment; + ggml_allocr_free(alloc); + printf("%s: input_size = %zu bytes (%.1f MB)\n", __func__, max_input_size, (float) max_input_size / (1024.0f*1024.0f)); - int64_t t0 = ggml_time_ms(); + // allocate input tensors + mem_input_data.resize(max_input_size); + alloc = ggml_allocr_new(mem_input_data.data(), mem_input_data.size(), tensor_alignment); + ggml_allocr_alloc(alloc, tokens_input); + ggml_allocr_alloc(alloc, target_probs); + ggml_allocr_free(alloc); - for (int ex = 0; ex < params.n_examples; ++ex) { - if (ex*n_batch >= (int) train_samples.size()) { - shuffle_ints(train_samples.data(), train_samples.data() + train_samples.size()); - for (int i = 0; i < (int) train_samples.size(); ++i) { - GGML_ASSERT(train_samples[i]+n_tokens-1 < (int) train_tokens.size()); - } - } + // context for compute tensors without their data + size_t estimated_compute_size_wo_data = ( + ggml_tensor_overhead()*GGML_MAX_NODES*2 + + (GGML_OBJECT_SIZE+GGML_GRAPH_SIZE)*( + params.common.use_checkpointing ? 3 : 2 + ) + ); + struct ggml_init_params ctx_compute_params = { + estimated_compute_size_wo_data, // mem_size + NULL, // mem_buffer + true, // no_alloc + }; + struct ggml_context * ctx_compute = NULL; - struct ggml_init_params cparams = { - compute_size, // mem_size - compute_addr, // mem_buffer - false, // no_alloc - }; - struct ggml_context * ctx0 = ggml_init(cparams); + struct ggml_tensor * loss = NULL; + struct ggml_tensor * logits = NULL; - ggml_set_no_alloc(ctx0, false); + struct ggml_cgraph * gf = NULL; + struct ggml_cgraph * gb = NULL; + struct ggml_cgraph * gb_tmp = NULL; - // don't use alloc for input tensors, so we can safely fill them with data - //struct ggml_tensor * after_opt_best_samples = ggml_new_tensor_2d(ctx0, GGML_TYPE_I32, n_tokens, n_batch); - //struct ggml_tensor * after_opt_probs = ggml_new_tensor_3d(ctx0, GGML_TYPE_F32, n_vocab, n_tokens, n_batch); - struct ggml_tensor * tokens_input = ggml_new_tensor_2d(ctx0, GGML_TYPE_I32, n_tokens, n_batch); - struct ggml_tensor * target_logits = ggml_new_tensor_3d(ctx0, GGML_TYPE_F32, n_vocab, n_tokens, n_batch); - struct ggml_tensor * target_probs = ggml_new_tensor_3d(ctx0, GGML_TYPE_F32, n_vocab, n_tokens, n_batch); - - ggml_set_no_alloc(ctx0, (alloc != NULL)); - - if (alloc) { - ggml_allocr_reset(alloc); - } - - opt_cb_data.tokens_input = tokens_input; - opt_cb_data.target_logits = target_logits; - opt_cb_data.target_probs = target_probs; - - int n_past = 0; - - struct ggml_cgraph * gf = ggml_new_graph(ctx0); - struct ggml_cgraph * gb = ggml_new_graph(ctx0); - struct ggml_cgraph * gb_tmp = params.use_checkpointing - ? ggml_new_graph(ctx0) + // measure required memory for compute tensors + size_t best_compute_size = SIZE_MAX; + enum ggml_cgraph_eval_order best_order = GGML_CGRAPH_EVAL_ORDER_COUNT; + // find best evaluation order + for (unsigned order = 0; order < (unsigned) GGML_CGRAPH_EVAL_ORDER_COUNT; ++order) { + ctx_compute = ggml_init(ctx_compute_params); + alloc = ggml_allocr_new_measure(tensor_alignment); + gf = ggml_new_graph(ctx_compute); + gf->order = (enum ggml_cgraph_eval_order) order; + gb = ggml_new_graph(ctx_compute); + gb_tmp = params.common.use_checkpointing + ? ggml_new_graph(ctx_compute) : NULL; - - GGML_ASSERT(n_past == 0); - - struct ggml_tensor * loss = NULL; - struct ggml_tensor * logits = NULL; - loss = llama_build_train_graphs( - &model, alloc, ctx0, + &model, alloc, ctx_compute, gf, gb, gb_tmp, &logits, tokens_input, target_probs, n_tokens, n_batch, - params.use_flash, - params.use_checkpointing + params.common.use_flash, + params.common.use_checkpointing ); - - size_t used_mem_before_opt = ggml_used_mem(ctx0); - - opt->params.adam.sched = (opt->iter < params.warmup) - ? (float) opt->iter / (float) params.warmup - : cosine_decay_restart( - params.cos_decay_steps, - params.cos_decay_min, - opt->iter - params.warmup, - params.cos_decay_restart, - params.enable_restart); - - float min_sched = params.adam_min_alpha / params.adam_alpha; - opt->params.adam.sched = min_sched + opt->params.adam.sched * (1.0f - min_sched); - - printf("%s: opt->params.adam.sched %.5f\n", __func__, opt->params.adam.sched); - - ggml_opt_resume_g(ctx0, opt, loss, gf, gb, &opt_callback, (void *) &opt_cb_data); - - size_t used_mem_after_opt = ggml_used_mem(ctx0); - - int n_iter = params.use_adam ? params.adam_n_iter : params.lbfgs_n_iter; - model.train_its = opt->iter; - model.train_samples += n_batch * n_iter; - model.train_tokens += n_batch * n_tokens * n_iter; - - if (params.print_info_interval > 0 && ex % params.print_info_interval == 0) { - printf("Example %d, opt iter %d\n", ex, opt->iter); - printf("error_before_opt: %.6f\n", opt->loss_before); - printf("error_after_opt: %.6f\n", opt->loss_after); - printf("used_mem_before_opt: %zu bytes\n", used_mem_before_opt); - printf("used_mem_after_opt: %zu bytes\n", used_mem_after_opt); + size_t max_compute_size = ggml_allocr_max_size(alloc) + tensor_alignment; + if (max_compute_size < best_compute_size) { + best_compute_size = max_compute_size; + best_order = gf->order; } - - ggml_free(ctx0); + ggml_allocr_free(alloc); + ggml_free(ctx_compute); } + size_t max_compute_size = best_compute_size; + printf("%s: compute_size = %zu bytes (%.1f MB)\n", __func__, max_compute_size, (float) max_compute_size / (1024.0f*1024.0f)); + printf("%s: evaluation order = %s\n", __func__, + (best_order == GGML_CGRAPH_EVAL_ORDER_LEFT_TO_RIGHT) ? "LEFT_TO_RIGHT" : + (best_order == GGML_CGRAPH_EVAL_ORDER_RIGHT_TO_LEFT) ? "RIGHT_TO_LEFT" : + "invalid"); + + // allocate compute tensors + mem_compute_data.resize(max_compute_size); + ctx_compute = ggml_init(ctx_compute_params); + alloc = ggml_allocr_new(mem_compute_data.data(), mem_compute_data.size(), tensor_alignment); + gf = ggml_new_graph(ctx_compute); + gf->order = best_order; + gb = ggml_new_graph(ctx_compute); + gb_tmp = params.common.use_checkpointing + ? ggml_new_graph(ctx_compute) + : NULL; + loss = llama_build_train_graphs( + &model, alloc, ctx_compute, + gf, gb, gb_tmp, + &logits, tokens_input, target_probs, + n_tokens, n_batch, + params.common.use_flash, + params.common.use_checkpointing + ); + ggml_allocr_free(alloc); + + std::vector train_tokens; + std::vector train_samples_begin; + std::vector train_samples_size; + printf("%s: tokenize training data\n", __func__); + tokenize_file(lctx, + params.common.fn_train_data, + params.common.sample_start, + params.common.include_sample_start, + params.common.overlapping_samples, + n_tokens, + train_tokens, + train_samples_begin, + train_samples_size); + GGML_ASSERT(train_samples_begin.size() == train_samples_size.size()); + + printf("%s: number of training tokens: %zu\n", __func__, train_tokens.size()); + + size_t shuffle_samples_hash = compute_samples_hash(params.common.fn_train_data, train_samples_begin.data(), train_samples_size.data(), train_samples_size.size()); + const bool changed_train_data = (shuffle_samples_hash != train->shuffle_samples_hash) || (train->shuffle_sample_count != train_samples_size.size()); + if (changed_train_data) { + printf("%s: train data seems to have changed. restarting shuffled epoch.\n", __func__); + } + if (params.common.force_reshuffle) { + printf("%s: forced reshuffling of data. restarting with newly shuffled epoch.\n", __func__); + } + if ((train->shuffle_rng_state_current == "") || changed_train_data || params.common.force_reshuffle) { + train->shuffle_rng_state_current = mt19937_seed_to_state(params.common.seed); + train->shuffle_sample_count = train_samples_size.size(); + train->shuffle_next_sample = 0; + train->shuffle_samples_hash = shuffle_samples_hash; + } + std::vector train_shuffled_samples_offs; + std::vector train_shuffled_samples_begin; + std::vector train_shuffled_samples_size; + train_shuffled_samples_offs.resize(train_samples_begin.size()); + train_shuffled_samples_begin.resize(train_samples_begin.size()); + train_shuffled_samples_size.resize(train_samples_size.size()); + train->shuffle_rng_state_next = shuffle_samples( + train->shuffle_rng_state_current, + train_shuffled_samples_offs.data(), + train_shuffled_samples_begin.data(), + train_shuffled_samples_size.data(), + train_samples_begin.data(), + train_samples_size.data(), + train_samples_size.size()); + printf("%s: begin training\n", __func__); + + save_train_files_data save_data; + save_data.fn_checkpoint_out = params.common.fn_checkpoint_out; + save_data.fn_model_out = params.fn_model_out; + save_data.fn_vocab_model = params.fn_vocab_model; + save_data.pattern_fn_it = params.common.pattern_fn_it; + save_data.fn_latest = params.common.fn_latest; + save_data.model = &model; + + struct train_opt_callback_data opt_cb_data; + opt_cb_data.params = ¶ms.common; + opt_cb_data.train = train; + opt_cb_data.save_cb = &save_train_files; + opt_cb_data.save_data = &save_data; + opt_cb_data.lctx = lctx; + opt_cb_data.last_save_iter = opt->iter; + opt_cb_data.tokens_data = train_tokens.data(); + opt_cb_data.tokens_size = train_tokens.size(); + opt_cb_data.samples_begin = train_samples_begin.data(); + opt_cb_data.samples_size = train_samples_size.data(); + opt_cb_data.shuffled_samples_offs = train_shuffled_samples_offs.data(); + opt_cb_data.shuffled_samples_begin = train_shuffled_samples_begin.data(); + opt_cb_data.shuffled_samples_size = train_shuffled_samples_size.data(); + opt_cb_data.samples_count = train_samples_size.size(); + opt_cb_data.tokens_input = tokens_input; + opt_cb_data.target_probs = target_probs; + opt_cb_data.first_iter = opt->iter; + opt_cb_data.first_epoch = train->train_epochs; + opt_cb_data.iter_at_last_epoch = -1; + opt_cb_data.last_time = ggml_time_ms(); + opt_cb_data.millis_per_iter = 0.0; + + // measure required memory for work buffer + size_t max_work_size = ggml_graph_plan(gb, params.common.n_threads).work_size + GGML_OBJECT_SIZE; + printf("%s: work_size = %zu bytes (%.1f MB)\n", __func__, max_work_size, (float) max_work_size / (1024.0f*1024.0f)); + + // context for work buffer + struct ggml_init_params ctx_work_params = { + max_work_size, // mem_size + NULL, // mem_buffer + false, // no_alloc + }; + struct ggml_context * ctx_work = ggml_init(ctx_work_params); + + int64_t t0 = ggml_time_ms(); + + ggml_opt_resume_g(ctx_work, opt, loss, gf, gb, &train_opt_callback, (void *) &opt_cb_data); + + ggml_free(ctx_work); + ggml_free(ctx_compute); + ggml_free(ctx_input); int64_t t1 = ggml_time_ms(); - int64_t d = t1-t0; - double dd = (double) d * 1e-3; - printf("%s: total training time=%f seconds\n", __func__, dd); + printf("%s: total training time: ", __func__); + print_duration((double) (t1 - t0)); + printf("\n"); - if (params.n_examples > 0) { - save_checkpoint_file(params.fn_checkpoint_out, params.fn_vocab_model, &model, opt); - } + int new_iters = opt->iter - opt_cb_data.last_save_iter; + if (new_iters > 0) { + train->train_its += new_iters; + train->train_tokens += new_iters * opt->params.n_gradient_accumulation * n_batch * n_tokens; - if (strlen(params.fn_model_out) > 0) { - save_llama_model_file(params.fn_model_out, params.fn_vocab_model, &model); + save_train_files(&save_data, train); + opt_cb_data.last_save_iter = opt->iter; } if (alloc) { ggml_allocr_free(alloc); } - delete[] compute_addr; - delete[] compute_buf_0; + ggml_free(opt->ctx); + free_train_state(train); ggml_free(model.ctx); llama_free(lctx); llama_free_model(lmodel); diff --git a/ggml-alloc.c b/ggml-alloc.c index 304964be4..805759db7 100644 --- a/ggml-alloc.c +++ b/ggml-alloc.c @@ -77,7 +77,7 @@ struct free_block { size_t size; }; -#define MAX_FREE_BLOCKS 128 +#define MAX_FREE_BLOCKS 256 struct ggml_allocr { void * data; @@ -187,6 +187,7 @@ void ggml_allocr_alloc(struct ggml_allocr * alloc, struct ggml_tensor * tensor) } tensor->data = addr; + AT_PRINTF("%s: allocated data at %p\n", __func__, tensor->data); #ifdef GGML_ALLOCATOR_DEBUG add_allocated_tensor(alloc, tensor); @@ -218,7 +219,8 @@ static void ggml_allocr_free_tensor(struct ggml_allocr * alloc, struct ggml_tens size_t size = ggml_allocr_get_alloc_size(alloc, tensor); size = aligned_offset(NULL, size, alloc->alignment); - AT_PRINTF("%s: freeing %s (%zu bytes) - n_free_blocks = %d\n", __func__, tensor->name, size, alloc->n_free_blocks); + AT_PRINTF("%s: freeing %s at %p (%zu bytes) - n_free_blocks = %d\n", __func__, tensor->name, ptr, size, alloc->n_free_blocks); + AT_PRINTF("%s: alloc->data = %p alloc->data+alloc->size = %p alloc->data+alloc->max_size = %p\n", __func__, alloc->data, (char*)alloc->data + alloc->size, (char*)alloc->data + alloc->max_size); #ifdef GGML_ALLOCATOR_DEBUG remove_allocated_tensor(alloc, tensor); @@ -631,3 +633,7 @@ static size_t ggml_allocr_alloc_graph_tensors_n( size_t ggml_allocr_alloc_graph(struct ggml_allocr * alloc, struct ggml_cgraph * graph) { return ggml_allocr_alloc_graph_tensors_n(alloc, &graph, 1, NULL, NULL); } + +size_t ggml_allocr_max_size(struct ggml_allocr * alloc) { + return alloc->max_size; +} diff --git a/ggml-alloc.h b/ggml-alloc.h index 9559da758..0c224f174 100644 --- a/ggml-alloc.h +++ b/ggml-alloc.h @@ -19,6 +19,7 @@ GGML_API bool ggml_allocr_is_measure(struct ggml_allocr * alloc); GGML_API void ggml_allocr_reset(struct ggml_allocr * alloc); GGML_API void ggml_allocr_alloc(struct ggml_allocr * alloc, struct ggml_tensor * tensor); GGML_API size_t ggml_allocr_alloc_graph(struct ggml_allocr * alloc, struct ggml_cgraph * graph); +GGML_API size_t ggml_allocr_max_size(struct ggml_allocr * alloc); #ifdef __cplusplus diff --git a/ggml.c b/ggml.c index 3fcc44bdb..ea964babd 100644 --- a/ggml.c +++ b/ggml.c @@ -134,6 +134,7 @@ typedef void * thread_ret_t; #define GGML_SOFT_MAX_UNROLL 4 #define GGML_VEC_DOT_UNROLL 2 +#define GGML_VEC_MAD_UNROLL 32 // // logging @@ -3707,6 +3708,58 @@ inline static void ggml_vec_mad_f32(const int n, float * restrict y, const float #endif } +// xs and vs are byte strides of x and v +inline static void ggml_vec_mad_f32_unroll(const int n, const int xs, const int vs, float * restrict y, const float * restrict xv, const float * restrict vv) { + + const float * restrict x[GGML_VEC_MAD_UNROLL]; + const float * restrict v[GGML_VEC_MAD_UNROLL]; + + for (int i = 0; i < GGML_VEC_MAD_UNROLL; ++i) { + x[i] = (const float *) ((const char *) xv + i*xs); + v[i] = (const float *) ((const char *) vv + i*vs); + } + +#if defined(GGML_SIMD) + const int np = (n & ~(GGML_F32_STEP - 1)); + + GGML_F32_VEC vx[GGML_VEC_MAD_UNROLL]; + + for (int k = 0; k < GGML_VEC_MAD_UNROLL; ++k) { + vx[k] = GGML_F32_VEC_SET1(v[k][0]); + } + + GGML_F32_VEC ax[GGML_VEC_MAD_UNROLL][GGML_F32_ARR]; + GGML_F32_VEC ay[GGML_F32_ARR]; + + for (int i = 0; i < np; i += GGML_F32_STEP) { + for (int j = 0; j < GGML_F32_ARR; j++) { + ay[j] = GGML_F32_VEC_LOAD(y + i + j*GGML_F32_EPR); + + for (int k = 0; k < GGML_VEC_MAD_UNROLL; ++k) { + ax[k][j] = GGML_F32_VEC_LOAD(x[k] + i + j*GGML_F32_EPR); + ay[j] = GGML_F32_VEC_FMA(ay[j], ax[k][j], vx[k]); + } + + GGML_F32_VEC_STORE(y + i + j*GGML_F32_EPR, ay[j]); + } + } + + // leftovers + for (int k = 0; k < GGML_VEC_MAD_UNROLL; ++k) { + for (int i = np; i < n; ++i) { + y[i] += x[k][i]*v[k][0]; + } + } +#else + // scalar + for (int k = 0; k < GGML_VEC_MAD_UNROLL; ++k) { + for (int i = 0; i < n; ++i) { + y[i] += x[k][i]*v[k][0]; + } + } +#endif +} + //inline static void ggml_vec_scale_f32(const int n, float * y, const float v) { for (int i = 0; i < n; ++i) y[i] *= v; } inline static void ggml_vec_scale_f32(const int n, float * y, const float v) { #if defined(GGML_USE_ACCELERATE) @@ -4392,10 +4445,9 @@ static inline bool ggml_can_mul_mat(const struct ggml_tensor * t0, const struct static inline bool ggml_can_out_prod(const struct ggml_tensor * t0, const struct ggml_tensor * t1) { static_assert(GGML_MAX_DIMS == 4, "GGML_MAX_DIMS is not 4 - update this function"); - return - (t0->ne[1] == t1->ne[1]) && - (t0->ne[2] == t1->ne[2]) && - (t0->ne[3] == t1->ne[3]); + return (t0->ne[1] == t1->ne[1]) && + (t1->ne[2]%t0->ne[2] == 0) && // verify t0 is broadcastable + (t1->ne[3]%t0->ne[3] == 0); } enum ggml_type ggml_ftype_to_ggml_type(enum ggml_ftype ftype) { @@ -5065,7 +5117,36 @@ struct ggml_tensor * ggml_set_f32(struct ggml_tensor * tensor, float value) { return tensor; } +void ggml_unravel_index(const struct ggml_tensor * tensor, int64_t i, int64_t * i0, int64_t * i1, int64_t * i2, int64_t * i3) { + const int64_t ne2 = tensor->ne[2]; + const int64_t ne1 = tensor->ne[1]; + const int64_t ne0 = tensor->ne[0]; + + const int64_t i3_ = (i/(ne2*ne1*ne0)); + const int64_t i2_ = (i - i3_*ne2*ne1*ne0)/(ne1*ne0); + const int64_t i1_ = (i - i3_*ne2*ne1*ne0 - i2_*ne1*ne0)/ne0; + const int64_t i0_ = (i - i3_*ne2*ne1*ne0 - i2_*ne1*ne0 - i1_*ne0); + + if (i0) { + * i0 = i0_; + } + if (i1) { + * i1 = i1_; + } + if (i2) { + * i2 = i2_; + } + if (i3) { + * i3 = i3_; + } +} + int32_t ggml_get_i32_1d(const struct ggml_tensor * tensor, int i) { + if (!ggml_is_contiguous(tensor)) { + int64_t id[4] = { 0, 0, 0, 0 }; + ggml_unravel_index(tensor, i, &id[0], &id[1], &id[2], &id[3]); + return ggml_get_i32_nd(tensor, id[0], id[1], id[2], id[3]); + } switch (tensor->type) { case GGML_TYPE_I8: { @@ -5102,6 +5183,12 @@ int32_t ggml_get_i32_1d(const struct ggml_tensor * tensor, int i) { } void ggml_set_i32_1d(const struct ggml_tensor * tensor, int i, int32_t value) { + if (!ggml_is_contiguous(tensor)) { + int64_t id[4] = { 0, 0, 0, 0 }; + ggml_unravel_index(tensor, i, &id[0], &id[1], &id[2], &id[3]); + ggml_set_i32_nd(tensor, id[0], id[1], id[2], id[3], value); + return; + } switch (tensor->type) { case GGML_TYPE_I8: { @@ -5135,7 +5222,74 @@ void ggml_set_i32_1d(const struct ggml_tensor * tensor, int i, int32_t value) { } } +int32_t ggml_get_i32_nd(const struct ggml_tensor * tensor, int i0, int i1, int i2, int i3) { + void * data = (char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1] + i2*tensor->nb[2] + i3*tensor->nb[3]; + switch (tensor->type) { + case GGML_TYPE_I8: + { + return ((int8_t *) data)[0]; + } break; + case GGML_TYPE_I16: + { + return ((int16_t *) data)[0]; + } break; + case GGML_TYPE_I32: + { + return ((int32_t *) data)[0]; + } break; + case GGML_TYPE_F16: + { + return GGML_FP16_TO_FP32(((ggml_fp16_t *) data)[0]); + } break; + case GGML_TYPE_F32: + { + return ((float *) data)[0]; + } break; + default: + { + GGML_ASSERT(false); + } break; + } + + return 0.0f; +} + +void ggml_set_i32_nd(const struct ggml_tensor * tensor, int i0, int i1, int i2, int i3, int32_t value) { + void * data = (char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1] + i2*tensor->nb[2] + i3*tensor->nb[3]; + switch (tensor->type) { + case GGML_TYPE_I8: + { + ((int8_t *)(data))[0] = value; + } break; + case GGML_TYPE_I16: + { + ((int16_t *)(data))[0] = value; + } break; + case GGML_TYPE_I32: + { + ((int32_t *)(data))[0] = value; + } break; + case GGML_TYPE_F16: + { + ((ggml_fp16_t *)(data))[0] = GGML_FP32_TO_FP16(value); + } break; + case GGML_TYPE_F32: + { + ((float *)(data))[0] = value; + } break; + default: + { + GGML_ASSERT(false); + } break; + } +} + float ggml_get_f32_1d(const struct ggml_tensor * tensor, int i) { + if (!ggml_is_contiguous(tensor)) { + int64_t id[4] = { 0, 0, 0, 0 }; + ggml_unravel_index(tensor, i, &id[0], &id[1], &id[2], &id[3]); + return ggml_get_f32_nd(tensor, id[0], id[1], id[2], id[3]); + } switch (tensor->type) { case GGML_TYPE_I8: { @@ -5172,6 +5326,12 @@ float ggml_get_f32_1d(const struct ggml_tensor * tensor, int i) { } void ggml_set_f32_1d(const struct ggml_tensor * tensor, int i, float value) { + if (!ggml_is_contiguous(tensor)) { + int64_t id[4] = { 0, 0, 0, 0 }; + ggml_unravel_index(tensor, i, &id[0], &id[1], &id[2], &id[3]); + ggml_set_f32_nd(tensor, id[0], id[1], id[2], id[3], value); + return; + } switch (tensor->type) { case GGML_TYPE_I8: { @@ -5205,6 +5365,68 @@ void ggml_set_f32_1d(const struct ggml_tensor * tensor, int i, float value) { } } +float ggml_get_f32_nd(const struct ggml_tensor * tensor, int i0, int i1, int i2, int i3) { + void * data = (char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1] + i2*tensor->nb[2] + i3*tensor->nb[3]; + switch (tensor->type) { + case GGML_TYPE_I8: + { + return ((int8_t *) data)[0]; + } break; + case GGML_TYPE_I16: + { + return ((int16_t *) data)[0]; + } break; + case GGML_TYPE_I32: + { + return ((int32_t *) data)[0]; + } break; + case GGML_TYPE_F16: + { + return GGML_FP16_TO_FP32(((ggml_fp16_t *) data)[0]); + } break; + case GGML_TYPE_F32: + { + return ((float *) data)[0]; + } break; + default: + { + GGML_ASSERT(false); + } break; + } + + return 0.0f; +} + +void ggml_set_f32_nd(const struct ggml_tensor * tensor, int i0, int i1, int i2, int i3, float value) { + void * data = (char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1] + i2*tensor->nb[2] + i3*tensor->nb[3]; + switch (tensor->type) { + case GGML_TYPE_I8: + { + ((int8_t *)(data))[0] = value; + } break; + case GGML_TYPE_I16: + { + ((int16_t *)(data))[0] = value; + } break; + case GGML_TYPE_I32: + { + ((int32_t *)(data))[0] = value; + } break; + case GGML_TYPE_F16: + { + ((ggml_fp16_t *)(data))[0] = GGML_FP32_TO_FP16(value); + } break; + case GGML_TYPE_F32: + { + ((float *)(data))[0] = value; + } break; + default: + { + GGML_ASSERT(false); + } break; + } +} + void * ggml_get_data(const struct ggml_tensor * tensor) { return tensor->data; } @@ -5347,6 +5569,44 @@ struct ggml_tensor * ggml_add_inplace( return ggml_add_impl(ctx, a, b, true); } +// ggml_add_cast + +static struct ggml_tensor * ggml_add_cast_impl( + struct ggml_context * ctx, + struct ggml_tensor * a, + struct ggml_tensor * b, + enum ggml_type type) { + // TODO: support less-strict constraint + // GGML_ASSERT(ggml_can_repeat(b, a)); + GGML_ASSERT(ggml_can_repeat_rows(b, a)); + GGML_ASSERT(ggml_is_quantized(a->type)); // currently only supported for quantized input + + bool is_node = false; + + if (a->grad || b->grad) { + // TODO: support backward pass for broadcasting + GGML_ASSERT(ggml_are_same_shape(a, b)); + is_node = true; + } + + struct ggml_tensor * result = ggml_new_tensor(ctx, type, a->n_dims, a->ne); + + result->op = GGML_OP_ADD; + result->grad = is_node ? ggml_new_tensor(ctx, GGML_TYPE_F32, a->n_dims, a->ne) : NULL; + result->src[0] = a; + result->src[1] = b; + + return result; +} + +struct ggml_tensor * ggml_add_cast( + struct ggml_context * ctx, + struct ggml_tensor * a, + struct ggml_tensor * b, + enum ggml_type type) { + return ggml_add_cast_impl(ctx, a, b, type); +} + // ggml_add1 static struct ggml_tensor * ggml_add1_impl( @@ -5783,7 +6043,6 @@ struct ggml_tensor * ggml_repeat( result->op = GGML_OP_REPEAT; result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL; result->src[0] = a; - result->src[1] = b; return result; } @@ -5811,7 +6070,6 @@ struct ggml_tensor * ggml_repeat_back( result->op = GGML_OP_REPEAT_BACK; result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL; result->src[0] = a; - result->src[1] = b; return result; } @@ -6186,8 +6444,9 @@ struct ggml_tensor * ggml_out_prod( is_node = true; } - const int64_t ne[4] = { a->ne[0], b->ne[0], a->ne[2], b->ne[3] }; - struct ggml_tensor * result = ggml_new_tensor(ctx, GGML_TYPE_F32, MIN(a->n_dims, b->n_dims), ne); + // a is broadcastable to b for ne[2] and ne[3] -> use b->ne[2] and b->ne[3] + const int64_t ne[4] = { a->ne[0], b->ne[0], b->ne[2], b->ne[3] }; + struct ggml_tensor * result = ggml_new_tensor(ctx, GGML_TYPE_F32, MAX(a->n_dims, b->n_dims), ne); result->op = GGML_OP_OUT_PROD; result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL; @@ -6461,7 +6720,7 @@ struct ggml_tensor * ggml_reshape( struct ggml_tensor * a, struct ggml_tensor * b) { GGML_ASSERT(ggml_is_contiguous(a)); - GGML_ASSERT(ggml_is_contiguous(b)); + // as only the shape of b is relevant, and not its memory layout, b is allowed to be non contiguous. GGML_ASSERT(ggml_nelements(a) == ggml_nelements(b)); bool is_node = false; @@ -6834,7 +7093,6 @@ struct ggml_tensor * ggml_get_rows_back( result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL; result->src[0] = a; result->src[1] = b; - result->src[2] = c; return result; } @@ -7540,27 +7798,30 @@ struct ggml_tensor * ggml_flash_attn_back( // d shape [D,N,ne2,ne3] // q shape [D,N,ne2,ne3] - // k shape [D,M,ne2,ne3] - // v shape [M,D,ne2,ne3] + // k shape [D,M,kvne2,ne3] + // v shape [M,D,kvne2,ne3] - const int64_t D = q->ne[0]; - const int64_t N = q->ne[1]; - const int64_t M = k->ne[1]; - const int64_t ne2 = q->ne[2]; - const int64_t ne3 = q->ne[3]; + const int64_t D = q->ne[0]; + const int64_t N = q->ne[1]; + const int64_t M = k->ne[1]; + const int64_t ne2 = q->ne[2]; + const int64_t ne3 = q->ne[3]; + const int64_t kvne2 = k->ne[2]; GGML_ASSERT(k->ne[0] == D); GGML_ASSERT(v->ne[0] == M); GGML_ASSERT(v->ne[1] == D); GGML_ASSERT(d->ne[0] == D); GGML_ASSERT(d->ne[1] == N); - GGML_ASSERT(k->ne[2] == ne2); + GGML_ASSERT(k->ne[2] == kvne2); GGML_ASSERT(k->ne[3] == ne3); - GGML_ASSERT(v->ne[2] == ne2); + GGML_ASSERT(v->ne[2] == kvne2); GGML_ASSERT(v->ne[3] == ne3); GGML_ASSERT(d->ne[2] == ne2); GGML_ASSERT(d->ne[3] == ne3); + GGML_ASSERT(ne2 % kvne2 == 0); + bool is_node = false; if (q->grad || k->grad || v->grad) { @@ -7570,14 +7831,23 @@ struct ggml_tensor * ggml_flash_attn_back( } // store gradients of q, k and v as continuous tensors concatenated in result. - // q shape[D,N,ne2,ne3] ; k shape [D,M,ne2,ne3] ; v shape [M,D,ne2,ne3] - // gradq->data = result->data - // gradk->data = result->data + nb0*D*N*ne2*ne3 - // gradv->data = result->data + nb0*D*N*ne2*ne3 + nb0*D*M*ne2*ne3 // note: v and gradv are actually transposed, i.e. v->ne[0] != D. - int64_t ne[4] = {D,M+N+M,ne2,ne3}; + const int64_t elem_q = ggml_nelements(q); + const int64_t elem_k = ggml_nelements(k); + const int64_t elem_v = ggml_nelements(v); - struct ggml_tensor * result = ggml_new_tensor(ctx, GGML_TYPE_F32, 4, ne); + enum ggml_type result_type = GGML_TYPE_F32; + GGML_ASSERT(ggml_blck_size(result_type) == 1); + const size_t tsize = ggml_type_size(result_type); + + const size_t offs_q = 0; + const size_t offs_k = offs_q + GGML_PAD(elem_q * tsize, GGML_MEM_ALIGN); + const size_t offs_v = offs_k + GGML_PAD(elem_k * tsize, GGML_MEM_ALIGN); + const size_t end = offs_v + GGML_PAD(elem_v * tsize, GGML_MEM_ALIGN); + + const size_t nelements = (end + tsize - 1)/tsize; + + struct ggml_tensor * result = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, nelements); int32_t masked_i = masked ? 1 : 0; ggml_set_op_params(result, &masked_i, sizeof(masked_i)); @@ -9006,8 +9276,9 @@ static void ggml_compute_forward_add_q_f32( const int nth = params->nth; const enum ggml_type type = src0->type; + const enum ggml_type dtype = dst->type; ggml_to_float_t const dequantize_row_q = type_traits[type].to_float; - ggml_from_float_t const quantize_row_q = type_traits[type].from_float; + ggml_from_float_t const quantize_row_q = type_traits[dtype].from_float; // we don't support permuted src0 or src1 GGML_ASSERT(nb00 == ggml_type_size(type)); @@ -9019,7 +9290,6 @@ static void ggml_compute_forward_add_q_f32( GGML_ASSERT(nb2 <= nb3); GGML_ASSERT(ggml_is_quantized(src0->type)); - GGML_ASSERT(dst->type == src0->type); GGML_ASSERT(src1->type == GGML_TYPE_F32); // rows per thread @@ -9057,7 +9327,11 @@ static void ggml_compute_forward_add_q_f32( // add src1 ggml_vec_acc_f32(ne00, wdata, src1_row); // quantize row to dst - quantize_row_q(wdata, dst_row, ne00); + if (quantize_row_q != NULL) { + quantize_row_q(wdata, dst_row, ne00); + } else { + memcpy(dst_row, wdata, ne0*nb0); + } } } @@ -10153,11 +10427,61 @@ static void ggml_compute_forward_repeat_f32( } } +static void ggml_compute_forward_repeat_f16( + const struct ggml_compute_params * params, + const struct ggml_tensor * src0, + struct ggml_tensor * dst) { + GGML_ASSERT(params->ith == 0); + GGML_ASSERT(ggml_can_repeat(src0, dst)); + + if (params->type == GGML_TASK_INIT || params->type == GGML_TASK_FINALIZE) { + return; + } + + GGML_TENSOR_UNARY_OP_LOCALS; + + // guaranteed to be an integer due to the check in ggml_can_repeat + const int nr0 = (int)(ne0/ne00); + const int nr1 = (int)(ne1/ne01); + const int nr2 = (int)(ne2/ne02); + const int nr3 = (int)(ne3/ne03); + + // TODO: support for transposed / permuted tensors + GGML_ASSERT(nb0 == sizeof(ggml_fp16_t)); + GGML_ASSERT(nb00 == sizeof(ggml_fp16_t)); + + // TODO: maybe this is not optimal? + for (int i3 = 0; i3 < nr3; i3++) { + for (int k3 = 0; k3 < ne03; k3++) { + for (int i2 = 0; i2 < nr2; i2++) { + for (int k2 = 0; k2 < ne02; k2++) { + for (int i1 = 0; i1 < nr1; i1++) { + for (int k1 = 0; k1 < ne01; k1++) { + for (int i0 = 0; i0 < nr0; i0++) { + ggml_fp16_t * y = (ggml_fp16_t *) ((char *) dst->data + (i3*ne03 + k3)*nb3 + (i2*ne02 + k2)*nb2 + (i1*ne01 + k1)*nb1 + (i0*ne00)*nb0); + ggml_fp16_t * x = (ggml_fp16_t *) ((char *) src0->data + ( k3)*nb03 + ( k2)*nb02 + ( k1)*nb01); + // ggml_vec_cpy_f16(ne00, y, x) + for (int i = 0; i < ne00; ++i) { + y[i] = x[i]; + } + } + } + } + } + } + } + } +} + static void ggml_compute_forward_repeat( const struct ggml_compute_params * params, const struct ggml_tensor * src0, struct ggml_tensor * dst) { switch (src0->type) { + case GGML_TYPE_F16: + { + ggml_compute_forward_repeat_f16(params, src0, dst); + } break; case GGML_TYPE_F32: { ggml_compute_forward_repeat_f32(params, src0, dst); @@ -11497,8 +11821,8 @@ static void ggml_compute_forward_out_prod_f32( const struct ggml_tensor * src0, const struct ggml_tensor * src1, struct ggml_tensor * dst) { - int64_t t0 = ggml_perf_time_us(); - UNUSED(t0); + // int64_t t0 = ggml_perf_time_us(); + // UNUSED(t0); GGML_TENSOR_BINARY_OP_LOCALS; @@ -11539,6 +11863,146 @@ static void ggml_compute_forward_out_prod_f32( return; } + // dst[:,:,:,:] = 0 + // for i2,i3: + // for i1: + // for i01: + // for i0: + // dst[i0,i1,i2,i3] += src0[i0,i01,i2,i3] * src1[i1,i01,i2,i3] + + // parallelize by last three dimensions + + // total rows in dst + const int64_t nr = ne1*ne2*ne3; + + // rows per thread + const int64_t dr = (nr + nth - 1)/nth; + + // row range for this thread + const int64_t ir0 = dr*ith; + const int64_t ir1 = MIN(ir0 + dr, nr); + + // block-tiling attempt + const int64_t blck_0 = MAX(GGML_VEC_MAD_UNROLL, 32); + const int64_t blck_1 = 16; + + for (int64_t bir = ir0; bir < ir1; bir += blck_1) { + const int64_t bir1 = MIN(bir + blck_1, ir1); + for (int64_t bi01 = 0; bi01 < ne01; bi01 += blck_0) { + const int64_t bne01 = MIN(bi01 + blck_0, ne01); + for (int64_t ir = bir; ir < bir1; ++ir) { + // dst indices + const int64_t i3 = ir/(ne2*ne1); + const int64_t i2 = (ir - i3*ne2*ne1)/ne1; + const int64_t i1 = (ir - i3*ne2*ne1 - i2*ne1); + + const int64_t i02 = i2; + const int64_t i03 = i3; + + //const int64_t i10 = i1; + const int64_t i12 = i2; + const int64_t i13 = i3; + +#if GGML_VEC_MAD_UNROLL > 2 + const int64_t bne01_unroll = bne01 - (bne01 % GGML_VEC_MAD_UNROLL); + for (int64_t i01 = bi01; i01 < bne01_unroll; i01 += GGML_VEC_MAD_UNROLL) { + const int64_t i11 = i01; + + float * s0 = (float *) ((char *) src0->data + ( i01*nb01 + i02*nb02 + i03*nb03)); + float * s1 = (float *) ((char *) src1->data + (i1*nb10 + i11*nb11 + i12*nb12 + i13*nb13)); + float * d = (float *) ((char *) dst->data + ( i1*nb1 + i2*nb2 + i3*nb3)); + + ggml_vec_mad_f32_unroll(ne0, nb01, nb11, d, s0, s1); + } + for (int64_t i01 = bne01_unroll; i01 < bne01; ++i01) { + const int64_t i11 = i01; + + float * s0 = (float *) ((char *) src0->data + ( i01*nb01 + i02*nb02 + i03*nb03)); + float * s1 = (float *) ((char *) src1->data + (i1*nb10 + i11*nb11 + i12*nb12 + i13*nb13)); + float * d = (float *) ((char *) dst->data + ( i1*nb1 + i2*nb2 + i3*nb3)); + + ggml_vec_mad_f32(ne0, d, s0, *s1); + } +#else + for (int64_t i01 = bi01; i01 < bne01; ++i01) { + const int64_t i11 = i01; + + float * s0 = (float *) ((char *) src0->data + ( i01*nb01 + i02*nb02 + i03*nb03)); + float * s1 = (float *) ((char *) src1->data + (i1*nb10 + i11*nb11 + i12*nb12 + i13*nb13)); + float * d = (float *) ((char *) dst->data + ( i1*nb1 + i2*nb2 + i3*nb3)); + + ggml_vec_mad_f32(ne0, d, s0, *s1); + } +#endif + } + } + } + + + //int64_t t1 = ggml_perf_time_us(); + //static int64_t acc = 0; + //acc += t1 - t0; + //if (t1 - t0 > 10) { + // printf("\n"); + // printf("ne00 = %5d, ne01 = %5d, ne02 = %5d, ne03 = %5d\n", ne00, ne01, ne02, ne03); + // printf("nb00 = %5d, nb01 = %5d, nb02 = %5d, nb03 = %5d\n", nb00, nb01, nb02, nb03); + // printf("ne10 = %5d, ne11 = %5d, ne12 = %5d, ne13 = %5d\n", ne10, ne11, ne12, ne13); + // printf("nb10 = %5d, nb11 = %5d, nb12 = %5d, nb13 = %5d\n", nb10, nb11, nb12, nb13); + + // printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX task %d/%d: %d us, acc = %d\n", ith, nth, (int) (t1 - t0), (int) acc); + //} +} + +static void ggml_compute_forward_out_prod_q_f32( + const struct ggml_compute_params * params, + const struct ggml_tensor * src0, + const struct ggml_tensor * src1, + struct ggml_tensor * dst) { + // int64_t t0 = ggml_perf_time_us(); + // UNUSED(t0); + + GGML_TENSOR_BINARY_OP_LOCALS; + + const int ith = params->ith; + const int nth = params->nth; + + const enum ggml_type type = src0->type; + ggml_to_float_t const dequantize_row_q = type_traits[type].to_float; + + GGML_ASSERT(ne02 == ne12); + GGML_ASSERT(ne03 == ne13); + GGML_ASSERT(ne2 == ne12); + GGML_ASSERT(ne3 == ne13); + + // we don't support permuted src0 dim0 + GGML_ASSERT(nb00 == ggml_type_size(type)); + + // dst dim0 cannot be transposed or permuted + GGML_ASSERT(nb0 == sizeof(float)); + // GGML_ASSERT(nb0 <= nb1); + // GGML_ASSERT(nb1 <= nb2); + // GGML_ASSERT(nb2 <= nb3); + + GGML_ASSERT(ne0 == ne00); + GGML_ASSERT(ne1 == ne10); + GGML_ASSERT(ne2 == ne02); + GGML_ASSERT(ne3 == ne03); + + // nb01 >= nb00 - src0 is not transposed + // compute by src0 rows + + // TODO: #if defined(GGML_USE_CUBLAS) ggml_cuda_out_prod + // TODO: #if defined(GGML_USE_ACCELERATE) || defined(GGML_USE_OPENBLAS) || defined(GGML_USE_CLBLAST) + + if (params->type == GGML_TASK_INIT) { + ggml_vec_set_f32(ne0*ne1*ne2*ne3, dst->data, 0); + return; + } + + if (params->type == GGML_TASK_FINALIZE) { + return; + } + // parallelize by last three dimensions // total rows in dst @@ -11558,6 +12022,8 @@ static void ggml_compute_forward_out_prod_f32( // for i0: // dst[i0,i1,i2,i3] += src0[i0,i01,i2,i3] * src1[i1,i01,i2,i3] + float * wdata = (float *) params->wdata + (ne0 + CACHE_LINE_SIZE_F32) * ith; + for (int64_t ir = ir0; ir < ir1; ++ir) { // dst indices const int64_t i3 = ir/(ne2*ne1); @@ -11578,10 +12044,8 @@ static void ggml_compute_forward_out_prod_f32( float * s1 = (float *) ((char *) src1->data + (i1*nb10 + i11*nb11 + i12*nb12 + i13*nb13)); float * d = (float *) ((char *) dst->data + ( i1*nb1 + i2*nb2 + i3*nb3)); - ggml_vec_mad_f32(ne0, d, s0, *s1); - // for (int64_t i0 = 0; i0 < ne0; ++i0) { - // d[i0] += s0[i0] * s1[i1]; - // } + dequantize_row_q(s0, wdata, ne0); + ggml_vec_mad_f32(ne0, d, wdata, *s1); } } @@ -11610,10 +12074,13 @@ static void ggml_compute_forward_out_prod( case GGML_TYPE_Q5_0: case GGML_TYPE_Q5_1: case GGML_TYPE_Q8_0: - case GGML_TYPE_Q8_1: + case GGML_TYPE_Q2_K: + case GGML_TYPE_Q3_K: + case GGML_TYPE_Q4_K: + case GGML_TYPE_Q5_K: + case GGML_TYPE_Q6_K: { - GGML_ASSERT(false); // todo - // ggml_compute_forward_out_prod_q_f32(params, src0, src1, dst); + ggml_compute_forward_out_prod_q_f32(params, src0, src1, dst); } break; case GGML_TYPE_F16: { @@ -12001,14 +12468,15 @@ static void ggml_compute_forward_get_rows_back_f32_f16( const struct ggml_compute_params * params, const struct ggml_tensor * src0, const struct ggml_tensor * src1, - const struct ggml_tensor * opt0, struct ggml_tensor * dst) { GGML_ASSERT(params->ith == 0); - GGML_ASSERT(ggml_are_same_shape(opt0, dst)); - GGML_ASSERT(ggml_is_contiguous(opt0)); GGML_ASSERT(ggml_is_contiguous(dst)); - ggml_compute_forward_dup_same_cont(params, opt0, dst); + // ggml_compute_forward_dup_same_cont(params, opt0, dst); + + if (params->type == GGML_TASK_INIT) { + memset(dst->data, 0, ggml_nbytes(dst)); + } if (params->type == GGML_TASK_INIT || params->type == GGML_TASK_FINALIZE) { return; @@ -12034,11 +12502,8 @@ static void ggml_compute_forward_get_rows_back_f32( const struct ggml_compute_params * params, const struct ggml_tensor * src0, const struct ggml_tensor * src1, - const struct ggml_tensor * opt0, struct ggml_tensor * dst) { GGML_ASSERT(params->ith == 0); - GGML_ASSERT(ggml_are_same_shape(opt0, dst)); - GGML_ASSERT(ggml_is_contiguous(opt0)); GGML_ASSERT(ggml_is_contiguous(dst)); // ggml_compute_forward_dup_same_cont(params, opt0, dst); @@ -12072,16 +12537,15 @@ static void ggml_compute_forward_get_rows_back( const struct ggml_compute_params * params, const struct ggml_tensor * src0, const struct ggml_tensor * src1, - const struct ggml_tensor * opt0, struct ggml_tensor * dst) { switch (src0->type) { case GGML_TYPE_F16: { - ggml_compute_forward_get_rows_back_f32_f16(params, src0, src1, opt0, dst); + ggml_compute_forward_get_rows_back_f32_f16(params, src0, src1, dst); } break; case GGML_TYPE_F32: { - ggml_compute_forward_get_rows_back_f32(params, src0, src1, opt0, dst); + ggml_compute_forward_get_rows_back_f32(params, src0, src1, dst); } break; default: { @@ -14143,10 +14607,11 @@ static void ggml_compute_forward_flash_attn_f32( S[i] = -INFINITY; } - for (int64_t ic = 0; ic < nek1; ++ic) { + const int64_t masked_begin = masked ? (P + iq1 + 1) : M; + for (int64_t ic = 0; ic < masked_begin; ++ic) { // k indices const int ik3 = iq3; - const int ik2 = iq2; + const int ik2 = iq2 % nek2; const int ik1 = ic; // S indices @@ -14159,20 +14624,18 @@ static void ggml_compute_forward_flash_attn_f32( } // scale - ggml_vec_scale_f32(nek1, S, scale); + ggml_vec_scale_f32(masked_begin, S, scale); - if (masked) { - for (int64_t i = P; i < M; i++) { - if (i > P + iq1) { - S[i] = -INFINITY; - } - } + for (int64_t i = masked_begin; i < M; i++) { + S[i] = -INFINITY; } // softmax + // exclude known -INF S[..] values from max and loop + // dont forget to set their SW values to zero { float max = -INFINITY; - ggml_vec_max_f32(M, &max, S); + ggml_vec_max_f32(masked_begin, &max, S); ggml_float sum = 0.0; { @@ -14186,10 +14649,15 @@ static void ggml_compute_forward_flash_attn_f32( ggml_float sump[GGML_SOFT_MAX_UNROLL] = { 0.0 }; for (int i = 0; i < Mup; i += GGML_SOFT_MAX_UNROLL) { + if (i >= masked_begin) { + break; + } float * SS = S + i; for (int j = 0; j < GGML_SOFT_MAX_UNROLL; ++j) { - if (SS[j] == -INFINITY) { + if (i + j >= masked_begin) { + break; + } else if (SS[j] == -INFINITY) { SS[j] = 0.0f; } else { #ifndef GGML_FLASH_ATTN_EXP_FP16 @@ -14214,10 +14682,10 @@ static void ggml_compute_forward_flash_attn_f32( assert(sum > 0.0); sum = 1.0/sum; - ggml_vec_scale_f32(M, S, sum); + ggml_vec_scale_f32(masked_begin, S, sum); #ifndef NDEBUG - for (int i = 0; i < M; ++i) { + for (int i = 0; i < masked_begin; ++i) { assert(!isnan(S[i])); assert(!isinf(S[i])); } @@ -14230,9 +14698,13 @@ static void ggml_compute_forward_flash_attn_f32( const int i2 = iq2; const int i3 = iq3; - ggml_vec_dot_f32(nek1, - (float *) ((char *) dst->data + (ic*nb0 + i1*nb1 + i2*nb2 + i3*nb3)), - (float *) ((char *) v->data + ( ic*nbv1 + i2*nbv2 + i3*nbv3)), + // v indices + const int iv2 = iq2 % nev2; + const int iv3 = iq3; + + ggml_vec_dot_f32(masked_begin, + (float *) ((char *) dst->data + (ic*nb0 + i1*nb1 + i2*nb2 + i3*nb3)), + (float *) ((char *) v->data + ( ic*nbv1 + iv2*nbv2 + iv3*nbv3)), S); } } @@ -14329,7 +14801,7 @@ static void ggml_compute_forward_flash_attn_f16( for (int64_t ic = 0; ic < nek1; ++ic) { // k indices const int ik3 = iq3; - const int ik2 = iq2; + const int ik2 = iq2 % nek2; const int ik1 = ic; // S indices @@ -14344,7 +14816,7 @@ static void ggml_compute_forward_flash_attn_f16( for (int64_t ic = 0; ic < nek1; ic += GGML_VEC_DOT_UNROLL) { // k indices const int ik3 = iq3; - const int ik2 = iq2; + const int ik2 = iq2 % nek2; const int ik1 = ic; // S indices @@ -14369,6 +14841,8 @@ static void ggml_compute_forward_flash_attn_f16( } // softmax + // todo: exclude known -INF S[..] values from max and loop, assuming their results to be zero. + // dont forget to set their S values to zero { float max = -INFINITY; ggml_vec_max_f32(M, &max, S); @@ -14425,6 +14899,7 @@ static void ggml_compute_forward_flash_attn_f16( S16[i] = GGML_FP32_TO_FP16(S[i]); } + // todo: exclude known zero S[..] values from dot (reducing nev0 and increasing begin of v and S16). if (GGML_VEC_DOT_UNROLL == 1 || (nev1 % GGML_VEC_DOT_UNROLL != 0)) { for (int64_t ic = 0; ic < nev1; ++ic) { // dst indices @@ -14432,9 +14907,13 @@ static void ggml_compute_forward_flash_attn_f16( const int i2 = iq2; const int i3 = iq3; - ggml_vec_dot_f16(nek1, - (float *) ((char *) dst->data + (ic*nb0 + i1*nb1 + i2*nb2 + i3*nb3)), - (ggml_fp16_t *) ((char *) v->data + ( ic*nbv1 + i2*nbv2 + i3*nbv3)), + // v indices + const int iv2 = iq2 % nev2; + const int iv3 = iq3; + + ggml_vec_dot_f16(nev0, + (float *) ((char *) dst->data + (ic*nb0 + i1*nb1 + i2*nb2 + i3*nb3)), + (ggml_fp16_t *) ((char *) v->data + ( ic*nbv1 + iv2*nbv2 + iv3*nbv3)), S16); } } else { @@ -14444,9 +14923,13 @@ static void ggml_compute_forward_flash_attn_f16( const int i2 = iq2; const int i3 = iq3; - ggml_vec_dot_f16_unroll(nek1, nbv1, - (float *) ((char *) dst->data + (ic*nb0 + i1*nb1 + i2*nb2 + i3*nb3)), - ((char *) v->data + ( ic*nbv1 + i2*nbv2 + i3*nbv3)), + // v indices + const int iv2 = iq2 % nev2; + const int iv3 = iq3; + + ggml_vec_dot_f16_unroll(nev0, nbv1, + (float *) ((char *) dst->data + (ic*nb0 + i1*nb1 + i2*nb2 + i3*nb3)), + ((char *) v->data + ( ic*nbv1 + iv2*nbv2 + iv3*nbv3)), S16); } } @@ -14705,10 +15188,37 @@ static void ggml_compute_forward_flash_attn_back_f32( return; } - // parallelize by q rows using ggml_vec_dot_f32 + const int64_t elem_q = ggml_nelements(q); + const int64_t elem_k = ggml_nelements(k); - // total rows in q - const int nr = neq2*neq3; + enum ggml_type result_type = dst->type; + GGML_ASSERT(ggml_blck_size(result_type) == 1); + const size_t tsize = ggml_type_size(result_type); + + const size_t offs_q = 0; + const size_t offs_k = offs_q + GGML_PAD(elem_q * tsize, GGML_MEM_ALIGN); + const size_t offs_v = offs_k + GGML_PAD(elem_k * tsize, GGML_MEM_ALIGN); + + void * grad_q = (char *) dst->data; + void * grad_k = (char *) dst->data + offs_k; + void * grad_v = (char *) dst->data + offs_v; + + const size_t nbgq1 = nb0*neq0; + const size_t nbgq2 = nb0*neq0*neq1; + const size_t nbgq3 = nb0*neq0*neq1*neq2; + + const size_t nbgk1 = nb0*nek0; + const size_t nbgk2 = nb0*nek0*nek1; + const size_t nbgk3 = nb0*nek0*nek1*neq2; + + const size_t nbgv1 = nb0*nev0; + const size_t nbgv2 = nb0*nev0*nev1; + const size_t nbgv3 = nb0*nev0*nev1*neq2; + + // parallelize by k rows using ggml_vec_dot_f32 + + // total rows in k + const int nr = nek2*nek3; // rows per thread const int dr = (nr + nth - 1)/nth; @@ -14721,268 +15231,243 @@ static void ggml_compute_forward_flash_attn_back_f32( //printf("P=%d N=%d D=%d ir0=%d ir1=%d scale = %f\n", P, N, D, ir0, ir1, scale); + // how often k2 (and v2) is repeated in q2 + int nrep = neq2/nek2; + for (int ir = ir0; ir < ir1; ++ir) { // q indices - const int iq3 = ir/(neq2); - const int iq2 = ir - iq3*neq2; - for ( int iq1 = 0; iq1 < neq1; ++iq1) { + const int ik3 = ir/(nek2); + const int ik2 = ir - ik3*nek2; + const int iq3 = ik3; + const int id3 = ik3; + const int iv3 = ik3; + const int iv2 = ik2; - // not sure about CACHE_LINE_SIZE_F32.. - // - maybe it must not be multiplied by 2 and excluded from .. in SM 1*(..) offset? - float * S = (float *) params->wdata + ith*2*(mxDM + CACHE_LINE_SIZE_F32) + 0*(mxDM+CACHE_LINE_SIZE_F32); - float * SM = (float *) params->wdata + ith*2*(mxDM + CACHE_LINE_SIZE_F32) + 1*(mxDM+CACHE_LINE_SIZE_F32); + for (int irep = 0; irep < nrep; ++irep) { + const int iq2 = ik2 + irep*nek2; + const int id2 = iq2; - for (int i = M; i < Mup; ++i) { - S[i] = -INFINITY; - } + // (ik2 + irep*nek2) % nek2 == ik2 + for (int iq1 = 0; iq1 < neq1; ++iq1) { + const int id1 = iq1; - for (int64_t ic = 0; ic < nek1; ++ic) { - // k indices - const int ik3 = iq3; - const int ik2 = iq2; - const int ik1 = ic; + // not sure about CACHE_LINE_SIZE_F32.. + // - maybe it must not be multiplied by 2 and excluded from .. in SM 1*(..) offset? + float * S = (float *) params->wdata + ith*2*(mxDM + CACHE_LINE_SIZE_F32) + 0*(mxDM+CACHE_LINE_SIZE_F32); + float * SM = (float *) params->wdata + ith*2*(mxDM + CACHE_LINE_SIZE_F32) + 1*(mxDM+CACHE_LINE_SIZE_F32); - // S indices - const int i1 = ik1; - - ggml_vec_dot_f32(neq0, - S + i1, - (float *) ((char *) k->data + (ik1*nbk1 + ik2*nbk2 + ik3*nbk3)), - (float *) ((char *) q->data + (iq1*nbq1 + iq2*nbq2 + iq3*nbq3))); - } - - // scale - ggml_vec_scale_f32(nek1, S, scale); - - if (masked) { - for (int64_t i = P; i < M; i++) { - if (i > P + iq1) { - S[i] = -INFINITY; - } + for (int i = M; i < Mup; ++i) { + S[i] = -INFINITY; } - } - // softmax - { - float max = -INFINITY; - ggml_vec_max_f32(M, &max, S); + const int64_t masked_begin = masked ? (P + iq1 + 1) : M; + for (int64_t ic = 0; ic < masked_begin; ++ic) { + // k indices + const int ik1 = ic; - ggml_float sum = 0.0; + // S indices + const int i1 = ik1; + + ggml_vec_dot_f32(neq0, + S + i1, + (float *) ((char *) k->data + (ik1*nbk1 + ik2*nbk2 + ik3*nbk3)), + (float *) ((char *) q->data + (iq1*nbq1 + iq2*nbq2 + iq3*nbq3))); + } + + // scale + ggml_vec_scale_f32(masked_begin, S, scale); + + for (int64_t i = masked_begin; i < M; i++) { + S[i] = -INFINITY; + } + + // softmax + // exclude known -INF S[..] values from max and loop + // dont forget to set their SM values to zero { + float max = -INFINITY; + ggml_vec_max_f32(masked_begin, &max, S); + + ggml_float sum = 0.0; + { #ifdef GGML_SOFT_MAX_ACCELERATE - max = -max; - vDSP_vsadd(SM, 1, &max, SM, 1, Mup); - vvexpf(SM, SM, &Mup); - ggml_vec_sum_f32(Mup, &sum, SM); + max = -max; + vDSP_vsadd(SM, 1, &max, SM, 1, Mup); + vvexpf(SM, SM, &Mup); + ggml_vec_sum_f32(Mup, &sum, SM); #else - uint16_t scvt[GGML_SOFT_MAX_UNROLL]; UNUSED(scvt); - ggml_float sump[GGML_SOFT_MAX_UNROLL] = { 0.0 }; + uint16_t scvt[GGML_SOFT_MAX_UNROLL]; UNUSED(scvt); + ggml_float sump[GGML_SOFT_MAX_UNROLL] = { 0.0 }; - for (int i = 0; i < Mup; i += GGML_SOFT_MAX_UNROLL) { - float * SR = S + i; - float * SW = SM + i; + for (int i = 0; i < Mup; i += GGML_SOFT_MAX_UNROLL) { + if (i >= masked_begin) { + break; + } + float * SR = S + i; + float * SW = SM + i; - for (int j = 0; j < GGML_SOFT_MAX_UNROLL; ++j) { - if (SR[j] == -INFINITY) { - SW[j] = 0.0f; - } else { + for (int j = 0; j < GGML_SOFT_MAX_UNROLL; ++j) { + if (i + j >= masked_begin) { + break; + } else if (SR[j] == -INFINITY) { + SW[j] = 0.0f; + } else { #ifndef GGML_FLASH_ATTN_EXP_FP16 - const float val = expf(SR[j] - max); + const float val = expf(SR[j] - max); #else - ggml_fp16_t s = GGML_FP32_TO_FP16(SR[j] - max); - memcpy(&scvt[j], &s, sizeof(uint16_t)); - const float val = GGML_FP16_TO_FP32(table_exp_f16[scvt[j]]); + ggml_fp16_t s = GGML_FP32_TO_FP16(SR[j] - max); + memcpy(&scvt[j], &s, sizeof(uint16_t)); + const float val = GGML_FP16_TO_FP32(table_exp_f16[scvt[j]]); #endif - sump[j] += (ggml_float)val; - SW[j] = val; + sump[j] += (ggml_float)val; + SW[j] = val; + } } } - } - for (int i = 0; i < GGML_SOFT_MAX_UNROLL; i++) { - sum += sump[i]; - } + for (int i = 0; i < GGML_SOFT_MAX_UNROLL; i++) { + sum += sump[i]; + } #endif - } - - assert(sum > 0.0); - - sum = 1.0/sum; - ggml_vec_scale_f32(M, SM, sum); - - } - - // step-by-step explanation - { - // forward-process shape grads from backward process - // parallel_for iq2,iq3: - // k[:D,:M,:,:] [D,M,:,:] grad[k][:D,:M,iq2,iq3] += grad[kcur] - // q[:D,:N,:,:] [D,N,:,:] grad[q][:D,iq1,iq2,iq3] += grad[qcur] - // v[:M,:D,:,:] [M,D,:,:] grad[v][:M,:D,iq2,iq3] += grad[vcur] - // for iq1: - // kcur = k[:D,:M,iq2,iq3] [D,M,1,1] grad[kcur] = grad[S1].T @ qcur - // qcur = q[:D,iq1,iq2,iq3] [D,1,1,1] grad[qcur] = grad[S1] @ kcur - // vcur = v[:M,:D,iq2,iq3] [M,D,1,1] grad[vcur] = grad[S5].T @ S4 - // S0 = -Inf [D,1,1,1] - // ~S1[i] = dot(kcur[:D,i], qcur) - // S1 = qcur @ kcur.T [M,1,1,1] grad[S1] = grad[S2] * scale - // S2 = S1 * scale [M,1,1,1] grad[S2] = diag_mask_zero(grad[S3], P) - // S3 = diag_mask_inf(S2, P) [M,1,1,1] grad[S3] = S4 * (grad[S4] - dot(S4, grad[S4])) - // S4 = softmax(S3) [M,1,1,1] grad[S4] = grad[S5] @ vcur - // ~S5[i] = dot(vcur[:,i], S4) - // S5 = S4 @ vcur.T [D,1,1,1] grad[S5] = d[:D,iq1,iq2,iq3] - // ~dst[i,iq1,iq2,iq3] = S5[i] ^ - // dst[:D,iq1,iq2,iq3] = S5 | grad[dst[:D,iq1,iq2,iq3]] = d[:D,iq1,iq2,iq3] - // dst backward-/ grad[dst] = d - // - // output gradients with their dependencies: - // - // grad[kcur] = grad[S1].T @ qcur - // grad[S1] = diag_mask_zero(grad[S3], P) * scale - // grad[S3] = S4 * (grad[S4] - dot(S4, grad[S4])) - // grad[S4] = grad[S5] @ vcur - // grad[S4] = d[:D,iq1,iq2,iq3] @ vcur - // grad[qcur] = grad[S1] @ kcur - // grad[vcur] = grad[S5].T @ S4 - // grad[vcur] = d[:D,iq1,iq2,iq3].T @ S4 - // - // in post-order: - // - // S1 = qcur @ kcur.T - // S2 = S1 * scale - // S3 = diag_mask_inf(S2, P) - // S4 = softmax(S3) - // grad[S4] = d[:D,iq1,iq2,iq3] @ vcur - // grad[S3] = S4 * (grad[S4] - dot(S4, grad[S4])) - // grad[S1] = diag_mask_zero(grad[S3], P) * scale - // grad[qcur] = grad[S1] @ kcur - // grad[kcur] = grad[S1].T @ qcur - // grad[vcur] = d[:D,iq1,iq2,iq3].T @ S4 - // - // using less variables (SM=S4): - // - // S = diag_mask_inf(qcur @ kcur.T * scale, P) - // SM = softmax(S) - // S = d[:D,iq1,iq2,iq3] @ vcur - // dot_SM_gradSM = dot(SM, S) - // S = SM * (S - dot(SM, S)) - // S = diag_mask_zero(S, P) * scale - // - // grad[q][:D,iq1,iq2,iq3] += S @ kcur - // grad[k][:D,:M,iq2,iq3] += S.T @ qcur - // grad[v][:M,:D,iq2,iq3] += d[:D,iq1,iq2,iq3].T @ SM - } - - // S = gradSM = d[:D,iq1,iq2,iq3] @ vcur - // S = d[:D,iq1,iq2,iq3] @ vcur - // S[:M] += vcur[:M,ic] * d[ic,iq1,iq2,iq3] - ggml_vec_set_f32(M, S, 0); - for (int64_t ic = 0; ic < D; ++ic) { - // dst indices - const int i1 = iq1; - const int i2 = iq2; - const int i3 = iq3; - - ggml_vec_mad_f32(M, - S, - (float *) ((char *) v->data + ( ic*nbv1 + i2*nbv2 + i3*nbv3)), - *(float *) ((char *) d->data + (ic*nbd0 + i1*nbd1 + i2*nbd2 + i3*nbd3))); - } - - // S = SM * (S - dot(SM, S)) - float dot_SM_gradSM = 0; - ggml_vec_dot_f32 (M, &dot_SM_gradSM, SM, S); - ggml_vec_acc1_f32(M, S, -dot_SM_gradSM); - ggml_vec_mul_f32 (M, S, S, SM); - - // S = diag_mask_zero(S, P) * scale - if (masked) { - // for (int64_t i = P + iq1 + 1; i < M; i++) { - // S[i] = 0; - // } - for (int64_t i = P; i < M; i++) { - if (i > P + iq1) { - S[i] = 0; } + + assert(sum > 0.0); + + sum = 1.0/sum; + ggml_vec_scale_f32(masked_begin, SM, sum); + } - } - ggml_vec_scale_f32(M, S, scale); - void * grad_q = (char *) dst->data; - void * grad_k = (char *) dst->data + nb0*D*N*neq2*neq3; - void * grad_v = (char *) dst->data + nb0*D*N*neq2*neq3 + nb0*D*M*neq2*neq3; + // step-by-step explanation + { + // forward-process shape grads from backward process + // parallel_for ik2,ik3: + // for irep: + // iq2 = ik2 + irep*nek2 + // k[:D,:M,:,:] [D,M,:,:] grad[k][:D,:M,ik2,ik3] += grad[kcur] + // q[:D,:N,:,:] [D,N,:,:] grad[q][:D,iq1,iq2,iq3] += grad[qcur] + // v[:M,:D,:,:] [M,D,:,:] grad[v][:M,:D,iv2,iv3] += grad[vcur] + // for iq1: + // kcur = k[:D,:M,ik2,ik3] [D,M,1,1] grad[kcur] = grad[S1].T @ qcur + // qcur = q[:D,iq1,iq2,iq3] [D,1,1,1] grad[qcur] = grad[S1] @ kcur + // vcur = v[:M,:D,iv2,iv3] [M,D,1,1] grad[vcur] = grad[S5].T @ S4 + // S0 = -Inf [D,1,1,1] + // ~S1[i] = dot(kcur[:D,i], qcur) + // S1 = qcur @ kcur.T [M,1,1,1] grad[S1] = grad[S2] * scale + // S2 = S1 * scale [M,1,1,1] grad[S2] = diag_mask_zero(grad[S3], P) + // S3 = diag_mask_inf(S2, P) [M,1,1,1] grad[S3] = S4 * (grad[S4] - dot(S4, grad[S4])) + // S4 = softmax(S3) [M,1,1,1] grad[S4] = grad[S5] @ vcur + // ~S5[i] = dot(vcur[:,i], S4) + // S5 = S4 @ vcur.T [D,1,1,1] grad[S5] = d[:D,id1,id2,id3] + // ~dst[i,iq1,iq2,iq3] = S5[i] ^ + // dst[:D,iq1,iq2,iq3] = S5 | grad[dst[:D,iq1,iq2,iq3]] = d[:D,id1,id2,id3] + // dst backward-/ grad[dst] = d + // + // output gradients with their dependencies: + // + // grad[kcur] = grad[S1].T @ qcur + // grad[S1] = diag_mask_zero(grad[S3], P) * scale + // grad[S3] = S4 * (grad[S4] - dot(S4, grad[S4])) + // grad[S4] = grad[S5] @ vcur + // grad[S4] = d[:D,id1,id2,id3] @ vcur + // grad[qcur] = grad[S1] @ kcur + // grad[vcur] = grad[S5].T @ S4 + // grad[vcur] = d[:D,id1,id2,id3].T @ S4 + // + // in post-order: + // + // S1 = qcur @ kcur.T + // S2 = S1 * scale + // S3 = diag_mask_inf(S2, P) + // S4 = softmax(S3) + // grad[S4] = d[:D,id1,id2,id3] @ vcur + // grad[S3] = S4 * (grad[S4] - dot(S4, grad[S4])) + // grad[S1] = diag_mask_zero(grad[S3], P) * scale + // grad[qcur] = grad[S1] @ kcur + // grad[kcur] = grad[S1].T @ qcur + // grad[vcur] = d[:D,id1,id2,id3].T @ S4 + // + // using less variables (SM=S4): + // + // S = diag_mask_inf(qcur @ kcur.T * scale, P) + // SM = softmax(S) + // S = d[:D,iq1,iq2,iq3] @ vcur + // dot_SM_gradSM = dot(SM, S) + // S = SM * (S - dot(SM, S)) + // S = diag_mask_zero(S, P) * scale + // + // grad[q][:D,iq1,iq2,iq3] += S @ kcur + // grad[k][:D,:M,ik2,ik3] += S.T @ qcur + // grad[v][:M,:D,iv2,iv3] += d[:D,id1,id2,id3].T @ SM + } - const size_t nbgq1 = nb0*neq0; - const size_t nbgq2 = nb0*neq0*neq1; - const size_t nbgq3 = nb0*neq0*neq1*neq2; + // S = gradSM = d[:D,id1,id2,id3] @ vcur[:,:,iv2,iv3] + // S = d[:D,id1,id2,id3] @ vcur[:,:,iv2,iv3] + // for ic: + // S[:M] += vcur[:M,ic,iv2,iv3] * d[ic,id1,id2,id3] + // exclude known future zero S[..] values from operation + ggml_vec_set_f32(masked_begin, S, 0); + for (int64_t ic = 0; ic < D; ++ic) { + ggml_vec_mad_f32(masked_begin, + S, + (float *) ((char *) v->data + ( ic*nbv1 + iv2*nbv2 + iv3*nbv3)), + *(float *) ((char *) d->data + (ic*nbd0 + id1*nbd1 + id2*nbd2 + id3*nbd3))); + } - const size_t nbgk1 = nb0*nek0; - const size_t nbgk2 = nb0*nek0*nek1; - const size_t nbgk3 = nb0*nek0*nek1*neq2; + // S = SM * (S - dot(SM, S)) + float dot_SM_gradSM = 0; + ggml_vec_dot_f32 (masked_begin, &dot_SM_gradSM, SM, S); + ggml_vec_acc1_f32(M, S, -dot_SM_gradSM); + ggml_vec_mul_f32 (masked_begin, S, S, SM); - const size_t nbgv1 = nb0*nev0; - const size_t nbgv2 = nb0*nev0*nev1; - const size_t nbgv3 = nb0*nev0*nev1*neq2; + // S = diag_mask_zero(S, P) * scale + // already done by above ggml_vec_set_f32 - // S shape [M,1] - // SM shape [M,1] - // kcur shape [D,M] - // qcur shape [D,1] - // vcur shape [M,D] - // - // grad[q][:D,iq1,iq2,iq3] += S @ kcur - // grad[q][:D,iq1,iq2,iq3] += shape[M,1] @ shape[D,M] - // grad[q][:D,iq1,iq2,iq3] += S[ic] * kcur[:D,ic] - // - //// grad[q][ic,iq1,iq2,iq3] += dot(kcur[:,ic],S.T) - //// grad[q][ic,iq1,iq2,iq3] += dot(k[:D,ic,iq2,iq3],S.T) - for (int64_t ic = 0; ic < M; ++ic) { - // dst indices - const int i1 = iq1; - const int i2 = iq2; - const int i3 = iq3; + // exclude known zero S[..] values from operation + ggml_vec_scale_f32(masked_begin, S, scale); - ggml_vec_mad_f32(D, - (float *) ((char *) grad_q + (i1*nbgq1 + i2*nbgq2 + i3*nbgq3)), - (float *) ((char *) k->data + (ic*nbk1 + i2*nbk2 + i3*nbk3)), - S[ic]); - } + // S shape [M,1] + // SM shape [M,1] + // kcur shape [D,M] + // qcur shape [D,1] + // vcur shape [M,D] - // grad[k][:D,:M,iq2,iq3] += S.T @ qcur - // grad[k][:D,ic,iq2,iq3] += S.T[0,ic] * qcur[:D,0] - // grad[k][:D,ic,iq2,iq3] += S[ic] * qcur[:D,0] - for (int64_t ic = 0; ic < M; ++ic) { - // dst indices - const int i1 = iq1; - const int i2 = iq2; - const int i3 = iq3; + // grad[q][:D,iq1,iq2,iq3] += S @ kcur + // grad[q][:D,iq1,iq2,iq3] += shape[M,1] @ shape[D,M] + // for ic: + // grad[q][:D,iq1,iq2,iq3] += S[ic] * kcur[:D,ic,ik2,ik3] + // exclude known zero S[..] values from loop + for (int64_t ic = 0; ic < masked_begin; ++ic) { + ggml_vec_mad_f32(D, + (float *) ((char *) grad_q + (iq1*nbgq1 + iq2*nbgq2 + iq3*nbgq3)), + (float *) ((char *) k->data + (ic*nbk1 + ik2*nbk2 + ik3*nbk3)), + S[ic]); + } - // ggml_vec_set_f32(D, - // (float *) ((char *) grad_k + (ic*nbgk1 + i2*nbgk2 + i3*nbgk3)), - // 0); - ggml_vec_mad_f32(D, - (float *) ((char *) grad_k + (ic*nbgk1 + i2*nbgk2 + i3*nbgk3)), - (float *) ((char *) q->data + (i1*nbq1 + i2*nbq2 + i3*nbq3)), - S[ic]); - } + // grad[k][:D,:M,iq2,iq3] += S.T @ qcur + // for ic: + // grad[k][:D,ic,iq2,iq3] += S.T[0,ic] * qcur[:D,0] + // grad[k][:D,ic,iq2,iq3] += S[ic] * qcur[:D,0] + // exclude known zero S[..] values from loop + for (int64_t ic = 0; ic < masked_begin; ++ic) { + ggml_vec_mad_f32(D, + (float *) ((char *) grad_k + (ic*nbgk1 + ik2*nbgk2 + ik3*nbgk3)), + (float *) ((char *) q->data + (iq1*nbq1 + iq2*nbq2 + iq3*nbq3)), + S[ic]); + } - // grad[v][:M,:D,iq2,iq3] += d[:D,iq1,iq2,iq3].T @ SM - // grad[v][:M,ic,iq2,iq3] += d[:D,iq1,iq2,iq3].T[0,ic] * SM[:M] - // grad[v][:M,ic,iq2,iq3] += d[ic,iq1,iq2,iq3] * SM[:M] - for (int64_t ic = 0; ic < D; ++ic) { - // dst indices - const int i1 = iq1; - const int i2 = iq2; - const int i3 = iq3; - - // ggml_vec_set_f32(M, - // (float *) ((char *) grad_v + ( ic*nbgv1 + i2*nbgv2 + i3*nbgv3)), - // 0); - ggml_vec_mad_f32(M, - (float *) ((char *) grad_v + ( ic*nbgv1 + i2*nbgv2 + i3*nbgv3)), - SM, - *(float *) ((char *) d->data + (ic*nbd0 + i1*nbd1 + i2*nbd2 + i3*nbd3))); + // grad[v][:M,:D,iv2,iv3] += d[:D,id1,id2,id3].T @ SM + // for ic: + // grad[v][:M,ic,iv2,iv3] += d[:D,id1,id2,id3].T[0,ic] * SM[:M] + // grad[v][:M,ic,iv2,iv3] += d[ic,id1,id2,id3] * SM[:M] + // exclude known zero SM[..] values from mad + for (int64_t ic = 0; ic < D; ++ic) { + ggml_vec_mad_f32(masked_begin, + (float *) ((char *) grad_v + ( ic*nbgv1 + iv2*nbgv2 + iv3*nbgv3)), + SM, + *(float *) ((char *) d->data + (ic*nbd0 + id1*nbd1 + id2*nbd2 + id3*nbd3))); + } } } } @@ -15896,7 +16381,7 @@ static void ggml_compute_forward(struct ggml_compute_params * params, struct ggm } break; case GGML_OP_GET_ROWS_BACK: { - ggml_compute_forward_get_rows_back(params, tensor->src[0], tensor->src[1], tensor->src[2], tensor); + ggml_compute_forward_get_rows_back(params, tensor->src[0], tensor->src[1], tensor); } break; case GGML_OP_DIAG: { @@ -16069,7 +16554,218 @@ static void ggml_compute_forward(struct ggml_compute_params * params, struct ggm //////////////////////////////////////////////////////////////////////////////// -static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor * tensor, bool inplace) { +static_assert(GGML_GRAPH_HASHTABLE_SIZE > GGML_MAX_NODES * 2, "GGML_GRAPH_HT_SIZE is too small"); + +static size_t hash(void * p) { + return (size_t)p % GGML_GRAPH_HASHTABLE_SIZE; +} + +static size_t hash_find(void * hash_table[], void * p) { + size_t h = hash(p); + + // linear probing + size_t i = h; + while (hash_table[i] != NULL && hash_table[i] != p) { + i = (i + 1) % GGML_GRAPH_HASHTABLE_SIZE; + if (i == h) { + // visited all hash table entries -> not found + return GGML_GRAPH_HASHTABLE_SIZE; + } + } + return i; +} + +static bool hash_insert(void * hash_table[], void * p) { + size_t i = hash_find(hash_table, p); + + GGML_ASSERT(i < GGML_GRAPH_HASHTABLE_SIZE); // assert that not full + + if (hash_table[i] == p) { + return true; + } + + // insert + GGML_ASSERT(hash_table[i] == NULL); + hash_table[i] = p; + return false; +} + +static bool hash_contains(void * hash_table[], void * p) { + size_t i = hash_find(hash_table, p); + return (i < GGML_GRAPH_HASHTABLE_SIZE) && (hash_table[i] == p); +} + +struct hash_map { + void * keys[GGML_GRAPH_HASHTABLE_SIZE]; + void * vals[GGML_GRAPH_HASHTABLE_SIZE]; +}; + +static struct hash_map * new_hash_map(void) { + struct hash_map * result = malloc(sizeof(struct hash_map)); + for (int i=0; ikeys[i] = NULL; + result->vals[i] = NULL; + } + return result; +} + +static void free_hash_map(struct hash_map * map) { + free(map); +} + +// gradient checkpointing + +static struct ggml_tensor * ggml_recompute_graph_node( + struct ggml_context * ctx, + struct ggml_cgraph * graph, + struct hash_map * replacements, + struct ggml_tensor * node) { + + if (node == NULL) { + return NULL; + } + + if (node->is_param) { + return node; + } + + if (!hash_contains(graph->visited_hash_table, node)) { + return node; + } + + int count_children = 0; + for (int k = 0; k < GGML_MAX_SRC; ++k) { + if (node->src[k]) { + ++count_children; + } + } + + if (count_children == 0) { + return node; + } + + size_t i = hash_find(replacements->keys, node); + GGML_ASSERT(i < GGML_GRAPH_HASHTABLE_SIZE); // assert that not full + if (replacements->keys[i] == node) { + return (struct ggml_tensor *) replacements->vals[i]; + } + + struct ggml_tensor * clone = ggml_new_tensor(ctx, node->type, node->n_dims, node->ne); + + // insert clone into replacements + GGML_ASSERT(replacements->keys[i] == NULL); // assert that we don't overwrite + replacements->keys[i] = node; + replacements->vals[i] = clone; + + clone->op = node->op; + clone->grad = node->grad; + clone->is_param = node->is_param; + clone->extra = node->extra; + for (int k = 0; k < GGML_MAX_DIMS; ++k) { + clone->nb[k] = node->nb[k]; + } + for (int k = 0; k < GGML_MAX_SRC; ++k) { + clone->src[k] = ggml_recompute_graph_node(ctx, graph, replacements, node->src[k]); + } + if (node->view_src != NULL) { + clone->data = (node->view_src->data == NULL) + ? NULL // view_src not yet allocated + : (char *) node->view_src->data // view_src already allocated + + node->view_offs; + clone->view_src = node->view_src; + clone->view_offs = node->view_offs; + } + + GGML_ASSERT(sizeof(node->op_params) == sizeof(int32_t) * (GGML_MAX_OP_PARAMS / sizeof(int32_t))); + GGML_ASSERT(sizeof(node->name) == GGML_MAX_NAME); + memcpy(clone->op_params, node->op_params, sizeof(node->op_params)); + ggml_format_name(clone, "%s (clone)", ggml_get_name(node)); + + return clone; +} + +void ggml_build_backward_gradient_checkpointing( + struct ggml_context * ctx, + struct ggml_cgraph * gf, + struct ggml_cgraph * gb, + struct ggml_cgraph * gb_tmp, + struct ggml_tensor * * checkpoints, + int n_checkpoints) { + *gb_tmp = *gf; + ggml_build_backward_expand(ctx, gf, gb_tmp, true); + + if (n_checkpoints <= 0) { + *gb = *gb_tmp; + return; + } + + struct hash_map * replacements = new_hash_map(); + + // insert checkpoints in replacements + for (int i = 0; i < n_checkpoints; ++i) { + size_t k = hash_find(replacements->keys, checkpoints[i]); + GGML_ASSERT(k < GGML_GRAPH_HASHTABLE_SIZE); // assert that not full + GGML_ASSERT(replacements->keys[k] == NULL); // assert that we don't overwrite + replacements->keys[k] = checkpoints[i]; + replacements->vals[k] = checkpoints[i]; + } + + *gb = *gf; + // rewrite gb_tmp->nodes[gf->n_nodes:gb_tmp->n_nodes], + // replacing references to gb_tmp->nodes[0:gf->n_nodes] ( == gf->nodes[0:gf->n_nodes]), + // by recomputing them from checkpoints + for (int i = gf->n_nodes; in_nodes; ++i) { + struct ggml_tensor * node = gb_tmp->nodes[i]; + for (int k = 0; k < GGML_MAX_SRC; ++k) { + // insert new tensors recomputing src, reusing already made replacements, + // remember replacements: remember new tensors with mapping from corresponding gf nodes + // recurse for input tensors, + // unless (i.e. terminating when) input tensors are replacments (like checkpoints) + node->src[k] = ggml_recompute_graph_node(ctx, gf, replacements, node->src[k]); + } + // insert rewritten backward node with replacements made into resulting backward graph gb + ggml_build_forward_expand(gb, node); + } + + free_hash_map(replacements); +} + +// functions to change gradients considering the case that input a might be initial gradient with zero value + +static struct ggml_tensor * ggml_add_or_set(struct ggml_context * ctx, struct ggml_tensor * a, struct ggml_tensor * b, void * zero_table[]) { + if (hash_contains(zero_table, a)) { + return b; + } else { + return ggml_add_impl(ctx, a, b, false); + } +} + +static struct ggml_tensor * ggml_acc_or_set(struct ggml_context * ctx, struct ggml_tensor * a, struct ggml_tensor * b, size_t nb1, size_t nb2, size_t nb3, size_t offset, void * zero_table[]) { + if (hash_contains(zero_table, a)) { + struct ggml_tensor * a_zero = ggml_scale(ctx, a, ggml_new_f32(ctx, 0)); + return ggml_acc_impl(ctx, a_zero, b, nb1, nb2, nb3, offset, false); + } else { + return ggml_acc_impl(ctx, a, b, nb1, nb2, nb3, offset, false); + } +} + +static struct ggml_tensor * ggml_add1_or_set(struct ggml_context * ctx, struct ggml_tensor * a, struct ggml_tensor * b, void * zero_table[]) { + if (hash_contains(zero_table, a)) { + return ggml_repeat(ctx, b, a); + } else { + return ggml_add1_impl(ctx, a, b, false); + } +} + +static struct ggml_tensor * ggml_sub_or_set(struct ggml_context * ctx, struct ggml_tensor * a, struct ggml_tensor * b, void * zero_table[]) { + if (hash_contains(zero_table, a)) { + return ggml_neg(ctx, b); + } else { + return ggml_sub_impl(ctx, a, b, false); + } +} + +static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor * tensor, void * zero_table[]) { struct ggml_tensor * src0 = tensor->src[0]; struct ggml_tensor * src1 = tensor->src[1]; @@ -16077,34 +16773,34 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor case GGML_OP_DUP: { if (src0->grad) { - src0->grad = ggml_add_impl(ctx, src0->grad, tensor->grad, inplace); + src0->grad = ggml_add_or_set(ctx, src0->grad, tensor->grad, zero_table); } } break; case GGML_OP_ADD: { if (src0->grad) { - src0->grad = ggml_add_impl(ctx, src0->grad, tensor->grad, inplace); + src0->grad = ggml_add_or_set(ctx, src0->grad, tensor->grad, zero_table); } if (src1->grad) { - src1->grad = ggml_add_impl(ctx, src1->grad, tensor->grad, inplace); + src1->grad = ggml_add_or_set(ctx, src1->grad, tensor->grad, zero_table); } } break; case GGML_OP_ADD1: { if (src0->grad) { - src0->grad = ggml_add_impl(ctx, src0->grad, tensor->grad, inplace); + src0->grad = ggml_add_or_set(ctx, src0->grad, tensor->grad, zero_table); } if (src1->grad) { - src1->grad = ggml_add_impl(ctx, + src1->grad = ggml_add_or_set(ctx, src1->grad, ggml_mean(ctx, tensor->grad), // TODO: should probably be sum instead of mean - inplace); + zero_table); } } break; case GGML_OP_ACC: { if (src0->grad) { - src0->grad = ggml_add_impl(ctx, src0->grad, tensor->grad, inplace); + src0->grad = ggml_add_or_set(ctx, src0->grad, tensor->grad, zero_table); } if (src1->grad) { const size_t nb1 = ((int32_t *) tensor->op_params)[0]; @@ -16121,117 +16817,117 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor nb1, nb2, nb3, offset); src1->grad = - ggml_add_impl(ctx, + ggml_add_or_set(ctx, src1->grad, ggml_reshape(ctx, ggml_cont(ctx, tensor_grad_view), src1->grad), - inplace); + zero_table); } } break; case GGML_OP_SUB: { if (src0->grad) { - src0->grad = ggml_add_impl(ctx, src0->grad, tensor->grad, inplace); + src0->grad = ggml_add_or_set(ctx, src0->grad, tensor->grad, zero_table); } if (src1->grad) { - src1->grad = ggml_sub_impl(ctx, src1->grad, tensor->grad, inplace); + src1->grad = ggml_sub_or_set(ctx, src1->grad, tensor->grad, zero_table); } } break; case GGML_OP_MUL: { if (src0->grad) { src0->grad = - ggml_add_impl(ctx, + ggml_add_or_set(ctx, src0->grad, ggml_mul(ctx, src1, tensor->grad), - inplace); + zero_table); } if (src1->grad) { src1->grad = - ggml_add_impl(ctx, + ggml_add_or_set(ctx, src1->grad, ggml_mul(ctx, src0, tensor->grad), - inplace); + zero_table); } } break; case GGML_OP_DIV: { if (src0->grad) { src0->grad = - ggml_add_impl(ctx, + ggml_add_or_set(ctx, src0->grad, ggml_div(ctx, tensor->grad, src1), - inplace); + zero_table); } if (src1->grad) { src1->grad = - ggml_sub_impl(ctx, + ggml_sub_or_set(ctx, src1->grad, ggml_mul(ctx, tensor->grad, ggml_div(ctx, tensor, src1)), - inplace); + zero_table); } } break; case GGML_OP_SQR: { if (src0->grad) { src0->grad = - ggml_add_impl(ctx, + ggml_add_or_set(ctx, src0->grad, ggml_scale(ctx, ggml_mul(ctx, src0, tensor->grad), ggml_new_f32(ctx, 2.0f)), - inplace); + zero_table); } } break; case GGML_OP_SQRT: { if (src0->grad) { src0->grad = - ggml_add_impl(ctx, + ggml_add_or_set(ctx, src0->grad, ggml_scale(ctx, ggml_div(ctx, tensor->grad, tensor), ggml_new_f32(ctx, 0.5f)), - inplace); + zero_table); } } break; case GGML_OP_LOG: { if (src0->grad) { src0->grad = - ggml_add_impl(ctx, + ggml_add_or_set(ctx, src0->grad, ggml_div(ctx, tensor->grad, src0), - inplace); + zero_table); } } break; case GGML_OP_SUM: { if (src0->grad) { src0->grad = - ggml_add1_impl(ctx, + ggml_add1_or_set(ctx, src0->grad, tensor->grad, - inplace); + zero_table); } } break; case GGML_OP_SUM_ROWS: { if (src0->grad) { src0->grad = - ggml_add_impl(ctx, + ggml_add_or_set(ctx, src0->grad, ggml_repeat(ctx, tensor->grad, src0->grad), - inplace); + zero_table); } } break; case GGML_OP_MEAN: @@ -16243,20 +16939,20 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor { // necessary for llama if (src0->grad) { - src0->grad = ggml_add_impl(ctx, + src0->grad = ggml_add_or_set(ctx, src0->grad, ggml_repeat_back(ctx, tensor->grad, src0->grad), - inplace); + zero_table); } } break; case GGML_OP_REPEAT_BACK: { if (src0->grad) { // TODO: test this - src0->grad = ggml_add_impl(ctx, + src0->grad = ggml_add_or_set(ctx, src0->grad, ggml_repeat(ctx, tensor->grad, src0->grad), - inplace); + zero_table); } } break; case GGML_OP_CONCAT: @@ -16278,10 +16974,10 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor float eps; memcpy(&eps, tensor->op_params, sizeof(float)); - src0->grad = ggml_add_impl(ctx, + src0->grad = ggml_add_or_set(ctx, src0->grad, ggml_rms_norm_back(ctx, src0, tensor->grad, eps), - inplace); + zero_table); } } break; case GGML_OP_RMS_NORM_BACK: @@ -16305,37 +17001,49 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor // ds0 = dt.dot(s1.T) #.T gives the transpose of the matrix // ds1 = t.T.dot(dt) - // tensor.shape [m,p] - // src0.shape [n,m] - // src1.shape [n,p] + // tensor.shape [m,p,qq,rr] + // src0.shape [n,m,q1,r1] + // src1.shape [n,p,qq,rr] // necessary for llama if (src0->grad) { + struct ggml_tensor * s1_tg = + ggml_out_prod(ctx, // [n,m,qq,rr] + src1, // [n,p,qq,rr] + tensor->grad); // [m,p,qq,rr] + const int64_t qq = s1_tg->ne[2]; + const int64_t rr = s1_tg->ne[3]; + const int64_t q1 = src0->ne[2]; + const int64_t r1 = src0->ne[3]; + const bool ne2_broadcasted = qq > q1; + const bool ne3_broadcasted = rr > r1; + if (ne2_broadcasted || ne3_broadcasted) { + // sum broadcast repetitions of s1_tg into shape of src0 + s1_tg = ggml_repeat_back(ctx, s1_tg, src0); + } src0->grad = - ggml_add_impl(ctx, - src0->grad, - ggml_out_prod(ctx, // [n,m] - src1, // [n,p] - tensor->grad), // [m,p] - inplace); + ggml_add_or_set(ctx, + src0->grad, // [n,m,q1,r1] + s1_tg, // [n,m,q1,r1] + zero_table); } if (src1->grad) { src1->grad = - ggml_add_impl(ctx, - src1->grad, - // ggml_mul_mat(ctx, // [n,p] - // ggml_cont(ctx, // [m,n] - // ggml_transpose(ctx, src0)), // [m,n] - // tensor->grad), // [m,p] + ggml_add_or_set(ctx, + src1->grad, // [n,p,qq,rr] + // ggml_mul_mat(ctx, // [n,p,qq,rr] + // ggml_cont(ctx, // [m,n,q1,r1] + // ggml_transpose(ctx, src0)), // [m,n,q1,r1] + // tensor->grad), // [m,p,qq,rr] // // when src0 is bigger than tensor->grad (this is mostly the case in llama), // // avoid transpose of src0, rather transpose smaller tensor->grad // // and then use ggml_out_prod - ggml_out_prod(ctx, // [n,p] - src0, // [n,m] - ggml_transpose(ctx, // [p,m] - tensor->grad)), // [m,p] - inplace); + ggml_out_prod(ctx, // [n,p,qq,rr] + src0, // [n,m,q1,r1] + ggml_transpose(ctx, // [p,m,qq,rr] + tensor->grad)), // [m,p,qq,rr] + zero_table); } } break; case GGML_OP_OUT_PROD: @@ -16347,17 +17055,17 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor // necessary for llama if (src0->grad) { src0->grad = - ggml_add_impl(ctx, + ggml_add_or_set(ctx, src0->grad, ggml_scale_impl(ctx, tensor->grad, src1, false), - inplace); + zero_table); } if (src1->grad) { src1->grad = - ggml_add_impl(ctx, + ggml_add_or_set(ctx, src1->grad, ggml_sum(ctx, ggml_mul_impl(ctx, tensor->grad, src0, false)), - inplace); + zero_table); } } break; case GGML_OP_SET: @@ -16384,23 +17092,23 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor } if (src0->grad) { - src0->grad = ggml_add_impl(ctx, + src0->grad = ggml_add_or_set(ctx, src0->grad, ggml_acc_impl(ctx, tensor->grad, ggml_neg(ctx, tensor_grad_view), nb1, nb2, nb3, offset, false), - inplace); + zero_table); } if (src1->grad) { src1->grad = - ggml_add_impl(ctx, + ggml_add_or_set(ctx, src1->grad, ggml_reshape(ctx, ggml_cont(ctx, tensor_grad_view), src1->grad), - inplace); + zero_table); } } break; case GGML_OP_CPY: @@ -16411,7 +17119,7 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor // tensor = src0 * 1 + src1 * 0 if (src0->grad) { // dsrc0 = dtensor * 1 - src0->grad = ggml_add_impl(ctx, src0->grad, tensor->grad, inplace); + src0->grad = ggml_add_or_set(ctx, src0->grad, tensor->grad, zero_table); } if (src1->grad) { // dsrc1 = dtensor * 0 -> noop @@ -16423,7 +17131,7 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor if (src0->grad) { GGML_ASSERT(ggml_is_contiguous(src0->grad)); GGML_ASSERT(ggml_is_contiguous(tensor->grad)); - src0->grad = ggml_add_impl(ctx, src0->grad, tensor->grad, inplace); + src0->grad = ggml_add_or_set(ctx, src0->grad, tensor->grad, zero_table); } } break; case GGML_OP_RESHAPE: @@ -16431,9 +17139,13 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor // necessary for llama if (src0->grad) { src0->grad = - ggml_add_impl(ctx, src0->grad, - ggml_reshape(ctx, tensor->grad, src0->grad), - inplace); + ggml_add_or_set(ctx, src0->grad, + ggml_reshape(ctx, + ggml_is_contiguous(tensor->grad) + ? tensor->grad + : ggml_cont(ctx, tensor->grad), + src0->grad), + zero_table); } } break; case GGML_OP_VIEW: @@ -16462,7 +17174,7 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor nb3 = (nb3 / n0) * ng; } - src0->grad = ggml_acc_impl(ctx, src0->grad, tensor->grad, nb1, nb2, nb3, offset, inplace); + src0->grad = ggml_acc_or_set(ctx, src0->grad, tensor->grad, nb1, nb2, nb3, offset, zero_table); } } break; case GGML_OP_PERMUTE: @@ -16480,14 +17192,14 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor axes_backward[axis2] = 2; axes_backward[axis3] = 3; src0->grad = - ggml_add_impl(ctx, src0->grad, + ggml_add_or_set(ctx, src0->grad, ggml_permute(ctx, tensor->grad, axes_backward[0], axes_backward[1], axes_backward[2], axes_backward[3]), - inplace); + zero_table); } } break; case GGML_OP_TRANSPOSE: @@ -16495,9 +17207,9 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor // necessary for llama if (src0->grad) { src0->grad = - ggml_add_impl(ctx, src0->grad, + ggml_add_or_set(ctx, src0->grad, ggml_transpose(ctx, tensor->grad), - inplace); + zero_table); } } break; case GGML_OP_GET_ROWS: @@ -16505,9 +17217,11 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor // necessary for llama (only for tokenizer) if (src0->grad) { src0->grad = - ggml_add_impl(ctx, src0->grad, + ggml_add_or_set(ctx, src0->grad, + // last ggml_get_rows_back argument src0->grad is only + // necessary to setup correct output shape ggml_get_rows_back(ctx, tensor->grad, src1, src0->grad), - inplace); + zero_table); } if (src1->grad) { // noop @@ -16527,9 +17241,9 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor if (src0->grad) { const int n_past = ((int32_t *) tensor->op_params)[0]; src0->grad = - ggml_add_impl(ctx, src0->grad, + ggml_add_or_set(ctx, src0->grad, ggml_diag_mask_zero_impl(ctx, tensor->grad, n_past, false), - inplace); + zero_table); } } break; case GGML_OP_DIAG_MASK_ZERO: @@ -16538,9 +17252,9 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor if (src0->grad) { const int n_past = ((int32_t *) tensor->op_params)[0]; src0->grad = - ggml_add_impl(ctx, src0->grad, + ggml_add_or_set(ctx, src0->grad, ggml_diag_mask_zero_impl(ctx, tensor->grad, n_past, false), - inplace); + zero_table); } } break; case GGML_OP_SOFT_MAX: @@ -16548,9 +17262,9 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor // necessary for llama if (src0->grad) { src0->grad = - ggml_add_impl(ctx, src0->grad, + ggml_add_or_set(ctx, src0->grad, ggml_soft_max_back(ctx, tensor->grad, tensor), - inplace); + zero_table); } } break; @@ -16575,7 +17289,7 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor memcpy(&xpos_base, (int32_t *) tensor->op_params + 6, sizeof(float)); memcpy(&xpos_down, (int32_t *) tensor->op_params + 7, sizeof(bool)); - src0->grad = ggml_add_impl(ctx, + src0->grad = ggml_add_or_set(ctx, src0->grad, ggml_rope_back(ctx, tensor->grad, @@ -16587,7 +17301,7 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor freq_scale, xpos_base, xpos_down), - inplace); + zero_table); } } break; case GGML_OP_ROPE_BACK: @@ -16606,7 +17320,7 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor memcpy(&xpos_base, (int32_t *) tensor->op_params + 6, sizeof(float)); memcpy(&xpos_down, (int32_t *) tensor->op_params + 7, sizeof(bool)); - src0->grad = ggml_add_impl(ctx, + src0->grad = ggml_add_or_set(ctx, src0->grad, ggml_rope_impl(ctx, tensor->grad, @@ -16619,7 +17333,7 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor xpos_base, xpos_down, false), - inplace); + zero_table); } } break; case GGML_OP_ALIBI: @@ -16670,145 +17384,42 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor masked); } - if (src0->grad) { - struct ggml_tensor * grad_q = NULL; - const size_t nb0 = flash_grad->nb[0]; - const size_t offset = 0; - switch(src0->n_dims) { - case 2: - { - grad_q = ggml_view_2d(ctx, - flash_grad, - src0->ne[0], - src0->ne[1], - nb0*src0->ne[0], - offset); - } break; - case 3: - { - grad_q = ggml_view_3d(ctx, - flash_grad, - src0->ne[0], - src0->ne[1], - src0->ne[2], - nb0*src0->ne[0], - nb0*src0->ne[0]*src0->ne[1], - offset); - } break; - case 4: - { - grad_q = ggml_view_4d(ctx, - flash_grad, - src0->ne[0], - src0->ne[1], - src0->ne[2], - src0->ne[3], - nb0*src0->ne[0], - nb0*src0->ne[0]*src0->ne[1], - nb0*src0->ne[0]*src0->ne[1]*src0->ne[2], - offset); - } break; - } + struct ggml_tensor * src2 = tensor->src[2]; + const int64_t elem_q = ggml_nelements(src0); + const int64_t elem_k = ggml_nelements(src1); + const int64_t elem_v = ggml_nelements(src2); - src0->grad = ggml_add_impl(ctx, + enum ggml_type result_type = flash_grad->type; + GGML_ASSERT(ggml_blck_size(result_type) == 1); + const size_t tsize = ggml_type_size(result_type); + + const size_t offs_q = 0; + const size_t offs_k = offs_q + GGML_PAD(elem_q * tsize, GGML_MEM_ALIGN); + const size_t offs_v = offs_k + GGML_PAD(elem_k * tsize, GGML_MEM_ALIGN); + + if (src0->grad) { + struct ggml_tensor * view_q = ggml_view_1d(ctx, flash_grad, elem_q, offs_q); + struct ggml_tensor * grad_q = ggml_reshape(ctx, view_q, src0); + src0->grad = ggml_add_or_set(ctx, src0->grad, grad_q, - inplace); + zero_table); } - if (src1->grad) { - struct ggml_tensor * grad_k = NULL; - const size_t nb0 = flash_grad->nb[0]; - const size_t offset = nb0*src0->ne[0]*src0->ne[1]*src0->ne[2]*src0->ne[3]; - switch(src1->n_dims) { - case 2: - { - grad_k = ggml_view_2d(ctx, - flash_grad, - src1->ne[0], - src1->ne[1], - nb0*src1->ne[0], - offset); - } break; - case 3: - { - grad_k = ggml_view_3d(ctx, - flash_grad, - src1->ne[0], - src1->ne[1], - src1->ne[2], - nb0*src1->ne[0], - nb0*src1->ne[0]*src1->ne[1], - offset); - } break; - case 4: - { - grad_k = ggml_view_4d(ctx, - flash_grad, - src1->ne[0], - src1->ne[1], - src1->ne[2], - src1->ne[3], - nb0*src1->ne[0], - nb0*src1->ne[0]*src1->ne[1], - nb0*src1->ne[0]*src1->ne[1]*src1->ne[2], - offset); - } break; - } - - src1->grad = ggml_add_impl(ctx, + struct ggml_tensor * view_k = ggml_view_1d(ctx, flash_grad, elem_k, offs_k); + struct ggml_tensor * grad_k = ggml_reshape(ctx, view_k, src1); + src1->grad = ggml_add_or_set(ctx, src1->grad, grad_k, - inplace); + zero_table); } - - struct ggml_tensor * opt0 = tensor->src[2]; - - if (opt0->grad) { - struct ggml_tensor * grad_v = NULL; - const size_t nb0 = flash_grad->nb[0]; - const size_t offset = nb0*src0->ne[0]*src0->ne[1]*src0->ne[2]*src0->ne[3] - + nb0*src1->ne[0]*src1->ne[1]*src1->ne[2]*src1->ne[3]; - switch(opt0->n_dims) { - case 2: - { - grad_v = ggml_view_2d(ctx, - flash_grad, - opt0->ne[0], - opt0->ne[1], - nb0*opt0->ne[0], - offset); - } break; - case 3: - { - grad_v = ggml_view_3d(ctx, - flash_grad, - opt0->ne[0], - opt0->ne[1], - opt0->ne[2], - nb0*opt0->ne[0], - nb0*opt0->ne[0]*opt0->ne[1], - offset); - } break; - case 4: - { - grad_v = ggml_view_4d(ctx, - flash_grad, - opt0->ne[0], - opt0->ne[1], - opt0->ne[2], - opt0->ne[3], - nb0*opt0->ne[0], - nb0*opt0->ne[0]*opt0->ne[1], - nb0*opt0->ne[0]*opt0->ne[1]*opt0->ne[2], - offset); - } break; - } - - opt0->grad = ggml_add_impl(ctx, - opt0->grad, + if (src2->grad) { + struct ggml_tensor * view_v = ggml_view_1d(ctx, flash_grad, elem_v, offs_v); + struct ggml_tensor * grad_v = ggml_reshape(ctx, view_v, src2); + src2->grad = ggml_add_or_set(ctx, + src2->grad, grad_v, - inplace); + zero_table); } } break; case GGML_OP_FLASH_FF: @@ -16828,12 +17439,12 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor { if (src0->grad) { src0->grad = - ggml_add_impl(ctx, + ggml_add_or_set(ctx, src0->grad, ggml_mul(ctx, ggml_sgn(ctx, src0), tensor->grad), - inplace); + zero_table); } } break; case GGML_UNARY_OP_SGN: @@ -16845,7 +17456,7 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor case GGML_UNARY_OP_NEG: { if (src0->grad) { - src0->grad = ggml_sub_impl(ctx, src0->grad, tensor->grad, inplace); + src0->grad = ggml_sub_or_set(ctx, src0->grad, tensor->grad, zero_table); } } break; case GGML_UNARY_OP_STEP: @@ -16865,12 +17476,12 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor case GGML_UNARY_OP_RELU: { if (src0->grad) { - src0->grad = ggml_add_impl(ctx, + src0->grad = ggml_add_or_set(ctx, src0->grad, ggml_mul(ctx, ggml_step(ctx, src0), tensor->grad), - inplace); + zero_table); } } break; case GGML_UNARY_OP_GELU: @@ -16885,10 +17496,10 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor { // necessary for llama if (src0->grad) { - src0->grad = ggml_add_impl(ctx, + src0->grad = ggml_add_or_set(ctx, src0->grad, ggml_silu_back(ctx, src0, tensor->grad), - inplace); + zero_table); } } break; default: @@ -16911,13 +17522,13 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor case GGML_OP_CROSS_ENTROPY_LOSS: { if (src0->grad) { - src0->grad = ggml_add_impl(ctx, + src0->grad = ggml_add_or_set(ctx, src0->grad, ggml_cross_entropy_loss_back(ctx, src0, src1, tensor->grad), - inplace); + zero_table); } } break; case GGML_OP_CROSS_ENTROPY_LOSS_BACK: @@ -16933,34 +17544,12 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor GGML_ASSERT(false); } break; } -} -static_assert(GGML_GRAPH_HASHTABLE_SIZE > GGML_MAX_NODES * 2, "GGML_GRAPH_HT_SIZE is too small"); - -static size_t hash(void * p) { - return (size_t)p % GGML_GRAPH_HASHTABLE_SIZE; -} - -static bool hash_insert(void * hash_table[], void * p) { - size_t h = hash(p); - - // linear probing - size_t i = h; - while (hash_table[i] != NULL && hash_table[i] != p) { - i = (i + 1) % GGML_GRAPH_HASHTABLE_SIZE; - if (i == h) { - // hash table is full - GGML_ASSERT(false); + for (int i = 0; i < GGML_MAX_SRC; ++i) { + if (tensor->src[i] && tensor->src[i]->grad) { + GGML_ASSERT(ggml_are_same_shape(tensor->src[i], tensor->src[i]->grad)); } } - - if (hash_table[i] == p) { - return true; - } - - // insert - hash_table[i] = p; - return false; } static void ggml_visit_parents(struct ggml_cgraph * cgraph, struct ggml_tensor * node) { @@ -16978,8 +17567,12 @@ static void ggml_visit_parents(struct ggml_cgraph * cgraph, struct ggml_tensor * } for (int i = 0; i < GGML_MAX_SRC; ++i) { - if (node->src[i]) { - ggml_visit_parents(cgraph, node->src[i]); + const int k = + (cgraph->order == GGML_CGRAPH_EVAL_ORDER_LEFT_TO_RIGHT) ? i : + (cgraph->order == GGML_CGRAPH_EVAL_ORDER_RIGHT_TO_LEFT) ? (GGML_MAX_SRC-1-i) : + /* unknown order, just fall back to using i*/ i; + if (node->src[k]) { + ggml_visit_parents(cgraph, node->src[k]); } } @@ -17038,6 +17631,7 @@ struct ggml_cgraph ggml_build_forward(struct ggml_tensor * tensor) { /*.grads =*/ { NULL }, /*.leafs =*/ { NULL }, /*.hash_table =*/ { NULL }, + /*.order =*/ GGML_CGRAPH_EVAL_ORDER_LEFT_TO_RIGHT, /*.perf_runs =*/ 0, /*.perf_cycles =*/ 0, /*.perf_time_us =*/ 0, @@ -17063,12 +17657,22 @@ void ggml_build_backward_expand(struct ggml_context * ctx, struct ggml_cgraph * } } + // remember original gradients which start with zero values + void ** zero_table = malloc(sizeof(void *) * GGML_GRAPH_HASHTABLE_SIZE); + memset(zero_table, 0, sizeof(void*) * GGML_GRAPH_HASHTABLE_SIZE); + for (int i = 0; i < gf->n_nodes; i++) { + if (gf->grads[i]) { + hash_insert(zero_table, gf->grads[i]); + } + } + for (int i = gf->n_nodes - 1; i >= 0; i--) { struct ggml_tensor * node = gf->nodes[i]; - // because we detached the grad nodes from the original graph, we can afford inplace operations + // inplace operations to add gradients are not created by ggml_compute_backward + // use allocator to automatically make inplace operations if (node->grad) { - ggml_compute_backward(ctx, node, keep); + ggml_compute_backward(ctx, node, zero_table); } } @@ -17080,6 +17684,8 @@ void ggml_build_backward_expand(struct ggml_context * ctx, struct ggml_cgraph * ggml_build_forward_expand(gb, node->grad); } } + + free(zero_table); } struct ggml_cgraph ggml_build_backward(struct ggml_context * ctx, struct ggml_cgraph * gf, bool keep) { @@ -17099,6 +17705,7 @@ struct ggml_cgraph * ggml_new_graph(struct ggml_context * ctx) { /*.grads =*/ { NULL }, /*.leafs =*/ { NULL }, /*.hash_table =*/ { NULL }, + /*.order =*/ GGML_CGRAPH_EVAL_ORDER_LEFT_TO_RIGHT, /*.perf_runs =*/ 0, /*.perf_cycles =*/ 0, /*.perf_time_us =*/ 0, @@ -17489,7 +18096,6 @@ struct ggml_cplan ggml_graph_plan(struct ggml_cgraph * cgraph, int n_threads) { } break; case GGML_OP_CONCAT: case GGML_OP_MUL_MAT: - case GGML_OP_OUT_PROD: { n_tasks = n_threads; @@ -17531,6 +18137,18 @@ struct ggml_cplan ggml_graph_plan(struct ggml_cgraph * cgraph, int n_threads) { cur = 0; } + work_size = MAX(work_size, cur); + } break; + case GGML_OP_OUT_PROD: + { + n_tasks = n_threads; + + size_t cur = 0; + + if (ggml_is_quantized(node->src[0]->type)) { + cur = ggml_type_size(GGML_TYPE_F32) * node->src[0]->ne[0] * n_tasks; + } + work_size = MAX(work_size, cur); } break; case GGML_OP_SCALE: @@ -18624,7 +19242,7 @@ static void ggml_opt_get_params(int np, struct ggml_tensor * const ps[], float * } static void ggml_opt_get_grad(int np, struct ggml_tensor * const ps[], float * g) { - int i = 0; + int64_t i = 0; for (int p = 0; p < np; ++p) { const int64_t ne = ggml_nelements(ps[p]) ; // TODO: add function to get all elements at once @@ -18634,6 +19252,17 @@ static void ggml_opt_get_grad(int np, struct ggml_tensor * const ps[], float * g } } +static void ggml_opt_acc_grad(int np, struct ggml_tensor * const ps[], float * g, float scale) { + int64_t i = 0; + for (int p = 0; p < np; ++p) { + const int64_t ne = ggml_nelements(ps[p]) ; + // TODO: add function to get all elements at once + for (int64_t j = 0; j < ne; ++j) { + g[i++] += ggml_get_f32_1d(ps[p]->grad, j) * scale; + } + } +} + // // ADAM // @@ -18682,26 +19311,43 @@ static enum ggml_opt_result ggml_opt_adam( const float eps = params.adam.eps; const float gclip = params.adam.gclip; const int decay_min_ndim = params.adam.decay_min_ndim; + const int n_accum = MAX(1, params.n_gradient_accumulation); + const float accum_norm = 1.0f / (float) n_accum; + float * g = opt->adam.g->data; // gradients float * m = opt->adam.m->data; // first moment float * v = opt->adam.v->data; // second moment float * pf = params.past > 0 ? opt->adam.pf->data : NULL; // past function values - if (callback) { - callback(callback_data, &sched); - } - - // compute the function value - ggml_graph_reset (gf); - ggml_set_f32 (f->grad, 1.0f); - struct ggml_cplan cplan = ggml_graph_plan(gb, params.n_threads); struct ggml_object * obj = ggml_new_object(ctx, GGML_OBJECT_WORK_BUFFER, cplan.work_size); cplan.work_data = (uint8_t *)ctx->mem_buffer + obj->offs; - ggml_graph_compute(gb, &cplan); - opt->adam.fx_prev = ggml_get_f32_1d(f, 0); + bool cancel = false; + + // compute the function value + float fx = 0; + ggml_set_zero(opt->adam.g); + for (int accum_step = 0; accum_step < n_accum; ++accum_step) { + if (callback) { + callback(callback_data, accum_step, &sched, &cancel); + if (cancel) { + break; + } + } + // ggml_graph_reset (gf); + ggml_set_f32 (f->grad, 1.0f); + ggml_graph_compute(gb, &cplan); + ggml_opt_acc_grad(np, ps, g, accum_norm); + fx += ggml_get_f32_1d(f, 0); + } + if (cancel) { + return GGML_OPT_DID_NOT_CONVERGE; + } + fx *= accum_norm; + + opt->adam.fx_prev = fx; opt->adam.fx_best = opt->adam.fx_prev; if (pf) { pf[opt->iter % params.past] = opt->adam.fx_prev; @@ -18724,6 +19370,9 @@ static enum ggml_opt_result ggml_opt_adam( // run the optimizer for (int t = 0; t < params.adam.n_iter; ++t) { + if (cancel) { + break; + } opt->iter = iter0 + t + 1; GGML_PRINT_DEBUG ("=== iter %d ===\n", t); @@ -18746,12 +19395,8 @@ static enum ggml_opt_result ggml_opt_adam( if (gclip > 0.0f) { // gradient clipping ggml_float sum = 0.0; - for (int p = 0; p < np; ++p) { - const int64_t ne = ggml_nelements(ps[p]); - for (int64_t j = 0; j < ne; ++j) { - float g = ggml_get_f32_1d(ps[p]->grad, j); - sum += (ggml_float)(g*g); - } + for (int64_t i = 0; i < nx; ++i) { + sum += (ggml_float)(g[i]*g[i]); } ggml_float norm = sqrt(sum); if (norm > (ggml_float) gclip) { @@ -18765,10 +19410,10 @@ static enum ggml_opt_result ggml_opt_adam( const int64_t ne = ggml_nelements(ps[p]); const float p_decay = ((ps[p]->n_dims >= decay_min_ndim) ? decay : 0.0f) * sched; for (int64_t j = 0; j < ne; ++j) { - float x = ggml_get_f32_1d(ps[p], j); - float g = ggml_get_f32_1d(ps[p]->grad, j)*gnorm; - m[i] = m[i]*beta1 + g*(1.0f - beta1); - v[i] = v[i]*beta2 + g*g*(1.0f - beta2); + float x = ggml_get_f32_1d(ps[p], j); + float g_ = g[i]*gnorm; + m[i] = m[i]*beta1 + g_*(1.0f - beta1); + v[i] = v[i]*beta2 + g_*g_*(1.0f - beta2); float mh = m[i]*beta1h; float vh = v[i]*beta2h; vh = sqrtf(vh) + eps; @@ -18779,16 +19424,26 @@ static enum ggml_opt_result ggml_opt_adam( } } - if (callback) { - callback(callback_data, &sched); + fx = 0; + ggml_set_zero(opt->adam.g); + for (int accum_step = 0; accum_step < n_accum; ++accum_step) { + if (callback) { + callback(callback_data, accum_step, &sched, &cancel); + if (cancel) { + break; + } + } + // ggml_graph_reset (gf); + ggml_set_f32 (f->grad, 1.0f); + ggml_graph_compute(gb, &cplan); + ggml_opt_acc_grad(np, ps, g, accum_norm); + fx += ggml_get_f32_1d(f, 0); } + if (cancel) { + break; + } + fx *= accum_norm; - ggml_graph_reset (gf); - ggml_set_f32 (f->grad, 1.0f); - - ggml_graph_compute(gb, &cplan); - - const float fx = ggml_get_f32_1d(f, 0); opt->loss_after = fx; @@ -18868,11 +19523,11 @@ static enum ggml_opt_result linesearch_backtracking( float * step, const float * xp, struct ggml_tensor * f, - struct ggml_cgraph * gf, struct ggml_cgraph * gb, struct ggml_cplan * cplan, const int np, struct ggml_tensor * ps[], + bool * cancel, ggml_opt_callback callback, void * callback_data) { int count = 0; @@ -18886,6 +19541,9 @@ static enum ggml_opt_result linesearch_backtracking( const float dec = 0.5f; const float inc = 2.1f; + const int n_accum = MAX(1, params->n_gradient_accumulation); + const float accum_norm = 1.0f / (float) n_accum; + if (*step <= 0.f) { return GGML_LINESEARCH_INVALID_PARAMETERS; } @@ -18902,13 +19560,7 @@ static enum ggml_opt_result linesearch_backtracking( finit = *fx; dgtest = params->lbfgs.ftol*dginit; - while (true) { - if (callback) { - // LBFG-S does not support learning rate -> ignore learning schedule - float sched = 0; - callback(callback_data, &sched); - } - + while (!*cancel) { ggml_vec_cpy_f32(nx, x, xp); ggml_vec_mad_f32(nx, x, d, *step); @@ -18916,14 +19568,28 @@ static enum ggml_opt_result linesearch_backtracking( { ggml_opt_set_params(np, ps, x); - ggml_graph_reset (gf); - ggml_set_f32 (f->grad, 1.0f); + *fx = 0; + memset(g, 0, sizeof(float)*nx); + for (int accum_step = 0; accum_step < n_accum; ++accum_step) { + if (callback) { + // LBFG-S does not support learning rate -> ignore learning schedule + float sched = 0; + callback(callback_data, accum_step, &sched, cancel); + if (*cancel) { + break; + } + } + // ggml_graph_reset (gf); + ggml_set_f32 (f->grad, 1.0f); + ggml_graph_compute(gb, cplan); + ggml_opt_acc_grad(np, ps, g, accum_norm); + *fx += ggml_get_f32_1d(f, 0); + } + if (*cancel) { + break; + } + *fx *= accum_norm; - ggml_graph_compute(gb, cplan); - - ggml_opt_get_grad(np, ps, g); - - *fx = ggml_get_f32_1d(f, 0); } ++count; @@ -19024,6 +19690,9 @@ static enum ggml_opt_result ggml_opt_lbfgs( float * pf = params.past > 0 ? opt->lbfgs.pf->data : NULL; // past function values + const int n_accum = MAX(1, params.n_gradient_accumulation); + const float accum_norm = 1.0f / (float) n_accum; + float fx = 0.0f; // cost function value float xnorm = 0.0f; // ||x|| float gnorm = 0.0f; // ||g|| @@ -19037,24 +19706,33 @@ static enum ggml_opt_result ggml_opt_lbfgs( float * lm_s = opt->lbfgs.lms->data; float * lm_y = opt->lbfgs.lmy->data; - if (callback) { - // LBFG-S does not support learning rate -> ignore learning schedule - float sched = 0; - callback(callback_data, &sched); - } + bool cancel = false; // evaluate the function value and its gradient { ggml_opt_set_params(np, ps, x); - ggml_graph_reset (gf); - ggml_set_f32 (f->grad, 1.0f); - - ggml_graph_compute(gb, &cplan); - - ggml_opt_get_grad(np, ps, g); - - fx = ggml_get_f32_1d(f, 0); + fx = 0; + memset(g, 0, sizeof(float)*nx); + for (int accum_step = 0; accum_step < n_accum; ++accum_step) { + if (callback) { + // LBFG-S does not support learning rate -> ignore learning schedule + float sched = 0; + callback(callback_data, accum_step, &sched, &cancel); + if (cancel) { + break; + } + } + // ggml_graph_reset (gf); + ggml_set_f32 (f->grad, 1.0f); + ggml_graph_compute(gb, &cplan); + ggml_opt_acc_grad(np, ps, g, accum_norm); + fx += ggml_get_f32_1d(f, 0); + } + if (cancel) { + return GGML_OPT_DID_NOT_CONVERGE; + } + fx *= accum_norm; opt->loss_before = fx; opt->loss_after = fx; @@ -19112,7 +19790,10 @@ static enum ggml_opt_result ggml_opt_lbfgs( ggml_vec_cpy_f32(nx, xp, x); ggml_vec_cpy_f32(nx, gp, g); - ls = linesearch_backtracking(¶ms, nx, x, &fx, g, d, step, xp, f, gf, gb, &cplan, np, ps, callback, callback_data); + ls = linesearch_backtracking(¶ms, nx, x, &fx, g, d, step, xp, f, gb, &cplan, np, ps, &cancel, callback, callback_data); + if (!cancel) { + break; + } if (ls < 0) { // linesearch failed - go back to the previous point and return @@ -19241,6 +19922,8 @@ struct ggml_opt_params ggml_opt_default_params(enum ggml_opt_type type) { .print_forward_graph = true, .print_backward_graph = true, + .n_gradient_accumulation = 1, + .adam = { .n_iter = 10000, .sched = 1.000f, @@ -19269,6 +19952,8 @@ struct ggml_opt_params ggml_opt_default_params(enum ggml_opt_type type) { .print_forward_graph = true, .print_backward_graph = true, + .n_gradient_accumulation = 1, + .lbfgs = { .m = 6, .n_iter = 100, @@ -19299,13 +19984,32 @@ GGML_API void ggml_opt_init( opt->iter = 0; opt->nx = nx; opt->just_initialized = true; + if (opt->ctx == NULL) { + struct ggml_init_params ctx_opt_params; + if (opt->params.type == GGML_OPT_ADAM) { + ctx_opt_params.mem_size = GGML_MEM_ALIGN*3 + ggml_tensor_overhead()*3 + ggml_type_size(GGML_TYPE_F32)*nx*3; + if (opt->params.past > 0) { + ctx_opt_params.mem_size += GGML_MEM_ALIGN + ggml_tensor_overhead() + ggml_type_size(GGML_TYPE_F32)*opt->params.past; + } + } else if (opt->params.type == GGML_OPT_LBFGS) { + ctx_opt_params.mem_size = GGML_MEM_ALIGN*9 + ggml_tensor_overhead()*9 + ggml_type_size(GGML_TYPE_F32)*(nx*5 + opt->params.lbfgs.m*2 + nx*opt->params.lbfgs.m*2); + if (opt->params.past > 0) { + ctx_opt_params.mem_size += GGML_MEM_ALIGN + ggml_tensor_overhead() + ggml_type_size(GGML_TYPE_F32)*opt->params.past; + } + } + ctx_opt_params.mem_buffer = NULL; + ctx_opt_params.no_alloc = false; + + opt->ctx = ggml_init(ctx_opt_params); + } switch (opt->params.type) { case GGML_OPT_ADAM: { - opt->adam.m = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, nx); - opt->adam.v = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, nx); + opt->adam.g = ggml_new_tensor_1d(opt->ctx, GGML_TYPE_F32, nx); + opt->adam.m = ggml_new_tensor_1d(opt->ctx, GGML_TYPE_F32, nx); + opt->adam.v = ggml_new_tensor_1d(opt->ctx, GGML_TYPE_F32, nx); opt->adam.pf = params.past > 0 - ? ggml_new_tensor_1d(ctx, GGML_TYPE_F32, params.past) + ? ggml_new_tensor_1d(opt->ctx, GGML_TYPE_F32, params.past) : NULL; ggml_set_zero(opt->adam.m); ggml_set_zero(opt->adam.v); @@ -19315,18 +20019,18 @@ GGML_API void ggml_opt_init( } break; case GGML_OPT_LBFGS: { - opt->lbfgs.x = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, nx); - opt->lbfgs.xp = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, nx); - opt->lbfgs.g = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, nx); - opt->lbfgs.gp = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, nx); - opt->lbfgs.d = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, nx); + opt->lbfgs.x = ggml_new_tensor_1d(opt->ctx, GGML_TYPE_F32, nx); + opt->lbfgs.xp = ggml_new_tensor_1d(opt->ctx, GGML_TYPE_F32, nx); + opt->lbfgs.g = ggml_new_tensor_1d(opt->ctx, GGML_TYPE_F32, nx); + opt->lbfgs.gp = ggml_new_tensor_1d(opt->ctx, GGML_TYPE_F32, nx); + opt->lbfgs.d = ggml_new_tensor_1d(opt->ctx, GGML_TYPE_F32, nx); opt->lbfgs.pf = params.past > 0 - ? ggml_new_tensor_1d(ctx, GGML_TYPE_F32, params.past) + ? ggml_new_tensor_1d(opt->ctx, GGML_TYPE_F32, params.past) : NULL; - opt->lbfgs.lmal = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, params.lbfgs.m); - opt->lbfgs.lmys = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, params.lbfgs.m); - opt->lbfgs.lms = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, nx, params.lbfgs.m); - opt->lbfgs.lmy = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, nx, params.lbfgs.m); + opt->lbfgs.lmal = ggml_new_tensor_1d(opt->ctx, GGML_TYPE_F32, params.lbfgs.m); + opt->lbfgs.lmys = ggml_new_tensor_1d(opt->ctx, GGML_TYPE_F32, params.lbfgs.m); + opt->lbfgs.lms = ggml_new_tensor_2d(opt->ctx, GGML_TYPE_F32, nx, params.lbfgs.m); + opt->lbfgs.lmy = ggml_new_tensor_2d(opt->ctx, GGML_TYPE_F32, nx, params.lbfgs.m); ggml_set_zero(opt->lbfgs.x); ggml_set_zero(opt->lbfgs.xp); ggml_set_zero(opt->lbfgs.g); diff --git a/ggml.h b/ggml.h index d1086173d..0d99ae23e 100644 --- a/ggml.h +++ b/ggml.h @@ -214,8 +214,8 @@ #define GGML_QNT_VERSION_FACTOR 1000 // do not change this #define GGML_MAX_DIMS 4 -#define GGML_MAX_NODES 4096 -#define GGML_MAX_PARAMS 256 +#define GGML_MAX_NODES 16384 +#define GGML_MAX_PARAMS 1024 #define GGML_MAX_CONTEXTS 64 #define GGML_MAX_SRC 6 #define GGML_MAX_NAME 64 @@ -526,7 +526,15 @@ extern "C" { // next prime after GGML_MAX_NODES // #define GGML_GRAPH_HASHTABLE_SIZE 4099 // next prime after GGML_MAX_NODES * 2 (nodes + leafs) - #define GGML_GRAPH_HASHTABLE_SIZE 8273 + // #define GGML_GRAPH_HASHTABLE_SIZE 8273 + // #define GGML_GRAPH_HASHTABLE_SIZE 16411 + #define GGML_GRAPH_HASHTABLE_SIZE 32771 + + enum ggml_cgraph_eval_order { + GGML_CGRAPH_EVAL_ORDER_LEFT_TO_RIGHT = 0, + GGML_CGRAPH_EVAL_ORDER_RIGHT_TO_LEFT, + GGML_CGRAPH_EVAL_ORDER_COUNT + }; // computation graph struct ggml_cgraph { @@ -539,6 +547,8 @@ extern "C" { void * visited_hash_table[GGML_GRAPH_HASHTABLE_SIZE]; + enum ggml_cgraph_eval_order order; + // performance int perf_runs; int64_t perf_cycles; @@ -686,12 +696,21 @@ extern "C" { GGML_API struct ggml_tensor * ggml_set_i32 (struct ggml_tensor * tensor, int32_t value); GGML_API struct ggml_tensor * ggml_set_f32 (struct ggml_tensor * tensor, float value); + // Converts a flat index into coordinates + GGML_API void ggml_unravel_index(const struct ggml_tensor * tensor, int64_t i, int64_t * i0, int64_t * i1, int64_t * i2, int64_t * i3); + GGML_API int32_t ggml_get_i32_1d(const struct ggml_tensor * tensor, int i); GGML_API void ggml_set_i32_1d(const struct ggml_tensor * tensor, int i, int32_t value); + GGML_API int32_t ggml_get_i32_nd(const struct ggml_tensor * tensor, int i0, int i1, int i2, int i3); + GGML_API void ggml_set_i32_nd(const struct ggml_tensor * tensor, int i0, int i1, int i2, int i3, int32_t value); + GGML_API float ggml_get_f32_1d(const struct ggml_tensor * tensor, int i); GGML_API void ggml_set_f32_1d(const struct ggml_tensor * tensor, int i, float value); + GGML_API float ggml_get_f32_nd(const struct ggml_tensor * tensor, int i0, int i1, int i2, int i3); + GGML_API void ggml_set_f32_nd(const struct ggml_tensor * tensor, int i0, int i1, int i2, int i3, float value); + GGML_API void * ggml_get_data (const struct ggml_tensor * tensor); GGML_API float * ggml_get_data_f32(const struct ggml_tensor * tensor); @@ -725,6 +744,12 @@ extern "C" { struct ggml_tensor * a, struct ggml_tensor * b); + GGML_API struct ggml_tensor * ggml_add_cast( + struct ggml_context * ctx, + struct ggml_tensor * a, + struct ggml_tensor * b, + enum ggml_type type); + GGML_API struct ggml_tensor * ggml_add1( struct ggml_context * ctx, struct ggml_tensor * a, @@ -834,6 +859,7 @@ extern "C" { struct ggml_tensor * a, struct ggml_tensor * b); + // sums repetitions in a into shape of b GGML_API struct ggml_tensor * ggml_repeat_back( struct ggml_context * ctx, struct ggml_tensor * a, @@ -1689,6 +1715,16 @@ extern "C" { // dump the graph into a file using the dot format GGML_API void ggml_graph_dump_dot(const struct ggml_cgraph * gb, const struct ggml_cgraph * gf, const char * filename); + // build gradient checkpointing backward graph gb for gf using provided checkpoints + // gb_tmp will contain original backward graph with rewritten backward process nodes, + // but without the second forward pass nodes. + GGML_API void ggml_build_backward_gradient_checkpointing( + struct ggml_context * ctx, + struct ggml_cgraph * gf, + struct ggml_cgraph * gb, + struct ggml_cgraph * gb_tmp, + struct ggml_tensor * * checkpoints, + int n_checkpoints); // // optimization // @@ -1723,7 +1759,7 @@ extern "C" { GGML_LINESEARCH_INVALID_PARAMETERS, }; - typedef void (*ggml_opt_callback)(void * data, float * sched); + typedef void (*ggml_opt_callback)(void * data, int accum_step, float * sched, bool * cancel); typedef void (*ggml_log_callback)(enum ggml_log_level level, const char * text, void * user_data); // optimization parameters @@ -1755,6 +1791,8 @@ extern "C" { bool print_forward_graph; bool print_backward_graph; + int n_gradient_accumulation; + // ADAM parameters struct { int n_iter; @@ -1800,6 +1838,7 @@ extern "C" { float loss_after; struct { + struct ggml_tensor * g; // current gradient struct ggml_tensor * m; // first moment struct ggml_tensor * v; // second moment struct ggml_tensor * pf; // past function values diff --git a/llama.cpp b/llama.cpp index 15de7600c..7668cb1a7 100644 --- a/llama.cpp +++ b/llama.cpp @@ -6298,7 +6298,7 @@ static void llama_model_quantize_internal(const std::string & fname_inp, const s // TODO: after the GGUF PR, this likely won't work and needs to be updated static int llama_apply_lora_from_file_internal( - const struct llama_model & model, const char * path_lora, const char * path_base_model, int n_threads + const struct llama_model & model, const char * path_lora, float scale, const char * path_base_model, int n_threads ) { LLAMA_LOG_INFO("%s: applying lora adapter from '%s' - please wait ...\n", __func__, path_lora); @@ -6327,7 +6327,7 @@ static int llama_apply_lora_from_file_internal( int32_t lora_alpha; fin.read((char *) &lora_r, sizeof(lora_r)); fin.read((char *) &lora_alpha, sizeof(lora_alpha)); - float scaling = (float)lora_alpha / (float)lora_r; + float scaling = scale * (float)lora_alpha / (float)lora_r; LLAMA_LOG_INFO("%s: r = %d, alpha = %d, scaling = %.2f\n", __func__, lora_r, lora_alpha, scaling); @@ -6543,9 +6543,10 @@ static int llama_apply_lora_from_file_internal( ggml_set_name(r, "r_cpy"); } - struct ggml_cgraph gf = ggml_build_forward(r); + struct ggml_cgraph * gf = ggml_new_graph(lora_ctx); + ggml_build_forward_expand(gf, r); - ggml_graph_compute_helper(work_buffer, &gf, n_threads); + ggml_graph_compute_helper(work_buffer, gf, n_threads); // we won't need these tensors again, reset the context to save memory ggml_free(lora_ctx); @@ -6926,6 +6927,10 @@ uint64_t llama_model_n_params(const struct llama_model * model) { return nparams; } +struct ggml_tensor * llama_get_model_tensor(struct llama_model * model, const char * name) { + return ggml_get_tensor(model->ctx, name); +} + int llama_model_quantize( const char * fname_inp, const char * fname_out, @@ -6939,18 +6944,18 @@ int llama_model_quantize( } } -int llama_apply_lora_from_file(struct llama_context * ctx, const char * path_lora, const char * path_base_model, int n_threads) { +int llama_apply_lora_from_file(struct llama_context * ctx, const char * path_lora, float scale, const char * path_base_model, int n_threads) { try { - return llama_apply_lora_from_file_internal(ctx->model, path_lora, path_base_model, n_threads); + return llama_apply_lora_from_file_internal(ctx->model, path_lora, scale, path_base_model, n_threads); } catch (const std::exception & err) { LLAMA_LOG_ERROR("%s: failed to apply lora adapter: %s\n", __func__, err.what()); return 1; } } -int llama_model_apply_lora_from_file(const struct llama_model * model, const char * path_lora, const char * path_base_model, int n_threads) { +int llama_model_apply_lora_from_file(const struct llama_model * model, const char * path_lora, float scale, const char * path_base_model, int n_threads) { try { - return llama_apply_lora_from_file_internal(*model, path_lora, path_base_model, n_threads); + return llama_apply_lora_from_file_internal(*model, path_lora, scale, path_base_model, n_threads); } catch (const std::exception & err) { LLAMA_LOG_ERROR("%s: failed to apply lora adapter: %s\n", __func__, err.what()); return 1; diff --git a/llama.h b/llama.h index e07c09f14..046284d74 100644 --- a/llama.h +++ b/llama.h @@ -287,6 +287,9 @@ extern "C" { // Returns the total number of parameters in the model LLAMA_API uint64_t llama_model_n_params(const struct llama_model * model); + // Get a llama model tensor + LLAMA_API struct ggml_tensor * llama_get_model_tensor(struct llama_model * model, const char * name); + // Returns 0 on success LLAMA_API int llama_model_quantize( const char * fname_inp, @@ -302,15 +305,17 @@ extern "C" { LLAMA_API DEPRECATED(int llama_apply_lora_from_file( struct llama_context * ctx, const char * path_lora, + float scale, const char * path_base_model, int n_threads), "use llama_model_apply_lora_from_file instead"); LLAMA_API int llama_model_apply_lora_from_file( const struct llama_model * model, - const char * path_lora, - const char * path_base_model, - int n_threads); + const char * path_lora, + float scale, + const char * path_base_model, + int n_threads); // // KV cache diff --git a/tests/test-grad0.cpp b/tests/test-grad0.cpp index 7b0c0fcdb..4f49dc55a 100644 --- a/tests/test-grad0.cpp +++ b/tests/test-grad0.cpp @@ -251,18 +251,20 @@ static bool check_gradient( printf("GGML_N_THREADS = %d\n", n_threads); } - struct ggml_cgraph gf = ggml_build_forward (f); - struct ggml_cgraph gb = ggml_build_backward(ctx0, &gf, false); + struct ggml_cgraph * gf = ggml_build_forward_ctx(ctx0, f); + struct ggml_cgraph * gb = ggml_new_graph(ctx0); + *gb = *gf; + ggml_build_backward_expand(ctx0, gf, gb, false); - ggml_graph_compute_with_ctx(ctx0, &gf, n_threads); + ggml_graph_compute_with_ctx(ctx0, gf, n_threads); - ggml_graph_reset (&gf); + ggml_graph_reset (gf); ggml_set_f32 (f->grad, 1.0f); - ggml_graph_compute_with_ctx(ctx0, &gb, n_threads); + ggml_graph_compute_with_ctx(ctx0, gb, n_threads); - // ggml_graph_dump_dot(&gf, NULL, "test-grad0-forward.dot"); - // ggml_graph_dump_dot(&gb, &gf, "test-grad0-backward.dot"); + // ggml_graph_dump_dot(gf, NULL, "test-grad0-forward.dot"); + // ggml_graph_dump_dot(gb, gf, "test-grad0-backward.dot"); for (int i = 0; i < nargs; ++i) { const int nelements = ggml_nelements(x[i]); @@ -273,13 +275,13 @@ static bool check_gradient( const float xp = x0 + eps; ggml_set_f32_1d(x[i], k, xp); - ggml_graph_compute_with_ctx(ctx0, &gf, n_threads); + ggml_graph_compute_with_ctx(ctx0, gf, n_threads); const double f0 = ggml_get_f32_1d(f, 0); ggml_set_f32_1d(x[i], k, xm); - ggml_graph_compute_with_ctx(ctx0, &gf, n_threads); + ggml_graph_compute_with_ctx(ctx0, gf, n_threads); const double f1 = ggml_get_f32_1d(f, 0); const double g0 = (f0 - f1)/(2.0*(double) eps); @@ -287,10 +289,10 @@ static bool check_gradient( ggml_set_f32_1d(x[i], k, x0); // compute gradient using backward graph - ggml_graph_reset (&gf); + ggml_graph_reset (gf); ggml_set_f32 (f->grad, 1.0f); - ggml_graph_compute_with_ctx(ctx0, &gb, n_threads); + ggml_graph_compute_with_ctx(ctx0, gb, n_threads); const double g1 = ggml_get_f32_1d(x[i]->grad, k); @@ -373,7 +375,7 @@ static bool check_mat_mul( int main(int argc, const char ** argv) { struct ggml_init_params params = { - /* .mem_size = */ 128*1024*1024, + /* .mem_size = */ 256*1024*1024, /* .mem_buffer = */ NULL, /* .no_alloc = */ false, }; @@ -405,6 +407,7 @@ int main(int argc, const char ** argv) { } } + unsigned seed_iter = 1; // original loop: 1000 int niter = 4; @@ -416,6 +419,10 @@ int main(int argc, const char ** argv) { niter = atoi(argv[1]); } for (int iter = 0; iter < niter; ++iter) { + srand(seed_iter); + seed_iter = rand(); + unsigned seed = rand(); + printf("test-grad0: iter:%d/%d\n", iter, niter); struct ggml_context * ctx0 = ggml_init(params); @@ -425,6 +432,7 @@ int main(int argc, const char ** argv) { // add f32 { + srand(seed); const int nargs = 2; for (int ndims = 1; ndims <= 4; ++ndims) { @@ -441,6 +449,7 @@ int main(int argc, const char ** argv) { // add f16 { + srand(seed); const int nargs = 2; for (int ndims = 1; ndims <= 4; ++ndims) { @@ -457,6 +466,7 @@ int main(int argc, const char ** argv) { // sub { + srand(seed); const int nargs = 2; for (int ndims = 1; ndims <= 4; ++ndims) { @@ -473,6 +483,7 @@ int main(int argc, const char ** argv) { // mul { + srand(seed); const int nargs = 2; for (int ndims = 1; ndims <= 4; ++ndims) { @@ -489,6 +500,7 @@ int main(int argc, const char ** argv) { // div { + srand(seed); const int nargs = 2; for (int ndims = 1; ndims <= 4; ++ndims) { @@ -505,6 +517,7 @@ int main(int argc, const char ** argv) { // sqr { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 2; ++ndims) { @@ -521,6 +534,7 @@ int main(int argc, const char ** argv) { // sqrt { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 2; ++ndims) { @@ -537,6 +551,7 @@ int main(int argc, const char ** argv) { // log { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 2; ++ndims) { @@ -553,6 +568,7 @@ int main(int argc, const char ** argv) { // sum { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 2; ++ndims) { @@ -570,6 +586,7 @@ int main(int argc, const char ** argv) { // sum_rows { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 4; ++ndims) { @@ -587,6 +604,7 @@ int main(int argc, const char ** argv) { // mean, not yet fully implemented if(0) { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 4; ++ndims) { @@ -604,6 +622,7 @@ int main(int argc, const char ** argv) { // argmax if (0) { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 4; ++ndims) { @@ -620,6 +639,7 @@ int main(int argc, const char ** argv) { // repeat { + srand(seed); int64_t ne2[4]; get_random_dims(ne2, 4); @@ -642,6 +662,7 @@ int main(int argc, const char ** argv) { // repeat back { + srand(seed); int64_t ne2[4]; get_random_dims(ne2, 4); @@ -680,6 +701,7 @@ int main(int argc, const char ** argv) { // sgn { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 4; ++ndims) { @@ -696,6 +718,7 @@ int main(int argc, const char ** argv) { // neg { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 4; ++ndims) { @@ -712,6 +735,7 @@ int main(int argc, const char ** argv) { // step { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 4; ++ndims) { @@ -729,6 +753,7 @@ int main(int argc, const char ** argv) { // tanh, not yet fully implemented if(0) { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 4; ++ndims) { @@ -745,33 +770,45 @@ int main(int argc, const char ** argv) { // mul_mat { + srand(seed); const int nargs = 2; - for (int ndims = 2; ndims <= 2; ++ndims) { + for (int ndims = 2; ndims <= 4; ++ndims) { + int max_nrep = (ndims >= 3) ? 2 : 1; x[0] = get_random_tensor_f32(ctx0, ndims, ne, -1.0f, 1.0f); - { - int64_t ne2[4]; - get_random_dims(ne2, 4); - ne2[0] = ne[0]; - x[1] = get_random_tensor_f32(ctx0, ndims, ne2, -1.0f, 1.0f); + for (int nrep2 = 1; nrep2 < max_nrep; ++nrep2) { + for (int nrep3 = 1; nrep3 < max_nrep; ++nrep3) { + { + int64_t ne2[4]; + get_random_dims(ne2, 4); + ne2[0] = ne[0]; + ne2[2] = nrep2 * ne[2]; + ne2[3] = nrep3 * ne[3]; + x[1] = get_random_tensor_f32(ctx0, ndims, ne2, -1.0f, 1.0f); + } + + ggml_set_param(ctx0, x[0]); + ggml_set_param(ctx0, x[1]); + + struct ggml_tensor * m = ggml_mul_mat(ctx0, x[1], x[0]); + struct ggml_tensor * f = ggml_sum(ctx0, m); + + GGML_PRINT_DEBUG("testing: mul_mat, [%lld, %lld] (%d) * [%lld, %lld] (%d)\n", x[1]->ne[0], x[1]->ne[1], x[1]->n_dims, x[0]->ne[0], x[0]->ne[1], x[0]->n_dims); + + check_gradient("mul_mat", ctx0, x, f, ndims, nargs, 1e-3f, 1e-3f, INFINITY); + if (ndims == 2) { + // check_mat_mul does not support ndims > 2 + check_mat_mul(m, x[1], x[0]); + } + } } - - ggml_set_param(ctx0, x[0]); - ggml_set_param(ctx0, x[1]); - - struct ggml_tensor * m = ggml_mul_mat(ctx0, x[1], x[0]); - struct ggml_tensor * f = ggml_sum(ctx0, m); - - GGML_PRINT_DEBUG("testing: mul_mat, [%lld, %lld] (%d) * [%lld, %lld] (%d)\n", x[1]->ne[0], x[1]->ne[1], x[1]->n_dims, x[0]->ne[0], x[0]->ne[1], x[0]->n_dims); - - check_gradient("mul_mat", ctx0, x, f, ndims, nargs, 1e-3f, 1e-3f, INFINITY); - check_mat_mul(m, x[1], x[0]); } } // elu, not yet fully implemented if(0) { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 4; ++ndims) { @@ -788,6 +825,7 @@ int main(int argc, const char ** argv) { // relu { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 4; ++ndims) { @@ -805,6 +843,7 @@ int main(int argc, const char ** argv) { // gelu, not yet fully implemented if(0) { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 4; ++ndims) { @@ -821,6 +860,7 @@ int main(int argc, const char ** argv) { // silu { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 2; ++ndims) { @@ -842,6 +882,7 @@ int main(int argc, const char ** argv) { // rms_norm { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 2; ++ndims) { @@ -858,6 +899,7 @@ int main(int argc, const char ** argv) { // scale { + srand(seed); const int nargs = 2; int64_t ne2[4]; @@ -878,6 +920,7 @@ int main(int argc, const char ** argv) { // cpy f32 { + srand(seed); const int nargs = 2; for (int ndims = 1; ndims <= 2; ++ndims) { @@ -895,6 +938,7 @@ int main(int argc, const char ** argv) { // cpy f16 { + srand(seed); const int nargs = 2; for (int ndims = 1; ndims <= 2; ++ndims) { @@ -912,6 +956,7 @@ int main(int argc, const char ** argv) { // reshape (1d->nd) { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 2; ++ndims) { @@ -935,6 +980,7 @@ int main(int argc, const char ** argv) { // reshape (nd->1d) { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 2; ++ndims) { @@ -958,6 +1004,7 @@ int main(int argc, const char ** argv) { // acc 1d { + srand(seed); int64_t ne2[4] = { 1, 1, 1, 1 }; const int nargs = 2; @@ -985,6 +1032,7 @@ int main(int argc, const char ** argv) { // acc 2d { + srand(seed); int64_t ne2[4] = { 1, 1, 1, 1 }; int64_t max_offsets[4] = { 0, 0, 0, 0 }; int64_t offsets[4] = { 0, 0, 0, 0 }; @@ -1017,6 +1065,7 @@ int main(int argc, const char ** argv) { // acc 3d { + srand(seed); int64_t ne2[4] = { 1, 1, 1, 1 }; int64_t max_offsets[4] = { 0, 0, 0, 0 }; int64_t offsets[4] = { 0, 0, 0, 0 }; @@ -1051,6 +1100,7 @@ int main(int argc, const char ** argv) { // acc 4d { + srand(seed); int64_t ne2[4] = { 1, 1, 1, 1 }; int64_t max_offsets[4] = { 0, 0, 0, 0 }; int64_t offsets[4] = { 0, 0, 0, 0 }; @@ -1087,6 +1137,7 @@ int main(int argc, const char ** argv) { // set_1d { + srand(seed); int64_t ne2[4]; const int nargs = 2; @@ -1114,6 +1165,7 @@ int main(int argc, const char ** argv) { // set_2d { + srand(seed); int64_t ne2[4]; int64_t max_offsets[4] = { 0, 0, 0, 0 }; int64_t offsets[4] = { 0, 0, 0, 0 }; @@ -1146,6 +1198,7 @@ int main(int argc, const char ** argv) { // view_1d { + srand(seed); const int nargs = 1; for (int ndims = 1; ndims <= 4; ++ndims) { @@ -1169,6 +1222,7 @@ int main(int argc, const char ** argv) { // view_2d { + srand(seed); int64_t ne2[4]; int64_t nb2[4]; @@ -1199,6 +1253,7 @@ int main(int argc, const char ** argv) { // view_3d { + srand(seed); int64_t ne2[4] = {1,1,1,1}; int64_t nb2[4] = {0,0,0,0}; @@ -1230,6 +1285,7 @@ int main(int argc, const char ** argv) { // permute { + srand(seed); int64_t ne2[4]; const int nargs = 1; @@ -1263,6 +1319,7 @@ int main(int argc, const char ** argv) { // transpose { + srand(seed); int64_t ne2[4]; const int nargs = 1; @@ -1290,6 +1347,7 @@ int main(int argc, const char ** argv) { // get_rows { + srand(seed); int64_t ne2[4] = {ne[0], ne[1], 1, 1}; int64_t ne3[4] = {1+irand(ne[1]), 1, 1, 1}; const int nargs = 1; @@ -1306,6 +1364,7 @@ int main(int argc, const char ** argv) { // diag_mask_inf { + srand(seed); const int nargs = 1; const int ndims = 2; @@ -1321,6 +1380,7 @@ int main(int argc, const char ** argv) { // diag_mask_zero { + srand(seed); const int nargs = 1; const int ndims = 2; @@ -1336,6 +1396,7 @@ int main(int argc, const char ** argv) { // softmax { + srand(seed); const int nargs = 1; int64_t ne2[4]; @@ -1357,11 +1418,16 @@ int main(int argc, const char ** argv) { ggml_new_f32(ctx0, eps)))); check_gradient("softmax", ctx0, x, f, ndims, nargs, 1e-3f, 2e-1f, INFINITY); + // NOTE: softmax forward is computed using f16 table lookup instead of using actual expf, but backward assumes actual expf. + // this may result in different gradients too finite differences. + // when this test reports errors, first try to replace the table lookup with actual expf and test again to see if just that was the cause. + // if only the table lookup causes gradients to differ this is acceptable. } } // cross_entropy_loss { + srand(seed); const int nargs = 1; int64_t ne2[4]; @@ -1392,6 +1458,7 @@ int main(int argc, const char ** argv) { // rope f32 { + srand(seed); const int nargs = 1; int64_t ne2[4]; @@ -1431,6 +1498,7 @@ int main(int argc, const char ** argv) { // rope f16 { + srand(seed); const int nargs = 1; int64_t ne2[4]; @@ -1470,6 +1538,7 @@ int main(int argc, const char ** argv) { // flash_attn f32 { + srand(seed); const int nargs = 3; int64_t ne2[4]; @@ -1482,28 +1551,31 @@ int main(int argc, const char ** argv) { for (int masked = 0; masked <= 1; ++masked) { for (int ndims = 2; ndims <= 4; ++ndims) { - int64_t neq[4] = { D, N, B, ne[3] }; - int64_t nek[4] = { D, M, B, ne[3] }; - int64_t nev[4] = { M, D, B, ne[3] }; - if (ndims == 2) { - neq[2] = 1; neq[3] = 1; - nek[2] = 1; nek[3] = 1; - nev[2] = 1; nev[3] = 1; - } else if (ndims == 3) { - neq[3] = 1; - nek[3] = 1; - nev[3] = 1; + int max_nrep = (ndims >= 3) ? 2 : 1; + for (int nrep = 1; nrep < max_nrep; ++nrep) { + int64_t neq[4] = { D, N, B*nrep, ne[3] }; + int64_t nek[4] = { D, M, B, ne[3] }; + int64_t nev[4] = { M, D, B, ne[3] }; + if (ndims == 2) { + neq[2] = 1; neq[3] = 1; + nek[2] = 1; nek[3] = 1; + nev[2] = 1; nev[3] = 1; + } else if (ndims == 3) { + neq[3] = 1; + nek[3] = 1; + nev[3] = 1; + } + x[0] = get_random_tensor_f32(ctx0, ndims, neq, -0.1250f, 0.1250f); + x[1] = get_random_tensor_f32(ctx0, ndims, nek, -0.1250f, 0.1250f); + x[2] = get_random_tensor_f32(ctx0, ndims, nev, -0.1250f, 0.1250f); + ggml_set_param(ctx0, x[0]); + ggml_set_param(ctx0, x[1]); + ggml_set_param(ctx0, x[2]); + + struct ggml_tensor * f = ggml_sum(ctx0, ggml_flash_attn(ctx0, x[0], x[1], x[2], (masked == 0))); + + check_gradient("flash_attn f32", ctx0, x, f, ndims, nargs, 1.5e-4f, 1e-3f, INFINITY); } - x[0] = get_random_tensor_f32(ctx0, ndims, neq, -0.1250f, 0.1250f); - x[1] = get_random_tensor_f32(ctx0, ndims, nek, -0.1250f, 0.1250f); - x[2] = get_random_tensor_f32(ctx0, ndims, nev, -0.1250f, 0.1250f); - ggml_set_param(ctx0, x[0]); - ggml_set_param(ctx0, x[1]); - ggml_set_param(ctx0, x[2]); - - struct ggml_tensor * f = ggml_sum(ctx0, ggml_flash_attn(ctx0, x[0], x[1], x[2], (masked == 0))); - - check_gradient("flash_attn f32", ctx0, x, f, ndims, nargs, 1.5e-4f, 1e-3f, INFINITY); } } } @@ -1511,6 +1583,7 @@ int main(int argc, const char ** argv) { // flash_attn f16, not yet fully implemented if(0) { + srand(seed); const int nargs = 3; int64_t ne2[4]; From 0512d66670de3f650c579519833c085014b0f200 Mon Sep 17 00:00:00 2001 From: Eve <139727413+netrunnereve@users.noreply.github.com> Date: Thu, 28 Sep 2023 19:31:04 +0000 Subject: [PATCH 05/73] ci : multithreaded builds (#3311) * mac and linux threads * windows * Update build.yml * Update build.yml * Update build.yml * automatically get thread count * windows syntax * try to fix freebsd * Update build.yml * Update build.yml * Update build.yml --- .github/workflows/build.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bf7d94c72..2fb101d78 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,13 +38,13 @@ jobs: - name: Build id: make_build run: | - CC=gcc-8 make + CC=gcc-8 make -j $(nproc) - name: Test id: make_test run: | - CC=gcc-8 make tests - make test + CC=gcc-8 make tests -j $(nproc) + make test -j $(nproc) ubuntu-latest-cmake: runs-on: ubuntu-latest @@ -66,7 +66,7 @@ jobs: mkdir build cd build cmake .. - cmake --build . --config Release + cmake --build . --config Release -j $(nproc) - name: Test id: cmake_test @@ -101,7 +101,7 @@ jobs: mkdir build cd build cmake .. -DLLAMA_SANITIZE_${{ matrix.sanitizer }}=ON -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} - cmake --build . --config ${{ matrix.build_type }} + cmake --build . --config ${{ matrix.build_type }} -j $(nproc) - name: Test id: cmake_test @@ -135,7 +135,7 @@ jobs: mkdir build cd build cmake -DLLAMA_MPI=ON .. - cmake --build . --config Release + cmake --build . --config Release -j $(nproc) - name: Test id: cmake_test @@ -160,13 +160,13 @@ jobs: - name: Build id: make_build run: | - make + make -j $(sysctl -n hw.logicalcpu) - name: Test id: make_test run: | - make tests - make test + make tests -j $(sysctl -n hw.logicalcpu) + make test -j $(sysctl -n hw.logicalcpu) macOS-latest-cmake: runs-on: macos-latest @@ -189,7 +189,7 @@ jobs: mkdir build cd build cmake -DLLAMA_AVX2=OFF -DLLAMA_FMA=OFF .. - cmake --build . --config Release + cmake --build . --config Release -j $(sysctl -n hw.logicalcpu) - name: Test id: cmake_test @@ -223,7 +223,7 @@ jobs: -DLLAMA_BUILD_SERVER=OFF \ -DCMAKE_SYSTEM_NAME=iOS \ -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 - cmake --build . --config Release + cmake --build . --config Release -j $(sysctl -n hw.logicalcpu) macOS-latest-cmake-tvos: runs-on: macos-latest @@ -251,7 +251,7 @@ jobs: -DLLAMA_BUILD_SERVER=OFF \ -DCMAKE_SYSTEM_NAME=tvOS \ -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 - cmake --build . --config Release + cmake --build . --config Release -j $(sysctl -n hw.logicalcpu) windows-latest-cmake: runs-on: windows-latest @@ -324,7 +324,7 @@ jobs: mkdir build cd build cmake .. ${{ matrix.defines }} - cmake --build . --config Release + cmake --build . --config Release -j ${env:NUMBER_OF_PROCESSORS} - name: Add clblast.dll id: add_clblast_dll @@ -415,7 +415,7 @@ jobs: mkdir build cd build cmake .. -DLLAMA_BUILD_SERVER=ON -DLLAMA_CUBLAS=ON -DBUILD_SHARED_LIBS=ON - cmake --build . --config Release + cmake --build . --config Release -j ${env:NUMBER_OF_PROCESSORS} - name: Determine tag name id: tag @@ -472,7 +472,7 @@ jobs: # run: | # sudo pkg update # sudo pkg install -y gmake automake autoconf pkgconf llvm15 clinfo clover opencl clblast openblas -# gmake CC=/usr/local/bin/clang15 CXX=/usr/local/bin/clang++15 +# gmake CC=/usr/local/bin/clang15 CXX=/usr/local/bin/clang++15 -j `sysctl -n hw.ncpu` release: if: ${{ ( github.event_name == 'push' && github.ref == 'refs/heads/master' ) || github.event.inputs.create_release == 'true' }} From 16bc66d9479edd5ee12ec734973554d4493c5dfa Mon Sep 17 00:00:00 2001 From: slaren Date: Thu, 28 Sep 2023 21:42:38 +0200 Subject: [PATCH 06/73] llama.cpp : split llama_context_params into model and context params (#3301) * llama.cpp : split llama_context_params into model and context params ggml-ci * fix metal build * fix freq_base/scale default to model value * llama-bench : keep the same model between tests when possible * move n_threads to llama_context_params, add n_threads_batch * fix mpi build * remove kv_size(), cuda scratch fixes * remove low-vram option * add n_threads_batch to system info, refactor to get_system_info() * add documentation about --threads-batch to the READMEs * llama-bench fix * main : fix rope freq/scale warning * llama.cpp : add llama_get_model common : add llama_tokenize from model * remove duplicated ctx/model functions ggml-ci * cuda : print total VRAM used --- common/common.cpp | 110 ++-- common/common.h | 12 +- common/train.cpp | 10 +- examples/batched/batched.cpp | 39 +- examples/beam-search/beam-search.cpp | 4 +- examples/embd-input/embd-input-lib.cpp | 13 +- examples/embd-input/embd-input-test.cpp | 2 +- examples/embedding/embedding.cpp | 21 +- examples/finetune/finetune.cpp | 12 +- examples/llama-bench/llama-bench.cpp | 159 +++-- examples/main/README.md | 4 +- examples/main/main.cpp | 41 +- examples/parallel/parallel.cpp | 6 +- examples/perplexity/perplexity.cpp | 73 +-- examples/quantize-stats/quantize-stats.cpp | 17 +- examples/save-load-state/save-load-state.cpp | 26 +- examples/server/README.md | 4 +- examples/server/server.cpp | 50 +- examples/simple/simple.cpp | 24 +- examples/speculative/speculative.cpp | 16 +- .../train-text-from-scratch.cpp | 12 +- ggml-cuda.cu | 24 +- llama.cpp | 545 ++++++++---------- llama.h | 84 ++- tests/test-tokenizer-0-falcon.cpp | 12 +- tests/test-tokenizer-0-llama.cpp | 12 +- tests/test-tokenizer-1-llama.cpp | 14 +- 27 files changed, 713 insertions(+), 633 deletions(-) diff --git a/common/common.cpp b/common/common.cpp index 8764a7be3..6e8c08cb8 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -129,6 +129,15 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) { if (params.n_threads <= 0) { params.n_threads = std::thread::hardware_concurrency(); } + } else if (arg == "-tb" || arg == "--threads-batch") { + if (++i >= argc) { + invalid_param = true; + break; + } + params.n_threads_batch = std::stoi(argv[i]); + if (params.n_threads_batch <= 0) { + params.n_threads_batch = std::thread::hardware_concurrency(); + } } else if (arg == "-p" || arg == "--prompt") { if (++i >= argc) { invalid_param = true; @@ -451,12 +460,6 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) { params.mul_mat_q = false; #else fprintf(stderr, "warning: llama.cpp was compiled without cuBLAS. Disabling mul_mat_q kernels has no effect.\n"); -#endif // GGML_USE_CUBLAS - } else if (arg == "--low-vram" || arg == "-lv") { -#ifdef GGML_USE_CUBLAS - params.low_vram = true; -#else - fprintf(stderr, "warning: llama.cpp was compiled without cuBLAS. It is not possible to set lower vram usage.\n"); #endif // GGML_USE_CUBLAS } else if (arg == "--no-mmap") { params.use_mmap = false; @@ -630,7 +633,9 @@ void gpt_print_usage(int /*argc*/, char ** argv, const gpt_params & params) { printf(" (can be specified more than once for multiple prompts).\n"); printf(" --color colorise output to distinguish prompt and user input from generations\n"); printf(" -s SEED, --seed SEED RNG seed (default: -1, use random seed for < 0)\n"); - printf(" -t N, --threads N number of threads to use during computation (default: %d)\n", params.n_threads); + printf(" -t N, --threads N number of threads to use during generation (default: %d)\n", params.n_threads); + printf(" -tb N, --threads-batch N\n"); + printf(" number of threads to use during batch and prompt processing (default: same as --threads)\n"); printf(" -p PROMPT, --prompt PROMPT\n"); printf(" prompt to start generation with (default: empty)\n"); printf(" -e, --escape process prompt escapes sequences (\\n, \\r, \\t, \\', \\\", \\\\)\n"); @@ -645,7 +650,7 @@ void gpt_print_usage(int /*argc*/, char ** argv, const gpt_params & params) { printf(" -f FNAME, --file FNAME\n"); printf(" prompt file to start generation.\n"); printf(" -n N, --n-predict N number of tokens to predict (default: %d, -1 = infinity, -2 = until context filled)\n", params.n_predict); - printf(" -c N, --ctx-size N size of the prompt context (default: %d)\n", params.n_ctx); + printf(" -c N, --ctx-size N size of the prompt context (default: %d, 0 = loaded from model)\n", params.n_ctx); printf(" -b N, --batch-size N batch size for prompt processing (default: %d)\n", params.n_batch); printf(" --top-k N top-k sampling (default: %d, 0 = disabled)\n", params.top_k); printf(" --top-p N top-p sampling (default: %.1f, 1.0 = disabled)\n", (double)params.top_p); @@ -705,7 +710,6 @@ void gpt_print_usage(int /*argc*/, char ** argv, const gpt_params & params) { printf(" -ts SPLIT --tensor-split SPLIT\n"); printf(" how to split tensors across multiple GPUs, comma-separated list of proportions, e.g. 3,1\n"); printf(" -mg i, --main-gpu i the GPU to use for scratch and small tensors\n"); - printf(" -lv, --low-vram don't allocate VRAM scratch buffer\n"); #ifdef GGML_USE_CUBLAS printf(" -nommq, --no-mul-mat-q\n"); printf(" use " GGML_CUBLAS_NAME " instead of custom mul_mat_q " GGML_CUDA_NAME " kernels.\n"); @@ -726,6 +730,18 @@ void gpt_print_usage(int /*argc*/, char ** argv, const gpt_params & params) { printf("\n"); } +std::string get_system_info(const gpt_params & params) { + std::ostringstream os; + + os << "system_info: n_threads = " << params.n_threads; + if (params.n_threads_batch != -1) { + os << " (n_threads_batch = " << params.n_threads_batch << ")"; + } + os << " / " << std::thread::hardware_concurrency() << " | " << llama_print_system_info(); + + return os.str(); +} + std::string gpt_random_prompt(std::mt19937 & rng) { const int r = rng() % 10; switch (r) { @@ -749,40 +765,50 @@ std::string gpt_random_prompt(std::mt19937 & rng) { // Model utils // -struct llama_context_params llama_context_params_from_gpt_params(const gpt_params & params) { - auto lparams = llama_context_default_params(); +struct llama_model_params llama_model_params_from_gpt_params(const gpt_params & params) { + auto mparams = llama_model_default_params(); - lparams.n_ctx = params.n_ctx; - lparams.n_batch = params.n_batch; if (params.n_gpu_layers != -1) { - lparams.n_gpu_layers = params.n_gpu_layers; + mparams.n_gpu_layers = params.n_gpu_layers; } - lparams.main_gpu = params.main_gpu; - lparams.tensor_split = params.tensor_split; - lparams.low_vram = params.low_vram; - lparams.mul_mat_q = params.mul_mat_q; - lparams.seed = params.seed; - lparams.f16_kv = params.memory_f16; - lparams.use_mmap = params.use_mmap; - lparams.use_mlock = params.use_mlock; - lparams.logits_all = params.logits_all; - lparams.embedding = params.embedding; - lparams.rope_freq_base = params.rope_freq_base; - lparams.rope_freq_scale = params.rope_freq_scale; + mparams.main_gpu = params.main_gpu; + mparams.tensor_split = params.tensor_split; + mparams.use_mmap = params.use_mmap; + mparams.use_mlock = params.use_mlock; - return lparams; + return mparams; +} + +struct llama_context_params llama_context_params_from_gpt_params(const gpt_params & params) { + auto cparams = llama_context_default_params(); + + cparams.n_ctx = params.n_ctx; + cparams.n_batch = params.n_batch; + cparams.n_threads = params.n_threads; + cparams.n_threads_batch = params.n_threads_batch == -1 ? params.n_threads : params.n_threads_batch; + cparams.mul_mat_q = params.mul_mat_q; + cparams.seed = params.seed; + cparams.f16_kv = params.memory_f16; + cparams.logits_all = params.logits_all; + cparams.embedding = params.embedding; + cparams.rope_freq_base = params.rope_freq_base; + cparams.rope_freq_scale = params.rope_freq_scale; + + return cparams; } std::tuple llama_init_from_gpt_params(gpt_params & params) { - auto lparams = llama_context_params_from_gpt_params(params); + auto mparams = llama_model_params_from_gpt_params(params); - llama_model * model = llama_load_model_from_file(params.model.c_str(), lparams); + llama_model * model = llama_load_model_from_file(params.model.c_str(), mparams); if (model == NULL) { fprintf(stderr, "%s: error: failed to load model '%s'\n", __func__, params.model.c_str()); return std::make_tuple(nullptr, nullptr); } - llama_context * lctx = llama_new_context_with_model(model, lparams); + auto cparams = llama_context_params_from_gpt_params(params); + + llama_context * lctx = llama_new_context_with_model(model, cparams); if (lctx == NULL) { fprintf(stderr, "%s: error: failed to create context with model '%s'\n", __func__, params.model.c_str()); llama_free_model(model); @@ -815,7 +841,7 @@ std::tuple llama_init_from_gpt_par LOG("warming up the model with an empty run\n"); std::vector tmp = { llama_token_bos(lctx), llama_token_eos(lctx), }; - llama_decode(lctx, llama_batch_get_one(tmp.data(), std::min(tmp.size(), (size_t) params.n_batch), 0, 0), params.n_threads); + llama_decode(lctx, llama_batch_get_one(tmp.data(), std::min(tmp.size(), (size_t) params.n_batch), 0, 0)); llama_kv_cache_tokens_rm(lctx, -1, -1); llama_reset_timings(lctx); } @@ -828,16 +854,23 @@ std::tuple llama_init_from_gpt_par // std::vector llama_tokenize( - struct llama_context * ctx, + const struct llama_context * ctx, + const std::string & text, + bool add_bos) { + return llama_tokenize(llama_get_model(ctx), text, add_bos); +} + +std::vector llama_tokenize( + const struct llama_model * model, const std::string & text, bool add_bos) { // upper limit for the number of tokens int n_tokens = text.length() + add_bos; std::vector result(n_tokens); - n_tokens = llama_tokenize(ctx, text.data(), text.length(), result.data(), result.size(), add_bos); + n_tokens = llama_tokenize(model, text.data(), text.length(), result.data(), result.size(), add_bos); if (n_tokens < 0) { result.resize(-n_tokens); - int check = llama_tokenize(ctx, text.data(), text.length(), result.data(), result.size(), add_bos); + int check = llama_tokenize(model, text.data(), text.length(), result.data(), result.size(), add_bos); GGML_ASSERT(check == -n_tokens); } else { result.resize(n_tokens); @@ -847,10 +880,10 @@ std::vector llama_tokenize( std::string llama_token_to_piece(const struct llama_context * ctx, llama_token token) { std::vector result(8, 0); - const int n_tokens = llama_token_to_piece(ctx, token, result.data(), result.size()); + const int n_tokens = llama_token_to_piece(llama_get_model(ctx), token, result.data(), result.size()); if (n_tokens < 0) { result.resize(-n_tokens); - int check = llama_token_to_piece(ctx, token, result.data(), result.size()); + int check = llama_token_to_piece(llama_get_model(ctx), token, result.data(), result.size()); GGML_ASSERT(check == -n_tokens); } else { result.resize(n_tokens); @@ -905,7 +938,7 @@ llama_token llama_sample_token( std::vector & candidates, int idx) { const int n_ctx = llama_n_ctx(ctx); - const int n_vocab = llama_n_vocab(ctx); + const int n_vocab = llama_n_vocab(llama_get_model(ctx)); const float temp = params.temp; const int32_t top_k = params.top_k <= 0 ? n_vocab : params.top_k; @@ -1191,7 +1224,7 @@ void dump_non_result_info_yaml(FILE * stream, const gpt_params & params, const l #endif // NDEBUG fprintf(stream, "model_desc: %s\n", model_desc); - fprintf(stream, "n_vocab: %d # output size of the final layer, 32001 for some models\n", llama_n_vocab(lctx)); + fprintf(stream, "n_vocab: %d # output size of the final layer, 32001 for some models\n", llama_n_vocab(llama_get_model(lctx))); #ifdef __OPTIMIZE__ fprintf(stream, "optimize: true\n"); @@ -1258,7 +1291,6 @@ void dump_non_result_info_yaml(FILE * stream, const gpt_params & params, const l fprintf(stream, " - %s: %f\n", std::get<0>(la).c_str(), std::get<1>(la)); } fprintf(stream, "lora_base: %s\n", params.lora_base.c_str()); - fprintf(stream, "low_vram: %s # default: false\n", params.low_vram ? "true" : "false"); fprintf(stream, "main_gpu: %d # default: 0\n", params.main_gpu); fprintf(stream, "memory_f32: %s # default: false\n", !params.memory_f16 ? "true" : "false"); fprintf(stream, "mirostat: %d # default: 0 (disabled)\n", params.mirostat); diff --git a/common/common.h b/common/common.h index 64601f997..0e2d3fa6c 100644 --- a/common/common.h +++ b/common/common.h @@ -36,6 +36,7 @@ int32_t get_num_physical_cores(); struct gpt_params { uint32_t seed = -1; // RNG seed int32_t n_threads = get_num_physical_cores(); + int32_t n_threads_batch = -1; // number of threads to use for batch processing (-1 = use n_threads) int32_t n_predict = -1; // new tokens to predict int32_t n_ctx = 512; // context size int32_t n_batch = 512; // batch size for prompt processing (must be >=32 to use BLAS) @@ -95,7 +96,6 @@ struct gpt_params { bool hellaswag = false; // compute HellaSwag score over random tasks from datafile supplied in prompt size_t hellaswag_tasks = 400; // number of tasks to use when computing the HellaSwag score - bool low_vram = false; // if true, reduce VRAM usage at the cost of performance bool mul_mat_q = true; // if true, use mul_mat_q kernels instead of cuBLAS bool memory_f16 = true; // use f16 instead of f32 for memory kv bool random_prompt = false; // do not randomize prompt if none provided @@ -126,6 +126,8 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params); void gpt_print_usage(int argc, char ** argv, const gpt_params & params); +std::string get_system_info(const gpt_params & params); + std::string gpt_random_prompt(std::mt19937 & rng); void process_escapes(std::string& input); @@ -135,6 +137,7 @@ void process_escapes(std::string& input); // std::tuple llama_init_from_gpt_params(gpt_params & params); +struct llama_model_params llama_model_params_from_gpt_params(const gpt_params & params); struct llama_context_params llama_context_params_from_gpt_params(const gpt_params & params); // @@ -144,7 +147,12 @@ struct llama_context_params llama_context_params_from_gpt_params(const gpt_param // tokenizes a string into a vector of tokens // should work similar to Python's `tokenizer.encode` std::vector llama_tokenize( - struct llama_context * ctx, + const struct llama_context * ctx, + const std::string & text, + bool add_bos); + +std::vector llama_tokenize( + const struct llama_model * model, const std::string & text, bool add_bos); diff --git a/common/train.cpp b/common/train.cpp index 4a1280966..35a4cf9e6 100644 --- a/common/train.cpp +++ b/common/train.cpp @@ -858,7 +858,7 @@ size_t tokenize_file( out_tokens.resize(buf.size() + n_max_tokens_overhead); int n_tokens = llama_tokenize( - lctx, + llama_get_model(lctx), buf.data(), (int) buf.size(), out_tokens.data(), @@ -867,7 +867,7 @@ size_t tokenize_file( if (n_tokens < 0) { out_tokens.resize(-n_tokens); n_tokens = llama_tokenize( - lctx, + llama_get_model(lctx), buf.data(), (int) buf.size(), out_tokens.data(), @@ -920,7 +920,7 @@ size_t tokenize_file( size_t found_max_sample_size = 0; size_t max_token_text_size = 0; - int n_vocab = llama_n_vocab(lctx); + int n_vocab = llama_n_vocab(llama_get_model(lctx)); for (llama_token token=0; token < n_vocab; ++token) { max_token_text_size = std::max( max_token_text_size, @@ -961,7 +961,7 @@ size_t tokenize_file( // tokenize the sample tok_sample.resize(buf_sample.size() + n_max_tokens_overhead); - int n_tokens = llama_tokenize(lctx, + int n_tokens = llama_tokenize(llama_get_model(lctx), buf_sample.data(), (int) buf_sample.size(), tok_sample.data(), @@ -969,7 +969,7 @@ size_t tokenize_file( false); if (n_tokens < 0) { tok_sample.resize(-n_tokens); - n_tokens = llama_tokenize(lctx, + n_tokens = llama_tokenize(llama_get_model(lctx), buf_sample.data(), (int) buf_sample.size(), tok_sample.data(), diff --git a/examples/batched/batched.cpp b/examples/batched/batched.cpp index 4dd1d553d..688ef2213 100644 --- a/examples/batched/batched.cpp +++ b/examples/batched/batched.cpp @@ -40,20 +40,35 @@ int main(int argc, char ** argv) { llama_backend_init(params.numa); - llama_context_params ctx_params = llama_context_default_params(); + // initialize the model - ctx_params.seed = 1234; - ctx_params.n_ctx = n_len*n_parallel; // FIXME: use n_kv_req instead (tokenize with model after #3301) - ctx_params.n_batch = std::max(n_len, n_parallel); - // ctx_params.n_gpu_layers = 99; // offload all layers to the GPU + llama_model_params model_params = llama_model_default_params(); - llama_model * model = llama_load_model_from_file(params.model.c_str(), ctx_params); + // model_params.n_gpu_layers = 99; // offload all layers to the GPU + + llama_model * model = llama_load_model_from_file(params.model.c_str(), model_params); if (model == NULL) { fprintf(stderr , "%s: error: unable to load model\n" , __func__); return 1; } + // tokenize the prompt + + std::vector tokens_list; + tokens_list = ::llama_tokenize(model, params.prompt, true); + const int n_kv_req = tokens_list.size() + (n_len - tokens_list.size())*n_parallel; + + // initialize the context + + llama_context_params ctx_params = llama_context_default_params(); + + ctx_params.seed = 1234; + ctx_params.n_ctx = n_kv_req; + ctx_params.n_batch = std::max(n_len, n_parallel); + ctx_params.n_threads = params.n_threads; + ctx_params.n_threads_batch = params.n_threads_batch == -1 ? params.n_threads : params.n_threads_batch; + llama_context * ctx = llama_new_context_with_model(model, ctx_params); if (ctx == NULL) { @@ -61,13 +76,7 @@ int main(int argc, char ** argv) { return 1; } - // tokenize the prompt - - std::vector tokens_list; - tokens_list = ::llama_tokenize(ctx, params.prompt, true); - const int n_ctx = llama_n_ctx(ctx); - const int n_kv_req = tokens_list.size() + (n_len - tokens_list.size())*n_parallel; LOG_TEE("\n%s: n_len = %d, n_ctx = %d, n_batch = %d, n_parallel = %d, n_kv_req = %d\n", __func__, n_len, n_ctx, ctx_params.n_batch, n_parallel, n_kv_req); @@ -106,7 +115,7 @@ int main(int argc, char ** argv) { // llama_decode will output logits only for the last token of the prompt batch.logits[batch.n_tokens - 1] = true; - if (llama_decode(ctx, batch, params.n_threads) != 0) { + if (llama_decode(ctx, batch) != 0) { LOG_TEE("%s: llama_decode() failed\n", __func__); return 1; } @@ -146,7 +155,7 @@ int main(int argc, char ** argv) { continue; } - auto n_vocab = llama_n_vocab(ctx); + auto n_vocab = llama_n_vocab(model); auto * logits = llama_get_logits_ith(ctx, i_batch[i]); std::vector candidates; @@ -210,7 +219,7 @@ int main(int argc, char ** argv) { n_cur += 1; // evaluate the current batch with the transformer model - if (llama_decode(ctx, batch, params.n_threads)) { + if (llama_decode(ctx, batch)) { fprintf(stderr, "%s : failed to eval, return code %d\n", __func__, 1); return 1; } diff --git a/examples/beam-search/beam-search.cpp b/examples/beam-search/beam-search.cpp index 63da7c3ec..f078ab8a8 100644 --- a/examples/beam-search/beam-search.cpp +++ b/examples/beam-search/beam-search.cpp @@ -160,7 +160,7 @@ int main(int argc, char ** argv) int n_past = 0; - if (llama_decode(ctx, llama_batch_get_one(tokens_list.data(), tokens_list.size(), n_past, 0), params.n_threads)) + if (llama_decode(ctx, llama_batch_get_one(tokens_list.data(), tokens_list.size(), n_past, 0))) { fprintf(stderr, "%s : failed to eval prompt.\n" , __func__ ); return 1; @@ -170,7 +170,7 @@ int main(int argc, char ** argv) beam_search_callback_data callback_data{ctx, {}}; size_t const beam_width = static_cast(params.n_beams); int const n_predict = 256; - llama_beam_search(ctx, beam_search_callback, &callback_data, beam_width, n_past, n_predict, params.n_threads); + llama_beam_search(ctx, beam_search_callback, &callback_data, beam_width, n_past, n_predict); std::cout << "\n\n"; for (llama_token const token_id : callback_data.response) { diff --git a/examples/embd-input/embd-input-lib.cpp b/examples/embd-input/embd-input-lib.cpp index 9bd4d3470..99e6bdad5 100644 --- a/examples/embd-input/embd-input-lib.cpp +++ b/examples/embd-input/embd-input-lib.cpp @@ -48,8 +48,7 @@ struct MyModel* create_mymodel(int argc, char ** argv) { // print system information { fprintf(stderr, "\n"); - fprintf(stderr, "system_info: n_threads = %d / %d | %s\n", - params.n_threads, std::thread::hardware_concurrency(), llama_print_system_info()); + fprintf(stderr, "%s\n", get_system_info(params).c_str()); } struct MyModel * ret = new MyModel(); ret->ctx = ctx; @@ -71,7 +70,7 @@ bool eval_float(void * model, float * input, int N){ MyModel * mymodel = (MyModel*)model; llama_context * ctx = mymodel->ctx; gpt_params params = mymodel->params; - int n_emb = llama_n_embd(ctx); + int n_emb = llama_n_embd(llama_get_model(ctx)); int n_past = mymodel->n_past; int n_batch = N; // params.n_batch; @@ -81,7 +80,7 @@ bool eval_float(void * model, float * input, int N){ n_eval = n_batch; } llama_batch batch = { int32_t(n_eval), nullptr, (input+i*n_emb), nullptr, nullptr, nullptr, n_past, 1, 0, }; - if (llama_decode(ctx, batch, params.n_threads)) { + if (llama_decode(ctx, batch)) { fprintf(stderr, "%s : failed to eval\n", __func__); return false; } @@ -102,7 +101,7 @@ bool eval_tokens(void * model, std::vector tokens) { if (n_eval > params.n_batch) { n_eval = params.n_batch; } - if (llama_decode(ctx, llama_batch_get_one(&tokens[i], n_eval, n_past, 0), params.n_threads)) { + if (llama_decode(ctx, llama_batch_get_one(&tokens[i], n_eval, n_past, 0))) { fprintf(stderr, "%s : failed to eval\n", __func__); return false; } @@ -133,7 +132,7 @@ llama_token sampling_id(struct MyModel* mymodel) { // out of user input, sample next token const float temp = params.temp; - const int32_t top_k = params.top_k <= 0 ? llama_n_vocab(ctx) : params.top_k; + const int32_t top_k = params.top_k <= 0 ? llama_n_vocab(llama_get_model(ctx)) : params.top_k; const float top_p = params.top_p; const float tfs_z = params.tfs_z; const float typical_p = params.typical_p; @@ -149,7 +148,7 @@ llama_token sampling_id(struct MyModel* mymodel) { llama_token id = 0; { auto logits = llama_get_logits(ctx); - auto n_vocab = llama_n_vocab(ctx); + auto n_vocab = llama_n_vocab(llama_get_model(ctx)); // Apply params.logit_bias map for (auto it = params.logit_bias.begin(); it != params.logit_bias.end(); it++) { diff --git a/examples/embd-input/embd-input-test.cpp b/examples/embd-input/embd-input-test.cpp index e5e040f62..dc4a0e488 100644 --- a/examples/embd-input/embd-input-test.cpp +++ b/examples/embd-input/embd-input-test.cpp @@ -8,7 +8,7 @@ int main(int argc, char** argv) { auto mymodel = create_mymodel(argc, argv); int N = 10; int max_tgt_len = 500; - int n_embd = llama_n_embd(mymodel->ctx); + int n_embd = llama_n_embd(llama_get_model(mymodel->ctx)); // add random float embd to test evaluation float * data = new float[N*n_embd]; diff --git a/examples/embedding/embedding.cpp b/examples/embedding/embedding.cpp index 18cefa237..14075609e 100644 --- a/examples/embedding/embedding.cpp +++ b/examples/embedding/embedding.cpp @@ -42,17 +42,18 @@ int main(int argc, char ** argv) { return 1; } - const int n_ctx_train = llama_n_ctx_train(ctx); - if (params.n_ctx > n_ctx_train) { + const int n_ctx_train = llama_n_ctx_train(model); + const int n_ctx = llama_n_ctx(ctx); + + if (n_ctx > n_ctx_train) { fprintf(stderr, "%s: warning: model was trained on only %d context tokens (%d specified)\n", - __func__, n_ctx_train, params.n_ctx); + __func__, n_ctx_train, n_ctx); } // print system information { fprintf(stderr, "\n"); - fprintf(stderr, "system_info: n_threads = %d / %d | %s\n", - params.n_threads, std::thread::hardware_concurrency(), llama_print_system_info()); + fprintf(stderr, "%s\n", get_system_info(params).c_str()); } int n_past = 0; @@ -70,15 +71,15 @@ int main(int argc, char ** argv) { fprintf(stderr, "\n"); } - if (embd_inp.size() > (size_t)params.n_ctx) { + if (embd_inp.size() > (size_t)n_ctx) { fprintf(stderr, "%s: error: prompt is longer than the context window (%zu tokens, n_ctx = %d)\n", - __func__, embd_inp.size(), params.n_ctx); + __func__, embd_inp.size(), n_ctx); return 1; } while (!embd_inp.empty()) { int n_tokens = std::min(params.n_batch, (int) embd_inp.size()); - if (llama_decode(ctx, llama_batch_get_one(embd_inp.data(), n_tokens, n_past, 0), params.n_threads)) { + if (llama_decode(ctx, llama_batch_get_one(embd_inp.data(), n_tokens, n_past, 0))) { fprintf(stderr, "%s : failed to eval\n", __func__); return 1; } @@ -86,8 +87,8 @@ int main(int argc, char ** argv) { embd_inp.erase(embd_inp.begin(), embd_inp.begin() + n_tokens); } - const int n_embd = llama_n_embd(ctx); - const auto embeddings = llama_get_embeddings(ctx); + const int n_embd = llama_n_embd(model); + const auto * embeddings = llama_get_embeddings(ctx); for (int i = 0; i < n_embd; i++) { printf("%f ", embeddings[i]); diff --git a/examples/finetune/finetune.cpp b/examples/finetune/finetune.cpp index 6e29e1c15..b61165fb7 100644 --- a/examples/finetune/finetune.cpp +++ b/examples/finetune/finetune.cpp @@ -304,7 +304,7 @@ static void init_model(struct llama_model * input, struct my_llama_model * model gguf_free(mctx); } - hparams.n_vocab = llama_model_n_vocab(input); + hparams.n_vocab = llama_n_vocab(input); hparams.n_ctx = n_ctx; // get tensors from llama_model (possibly mmapped) @@ -1540,12 +1540,14 @@ int main(int argc, char ** argv) { printf("%s: seed: %u\n", __func__, params.common.seed); srand(params.common.seed); - struct llama_context_params llama_params = llama_context_default_params(); - llama_params.vocab_only = false; + struct llama_model_params llama_mparams = llama_model_default_params(); + llama_mparams.vocab_only = false; printf("%s: model base = '%s'\n", __func__, params.fn_model_base); - struct llama_model * lmodel = llama_load_model_from_file(params.fn_model_base, llama_params); - struct llama_context * lctx = llama_new_context_with_model(lmodel, llama_params); + struct llama_model * lmodel = llama_load_model_from_file(params.fn_model_base, llama_mparams); + + struct llama_context_params llama_cparams = llama_context_default_params(); + struct llama_context * lctx = llama_new_context_with_model(lmodel, llama_cparams); struct my_llama_model model; init_model(lmodel, &model, params.fn_model_base, params.common.n_ctx); diff --git a/examples/llama-bench/llama-bench.cpp b/examples/llama-bench/llama-bench.cpp index 058e34d5c..93bb0c8b1 100644 --- a/examples/llama-bench/llama-bench.cpp +++ b/examples/llama-bench/llama-bench.cpp @@ -132,7 +132,6 @@ struct cmd_params { std::vector n_gpu_layers; std::vector main_gpu; std::vector mul_mat_q; - std::vector low_vram; std::vector> tensor_split; int reps; bool verbose; @@ -149,7 +148,6 @@ static const cmd_params cmd_params_defaults = { /* n_gpu_layers */ {99}, /* main_gpu */ {0}, /* mul_mat_q */ {true}, - /* low_vram */ {false}, /* tensor_split */ {{}}, /* reps */ 5, /* verbose */ false, @@ -167,9 +165,8 @@ static void print_usage(int /* argc */, char ** argv) { printf(" -b, --batch-size (default: %s)\n", join(cmd_params_defaults.n_batch, ",").c_str()); printf(" --memory-f32 <0|1> (default: %s)\n", join(cmd_params_defaults.f32_kv, ",").c_str()); printf(" -t, --threads (default: %s)\n", join(cmd_params_defaults.n_threads, ",").c_str()); - printf(" -ngl N, --n-gpu-layers (default: %s)\n", join(cmd_params_defaults.n_gpu_layers, ",").c_str()); - printf(" -mg i, --main-gpu (default: %s)\n", join(cmd_params_defaults.main_gpu, ",").c_str()); - printf(" -lv, --low-vram <0|1> (default: %s)\n", join(cmd_params_defaults.low_vram, ",").c_str()); + printf(" -ngl, --n-gpu-layers (default: %s)\n", join(cmd_params_defaults.n_gpu_layers, ",").c_str()); + printf(" -mg, --main-gpu (default: %s)\n", join(cmd_params_defaults.main_gpu, ",").c_str()); printf(" -mmq, --mul-mat-q <0|1> (default: %s)\n", join(cmd_params_defaults.mul_mat_q, ",").c_str()); printf(" -ts, --tensor_split \n"); printf(" -r, --repetitions (default: %d)\n", cmd_params_defaults.reps); @@ -255,13 +252,6 @@ static cmd_params parse_cmd_params(int argc, char ** argv) { break; } params.main_gpu = split(argv[i], split_delim); - } else if (arg == "-lv" || arg == "--low-vram") { - if (++i >= argc) { - invalid_param = true; - break; - } - auto p = split(argv[i], split_delim); - params.low_vram.insert(params.low_vram.end(), p.begin(), p.end()); } else if (arg == "-mmq" || arg == "--mul-mat-q") { if (++i >= argc) { invalid_param = true; @@ -336,7 +326,6 @@ static cmd_params parse_cmd_params(int argc, char ** argv) { if (params.n_gpu_layers.empty()) { params.n_gpu_layers = cmd_params_defaults.n_gpu_layers; } if (params.main_gpu.empty()) { params.main_gpu = cmd_params_defaults.main_gpu; } if (params.mul_mat_q.empty()) { params.mul_mat_q = cmd_params_defaults.mul_mat_q; } - if (params.low_vram.empty()) { params.low_vram = cmd_params_defaults.low_vram; } if (params.tensor_split.empty()) { params.tensor_split = cmd_params_defaults.tensor_split; } if (params.n_threads.empty()) { params.n_threads = cmd_params_defaults.n_threads; } @@ -353,21 +342,34 @@ struct cmd_params_instance { int n_gpu_layers; int main_gpu; bool mul_mat_q; - bool low_vram; std::array tensor_split; - llama_context_params to_llama_params() const { - llama_context_params lparams = llama_context_default_params(); - lparams.n_ctx = n_prompt + n_gen; - lparams.n_batch = n_batch; - lparams.f16_kv = !f32_kv; - lparams.n_gpu_layers = n_gpu_layers; - lparams.main_gpu = main_gpu; - lparams.mul_mat_q = mul_mat_q; - lparams.low_vram = low_vram; - lparams.tensor_split = tensor_split.data(); + llama_model_params to_llama_mparams() const { + llama_model_params mparams = llama_model_default_params(); - return lparams; + mparams.n_gpu_layers = n_gpu_layers; + mparams.main_gpu = main_gpu; + mparams.tensor_split = tensor_split.data(); + + return mparams; + } + + bool equal_mparams(const cmd_params_instance & other) const { + return model == other.model && + n_gpu_layers == other.n_gpu_layers && + main_gpu == other.main_gpu && + tensor_split == other.tensor_split; + } + + llama_context_params to_llama_cparams() const { + llama_context_params cparams = llama_context_default_params(); + + cparams.n_ctx = n_prompt + n_gen; + cparams.n_batch = n_batch; + cparams.f16_kv = !f32_kv; + cparams.mul_mat_q = mul_mat_q; + + return cparams; } }; @@ -375,13 +377,12 @@ static std::vector get_cmd_params_instances_int(const cmd_p std::vector instances; for (const auto & m : params.model) - for (const auto & nb : params.n_batch) - for (const auto & fk : params.f32_kv) for (const auto & nl : params.n_gpu_layers) for (const auto & mg : params.main_gpu) - for (const auto & mmq : params.mul_mat_q) - for (const auto & lv : params.low_vram) for (const auto & ts : params.tensor_split) + for (const auto & nb : params.n_batch) + for (const auto & fk : params.f32_kv) + for (const auto & mmq : params.mul_mat_q) for (const auto & nt : params.n_threads) { cmd_params_instance instance = { /* .model = */ m, @@ -393,7 +394,6 @@ static std::vector get_cmd_params_instances_int(const cmd_p /* .n_gpu_layers = */ nl, /* .main_gpu = */ mg, /* .mul_mat_q = */ mmq, - /* .low_vram = */ lv, /* .tensor_split = */ ts, }; instances.push_back(instance); @@ -404,6 +404,56 @@ static std::vector get_cmd_params_instances_int(const cmd_p static std::vector get_cmd_params_instances(const cmd_params & params) { std::vector instances; +#if 1 + // this ordering minimizes the number of times that each model needs to be reloaded + for (const auto & m : params.model) + for (const auto & nl : params.n_gpu_layers) + for (const auto & mg : params.main_gpu) + for (const auto & ts : params.tensor_split) + for (const auto & nb : params.n_batch) + for (const auto & fk : params.f32_kv) + for (const auto & mmq : params.mul_mat_q) + for (const auto & nt : params.n_threads) { + for (const auto & n_prompt : params.n_prompt) { + if (n_prompt == 0) { + continue; + } + cmd_params_instance instance = { + /* .model = */ m, + /* .n_prompt = */ n_prompt, + /* .n_gen = */ 0, + /* .n_batch = */ nb, + /* .f32_kv = */ fk, + /* .n_threads = */ nt, + /* .n_gpu_layers = */ nl, + /* .main_gpu = */ mg, + /* .mul_mat_q = */ mmq, + /* .tensor_split = */ ts, + }; + instances.push_back(instance); + } + + for (const auto & n_gen : params.n_gen) { + if (n_gen == 0) { + continue; + } + cmd_params_instance instance = { + /* .model = */ m, + /* .n_prompt = */ 0, + /* .n_gen = */ n_gen, + /* .n_batch = */ nb, + /* .f32_kv = */ fk, + /* .n_threads = */ nt, + /* .n_gpu_layers = */ nl, + /* .main_gpu = */ mg, + /* .mul_mat_q = */ mmq, + /* .tensor_split = */ ts, + }; + instances.push_back(instance); + } + } +#else + // this ordering separates the prompt and generation tests for (const auto & n_prompt : params.n_prompt) { if (n_prompt == 0) { continue; @@ -419,6 +469,7 @@ static std::vector get_cmd_params_instances(const cmd_param auto instances_gen = get_cmd_params_instances_int(params, n_gen, 0); instances.insert(instances.end(), instances_gen.begin(), instances_gen.end()); } +#endif return instances; } @@ -443,7 +494,6 @@ struct test { int n_gpu_layers; int main_gpu; bool mul_mat_q; - bool low_vram; std::array tensor_split; int n_prompt; int n_gen; @@ -463,7 +513,6 @@ struct test { n_gpu_layers = inst.n_gpu_layers; main_gpu = inst.main_gpu; mul_mat_q = inst.mul_mat_q; - low_vram = inst.low_vram; tensor_split = inst.tensor_split; n_prompt = inst.n_prompt; n_gen = inst.n_gen; @@ -524,7 +573,7 @@ struct test { "cpu_info", "gpu_info", "model_filename", "model_type", "model_size", "model_n_params", "n_batch", "n_threads", "f16_kv", - "n_gpu_layers", "main_gpu", "mul_mat_q", "low_vram", "tensor_split", + "n_gpu_layers", "main_gpu", "mul_mat_q", "tensor_split", "n_prompt", "n_gen", "test_time", "avg_ns", "stddev_ns", "avg_ts", "stddev_ts" @@ -543,7 +592,7 @@ struct test { return INT; } if (field == "cuda" || field == "opencl" || field == "metal" || field == "gpu_blas" || field == "blas" || - field == "f16_kv" || field == "mul_mat_q" || field == "low_vram") { + field == "f16_kv" || field == "mul_mat_q") { return BOOL; } if (field == "avg_ts" || field == "stddev_ts") { @@ -574,7 +623,7 @@ struct test { cpu_info, gpu_info, model_filename, model_type, std::to_string(model_size), std::to_string(model_n_params), std::to_string(n_batch), std::to_string(n_threads), std::to_string(!f32_kv), - std::to_string(n_gpu_layers), std::to_string(main_gpu), std::to_string(mul_mat_q), std::to_string(low_vram), tensor_split_str, + std::to_string(n_gpu_layers), std::to_string(main_gpu), std::to_string(mul_mat_q), tensor_split_str, std::to_string(n_prompt), std::to_string(n_gen), test_time, std::to_string(avg_ns()), std::to_string(stdev_ns()), std::to_string(avg_ts()), std::to_string(stdev_ts()) @@ -766,9 +815,6 @@ struct markdown_printer : public printer { if (params.mul_mat_q.size() > 1 || params.mul_mat_q != cmd_params_defaults.mul_mat_q) { fields.push_back("mul_mat_q"); } - if (params.low_vram.size() > 1 || params.low_vram != cmd_params_defaults.low_vram) { - fields.push_back("low_vram"); - } if (params.tensor_split.size() > 1 || params.tensor_split != cmd_params_defaults.tensor_split) { fields.push_back("tensor_split"); } @@ -889,17 +935,23 @@ struct sql_printer : public printer { static void test_prompt(llama_context * ctx, int n_prompt, int n_past, int n_batch, int n_threads) { std::vector tokens(n_batch, llama_token_bos(ctx)); int n_processed = 0; + + llama_set_n_threads(ctx, n_threads, n_threads); + while (n_processed < n_prompt) { int n_tokens = std::min(n_prompt - n_processed, n_batch); - llama_decode(ctx, llama_batch_get_one(tokens.data(), n_tokens, n_past + n_processed, 0), n_threads); + llama_decode(ctx, llama_batch_get_one(tokens.data(), n_tokens, n_past + n_processed, 0)); n_processed += n_tokens; } } static void test_gen(llama_context * ctx, int n_gen, int n_past, int n_threads) { llama_token token = llama_token_bos(ctx); + + llama_set_n_threads(ctx, n_threads, n_threads); + for (int i = 0; i < n_gen; i++) { - llama_decode(ctx, llama_batch_get_one(&token, 1, n_past + i, 0), n_threads); + llama_decode(ctx, llama_batch_get_one(&token, 1, n_past + i, 0)); } } @@ -958,17 +1010,25 @@ int main(int argc, char ** argv) { std::vector params_instances = get_cmd_params_instances(params); - for (const auto & inst : params_instances) { - // TODO: keep the model between tests when possible - llama_context_params lparams = inst.to_llama_params(); + llama_model * lmodel = nullptr; + const cmd_params_instance * prev_inst = nullptr; - llama_model * lmodel = llama_load_model_from_file(inst.model.c_str(), lparams); - if (lmodel == NULL) { - fprintf(stderr, "%s: error: failed to load model '%s'\n", __func__, inst.model.c_str()); - return 1; + for (const auto & inst : params_instances) { + // keep the same model between tests when possible + if (!lmodel || !prev_inst || !inst.equal_mparams(*prev_inst)) { + if (lmodel) { + llama_free_model(lmodel); + } + + lmodel = llama_load_model_from_file(inst.model.c_str(), inst.to_llama_mparams()); + if (lmodel == NULL) { + fprintf(stderr, "%s: error: failed to load model '%s'\n", __func__, inst.model.c_str()); + return 1; + } + prev_inst = &inst; } - llama_context * ctx = llama_new_context_with_model(lmodel, lparams); + llama_context * ctx = llama_new_context_with_model(lmodel, inst.to_llama_cparams()); if (ctx == NULL) { fprintf(stderr, "%s: error: failed to create context with model '%s'\n", __func__, inst.model.c_str()); llama_free_model(lmodel); @@ -1006,9 +1066,10 @@ int main(int argc, char ** argv) { llama_print_timings(ctx); llama_free(ctx); - llama_free_model(lmodel); } + llama_free_model(lmodel); + p->print_footer(); llama_backend_free(); diff --git a/examples/main/README.md b/examples/main/README.md index 26e1e28dd..a9561c383 100644 --- a/examples/main/README.md +++ b/examples/main/README.md @@ -262,7 +262,8 @@ These options help improve the performance and memory usage of the LLaMA models. ### Number of Threads -- `-t N, --threads N`: Set the number of threads to use during computation. For optimal performance, it is recommended to set this value to the number of physical CPU cores your system has (as opposed to the logical number of cores). Using the correct number of threads can greatly improve performance. +- `-t N, --threads N`: Set the number of threads to use during generation. For optimal performance, it is recommended to set this value to the number of physical CPU cores your system has (as opposed to the logical number of cores). Using the correct number of threads can greatly improve performance. +- `-tb N, --threads-batch N`: Set the number of threads to use during batch and prompt processing. In some systems, it is beneficial to use a higher number of threads during batch processing than during generation. If not specified, the number of threads used for batch processing will be the same as the number of threads used for generation. ### Mlock @@ -305,6 +306,5 @@ These options provide extra functionality and customization when running the LLa - `-ngl N, --n-gpu-layers N`: When compiled with appropriate support (currently CLBlast or cuBLAS), this option allows offloading some layers to the GPU for computation. Generally results in increased performance. - `-mg i, --main-gpu i`: When using multiple GPUs this option controls which GPU is used for small tensors for which the overhead of splitting the computation across all GPUs is not worthwhile. The GPU in question will use slightly more VRAM to store a scratch buffer for temporary results. By default GPU 0 is used. Requires cuBLAS. - `-ts SPLIT, --tensor-split SPLIT`: When using multiple GPUs this option controls how large tensors should be split across all GPUs. `SPLIT` is a comma-separated list of non-negative values that assigns the proportion of data that each GPU should get in order. For example, "3,2" will assign 60% of the data to GPU 0 and 40% to GPU 1. By default the data is split in proportion to VRAM but this may not be optimal for performance. Requires cuBLAS. -- `-lv, --low-vram`: Do not allocate a VRAM scratch buffer for holding temporary results. Reduces VRAM usage at the cost of performance, particularly prompt processing speed. Requires cuBLAS. - `--lora FNAME`: Apply a LoRA (Low-Rank Adaptation) adapter to the model (implies --no-mmap). This allows you to adapt the pretrained model to specific tasks or domains. - `--lora-base FNAME`: Optional model to use as a base for the layers modified by the LoRA adapter. This flag is used in conjunction with the `--lora` flag, and specifies the base model for the adaptation. diff --git a/examples/main/main.cpp b/examples/main/main.cpp index 1ed543cbc..fd506773f 100644 --- a/examples/main/main.cpp +++ b/examples/main/main.cpp @@ -140,12 +140,17 @@ int main(int argc, char ** argv) { return 0; } - if (params.rope_freq_base != 10000.0) { - LOG_TEE("%s: warning: changing RoPE frequency base to %g (default 10000.0)\n", __func__, params.rope_freq_base); + if (params.n_ctx != 0 && params.n_ctx < 8) { + LOG_TEE("%s: warning: minimum context size is 8, using minimum size.\n", __func__); + params.n_ctx = 8; } - if (params.rope_freq_scale != 1.0) { - LOG_TEE("%s: warning: scaling RoPE frequency by %g (default 1.0)\n", __func__, params.rope_freq_scale); + if (params.rope_freq_base != 0.0) { + LOG_TEE("%s: warning: changing RoPE frequency base to %g.\n", __func__, params.rope_freq_base); + } + + if (params.rope_freq_scale != 0.0) { + LOG_TEE("%s: warning: scaling RoPE frequency by %g.\n", __func__, params.rope_freq_scale); } LOG_TEE("%s: build = %d (%s)\n", __func__, BUILD_NUMBER, BUILD_COMMIT); @@ -184,20 +189,19 @@ int main(int argc, char ** argv) { return 1; } - const int n_ctx_train = llama_n_ctx_train(ctx); - if (params.n_ctx > n_ctx_train) { + const int n_ctx_train = llama_n_ctx_train(model); + const int n_ctx = llama_n_ctx(ctx); + LOG("n_ctx: %d\n", n_ctx); + + if (n_ctx > n_ctx_train) { LOG_TEE("%s: warning: model was trained on only %d context tokens (%d specified)\n", - __func__, n_ctx_train, params.n_ctx); - } else if (params.n_ctx < 8) { - LOG_TEE("%s: warning: minimum context size is 8, using minimum size.\n", __func__); - params.n_ctx = 8; + __func__, n_ctx_train, n_ctx); } // print system information { LOG_TEE("\n"); - LOG_TEE("system_info: n_threads = %d / %d | %s\n", - params.n_threads, std::thread::hardware_concurrency(), llama_print_system_info()); + LOG_TEE("%s\n", get_system_info(params).c_str()); } std::string path_session = params.path_prompt_cache; @@ -211,7 +215,7 @@ int main(int argc, char ** argv) { if (fp != NULL) { std::fclose(fp); - session_tokens.resize(params.n_ctx); + session_tokens.resize(n_ctx); size_t n_token_count_out = 0; if (!llama_load_session_file(ctx, path_session.c_str(), session_tokens.data(), session_tokens.capacity(), &n_token_count_out)) { LOG_TEE("%s: error: failed to load session file '%s'\n", __func__, path_session.c_str()); @@ -226,7 +230,7 @@ int main(int argc, char ** argv) { } } - const bool add_bos = llama_vocab_type(ctx) == LLAMA_VOCAB_TYPE_SPM; + const bool add_bos = llama_vocab_type(model) == LLAMA_VOCAB_TYPE_SPM; LOG("add_bos: %d\n", add_bos); std::vector embd_inp; @@ -267,9 +271,6 @@ int main(int argc, char ** argv) { LOG("guidance_offset: %s", log_tostr(guidance_offset)); } - const int n_ctx = llama_n_ctx(ctx); - LOG("n_ctx: %d\n", n_ctx); - if ((int) embd_inp.size() > n_ctx - 4) { LOG_TEE("%s: error: prompt is too long (%d tokens, max %d)\n", __func__, (int) embd_inp.size(), n_ctx - 4); return 1; @@ -466,7 +467,7 @@ int main(int argc, char ** argv) { std::vector embd; std::vector embd_guidance; - const int n_vocab = llama_n_vocab(ctx); + const int n_vocab = llama_n_vocab(model); std::vector candidates; candidates.reserve(n_vocab); @@ -576,7 +577,7 @@ int main(int argc, char ** argv) { for (int i = 0; i < input_size; i += params.n_batch) { int n_eval = std::min(input_size - i, params.n_batch); - if (llama_decode(ctx_guidance, llama_batch_get_one(input_buf + i, n_eval, n_past_guidance, 0), params.n_threads)) { + if (llama_decode(ctx_guidance, llama_batch_get_one(input_buf + i, n_eval, n_past_guidance, 0))) { LOG_TEE("%s : failed to eval\n", __func__); return 1; } @@ -593,7 +594,7 @@ int main(int argc, char ** argv) { LOG("eval: %s\n", LOG_TOKENS_TOSTR_PRETTY(ctx, embd)); - if (llama_decode(ctx, llama_batch_get_one(&embd[i], n_eval, n_past, 0), params.n_threads)) { + if (llama_decode(ctx, llama_batch_get_one(&embd[i], n_eval, n_past, 0))) { LOG_TEE("%s : failed to eval\n", __func__); return 1; } diff --git a/examples/parallel/parallel.cpp b/examples/parallel/parallel.cpp index 790189af9..0434ded23 100644 --- a/examples/parallel/parallel.cpp +++ b/examples/parallel/parallel.cpp @@ -108,7 +108,7 @@ int main(int argc, char ** argv) { fflush(stderr); const int n_ctx = llama_n_ctx(ctx); - const int n_vocab = llama_n_vocab(ctx); + const int n_vocab = llama_n_vocab(model); std::vector clients(n_clients); for (size_t i = 0; i < clients.size(); ++i) { @@ -153,7 +153,7 @@ int main(int argc, char ** argv) { batch.logits[i] = false; } - if (llama_decode(ctx, batch, params.n_threads) != 0) { + if (llama_decode(ctx, batch) != 0) { LOG_TEE("%s: llama_decode() failed\n", __func__); return 1; } @@ -272,7 +272,7 @@ int main(int argc, char ** argv) { 0, 0, 0, // unused }; - const int ret = llama_decode(ctx, batch_view, params.n_threads); + const int ret = llama_decode(ctx, batch_view); if (ret != 0) { if (n_batch == 1 || ret < 0) { // if you get here, it means the KV cache is full - try increasing it via the context size diff --git a/examples/perplexity/perplexity.cpp b/examples/perplexity/perplexity.cpp index de08bd4a1..7d0038bd4 100644 --- a/examples/perplexity/perplexity.cpp +++ b/examples/perplexity/perplexity.cpp @@ -150,16 +150,18 @@ static results_perplexity perplexity_v2(llama_context * ctx, const gpt_params & // Output: `perplexity: 13.5106 [114/114]` // BOS tokens will be added for each chunk before eval - const bool is_spm = llama_vocab_type(ctx) == LLAMA_VOCAB_TYPE_SPM; + const bool is_spm = llama_vocab_type(llama_get_model(ctx)) == LLAMA_VOCAB_TYPE_SPM; const bool add_bos = is_spm; fprintf(stderr, "%s: tokenizing the input ..\n", __func__); std::vector tokens = ::llama_tokenize(ctx, params.prompt, add_bos); - if (int(tokens.size()) < 2*params.n_ctx) { - fprintf(stderr, "%s: you need at least %d tokens to evaluate perplexity with a context of %d\n",__func__,2*params.n_ctx, - params.n_ctx); + const int n_ctx = llama_n_ctx(ctx); + + if (int(tokens.size()) < 2*n_ctx) { + fprintf(stderr, "%s: you need at least %d tokens to evaluate perplexity with a context of %d\n",__func__,2*n_ctx, + n_ctx); fprintf(stderr, "%s: the data file you provided tokenizes to only %zu tokens\n",__func__,tokens.size()); return {std::move(tokens), 0., {}, {}}; } @@ -175,20 +177,20 @@ static results_perplexity perplexity_v2(llama_context * ctx, const gpt_params & return {tokens, -1, logit_history, prob_history}; } - const int calc_chunk = params.n_ctx; + const int calc_chunk = n_ctx; fprintf(stderr, "%s: have %zu tokens. Calculation chunk = %d\n", __func__, tokens.size(), calc_chunk); if (int(tokens.size()) <= calc_chunk) { fprintf(stderr, "%s: there are only %zu tokens, this is not enough for a context size of %d and stride %d\n",__func__, - tokens.size(), params.n_ctx, params.ppl_stride); + tokens.size(), n_ctx, params.ppl_stride); return {tokens, -1, logit_history, prob_history}; } const int n_chunk_max = (tokens.size() - calc_chunk + params.ppl_stride - 1) / params.ppl_stride; const int n_chunk = params.n_chunks < 0 ? n_chunk_max : std::min(params.n_chunks, n_chunk_max); - const int n_vocab = llama_n_vocab(ctx); + const int n_vocab = llama_n_vocab(llama_get_model(ctx)); const int n_batch = params.n_batch; int count = 0; @@ -215,7 +217,7 @@ static results_perplexity perplexity_v2(llama_context * ctx, const gpt_params & const int batch_size = std::min(end - batch_start, n_batch); //fprintf(stderr, " Batch %d: starts at %d, size is %d, n_past is %d\n",j,batch_start,batch_size,j * n_batch); - if (llama_decode(ctx, llama_batch_get_one(tokens.data() + batch_start, batch_size, j * n_batch, 0), params.n_threads)) { + if (llama_decode(ctx, llama_batch_get_one(tokens.data() + batch_start, batch_size, j * n_batch, 0))) { //fprintf(stderr, "%s : failed to eval\n", __func__); return {tokens, -1, logit_history, prob_history}; } @@ -250,7 +252,7 @@ static results_perplexity perplexity_v2(llama_context * ctx, const gpt_params & } //fprintf(stderr, "%s: using tokens %d...%d\n",__func__,params.n_ctx - params.ppl_stride + start, params.n_ctx + start); - for (int j = params.n_ctx - params.ppl_stride - 1; j < params.n_ctx - 1; ++j) { + for (int j = n_ctx - params.ppl_stride - 1; j < n_ctx - 1; ++j) { // Calculate probability of next token, given the previous ones. const std::vector tok_logits( @@ -287,8 +289,9 @@ static results_perplexity perplexity(llama_context * ctx, const gpt_params & par // Output: `perplexity: 13.5106 [114/114]` // BOS tokens will be added for each chunk before eval - const bool is_spm = llama_vocab_type(ctx) == LLAMA_VOCAB_TYPE_SPM; + const bool is_spm = llama_vocab_type(llama_get_model(ctx)) == LLAMA_VOCAB_TYPE_SPM; const bool add_bos = is_spm; + const int n_ctx = llama_n_ctx(ctx); auto tim1 = std::chrono::high_resolution_clock::now(); fprintf(stderr, "%s: tokenizing the input ..\n", __func__); @@ -298,9 +301,9 @@ static results_perplexity perplexity(llama_context * ctx, const gpt_params & par auto tim2 = std::chrono::high_resolution_clock::now(); fprintf(stderr, "%s: tokenization took %g ms\n",__func__,1e-3*std::chrono::duration_cast(tim2-tim1).count()); - if (int(tokens.size()) < 2*params.n_ctx) { - fprintf(stderr, "%s: you need at least %d tokens to evaluate perplexity with a context of %d\n",__func__,2*params.n_ctx, - params.n_ctx); + if (int(tokens.size()) < 2*n_ctx) { + fprintf(stderr, "%s: you need at least %d tokens to evaluate perplexity with a context of %d\n",__func__,2*n_ctx, + n_ctx); fprintf(stderr, "%s: the data file you provided tokenizes to only %zu tokens\n",__func__,tokens.size()); return {std::move(tokens), 0., {}, {}}; } @@ -311,10 +314,10 @@ static results_perplexity perplexity(llama_context * ctx, const gpt_params & par std::vector prob_history; prob_history.resize(tokens.size()); - const int n_chunk_max = tokens.size() / params.n_ctx; + const int n_chunk_max = tokens.size() / n_ctx; const int n_chunk = params.n_chunks < 0 ? n_chunk_max : std::min(params.n_chunks, n_chunk_max); - const int n_vocab = llama_n_vocab(ctx); + const int n_vocab = llama_n_vocab(llama_get_model(ctx)); const int n_batch = params.n_batch; int count = 0; @@ -326,10 +329,10 @@ static results_perplexity perplexity(llama_context * ctx, const gpt_params & par std::vector workers(std::thread::hardware_concurrency() - 1); for (int i = 0; i < n_chunk; ++i) { - const int start = i * params.n_ctx; - const int end = start + params.n_ctx; + const int start = i * n_ctx; + const int end = start + n_ctx; - const int num_batches = (params.n_ctx + n_batch - 1) / n_batch; + const int num_batches = (n_ctx + n_batch - 1) / n_batch; std::vector logits; @@ -350,7 +353,7 @@ static results_perplexity perplexity(llama_context * ctx, const gpt_params & par tokens[batch_start] = llama_token_bos(ctx); } - if (llama_decode(ctx, llama_batch_get_one(tokens.data() + batch_start, batch_size, j * n_batch, 0), params.n_threads)) { + if (llama_decode(ctx, llama_batch_get_one(tokens.data() + batch_start, batch_size, j * n_batch, 0))) { fprintf(stderr, "%s : failed to eval\n", __func__); return {tokens, -1, logit_history, prob_history}; } @@ -358,7 +361,7 @@ static results_perplexity perplexity(llama_context * ctx, const gpt_params & par // restore the original token in case it was set to BOS tokens[batch_start] = token_org; - const auto batch_logits = llama_get_logits(ctx); + const auto * batch_logits = llama_get_logits(ctx); logits.insert(logits.end(), batch_logits, batch_logits + batch_size * n_vocab); } @@ -387,10 +390,10 @@ static results_perplexity perplexity(llama_context * ctx, const gpt_params & par // Example, we have a context window of 512, we will compute perplexity for each of the // last 256 tokens. Then, we split the input up into context window size chunks to // process the entire prompt. - const int first = params.n_ctx/2; - process_logits(n_vocab, logits.data() + first*n_vocab, tokens.data() + start + first, params.n_ctx - 1 - first, + const int first = n_ctx/2; + process_logits(n_vocab, logits.data() + first*n_vocab, tokens.data() + start + first, n_ctx - 1 - first, workers, nll, nll2, logit_history.data() + start + first, prob_history.data() + start + first); - count += params.n_ctx - first - 1; + count += n_ctx - first - 1; // perplexity is e^(average negative log-likelihood) if (params.ppl_output_type == 0) { @@ -399,7 +402,7 @@ static results_perplexity perplexity(llama_context * ctx, const gpt_params & par double av = nll/count; double av2 = nll2/count - av*av; if (av2 > 0) av2 = sqrt(av2/(count-1)); - printf("%8d %.4lf %4lf %4lf\n", i*params.n_ctx, std::exp(nll / count), av, av2); + printf("%8d %.4lf %4lf %4lf\n", i*n_ctx, std::exp(nll / count), av, av2); } fflush(stdout); } @@ -420,7 +423,7 @@ static results_perplexity perplexity(llama_context * ctx, const gpt_params & par } static std::vector hellaswag_evaluate_tokens( - llama_context * ctx, std::vector & tokens, int n_past, int n_batch, int n_vocab, int n_thread + llama_context * ctx, std::vector & tokens, int n_past, int n_batch, int n_vocab ) { std::vector result; result.reserve(tokens.size() * n_vocab); @@ -428,7 +431,7 @@ static std::vector hellaswag_evaluate_tokens( for (size_t i_chunk = 0; i_chunk < n_chunk; ++i_chunk) { size_t n_tokens = tokens.size() - i_chunk * n_batch; n_tokens = std::min(n_tokens, size_t(n_batch)); - if (llama_decode(ctx, llama_batch_get_one(tokens.data() + i_chunk * n_batch, n_tokens, n_past, 0), n_thread)) { + if (llama_decode(ctx, llama_batch_get_one(tokens.data() + i_chunk * n_batch, n_tokens, n_past, 0))) { fprintf(stderr, "%s : failed to eval\n", __func__); return {}; } @@ -475,7 +478,7 @@ static void hellaswag_score(llama_context * ctx, const gpt_params & params) { size_t hs_task_count = prompt_lines.size()/6; fprintf(stderr, "%s : loaded %zu tasks from prompt.\n", __func__, hs_task_count); - const bool is_spm = llama_vocab_type(ctx) == LLAMA_VOCAB_TYPE_SPM; + const bool is_spm = llama_vocab_type(llama_get_model(ctx)) == LLAMA_VOCAB_TYPE_SPM; fprintf(stderr, "================================= is_spm = %d\n", is_spm); // This is needed as usual for LLaMA models @@ -530,7 +533,8 @@ static void hellaswag_score(llama_context * ctx, const gpt_params & params) { printf("\ntask\tacc_norm\n"); double acc = 0.0f; - const int n_vocab = llama_n_vocab(ctx); + const int n_vocab = llama_n_vocab(llama_get_model(ctx)); + const int n_ctx = llama_n_ctx(ctx); std::vector> ending_tokens(4); @@ -558,7 +562,7 @@ static void hellaswag_score(llama_context * ctx, const gpt_params & params) { auto query_size = query_embd.size(); // Stop if query wont fit the ctx window - if (query_size > (size_t)params.n_ctx) { + if (query_size > (size_t)n_ctx) { fprintf(stderr, "%s : number of tokens in query %zu > n_ctxl\n", __func__, query_size); return; } @@ -571,7 +575,7 @@ static void hellaswag_score(llama_context * ctx, const gpt_params & params) { // clear the KV cache llama_kv_cache_tokens_rm(ctx, -1, -1); - auto logits = hellaswag_evaluate_tokens(ctx, query_embd, 0, params.n_batch, n_vocab, params.n_threads); + auto logits = hellaswag_evaluate_tokens(ctx, query_embd, 0, params.n_batch, n_vocab); if (logits.empty()) { fprintf(stderr, "%s : failed to eval\n", __func__); return; @@ -608,7 +612,7 @@ static void hellaswag_score(llama_context * ctx, const gpt_params & params) { query_size = query_embd.size(); // Stop if query wont fit the ctx window - if (context_size + query_size > (size_t)params.n_ctx) { + if (context_size + query_size > (size_t)n_ctx) { fprintf(stderr, "%s : number of tokens in query %zu > n_ctxl\n", __func__, query_size); return; } @@ -620,7 +624,7 @@ static void hellaswag_score(llama_context * ctx, const gpt_params & params) { //} // Evaluate the query - logits = hellaswag_evaluate_tokens(ctx, query_embd, context_size, params.n_batch, n_vocab, params.n_threads); + logits = hellaswag_evaluate_tokens(ctx, query_embd, context_size, params.n_batch, n_vocab); if (logits.empty()) { fprintf(stderr, "%s : failed to eval\n", __func__); return; @@ -716,7 +720,7 @@ int main(int argc, char ** argv) { return 1; } - const int n_ctx_train = llama_n_ctx_train(ctx); + const int n_ctx_train = llama_n_ctx_train(model); if (params.n_ctx > n_ctx_train) { fprintf(stderr, "%s: warning: model was trained on only %d context tokens (%d specified)\n", __func__, n_ctx_train, params.n_ctx); @@ -725,8 +729,7 @@ int main(int argc, char ** argv) { // print system information { fprintf(stderr, "\n"); - fprintf(stderr, "system_info: n_threads = %d / %d | %s\n", - params.n_threads, std::thread::hardware_concurrency(), llama_print_system_info()); + fprintf(stderr, "%s\n", get_system_info(params).c_str()); } struct results_perplexity results; diff --git a/examples/quantize-stats/quantize-stats.cpp b/examples/quantize-stats/quantize-stats.cpp index 94edb94d9..dd76b1cee 100644 --- a/examples/quantize-stats/quantize-stats.cpp +++ b/examples/quantize-stats/quantize-stats.cpp @@ -309,21 +309,22 @@ int main(int argc, char ** argv) { llama_context * ctx; { - auto lparams = llama_context_default_params(); + auto mparams = llama_model_default_params(); + mparams.use_mlock = false; - lparams.n_ctx = 256; - lparams.seed = 1; - lparams.f16_kv = false; - lparams.use_mlock = false; - - model = llama_load_model_from_file(params.model.c_str(), lparams); + model = llama_load_model_from_file(params.model.c_str(), mparams); if (model == NULL) { fprintf(stderr, "%s: error: failed to load model '%s'\n", __func__, params.model.c_str()); return 1; } - ctx = llama_new_context_with_model(model, lparams); + auto cparams = llama_context_default_params(); + cparams.n_ctx = 256; + cparams.seed = 1; + cparams.f16_kv = false; + + ctx = llama_new_context_with_model(model, cparams); if (ctx == NULL) { fprintf(stderr, "%s: error: failed to create context with model '%s'\n", __func__, params.model.c_str()); diff --git a/examples/save-load-state/save-load-state.cpp b/examples/save-load-state/save-load-state.cpp index 6e4d40b9e..acc6dbdfd 100644 --- a/examples/save-load-state/save-load-state.cpp +++ b/examples/save-load-state/save-load-state.cpp @@ -23,23 +23,17 @@ int main(int argc, char ** argv) { params.n_predict = 16; } - auto lparams = llama_context_default_params(); - - lparams.n_ctx = params.n_ctx; - lparams.seed = params.seed; - lparams.f16_kv = params.memory_f16; - lparams.use_mmap = params.use_mmap; - lparams.use_mlock = params.use_mlock; - auto n_past = 0; auto last_n_tokens_data = std::vector(params.repeat_last_n, 0); // init - auto * model = llama_load_model_from_file(params.model.c_str(), lparams); + llama_model * model; + llama_context * ctx; + + std::tie(model, ctx) = llama_init_from_gpt_params( params ); if (model == nullptr) { return 1; } - auto * ctx = llama_new_context_with_model(model, lparams); if (ctx == nullptr) { llama_free_model(model); return 1; @@ -54,7 +48,7 @@ int main(int argc, char ** argv) { } // evaluate prompt - llama_decode(ctx, llama_batch_get_one(tokens.data(), n_prompt_tokens, n_past, 0), params.n_threads); + llama_decode(ctx, llama_batch_get_one(tokens.data(), n_prompt_tokens, n_past, 0)); last_n_tokens_data.insert(last_n_tokens_data.end(), tokens.data(), tokens.data() + n_prompt_tokens); n_past += n_prompt_tokens; @@ -79,7 +73,7 @@ int main(int argc, char ** argv) { for (auto i = 0; i < params.n_predict; i++) { auto * logits = llama_get_logits(ctx); - auto n_vocab = llama_n_vocab(ctx); + auto n_vocab = llama_n_vocab(model); std::vector candidates; candidates.reserve(n_vocab); for (llama_token token_id = 0; token_id < n_vocab; token_id++) { @@ -91,7 +85,7 @@ int main(int argc, char ** argv) { last_n_tokens_data.push_back(next_token); printf("%s", next_token_str.c_str()); - if (llama_decode(ctx, llama_batch_get_one(&next_token, 1, n_past, 0), params.n_threads)) { + if (llama_decode(ctx, llama_batch_get_one(&next_token, 1, n_past, 0))) { fprintf(stderr, "\n%s : failed to evaluate\n", __func__); llama_free(ctx); llama_free_model(model); @@ -106,7 +100,7 @@ int main(int argc, char ** argv) { llama_free(ctx); // make new context - auto * ctx2 = llama_new_context_with_model(model, lparams); + auto * ctx2 = llama_new_context_with_model(model, llama_context_params_from_gpt_params(params)); // Load state (rng, logits, embedding and kv_cache) from file { @@ -139,7 +133,7 @@ int main(int argc, char ** argv) { // second run for (auto i = 0; i < params.n_predict; i++) { auto * logits = llama_get_logits(ctx2); - auto n_vocab = llama_n_vocab(ctx2); + auto n_vocab = llama_n_vocab(model); std::vector candidates; candidates.reserve(n_vocab); for (llama_token token_id = 0; token_id < n_vocab; token_id++) { @@ -151,7 +145,7 @@ int main(int argc, char ** argv) { last_n_tokens_data.push_back(next_token); printf("%s", next_token_str.c_str()); - if (llama_decode(ctx, llama_batch_get_one(&next_token, 1, n_past, 0), params.n_threads)) { + if (llama_decode(ctx, llama_batch_get_one(&next_token, 1, n_past, 0))) { fprintf(stderr, "\n%s : failed to evaluate\n", __func__); llama_free(ctx2); llama_free_model(model); diff --git a/examples/server/README.md b/examples/server/README.md index 517608046..d409e8408 100644 --- a/examples/server/README.md +++ b/examples/server/README.md @@ -4,14 +4,14 @@ This example demonstrates a simple HTTP API server and a simple web front end to Command line options: -- `--threads N`, `-t N`: Set the number of threads to use during computation. +- `--threads N`, `-t N`: Set the number of threads to use during generation. +- `-tb N, --threads-batch N`: Set the number of threads to use during batch and prompt processing. If not specified, the number of threads will be set to the number of threads used for generation. - `-m FNAME`, `--model FNAME`: Specify the path to the LLaMA model file (e.g., `models/7B/ggml-model.gguf`). - `-m ALIAS`, `--alias ALIAS`: Set an alias for the model. The alias will be returned in API responses. - `-c N`, `--ctx-size N`: Set the size of the prompt context. The default is 512, but LLaMA models were built with a context of 2048, which will provide better results for longer input/inference. The size may differ in other models, for example, baichuan models were build with a context of 4096. - `-ngl N`, `--n-gpu-layers N`: When compiled with appropriate support (currently CLBlast or cuBLAS), this option allows offloading some layers to the GPU for computation. Generally results in increased performance. - `-mg i, --main-gpu i`: When using multiple GPUs this option controls which GPU is used for small tensors for which the overhead of splitting the computation across all GPUs is not worthwhile. The GPU in question will use slightly more VRAM to store a scratch buffer for temporary results. By default GPU 0 is used. Requires cuBLAS. - `-ts SPLIT, --tensor-split SPLIT`: When using multiple GPUs this option controls how large tensors should be split across all GPUs. `SPLIT` is a comma-separated list of non-negative values that assigns the proportion of data that each GPU should get in order. For example, "3,2" will assign 60% of the data to GPU 0 and 40% to GPU 1. By default the data is split in proportion to VRAM but this may not be optimal for performance. Requires cuBLAS. -- `-lv, --low-vram`: Do not allocate a VRAM scratch buffer for holding temporary results. Reduces VRAM usage at the cost of performance, particularly prompt processing speed. Requires cuBLAS. - `-b N`, `--batch-size N`: Set the batch size for prompt processing. Default: `512`. - `--memory-f32`: Use 32-bit floats instead of 16-bit floats for memory key+value. Not recommended. - `--mlock`: Lock the model in memory, preventing it from being swapped out when memory-mapped. diff --git a/examples/server/server.cpp b/examples/server/server.cpp index 9b9624832..fe9a4255e 100644 --- a/examples/server/server.cpp +++ b/examples/server/server.cpp @@ -200,6 +200,7 @@ struct llama_server_context llama_model *model = nullptr; llama_context *ctx = nullptr; gpt_params params; + int n_ctx; grammar_parser::parse_state parsed_grammar; llama_grammar *grammar = nullptr; @@ -239,7 +240,7 @@ struct llama_server_context num_prompt_tokens = 0; num_tokens_predicted = 0; generated_text = ""; - generated_text.reserve(params.n_ctx); + generated_text.reserve(n_ctx); generated_token_probs.clear(); truncated = false; stopped_eos = false; @@ -265,8 +266,8 @@ struct llama_server_context LOG_ERROR("unable to load model", {{"model", params_.model}}); return false; } - - last_n_tokens.resize(params.n_ctx); + n_ctx = llama_n_ctx(ctx); + last_n_tokens.resize(n_ctx); std::fill(last_n_tokens.begin(), last_n_tokens.end(), 0); return true; } @@ -351,19 +352,19 @@ struct llama_server_context { params.n_keep = (int)num_prompt_tokens; } - params.n_keep = std::min(params.n_ctx - 4, params.n_keep); + params.n_keep = std::min(n_ctx - 4, params.n_keep); // if input prompt is too big, truncate like normal - if (num_prompt_tokens >= (size_t)params.n_ctx) + if (num_prompt_tokens >= (size_t)n_ctx) { - const int n_left = (params.n_ctx - params.n_keep) / 2; + const int n_left = (n_ctx - params.n_keep) / 2; std::vector new_tokens(prompt_tokens.begin(), prompt_tokens.begin() + params.n_keep); const int erased_blocks = (num_prompt_tokens - params.n_keep - n_left - 1) / n_left; new_tokens.insert(new_tokens.end(), prompt_tokens.begin() + params.n_keep + erased_blocks * n_left, prompt_tokens.end()); - std::copy(prompt_tokens.end() - params.n_ctx, prompt_tokens.end(), last_n_tokens.begin()); + std::copy(prompt_tokens.end() - n_ctx, prompt_tokens.end(), last_n_tokens.begin()); LOG_VERBOSE("input truncated", { - {"n_ctx", params.n_ctx}, + {"n_ctx", n_ctx}, {"n_keep", params.n_keep}, {"n_left", n_left}, {"new_tokens", tokens_to_str(ctx, new_tokens.cbegin(), new_tokens.cend())}, @@ -413,7 +414,7 @@ struct llama_server_context completion_token_output result; result.tok = -1; - if (embd.size() >= (size_t)params.n_ctx) + if (embd.size() >= (size_t)n_ctx) { // Shift context @@ -433,7 +434,7 @@ struct llama_server_context truncated = true; LOG_VERBOSE("input truncated", { - {"n_ctx", params.n_ctx}, + {"n_ctx", n_ctx}, {"n_keep", params.n_keep}, {"n_left", n_left}, }); @@ -447,12 +448,11 @@ struct llama_server_context n_eval = params.n_batch; } - if (llama_decode(ctx, llama_batch_get_one(&embd[n_past], n_eval, n_past, 0), params.n_threads)) + if (llama_decode(ctx, llama_batch_get_one(&embd[n_past], n_eval, n_past, 0))) { LOG_ERROR("failed to eval", { {"n_eval", n_eval}, {"n_past", n_past}, - {"n_threads", params.n_threads}, {"embd", tokens_to_str(ctx, embd.cbegin() + n_past, embd.cend())}, }); has_next_token = false; @@ -470,11 +470,11 @@ struct llama_server_context // out of user input, sample next token const float temp = params.temp; - const int32_t top_k = params.top_k <= 0 ? llama_n_vocab(ctx) : params.top_k; + const int32_t top_k = params.top_k <= 0 ? llama_n_vocab(model) : params.top_k; const float top_p = params.top_p; const float tfs_z = params.tfs_z; const float typical_p = params.typical_p; - const int32_t repeat_last_n = params.repeat_last_n < 0 ? params.n_ctx : params.repeat_last_n; + const int32_t repeat_last_n = params.repeat_last_n < 0 ? n_ctx : params.repeat_last_n; const float repeat_penalty = params.repeat_penalty; const float alpha_presence = params.presence_penalty; const float alpha_frequency = params.frequency_penalty; @@ -486,7 +486,7 @@ struct llama_server_context { auto *logits = llama_get_logits(ctx); - auto n_vocab = llama_n_vocab(ctx); + auto n_vocab = llama_n_vocab(model); // Apply params.logit_bias map for (const auto &it : params.logit_bias) @@ -505,7 +505,7 @@ struct llama_server_context // Apply penalties float nl_logit = logits[llama_token_nl(ctx)]; - auto last_n_repeat = std::min(std::min((int)last_n_tokens.size(), repeat_last_n), params.n_ctx); + auto last_n_repeat = std::min(std::min((int)last_n_tokens.size(), repeat_last_n), n_ctx); llama_sample_repetition_penalty(ctx, &candidates_p, last_n_tokens.data() + last_n_tokens.size() - last_n_repeat, last_n_repeat, repeat_penalty); @@ -690,7 +690,7 @@ struct llama_server_context std::vector getEmbedding() { - static const int n_embd = llama_n_embd(ctx); + static const int n_embd = llama_n_embd(model); if (!params.embedding) { LOG_WARNING("embedding disabled", { @@ -734,7 +734,6 @@ static void server_print_usage(const char *argv0, const gpt_params ¶ms, printf(" -ts SPLIT --tensor-split SPLIT\n"); printf(" how to split tensors across multiple GPUs, comma-separated list of proportions, e.g. 3,1\n"); printf(" -mg i, --main-gpu i the GPU to use for scratch and small tensors\n"); - printf(" -lv, --low-vram don't allocate VRAM scratch buffer\n"); printf(" -nommq, --no-mul-mat-q\n"); printf(" use cuBLAS instead of custom mul_mat_q CUDA kernels.\n"); printf(" Not recommended since this is both slower and uses more VRAM.\n"); @@ -918,14 +917,6 @@ static void server_params_parse(int argc, char **argv, server_params &sparams, } #else LOG_WARNING("llama.cpp was compiled without cuBLAS. It is not possible to set a tensor split.\n", {}); -#endif // GGML_USE_CUBLAS - } - else if (arg == "--low-vram" || arg == "-lv") - { -#ifdef GGML_USE_CUBLAS - params.low_vram = true; -#else - LOG_WARNING("warning: llama.cpp was compiled without cuBLAS. It is not possible to set lower vram usage.\n", {}); #endif // GGML_USE_CUBLAS } else if (arg == "--no-mul-mat-q" || arg == "-nommq") @@ -1031,7 +1022,7 @@ static json format_generation_settings(llama_server_context &llama) eos_bias->second < 0.0f && std::isinf(eos_bias->second); return json{ - {"n_ctx", llama.params.n_ctx}, + {"n_ctx", llama.n_ctx}, {"model", llama.params.model_alias}, {"seed", llama.params.seed}, {"temp", llama.params.temp}, @@ -1191,7 +1182,7 @@ static void parse_options_completion(const json &body, llama_server_context &lla const auto &logit_bias = body.find("logit_bias"); if (logit_bias != body.end() && logit_bias->is_array()) { - const int n_vocab = llama_n_vocab(llama.ctx); + const int n_vocab = llama_n_vocab(llama.model); for (const auto &el : *logit_bias) { if (el.is_array() && el.size() == 2 && el[0].is_number_integer()) @@ -1324,6 +1315,7 @@ int main(int argc, char **argv) {"commit", BUILD_COMMIT}}); LOG_INFO("system info", { {"n_threads", params.n_threads}, + {"n_threads_batch", params.n_threads_batch}, {"total_threads", std::thread::hardware_concurrency()}, {"system_info", llama_print_system_info()}, }); @@ -1387,7 +1379,7 @@ int main(int argc, char **argv) if (llama.params.n_beams) { // Fill llama.generated_token_probs vector with final beam. llama_beam_search(llama.ctx, beam_search_callback, &llama, llama.params.n_beams, - llama.n_past, llama.n_remain, llama.params.n_threads); + llama.n_past, llama.n_remain); // Translate llama.generated_token_probs to llama.generated_text. append_to_generated_text_from_generated_token_probs(llama); } else { diff --git a/examples/simple/simple.cpp b/examples/simple/simple.cpp index 1616a4a75..24fb16b78 100644 --- a/examples/simple/simple.cpp +++ b/examples/simple/simple.cpp @@ -33,18 +33,28 @@ int main(int argc, char ** argv) { llama_backend_init(params.numa); - llama_context_params ctx_params = llama_context_default_params(); + // initialize the model - ctx_params.seed = 1234; - ctx_params.n_ctx = 2048; + llama_model_params model_params = llama_model_default_params(); - llama_model * model = llama_load_model_from_file(params.model.c_str(), ctx_params); + // model_params.n_gpu_layers = 99; // offload all layers to the GPU + + llama_model * model = llama_load_model_from_file(params.model.c_str(), model_params); if (model == NULL) { fprintf(stderr , "%s: error: unable to load model\n" , __func__); return 1; } + // initialize the context + + llama_context_params ctx_params = llama_context_default_params(); + + ctx_params.seed = 1234; + ctx_params.n_ctx = 2048; + ctx_params.n_threads = params.n_threads; + ctx_params.n_threads_batch = params.n_threads_batch == -1 ? params.n_threads : params.n_threads_batch; + llama_context * ctx = llama_new_context_with_model(model, ctx_params); if (ctx == NULL) { @@ -97,7 +107,7 @@ int main(int argc, char ** argv) { // llama_decode will output logits only for the last token of the prompt batch.logits[batch.n_tokens - 1] = true; - if (llama_decode(ctx, batch, params.n_threads) != 0) { + if (llama_decode(ctx, batch) != 0) { LOG_TEE("%s: llama_decode() failed\n", __func__); return 1; } @@ -112,7 +122,7 @@ int main(int argc, char ** argv) { while (n_cur <= n_len) { // sample the next token { - auto n_vocab = llama_n_vocab(ctx); + auto n_vocab = llama_n_vocab(model); auto * logits = llama_get_logits_ith(ctx, batch.n_tokens - 1); std::vector candidates; @@ -154,7 +164,7 @@ int main(int argc, char ** argv) { n_cur += 1; // evaluate the current batch with the transformer model - if (llama_decode(ctx, batch, params.n_threads)) { + if (llama_decode(ctx, batch)) { fprintf(stderr, "%s : failed to eval, return code %d\n", __func__, 1); return 1; } diff --git a/examples/speculative/speculative.cpp b/examples/speculative/speculative.cpp index 2445d78dc..c5e5b234f 100644 --- a/examples/speculative/speculative.cpp +++ b/examples/speculative/speculative.cpp @@ -70,16 +70,16 @@ int main(int argc, char ** argv) { const auto t_enc_start = ggml_time_us(); // eval the prompt with both models - llama_decode(ctx_tgt, llama_batch_get_one( inp.data(), n_input - 1, 0, 0), params.n_threads); - llama_decode(ctx_tgt, llama_batch_get_one(&inp.back(), 1, n_input - 1, 0), params.n_threads); - llama_decode(ctx_dft, llama_batch_get_one( inp.data(), n_input, 0, 0), params.n_threads); + llama_decode(ctx_tgt, llama_batch_get_one( inp.data(), n_input - 1, 0, 0)); + llama_decode(ctx_tgt, llama_batch_get_one(&inp.back(), 1, n_input - 1, 0)); + llama_decode(ctx_dft, llama_batch_get_one( inp.data(), n_input, 0, 0)); const auto t_enc_end = ggml_time_us(); // the 2 models should have the same vocab const int n_ctx = llama_n_ctx(ctx_tgt); - const int n_vocab = llama_n_vocab(ctx_tgt); - //GGML_ASSERT(n_vocab == llama_n_vocab(ctx_dft)); + const int n_vocab = llama_n_vocab(model_tgt); + //GGML_ASSERT(n_vocab == llama_n_vocab(model_dft)); // how many tokens to draft each time int n_draft = params.n_draft; @@ -173,7 +173,7 @@ int main(int argc, char ** argv) { } llama_kv_cache_seq_rm(ctx_dft, 0, n_past_dft, n_ctx); - llama_decode(ctx_dft, llama_batch_get_one(&id, 1, n_past_dft, 0), params.n_threads); + llama_decode(ctx_dft, llama_batch_get_one(&id, 1, n_past_dft, 0)); ++n_past_dft; // heuristic for n_draft @@ -258,7 +258,7 @@ int main(int argc, char ** argv) { // evaluate the drafted token on the draft model llama_kv_cache_seq_rm(ctx_dft, 0, n_past_cur, n_ctx); - llama_decode(ctx_dft, llama_batch_get_one(&drafted.back(), 1, n_past_cur, 0), params.n_threads); + llama_decode(ctx_dft, llama_batch_get_one(&drafted.back(), 1, n_past_cur, 0)); ++n_past_cur; if (grammar_dft != NULL) { @@ -268,7 +268,7 @@ int main(int argc, char ** argv) { // evaluate the target model on the drafted tokens llama_kv_cache_seq_rm(ctx_tgt, 0, n_past_tgt, n_ctx); - llama_decode(ctx_tgt, llama_batch_get_one(drafted.data(), drafted.size(), n_past_tgt, 0), params.n_threads); + llama_decode(ctx_tgt, llama_batch_get_one(drafted.data(), drafted.size(), n_past_tgt, 0)); ++n_past_tgt; // the first token is always proposed by the traget model before the speculation loop diff --git a/examples/train-text-from-scratch/train-text-from-scratch.cpp b/examples/train-text-from-scratch/train-text-from-scratch.cpp index d5205aff6..a9cf8a381 100644 --- a/examples/train-text-from-scratch/train-text-from-scratch.cpp +++ b/examples/train-text-from-scratch/train-text-from-scratch.cpp @@ -976,14 +976,16 @@ int main(int argc, char ** argv) { printf("%s: seed: %u\n", __func__, params.common.seed); srand(params.common.seed); - struct llama_context_params llama_params = llama_context_default_params(); - llama_params.vocab_only = true; + struct llama_model_params mparams = llama_model_default_params(); + mparams.vocab_only = true; - struct llama_model * lmodel = llama_load_model_from_file(params.fn_vocab_model, llama_params); - struct llama_context * lctx = llama_new_context_with_model(lmodel, llama_params); + struct llama_context_params cparams = llama_context_default_params(); + + struct llama_model * lmodel = llama_load_model_from_file(params.fn_vocab_model, mparams); + struct llama_context * lctx = llama_new_context_with_model(lmodel, cparams); struct my_llama_model model; - model.hparams.n_vocab = llama_n_vocab(lctx); + model.hparams.n_vocab = llama_n_vocab(lmodel); model.hparams.n_ctx = params.common.n_ctx; model.hparams.n_embd = params.n_embd; model.hparams.n_head = params.n_head; diff --git a/ggml-cuda.cu b/ggml-cuda.cu index 29fb7abd4..86d1fe203 100644 --- a/ggml-cuda.cu +++ b/ggml-cuda.cu @@ -1,3 +1,4 @@ +#include #include #include #include @@ -467,7 +468,7 @@ static float g_tensor_split[GGML_CUDA_MAX_DEVICES] = {0}; static bool g_mul_mat_q = true; static void * g_scratch_buffer = nullptr; -static size_t g_scratch_size = 1024*1024*1024; // 1 GB by default +static size_t g_scratch_size = 0; // disabled by default static size_t g_scratch_offset = 0; static cublasHandle_t g_cublas_handles[GGML_CUDA_MAX_DEVICES] = {nullptr}; @@ -6738,14 +6739,10 @@ bool ggml_cuda_can_mul_mat(const struct ggml_tensor * src0, const struct ggml_te const int64_t ne1 = dst->ne[1]; // TODO: find the optimal values for these - if ((src0->type == GGML_TYPE_F32 || src0->type == GGML_TYPE_F16 || ggml_is_quantized(src0->type)) && - src1->type == GGML_TYPE_F32 && - dst->type == GGML_TYPE_F32 && - (ne0 >= 32 && ne1 >= 32 && ne10 >= 32)) { - return true; - } - - return false; + return (src0->type == GGML_TYPE_F32 || src0->type == GGML_TYPE_F16 || ggml_is_quantized(src0->type)) && + src1->type == GGML_TYPE_F32 && + dst->type == GGML_TYPE_F32 && + (ne0 >= 32 && ne1 >= 32 && ne10 >= 32); } static void ggml_cuda_mul_mat_vec_p021(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst){ @@ -6901,6 +6898,8 @@ static void ggml_cuda_cpy(const ggml_tensor * src0, const ggml_tensor * src1, gg ggml_cpy_f32_f16_cuda(src0_ddc, src1_ddc, ne, ne00, ne01, nb00, nb01, nb02, ne10, ne11, nb10, nb11, nb12, main_stream); } else { + fprintf(stderr, "%s: unsupported type combination (%s to %s)\n", __func__, + ggml_type_name(src0->type), ggml_type_name(src1->type)); GGML_ASSERT(false); } @@ -7198,7 +7197,12 @@ void ggml_cuda_set_mul_mat_q(const bool mul_mat_q) { } void ggml_cuda_set_scratch_size(const size_t scratch_size) { - g_scratch_size = scratch_size; + // this is a hack to not completely break llama.cpp when using multiple models or contexts simultaneously + // it still won't always work as expected, but it's better than nothing + if (scratch_size > g_scratch_size) { + ggml_cuda_free_scratch(); + } + g_scratch_size = std::max(g_scratch_size, scratch_size); } void ggml_cuda_free_scratch() { diff --git a/llama.cpp b/llama.cpp index 7668cb1a7..685712d17 100644 --- a/llama.cpp +++ b/llama.cpp @@ -887,10 +887,10 @@ static void llama_nop(struct ggml_tensor * tensor) { // don't offload by default static std::string llama_token_to_str(const struct llama_context * ctx, llama_token token) { std::vector result(8, 0); - const int n_tokens = llama_token_to_piece(ctx, token, result.data(), result.size()); + const int n_tokens = llama_token_to_piece(llama_get_model(ctx), token, result.data(), result.size()); if (n_tokens < 0) { result.resize(-n_tokens); - int check = llama_token_to_piece(ctx, token, result.data(), result.size()); + int check = llama_token_to_piece(llama_get_model(ctx), token, result.data(), result.size()); GGML_ASSERT(check == -n_tokens); } else { result.resize(n_tokens); @@ -931,9 +931,9 @@ static const size_t MB = kB*kB; static const size_t GB = kB*kB*kB; struct llama_hparams { + bool vocab_only; uint32_t n_vocab; uint32_t n_ctx_train; // context size the model was trained on - uint32_t n_ctx; // context size used during inference uint32_t n_embd; uint32_t n_head; uint32_t n_head_kv; @@ -944,8 +944,8 @@ struct llama_hparams { float f_norm_eps; float f_norm_rms_eps; - float rope_freq_base; - float rope_freq_scale; + float rope_freq_base_train; + float rope_freq_scale_train; bool operator!=(const llama_hparams & other) const { return static_cast(memcmp(this, &other, sizeof(llama_hparams))); // NOLINT @@ -962,15 +962,18 @@ struct llama_hparams { uint32_t n_embd_gqa() const { return n_embd/n_gqa(); } +}; - size_t kv_size() const { - size_t result = 2ull; - result *= (size_t) n_embd_gqa(); - result *= (size_t) n_ctx; - result *= (size_t) n_layer; - result *= sizeof(ggml_fp16_t); - return result; - } +struct llama_cparams { + uint32_t n_ctx; // context size used during inference + uint32_t n_batch; + uint32_t n_threads; // number of threads to use for generation + uint32_t n_threads_batch; // number of threads to use for batch processing + + float rope_freq_base; + float rope_freq_scale; + + bool mul_mat_q; }; struct llama_layer { @@ -1148,11 +1151,8 @@ struct llama_model { }; struct llama_context { - llama_context(const llama_model & model) : model(model), t_load_us(model.t_load_us), t_start_us(model.t_start_us) {} + llama_context(const llama_model & model) : model(model), t_start_us(model.t_start_us), t_load_us(model.t_load_us) {} ~llama_context() { - if (model_owner) { - delete &model; - } #ifdef GGML_USE_METAL if (ctx_metal) { ggml_metal_free(ctx_metal); @@ -1163,27 +1163,26 @@ struct llama_context { } } + llama_cparams cparams; + + const llama_model & model; + + // key + value cache for the self attention + struct llama_kv_cache kv_self; + std::mt19937 rng; bool has_evaluated_once = false; + int64_t t_start_us; + int64_t t_load_us; int64_t t_sample_us = 0; - int64_t t_eval_us = 0; int64_t t_p_eval_us = 0; + int64_t t_eval_us = 0; int32_t n_sample = 0; // number of tokens sampled - int32_t n_eval = 0; // number of eval calls int32_t n_p_eval = 0; // number of tokens in eval calls for the prompt (with batch size > 1) - - const llama_model & model; - - bool model_owner = false; - - int64_t t_load_us; - int64_t t_start_us; - - // key + value cache for the self attention - struct llama_kv_cache kv_self; + int32_t n_eval = 0; // number of eval calls // decode output (2-dimensional array: [n_tokens][n_vocab]) std::vector logits; @@ -1218,10 +1217,10 @@ static bool llama_kv_cache_init( const struct llama_hparams & hparams, struct llama_kv_cache & cache, ggml_type wtype, + uint32_t n_ctx, int n_gpu_layers) { const uint32_t n_embd = hparams.n_embd_gqa(); const uint32_t n_layer = hparams.n_layer; - const uint32_t n_ctx = hparams.n_ctx; const int64_t n_mem = n_layer*n_ctx; const int64_t n_elements = n_embd*n_mem; @@ -1255,11 +1254,20 @@ static bool llama_kv_cache_init( (void) n_gpu_layers; #ifdef GGML_USE_CUBLAS + size_t vram_kv_cache = 0; + if (n_gpu_layers > (int)n_layer + 1) { ggml_cuda_assign_buffers_no_scratch(cache.v); + LLAMA_LOG_INFO("%s: offloading v cache to GPU\n", __func__); + vram_kv_cache += ggml_nbytes(cache.v); } if (n_gpu_layers > (int)n_layer + 2) { ggml_cuda_assign_buffers_no_scratch(cache.k); + LLAMA_LOG_INFO("%s: offloading k cache to GPU\n", __func__); + vram_kv_cache += ggml_nbytes(cache.k); + } + if (vram_kv_cache > 0) { + LLAMA_LOG_INFO("%s: VRAM kv self = %.2f MB\n", __func__, vram_kv_cache / 1024.0 / 1024.0); } #endif // GGML_USE_CUBLAS @@ -1715,7 +1723,7 @@ struct llama_model_loader { lmlock->grow_to(size_lock); } break; -#if defined(GGML_USE_CUBLAS) +#ifdef GGML_USE_CUBLAS case GGML_BACKEND_GPU: case GGML_BACKEND_GPU_SPLIT: // old code: @@ -1748,7 +1756,15 @@ struct llama_model_loader { // load LLaMA models // -static std::string llama_model_ftype_name(enum llama_ftype ftype) { +static std::string llama_model_arch_name(llm_arch arch) { + auto it = LLM_ARCH_NAMES.find(arch); + if (it == LLM_ARCH_NAMES.end()) { + return "unknown"; + } + return it->second; +} + +static std::string llama_model_ftype_name(llama_ftype ftype) { if (ftype & LLAMA_FTYPE_GUESSED) { return llama_model_ftype_name((enum llama_ftype) (ftype & ~LLAMA_FTYPE_GUESSED)) + " (guessed)"; } @@ -1804,10 +1820,7 @@ static void llm_load_arch(llama_model_loader & ml, llama_model & model) { static void llm_load_hparams( llama_model_loader & ml, - llama_model & model, - int n_ctx, - float rope_freq_base, - float rope_freq_scale) { + llama_model & model) { struct gguf_context * ctx = ml.ctx_gguf; const auto kv = LLM_KV(model.arch); @@ -1818,29 +1831,25 @@ static void llm_load_hparams( GGUF_GET_KEY(ctx, model.name, gguf_get_val_str, GGUF_TYPE_STRING, false, kv(LLM_KV_GENERAL_NAME)); // get hparams kv - GGUF_GET_KEY(ctx, hparams.n_vocab, gguf_get_arr_n, GGUF_TYPE_ARRAY, true, kv(LLM_KV_TOKENIZER_LIST)); - GGUF_GET_KEY(ctx, hparams.n_ctx_train, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_CONTEXT_LENGTH)); - GGUF_GET_KEY(ctx, hparams.n_embd, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_EMBEDDING_LENGTH)); - GGUF_GET_KEY(ctx, hparams.n_ff, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_FEED_FORWARD_LENGTH)); - GGUF_GET_KEY(ctx, hparams.n_head, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_ATTENTION_HEAD_COUNT)); - GGUF_GET_KEY(ctx, hparams.n_layer, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_BLOCK_COUNT)); + GGUF_GET_KEY(ctx, hparams.n_vocab, gguf_get_arr_n, GGUF_TYPE_ARRAY, true, kv(LLM_KV_TOKENIZER_LIST)); + GGUF_GET_KEY(ctx, hparams.n_ctx_train, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_CONTEXT_LENGTH)); + GGUF_GET_KEY(ctx, hparams.n_embd, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_EMBEDDING_LENGTH)); + GGUF_GET_KEY(ctx, hparams.n_ff, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_FEED_FORWARD_LENGTH)); + GGUF_GET_KEY(ctx, hparams.n_head, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_ATTENTION_HEAD_COUNT)); + GGUF_GET_KEY(ctx, hparams.n_layer, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_BLOCK_COUNT)); // n_head_kv is optional, default to n_head hparams.n_head_kv = hparams.n_head; GGUF_GET_KEY(ctx, hparams.n_head_kv, gguf_get_val_u32, GGUF_TYPE_UINT32, false, kv(LLM_KV_ATTENTION_HEAD_COUNT_KV)); // rope_freq_base (optional) - if (rope_freq_base == 0.0f) { - rope_freq_base = 10000.0f; - GGUF_GET_KEY(ctx, rope_freq_base, gguf_get_val_f32, GGUF_TYPE_FLOAT32, false, kv(LLM_KV_ROPE_FREQ_BASE)); - } + hparams.rope_freq_base_train = 10000.0f; + GGUF_GET_KEY(ctx, hparams.rope_freq_base_train, gguf_get_val_f32, GGUF_TYPE_FLOAT32, false, kv(LLM_KV_ROPE_FREQ_BASE)); // rope_freq_scale (inverse of the kv) is optional - if (rope_freq_scale == 0.0f) { - float ropescale = 1.0f; - GGUF_GET_KEY(ctx, ropescale, gguf_get_val_f32, GGUF_TYPE_FLOAT32, false, kv(LLM_KV_ROPE_SCALE_LINEAR)); - rope_freq_scale = 1.0f/ropescale; - } + float ropescale = 1.0f; + GGUF_GET_KEY(ctx, ropescale, gguf_get_val_f32, GGUF_TYPE_FLOAT32, false, kv(LLM_KV_ROPE_SCALE_LINEAR)); + hparams.rope_freq_scale_train = 1.0f/ropescale; // sanity check for n_rot (optional) { @@ -1907,10 +1916,6 @@ static void llm_load_hparams( }; model.ftype = ml.ftype; - - hparams.n_ctx = n_ctx; - hparams.rope_freq_base = rope_freq_base; - hparams.rope_freq_scale = rope_freq_scale; } // TODO: This should probably be in llama.h @@ -2034,31 +2039,30 @@ static void llm_load_print_meta(llama_model_loader & ml, llama_model & model) { const auto & vocab = model.vocab; // hparams - LLAMA_LOG_INFO("%s: format = %s\n", __func__, llama_file_version_name(ml.fver)); - LLAMA_LOG_INFO("%s: arch = %s\n", __func__, LLM_ARCH_NAMES.at(model.arch).c_str()); - LLAMA_LOG_INFO("%s: vocab type = %s\n", __func__, vocab.type == LLAMA_VOCAB_TYPE_SPM ? "SPM" : "BPE"); // TODO: fix - LLAMA_LOG_INFO("%s: n_vocab = %u\n", __func__, hparams.n_vocab); - LLAMA_LOG_INFO("%s: n_merges = %u\n", __func__, (int) vocab.bpe_ranks.size()); - LLAMA_LOG_INFO("%s: n_ctx_train = %u\n", __func__, hparams.n_ctx_train); - LLAMA_LOG_INFO("%s: n_ctx = %u\n", __func__, hparams.n_ctx); - LLAMA_LOG_INFO("%s: n_embd = %u\n", __func__, hparams.n_embd); - LLAMA_LOG_INFO("%s: n_head = %u\n", __func__, hparams.n_head); - LLAMA_LOG_INFO("%s: n_head_kv = %u\n", __func__, hparams.n_head_kv); - LLAMA_LOG_INFO("%s: n_layer = %u\n", __func__, hparams.n_layer); - LLAMA_LOG_INFO("%s: n_rot = %u\n", __func__, hparams.n_rot); // a.k.a. n_embd_head, n_head_dim - LLAMA_LOG_INFO("%s: n_gqa = %u\n", __func__, hparams.n_gqa()); - LLAMA_LOG_INFO("%s: f_norm_eps = %.1e\n", __func__, hparams.f_norm_eps); - LLAMA_LOG_INFO("%s: f_norm_rms_eps = %.1e\n", __func__, hparams.f_norm_rms_eps); - LLAMA_LOG_INFO("%s: n_ff = %u\n", __func__, hparams.n_ff); - LLAMA_LOG_INFO("%s: freq_base = %.1f\n", __func__, hparams.rope_freq_base); - LLAMA_LOG_INFO("%s: freq_scale = %g\n", __func__, hparams.rope_freq_scale); - LLAMA_LOG_INFO("%s: model type = %s\n", __func__, llama_model_type_name(model.type)); - LLAMA_LOG_INFO("%s: model ftype = %s\n", __func__, llama_model_ftype_name(model.ftype).c_str()); - LLAMA_LOG_INFO("%s: model params = %.2f B\n", __func__, ml.n_elements*1e-9); + LLAMA_LOG_INFO("%s: format = %s\n", __func__, llama_file_version_name(ml.fver)); + LLAMA_LOG_INFO("%s: arch = %s\n", __func__, LLM_ARCH_NAMES.at(model.arch).c_str()); + LLAMA_LOG_INFO("%s: vocab type = %s\n", __func__, vocab.type == LLAMA_VOCAB_TYPE_SPM ? "SPM" : "BPE"); // TODO: fix + LLAMA_LOG_INFO("%s: n_vocab = %u\n", __func__, hparams.n_vocab); + LLAMA_LOG_INFO("%s: n_merges = %u\n", __func__, (int) vocab.bpe_ranks.size()); + LLAMA_LOG_INFO("%s: n_ctx_train = %u\n", __func__, hparams.n_ctx_train); + LLAMA_LOG_INFO("%s: n_embd = %u\n", __func__, hparams.n_embd); + LLAMA_LOG_INFO("%s: n_head = %u\n", __func__, hparams.n_head); + LLAMA_LOG_INFO("%s: n_head_kv = %u\n", __func__, hparams.n_head_kv); + LLAMA_LOG_INFO("%s: n_layer = %u\n", __func__, hparams.n_layer); + LLAMA_LOG_INFO("%s: n_rot = %u\n", __func__, hparams.n_rot); // a.k.a. n_embd_head, n_head_dim + LLAMA_LOG_INFO("%s: n_gqa = %u\n", __func__, hparams.n_gqa()); + LLAMA_LOG_INFO("%s: f_norm_eps = %.1e\n", __func__, hparams.f_norm_eps); + LLAMA_LOG_INFO("%s: f_norm_rms_eps = %.1e\n", __func__, hparams.f_norm_rms_eps); + LLAMA_LOG_INFO("%s: n_ff = %u\n", __func__, hparams.n_ff); + LLAMA_LOG_INFO("%s: freq_base_train = %.1f\n", __func__, hparams.rope_freq_base_train); + LLAMA_LOG_INFO("%s: freq_scale_train = %g\n", __func__, hparams.rope_freq_scale_train); + LLAMA_LOG_INFO("%s: model type = %s\n", __func__, llama_model_type_name(model.type)); + LLAMA_LOG_INFO("%s: model ftype = %s\n", __func__, llama_model_ftype_name(model.ftype).c_str()); + LLAMA_LOG_INFO("%s: model params = %.2f B\n", __func__, ml.n_elements*1e-9); if (ml.n_bytes < GB) { - LLAMA_LOG_INFO("%s: model size = %.2f MiB (%.2f BPW) \n", __func__, ml.n_bytes/1024.0/1024.0, ml.n_bytes*8.0/ml.n_elements); + LLAMA_LOG_INFO("%s: model size = %.2f MiB (%.2f BPW) \n", __func__, ml.n_bytes/1024.0/1024.0, ml.n_bytes*8.0/ml.n_elements); } else { - LLAMA_LOG_INFO("%s: model size = %.2f GiB (%.2f BPW) \n", __func__, ml.n_bytes/1024.0/1024.0/1024.0, ml.n_bytes*8.0/ml.n_elements); + LLAMA_LOG_INFO("%s: model size = %.2f GiB (%.2f BPW) \n", __func__, ml.n_bytes/1024.0/1024.0/1024.0, ml.n_bytes*8.0/ml.n_elements); } // general kv @@ -2076,13 +2080,9 @@ static void llm_load_print_meta(llama_model_loader & ml, llama_model & model) { static void llm_load_tensors( llama_model_loader & ml, llama_model & model, - int n_batch, int n_gpu_layers, int main_gpu, const float * tensor_split, - const bool mul_mat_q, - bool low_vram, - ggml_type memory_type, bool use_mlock, llama_progress_callback progress_callback, void * progress_callback_user_data) { @@ -2121,11 +2121,9 @@ static void llm_load_tensors( } (void) main_gpu; - (void) mul_mat_q; -#if defined(GGML_USE_CUBLAS) +#ifdef GGML_USE_CUBLAS LLAMA_LOG_INFO("%s: using " GGML_CUDA_NAME " for GPU acceleration\n", __func__); ggml_cuda_set_main_device(main_gpu); - ggml_cuda_set_mul_mat_q(mul_mat_q); #define LLAMA_BACKEND_OFFLOAD GGML_BACKEND_GPU #define LLAMA_BACKEND_OFFLOAD_SPLIT GGML_BACKEND_GPU_SPLIT #elif defined(GGML_USE_CLBLAST) @@ -2160,9 +2158,9 @@ static void llm_load_tensors( // norm is not performance relevant on its own but keeping it in VRAM reduces data copying // on Windows however this is detrimental unless everything is on the GPU #ifndef _WIN32 - backend_norm = low_vram ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; + backend_norm = LLAMA_BACKEND_OFFLOAD; #else - backend_norm = low_vram || n_gpu_layers <= (int) n_layer + 2 ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; + backend_norm = n_gpu_layers <= (int) n_layer + 2 ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; #endif // _WIN32 backend_output = LLAMA_BACKEND_OFFLOAD_SPLIT; @@ -2226,9 +2224,9 @@ static void llm_load_tensors( // norm is not performance relevant on its own but keeping it in VRAM reduces data copying // on Windows however this is detrimental unless everything is on the GPU #ifndef _WIN32 - backend_norm = low_vram ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; + backend_norm = LLAMA_BACKEND_OFFLOAD; #else - backend_norm = low_vram || n_gpu_layers <= (int) n_layer + 2 ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; + backend_norm = n_gpu_layers <= (int) n_layer + 2 ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; #endif // _WIN32 backend_output = LLAMA_BACKEND_OFFLOAD_SPLIT; @@ -2296,9 +2294,9 @@ static void llm_load_tensors( // norm is not performance relevant on its own but keeping it in VRAM reduces data copying // on Windows however this is detrimental unless everything is on the GPU #ifndef _WIN32 - backend_norm = low_vram ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; + backend_norm = LLAMA_BACKEND_OFFLOAD; #else - backend_norm = low_vram || n_gpu_layers <= (int) n_layer + 2 ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; + backend_norm = n_gpu_layers <= (int) n_layer + 2 ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; #endif // _WIN32 backend_output = LLAMA_BACKEND_OFFLOAD_SPLIT; @@ -2373,9 +2371,9 @@ static void llm_load_tensors( // norm is not performance relevant on its own but keeping it in VRAM reduces data copying // on Windows however this is detrimental unless everything is on the GPU #ifndef _WIN32 - backend_norm = low_vram ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; + backend_norm = LLAMA_BACKEND_OFFLOAD; #else - backend_norm = low_vram || n_gpu_layers <= (int) n_layer + 2 ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; + backend_norm = n_gpu_layers <= (int) n_layer + 2 ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; #endif // _WIN32 backend_output = LLAMA_BACKEND_OFFLOAD_SPLIT; @@ -2447,20 +2445,12 @@ static void llm_load_tensors( // print memory requirements { - const size_t scale = memory_type == GGML_TYPE_F32 ? 2 : 1; - // this is the total memory required to run the inference size_t mem_required = ctx_size + mmapped_size - vram_weights; // weights in VRAM not in memory - // this is the memory required by one llama_state - const size_t mem_required_state = scale*hparams.kv_size(); - - LLAMA_LOG_INFO("%s: mem required = %7.2f MB (+ %7.2f MB per state)\n", __func__, - mem_required / 1024.0 / 1024.0, mem_required_state / 1024.0 / 1024.0); - - (void) n_batch; + LLAMA_LOG_INFO("%s: mem required = %7.2f MB\n", __func__, mem_required / 1024.0 / 1024.0); #if defined(GGML_USE_CUBLAS) || defined(GGML_USE_CLBLAST) const int n_gpu = std::min(n_gpu_layers, int(hparams.n_layer)); @@ -2469,36 +2459,17 @@ static void llm_load_tensors( if (n_gpu_layers > (int) hparams.n_layer) { LLAMA_LOG_INFO("%s: offloading non-repeating layers to GPU\n", __func__); } - size_t vram_kv_cache = 0; #ifdef GGML_USE_CUBLAS const int max_backend_supported_layers = hparams.n_layer + 3; - const int max_offloadable_layers = low_vram ? hparams.n_layer + 1 : hparams.n_layer + 3; - if (n_gpu_layers > (int) hparams.n_layer + 1) { - if (low_vram) { - LLAMA_LOG_INFO("%s: cannot offload v cache to GPU due to low VRAM option\n", __func__); - } else { - LLAMA_LOG_INFO("%s: offloading v cache to GPU\n", __func__); - vram_kv_cache += hparams.kv_size() / 2; - } - } - if (n_gpu_layers > (int) hparams.n_layer + 2) { - if (low_vram) { - LLAMA_LOG_WARN("%s: cannot offload k cache to GPU due to low VRAM option\n", __func__); - } else { - LLAMA_LOG_INFO("%s: offloading k cache to GPU\n", __func__); - vram_kv_cache += hparams.kv_size() / 2; - } - } + const int max_offloadable_layers = hparams.n_layer + 3; #elif defined(GGML_USE_CLBLAST) const int max_backend_supported_layers = hparams.n_layer + 1; const int max_offloadable_layers = hparams.n_layer + 1; #endif // GGML_USE_CUBLAS - LLAMA_LOG_INFO("%s: offloaded %d/%d layers to GPU\n", - __func__, std::min(n_gpu_layers, max_offloadable_layers), max_backend_supported_layers); - LLAMA_LOG_INFO("%s: VRAM used: %zu MB\n", - __func__, (vram_weights + vram_kv_cache + MB - 1) / MB); // round up + LLAMA_LOG_INFO("%s: offloaded %d/%d layers to GPU\n", __func__, std::min(n_gpu_layers, max_offloadable_layers), max_backend_supported_layers); + LLAMA_LOG_INFO("%s: VRAM used: %.2f MB\n", __func__, vram_weights / 1024.0 / 1024.0); #else (void) n_gpu_layers; #endif // defined(GGML_USE_CUBLAS) || defined(GGML_USE_CLBLAST) @@ -2511,7 +2482,7 @@ static void llm_load_tensors( } (void) tensor_split; -#if defined(GGML_USE_CUBLAS) +#ifdef GGML_USE_CUBLAS { ggml_cuda_set_tensor_split(tensor_split); } @@ -2533,29 +2504,24 @@ static void llm_load_tensors( static bool llama_model_load( const std::string & fname, llama_model & model, - int n_ctx, - int n_batch, int n_gpu_layers, int main_gpu, const float * tensor_split, - const bool mul_mat_q, - float rope_freq_base, - float rope_freq_scale, - bool low_vram, - ggml_type memory_type, bool use_mmap, bool use_mlock, bool vocab_only, llama_progress_callback progress_callback, void *progress_callback_user_data) { try { - std::unique_ptr ml(new llama_model_loader(fname, use_mmap)); + llama_model_loader ml(fname, use_mmap); - llm_load_arch (*ml, model); - llm_load_hparams(*ml, model, n_ctx, rope_freq_base, rope_freq_scale); - llm_load_vocab (*ml, model); + model.hparams.vocab_only = vocab_only; - llm_load_print_meta(*ml, model); + llm_load_arch (ml, model); + llm_load_hparams(ml, model); + llm_load_vocab (ml, model); + + llm_load_print_meta(ml, model); if (model.hparams.n_vocab != model.vocab.id_to_token.size()) { throw std::runtime_error("vocab size mismatch"); @@ -2567,8 +2533,8 @@ static bool llama_model_load( } llm_load_tensors( - *ml, model, n_batch, n_gpu_layers, - main_gpu, tensor_split, mul_mat_q, low_vram, memory_type, + ml, model, n_gpu_layers, + main_gpu, tensor_split, use_mlock, progress_callback, progress_callback_user_data); } catch (const std::exception & err) { LLAMA_LOG_ERROR("error loading model: %s\n", err.what()); @@ -2583,6 +2549,7 @@ static struct ggml_cgraph * llm_build_llama( const llama_batch & batch) { const auto & model = lctx.model; const auto & hparams = model.hparams; + const auto & cparams = lctx.cparams; const auto & kv_self = lctx.kv_self; @@ -2590,7 +2557,7 @@ static struct ggml_cgraph * llm_build_llama( const int64_t n_embd = hparams.n_embd; const int64_t n_layer = hparams.n_layer; - const int64_t n_ctx = hparams.n_ctx; + const int64_t n_ctx = cparams.n_ctx; const int64_t n_head = hparams.n_head; const int64_t n_head_kv = hparams.n_head_kv; const int64_t n_embd_head = hparams.n_embd_head(); @@ -2598,8 +2565,8 @@ static struct ggml_cgraph * llm_build_llama( GGML_ASSERT(n_embd_head == hparams.n_rot); - const float freq_base = hparams.rope_freq_base; - const float freq_scale = hparams.rope_freq_scale; + const float freq_base = cparams.rope_freq_base; + const float freq_scale = cparams.rope_freq_scale; const float norm_rms_eps = hparams.f_norm_rms_eps; const int n_gpu_layers = model.n_gpu_layers; @@ -2657,9 +2624,6 @@ static struct ggml_cgraph * llm_build_llama( // offload functions set the tensor output backend to GPU // tensors are GPU-accelerated if any input or the output has been offloaded - // - // with the low VRAM option VRAM scratch is disabled in llama_load_model_internal - // in that case ggml_cuda_assign_buffers has no effect offload_func_t offload_func_nr = llama_nop; // nr = non-repeating offload_func_t offload_func_kq = llama_nop; offload_func_t offload_func_v = llama_nop; @@ -2975,6 +2939,7 @@ static struct ggml_cgraph * llm_build_baichaun( const llama_batch & batch) { const auto & model = lctx.model; const auto & hparams = model.hparams; + const auto & cparams = lctx.cparams; const auto & kv_self = lctx.kv_self; @@ -2982,7 +2947,7 @@ static struct ggml_cgraph * llm_build_baichaun( const int64_t n_embd = hparams.n_embd; const int64_t n_layer = hparams.n_layer; - const int64_t n_ctx = hparams.n_ctx; + const int64_t n_ctx = cparams.n_ctx; const int64_t n_head = hparams.n_head; const int64_t n_head_kv = hparams.n_head_kv; const int64_t n_embd_head = hparams.n_embd_head(); @@ -2990,8 +2955,8 @@ static struct ggml_cgraph * llm_build_baichaun( GGML_ASSERT(n_embd_head == hparams.n_rot); - const float freq_base = hparams.rope_freq_base; - const float freq_scale = hparams.rope_freq_scale; + const float freq_base = cparams.rope_freq_base; + const float freq_scale = cparams.rope_freq_scale; const float norm_rms_eps = hparams.f_norm_rms_eps; const int n_gpu_layers = model.n_gpu_layers; @@ -3047,9 +3012,6 @@ static struct ggml_cgraph * llm_build_baichaun( // offload functions set the tensor output backend to GPU // tensors are GPU-accelerated if any input or the output has been offloaded - // - // with the low VRAM option VRAM scratch is disabled in llama_load_model_internal - // in that case ggml_cuda_assign_buffers has no effect offload_func_t offload_func_nr = llama_nop; // nr = non-repeating offload_func_t offload_func_kq = llama_nop; offload_func_t offload_func_v = llama_nop; @@ -3382,6 +3344,7 @@ static struct ggml_cgraph * llm_build_falcon( const llama_batch & batch) { const auto & model = lctx.model; const auto & hparams = model.hparams; + const auto & cparams = lctx.cparams; const auto & kv_self = lctx.kv_self; @@ -3389,7 +3352,7 @@ static struct ggml_cgraph * llm_build_falcon( const int64_t n_embd = hparams.n_embd; const int64_t n_layer = hparams.n_layer; - const int64_t n_ctx = hparams.n_ctx; + const int64_t n_ctx = cparams.n_ctx; const int64_t n_head = hparams.n_head; const int64_t n_head_kv = hparams.n_head_kv; const int64_t n_embd_head = hparams.n_embd_head(); @@ -3397,8 +3360,8 @@ static struct ggml_cgraph * llm_build_falcon( GGML_ASSERT(n_embd_head == hparams.n_rot); - const float freq_base = hparams.rope_freq_base; - const float freq_scale = hparams.rope_freq_scale; + const float freq_base = cparams.rope_freq_base; + const float freq_scale = cparams.rope_freq_scale; const float norm_eps = hparams.f_norm_eps; const int n_gpu_layers = model.n_gpu_layers; @@ -3457,9 +3420,6 @@ static struct ggml_cgraph * llm_build_falcon( // offload functions set the tensor output backend to GPU // tensors are GPU-accelerated if any input or the output has been offloaded - // - // with the low VRAM option VRAM scratch is disabled in llama_load_model_internal - // in that case ggml_cuda_assign_buffers has no effect offload_func_t offload_func_nr = llama_nop; // nr = non-repeating offload_func_t offload_func_kq = llama_nop; offload_func_t offload_func_v = llama_nop; @@ -3753,6 +3713,7 @@ static struct ggml_cgraph * llm_build_starcoder( const llama_batch & batch) { const auto & model = lctx.model; const auto & hparams = model.hparams; + const auto & cparams = lctx.cparams; const auto & kv_self = lctx.kv_self; @@ -3760,7 +3721,7 @@ static struct ggml_cgraph * llm_build_starcoder( const int64_t n_embd = hparams.n_embd; const int64_t n_layer = hparams.n_layer; - const int64_t n_ctx = hparams.n_ctx; + const int64_t n_ctx = cparams.n_ctx; const int64_t n_head = hparams.n_head; const int64_t n_head_kv = hparams.n_head_kv; const int64_t n_embd_head = hparams.n_embd_head(); @@ -4037,8 +3998,7 @@ static struct ggml_cgraph * llama_build_graph( // static int llama_decode_internal( llama_context & lctx, - llama_batch batch, - int n_threads) { + llama_batch batch) { const uint32_t n_tokens = batch.n_tokens; if (n_tokens == 0) { @@ -4046,6 +4006,15 @@ static int llama_decode_internal( return -1; } + const auto & model = lctx.model; + const auto & hparams = model.hparams; + const auto & cparams = lctx.cparams; + + const auto n_batch = cparams.n_batch; + + GGML_ASSERT(n_tokens <= n_batch); + + int n_threads = n_tokens == 1 ? cparams.n_threads : cparams.n_threads_batch; GGML_ASSERT((!batch.token && batch.embd) || (batch.token && !batch.embd)); // NOLINT const int64_t t_start_us = ggml_time_us(); @@ -4058,9 +4027,6 @@ static int llama_decode_internal( GGML_ASSERT(n_threads > 0); - const auto & model = lctx.model; - const auto & hparams = model.hparams; - auto & kv_self = lctx.kv_self; GGML_ASSERT(!!kv_self.ctx); @@ -4103,7 +4069,7 @@ static int llama_decode_internal( // after enough generations, the benefit from this heuristic disappears // if we start defragmenting the cache, the benefit from this will be more important //kv_self.n = std::max(32, GGML_PAD(llama_kv_cache_cell_max(kv_self), 32)); // TODO: this might be better for CUDA? - kv_self.n = std::min((int32_t) hparams.n_ctx, std::max(32, llama_kv_cache_cell_max(kv_self))); + kv_self.n = std::min((int32_t) cparams.n_ctx, std::max(32, llama_kv_cache_cell_max(kv_self))); //printf("kv_self.n = %d\n", kv_self.n); @@ -4128,6 +4094,8 @@ static int llama_decode_internal( ggml_cuda_assign_scratch_offset(node, (char*)node->data - (char *) lctx.buf_alloc.data); } } + + ggml_cuda_set_mul_mat_q(cparams.mul_mat_q); #endif // LLAMA_LOG_INFO("graph build time: %.3f ms (%d nodes, %d leafs)\n", (ggml_time_us() - t_start_us)/1000.0, gf->n_nodes, gf->n_leafs); @@ -5416,7 +5384,7 @@ void llama_sample_classifier_free_guidance( GGML_ASSERT(ctx); - auto n_vocab = llama_n_vocab(ctx); + auto n_vocab = llama_n_vocab(llama_get_model(ctx)); GGML_ASSERT(n_vocab == (int)candidates->size); GGML_ASSERT(!candidates->sorted); @@ -5445,7 +5413,7 @@ void llama_sample_classifier_free_guidance( llama_token llama_sample_token_mirostat(struct llama_context * ctx, llama_token_data_array * candidates, float tau, float eta, int m, float * mu) { GGML_ASSERT(ctx); - auto N = float(llama_n_vocab(ctx)); + auto N = float(llama_n_vocab(llama_get_model(ctx))); int64_t t_start_sample_us; t_start_sample_us = ggml_time_us(); @@ -5632,7 +5600,7 @@ struct llama_logit_info { }; llama_logit_info(llama_context * ctx) : logits(llama_get_logits(ctx)) - , n_vocab(llama_n_vocab(ctx)) + , n_vocab(llama_n_vocab(llama_get_model(ctx))) , max_l(*std::max_element(logits, logits + n_vocab)) , normalizer(1.0f / std::accumulate(logits, logits + n_vocab, 0.0f, sum_exp{max_l})) { } @@ -5670,7 +5638,6 @@ struct llama_beam_search_data { size_t n_beams; int n_past; int n_predict; - int n_threads; std::vector beams; std::vector next_beams; @@ -5680,12 +5647,11 @@ struct llama_beam_search_data { // Used to communicate to/from callback on beams state. std::vector beam_views; - llama_beam_search_data(llama_context * ctx, size_t n_beams, int n_past, int n_predict, int n_threads) + llama_beam_search_data(llama_context * ctx, size_t n_beams, int n_past, int n_predict) : ctx(ctx) , n_beams(n_beams) , n_past(n_past) , n_predict(n_predict) - , n_threads(n_threads) , beam_views(n_beams) { beams.reserve(n_beams); next_beams.reserve(n_beams); @@ -5722,7 +5688,7 @@ struct llama_beam_search_data { } else { // beam is not at end-of-sentence, so branch with next top_k tokens. if (!beam.tokens.empty()) { - llama_decode(ctx, llama_batch_get_one(beam.tokens.data(), beam.tokens.size(), n_past, 0), n_threads); + llama_decode(ctx, llama_batch_get_one(beam.tokens.data(), beam.tokens.size(), n_past, 0)); } llama_logit_info logit_info(ctx); std::vector next_tokens = logit_info.top_k(n_beams); @@ -5796,7 +5762,7 @@ struct llama_beam_search_data { callback(callback_data, get_beams_state(false)); // Sets common_prefix_length update_beams_from_beam_views(); // Update values (p,eob) that callback may have changed. if (common_prefix_length) { - llama_decode(ctx, llama_batch_get_one(beams[0].tokens.data(), common_prefix_length, n_past, 0), n_threads); + llama_decode(ctx, llama_batch_get_one(beams[0].tokens.data(), common_prefix_length, n_past, 0)); n_past += common_prefix_length; } // Zero-out next_beam probabilities to place them last in following min-heap. @@ -5837,11 +5803,11 @@ struct llama_beam_search_data { void llama_beam_search(llama_context * ctx, llama_beam_search_callback_fn_t callback, void * callback_data, - size_t n_beams, int n_past, int n_predict, int n_threads) { + size_t n_beams, int n_past, int n_predict) { assert(ctx); const int64_t t_start_sample_us = ggml_time_us(); - llama_beam_search_data beam_search_data(ctx, n_beams, n_past, n_predict, n_threads); + llama_beam_search_data beam_search_data(ctx, n_beams, n_past, n_predict); beam_search_data.loop(callback, callback_data); @@ -6061,11 +6027,11 @@ static void llama_model_quantize_internal(const std::string & fname_inp, const s nthread = std::thread::hardware_concurrency(); } - std::unique_ptr ml(new llama_model_loader(fname_inp, /*use_mmap*/ false)); + llama_model_loader ml(fname_inp, /*use_mmap*/ false); llama_model model; - llm_load_arch(*ml, model); - llm_load_hparams(*ml, model, 0, 0, 0); + llm_load_arch(ml, model); + llm_load_hparams(ml, model); if (params->only_copy) { ftype = model.ftype; @@ -6075,7 +6041,7 @@ static void llama_model_quantize_internal(const std::string & fname_inp, const s struct gguf_context * ctx_out = gguf_init_empty(); // copy the KV pairs from the input file - gguf_set_kv (ctx_out, ml->ctx_gguf); + gguf_set_kv (ctx_out, ml.ctx_gguf); gguf_set_val_u32(ctx_out, "general.quantization_version", GGML_QNT_VERSION); gguf_set_val_u32(ctx_out, "general.file_type", ftype); @@ -6083,8 +6049,8 @@ static void llama_model_quantize_internal(const std::string & fname_inp, const s int n_attention_wv = 0; int n_feed_forward_w2 = 0; - for (int i = 0; i < ml->n_tensors; ++i) { - struct ggml_tensor * meta = ml->get_tensor_meta(i); + for (int i = 0; i < ml.n_tensors; ++i) { + struct ggml_tensor * meta = ml.get_tensor_meta(i); const std::string name = ggml_get_name(meta); @@ -6120,8 +6086,8 @@ static void llama_model_quantize_internal(const std::string & fname_inp, const s std::vector> f32_conv_buf; // populate the original tensors so we get an initial meta data - for (int i = 0; i < ml->n_tensors; ++i) { - struct ggml_tensor * meta = ml->get_tensor_meta(i); + for (int i = 0; i < ml.n_tensors; ++i) { + struct ggml_tensor * meta = ml.get_tensor_meta(i); gguf_add_tensor(ctx_out, meta); } @@ -6134,8 +6100,8 @@ static void llama_model_quantize_internal(const std::string & fname_inp, const s // placeholder for the meta data ::zeros(fout, meta_size); - for (int i = 0; i < ml->n_tensors; ++i) { - struct ggml_tensor * tensor = ml->get_tensor_meta(i); + for (int i = 0; i < ml.n_tensors; ++i) { + struct ggml_tensor * tensor = ml.get_tensor_meta(i); const std::string name = ggml_get_name(tensor); @@ -6143,10 +6109,10 @@ static void llama_model_quantize_internal(const std::string & fname_inp, const s read_data.resize(ggml_nbytes(tensor)); } tensor->data = read_data.data(); - ml->load_data_for(tensor); + ml.load_data_for(tensor); LLAMA_LOG_INFO("[%4d/%4d] %36s - [%s], type = %6s, ", - ++idx, ml->n_tensors, + ++idx, ml.n_tensors, ggml_get_name(tensor), llama_format_tensor_shape(tensor).c_str(), ggml_type_name(tensor->type)); @@ -6296,7 +6262,6 @@ static void llama_model_quantize_internal(const std::string & fname_inp, const s } } -// TODO: after the GGUF PR, this likely won't work and needs to be updated static int llama_apply_lora_from_file_internal( const struct llama_model & model, const char * path_lora, float scale, const char * path_base_model, int n_threads ) { @@ -6575,33 +6540,40 @@ static int llama_apply_lora_from_file_internal( // // interface implementation // +struct llama_model_params llama_model_default_params() { + struct llama_model_params result = { + /*.n_gpu_layers =*/ 0, + /*.main_gpu =*/ 0, + /*.tensor_split =*/ nullptr, + /*.progress_callback =*/ nullptr, + /*.progress_callback_user_data =*/ nullptr, + /*.vocab_only =*/ false, + /*.use_mmap =*/ true, + /*.use_mlock =*/ false, + }; + +#ifdef GGML_USE_METAL + result.n_gpu_layers = 1; +#endif + + return result; +} struct llama_context_params llama_context_default_params() { struct llama_context_params result = { /*.seed =*/ LLAMA_DEFAULT_SEED, /*.n_ctx =*/ 512, /*.n_batch =*/ 512, - /*.n_gpu_layers =*/ 0, - /*.main_gpu =*/ 0, - /*.tensor_split =*/ nullptr, + /*.n_threads =*/ GGML_DEFAULT_N_THREADS, // TODO: better default + /*.n_threads_batch =*/ GGML_DEFAULT_N_THREADS, /*.rope_freq_base =*/ 0.0f, /*.rope_freq_scale =*/ 0.0f, - /*.progress_callback =*/ nullptr, - /*.progress_callback_user_data =*/ nullptr, - /*.low_vram =*/ false, /*.mul_mat_q =*/ true, /*.f16_kv =*/ true, /*.logits_all =*/ false, - /*.vocab_only =*/ false, - /*.use_mmap =*/ true, - /*.use_mlock =*/ false, /*.embedding =*/ false, }; -#ifdef GGML_USE_METAL - result.n_gpu_layers = 1; -#endif - return result; } @@ -6660,13 +6632,11 @@ int64_t llama_time_us(void) { struct llama_model * llama_load_model_from_file( const char * path_model, - struct llama_context_params params) { + struct llama_model_params params) { ggml_time_init(); llama_model * model = new llama_model; - ggml_type memory_type = params.f16_kv ? GGML_TYPE_F16 : GGML_TYPE_F32; - unsigned cur_percentage = 0; if (params.progress_callback == NULL) { params.progress_callback_user_data = &cur_percentage; @@ -6683,9 +6653,9 @@ struct llama_model * llama_load_model_from_file( }; } - if (!llama_model_load(path_model, *model, params.n_ctx, params.n_batch, params.n_gpu_layers, - params.main_gpu, params.tensor_split, params.mul_mat_q, params.rope_freq_base, params.rope_freq_scale, - params.low_vram, memory_type, params.use_mmap, params.use_mlock, params.vocab_only, + if (!llama_model_load(path_model, *model, params.n_gpu_layers, + params.main_gpu, params.tensor_split, + params.use_mmap, params.use_mlock, params.vocab_only, params.progress_callback, params.progress_callback_user_data)) { LLAMA_LOG_ERROR("%s: failed to load model\n", __func__); delete model; @@ -6709,18 +6679,33 @@ struct llama_context * llama_new_context_with_model( llama_context * ctx = new llama_context(*model); + const auto & hparams = model->hparams; + auto & cparams = ctx->cparams; + + cparams.n_batch = params.n_batch; + cparams.n_ctx = params.n_ctx == 0 ? hparams.n_ctx_train : params.n_ctx; + cparams.rope_freq_base = params.rope_freq_base == 0 ? hparams.rope_freq_base_train : params.rope_freq_base; + cparams.rope_freq_scale = params.rope_freq_scale == 0 ? hparams.rope_freq_scale_train : params.rope_freq_scale; + cparams.n_threads = params.n_threads; + cparams.n_threads_batch = params.n_threads_batch; + cparams.mul_mat_q = params.mul_mat_q; + if (params.seed == LLAMA_DEFAULT_SEED) { params.seed = time(NULL); } + LLAMA_LOG_INFO("%s: n_ctx = %u\n", __func__, cparams.n_ctx); + LLAMA_LOG_INFO("%s: freq_base = %.1f\n", __func__, cparams.rope_freq_base); + LLAMA_LOG_INFO("%s: freq_scale = %g\n", __func__, cparams.rope_freq_scale); + ctx->rng = std::mt19937(params.seed); ctx->logits_all = params.logits_all; ggml_type memory_type = params.f16_kv ? GGML_TYPE_F16 : GGML_TYPE_F32; // reserve memory for context buffers - if (!params.vocab_only) { - if (!llama_kv_cache_init(ctx->model.hparams, ctx->kv_self, memory_type, params.n_gpu_layers)) { + if (!hparams.vocab_only) { + if (!llama_kv_cache_init(ctx->model.hparams, ctx->kv_self, memory_type, cparams.n_ctx, model->n_gpu_layers)) { LLAMA_LOG_ERROR("%s: llama_kv_cache_init() failed for self-attention cache\n", __func__); llama_free(ctx); return nullptr; @@ -6731,11 +6716,9 @@ struct llama_context * llama_new_context_with_model( LLAMA_LOG_INFO("%s: kv self size = %7.2f MB\n", __func__, memory_size / 1024.0 / 1024.0); } - const auto & hparams = ctx->model.hparams; - // resized during inference if (params.logits_all) { - ctx->logits.reserve(hparams.n_ctx*hparams.n_vocab); + ctx->logits.reserve(cparams.n_ctx*hparams.n_vocab); } else { ctx->logits.reserve(hparams.n_vocab); } @@ -6753,12 +6736,13 @@ struct llama_context * llama_new_context_with_model( ctx->alloc = ggml_allocr_new_measure(tensor_alignment); // build worst-case graph - const uint32_t n_tokens = std::min((int) hparams.n_ctx, params.n_batch); + int n_tokens = (int)std::min(cparams.n_ctx, cparams.n_batch); + int n_past = cparams.n_ctx - n_tokens; llama_token token = llama_token_bos(ctx); // not actually used by llama_build_graph, but required to choose between token and embedding inputs graph - ggml_cgraph * gf = llama_build_graph(*ctx, llama_batch_get_one(&token, n_tokens, hparams.n_ctx - n_tokens, 0)); + ggml_cgraph * gf = llama_build_graph(*ctx, llama_batch_get_one(&token, n_tokens, n_past, 0)); #ifdef GGML_USE_METAL - if (params.n_gpu_layers > 0) { + if (model->n_gpu_layers > 0) { ctx->ctx_metal = ggml_metal_init(1); if (!ctx->ctx_metal) { LLAMA_LOG_ERROR("%s: ggml_metal_init() failed\n", __func__); @@ -6773,7 +6757,7 @@ struct llama_context * llama_new_context_with_model( // measure memory requirements for the graph size_t alloc_size = ggml_allocr_alloc_graph(ctx->alloc, gf) + tensor_alignment; - LLAMA_LOG_INFO("%s: compute buffer total size = %7.2f MB\n", __func__, (ctx->buf_compute.size + alloc_size) / 1024.0 / 1024.0); + LLAMA_LOG_INFO("%s: compute buffer total size = %.2f MB\n", __func__, (ctx->buf_compute.size + alloc_size) / 1024.0 / 1024.0); // recreate allocator with exact memory requirements ggml_allocr_free(ctx->alloc); @@ -6786,24 +6770,42 @@ struct llama_context * llama_new_context_with_model( } #endif #ifdef GGML_USE_CUBLAS - if (params.low_vram) { - LLAMA_LOG_INFO("%s: not allocating a VRAM scratch buffer due to low VRAM option\n", __func__); - ggml_cuda_set_scratch_size(0); // disable scratch - } else { - ggml_cuda_set_scratch_size(alloc_size); - LLAMA_LOG_INFO("%s: VRAM scratch buffer: %.2f MB\n", __func__, alloc_size / 1024.0 / 1024.0); + ggml_cuda_set_scratch_size(alloc_size); + LLAMA_LOG_INFO("%s: VRAM scratch buffer: %.2f MB\n", __func__, alloc_size / 1024.0 / 1024.0); + + // calculate total VRAM usage + auto add_tensor = [](const ggml_tensor * t, size_t & size) { + if (t->backend == GGML_BACKEND_GPU || t->backend == GGML_BACKEND_GPU_SPLIT) { + size += ggml_nbytes(t); + } + }; + size_t model_vram_size = 0; + for (const auto & kv : model->tensors_by_name) { + add_tensor(kv.second, model_vram_size); } + + size_t kv_vram_size = 0; + add_tensor(ctx->kv_self.k, kv_vram_size); + add_tensor(ctx->kv_self.v, kv_vram_size); + + size_t ctx_vram_size = alloc_size + kv_vram_size; + size_t total_vram_size = model_vram_size + ctx_vram_size; + + LLAMA_LOG_INFO("%s: total VRAM used: %.2f MB (model: %.2f MB, context: %.2f MB)\n", __func__, + total_vram_size / 1024.0 / 1024.0, + model_vram_size / 1024.0 / 1024.0, + ctx_vram_size / 1024.0 / 1024.0); #endif } #ifdef GGML_USE_METAL - if (params.n_gpu_layers > 0) { + if (model->n_gpu_layers > 0) { // this allocates all Metal resources and memory buffers void * data_ptr = NULL; size_t data_size = 0; - if (params.use_mmap) { + if (ctx->model.mapping) { data_ptr = ctx->model.mapping->addr; data_size = ctx->model.mapping->size; } else { @@ -6822,11 +6824,8 @@ struct llama_context * llama_new_context_with_model( return NULL; \ } - LLAMA_METAL_CHECK_BUF(ggml_metal_add_buffer(ctx->ctx_metal, "data", data_ptr, data_size, max_size)); - - LLAMA_METAL_CHECK_BUF(ggml_metal_add_buffer(ctx->ctx_metal, "eval", ctx->buf_compute.data, ctx->buf_compute.size, 0)); - LLAMA_METAL_CHECK_BUF(ggml_metal_add_buffer(ctx->ctx_metal, "kv", ctx->kv_self.buf.data, ctx->kv_self.buf.size, 0)); - + LLAMA_METAL_CHECK_BUF(ggml_metal_add_buffer(ctx->ctx_metal, "data", data_ptr, data_size, max_size)); + LLAMA_METAL_CHECK_BUF(ggml_metal_add_buffer(ctx->ctx_metal, "kv", ctx->kv_self.buf.data, ctx->kv_self.buf.size, 0)); LLAMA_METAL_CHECK_BUF(ggml_metal_add_buffer(ctx->ctx_metal, "alloc", ctx->buf_alloc.data, ctx->buf_alloc.size, 0)); #undef LLAMA_METAL_CHECK_BUF } @@ -6850,63 +6849,37 @@ struct llama_context * llama_new_context_with_model( return ctx; } -static struct llama_context * llama_init_from_file( - const char * path_model, - struct llama_context_params params) { - struct llama_model * model = llama_load_model_from_file(path_model, params); - if (!model) { - return nullptr; - } - - struct llama_context * ctx = llama_new_context_with_model(model, params); - ctx->model_owner = true; - - return ctx; -} - void llama_free(struct llama_context * ctx) { delete ctx; } -int llama_n_vocab(const struct llama_context * ctx) { - return llama_model_n_vocab(&ctx->model); +const llama_model * llama_get_model(const struct llama_context * ctx) { + return &ctx->model; } int llama_n_ctx(const struct llama_context * ctx) { - return llama_model_n_ctx(&ctx->model); + return ctx->cparams.n_ctx; } -int llama_n_ctx_train(const struct llama_context * ctx) { - return llama_model_n_ctx_train(&ctx->model); +enum llama_vocab_type llama_vocab_type(const struct llama_model * model) { + return model->vocab.type; } -int llama_n_embd(const struct llama_context * ctx) { - return llama_model_n_embd(&ctx->model); -} - -enum llama_vocab_type llama_vocab_type(const struct llama_context * ctx) { - return ctx->model.vocab.type; -} - -int llama_model_n_vocab(const struct llama_model * model) { +int llama_n_vocab(const struct llama_model * model) { return model->vocab.id_to_token.size(); } -int llama_model_n_ctx(const struct llama_model * model) { - return model->hparams.n_ctx; -} - -int llama_model_n_ctx_train(const struct llama_model * model) { +int llama_n_ctx_train(const struct llama_model * model) { return model->hparams.n_ctx_train; } -int llama_model_n_embd(const struct llama_model * model) { +int llama_n_embd(const struct llama_model * model) { return model->hparams.n_embd; } int llama_model_desc(const struct llama_model * model, char * buf, size_t buf_size) { return snprintf(buf, buf_size, "%s %s %s", - model->name.c_str(), + llama_model_arch_name(model->arch).c_str(), llama_model_type_name(model->type), llama_model_ftype_name(model->ftype).c_str()); } @@ -7131,9 +7104,11 @@ static void llama_copy_state_data_internal(struct llama_context * ctx, llama_dat { const auto & kv_self = ctx->kv_self; const auto & hparams = ctx->model.hparams; + const auto & cparams = ctx->cparams; + const int n_layer = hparams.n_layer; const int n_embd = hparams.n_embd_gqa(); - const int n_ctx = hparams.n_ctx; + const int n_ctx = cparams.n_ctx; const size_t kv_size = kv_self.buf.size; const int kv_ntok = kv_self.head; @@ -7239,9 +7214,11 @@ size_t llama_set_state_data(struct llama_context * ctx, uint8_t * src) { { const auto & kv_self = ctx->kv_self; const auto & hparams = ctx->model.hparams; + const auto & cparams = ctx->cparams; + const int n_layer = hparams.n_layer; const int n_embd = hparams.n_embd_gqa(); - const int n_ctx = hparams.n_ctx; + const int n_ctx = cparams.n_ctx; size_t kv_size; int kv_ntok; @@ -7378,11 +7355,10 @@ int llama_eval( struct llama_context * ctx, llama_token * tokens, int32_t n_tokens, - int n_past, - int n_threads) { + int n_past) { llama_kv_cache_tokens_rm(ctx->kv_self, n_past, -1); - const int ret = llama_decode_internal(*ctx, llama_batch_get_one(tokens, n_tokens, n_past, 0), n_threads); + const int ret = llama_decode_internal(*ctx, llama_batch_get_one(tokens, n_tokens, n_past, 0)); if (ret < 0) { LLAMA_LOG_ERROR("%s: failed to decode, ret = %d\n", __func__, ret); } @@ -7394,13 +7370,12 @@ int llama_eval_embd( struct llama_context * ctx, float * embd, int32_t n_tokens, - int n_past, - int n_threads) { + int n_past) { llama_kv_cache_tokens_rm(ctx->kv_self, n_past, -1); llama_batch batch = { n_tokens, nullptr, embd, nullptr, nullptr, nullptr, n_past, 1, 0, }; - const int ret = llama_decode_internal(*ctx, batch, n_threads); + const int ret = llama_decode_internal(*ctx, batch); if (ret < 0) { LLAMA_LOG_ERROR("%s: failed to decode, ret = %d\n", __func__, ret); } @@ -7408,6 +7383,11 @@ int llama_eval_embd( return ret; } +void llama_set_n_threads(struct llama_context * ctx, uint32_t n_threads, uint32_t n_threads_batch) { + ctx->cparams.n_threads = n_threads; + ctx->cparams.n_threads_batch = n_threads_batch; +} + struct llama_batch llama_batch_get_one( llama_token * tokens, int32_t n_tokens, @@ -7452,9 +7432,8 @@ void llama_batch_free(struct llama_batch batch) { int llama_decode( struct llama_context * ctx, - struct llama_batch batch, - int n_threads) { - const int ret = llama_decode_internal(*ctx, batch, n_threads); + struct llama_batch batch) { + const int ret = llama_decode_internal(*ctx, batch); if (ret < 0) { LLAMA_LOG_ERROR("%s: failed to decode, ret = %d\n", __func__, ret); } @@ -7499,16 +7478,6 @@ llama_token llama_token_nl(const struct llama_context * ctx) { } int llama_tokenize( - struct llama_context * ctx, - const char * text, - int text_len, - llama_token * tokens, - int n_max_tokens, - bool add_bos) { - return llama_tokenize_with_model(&ctx->model, text, text_len, tokens, n_max_tokens, add_bos); -} - -int llama_tokenize_with_model( const struct llama_model * model, const char * text, int text_len, @@ -7529,13 +7498,9 @@ int llama_tokenize_with_model( return res.size(); } -int llama_token_to_piece(const struct llama_context * ctx, llama_token token, char * buf, int length) { - return llama_token_to_piece_with_model(&ctx->model, token, buf, length); -} - // does not write null-terminator to buf -int llama_token_to_piece_with_model(const struct llama_model * model, llama_token token, char * buf, int length) { - if (0 <= token && token < llama_model_n_vocab(model)) { +int llama_token_to_piece(const struct llama_model * model, llama_token token, char * buf, int length) { + if (0 <= token && token < llama_n_vocab(model)) { if (llama_is_normal_token(model->vocab, token)) { std::string result = model->vocab.id_to_token[token].text; if (llama_vocab_get_type(model->vocab) == LLAMA_VOCAB_TYPE_SPM) { diff --git a/llama.h b/llama.h index 046284d74..96ff1f09c 100644 --- a/llama.h +++ b/llama.h @@ -149,32 +149,37 @@ extern "C" { llama_seq_id all_seq_id; // used if seq_id == NULL } llama_batch; - struct llama_context_params { - uint32_t seed; // RNG seed, -1 for random - int32_t n_ctx; // text context - int32_t n_batch; // prompt processing batch size - int32_t n_gpu_layers; // number of layers to store in VRAM - int32_t main_gpu; // the GPU that is used for scratch and small tensors - + struct llama_model_params { + int32_t n_gpu_layers; // number of layers to store in VRAM + int32_t main_gpu; // the GPU that is used for scratch and small tensors const float * tensor_split; // how to split layers across multiple GPUs (size: LLAMA_MAX_DEVICES) - // ref: https://github.com/ggerganov/llama.cpp/pull/2054 - float rope_freq_base; // RoPE base frequency - float rope_freq_scale; // RoPE frequency scaling factor - // called with a progress value between 0 and 1, pass NULL to disable llama_progress_callback progress_callback; // context pointer passed to the progress callback void * progress_callback_user_data; // Keep the booleans together to avoid misalignment during copy-by-value. - bool low_vram; // if true, reduce VRAM usage at the cost of performance - bool mul_mat_q; // if true, use experimental mul_mat_q kernels - bool f16_kv; // use fp16 for KV cache - bool logits_all; // the llama_eval() call computes all logits, not just the last one bool vocab_only; // only load the vocabulary, no weights bool use_mmap; // use mmap if possible bool use_mlock; // force system to keep model in RAM + }; + + struct llama_context_params { + uint32_t seed; // RNG seed, -1 for random + uint32_t n_ctx; // text context + uint32_t n_batch; // prompt processing batch size + uint32_t n_threads; // number of threads to use for generation + uint32_t n_threads_batch; // number of threads to use for batch processing + + // ref: https://github.com/ggerganov/llama.cpp/pull/2054 + float rope_freq_base; // RoPE base frequency + float rope_freq_scale; // RoPE frequency scaling factor + + // Keep the booleans together to avoid misalignment during copy-by-value. + bool mul_mat_q; // if true, use experimental mul_mat_q kernels + bool f16_kv; // use fp16 for KV cache + bool logits_all; // the llama_eval() call computes all logits, not just the last one bool embedding; // embedding mode only }; @@ -236,6 +241,7 @@ extern "C" { }; // Helpers for getting default parameters + LLAMA_API struct llama_model_params llama_model_default_params(void); LLAMA_API struct llama_context_params llama_context_default_params(void); LLAMA_API struct llama_model_quantize_params llama_model_quantize_default_params(void); @@ -249,7 +255,7 @@ extern "C" { LLAMA_API struct llama_model * llama_load_model_from_file( const char * path_model, - struct llama_context_params params); + struct llama_model_params params); LLAMA_API void llama_free_model(struct llama_model * model); @@ -266,17 +272,15 @@ extern "C" { LLAMA_API bool llama_mmap_supported (void); LLAMA_API bool llama_mlock_supported(void); - LLAMA_API int llama_n_vocab (const struct llama_context * ctx); + LLAMA_API const struct llama_model * llama_get_model(const struct llama_context * ctx); + LLAMA_API int llama_n_ctx (const struct llama_context * ctx); - LLAMA_API int llama_n_ctx_train(const struct llama_context * ctx); - LLAMA_API int llama_n_embd (const struct llama_context * ctx); - LLAMA_API enum llama_vocab_type llama_vocab_type(const struct llama_context * ctx); + LLAMA_API enum llama_vocab_type llama_vocab_type(const struct llama_model * model); - LLAMA_API int llama_model_n_vocab (const struct llama_model * model); - LLAMA_API int llama_model_n_ctx (const struct llama_model * model); - LLAMA_API int llama_model_n_ctx_train(const struct llama_model * model); - LLAMA_API int llama_model_n_embd (const struct llama_model * model); + LLAMA_API int llama_n_vocab (const struct llama_model * model); + LLAMA_API int llama_n_ctx_train(const struct llama_model * model); + LLAMA_API int llama_n_embd (const struct llama_model * model); // Get a string describing the model type LLAMA_API int llama_model_desc(const struct llama_model * model, char * buf, size_t buf_size); @@ -409,8 +413,7 @@ extern "C" { struct llama_context * ctx, llama_token * tokens, int32_t n_tokens, - int n_past, - int n_threads), + int n_past), "use llama_decode() instead"); // Same as llama_eval, but use float matrix input directly. @@ -419,8 +422,7 @@ extern "C" { struct llama_context * ctx, float * embd, int32_t n_tokens, - int n_past, - int n_threads), + int n_past), "use llama_decode() instead"); // Return batch for single sequence of tokens starting at pos_0 @@ -452,8 +454,12 @@ extern "C" { // < 0 - error LLAMA_API int llama_decode( struct llama_context * ctx, - struct llama_batch batch, - int n_threads); + struct llama_batch batch); + + // Set the number of threads used for decoding + // n_threads is the number of threads used for generation (single token) + // n_threads_batch is the number of threads used for prompt and batch processing (multiple tokens) + LLAMA_API void llama_set_n_threads(struct llama_context * ctx, uint32_t n_threads, uint32_t n_threads_batch); // Token logits obtained from the last call to llama_eval() // The logits for the last token are stored in the last row @@ -494,14 +500,6 @@ extern "C" { // Returns the number of tokens on success, no more than n_max_tokens // Returns a negative number on failure - the number of tokens that would have been returned LLAMA_API int llama_tokenize( - struct llama_context * ctx, - const char * text, - int text_len, - llama_token * tokens, - int n_max_tokens, - bool add_bos); - - LLAMA_API int llama_tokenize_with_model( const struct llama_model * model, const char * text, int text_len, @@ -514,12 +512,6 @@ extern "C" { // Does not write null terminator to the buffer. // User code is responsible to remove the leading whitespace of the first non-BOS token when decoding multiple tokens. LLAMA_API int llama_token_to_piece( - const struct llama_context * ctx, - llama_token token, - char * buf, - int length); - - LLAMA_API int llama_token_to_piece_with_model( const struct llama_model * model, llama_token token, char * buf, @@ -700,15 +692,13 @@ extern "C" { /// @param n_beams Number of beams to use. /// @param n_past Number of tokens already evaluated. /// @param n_predict Maximum number of tokens to predict. EOS may occur earlier. - /// @param n_threads Number of threads as passed to llama_eval(). LLAMA_API void llama_beam_search( struct llama_context * ctx, llama_beam_search_callback_fn_t callback, void * callback_data, size_t n_beams, int n_past, - int n_predict, - int n_threads); + int n_predict); // Performance information LLAMA_API struct llama_timings llama_get_timings(struct llama_context * ctx); diff --git a/tests/test-tokenizer-0-falcon.cpp b/tests/test-tokenizer-0-falcon.cpp index 836fb8ad2..d51851e20 100644 --- a/tests/test-tokenizer-0-falcon.cpp +++ b/tests/test-tokenizer-0-falcon.cpp @@ -62,18 +62,20 @@ int main(int argc, char **argv) { // load the vocab { - auto lparams = llama_context_default_params(); + auto mparams = llama_model_default_params(); - lparams.vocab_only = true; + mparams.vocab_only = true; - model = llama_load_model_from_file(fname.c_str(), lparams); + model = llama_load_model_from_file(fname.c_str(), mparams); if (model == NULL) { fprintf(stderr, "%s: error: failed to load vocab '%s'\n", __func__, fname.c_str()); return 1; } - ctx = llama_new_context_with_model(model, lparams); + auto cparams = llama_context_default_params(); + + ctx = llama_new_context_with_model(model, cparams); if (ctx == NULL) { fprintf(stderr, "%s: error: failed to load vocab '%s'\n", __func__, fname.c_str()); @@ -82,7 +84,7 @@ int main(int argc, char **argv) { } } - if (llama_vocab_type(ctx) != LLAMA_VOCAB_TYPE_BPE) { + if (llama_vocab_type(model) != LLAMA_VOCAB_TYPE_BPE) { fprintf(stderr, "%s : error: vocab type is not SPM\n", __func__); llama_free_model(model); llama_free(ctx); diff --git a/tests/test-tokenizer-0-llama.cpp b/tests/test-tokenizer-0-llama.cpp index dfb2e81a9..91c841f7b 100644 --- a/tests/test-tokenizer-0-llama.cpp +++ b/tests/test-tokenizer-0-llama.cpp @@ -64,18 +64,20 @@ int main(int argc, char **argv) { // load the vocab { - auto lparams = llama_context_default_params(); + auto mparams = llama_model_default_params(); - lparams.vocab_only = true; + mparams.vocab_only = true; - model = llama_load_model_from_file(fname.c_str(), lparams); + model = llama_load_model_from_file(fname.c_str(), mparams); if (model == NULL) { fprintf(stderr, "%s: error: failed to load vocab '%s'\n", __func__, fname.c_str()); return 1; } - ctx = llama_new_context_with_model(model, lparams); + auto cparams = llama_context_default_params(); + + ctx = llama_new_context_with_model(model, cparams); if (ctx == NULL) { fprintf(stderr, "%s: error: failed to load vocab '%s'\n", __func__, fname.c_str()); @@ -84,7 +86,7 @@ int main(int argc, char **argv) { } } - if (llama_vocab_type(ctx) != LLAMA_VOCAB_TYPE_SPM) { + if (llama_vocab_type(model) != LLAMA_VOCAB_TYPE_SPM) { fprintf(stderr, "%s : error: vocab type is not SPM\n", __func__); llama_free_model(model); llama_free(ctx); diff --git a/tests/test-tokenizer-1-llama.cpp b/tests/test-tokenizer-1-llama.cpp index a95d462cf..3b2fc87ac 100644 --- a/tests/test-tokenizer-1-llama.cpp +++ b/tests/test-tokenizer-1-llama.cpp @@ -52,18 +52,20 @@ int main(int argc, char **argv) { // load the vocab { - auto lparams = llama_context_default_params(); + auto mparams = llama_model_default_params(); - lparams.vocab_only = true; + mparams.vocab_only = true; - model = llama_load_model_from_file(fname.c_str(), lparams); + model = llama_load_model_from_file(fname.c_str(), mparams); if (model == NULL) { fprintf(stderr, "%s: error: failed to load vocab '%s'\n", __func__, fname.c_str()); return 1; } - ctx = llama_new_context_with_model(model, lparams); + auto cparams = llama_context_default_params(); + + ctx = llama_new_context_with_model(model, cparams); if (ctx == NULL) { fprintf(stderr, "%s: error: failed to load vocab '%s'\n", __func__, fname.c_str()); @@ -72,7 +74,7 @@ int main(int argc, char **argv) { } } - GGML_ASSERT(llama_vocab_type(ctx) == LLAMA_VOCAB_TYPE_SPM); + GGML_ASSERT(llama_vocab_type(model) == LLAMA_VOCAB_TYPE_SPM); #ifdef _WIN32 // We need this for unicode console support @@ -80,7 +82,7 @@ int main(int argc, char **argv) { atexit([]() { console::cleanup(); }); #endif - const int n_vocab = llama_n_vocab(ctx); + const int n_vocab = llama_n_vocab(model); for (int i = 0; i < n_vocab; ++i) { std::string str = llama_detokenize_spm(ctx, std::vector(1, i)); From 7f1a0fe709ea1a861da2f3759f58a28bf8953c12 Mon Sep 17 00:00:00 2001 From: Qu Zongfu <43257352+yancaoweidaode@users.noreply.github.com> Date: Fri, 29 Sep 2023 03:51:52 +0800 Subject: [PATCH 07/73] ggml : release the requested thread pool resource (#3292) * Release the requested thread pool resource * Release the requested thread pool resource 2 --------- Co-authored-by: Zongfu ZF3 Qu --- ggml.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ggml.c b/ggml.c index ea964babd..078b2c422 100644 --- a/ggml.c +++ b/ggml.c @@ -89,7 +89,9 @@ static int pthread_create(pthread_t * out, void * unused, thread_ret_t(*func)(vo static int pthread_join(pthread_t thread, void * unused) { (void) unused; - return (int) WaitForSingleObject(thread, INFINITE); + int ret = (int) WaitForSingleObject(thread, INFINITE); + CloseHandle(thread); + return ret; } static int sched_yield (void) { From 0ccfc62a96a6b59a8faa14d1b350493f4cd51ae2 Mon Sep 17 00:00:00 2001 From: Hua Jiang Date: Thu, 28 Sep 2023 13:06:18 -0700 Subject: [PATCH 08/73] ggml_tensor: update the structure comments. (#3283) * ggml_tensor: update the structure comments. * remove semicolon Co-authored-by: slaren * Update ggml.h --------- Co-authored-by: Cebtenzzre Co-authored-by: slaren --- ggml.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ggml.h b/ggml.h index 0d99ae23e..d61c28b2c 100644 --- a/ggml.h +++ b/ggml.h @@ -473,8 +473,8 @@ extern "C" { int n_dims; int64_t ne[GGML_MAX_DIMS]; // number of elements size_t nb[GGML_MAX_DIMS]; // stride in bytes: - // nb[0] = sizeof(type) - // nb[1] = nb[0] * ne[0] + padding + // nb[0] = ggml_type_size(type) + // nb[1] = nb[0] * (ne[0] / ggml_blck_size(type)) + padding // nb[i] = nb[i-1] * ne[i-1] // compute data From bc39553c901a91cfcb757863586250838c83eeab Mon Sep 17 00:00:00 2001 From: Cebtenzzre Date: Thu, 28 Sep 2023 17:41:44 -0400 Subject: [PATCH 09/73] build : enable more non-default compiler warnings (#3200) --- .gitignore | 1 + CMakeLists.txt | 51 ++-- Makefile | 69 +++-- common/common.cpp | 3 +- common/log.h | 74 ++--- examples/baby-llama/baby-llama.cpp | 13 +- examples/llama-bench/llama-bench.cpp | 4 +- examples/main/main.cpp | 2 +- examples/quantize/quantize.cpp | 1 + .../train-text-from-scratch.cpp | 6 +- ggml.c | 288 ++++++++---------- ggml.h | 8 + llama.cpp | 14 +- pocs/vdot/q8dot.cpp | 8 +- tests/test-grad0.cpp | 6 +- tests/test-opt.cpp | 4 +- 16 files changed, 285 insertions(+), 267 deletions(-) diff --git a/.gitignore b/.gitignore index 8ba3b9f4b..f98132a22 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,7 @@ models-mnt /main /metal /perplexity +/q8dot /quantize /quantize-stats /result diff --git a/CMakeLists.txt b/CMakeLists.txt index c4a649a97..d5acf8540 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -414,37 +414,38 @@ endif() if (LLAMA_ALL_WARNINGS) if (NOT MSVC) - set(c_flags - -Wall - -Wextra - -Wpedantic - -Wcast-qual - -Wdouble-promotion - -Wshadow - -Wstrict-prototypes - -Wpointer-arith - -Wmissing-prototypes - -Werror=implicit-int - -Wno-unused-function - ) - set(cxx_flags - -Wall - -Wextra - -Wpedantic - -Wcast-qual - -Wmissing-declarations - -Wno-unused-function - -Wno-multichar - ) - if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - # g++ only - set(cxx_flags ${cxx_flags} -Wno-format-truncation -Wno-array-bounds) + set(warning_flags -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function) + set(c_flags -Wshadow -Wstrict-prototypes -Wpointer-arith -Wmissing-prototypes -Werror=implicit-int + -Werror=implicit-function-declaration) + set(cxx_flags -Wmissing-declarations -Wmissing-noreturn) + + if (CMAKE_C_COMPILER_ID MATCHES "Clang") + set(warning_flags ${warning_flags} -Wunreachable-code-break -Wunreachable-code-return) + set(cxx_flags ${cxx_flags} -Wmissing-prototypes -Wextra-semi) + + if ( + (CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 3.8.0) OR + (CMAKE_C_COMPILER_ID STREQUAL "AppleClang" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 7.3.0) + ) + set(c_flags ${c_flags} -Wdouble-promotion) + endif() + elseif (CMAKE_C_COMPILER_ID STREQUAL "GNU") + set(c_flags ${c_flags} -Wdouble-promotion) + set(cxx_flags ${cxx_flags} -Wno-array-bounds) + + if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 7.1.0) + set(cxx_flags ${cxx_flags} -Wno-format-truncation) + endif() + if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 8.1.0) + set(cxx_flags ${cxx_flags} -Wextra-semi) + endif() endif() else() # todo : msvc endif() add_compile_options( + ${warning_flags} "$<$:${c_flags}>" "$<$:${cxx_flags}>" ) diff --git a/Makefile b/Makefile index 53af3c692..08b83ca7e 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # Define the default target now so that it is always the first target -BUILD_TARGETS = main quantize quantize-stats perplexity embedding vdot train-text-from-scratch convert-llama2c-to-ggml simple batched save-load-state server embd-input-test gguf llama-bench baby-llama beam-search speculative parallel finetune export-lora tests/test-c.o +BUILD_TARGETS = main quantize quantize-stats perplexity embedding vdot q8dot train-text-from-scratch convert-llama2c-to-ggml simple batched save-load-state server embd-input-test gguf llama-bench baby-llama beam-search speculative benchmark-matmult parallel finetune export-lora tests/test-c.o # Binaries only useful for tests TEST_TARGETS = tests/test-llama-grammar tests/test-grammar-parser tests/test-double-float tests/test-grad0 tests/test-opt tests/test-quantize-fns tests/test-quantize-perf tests/test-sampling tests/test-tokenizer-0-llama tests/test-tokenizer-0-falcon tests/test-tokenizer-1-llama @@ -19,6 +19,20 @@ ifndef UNAME_M UNAME_M := $(shell uname -m) endif +ifeq '' '$(findstring clang,$(shell $(CC) --version))' + CC_IS_GCC=1 + CC_VER := $(shell $(CC) -dumpfullversion -dumpversion | awk -F. '{ printf("%02d%02d%02d", $$1, $$2, $$3) }') +else + CC_IS_CLANG=1 + ifeq '' '$(findstring Apple LLVM,$(shell $(CC) --version))' + CC_IS_LLVM_CLANG=1 + else + CC_IS_APPLE_CLANG=1 + endif + CC_VER := $(shell $(CC) --version | sed -n 's/^.* version \([0-9.]*\).*$$/\1/p' \ + | awk -F. '{ printf("%02d%02d%02d", $$1, $$2, $$3) }') +endif + # Mac OS + Arm can report x86_64 # ref: https://github.com/ggerganov/whisper.cpp/issues/66#issuecomment-1282546789 ifeq ($(UNAME_S),Darwin) @@ -87,9 +101,6 @@ CC := riscv64-unknown-linux-gnu-gcc CXX := riscv64-unknown-linux-gnu-g++ endif -CCV := $(shell $(CC) --version | head -n 1) -CXXV := $(shell $(CXX) --version | head -n 1) - # # Compile flags # @@ -173,20 +184,33 @@ ifdef LLAMA_DISABLE_LOGS endif # LLAMA_DISABLE_LOGS # warnings -MK_CFLAGS += -Wall -Wextra -Wpedantic -Wcast-qual -Wdouble-promotion -Wshadow -Wstrict-prototypes -Wpointer-arith \ - -Wmissing-prototypes -Werror=implicit-int -Wno-unused-function -MK_CXXFLAGS += -Wall -Wextra -Wpedantic -Wcast-qual -Wmissing-declarations -Wno-unused-function -Wno-multichar +WARN_FLAGS = -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function +MK_CFLAGS += $(WARN_FLAGS) -Wshadow -Wstrict-prototypes -Wpointer-arith -Wmissing-prototypes -Werror=implicit-int \ + -Werror=implicit-function-declaration +MK_CXXFLAGS += $(WARN_FLAGS) -Wmissing-declarations -Wmissing-noreturn -# TODO(cebtenzzre): remove this once PR #2632 gets merged -TTFS_CXXFLAGS = $(CXXFLAGS) -Wno-missing-declarations +ifeq ($(CC_IS_CLANG), 1) + # clang options + MK_CFLAGS += -Wunreachable-code-break -Wunreachable-code-return + MK_HOST_CXXFLAGS += -Wunreachable-code-break -Wunreachable-code-return -Wmissing-prototypes -Wextra-semi -ifneq '' '$(findstring clang,$(shell $(CXX) --version))' - # clang++ only - MK_CXXFLAGS += -Wmissing-prototypes - TTFS_CXXFLAGS += -Wno-missing-prototypes + ifneq '' '$(and $(CC_IS_LLVM_CLANG),$(filter 1,$(shell expr $(CC_VER) \>= 030800)))' + MK_CFLAGS += -Wdouble-promotion + endif + ifneq '' '$(and $(CC_IS_APPLE_CLANG),$(filter 1,$(shell expr $(CC_VER) \>= 070300)))' + MK_CFLAGS += -Wdouble-promotion + endif else - # g++ only - MK_CXXFLAGS += -Wno-format-truncation -Wno-array-bounds + # gcc options + MK_CFLAGS += -Wdouble-promotion + MK_HOST_CXXFLAGS += -Wno-array-bounds + + ifeq ($(shell expr $(CC_VER) \>= 070100), 1) + MK_HOST_CXXFLAGS += -Wno-format-truncation + endif + ifeq ($(shell expr $(CC_VER) \>= 080100), 1) + MK_HOST_CXXFLAGS += -Wextra-semi + endif endif # OS specific @@ -382,7 +406,7 @@ ifdef LLAMA_CUDA_CCBIN NVCCFLAGS += -ccbin $(LLAMA_CUDA_CCBIN) endif ggml-cuda.o: ggml-cuda.cu ggml-cuda.h - $(NVCC) $(NVCCFLAGS) -Wno-pedantic -c $< -o $@ + $(NVCC) $(NVCCFLAGS) -c $< -o $@ endif # LLAMA_CUBLAS ifdef LLAMA_CLBLAST @@ -472,8 +496,8 @@ $(info I CFLAGS: $(CFLAGS)) $(info I CXXFLAGS: $(CXXFLAGS)) $(info I NVCCFLAGS: $(NVCCFLAGS)) $(info I LDFLAGS: $(LDFLAGS)) -$(info I CC: $(CCV)) -$(info I CXX: $(CXXV)) +$(info I CC: $(shell $(CC) --version | head -n 1)) +$(info I CXX: $(shell $(CXX) --version | head -n 1)) $(info ) # @@ -554,7 +578,7 @@ gguf: examples/gguf/gguf.cpp ggml.o llama.o $(OBJS) $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) train-text-from-scratch: examples/train-text-from-scratch/train-text-from-scratch.cpp ggml.o llama.o common.o train.o $(OBJS) - $(CXX) $(TTFS_CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) + $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) convert-llama2c-to-ggml: examples/convert-llama2c-to-ggml/convert-llama2c-to-ggml.cpp ggml.o llama.o $(OBJS) $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) @@ -601,11 +625,18 @@ tests: $(TEST_TARGETS) benchmark-matmult: examples/benchmark/benchmark-matmult.cpp build-info.h ggml.o $(OBJS) $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) + +run-benchmark-matmult: benchmark-matmult ./$@ +.PHONY: run-benchmark-matmult + vdot: pocs/vdot/vdot.cpp ggml.o $(OBJS) $(CXX) $(CXXFLAGS) $^ -o $@ $(LDFLAGS) +q8dot: pocs/vdot/q8dot.cpp ggml.o $(OBJS) + $(CXX) $(CXXFLAGS) $^ -o $@ $(LDFLAGS) + tests/test-llama-grammar: tests/test-llama-grammar.cpp build-info.h ggml.o common.o grammar-parser.o $(OBJS) $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) diff --git a/common/common.cpp b/common/common.cpp index 6e8c08cb8..ec181c6b3 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -755,10 +755,9 @@ std::string gpt_random_prompt(std::mt19937 & rng) { case 7: return "He"; case 8: return "She"; case 9: return "They"; - default: return "To"; } - return "The"; + GGML_UNREACHABLE(); } // diff --git a/common/log.h b/common/log.h index 18f3b9761..b8953fdca 100644 --- a/common/log.h +++ b/common/log.h @@ -225,31 +225,31 @@ enum LogTriState // USE LOG() INSTEAD // #ifndef _MSC_VER - #define LOG_IMPL(str, ...) \ - { \ + #define LOG_IMPL(str, ...) \ + do { \ if (LOG_TARGET != nullptr) \ { \ fprintf(LOG_TARGET, LOG_TIMESTAMP_FMT LOG_FLF_FMT str "%s" LOG_TIMESTAMP_VAL LOG_FLF_VAL, __VA_ARGS__); \ fflush(LOG_TARGET); \ } \ - } + } while (0) #else - #define LOG_IMPL(str, ...) \ - { \ + #define LOG_IMPL(str, ...) \ + do { \ if (LOG_TARGET != nullptr) \ { \ fprintf(LOG_TARGET, LOG_TIMESTAMP_FMT LOG_FLF_FMT str "%s" LOG_TIMESTAMP_VAL LOG_FLF_VAL "", ##__VA_ARGS__); \ fflush(LOG_TARGET); \ } \ - } + } while (0) #endif // INTERNAL, DO NOT USE // USE LOG_TEE() INSTEAD // #ifndef _MSC_VER - #define LOG_TEE_IMPL(str, ...) \ - { \ + #define LOG_TEE_IMPL(str, ...) \ + do { \ if (LOG_TARGET != nullptr) \ { \ fprintf(LOG_TARGET, LOG_TIMESTAMP_FMT LOG_FLF_FMT str "%s" LOG_TIMESTAMP_VAL LOG_FLF_VAL, __VA_ARGS__); \ @@ -260,10 +260,10 @@ enum LogTriState fprintf(LOG_TEE_TARGET, LOG_TEE_TIMESTAMP_FMT LOG_TEE_FLF_FMT str "%s" LOG_TEE_TIMESTAMP_VAL LOG_TEE_FLF_VAL, __VA_ARGS__); \ fflush(LOG_TEE_TARGET); \ } \ - } + } while (0) #else - #define LOG_TEE_IMPL(str, ...) \ - { \ + #define LOG_TEE_IMPL(str, ...) \ + do { \ if (LOG_TARGET != nullptr) \ { \ fprintf(LOG_TARGET, LOG_TIMESTAMP_FMT LOG_FLF_FMT str "%s" LOG_TIMESTAMP_VAL LOG_FLF_VAL "", ##__VA_ARGS__); \ @@ -274,7 +274,7 @@ enum LogTriState fprintf(LOG_TEE_TARGET, LOG_TEE_TIMESTAMP_FMT LOG_TEE_FLF_FMT str "%s" LOG_TEE_TIMESTAMP_VAL LOG_TEE_FLF_VAL "", ##__VA_ARGS__); \ fflush(LOG_TEE_TARGET); \ } \ - } + } while (0) #endif // The '\0' as a last argument, is a trick to bypass the silly @@ -435,41 +435,41 @@ inline FILE *log_handler() { return log_handler1_impl(); } inline void log_test() { log_disable(); - LOG("01 Hello World to nobody, because logs are disabled!\n") + LOG("01 Hello World to nobody, because logs are disabled!\n"); log_enable(); - LOG("02 Hello World to default output, which is \"%s\" ( Yaaay, arguments! )!\n", LOG_STRINGIZE(LOG_TARGET)) - LOG_TEE("03 Hello World to **both** default output and " LOG_TEE_TARGET_STRING "!\n") + LOG("02 Hello World to default output, which is \"%s\" ( Yaaay, arguments! )!\n", LOG_STRINGIZE(LOG_TARGET)); + LOG_TEE("03 Hello World to **both** default output and " LOG_TEE_TARGET_STRING "!\n"); log_set_target(stderr); - LOG("04 Hello World to stderr!\n") - LOG_TEE("05 Hello World TEE with double printing to stderr prevented!\n") + LOG("04 Hello World to stderr!\n"); + LOG_TEE("05 Hello World TEE with double printing to stderr prevented!\n"); log_set_target(LOG_DEFAULT_FILE_NAME); - LOG("06 Hello World to default log file!\n") + LOG("06 Hello World to default log file!\n"); log_set_target(stdout); - LOG("07 Hello World to stdout!\n") + LOG("07 Hello World to stdout!\n"); log_set_target(LOG_DEFAULT_FILE_NAME); - LOG("08 Hello World to default log file again!\n") + LOG("08 Hello World to default log file again!\n"); log_disable(); - LOG("09 Hello World _1_ into the void!\n") + LOG("09 Hello World _1_ into the void!\n"); log_enable(); - LOG("10 Hello World back from the void ( you should not see _1_ in the log or the output )!\n") + LOG("10 Hello World back from the void ( you should not see _1_ in the log or the output )!\n"); log_disable(); log_set_target("llama.anotherlog.log"); - LOG("11 Hello World _2_ to nobody, new target was selected but logs are still disabled!\n") + LOG("11 Hello World _2_ to nobody, new target was selected but logs are still disabled!\n"); log_enable(); - LOG("12 Hello World this time in a new file ( you should not see _2_ in the log or the output )?\n") + LOG("12 Hello World this time in a new file ( you should not see _2_ in the log or the output )?\n"); log_set_target("llama.yetanotherlog.log"); - LOG("13 Hello World this time in yet new file?\n") + LOG("13 Hello World this time in yet new file?\n"); log_set_target(log_filename_generator("llama_autonamed", "log")); - LOG("14 Hello World in log with generated filename!\n") + LOG("14 Hello World in log with generated filename!\n"); #ifdef _MSC_VER - LOG_TEE("15 Hello msvc TEE without arguments\n") - LOG_TEE("16 Hello msvc TEE with (%d)(%s) arguments\n", 1, "test") - LOG_TEELN("17 Hello msvc TEELN without arguments\n") - LOG_TEELN("18 Hello msvc TEELN with (%d)(%s) arguments\n", 1, "test") - LOG("19 Hello msvc LOG without arguments\n") - LOG("20 Hello msvc LOG with (%d)(%s) arguments\n", 1, "test") - LOGLN("21 Hello msvc LOGLN without arguments\n") - LOGLN("22 Hello msvc LOGLN with (%d)(%s) arguments\n", 1, "test") + LOG_TEE("15 Hello msvc TEE without arguments\n"); + LOG_TEE("16 Hello msvc TEE with (%d)(%s) arguments\n", 1, "test"); + LOG_TEELN("17 Hello msvc TEELN without arguments\n"); + LOG_TEELN("18 Hello msvc TEELN with (%d)(%s) arguments\n", 1, "test"); + LOG("19 Hello msvc LOG without arguments\n"); + LOG("20 Hello msvc LOG with (%d)(%s) arguments\n", 1, "test"); + LOGLN("21 Hello msvc LOGLN without arguments\n"); + LOGLN("22 Hello msvc LOGLN with (%d)(%s) arguments\n", 1, "test"); #endif } @@ -542,7 +542,7 @@ inline void log_dump_cmdline_impl(int argc, char **argv) buf << " " << argv[i]; } } - LOGLN("Cmd:%s", buf.str().c_str()) + LOGLN("Cmd:%s", buf.str().c_str()); } #define log_tostr(var) log_var_to_string_impl(var).c_str() @@ -620,10 +620,10 @@ inline std::string log_var_to_string_impl(const std::vector & var) #define LOGLN(...) // dummy stub #undef LOG_TEE -#define LOG_TEE(...) fprintf(stderr, __VA_ARGS__); // convert to normal fprintf +#define LOG_TEE(...) fprintf(stderr, __VA_ARGS__) // convert to normal fprintf #undef LOG_TEELN -#define LOG_TEELN(...) fprintf(stderr, __VA_ARGS__); // convert to normal fprintf +#define LOG_TEELN(...) fprintf(stderr, __VA_ARGS__) // convert to normal fprintf #undef LOG_DISABLE #define LOG_DISABLE() // dummy stub diff --git a/examples/baby-llama/baby-llama.cpp b/examples/baby-llama/baby-llama.cpp index fb1a15c47..8155101d0 100644 --- a/examples/baby-llama/baby-llama.cpp +++ b/examples/baby-llama/baby-llama.cpp @@ -1,9 +1,12 @@ #include "ggml.h" #include "train.h" + #include #include -#include +#include #include +#include +#include #if defined(_MSC_VER) #pragma warning(disable: 4244 4267) // possible loss of data @@ -64,7 +67,7 @@ static struct ggml_tensor * randomize_tensor( break; default: assert(false); - }; + } return tensor; } @@ -389,7 +392,7 @@ static void randomize_model_lora( free_random_normal_distribution(rnd); } -static bool init_kv_cache(struct llama_kv_cache* cache, struct llama_model * model, int n_batch) { +static void init_kv_cache(struct llama_kv_cache* cache, struct llama_model * model, int n_batch) { const auto & hparams = model->hparams; const uint32_t n_ctx = hparams.n_ctx; @@ -415,14 +418,12 @@ static bool init_kv_cache(struct llama_kv_cache* cache, struct llama_model * mod if (!cache->ctx) { fprintf(stderr, "%s: failed to allocate memory for kv cache\n", __func__); - return false; + exit(1); } } cache->k = ggml_new_tensor_1d(cache->ctx, GGML_TYPE_F32, n_elements); cache->v = ggml_new_tensor_1d(cache->ctx, GGML_TYPE_F32, n_elements); - - return true; } static bool init_kv_cache_lora(struct llama_kv_cache* cache, struct llama_model_lora * model, int n_batch) { diff --git a/examples/llama-bench/llama-bench.cpp b/examples/llama-bench/llama-bench.cpp index 93bb0c8b1..a04115c96 100644 --- a/examples/llama-bench/llama-bench.cpp +++ b/examples/llama-bench/llama-bench.cpp @@ -655,9 +655,9 @@ struct printer { virtual ~printer() {} FILE * fout; - virtual void print_header(const cmd_params & params) { (void) params; }; + virtual void print_header(const cmd_params & params) { (void) params; } virtual void print_test(const test & t) = 0; - virtual void print_footer() { }; + virtual void print_footer() { } }; struct csv_printer : public printer { diff --git a/examples/main/main.cpp b/examples/main/main.cpp index fd506773f..3a4ed3f78 100644 --- a/examples/main/main.cpp +++ b/examples/main/main.cpp @@ -852,7 +852,7 @@ int main(int argc, char ** argv) { llama_backend_free(); #ifndef LOG_DISABLE_LOGS - LOG_TEE("Log end\n") + LOG_TEE("Log end\n"); #endif // LOG_DISABLE_LOGS return 0; diff --git a/examples/quantize/quantize.cpp b/examples/quantize/quantize.cpp index 1c1d957e6..c7dd0d894 100644 --- a/examples/quantize/quantize.cpp +++ b/examples/quantize/quantize.cpp @@ -72,6 +72,7 @@ static bool try_parse_ftype(const std::string & ftype_str_in, llama_ftype & ftyp // usage: // ./quantize [--allow-requantize] [--leave-output-tensor] models/llama/ggml-model.gguf [models/llama/ggml-model-quant.gguf] type [nthreads] // +[[noreturn]] static void usage(const char * executable) { printf("usage: %s [--help] [--allow-requantize] [--leave-output-tensor] model-f32.gguf [model-quant.gguf] type [nthreads]\n\n", executable); printf(" --allow-requantize: Allows requantizing tensors that have already been quantized. Warning: This can severely reduce quality compared to quantizing from 16bit or 32bit\n"); diff --git a/examples/train-text-from-scratch/train-text-from-scratch.cpp b/examples/train-text-from-scratch/train-text-from-scratch.cpp index a9cf8a381..5043f32d0 100644 --- a/examples/train-text-from-scratch/train-text-from-scratch.cpp +++ b/examples/train-text-from-scratch/train-text-from-scratch.cpp @@ -483,7 +483,7 @@ static struct ggml_tensor * llama_build_train_graphs( } #define GGUF_GET_KEY(ctx, dst, func, type, req, key) \ -{ \ +do { \ const std::string skey(key); \ const int kid = gguf_find_key(ctx, skey.c_str()); \ if (kid >= 0) { \ @@ -495,7 +495,7 @@ static struct ggml_tensor * llama_build_train_graphs( } else if (req) { \ die_fmt("key not found in model: %s", skey.c_str()); \ } \ -} +} while (0) static void load_llama_model_gguf(struct gguf_context * fctx, struct ggml_context * f_ggml_ctx, struct my_llama_model * model) { // NOTE: gguf_context must be initialized with f_ggml_ctx and no_alloc=false, otherwise tensor data can not be read @@ -786,7 +786,7 @@ struct train_params { float rope_freq_scale; }; -struct train_params get_default_train_params() { +static struct train_params get_default_train_params() { struct train_params params; params.common = get_default_train_params_common(); params.fn_vocab_model = "ggml-vic7b-uncensored-q4_0.bin"; diff --git a/ggml.c b/ggml.c index 078b2c422..820fe2e74 100644 --- a/ggml.c +++ b/ggml.c @@ -245,18 +245,18 @@ inline static void * ggml_aligned_malloc(size_t size) { // #define GGML_TENSOR_UNARY_OP_LOCALS \ - GGML_TENSOR_LOCALS(int64_t, ne0, src0, ne); \ - GGML_TENSOR_LOCALS(size_t, nb0, src0, nb); \ - GGML_TENSOR_LOCALS(int64_t, ne, dst, ne); \ - GGML_TENSOR_LOCALS(size_t, nb, dst, nb); + GGML_TENSOR_LOCALS(int64_t, ne0, src0, ne) \ + GGML_TENSOR_LOCALS(size_t, nb0, src0, nb) \ + GGML_TENSOR_LOCALS(int64_t, ne, dst, ne) \ + GGML_TENSOR_LOCALS(size_t, nb, dst, nb) #define GGML_TENSOR_BINARY_OP_LOCALS \ - GGML_TENSOR_LOCALS(int64_t, ne0, src0, ne); \ - GGML_TENSOR_LOCALS(size_t, nb0, src0, nb); \ - GGML_TENSOR_LOCALS(int64_t, ne1, src1, ne); \ - GGML_TENSOR_LOCALS(size_t, nb1, src1, nb); \ - GGML_TENSOR_LOCALS(int64_t, ne, dst, ne); \ - GGML_TENSOR_LOCALS(size_t, nb, dst, nb); + GGML_TENSOR_LOCALS(int64_t, ne0, src0, ne) \ + GGML_TENSOR_LOCALS(size_t, nb0, src0, nb) \ + GGML_TENSOR_LOCALS(int64_t, ne1, src1, ne) \ + GGML_TENSOR_LOCALS(size_t, nb1, src1, nb) \ + GGML_TENSOR_LOCALS(int64_t, ne, dst, ne) \ + GGML_TENSOR_LOCALS(size_t, nb, dst, nb) #if defined(GGML_USE_ACCELERATE) #include @@ -1866,7 +1866,7 @@ ggml_type_traits_t ggml_internal_get_type_traits(enum ggml_type type) { #define GGML_F16x8_ADD vaddq_f16 #define GGML_F16x8_MUL vmulq_f16 #define GGML_F16x8_REDUCE(res, x) \ - { \ + do { \ int offset = GGML_F16_ARR >> 1; \ for (int i = 0; i < offset; ++i) { \ x[i] = vaddq_f16(x[i], x[offset+i]); \ @@ -1882,7 +1882,7 @@ ggml_type_traits_t ggml_internal_get_type_traits(enum ggml_type type) { const float32x4_t t0 = vcvt_f32_f16(vget_low_f16 (x[0])); \ const float32x4_t t1 = vcvt_f32_f16(vget_high_f16(x[0])); \ res = (ggml_float) vaddvq_f32(vaddq_f32(t0, t1)); \ - } + } while (0) #define GGML_F16_VEC GGML_F16x8 #define GGML_F16_VEC_ZERO GGML_F16x8_ZERO @@ -1943,7 +1943,7 @@ ggml_type_traits_t ggml_internal_get_type_traits(enum ggml_type type) { #define GGML_F32x8_ADD _mm256_add_ps #define GGML_F32x8_MUL _mm256_mul_ps #define GGML_F32x8_REDUCE(res, x) \ -{ \ +do { \ int offset = GGML_F32_ARR >> 1; \ for (int i = 0; i < offset; ++i) { \ x[i] = _mm256_add_ps(x[i], x[offset+i]); \ @@ -1960,7 +1960,7 @@ ggml_type_traits_t ggml_internal_get_type_traits(enum ggml_type type) { _mm256_extractf128_ps(x[0], 1)); \ const __m128 t1 = _mm_hadd_ps(t0, t0); \ res = _mm_cvtss_f32(_mm_hadd_ps(t1, t1)); \ -} +} while (0) // TODO: is this optimal ? #define GGML_F32_VEC GGML_F32x8 @@ -5154,31 +5154,31 @@ int32_t ggml_get_i32_1d(const struct ggml_tensor * tensor, int i) { { GGML_ASSERT(tensor->nb[0] == sizeof(int8_t)); return ((int8_t *)(tensor->data))[i]; - } break; + } case GGML_TYPE_I16: { GGML_ASSERT(tensor->nb[0] == sizeof(int16_t)); return ((int16_t *)(tensor->data))[i]; - } break; + } case GGML_TYPE_I32: { GGML_ASSERT(tensor->nb[0] == sizeof(int32_t)); return ((int32_t *)(tensor->data))[i]; - } break; + } case GGML_TYPE_F16: { GGML_ASSERT(tensor->nb[0] == sizeof(ggml_fp16_t)); return GGML_FP16_TO_FP32(((ggml_fp16_t *)(tensor->data))[i]); - } break; + } case GGML_TYPE_F32: { GGML_ASSERT(tensor->nb[0] == sizeof(float)); return ((float *)(tensor->data))[i]; - } break; + } default: { GGML_ASSERT(false); - } break; + } } return 0.0f; @@ -5228,29 +5228,17 @@ int32_t ggml_get_i32_nd(const struct ggml_tensor * tensor, int i0, int i1, int i void * data = (char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1] + i2*tensor->nb[2] + i3*tensor->nb[3]; switch (tensor->type) { case GGML_TYPE_I8: - { - return ((int8_t *) data)[0]; - } break; + return ((int8_t *) data)[0]; case GGML_TYPE_I16: - { - return ((int16_t *) data)[0]; - } break; + return ((int16_t *) data)[0]; case GGML_TYPE_I32: - { - return ((int32_t *) data)[0]; - } break; + return ((int32_t *) data)[0]; case GGML_TYPE_F16: - { - return GGML_FP16_TO_FP32(((ggml_fp16_t *) data)[0]); - } break; + return GGML_FP16_TO_FP32(((ggml_fp16_t *) data)[0]); case GGML_TYPE_F32: - { - return ((float *) data)[0]; - } break; + return ((float *) data)[0]; default: - { - GGML_ASSERT(false); - } break; + GGML_ASSERT(false); } return 0.0f; @@ -5297,31 +5285,31 @@ float ggml_get_f32_1d(const struct ggml_tensor * tensor, int i) { { GGML_ASSERT(tensor->nb[0] == sizeof(int8_t)); return ((int8_t *)(tensor->data))[i]; - } break; + } case GGML_TYPE_I16: { GGML_ASSERT(tensor->nb[0] == sizeof(int16_t)); return ((int16_t *)(tensor->data))[i]; - } break; + } case GGML_TYPE_I32: { GGML_ASSERT(tensor->nb[0] == sizeof(int32_t)); return ((int32_t *)(tensor->data))[i]; - } break; + } case GGML_TYPE_F16: { GGML_ASSERT(tensor->nb[0] == sizeof(ggml_fp16_t)); return GGML_FP16_TO_FP32(((ggml_fp16_t *)(tensor->data))[i]); - } break; + } case GGML_TYPE_F32: { GGML_ASSERT(tensor->nb[0] == sizeof(float)); return ((float *)(tensor->data))[i]; - } break; + } default: { GGML_ASSERT(false); - } break; + } } return 0.0f; @@ -5371,29 +5359,17 @@ float ggml_get_f32_nd(const struct ggml_tensor * tensor, int i0, int i1, int i2, void * data = (char *) tensor->data + i0*tensor->nb[0] + i1*tensor->nb[1] + i2*tensor->nb[2] + i3*tensor->nb[3]; switch (tensor->type) { case GGML_TYPE_I8: - { - return ((int8_t *) data)[0]; - } break; + return ((int8_t *) data)[0]; case GGML_TYPE_I16: - { - return ((int16_t *) data)[0]; - } break; + return ((int16_t *) data)[0]; case GGML_TYPE_I32: - { - return ((int32_t *) data)[0]; - } break; + return ((int32_t *) data)[0]; case GGML_TYPE_F16: - { - return GGML_FP16_TO_FP32(((ggml_fp16_t *) data)[0]); - } break; + return GGML_FP16_TO_FP32(((ggml_fp16_t *) data)[0]); case GGML_TYPE_F32: - { - return ((float *) data)[0]; - } break; + return ((float *) data)[0]; default: - { - GGML_ASSERT(false); - } break; + GGML_ASSERT(false); } return 0.0f; @@ -8542,7 +8518,7 @@ static void ggml_compute_forward_dup_f16( return; } - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS const int ith = params->ith; // thread index const int nth = params->nth; // number of threads @@ -8813,7 +8789,7 @@ static void ggml_compute_forward_dup_f32( return; } - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS const int ith = params->ith; // thread index const int nth = params->nth; // number of threads @@ -9094,7 +9070,7 @@ static void ggml_compute_forward_add_f32( const int nr = ggml_nrows(src0); - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS GGML_ASSERT( nb0 == sizeof(float)); GGML_ASSERT(nb00 == sizeof(float)); @@ -9167,7 +9143,7 @@ static void ggml_compute_forward_add_f16_f32( const int nr = ggml_nrows(src0); - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS GGML_ASSERT(src0->type == GGML_TYPE_F16); GGML_ASSERT(src1->type == GGML_TYPE_F32); @@ -9221,7 +9197,7 @@ static void ggml_compute_forward_add_f16_f16( const int nr = ggml_nrows(src0); - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS GGML_ASSERT(src0->type == GGML_TYPE_F16); GGML_ASSERT(src1->type == GGML_TYPE_F16); @@ -9272,7 +9248,7 @@ static void ggml_compute_forward_add_q_f32( const int nr = ggml_nrows(src0); - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS const int ith = params->ith; const int nth = params->nth; @@ -9398,7 +9374,7 @@ static void ggml_compute_forward_add1_f32( const int nr = ggml_nrows(src0); - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS GGML_ASSERT( nb0 == sizeof(float)); GGML_ASSERT(nb00 == sizeof(float)); @@ -9453,7 +9429,7 @@ static void ggml_compute_forward_add1_f16_f32( const int nr = ggml_nrows(src0); - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS GGML_ASSERT(src0->type == GGML_TYPE_F16); GGML_ASSERT(src1->type == GGML_TYPE_F32); @@ -9503,7 +9479,7 @@ static void ggml_compute_forward_add1_f16_f16( const int nr = ggml_nrows(src0); - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS GGML_ASSERT(src0->type == GGML_TYPE_F16); GGML_ASSERT(src1->type == GGML_TYPE_F16); @@ -9553,7 +9529,7 @@ static void ggml_compute_forward_add1_q_f32( const int nr = ggml_nrows(src0); - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS const enum ggml_type type = src0->type; ggml_to_float_t const dequantize_row_q = type_traits[type].to_float; @@ -9681,8 +9657,8 @@ static void ggml_compute_forward_acc_f32( const int nr = ggml_nrows(src1); const int nc = src1->ne[0]; - GGML_TENSOR_LOCALS(int64_t, ne1, src1, ne); - GGML_TENSOR_LOCALS(size_t, nb1, src1, nb); + GGML_TENSOR_LOCALS(int64_t, ne1, src1, ne) + GGML_TENSOR_LOCALS(size_t, nb1, src1, nb) // src0 and dst as viewed during acc const size_t nb0 = ggml_element_size(src0); @@ -9771,7 +9747,7 @@ static void ggml_compute_forward_sub_f32( const int nr = ggml_nrows(src0); - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS GGML_ASSERT( nb0 == sizeof(float)); GGML_ASSERT(nb00 == sizeof(float)); @@ -9861,7 +9837,7 @@ static void ggml_compute_forward_mul_f32( const int64_t nr = ggml_nrows(src0); - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS GGML_ASSERT( nb0 == sizeof(float)); GGML_ASSERT(nb00 == sizeof(float)); @@ -9952,7 +9928,7 @@ static void ggml_compute_forward_div_f32( const int nr = ggml_nrows(src0); - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS GGML_ASSERT( nb0 == sizeof(float)); GGML_ASSERT(nb00 == sizeof(float)); @@ -10161,8 +10137,8 @@ static void ggml_compute_forward_sum_f32( assert(ggml_is_scalar(dst)); assert(src0->nb[0] == sizeof(float)); - GGML_TENSOR_LOCALS(int64_t, ne0, src0, ne); - GGML_TENSOR_LOCALS(size_t, nb0, src0, nb); + GGML_TENSOR_LOCALS(int64_t, ne0, src0, ne) + GGML_TENSOR_LOCALS(size_t, nb0, src0, nb) ggml_float sum = 0; ggml_float row_sum = 0; @@ -10193,8 +10169,8 @@ static void ggml_compute_forward_sum_f16( assert(src0->nb[0] == sizeof(ggml_fp16_t)); - GGML_TENSOR_LOCALS(int64_t, ne0, src0, ne); - GGML_TENSOR_LOCALS(size_t, nb0, src0, nb); + GGML_TENSOR_LOCALS(int64_t, ne0, src0, ne) + GGML_TENSOR_LOCALS(size_t, nb0, src0, nb) float sum = 0; float row_sum = 0; @@ -10247,7 +10223,7 @@ static void ggml_compute_forward_sum_rows_f32( GGML_ASSERT(src0->nb[0] == sizeof(float)); GGML_ASSERT(dst->nb[0] == sizeof(float)); - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS GGML_ASSERT(ne0 == 1); GGML_ASSERT(ne1 == ne01); @@ -10297,7 +10273,7 @@ static void ggml_compute_forward_mean_f32( assert(src0->nb[0] == sizeof(float)); - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS assert(ne0 == 1); assert(ne1 == ne01); @@ -10397,7 +10373,7 @@ static void ggml_compute_forward_repeat_f32( return; } - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS // guaranteed to be an integer due to the check in ggml_can_repeat const int nr0 = (int)(ne0/ne00); @@ -10508,7 +10484,7 @@ static void ggml_compute_forward_repeat_back_f32( return; } - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS // guaranteed to be an integer due to the check in ggml_can_repeat const int nr0 = (int)(ne00/ne0); @@ -10586,7 +10562,7 @@ static void ggml_compute_forward_concat_f32( const int ith = params->ith; - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS // TODO: support for transposed / permuted tensors GGML_ASSERT(nb0 == sizeof(float)); @@ -11188,7 +11164,7 @@ static void ggml_compute_forward_norm_f32( const int ith = params->ith; const int nth = params->nth; - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS float eps; memcpy(&eps, dst->op_params, sizeof(float)); @@ -11257,7 +11233,7 @@ static void ggml_compute_forward_rms_norm_f32( const int ith = params->ith; const int nth = params->nth; - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS float eps; memcpy(&eps, dst->op_params, sizeof(float)); @@ -11322,7 +11298,7 @@ static void ggml_compute_forward_rms_norm_back_f32( const int ith = params->ith; const int nth = params->nth; - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS float eps; memcpy(&eps, dst->op_params, sizeof(float)); @@ -11497,7 +11473,7 @@ static void ggml_compute_forward_group_norm_f32( const int ith = params->ith; const int nth = params->nth; - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS const float eps = 1e-6f; // TODO: make this a parameter @@ -11608,7 +11584,7 @@ static void ggml_compute_forward_mul_mat( int64_t t0 = ggml_perf_time_us(); UNUSED(t0); - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS const int ith = params->ith; const int nth = params->nth; @@ -11826,7 +11802,7 @@ static void ggml_compute_forward_out_prod_f32( // int64_t t0 = ggml_perf_time_us(); // UNUSED(t0); - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS const int ith = params->ith; const int nth = params->nth; @@ -12200,8 +12176,8 @@ static void ggml_compute_forward_set_f32( const int nr = ggml_nrows(src1); const int nc = src1->ne[0]; - GGML_TENSOR_LOCALS(int64_t, ne1, src1, ne); - GGML_TENSOR_LOCALS(size_t, nb1, src1, nb); + GGML_TENSOR_LOCALS(int64_t, ne1, src1, ne) + GGML_TENSOR_LOCALS(size_t, nb1, src1, nb) // src0 and dst as viewed during set const size_t nb0 = ggml_element_size(src0); @@ -12588,7 +12564,7 @@ static void ggml_compute_forward_diag_f32( // TODO: handle transposed/permuted matrices - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS GGML_ASSERT(ne00 == ne0); GGML_ASSERT(ne00 == ne1); @@ -13163,7 +13139,7 @@ static void ggml_compute_forward_rope_f32( memcpy(&xpos_base, (int32_t *) dst->op_params + 6, sizeof(float)); memcpy(&xpos_down, (int32_t *) dst->op_params + 7, sizeof(bool)); - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS //printf("ne0: %d, ne1: %d, ne2: %d, ne3: %d\n", ne0, ne1, ne2, ne3); //printf("n_past = %d, ne2 = %d\n", n_past, ne2); @@ -13295,7 +13271,7 @@ static void ggml_compute_forward_rope_f16( memcpy(&freq_base, (int32_t *) dst->op_params + 4, sizeof(float)); memcpy(&freq_scale, (int32_t *) dst->op_params + 5, sizeof(float)); - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS //printf("ne0: %d, ne1: %d, ne2: %d, ne3: %d\n", ne0, ne1, ne2, ne3); //printf("n_past = %d, ne2 = %d\n", n_past, ne2); @@ -13458,7 +13434,7 @@ static void ggml_compute_forward_rope_back_f32( memcpy(&xpos_base, (int32_t *) dst->op_params + 6, sizeof(float)); memcpy(&xpos_down, (int32_t *) dst->op_params + 7, sizeof(bool)); - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS //printf("ne0: %d, ne1: %d, ne2: %d, ne3: %d\n", ne0, ne1, ne2, ne3); //printf("n_past = %d, ne2 = %d\n", n_past, ne2); @@ -13558,7 +13534,7 @@ static void ggml_compute_forward_rope_back_f16( const int n_dims = ((int32_t *) dst->op_params)[1]; const int mode = ((int32_t *) dst->op_params)[2]; - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS //printf("ne0: %d, ne1: %d, ne2: %d, ne3: %d\n", ne0, ne1, ne2, ne3); //printf("n_past = %d, ne2 = %d\n", n_past, ne2); @@ -13672,7 +13648,7 @@ static void ggml_compute_forward_conv_1d_s1_ph_f16_f32( int64_t t0 = ggml_perf_time_us(); UNUSED(t0); - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS const int ith = params->ith; const int nth = params->nth; @@ -13763,7 +13739,7 @@ static void ggml_compute_forward_conv_1d_s1_ph_f32( int64_t t0 = ggml_perf_time_us(); UNUSED(t0); - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS const int ith = params->ith; const int nth = params->nth; @@ -13875,7 +13851,7 @@ static void ggml_compute_forward_conv_1d_s2_ph_f16_f32( int64_t t0 = ggml_perf_time_us(); UNUSED(t0); - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS const int ith = params->ith; const int nth = params->nth; @@ -13966,7 +13942,7 @@ static void ggml_compute_forward_conv_1d_s2_ph_f32( int64_t t0 = ggml_perf_time_us(); UNUSED(t0); - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS const int ith = params->ith; const int nth = params->nth; @@ -14084,7 +14060,7 @@ static void ggml_compute_forward_conv_1d( ggml_compute_forward_conv_1d_s2_ph(params, src0, src1, dst); } else { GGML_ASSERT(false); // only stride 1 and 2 supported - }; + } } // ggml_compute_forward_conv_2d @@ -14101,7 +14077,7 @@ static void ggml_compute_forward_conv_2d_f16_f32( int64_t t0 = ggml_perf_time_us(); UNUSED(t0); - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS const int ith = params->ith; const int nth = params->nth; @@ -14221,7 +14197,7 @@ static void ggml_compute_forward_conv_transpose_2d( int64_t t0 = ggml_perf_time_us(); UNUSED(t0); - GGML_TENSOR_BINARY_OP_LOCALS; + GGML_TENSOR_BINARY_OP_LOCALS const int ith = params->ith; const int nth = params->nth; @@ -14480,7 +14456,7 @@ static void ggml_compute_forward_upscale_f32( const int ith = params->ith; - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS const int scale_factor = dst->op_params[0]; @@ -14532,14 +14508,14 @@ static void ggml_compute_forward_flash_attn_f32( int64_t t0 = ggml_perf_time_us(); UNUSED(t0); - GGML_TENSOR_LOCALS(int64_t, neq, q, ne); - GGML_TENSOR_LOCALS(size_t, nbq, q, nb); - GGML_TENSOR_LOCALS(int64_t, nek, k, ne); - GGML_TENSOR_LOCALS(size_t, nbk, k, nb); - GGML_TENSOR_LOCALS(int64_t, nev, v, ne); - GGML_TENSOR_LOCALS(size_t, nbv, v, nb); - GGML_TENSOR_LOCALS(int64_t, ne, dst, ne); - GGML_TENSOR_LOCALS(size_t, nb, dst, nb); + GGML_TENSOR_LOCALS(int64_t, neq, q, ne) + GGML_TENSOR_LOCALS(size_t, nbq, q, nb) + GGML_TENSOR_LOCALS(int64_t, nek, k, ne) + GGML_TENSOR_LOCALS(size_t, nbk, k, nb) + GGML_TENSOR_LOCALS(int64_t, nev, v, ne) + GGML_TENSOR_LOCALS(size_t, nbv, v, nb) + GGML_TENSOR_LOCALS(int64_t, ne, dst, ne) + GGML_TENSOR_LOCALS(size_t, nb, dst, nb) const int ith = params->ith; const int nth = params->nth; @@ -14722,14 +14698,14 @@ static void ggml_compute_forward_flash_attn_f16( int64_t t0 = ggml_perf_time_us(); UNUSED(t0); - GGML_TENSOR_LOCALS(int64_t, neq, q, ne); - GGML_TENSOR_LOCALS(size_t, nbq, q, nb); - GGML_TENSOR_LOCALS(int64_t, nek, k, ne); - GGML_TENSOR_LOCALS(size_t, nbk, k, nb); - GGML_TENSOR_LOCALS(int64_t, nev, v, ne); - GGML_TENSOR_LOCALS(size_t, nbv, v, nb); - GGML_TENSOR_LOCALS(int64_t, ne, dst, ne); - GGML_TENSOR_LOCALS(size_t, nb, dst, nb); + GGML_TENSOR_LOCALS(int64_t, neq, q, ne) + GGML_TENSOR_LOCALS(size_t, nbq, q, nb) + GGML_TENSOR_LOCALS(int64_t, nek, k, ne) + GGML_TENSOR_LOCALS(size_t, nbk, k, nb) + GGML_TENSOR_LOCALS(int64_t, nev, v, ne) + GGML_TENSOR_LOCALS(size_t, nbv, v, nb) + GGML_TENSOR_LOCALS(int64_t, ne, dst, ne) + GGML_TENSOR_LOCALS(size_t, nb, dst, nb) const int ith = params->ith; const int nth = params->nth; @@ -14974,18 +14950,18 @@ static void ggml_compute_forward_flash_ff_f16( int64_t t0 = ggml_perf_time_us(); UNUSED(t0); - GGML_TENSOR_LOCALS(int64_t, nea, a, ne); - GGML_TENSOR_LOCALS(size_t, nba, a, nb); - GGML_TENSOR_LOCALS(int64_t, neb0, b0, ne); - GGML_TENSOR_LOCALS(size_t, nbb0, b0, nb); - GGML_TENSOR_LOCALS(int64_t, neb1, b1, ne); - GGML_TENSOR_LOCALS(size_t, nbb1, b1, nb); - GGML_TENSOR_LOCALS(int64_t, nec0, c0, ne); - GGML_TENSOR_LOCALS(size_t, nbc0, c0, nb); - GGML_TENSOR_LOCALS(int64_t, nec1, c1, ne); - GGML_TENSOR_LOCALS(size_t, nbc1, c1, nb); - GGML_TENSOR_LOCALS(int64_t, ne, dst, ne); - GGML_TENSOR_LOCALS(size_t, nb, dst, nb); + GGML_TENSOR_LOCALS(int64_t, nea, a, ne) + GGML_TENSOR_LOCALS(size_t, nba, a, nb) + GGML_TENSOR_LOCALS(int64_t, neb0, b0, ne) + GGML_TENSOR_LOCALS(size_t, nbb0, b0, nb) + GGML_TENSOR_LOCALS(int64_t, neb1, b1, ne) + GGML_TENSOR_LOCALS(size_t, nbb1, b1, nb) + GGML_TENSOR_LOCALS(int64_t, nec0, c0, ne) + GGML_TENSOR_LOCALS(size_t, nbc0, c0, nb) + GGML_TENSOR_LOCALS(int64_t, nec1, c1, ne) + GGML_TENSOR_LOCALS(size_t, nbc1, c1, nb) + GGML_TENSOR_LOCALS(int64_t, ne, dst, ne) + GGML_TENSOR_LOCALS(size_t, nb, dst, nb) const int ith = params->ith; const int nth = params->nth; @@ -15133,16 +15109,16 @@ static void ggml_compute_forward_flash_attn_back_f32( int64_t t0 = ggml_perf_time_us(); UNUSED(t0); - GGML_TENSOR_LOCALS(int64_t, neq, q, ne); - GGML_TENSOR_LOCALS(size_t, nbq, q, nb); - GGML_TENSOR_LOCALS(int64_t, nek, k, ne); - GGML_TENSOR_LOCALS(size_t, nbk, k, nb); - GGML_TENSOR_LOCALS(int64_t, nev, v, ne); - GGML_TENSOR_LOCALS(size_t, nbv, v, nb); - GGML_TENSOR_LOCALS(int64_t, ned, d, ne); - GGML_TENSOR_LOCALS(size_t, nbd, d, nb); - GGML_TENSOR_LOCALS(int64_t, ne, dst, ne); - GGML_TENSOR_LOCALS(size_t, nb, dst, nb); + GGML_TENSOR_LOCALS(int64_t, neq, q, ne) + GGML_TENSOR_LOCALS(size_t, nbq, q, nb) + GGML_TENSOR_LOCALS(int64_t, nek, k, ne) + GGML_TENSOR_LOCALS(size_t, nbk, k, nb) + GGML_TENSOR_LOCALS(int64_t, nev, v, ne) + GGML_TENSOR_LOCALS(size_t, nbv, v, nb) + GGML_TENSOR_LOCALS(int64_t, ned, d, ne) + GGML_TENSOR_LOCALS(size_t, nbd, d, nb) + GGML_TENSOR_LOCALS(int64_t, ne, dst, ne) + GGML_TENSOR_LOCALS(size_t, nb, dst, nb) const int ith = params->ith; const int nth = params->nth; @@ -15505,8 +15481,8 @@ static void ggml_compute_forward_win_part_f32( return; } - GGML_TENSOR_LOCALS(int64_t, ne0, src0, ne); - GGML_TENSOR_LOCALS(int64_t, ne, dst, ne); + GGML_TENSOR_LOCALS(int64_t, ne0, src0, ne) + GGML_TENSOR_LOCALS(int64_t, ne, dst, ne) const int32_t nep0 = ((const int32_t *)(dst->op_params))[0]; const int32_t nep1 = ((const int32_t *)(dst->op_params))[1]; @@ -15567,8 +15543,8 @@ static void ggml_compute_forward_win_unpart_f32( return; } - GGML_TENSOR_LOCALS(int64_t, ne0, src0, ne); - GGML_TENSOR_LOCALS(int64_t, ne, dst, ne); + GGML_TENSOR_LOCALS(int64_t, ne0, src0, ne) + GGML_TENSOR_LOCALS(int64_t, ne, dst, ne) const int32_t w = ((const int32_t *)(dst->op_params))[0]; @@ -15685,7 +15661,7 @@ static void ggml_compute_forward_get_rel_pos_f16( // ref: https://github.com/facebookresearch/segment-anything/blob/main/segment_anything/modeling/image_encoder.py#L292-L322 - GGML_TENSOR_UNARY_OP_LOCALS; + GGML_TENSOR_UNARY_OP_LOCALS const int64_t w = ne1; @@ -19637,7 +19613,7 @@ static enum ggml_opt_result linesearch_backtracking( (*step) *= width; } - return GGML_LINESEARCH_FAIL; + GGML_UNREACHABLE(); } static enum ggml_opt_result ggml_opt_lbfgs( @@ -19904,7 +19880,7 @@ static enum ggml_opt_result ggml_opt_lbfgs( step[0] = 1.0; } - return GGML_OPT_DID_NOT_CONVERGE; + GGML_UNREACHABLE(); } struct ggml_opt_params ggml_opt_default_params(enum ggml_opt_type type) { @@ -20638,10 +20614,10 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p } break; case GGUF_TYPE_ARRAY: case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type"); break; - }; + } } break; case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type"); - }; + } if (!ok) { break; @@ -21369,10 +21345,10 @@ static void gguf_write_to_buf(const struct gguf_context * ctx, struct gguf_buf * } break; case GGUF_TYPE_ARRAY: case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type"); break; - }; + } } break; case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type"); - }; + } } // write tensor infos diff --git a/ggml.h b/ggml.h index d61c28b2c..460857fa4 100644 --- a/ggml.h +++ b/ggml.h @@ -248,6 +248,14 @@ } \ } while (0) +#ifndef NDEBUG +#define GGML_UNREACHABLE() GGML_ASSERT(!"statement should not be reached") +#elif defined(__GNUC__) +#define GGML_UNREACHABLE() __builtin_unreachable() +#else +#define GGML_UNREACHABLE() ((void) 0) +#endif + // used to copy the number of elements and stride in bytes of tensors into local variables. // main purpose is to reduce code duplication and improve readability. // diff --git a/llama.cpp b/llama.cpp index 685712d17..666acc212 100644 --- a/llama.cpp +++ b/llama.cpp @@ -449,7 +449,7 @@ struct LLM_TN { // #define GGUF_GET_KEY(ctx, dst, func, type, req, key) \ -{ \ +do { \ const std::string skey(key); \ const int kid = gguf_find_key(ctx, skey.c_str()); \ if (kid >= 0) { \ @@ -461,7 +461,7 @@ struct LLM_TN { } else if (req) { \ throw std::runtime_error(format("key not found in model: %s", skey.c_str())); \ } \ -} +} while (0) // // ggml helpers @@ -1913,7 +1913,7 @@ static void llm_load_hparams( } } break; default: (void)0; - }; + } model.ftype = ml.ftype; } @@ -2438,7 +2438,7 @@ static void llm_load_tensors( } break; default: throw std::runtime_error("unknown architecture"); - }; + } } ml.done_getting_tensors(); @@ -3981,7 +3981,7 @@ static struct ggml_cgraph * llama_build_graph( } break; default: GGML_ASSERT(false); - }; + } return result; } @@ -4626,7 +4626,7 @@ static std::vector llama_tokenize_internal(const llama_vocab & llm_tokenizer_bpe tokenizer(vocab); tokenizer.tokenize(raw_text, output); } break; - }; + } return output; } @@ -7520,7 +7520,7 @@ int llama_token_to_piece(const struct llama_model * model, llama_token token, ch buf[2] = '\x85'; return 3; } else if (llama_is_control_token(model->vocab, token)) { - ; + // do nothing } else if (llama_is_byte_token(model->vocab, token)) { if (length < 1) { return -1; diff --git a/pocs/vdot/q8dot.cpp b/pocs/vdot/q8dot.cpp index 4e0e02357..111770d55 100644 --- a/pocs/vdot/q8dot.cpp +++ b/pocs/vdot/q8dot.cpp @@ -43,7 +43,7 @@ static_assert(QK4_1 == QK8_0, "QK4_1 and QK8_0 must be the same"); static_assert(QK4_0 == QK8_0, "QK4_0 and QK8_0 must be the same"); template -void fillQ4blocks(std::vector& blocks, std::mt19937& rndm) { +static void fillQ4blocks(std::vector& blocks, std::mt19937& rndm) { for (auto& b : blocks) { b.d = 1; for (int i=0; i& blocks, std::mt19937& rndm) { } } -void fillQ80blocks(std::vector& blocks, std::mt19937& rndm) { +static void fillQ80blocks(std::vector& blocks, std::mt19937& rndm) { for (auto& b : blocks) { b.d = 1; int sum = 0; @@ -66,7 +66,7 @@ void fillQ80blocks(std::vector& blocks, std::mt19937& rndm) { } } -float simpleDot(const block_q4_0& x, const block_q8_0& y) { +static float simpleDot(const block_q4_0& x, const block_q8_0& y) { int s1 = 0; //, s2 = 0; for (int i=0; i Date: Fri, 29 Sep 2023 13:25:13 +0800 Subject: [PATCH 10/73] swift : fix build on xcode 15 (#3387) --- Package.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Package.swift b/Package.swift index 442463ba3..5fbcdb9db 100644 --- a/Package.swift +++ b/Package.swift @@ -10,7 +10,7 @@ let platforms: [SupportedPlatform]? = [ .tvOS(.v14) ] let exclude: [String] = [] -let additionalSources: [String] = ["ggml-metal.m"] +let additionalSources: [String] = ["ggml-metal.m", "ggml-metal.metal"] let additionalSettings: [CSetting] = [ .unsafeFlags(["-fno-objc-arc"]), .define("GGML_SWIFT"), @@ -44,8 +44,8 @@ let package = Package( cSettings: [ .unsafeFlags(["-Wno-shorten-64-to-32"]), .define("GGML_USE_K_QUANTS"), - .define("GGML_USE_ACCELERATE") - .define("ACCELERATE_NEW_LAPACK") + .define("GGML_USE_ACCELERATE"), + .define("ACCELERATE_NEW_LAPACK"), .define("ACCELERATE_LAPACK_ILP64") ] + additionalSettings, linkerSettings: [ From 569550df20c1ede59ff195a6b6e900957ad84d16 Mon Sep 17 00:00:00 2001 From: Andrew Duffy Date: Fri, 29 Sep 2023 07:15:57 -0400 Subject: [PATCH 11/73] readme : add link to grammars app (#3388) * Add link to grammars app per @ggernagov suggestion Adding a sentence in the Grammars section of README to point to grammar app, per https://github.com/ggerganov/llama.cpp/discussions/2494#discussioncomment-7138211 * Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9675ce1e7..8cdfb04e0 100644 --- a/README.md +++ b/README.md @@ -662,6 +662,8 @@ PROMPT_TEMPLATE=./prompts/chat-with-bob.txt PROMPT_CACHE_FILE=bob.prompt.bin \ The `grammars/` folder contains a handful of sample grammars. To write your own, check out the [GBNF Guide](./grammars/README.md). +For authoring more complex JSON grammars, you can also check out https://grammar.intrinsiclabs.ai/, a browser app that lets you write TypeScript interfaces which it compiles to GBNF grammars that you can save for local use. Note that the app is built and maintained by members of the community, please file any issues or FRs on [its repo](http://github.com/intrinsiclabsai/gbnfgen) and not this one. + ### Instruction mode with Alpaca 1. First, download the `ggml` Alpaca model into the `./models` folder From 0a4a4a098261ddd26480371eaccfe90d1bf6488a Mon Sep 17 00:00:00 2001 From: BarfingLemurs <128182951+BarfingLemurs@users.noreply.github.com> Date: Fri, 29 Sep 2023 08:50:35 -0400 Subject: [PATCH 12/73] readme : update hot topics + model links (#3399) --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8cdfb04e0..75b6075f2 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Inference of [LLaMA](https://arxiv.org/abs/2302.13971) model in pure C/C++ ### Hot topics -- Parallel decoding + continuous batching support incoming: [#3228](https://github.com/ggerganov/llama.cpp/pull/3228) \ +- Parallel decoding + continuous batching support added: [#3228](https://github.com/ggerganov/llama.cpp/pull/3228) \ **Devs should become familiar with the new API** - Local Falcon 180B inference on Mac Studio @@ -92,7 +92,8 @@ as the main playground for developing new features for the [ggml](https://github - [X] [WizardLM](https://github.com/nlpxucan/WizardLM) - [X] [Baichuan-7B](https://huggingface.co/baichuan-inc/baichuan-7B) and its derivations (such as [baichuan-7b-sft](https://huggingface.co/hiyouga/baichuan-7b-sft)) - [X] [Aquila-7B](https://huggingface.co/BAAI/Aquila-7B) / [AquilaChat-7B](https://huggingface.co/BAAI/AquilaChat-7B) -- [X] Mistral AI v0.1 +- [X] [Starcoder models](https://github.com/ggerganov/llama.cpp/pull/3187) +- [X] [Mistral AI v0.1](https://huggingface.co/mistralai/Mistral-7B-v0.1) **Bindings:** From 2777a84be429401a2b7d33c2b6a4ada1f0776f1b Mon Sep 17 00:00:00 2001 From: Cebtenzzre Date: Fri, 29 Sep 2023 09:48:45 -0400 Subject: [PATCH 13/73] llama : quantize up to 31% faster on Linux and Windows with mmap (#3206) * llama : enable mmap in quantize on Linux -> 31% faster * also enable mmap on Windows --------- Co-authored-by: Georgi Gerganov --- llama.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/llama.cpp b/llama.cpp index 666acc212..bff17135b 100644 --- a/llama.cpp +++ b/llama.cpp @@ -6027,7 +6027,18 @@ static void llama_model_quantize_internal(const std::string & fname_inp, const s nthread = std::thread::hardware_concurrency(); } - llama_model_loader ml(fname_inp, /*use_mmap*/ false); + // mmap consistently increases speed Linux, and also increases speed on Windows with + // hot cache. It may cause a slowdown on macOS, possibly related to free memory. +#if defined(__linux__) || defined(_WIN32) + constexpr bool use_mmap = true; +#else + constexpr bool use_mmap = false; +#endif + + llama_model_loader ml(fname_inp, use_mmap); + if (ml.use_mmap) { + ml.mapping.reset(new llama_mmap(&ml.file, /* prefetch */ 0, ggml_is_numa())); + } llama_model model; llm_load_arch(ml, model); @@ -6105,10 +6116,12 @@ static void llama_model_quantize_internal(const std::string & fname_inp, const s const std::string name = ggml_get_name(tensor); - if (read_data.size() < ggml_nbytes(tensor)) { - read_data.resize(ggml_nbytes(tensor)); + if (!ml.use_mmap) { + if (read_data.size() < ggml_nbytes(tensor)) { + read_data.resize(ggml_nbytes(tensor)); + } + tensor->data = read_data.data(); } - tensor->data = read_data.data(); ml.load_data_for(tensor); LLAMA_LOG_INFO("[%4d/%4d] %36s - [%s], type = %6s, ", From bc34dd4f5b5a7c10ae3ed85a265ce6f2ed2fab79 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Fri, 29 Sep 2023 19:05:18 +0300 Subject: [PATCH 14/73] train : fix KQ_pos allocation (#3392) * train : fix KQ_pos allocation * make sure KQ_pos is not reallocated in finetune --------- Co-authored-by: xaedes --- examples/finetune/finetune.cpp | 5 ++++- examples/train-text-from-scratch/train-text-from-scratch.cpp | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/finetune/finetune.cpp b/examples/finetune/finetune.cpp index b61165fb7..8ca1874da 100644 --- a/examples/finetune/finetune.cpp +++ b/examples/finetune/finetune.cpp @@ -626,7 +626,8 @@ static struct ggml_tensor * llama_build_lora_finetune_graphs( // KQ_pos - contains the positions struct ggml_tensor * KQ_pos = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, N); - { + ggml_allocr_alloc(alloc, KQ_pos); + if (!ggml_allocr_is_measure(alloc)) { int * data = (int *) KQ_pos->data; for (int i = 0; i < N; ++i) { data[i] = n_past + i; @@ -786,6 +787,8 @@ static struct ggml_tensor * llama_build_lora_finetune_graphs( ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, t36->grad, one)); GGML_ASSERT(t36->grad->data == NULL && t36->grad->view_src == NULL); ggml_allocr_alloc(alloc, t36->grad); + // KQ_pos + ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, KQ_pos, one)); // make sure base model tensors data cannot be used in viewable operations ggml_build_forward_expand(gb, ggml_scale_inplace(ctx, model->tok_embeddings, one)); diff --git a/examples/train-text-from-scratch/train-text-from-scratch.cpp b/examples/train-text-from-scratch/train-text-from-scratch.cpp index 5043f32d0..be693b3ac 100644 --- a/examples/train-text-from-scratch/train-text-from-scratch.cpp +++ b/examples/train-text-from-scratch/train-text-from-scratch.cpp @@ -334,7 +334,8 @@ static struct ggml_tensor * llama_build_train_graphs( // KQ_pos - contains the positions struct ggml_tensor * KQ_pos = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, N); - { + ggml_allocr_alloc(alloc, KQ_pos); + if (!ggml_allocr_is_measure(alloc)) { int * data = (int *) KQ_pos->data; for (int i = 0; i < N; ++i) { data[i] = n_past + i; From 40e07a60f9ce06e79f3ccd4c903eba300fb31b5e Mon Sep 17 00:00:00 2001 From: slaren Date: Fri, 29 Sep 2023 18:42:32 +0200 Subject: [PATCH 15/73] llama.cpp : add documentation about rope_freq_base and scale values (#3401) * llama.cpp : add documentation about rope_freq_base and scale values * add notice to hot topics --- README.md | 1 + llama.h | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 75b6075f2..ec7b58943 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ Inference of [LLaMA](https://arxiv.org/abs/2302.13971) model in pure C/C++ ### Hot topics +- ‼️ Breaking change: `rope_freq_base` and `rope_freq_scale` must be set to zero to use the model default values: [#3401](https://github.com/ggerganov/llama.cpp/pull/3401) - Parallel decoding + continuous batching support added: [#3228](https://github.com/ggerganov/llama.cpp/pull/3228) \ **Devs should become familiar with the new API** - Local Falcon 180B inference on Mac Studio diff --git a/llama.h b/llama.h index 96ff1f09c..fde4d6eca 100644 --- a/llama.h +++ b/llama.h @@ -167,18 +167,18 @@ extern "C" { struct llama_context_params { uint32_t seed; // RNG seed, -1 for random - uint32_t n_ctx; // text context - uint32_t n_batch; // prompt processing batch size + uint32_t n_ctx; // text context, 0 = from model + uint32_t n_batch; // prompt processing maximum batch size uint32_t n_threads; // number of threads to use for generation uint32_t n_threads_batch; // number of threads to use for batch processing // ref: https://github.com/ggerganov/llama.cpp/pull/2054 - float rope_freq_base; // RoPE base frequency - float rope_freq_scale; // RoPE frequency scaling factor + float rope_freq_base; // RoPE base frequency, 0 = from model + float rope_freq_scale; // RoPE frequency scaling factor, 0 = from model // Keep the booleans together to avoid misalignment during copy-by-value. bool mul_mat_q; // if true, use experimental mul_mat_q kernels - bool f16_kv; // use fp16 for KV cache + bool f16_kv; // use fp16 for KV cache, fp32 otherwise bool logits_all; // the llama_eval() call computes all logits, not just the last one bool embedding; // embedding mode only }; From f5ef5cfb18148131fcf45bdd2331f0db5ab7c3d0 Mon Sep 17 00:00:00 2001 From: slaren Date: Sat, 30 Sep 2023 18:12:57 +0200 Subject: [PATCH 16/73] ggml-cuda : perform cublas mat mul of quantized types as f16 (#3412) * ggml-cuda : perform cublas matrix multiplication of quantized types as fp16 * rename CC_TURING to CC_VOLTA * disable fp16 mat mul completely with multi GPU --- ggml-cuda.cu | 194 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 122 insertions(+), 72 deletions(-) diff --git a/ggml-cuda.cu b/ggml-cuda.cu index 86d1fe203..989c419cd 100644 --- a/ggml-cuda.cu +++ b/ggml-cuda.cu @@ -80,9 +80,9 @@ #include "ggml.h" #define MIN_CC_DP4A 610 // minimum compute capability for __dp4a, an intrinsic for byte-wise dot products -#define CC_TURING 700 +#define CC_VOLTA 700 #define CC_OFFSET_AMD 1000000 -#define CC_RDNA2 CC_OFFSET_AMD + 1030 +#define CC_RDNA2 (CC_OFFSET_AMD + 1030) #if defined(GGML_USE_HIPBLAS) #define __CUDA_ARCH__ 1300 @@ -715,7 +715,8 @@ static __device__ __forceinline__ void dequantize_q8_0(const void * vx, const in //================================== k-quants -static __global__ void dequantize_block_q2_K(const void * __restrict__ vx, float * __restrict__ yy) { +template +static __global__ void dequantize_block_q2_K(const void * __restrict__ vx, dst_t * __restrict__ yy) { const int i = blockIdx.x; const block_q2_K * x = (const block_q2_K *) vx; @@ -727,7 +728,7 @@ static __global__ void dequantize_block_q2_K(const void * __restrict__ vx, float const int is = 8*n + l/16; const uint8_t q = x[i].qs[32*n + l]; - float * y = yy + i*QK_K + 128*n; + dst_t * y = yy + i*QK_K + 128*n; float dall = __low2half(x[i].dm); float dmin = __high2half(x[i].dm); @@ -739,7 +740,7 @@ static __global__ void dequantize_block_q2_K(const void * __restrict__ vx, float const int is = tid/16; // 0 or 1 const int il = tid%16; // 0...15 const uint8_t q = x[i].qs[il] >> (2*is); - float * y = yy + i*QK_K + 16*is + il; + dst_t * y = yy + i*QK_K + 16*is + il; float dall = __low2half(x[i].dm); float dmin = __high2half(x[i].dm); y[ 0] = dall * (x[i].scales[is+0] & 0xF) * ((q >> 0) & 3) - dmin * (x[i].scales[is+0] >> 4); @@ -748,7 +749,8 @@ static __global__ void dequantize_block_q2_K(const void * __restrict__ vx, float } -static __global__ void dequantize_block_q3_K(const void * __restrict__ vx, float * __restrict__ yy) { +template +static __global__ void dequantize_block_q3_K(const void * __restrict__ vx, dst_t * __restrict__ yy) { const int i = blockIdx.x; const block_q3_K * x = (const block_q3_K *) vx; @@ -772,7 +774,7 @@ static __global__ void dequantize_block_q3_K(const void * __restrict__ vx, float float d_all = x[i].d; float dl = d_all * (us - 32); - float * y = yy + i*QK_K + 128*n + 32*j; + dst_t * y = yy + i*QK_K + 128*n + 32*j; const uint8_t * q = x[i].qs + 32*n; const uint8_t * hm = x[i].hmask; @@ -784,7 +786,7 @@ static __global__ void dequantize_block_q3_K(const void * __restrict__ vx, float const int im = il/8; // 0...1 const int in = il%8; // 0...7 - float * y = yy + i*QK_K + 16*is + il; + dst_t * y = yy + i*QK_K + 16*is + il; const uint8_t q = x[i].qs[il] >> (2*is); const uint8_t h = x[i].hmask[in] >> (2*is + im); @@ -812,7 +814,8 @@ static inline __device__ void get_scale_min_k4(int j, const uint8_t * q, uint8_t } #endif -static __global__ void dequantize_block_q4_K(const void * __restrict__ vx, float * __restrict__ yy) { +template +static __global__ void dequantize_block_q4_K(const void * __restrict__ vx, dst_t * __restrict__ yy) { const block_q4_K * x = (const block_q4_K *) vx; const int i = blockIdx.x; @@ -825,7 +828,7 @@ static __global__ void dequantize_block_q4_K(const void * __restrict__ vx, float const int is = 2*il; const int n = 4; - float * y = yy + i*QK_K + 64*il + n*ir; + dst_t * y = yy + i*QK_K + 64*il + n*ir; const float dall = __low2half(x[i].dm); const float dmin = __high2half(x[i].dm); @@ -844,7 +847,7 @@ static __global__ void dequantize_block_q4_K(const void * __restrict__ vx, float #else const int tid = threadIdx.x; const uint8_t * q = x[i].qs; - float * y = yy + i*QK_K; + dst_t * y = yy + i*QK_K; const float d = (float)x[i].dm[0]; const float m = (float)x[i].dm[1]; y[tid+ 0] = d * (x[i].scales[0] & 0xF) * (q[tid] & 0xF) - m * (x[i].scales[0] >> 4); @@ -852,7 +855,8 @@ static __global__ void dequantize_block_q4_K(const void * __restrict__ vx, float #endif } -static __global__ void dequantize_block_q5_K(const void * __restrict__ vx, float * __restrict__ yy) { +template +static __global__ void dequantize_block_q5_K(const void * __restrict__ vx, dst_t * __restrict__ yy) { const block_q5_K * x = (const block_q5_K *) vx; const int i = blockIdx.x; @@ -864,7 +868,7 @@ static __global__ void dequantize_block_q5_K(const void * __restrict__ vx, float const int ir = tid%16; // ir is in 0...15 const int is = 2*il; // is is in 0...6 - float * y = yy + i*QK_K + 64*il + 2*ir; + dst_t * y = yy + i*QK_K + 64*il + 2*ir; const float dall = __low2half(x[i].dm); const float dmin = __high2half(x[i].dm); @@ -892,13 +896,14 @@ static __global__ void dequantize_block_q5_K(const void * __restrict__ vx, float const int is = tid/16; // 0 or 1 const uint8_t h = x[i].qh[in] >> im; const float d = x[i].d; - float * y = yy + i*QK_K + tid; + dst_t * y = yy + i*QK_K + tid; y[ 0] = d * x[i].scales[is+0] * ((q & 0xF) - ((h >> 0) & 1 ? 0 : 16)); y[32] = d * x[i].scales[is+2] * ((q >> 4) - ((h >> 4) & 1 ? 0 : 16)); #endif } -static __global__ void dequantize_block_q6_K(const void * __restrict__ vx, float * __restrict__ yy) { +template +static __global__ void dequantize_block_q6_K(const void * __restrict__ vx, dst_t * __restrict__ yy) { const block_q6_K * x = (const block_q6_K *) vx; const int i = blockIdx.x; @@ -910,7 +915,7 @@ static __global__ void dequantize_block_q6_K(const void * __restrict__ vx, float const int il = tid - 32*ip; // 0...32 const int is = 8*ip + il/16; - float * y = yy + i*QK_K + 128*ip + il; + dst_t * y = yy + i*QK_K + 128*ip + il; const float d = x[i].d; @@ -929,7 +934,7 @@ static __global__ void dequantize_block_q6_K(const void * __restrict__ vx, float const int ip = tid/16; // 0 or 1 const int il = tid - 16*ip; // 0...15 - float * y = yy + i*QK_K + 16*ip + il; + dst_t * y = yy + i*QK_K + 16*ip + il; const float d = x[i].d; @@ -3548,7 +3553,7 @@ template static __global__ void load_tiles_q4_0, VDR_Q4_0_Q8_1_MMQ, vec_dot_q4_0_q8_1_mul_mat> (vx, vy, dst, ncols_x, nrows_x, ncols_y, nrows_y, nrows_dst); -#elif __CUDA_ARCH__ >= CC_TURING +#elif __CUDA_ARCH__ >= CC_VOLTA const int mmq_x = MMQ_X_Q4_0_AMPERE; const int mmq_y = MMQ_Y_Q4_0_AMPERE; const int nwarps = NWARPS_Q4_0_AMPERE; @@ -3568,7 +3573,7 @@ template static __global__ void #else (void) vec_dot_q4_0_q8_1_mul_mat; assert(false); -#endif // __CUDA_ARCH__ >= CC_TURING +#endif // __CUDA_ARCH__ >= CC_VOLTA } #define MMQ_X_Q4_1_RDNA2 64 @@ -3589,9 +3594,9 @@ template static __global__ void #if defined(RDNA3) || defined(RDNA2) __launch_bounds__(WARP_SIZE*NWARPS_Q4_1_RDNA2, 2) #endif // defined(RDNA3) || defined(RDNA2) -#elif __CUDA_ARCH__ < CC_TURING +#elif __CUDA_ARCH__ < CC_VOLTA __launch_bounds__(WARP_SIZE*NWARPS_Q4_1_PASCAL, 2) -#endif // __CUDA_ARCH__ < CC_TURING +#endif // __CUDA_ARCH__ < CC_VOLTA mul_mat_q4_1( const void * __restrict__ vx, const void * __restrict__ vy, float * __restrict__ dst, const int ncols_x, const int nrows_x, const int ncols_y, const int nrows_y, const int nrows_dst) { @@ -3611,7 +3616,7 @@ template static __global__ void load_tiles_q4_1, VDR_Q4_1_Q8_1_MMQ, vec_dot_q4_1_q8_1_mul_mat> (vx, vy, dst, ncols_x, nrows_x, ncols_y, nrows_y, nrows_dst); -#elif __CUDA_ARCH__ >= CC_TURING +#elif __CUDA_ARCH__ >= CC_VOLTA const int mmq_x = MMQ_X_Q4_1_AMPERE; const int mmq_y = MMQ_Y_Q4_1_AMPERE; const int nwarps = NWARPS_Q4_1_AMPERE; @@ -3631,7 +3636,7 @@ template static __global__ void #else (void) vec_dot_q4_1_q8_1_mul_mat; assert(false); -#endif // __CUDA_ARCH__ >= CC_TURING +#endif // __CUDA_ARCH__ >= CC_VOLTA } #define MMQ_X_Q5_0_RDNA2 64 @@ -3672,7 +3677,7 @@ template static __global__ void load_tiles_q5_0, VDR_Q5_0_Q8_1_MMQ, vec_dot_q5_0_q8_1_mul_mat> (vx, vy, dst, ncols_x, nrows_x, ncols_y, nrows_y, nrows_dst); -#elif __CUDA_ARCH__ >= CC_TURING +#elif __CUDA_ARCH__ >= CC_VOLTA const int mmq_x = MMQ_X_Q5_0_AMPERE; const int mmq_y = MMQ_Y_Q5_0_AMPERE; const int nwarps = NWARPS_Q5_0_AMPERE; @@ -3692,7 +3697,7 @@ template static __global__ void #else (void) vec_dot_q5_0_q8_1_mul_mat; assert(false); -#endif // __CUDA_ARCH__ >= CC_TURING +#endif // __CUDA_ARCH__ >= CC_VOLTA } #define MMQ_X_Q5_1_RDNA2 64 @@ -3733,7 +3738,7 @@ mul_mat_q5_1( load_tiles_q5_1, VDR_Q5_1_Q8_1_MMQ, vec_dot_q5_1_q8_1_mul_mat> (vx, vy, dst, ncols_x, nrows_x, ncols_y, nrows_y, nrows_dst); -#elif __CUDA_ARCH__ >= CC_TURING +#elif __CUDA_ARCH__ >= CC_VOLTA const int mmq_x = MMQ_X_Q5_1_AMPERE; const int mmq_y = MMQ_Y_Q5_1_AMPERE; const int nwarps = NWARPS_Q5_1_AMPERE; @@ -3753,7 +3758,7 @@ mul_mat_q5_1( #else (void) vec_dot_q5_1_q8_1_mul_mat; assert(false); -#endif // __CUDA_ARCH__ >= CC_TURING +#endif // __CUDA_ARCH__ >= CC_VOLTA } #define MMQ_X_Q8_0_RDNA2 64 @@ -3794,7 +3799,7 @@ template static __global__ void load_tiles_q8_0, VDR_Q8_0_Q8_1_MMQ, vec_dot_q8_0_q8_1_mul_mat> (vx, vy, dst, ncols_x, nrows_x, ncols_y, nrows_y, nrows_dst); -#elif __CUDA_ARCH__ >= CC_TURING +#elif __CUDA_ARCH__ >= CC_VOLTA const int mmq_x = MMQ_X_Q8_0_AMPERE; const int mmq_y = MMQ_Y_Q8_0_AMPERE; const int nwarps = NWARPS_Q8_0_AMPERE; @@ -3814,7 +3819,7 @@ template static __global__ void #else (void) vec_dot_q8_0_q8_1_mul_mat; assert(false); -#endif // __CUDA_ARCH__ >= CC_TURING +#endif // __CUDA_ARCH__ >= CC_VOLTA } #define MMQ_X_Q2_K_RDNA2 64 @@ -3855,7 +3860,7 @@ mul_mat_q2_K( load_tiles_q2_K, VDR_Q2_K_Q8_1_MMQ, vec_dot_q2_K_q8_1_mul_mat> (vx, vy, dst, ncols_x, nrows_x, ncols_y, nrows_y, nrows_dst); -#elif __CUDA_ARCH__ >= CC_TURING +#elif __CUDA_ARCH__ >= CC_VOLTA const int mmq_x = MMQ_X_Q2_K_AMPERE; const int mmq_y = MMQ_Y_Q2_K_AMPERE; const int nwarps = NWARPS_Q2_K_AMPERE; @@ -3875,7 +3880,7 @@ mul_mat_q2_K( #else (void) vec_dot_q2_K_q8_1_mul_mat; assert(false); -#endif // __CUDA_ARCH__ >= CC_TURING +#endif // __CUDA_ARCH__ >= CC_VOLTA } #define MMQ_X_Q3_K_RDNA2 128 @@ -3896,9 +3901,9 @@ template static __global__ void #if defined(RDNA3) || defined(RDNA2) __launch_bounds__(WARP_SIZE*NWARPS_Q3_K_RDNA2, 2) #endif // defined(RDNA3) || defined(RDNA2) -#elif __CUDA_ARCH__ < CC_TURING +#elif __CUDA_ARCH__ < CC_VOLTA __launch_bounds__(WARP_SIZE*NWARPS_Q3_K_PASCAL, 2) -#endif // __CUDA_ARCH__ < CC_TURING +#endif // __CUDA_ARCH__ < CC_VOLTA mul_mat_q3_K( const void * __restrict__ vx, const void * __restrict__ vy, float * __restrict__ dst, const int ncols_x, const int nrows_x, const int ncols_y, const int nrows_y, const int nrows_dst) { @@ -3918,7 +3923,7 @@ template static __global__ void load_tiles_q3_K, VDR_Q3_K_Q8_1_MMQ, vec_dot_q3_K_q8_1_mul_mat> (vx, vy, dst, ncols_x, nrows_x, ncols_y, nrows_y, nrows_dst); -#elif __CUDA_ARCH__ >= CC_TURING +#elif __CUDA_ARCH__ >= CC_VOLTA const int mmq_x = MMQ_X_Q3_K_AMPERE; const int mmq_y = MMQ_Y_Q3_K_AMPERE; const int nwarps = NWARPS_Q3_K_AMPERE; @@ -3938,7 +3943,7 @@ template static __global__ void #else (void) vec_dot_q3_K_q8_1_mul_mat; assert(false); -#endif // __CUDA_ARCH__ >= CC_TURING +#endif // __CUDA_ARCH__ >= CC_VOLTA } #define MMQ_X_Q4_K_RDNA2 64 @@ -3959,9 +3964,9 @@ template static __global__ void #if defined(RDNA3) || defined(RDNA2) __launch_bounds__(WARP_SIZE*NWARPS_Q4_K_RDNA2, 2) #endif // defined(RDNA3) || defined(RDNA2) -#elif __CUDA_ARCH__ < CC_TURING +#elif __CUDA_ARCH__ < CC_VOLTA __launch_bounds__(WARP_SIZE*NWARPS_Q4_K_PASCAL, 2) -#endif // __CUDA_ARCH__ < CC_TURING +#endif // __CUDA_ARCH__ < CC_VOLTA mul_mat_q4_K( const void * __restrict__ vx, const void * __restrict__ vy, float * __restrict__ dst, const int ncols_x, const int nrows_x, const int ncols_y, const int nrows_y, const int nrows_dst) { @@ -3981,7 +3986,7 @@ template static __global__ void load_tiles_q4_K, VDR_Q4_K_Q8_1_MMQ, vec_dot_q4_K_q8_1_mul_mat> (vx, vy, dst, ncols_x, nrows_x, ncols_y, nrows_y, nrows_dst); -#elif __CUDA_ARCH__ >= CC_TURING +#elif __CUDA_ARCH__ >= CC_VOLTA const int mmq_x = MMQ_X_Q4_K_AMPERE; const int mmq_y = MMQ_Y_Q4_K_AMPERE; const int nwarps = NWARPS_Q4_K_AMPERE; @@ -4001,7 +4006,7 @@ template static __global__ void #else (void) vec_dot_q4_K_q8_1_mul_mat; assert(false); -#endif // __CUDA_ARCH__ >= CC_TURING +#endif // __CUDA_ARCH__ >= CC_VOLTA } #define MMQ_X_Q5_K_RDNA2 64 @@ -4042,7 +4047,7 @@ mul_mat_q5_K( load_tiles_q5_K, VDR_Q5_K_Q8_1_MMQ, vec_dot_q5_K_q8_1_mul_mat> (vx, vy, dst, ncols_x, nrows_x, ncols_y, nrows_y, nrows_dst); -#elif __CUDA_ARCH__ >= CC_TURING +#elif __CUDA_ARCH__ >= CC_VOLTA const int mmq_x = MMQ_X_Q5_K_AMPERE; const int mmq_y = MMQ_Y_Q5_K_AMPERE; const int nwarps = NWARPS_Q5_K_AMPERE; @@ -4062,7 +4067,7 @@ mul_mat_q5_K( #else (void) vec_dot_q5_K_q8_1_mul_mat; assert(false); -#endif // __CUDA_ARCH__ >= CC_TURING +#endif // __CUDA_ARCH__ >= CC_VOLTA } #define MMQ_X_Q6_K_RDNA2 64 @@ -4083,9 +4088,9 @@ template static __global__ void #if defined(RDNA3) || defined(RDNA2) __launch_bounds__(WARP_SIZE*NWARPS_Q6_K_RDNA2, 2) #endif // defined(RDNA3) || defined(RDNA2) -#elif __CUDA_ARCH__ < CC_TURING +#elif __CUDA_ARCH__ < CC_VOLTA __launch_bounds__(WARP_SIZE*NWARPS_Q6_K_PASCAL, 2) -#endif // __CUDA_ARCH__ < CC_TURING +#endif // __CUDA_ARCH__ < CC_VOLTA mul_mat_q6_K( const void * __restrict__ vx, const void * __restrict__ vy, float * __restrict__ dst, const int ncols_x, const int nrows_x, const int ncols_y, const int nrows_y, const int nrows_dst) { @@ -4105,7 +4110,7 @@ template static __global__ void load_tiles_q6_K, VDR_Q6_K_Q8_1_MMQ, vec_dot_q6_K_q8_1_mul_mat> (vx, vy, dst, ncols_x, nrows_x, ncols_y, nrows_y, nrows_dst); -#elif __CUDA_ARCH__ >= CC_TURING +#elif __CUDA_ARCH__ >= CC_VOLTA const int mmq_x = MMQ_X_Q6_K_AMPERE; const int mmq_y = MMQ_Y_Q6_K_AMPERE; const int nwarps = NWARPS_Q6_K_AMPERE; @@ -4125,7 +4130,7 @@ template static __global__ void #else (void) vec_dot_q6_K_q8_1_mul_mat; assert(false); -#endif // __CUDA_ARCH__ >= CC_TURING +#endif // __CUDA_ARCH__ >= CC_VOLTA } template @@ -4604,32 +4609,38 @@ static void quantize_row_q8_1_cuda(const float * x, void * vy, const int kx, con quantize_q8_1<<>>(x, vy, kx, kx_padded); } -static void dequantize_row_q4_0_cuda(const void * vx, float * y, const int k, cudaStream_t stream) { +template +static void dequantize_row_q4_0_cuda(const void * vx, dst_t * y, const int k, cudaStream_t stream) { const int num_blocks = (k + CUDA_DEQUANTIZE_BLOCK_SIZE - 1) / CUDA_DEQUANTIZE_BLOCK_SIZE; dequantize_block<<>>(vx, y, k); } -static void dequantize_row_q4_1_cuda(const void * vx, float * y, const int k, cudaStream_t stream) { +template +static void dequantize_row_q4_1_cuda(const void * vx, dst_t * y, const int k, cudaStream_t stream) { const int num_blocks = (k + CUDA_DEQUANTIZE_BLOCK_SIZE - 1) / CUDA_DEQUANTIZE_BLOCK_SIZE; dequantize_block<<>>(vx, y, k); } -static void dequantize_row_q5_0_cuda(const void * vx, float * y, const int k, cudaStream_t stream) { +template +static void dequantize_row_q5_0_cuda(const void * vx, dst_t * y, const int k, cudaStream_t stream) { const int num_blocks = (k + CUDA_DEQUANTIZE_BLOCK_SIZE - 1) / CUDA_DEQUANTIZE_BLOCK_SIZE; dequantize_block<<>>(vx, y, k); } -static void dequantize_row_q5_1_cuda(const void * vx, float * y, const int k, cudaStream_t stream) { +template +static void dequantize_row_q5_1_cuda(const void * vx, dst_t * y, const int k, cudaStream_t stream) { const int num_blocks = (k + CUDA_DEQUANTIZE_BLOCK_SIZE - 1) / CUDA_DEQUANTIZE_BLOCK_SIZE; dequantize_block<<>>(vx, y, k); } -static void dequantize_row_q8_0_cuda(const void * vx, float * y, const int k, cudaStream_t stream) { +template +static void dequantize_row_q8_0_cuda(const void * vx, dst_t * y, const int k, cudaStream_t stream) { const int num_blocks = (k + CUDA_DEQUANTIZE_BLOCK_SIZE - 1) / CUDA_DEQUANTIZE_BLOCK_SIZE; dequantize_block<<>>(vx, y, k); } -static void dequantize_row_q2_K_cuda(const void * vx, float * y, const int k, cudaStream_t stream) { +template +static void dequantize_row_q2_K_cuda(const void * vx, dst_t * y, const int k, cudaStream_t stream) { const int nb = k / QK_K; #if QK_K == 256 dequantize_block_q2_K<<>>(vx, y); @@ -4638,7 +4649,8 @@ static void dequantize_row_q2_K_cuda(const void * vx, float * y, const int k, cu #endif } -static void dequantize_row_q3_K_cuda(const void * vx, float * y, const int k, cudaStream_t stream) { +template +static void dequantize_row_q3_K_cuda(const void * vx, dst_t * y, const int k, cudaStream_t stream) { const int nb = k / QK_K; #if QK_K == 256 dequantize_block_q3_K<<>>(vx, y); @@ -4647,12 +4659,14 @@ static void dequantize_row_q3_K_cuda(const void * vx, float * y, const int k, cu #endif } -static void dequantize_row_q4_K_cuda(const void * vx, float * y, const int k, cudaStream_t stream) { +template +static void dequantize_row_q4_K_cuda(const void * vx, dst_t * y, const int k, cudaStream_t stream) { const int nb = k / QK_K; dequantize_block_q4_K<<>>(vx, y); } -static void dequantize_row_q5_K_cuda(const void * vx, float * y, const int k, cudaStream_t stream) { +template +static void dequantize_row_q5_K_cuda(const void * vx, dst_t * y, const int k, cudaStream_t stream) { const int nb = k / QK_K; #if QK_K == 256 dequantize_block_q5_K<<>>(vx, y); @@ -4661,7 +4675,8 @@ static void dequantize_row_q5_K_cuda(const void * vx, float * y, const int k, cu #endif } -static void dequantize_row_q6_K_cuda(const void * vx, float * y, const int k, cudaStream_t stream) { +template +static void dequantize_row_q6_K_cuda(const void * vx, dst_t * y, const int k, cudaStream_t stream) { const int nb = k / QK_K; #if QK_K == 256 dequantize_block_q6_K<<>>(vx, y); @@ -4868,6 +4883,26 @@ static void convert_mul_mat_vec_f16_cuda(const void * vx, const dfloat * y, floa static to_fp16_cuda_t ggml_get_to_fp16_cuda(ggml_type type) { switch (type) { + case GGML_TYPE_Q4_0: + return dequantize_row_q4_0_cuda; + case GGML_TYPE_Q4_1: + return dequantize_row_q4_1_cuda; + case GGML_TYPE_Q5_0: + return dequantize_row_q5_0_cuda; + case GGML_TYPE_Q5_1: + return dequantize_row_q5_1_cuda; + case GGML_TYPE_Q8_0: + return dequantize_row_q8_0_cuda; + case GGML_TYPE_Q2_K: + return dequantize_row_q2_K_cuda; + case GGML_TYPE_Q3_K: + return dequantize_row_q3_K_cuda; + case GGML_TYPE_Q4_K: + return dequantize_row_q4_K_cuda; + case GGML_TYPE_Q5_K: + return dequantize_row_q5_K_cuda; + case GGML_TYPE_Q6_K: + return dequantize_row_q6_K_cuda; case GGML_TYPE_F32: return convert_fp32_to_fp16_cuda; default: @@ -4921,7 +4956,7 @@ static void ggml_mul_mat_q4_0_q8_1_cuda( mmq_x = MMQ_X_Q4_0_RDNA1; mmq_y = MMQ_Y_Q4_0_RDNA1; nwarps = NWARPS_Q4_0_RDNA1; - } else if (compute_capability >= CC_TURING) { + } else if (compute_capability >= CC_VOLTA) { mmq_x = MMQ_X_Q4_0_AMPERE; mmq_y = MMQ_Y_Q4_0_AMPERE; nwarps = NWARPS_Q4_0_AMPERE; @@ -4966,7 +5001,7 @@ static void ggml_mul_mat_q4_1_q8_1_cuda( mmq_x = MMQ_X_Q4_1_RDNA1; mmq_y = MMQ_Y_Q4_1_RDNA1; nwarps = NWARPS_Q4_1_RDNA1; - } else if (compute_capability >= CC_TURING) { + } else if (compute_capability >= CC_VOLTA) { mmq_x = MMQ_X_Q4_1_AMPERE; mmq_y = MMQ_Y_Q4_1_AMPERE; nwarps = NWARPS_Q4_1_AMPERE; @@ -5011,7 +5046,7 @@ static void ggml_mul_mat_q5_0_q8_1_cuda( mmq_x = MMQ_X_Q5_0_RDNA1; mmq_y = MMQ_Y_Q5_0_RDNA1; nwarps = NWARPS_Q5_0_RDNA1; - } else if (compute_capability >= CC_TURING) { + } else if (compute_capability >= CC_VOLTA) { mmq_x = MMQ_X_Q5_0_AMPERE; mmq_y = MMQ_Y_Q5_0_AMPERE; nwarps = NWARPS_Q5_0_AMPERE; @@ -5056,7 +5091,7 @@ static void ggml_mul_mat_q5_1_q8_1_cuda( mmq_x = MMQ_X_Q5_1_RDNA1; mmq_y = MMQ_Y_Q5_1_RDNA1; nwarps = NWARPS_Q5_1_RDNA1; - } else if (compute_capability >= CC_TURING) { + } else if (compute_capability >= CC_VOLTA) { mmq_x = MMQ_X_Q5_1_AMPERE; mmq_y = MMQ_Y_Q5_1_AMPERE; nwarps = NWARPS_Q5_1_AMPERE; @@ -5101,7 +5136,7 @@ static void ggml_mul_mat_q8_0_q8_1_cuda( mmq_x = MMQ_X_Q8_0_RDNA1; mmq_y = MMQ_Y_Q8_0_RDNA1; nwarps = NWARPS_Q8_0_RDNA1; - } else if (compute_capability >= CC_TURING) { + } else if (compute_capability >= CC_VOLTA) { mmq_x = MMQ_X_Q8_0_AMPERE; mmq_y = MMQ_Y_Q8_0_AMPERE; nwarps = NWARPS_Q8_0_AMPERE; @@ -5146,7 +5181,7 @@ static void ggml_mul_mat_q2_K_q8_1_cuda( mmq_x = MMQ_X_Q2_K_RDNA1; mmq_y = MMQ_Y_Q2_K_RDNA1; nwarps = NWARPS_Q2_K_RDNA1; - } else if (compute_capability >= CC_TURING) { + } else if (compute_capability >= CC_VOLTA) { mmq_x = MMQ_X_Q2_K_AMPERE; mmq_y = MMQ_Y_Q2_K_AMPERE; nwarps = NWARPS_Q2_K_AMPERE; @@ -5193,7 +5228,7 @@ static void ggml_mul_mat_q3_K_q8_1_cuda( mmq_x = MMQ_X_Q3_K_RDNA1; mmq_y = MMQ_Y_Q3_K_RDNA1; nwarps = NWARPS_Q3_K_RDNA1; - } else if (compute_capability >= CC_TURING) { + } else if (compute_capability >= CC_VOLTA) { mmq_x = MMQ_X_Q3_K_AMPERE; mmq_y = MMQ_Y_Q3_K_AMPERE; nwarps = NWARPS_Q3_K_AMPERE; @@ -5239,7 +5274,7 @@ static void ggml_mul_mat_q4_K_q8_1_cuda( mmq_x = MMQ_X_Q4_K_RDNA1; mmq_y = MMQ_Y_Q4_K_RDNA1; nwarps = NWARPS_Q4_K_RDNA1; - } else if (compute_capability >= CC_TURING) { + } else if (compute_capability >= CC_VOLTA) { mmq_x = MMQ_X_Q4_K_AMPERE; mmq_y = MMQ_Y_Q4_K_AMPERE; nwarps = NWARPS_Q4_K_AMPERE; @@ -5284,7 +5319,7 @@ static void ggml_mul_mat_q5_K_q8_1_cuda( mmq_x = MMQ_X_Q5_K_RDNA1; mmq_y = MMQ_Y_Q5_K_RDNA1; nwarps = NWARPS_Q5_K_RDNA1; - } else if (compute_capability >= CC_TURING) { + } else if (compute_capability >= CC_VOLTA) { mmq_x = MMQ_X_Q5_K_AMPERE; mmq_y = MMQ_Y_Q5_K_AMPERE; nwarps = NWARPS_Q5_K_AMPERE; @@ -5329,7 +5364,7 @@ static void ggml_mul_mat_q6_K_q8_1_cuda( mmq_x = MMQ_X_Q6_K_RDNA1; mmq_y = MMQ_Y_Q6_K_RDNA1; nwarps = NWARPS_Q6_K_RDNA1; - } else if (compute_capability >= CC_TURING) { + } else if (compute_capability >= CC_VOLTA) { mmq_x = MMQ_X_Q6_K_AMPERE; mmq_y = MMQ_Y_Q6_K_AMPERE; nwarps = NWARPS_Q6_K_AMPERE; @@ -5907,7 +5942,7 @@ static int64_t get_row_rounding(ggml_type type) { switch(type) { case GGML_TYPE_Q4_0: case GGML_TYPE_Q4_1: - return max_compute_capability >= CC_TURING ? 128 : 64; + return max_compute_capability >= CC_VOLTA ? 128 : 64; case GGML_TYPE_Q5_0: case GGML_TYPE_Q5_1: case GGML_TYPE_Q8_0: @@ -5918,7 +5953,7 @@ static int64_t get_row_rounding(ggml_type type) { case GGML_TYPE_Q3_K: case GGML_TYPE_Q4_K: case GGML_TYPE_Q5_K: - return max_compute_capability >= CC_TURING ? 128 : 64; + return max_compute_capability >= CC_VOLTA ? 128 : 64; case GGML_TYPE_Q6_K: return 64; default: @@ -6083,8 +6118,19 @@ inline void ggml_cuda_op_mul_mat_cublas( const int compute_capability = g_compute_capabilities[id]; - if (compute_capability >= CC_TURING && src0->type == GGML_TYPE_F16 && ggml_is_contiguous(src0) && ldc == row_diff) { - // convert src1 to fp16, multiply as fp16, convert dst to fp32 + if (compute_capability >= CC_VOLTA && (src0->type == GGML_TYPE_F16 || ggml_is_quantized(src0->type)) && ggml_is_contiguous(src0) && row_diff == src0->ne[1]) { + // convert src0 and src1 to fp16, multiply as fp16, convert dst to fp32 + half * src0_as_f16 = nullptr; + size_t src0_as = 0; + if (src0->type != GGML_TYPE_F16) { + const to_fp16_cuda_t to_fp16_cuda = ggml_get_to_fp16_cuda(src0->type); + GGML_ASSERT(to_fp16_cuda != nullptr); + size_t ne = row_diff*ne00; + src0_as_f16 = (half *) ggml_cuda_pool_malloc(ne * sizeof(half), &src0_as); + to_fp16_cuda(src0_dd_i, src0_as_f16, ne, stream); + } + const half * src0_ptr = src0->type == GGML_TYPE_F16 ? (const half *) src0_dd_i : src0_as_f16; + half * src1_as_f16 = nullptr; size_t src1_as = 0; if (src1->type != GGML_TYPE_F16) { @@ -6106,9 +6152,9 @@ inline void ggml_cuda_op_mul_mat_cublas( CUBLAS_CHECK( cublasGemmEx(g_cublas_handles[id], CUBLAS_OP_T, CUBLAS_OP_N, row_diff, src1_ncols, ne10, - &alpha_f16, src0_dd_i, CUDA_R_16F, ne00, - src1_ptr, CUDA_R_16F, ne10, - &beta_f16, dst_f16, CUDA_R_16F, ldc, + &alpha_f16, src0_ptr, CUDA_R_16F, ne00, + src1_ptr, CUDA_R_16F, ne10, + &beta_f16, dst_f16, CUDA_R_16F, ldc, CUBLAS_COMPUTE_16F, CUBLAS_GEMM_DEFAULT_TENSOR_OP)); @@ -6117,6 +6163,10 @@ inline void ggml_cuda_op_mul_mat_cublas( ggml_cuda_pool_free(dst_f16, dst_as); + if (src0_as != 0) { + ggml_cuda_pool_free(src0_as_f16, src0_as); + } + if (src1_as != 0) { ggml_cuda_pool_free(src1_as_f16, src1_as); } From c97f01c362ac102c6994edb80008f8608539553a Mon Sep 17 00:00:00 2001 From: vvhg1 <94630311+vvhg1@users.noreply.github.com> Date: Mon, 2 Oct 2023 09:42:02 +0200 Subject: [PATCH 17/73] infill : add new example + extend server API (#3296) * vvhg-code-infill (#1) * infill in separate example (#2) * reverted changes to main and added infill example * cleanup * naming improvement * make : add missing blank line * fix missing semicolon * brought infill up to current main code * cleanup --------- Co-authored-by: Cebtenzzre --- .gitignore | 1 + Makefile | 5 +- common/common.cpp | 2 + common/common.h | 1 + examples/infill/CMakeLists.txt | 8 + examples/infill/README.md | 41 ++ examples/infill/infill.cpp | 769 +++++++++++++++++++++++++++++++++ examples/server/README.md | 10 + examples/server/server.cpp | 206 +++++++++ llama.cpp | 20 + llama.h | 5 + 11 files changed, 1067 insertions(+), 1 deletion(-) create mode 100644 examples/infill/CMakeLists.txt create mode 100644 examples/infill/README.md create mode 100644 examples/infill/infill.cpp diff --git a/.gitignore b/.gitignore index f98132a22..a552139f1 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ models-mnt /embedding /gguf /gguf-llama-simple +/infill /libllama.so /llama-bench /main diff --git a/Makefile b/Makefile index 08b83ca7e..91198c555 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # Define the default target now so that it is always the first target -BUILD_TARGETS = main quantize quantize-stats perplexity embedding vdot q8dot train-text-from-scratch convert-llama2c-to-ggml simple batched save-load-state server embd-input-test gguf llama-bench baby-llama beam-search speculative benchmark-matmult parallel finetune export-lora tests/test-c.o +BUILD_TARGETS = main quantize quantize-stats perplexity embedding vdot q8dot train-text-from-scratch convert-llama2c-to-ggml simple batched save-load-state server embd-input-test gguf llama-bench baby-llama beam-search speculative infill benchmark-matmult parallel finetune export-lora tests/test-c.o # Binaries only useful for tests TEST_TARGETS = tests/test-llama-grammar tests/test-grammar-parser tests/test-double-float tests/test-grad0 tests/test-opt tests/test-quantize-fns tests/test-quantize-perf tests/test-sampling tests/test-tokenizer-0-llama tests/test-tokenizer-0-falcon tests/test-tokenizer-1-llama @@ -543,6 +543,9 @@ main: examples/main/main.cpp build-info.h ggml. @echo '==== Run ./main -h for help. ====' @echo +infill: examples/infill/infill.cpp build-info.h ggml.o llama.o common.o console.o grammar-parser.o $(OBJS) + $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) + simple: examples/simple/simple.cpp build-info.h ggml.o llama.o common.o $(OBJS) $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) diff --git a/common/common.cpp b/common/common.cpp index ec181c6b3..4b233786a 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -389,6 +389,8 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) { params.interactive_first = true; } else if (arg == "-ins" || arg == "--instruct") { params.instruct = true; + } else if (arg == "--infill") { + params.infill = true; } else if (arg == "--multiline-input") { params.multiline_input = true; } else if (arg == "--simple-io") { diff --git a/common/common.h b/common/common.h index 0e2d3fa6c..e095c56e3 100644 --- a/common/common.h +++ b/common/common.h @@ -120,6 +120,7 @@ struct gpt_params { bool use_mlock = false; // use mlock to keep model in memory bool numa = false; // attempt optimizations that help on some NUMA systems bool verbose_prompt = false; // print prompt tokens before generation + bool infill = false; // use infill mode }; bool gpt_params_parse(int argc, char ** argv, gpt_params & params); diff --git a/examples/infill/CMakeLists.txt b/examples/infill/CMakeLists.txt new file mode 100644 index 000000000..046f9b1e7 --- /dev/null +++ b/examples/infill/CMakeLists.txt @@ -0,0 +1,8 @@ +set(TARGET infill) +add_executable(${TARGET} infill.cpp) +install(TARGETS ${TARGET} RUNTIME) +target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT}) +target_compile_features(${TARGET} PRIVATE cxx_std_11) +if(TARGET BUILD_INFO) + add_dependencies(${TARGET} BUILD_INFO) +endif() diff --git a/examples/infill/README.md b/examples/infill/README.md new file mode 100644 index 000000000..8c97f719b --- /dev/null +++ b/examples/infill/README.md @@ -0,0 +1,41 @@ +# llama.cpp/example/infill + +This example shows how to use the infill mode with Code Llama models supporting infill mode. +Currently the 7B and 13B models support infill mode. + +Infill supports most of the options available in the main example. + +For further information have a look at the main README.md in llama.cpp/example/main/README.md + +## Common Options + +In this section, we cover the most commonly used options for running the `infill` program with the LLaMA models: + +- `-m FNAME, --model FNAME`: Specify the path to the LLaMA model file (e.g., `models/7B/ggml-model.bin`). +- `-i, --interactive`: Run the program in interactive mode, allowing you to provide input directly and receive real-time responses. +- `-n N, --n-predict N`: Set the number of tokens to predict when generating text. Adjusting this value can influence the length of the generated text. +- `-c N, --ctx-size N`: Set the size of the prompt context. The default is 512, but LLaMA models were built with a context of 2048, which will provide better results for longer input/inference. + +## Input Prompts + +The `infill` program provides several ways to interact with the LLaMA models using input prompts: + +- `--in-prefix PROMPT_BEFORE_CURSOR`: Provide the prefix directly as a command-line option. +- `--in-suffix PROMPT_AFTER_CURSOR`: Provide the suffix directly as a command-line option. +- `--interactive-first`: Run the program in interactive mode and wait for input right away. (More on this below.) + +## Interaction + +The `infill` program offers a seamless way to interact with LLaMA models, allowing users to receive real-time infill suggestions. The interactive mode can be triggered using `--interactive`, and `--interactive-first` + +### Interaction Options + +- `-i, --interactive`: Run the program in interactive mode, allowing users to get real time code suggestions from model. +- `--interactive-first`: Run the program in interactive mode and immediately wait for user input before starting the text generation. +- `--color`: Enable colorized output to differentiate visually distinguishing between prompts, user input, and generated text. + +### Example + +```bash +./infill -t 10 -ngl 0 -m models/codellama-13b.Q5_K_S.gguf -c 4096 --temp 0.7 --repeat_penalty 1.1 -n 20 --in-prefix "def helloworld():\n print(\"hell" --in-suffix "\n print(\"goodbye world\")\n " +``` diff --git a/examples/infill/infill.cpp b/examples/infill/infill.cpp new file mode 100644 index 000000000..9ec75ce42 --- /dev/null +++ b/examples/infill/infill.cpp @@ -0,0 +1,769 @@ +#include "common.h" + +#include "console.h" +#include "llama.h" +#include "build-info.h" +#include "grammar-parser.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined (__unix__) || (defined (__APPLE__) && defined (__MACH__)) +#include +#include +#elif defined (_WIN32) +#define WIN32_LEAN_AND_MEAN +#ifndef NOMINMAX +#define NOMINMAX +#endif +#include +#include +#endif + +#if defined(_MSC_VER) +#pragma warning(disable: 4244 4267) // possible loss of data +#endif + +static llama_context ** g_ctx; +static llama_model ** g_model; +static gpt_params * g_params; +static std::vector * g_input_tokens; +static std::ostringstream * g_output_ss; +static std::vector * g_output_tokens; +static bool is_interacting = false; + + +static void write_logfile( + const llama_context * ctx, const gpt_params & params, const llama_model * model, + const std::vector & input_tokens, const std::string & output, + const std::vector & output_tokens +) { + if (params.logdir.empty()) { + return; + } + + const std::string timestamp = get_sortable_timestamp(); + + const bool success = create_directory_with_parents(params.logdir); + if (!success) { + fprintf(stderr, "%s: warning: failed to create logdir %s, cannot write logfile\n", + __func__, params.logdir.c_str()); + return; + } + + const std::string logfile_path = params.logdir + timestamp + ".yml"; + FILE * logfile = fopen(logfile_path.c_str(), "w"); + + if (logfile == NULL) { + fprintf(stderr, "%s: failed to open logfile %s\n", __func__, logfile_path.c_str()); + return; + } + + fprintf(logfile, "binary: infill\n"); + char model_desc[128]; + llama_model_desc(model, model_desc, sizeof(model_desc)); + dump_non_result_info_yaml(logfile, params, ctx, timestamp, input_tokens, model_desc); + + fprintf(logfile, "\n"); + fprintf(logfile, "######################\n"); + fprintf(logfile, "# Generation Results #\n"); + fprintf(logfile, "######################\n"); + fprintf(logfile, "\n"); + + dump_string_yaml_multiline(logfile, "output", output.c_str()); + dump_vector_int_yaml(logfile, "output_tokens", output_tokens); + + llama_dump_timing_info_yaml(logfile, ctx); + fclose(logfile); +} + +#if defined (__unix__) || (defined (__APPLE__) && defined (__MACH__)) || defined (_WIN32) +static void sigint_handler(int signo) { + if (signo == SIGINT) { + if (!is_interacting) { + is_interacting = true; + } else { + console::cleanup(); + printf("\n"); + llama_print_timings(*g_ctx); + write_logfile(*g_ctx, *g_params, *g_model, *g_input_tokens, g_output_ss->str(), *g_output_tokens); + _exit(130); + } + } +} +#endif + +int main(int argc, char ** argv) { + gpt_params params; + g_params = ¶ms; + + if (!gpt_params_parse(argc, argv, params)) { + return 1; + } + +#ifndef LOG_DISABLE_LOGS + log_set_target(log_filename_generator("infill", "log")); + LOG_TEE("Log start\n"); + log_dump_cmdline(argc, argv); +#endif // LOG_DISABLE_LOGS + + console::init(params.simple_io, params.use_color); + atexit([]() { console::cleanup(); }); + + if (params.logits_all) { + printf("\n************\n"); + printf("%s: please use the 'perplexity' tool for perplexity calculations\n", __func__); + printf("************\n\n"); + + return 0; + } + + if (params.embedding) { + printf("\n************\n"); + printf("%s: please use the 'embedding' tool for embedding calculations\n", __func__); + printf("************\n\n"); + + return 0; + } + + if (params.n_ctx != 0 && params.n_ctx < 8) { + LOG_TEE("%s: warning: minimum context size is 8, using minimum size.\n", __func__); + params.n_ctx = 8; + } + if (params.instruct) { + printf("\n************\n"); + printf("%s: please use the 'main' tool for instruct mode\n", __func__); + printf("************\n\n"); + + return 0; + } + if (!params.antiprompt.empty()) { + printf("\n************\n"); + printf("%s: please use the 'main' tool for antiprompt mode\n", __func__); + printf("************\n\n"); + + return 0; + } + if (!params.interactive_first && (params.input_prefix.empty() && params.input_suffix.empty())) { + printf("\n************\n"); + printf("%s: please use '--interactive_first' or specify '--in_prefix' and/or '--in_suffix'\n", __func__); + printf("************\n\n"); + + return 0; + } + if (params.random_prompt) { + printf("\n************\n"); + printf("%s: please use the 'main' tool for random prompt mode\n", __func__); + printf("************\n\n"); + + return 0; + } + if (!params.path_prompt_cache.empty()) { + printf("\n************\n"); + printf("%s: infill does not support prompt caching\n", __func__); + printf("************\n\n"); + + return 0; + } + + if (params.rope_freq_base != 0.0) { + LOG_TEE("%s: warning: changing RoPE frequency base to %g.\n", __func__, params.rope_freq_base); + } + + if (params.rope_freq_scale != 0.0) { + LOG_TEE("%s: warning: scaling RoPE frequency by %g.\n", __func__, params.rope_freq_scale); + } + + LOG_TEE("%s: build = %d (%s)\n", __func__, BUILD_NUMBER, BUILD_COMMIT); + LOG_TEE("%s: built with %s for %s\n", __func__, BUILD_COMPILER, BUILD_TARGET); + + if (params.seed == LLAMA_DEFAULT_SEED) { + params.seed = time(NULL); + } + + LOG_TEE("%s: seed = %u\n", __func__, params.seed); + + std::mt19937 rng(params.seed); + + LOG("%s: llama backend init\n", __func__); + llama_backend_init(params.numa); + + llama_model * model; + llama_context * ctx; + llama_context * ctx_guidance = NULL; + g_model = &model; + g_ctx = &ctx; + + // load the model and apply lora adapter, if any + LOG("%s: load the model and apply lora adapter, if any\n", __func__); + std::tie(model, ctx) = llama_init_from_gpt_params(params); + if (params.cfg_scale > 1.f) { + struct llama_context_params lparams = llama_context_params_from_gpt_params(params); + ctx_guidance = llama_new_context_with_model(model, lparams); + } + + if (model == NULL) { + LOG_TEE("%s: error: unable to load model\n", __func__); + return 1; + } + + const int n_ctx_train = llama_n_ctx_train(model); + const int n_ctx = llama_n_ctx(ctx); + LOG("n_ctx: %d\n", n_ctx); + + if (n_ctx > n_ctx_train) { + LOG_TEE("%s: warning: model was trained on only %d context tokens (%d specified)\n", + __func__, n_ctx_train, n_ctx); + } + + // print system information + { + LOG_TEE("\n"); + LOG_TEE("%s\n", get_system_info(params).c_str()); + } + const bool add_bos = llama_vocab_type(model) == LLAMA_VOCAB_TYPE_SPM; + LOG("add_bos: %d\n", add_bos); + + std::vector embd_inp; + std::vector inp_pfx = ::llama_tokenize(ctx, params.input_prefix, add_bos); + std::vector inp_sfx = ::llama_tokenize(ctx, params.input_suffix, add_bos); + inp_pfx.insert(inp_pfx.begin(), llama_token_prefix(ctx)); + inp_sfx.insert(inp_sfx.begin(), llama_token_suffix(ctx)); + embd_inp = inp_pfx; + embd_inp.insert(embd_inp.end(), inp_sfx.begin(), inp_sfx.end()); + embd_inp.push_back(llama_token_middle(ctx)); + + LOG("prefix: \"%s\"\n", log_tostr(params.input_prefix)); + LOG("suffix: \"%s\"\n", log_tostr(params.input_suffix)); + LOG("tokens: %s\n", LOG_TOKENS_TOSTR_PRETTY(ctx, embd_inp)); + + // Should not run without any tokens + if (embd_inp.empty()) { + embd_inp.push_back(llama_token_bos(ctx)); + LOG("embd_inp was considered empty and bos was added: %s\n", LOG_TOKENS_TOSTR_PRETTY(ctx, embd_inp)); + } + + // Tokenize negative prompt + std::vector guidance_inp; + int guidance_offset = 0; + int original_prompt_len = 0; + if (ctx_guidance) { + LOG("cfg_negative_prompt: \"%s\"\n", log_tostr(params.cfg_negative_prompt)); + + guidance_inp = ::llama_tokenize(ctx_guidance, params.cfg_negative_prompt, add_bos); + LOG("guidance_inp tokenized: %s\n", LOG_TOKENS_TOSTR_PRETTY(ctx_guidance, guidance_inp)); + + std::vector original_inp = ::llama_tokenize(ctx, params.prompt, add_bos); + LOG("original_inp tokenized: %s\n", LOG_TOKENS_TOSTR_PRETTY(ctx, original_inp)); + + original_prompt_len = original_inp.size(); + guidance_offset = (int)guidance_inp.size() - original_prompt_len; + LOG("original_prompt_len: %s", log_tostr(original_prompt_len)); + LOG("guidance_offset: %s", log_tostr(guidance_offset)); + } + + if ((int) embd_inp.size() > n_ctx - 4) { + LOG_TEE("%s: error: prompt is too long (%d tokens, max %d)\n", __func__, (int) embd_inp.size(), n_ctx - 4); + return 1; + } + + // number of tokens to keep when resetting context + if (params.n_keep < 0 || params.n_keep > (int) embd_inp.size()) { + params.n_keep = (int)embd_inp.size(); + } + + LOG("inp_pfx: %s\n", LOG_TOKENS_TOSTR_PRETTY(ctx, inp_pfx)); + LOG("inp_sfx: %s\n", LOG_TOKENS_TOSTR_PRETTY(ctx, inp_sfx)); + + + // enable interactive mode if interactive start is specified + if (params.interactive_first) { + params.interactive = true; + } + + if (params.verbose_prompt) { + LOG_TEE("\n"); + LOG_TEE("%s: prompt: '%s'\n", __func__, params.prompt.c_str()); + LOG_TEE("%s: number of tokens in prompt = %zu\n", __func__, embd_inp.size()); + for (int i = 0; i < (int) embd_inp.size(); i++) { + LOG_TEE("%6d -> '%s'\n", embd_inp[i], llama_token_to_piece(ctx, embd_inp[i]).c_str()); + } + + if (ctx_guidance) { + LOG_TEE("\n"); + LOG_TEE("%s: negative prompt: '%s'\n", __func__, params.cfg_negative_prompt.c_str()); + LOG_TEE("%s: number of tokens in negative prompt = %zu\n", __func__, guidance_inp.size()); + for (int i = 0; i < (int) guidance_inp.size(); i++) { + LOG_TEE("%6d -> '%s'\n", guidance_inp[i], llama_token_to_piece(ctx, guidance_inp[i]).c_str()); + } + } + + if (params.n_keep > 0) { + LOG_TEE("%s: static prompt based on n_keep: '", __func__); + for (int i = 0; i < params.n_keep; i++) { + LOG_TEE("%s", llama_token_to_piece(ctx, embd_inp[i]).c_str()); + } + LOG_TEE("'\n"); + } + LOG_TEE("\n"); + } + + if (params.interactive) { +#if defined (__unix__) || (defined (__APPLE__) && defined (__MACH__)) + struct sigaction sigint_action; + sigint_action.sa_handler = sigint_handler; + sigemptyset (&sigint_action.sa_mask); + sigint_action.sa_flags = 0; + sigaction(SIGINT, &sigint_action, NULL); +#elif defined (_WIN32) + auto console_ctrl_handler = +[](DWORD ctrl_type) -> BOOL { + return (ctrl_type == CTRL_C_EVENT) ? (sigint_handler(SIGINT), true) : false; + }; + SetConsoleCtrlHandler(reinterpret_cast(console_ctrl_handler), true); +#endif + + LOG_TEE("%s: interactive mode on.\n", __func__); + + if (params.input_prefix_bos) { + LOG_TEE("Input prefix with BOS\n"); + } + + if (!params.input_prefix.empty()) { + LOG_TEE("Input prefix: '%s'\n", params.input_prefix.c_str()); + } + + if (!params.input_suffix.empty()) { + LOG_TEE("Input suffix: '%s'\n", params.input_suffix.c_str()); + } + } + LOG_TEE("sampling: repeat_last_n = %d, repeat_penalty = %f, presence_penalty = %f, frequency_penalty = %f, top_k = %d, tfs_z = %f, top_p = %f, typical_p = %f, temp = %f, mirostat = %d, mirostat_lr = %f, mirostat_ent = %f\n", + params.repeat_last_n, params.repeat_penalty, params.presence_penalty, params.frequency_penalty, params.top_k, params.tfs_z, params.top_p, params.typical_p, params.temp, params.mirostat, params.mirostat_eta, params.mirostat_tau); + LOG_TEE("generate: n_ctx = %d, n_batch = %d, n_predict = %d, n_keep = %d\n", n_ctx, params.n_batch, params.n_predict, params.n_keep); + LOG_TEE("\n\n"); + + struct llama_grammar * grammar = NULL; + grammar_parser::parse_state parsed_grammar; + + if (!params.grammar.empty()) { + parsed_grammar = grammar_parser::parse(params.grammar.c_str()); + // will be empty (default) if there are parse errors + if (parsed_grammar.rules.empty()) { + return 1; + } + LOG_TEE("%s: grammar:\n", __func__); + grammar_parser::print_grammar(stderr, parsed_grammar); + LOG_TEE("\n"); + + { + auto it = params.logit_bias.find(llama_token_eos(ctx)); + if (it != params.logit_bias.end() && it->second == -INFINITY) { + LOG_TEE("%s: warning: EOS token is disabled, which will cause most grammars to fail\n", __func__); + } + } + + std::vector grammar_rules(parsed_grammar.c_rules()); + grammar = llama_grammar_init( + grammar_rules.data(), grammar_rules.size(), parsed_grammar.symbol_ids.at("root")); + } + + // TODO: replace with ring-buffer + std::vector last_tokens(n_ctx); + std::fill(last_tokens.begin(), last_tokens.end(), 0); + LOG_TEE("\n##### Infill mode #####\n\n"); + if (params.infill) { + printf("\n************\n"); + printf("no need to specify '--infill', always running infill\n"); + printf("************\n\n"); + } + if (params.interactive) { + const char *control_message; + if (params.multiline_input) { + control_message = " - To return control to LLaMa, end your input with '\\'.\n" + " - To return control without starting a new line, end your input with '/'.\n"; + } else { + control_message = " - Press Return to return control to LLaMa.\n" + " - To return control without starting a new line, end your input with '/'.\n" + " - If you want to submit another line, end your input with '\\'.\n"; + } + LOG_TEE("== Running in interactive mode. ==\n"); +#if defined (__unix__) || (defined (__APPLE__) && defined (__MACH__)) || defined (_WIN32) + LOG_TEE( " - Press Ctrl+C to interject at any time.\n"); +#endif + LOG_TEE( "%s\n", control_message); + + is_interacting = params.interactive_first; + } + + bool input_echo = true; + + int n_past = 0; + int n_remain = params.n_predict; + int n_consumed = 0; + int n_past_guidance = 0; + + std::vector input_tokens; g_input_tokens = &input_tokens; + std::vector output_tokens; g_output_tokens = &output_tokens; + std::ostringstream output_ss; g_output_ss = &output_ss; + + // the first thing we will do is to output the prompt, so set color accordingly + console::set_display(console::prompt); + + std::vector embd; + std::vector embd_guidance; + + const int n_vocab = llama_n_vocab(model); + + std::vector candidates; + candidates.reserve(n_vocab); + + while (n_remain != 0 || params.interactive) { + // predict + if (!embd.empty()) { + // Note: n_ctx - 4 here is to match the logic for commandline prompt handling via + // --prompt or --file which uses the same value. + int max_embd_size = n_ctx - 4; + + // Ensure the input doesn't exceed the context size by truncating embd if necessary. + if ((int) embd.size() > max_embd_size) { + const int skipped_tokens = (int) embd.size() - max_embd_size; + embd.resize(max_embd_size); + + console::set_display(console::error); + printf("<>", skipped_tokens, skipped_tokens != 1 ? "s" : ""); + console::set_display(console::reset); + fflush(stdout); + } + + // infinite text generation via context swapping + // if we run out of context: + // - take the n_keep first tokens from the original prompt (via n_past) + // - take half of the last (n_ctx - n_keep) tokens and recompute the logits in batches + if (n_past + (int) embd.size() + std::max(0, guidance_offset) > n_ctx) { + if (params.n_predict == -2) { + LOG_TEE("\n\n%s: context full and n_predict == -%d => stopping\n", __func__, params.n_predict); + break; + } + + const int n_left = n_past - params.n_keep - 1; + const int n_discard = n_left/2; + + LOG("context full, swapping: n_past = %d, n_left = %d, n_ctx = %d, n_keep = %d, n_discard = %d\n", + n_past, n_left, n_ctx, params.n_keep, n_discard); + + llama_kv_cache_seq_rm (ctx, 0, params.n_keep + 1 , params.n_keep + n_discard + 1); + llama_kv_cache_seq_shift(ctx, 0, params.n_keep + 1 + n_discard, n_past, -n_discard); + + n_past -= n_discard; + + if (ctx_guidance) { + n_past_guidance -= n_discard; + } + + LOG("after swap: n_past = %d, n_past_guidance = %d\n", n_past, n_past_guidance); + + LOG("embd: %s\n", LOG_TOKENS_TOSTR_PRETTY(ctx, embd)); + + } + + // evaluate tokens in batches + // embd is typically prepared beforehand to fit within a batch, but not always + + if (ctx_guidance) { + int input_size = 0; + llama_token * input_buf = NULL; + + if (n_past_guidance < (int) guidance_inp.size()) { + // Guidance context should have the same data with these modifications: + // + // * Replace the initial prompt + // * Shift everything by guidance_offset + embd_guidance = guidance_inp; + if (embd.begin() + original_prompt_len < embd.end()) { + embd_guidance.insert( + embd_guidance.end(), + embd.begin() + original_prompt_len, + embd.end() + ); + } + + input_buf = embd_guidance.data(); + input_size = embd_guidance.size(); + + LOG("guidance context: %s\n", LOG_TOKENS_TOSTR_PRETTY(ctx, embd_guidance)); + } else { + input_buf = embd.data(); + input_size = embd.size(); + } + + for (int i = 0; i < input_size; i += params.n_batch) { + int n_eval = std::min(input_size - i, params.n_batch); + if (llama_decode(ctx_guidance, llama_batch_get_one(input_buf + i, n_eval, n_past_guidance, 0))) { + LOG_TEE("%s : failed to eval\n", __func__); + return 1; + } + + n_past_guidance += n_eval; + } + } + + for (int i = 0; i < (int) embd.size(); i += params.n_batch) { + int n_eval = (int) embd.size() - i; + if (n_eval > params.n_batch) { + n_eval = params.n_batch; + } + + LOG("eval: %s\n", LOG_TOKENS_TOSTR_PRETTY(ctx, embd)); + + if (llama_decode(ctx, llama_batch_get_one(&embd[i], n_eval, n_past, 0))) { + LOG_TEE("%s : failed to eval\n", __func__); + return 1; + } + + n_past += n_eval; + + LOG("n_past = %d\n", n_past); + } + + } + + embd.clear(); + embd_guidance.clear(); + + if ((int) embd_inp.size() <= n_consumed && !is_interacting) { + + const llama_token id = llama_sample_token(ctx, ctx_guidance, grammar, params, last_tokens, candidates); + + last_tokens.erase(last_tokens.begin()); + last_tokens.push_back(id); + + LOG("last: %s\n", LOG_TOKENS_TOSTR_PRETTY(ctx, last_tokens)); + + embd.push_back(id); + + // echo this to console + input_echo = true; + + // decrement remaining sampling budget + --n_remain; + + LOG("n_remain: %d\n", n_remain); + } else { + // some user input remains from prompt or interaction, forward it to processing + LOG("embd_inp.size(): %d, n_consumed: %d\n", (int) embd_inp.size(), n_consumed); + while ((int) embd_inp.size() > n_consumed) { + embd.push_back(embd_inp[n_consumed]); + last_tokens.erase(last_tokens.begin()); + last_tokens.push_back(embd_inp[n_consumed]); + ++n_consumed; + if ((int) embd.size() >= params.n_batch) { + break; + } + } + } + + // display text + if (input_echo) { + for (auto id : embd) { + const std::string token_str = llama_token_to_piece(ctx, id); + printf("%s", token_str.c_str()); + + if (embd.size() > 1) { + input_tokens.push_back(id); + } else { + output_tokens.push_back(id); + output_ss << token_str; + } + } + fflush(stdout); + } + // reset color to default if we there is no pending user input + if (input_echo && (int) embd_inp.size() == n_consumed) { + console::set_display(console::reset); + } + + // if not currently processing queued inputs; + if ((int) embd_inp.size() <= n_consumed) { + + // deal with eot token in infill mode + if ((last_tokens.back() == llama_token_eot(ctx) || is_interacting) && params.interactive){ + if(is_interacting && !params.interactive_first) { + // print an eot token + printf("%s", llama_token_to_piece(ctx, llama_token_eot(ctx)).c_str()); + } + fflush(stdout); + printf("\n"); + console::set_display(console::user_input); + std::string buffer; + std::string line; + bool another_line=true; + // set a new prefix via stdin + do { + another_line = console::readline(line, params.multiline_input); + buffer += line; + } while (another_line); + // check if we got an empty line, if so we use the old input + if(!buffer.empty() && !(buffer.length() == 1 && buffer[0] == '\n')) { + params.input_prefix = buffer; + } + buffer.clear(); + // set a new suffix via stdin + do { + another_line = console::readline(line, params.multiline_input); + buffer += line; + } while (another_line); + // check if we got an empty line + if(!buffer.empty() && !(buffer.length() == 1 && buffer[0] == '\n')) { + params.input_suffix = buffer; + } + buffer.clear(); + // done taking input, reset color + console::set_display(console::reset); + // tokenize new prefix and suffix + std::vector inp_pfx = ::llama_tokenize(ctx, params.input_prefix, add_bos); + std::vector inp_sfx = ::llama_tokenize(ctx, params.input_suffix, add_bos); + inp_pfx.insert(inp_pfx.begin(), llama_token_prefix(ctx)); + inp_sfx.insert(inp_sfx.begin(), llama_token_suffix(ctx)); + embd_inp = inp_pfx; + embd_inp.insert(embd_inp.end(), inp_sfx.begin(), inp_sfx.end()); + embd_inp.push_back(llama_token_middle(ctx)); + embd.clear(); + embd_guidance.clear(); + n_remain = params.n_predict; + n_past = 0; + n_consumed = 0; + // LOG_TEE("took new input\n"); + is_interacting = false; + } + // deal with end of text token in interactive mode + else if (last_tokens.back() == llama_token_eos(ctx)) { + LOG("found EOS token\n"); + + if (params.interactive) { + + is_interacting = true; + printf("\n"); + console::set_display(console::user_input); + fflush(stdout); + } + } + + if (n_past > 0 && is_interacting && !params.interactive) { + LOG("waiting for user input\n"); + + if (params.input_prefix_bos) { + LOG("adding input prefix BOS token\n"); + embd_inp.push_back(llama_token_bos(ctx)); + } + + std::string buffer; + if (!params.input_prefix.empty()) { + LOG("appending input prefix: '%s'\n", params.input_prefix.c_str()); + buffer += params.input_prefix; + printf("%s", buffer.c_str()); + } + + std::string line; + bool another_line = true; + do { + another_line = console::readline(line, params.multiline_input); + buffer += line; + } while (another_line); + + // done taking input, reset color + console::set_display(console::reset); + + // Add tokens to embd only if the input buffer is non-empty + // Entering a empty line lets the user pass control back + if (buffer.length() > 1) { + // append input suffix if any + if (!params.input_suffix.empty()) { + LOG("appending input suffix: '%s'\n", params.input_suffix.c_str()); + buffer += params.input_suffix; + printf("%s", params.input_suffix.c_str()); + } + + LOG("buffer: '%s'\n", buffer.c_str()); + + const size_t original_size = embd_inp.size(); + + const auto line_inp = ::llama_tokenize(ctx, buffer, false); + LOG("input tokens: %s\n", LOG_TOKENS_TOSTR_PRETTY(ctx, line_inp)); + + embd_inp.insert(embd_inp.end(), line_inp.begin(), line_inp.end()); + + for (size_t i = original_size; i < embd_inp.size(); ++i) { + const llama_token token = embd_inp[i]; + output_tokens.push_back(token); + output_ss << llama_token_to_piece(ctx, token); + } + + n_remain -= line_inp.size(); + LOG("n_remain: %d\n", n_remain); + } else { + LOG("empty line, passing control back\n"); + } + + input_echo = false; // do not echo this again + } + + if (n_past > 0) { + if (is_interacting) { + // reset grammar state if we're restarting generation + if (grammar != NULL) { + llama_grammar_free(grammar); + + std::vector grammar_rules(parsed_grammar.c_rules()); + grammar = llama_grammar_init( + grammar_rules.data(), grammar_rules.size(), + parsed_grammar.symbol_ids.at("root")); + } + } + is_interacting = false; + } + } + + // end of text token + if (!embd.empty() && embd.back() == llama_token_eos(ctx) && !params.interactive) { + break; + } + + // In interactive mode, respect the maximum number of tokens and drop back to user input when reached. + // We skip this logic when n_predict == -1 (infinite) or -2 (stop at context size). + if (params.interactive && n_remain <= 0 && params.n_predict >= 0) { + n_remain = params.n_predict; + is_interacting = true; + } + } + if (!params.interactive && n_remain <= 0) { + printf("%s", llama_token_to_piece(ctx, llama_token_eot(ctx)).c_str()); + fflush(stdout); + } + + llama_print_timings(ctx); + write_logfile(ctx, params, model, input_tokens, output_ss.str(), output_tokens); + + if (ctx_guidance) { llama_free(ctx_guidance); } + llama_free(ctx); + llama_free_model(model); + + if (grammar != NULL) { + llama_grammar_free(grammar); + } + llama_backend_free(); + +#ifndef LOG_DISABLE_LOGS + LOG_TEE("Log end\n"); +#endif // LOG_DISABLE_LOGS + + return 0; +} + diff --git a/examples/server/README.md b/examples/server/README.md index d409e8408..9ee62d06a 100644 --- a/examples/server/README.md +++ b/examples/server/README.md @@ -176,6 +176,16 @@ node index.js `content`: Set the text to process. + **POST** `/infill`: For code infilling. Takes a prefix and a suffix and returns the predicted completion as stream. + + *Options:* + + `input_prefix`: Set the prefix of the code to infill. + + `input_suffix`: Set the suffix of the code to infill. + + It also accepts all the options of `/completion` except `stream` and `prompt`. + ## More examples ### Interactive mode diff --git a/examples/server/server.cpp b/examples/server/server.cpp index fe9a4255e..6dda5e36b 100644 --- a/examples/server/server.cpp +++ b/examples/server/server.cpp @@ -342,6 +342,70 @@ struct llama_server_context return true; } + void loadInfill() + { + auto prefix_tokens = tokenize(params.input_prefix, true); // always add BOS + auto suffix_tokens = tokenize(params.input_suffix, true); // always add BOS + prefix_tokens.insert(prefix_tokens.begin(), llama_token_prefix(ctx)); + prefix_tokens.insert(prefix_tokens.end(), llama_token_suffix(ctx)); + prefix_tokens.insert(prefix_tokens.end(), suffix_tokens.begin(), suffix_tokens.end()); + prefix_tokens.push_back(llama_token_middle(ctx)); + auto prompt_tokens = prefix_tokens; + + num_prompt_tokens = prompt_tokens.size(); + + if (params.n_keep < 0) + { + params.n_keep = (int)num_prompt_tokens; + } + params.n_keep = std::min(params.n_ctx - 4, params.n_keep); + + // if input prompt is too big, truncate like normal + if (num_prompt_tokens >= (size_t)params.n_ctx) + { + printf("Input prompt is too big, truncating. Can only take %d tokens but got %zu\n", params.n_ctx, num_prompt_tokens); + // todo we probably want to cut from both sides + const int n_left = (params.n_ctx - params.n_keep) / 2; + std::vector new_tokens(prompt_tokens.begin(), prompt_tokens.begin() + params.n_keep); + const int erased_blocks = (num_prompt_tokens - params.n_keep - n_left - 1) / n_left; + new_tokens.insert(new_tokens.end(), prompt_tokens.begin() + params.n_keep + erased_blocks * n_left, prompt_tokens.end()); + std::copy(prompt_tokens.end() - params.n_ctx, prompt_tokens.end(), last_n_tokens.begin()); + + LOG_VERBOSE("input truncated", { + {"n_ctx", params.n_ctx}, + {"n_keep", params.n_keep}, + {"n_left", n_left}, + {"new_tokens", tokens_to_str(ctx, new_tokens.cbegin(), new_tokens.cend())}, + }); + + truncated = true; + prompt_tokens = new_tokens; + } + else + { + const size_t ps = num_prompt_tokens; + std::fill(last_n_tokens.begin(), last_n_tokens.end() - ps, 0); + std::copy(prompt_tokens.begin(), prompt_tokens.end(), last_n_tokens.end() - ps); + } + + // compare the evaluated prompt with the new prompt + n_past = common_part(embd, prompt_tokens); + embd = prompt_tokens; + if (n_past == num_prompt_tokens) + { + // we have to evaluate at least 1 token to generate logits. + printf("we have to evaluate at least 1 token to generate logits\n"); + n_past--; + } + + LOG_VERBOSE("prompt ingested", { + {"n_past", n_past}, + {"cached", tokens_to_str(ctx, embd.cbegin(), embd.cbegin() + n_past)}, + {"to_eval", tokens_to_str(ctx, embd.cbegin() + n_past, embd.cend())}, + }); + + has_next_token = true; + } void loadPrompt() { auto prompt_tokens = tokenize(prompt, true); // always add BOS @@ -1219,6 +1283,27 @@ static void parse_options_completion(const json &body, llama_server_context &lla LOG_VERBOSE("completion parameters parsed", format_generation_settings(llama)); } +static void parse_options_infill(const json &body, llama_server_context &llama) +{ + if (body.count("input_prefix") != 0) + { + llama.params.input_prefix = body["input_prefix"]; + } + else + { + llama.params.input_prefix = ""; + } + if (body.count("input_suffix") != 0) + { + llama.params.input_suffix = body["input_suffix"]; + } + else + { + llama.params.input_suffix = ""; + } + parse_options_completion(body, llama); +} + static void log_server_request(const Request &req, const Response &res) { LOG_INFO("request", { @@ -1519,6 +1604,127 @@ int main(int argc, char **argv) res.set_chunked_content_provider("text/event-stream", chunked_content_provider, on_complete); } }); + svr.Post("/infill", [&llama](const Request &req, Response &res) + { + auto lock = llama.lock(); + + llama.rewind(); + + llama_reset_timings(llama.ctx); + + parse_options_infill(json::parse(req.body), llama); + + if (!llama.loadGrammar()) + { + res.status = 400; + return; + } + llama.loadInfill(); + llama.beginCompletion(); + const auto chunked_content_provider = [&](size_t, DataSink & sink) { + size_t sent_count = 0; + size_t sent_token_probs_index = 0; + + while (llama.has_next_token) { + const completion_token_output token_with_probs = llama.doCompletion(); + if (token_with_probs.tok == -1 || llama.multibyte_pending > 0) { + continue; + } + const std::string token_text = llama_token_to_piece(llama.ctx, token_with_probs.tok); + + size_t pos = std::min(sent_count, llama.generated_text.size()); + + const std::string str_test = llama.generated_text.substr(pos); + bool is_stop_full = false; + size_t stop_pos = + llama.findStoppingStrings(str_test, token_text.size(), STOP_FULL); + if (stop_pos != std::string::npos) { + is_stop_full = true; + llama.generated_text.erase( + llama.generated_text.begin() + pos + stop_pos, + llama.generated_text.end()); + pos = std::min(sent_count, llama.generated_text.size()); + } else { + is_stop_full = false; + stop_pos = llama.findStoppingStrings(str_test, token_text.size(), + STOP_PARTIAL); + } + + if ( + stop_pos == std::string::npos || + // Send rest of the text if we are at the end of the generation + (!llama.has_next_token && !is_stop_full && stop_pos > 0) + ) { + const std::string to_send = llama.generated_text.substr(pos, std::string::npos); + + sent_count += to_send.size(); + + std::vector probs_output = {}; + + if (llama.params.n_probs > 0) { + const std::vector to_send_toks = llama_tokenize(llama.ctx, to_send, false); + size_t probs_pos = std::min(sent_token_probs_index, llama.generated_token_probs.size()); + size_t probs_stop_pos = std::min(sent_token_probs_index + to_send_toks.size(), llama.generated_token_probs.size()); + if (probs_pos < probs_stop_pos) { + probs_output = std::vector(llama.generated_token_probs.begin() + probs_pos, llama.generated_token_probs.begin() + probs_stop_pos); + } + sent_token_probs_index = probs_stop_pos; + } + + const json data = format_partial_response(llama, to_send, probs_output); + + const std::string str = + "data: " + + data.dump(-1, ' ', false, json::error_handler_t::replace) + + "\n\n"; + + LOG_VERBOSE("data stream", { + { "to_send", str } + }); + + if (!sink.write(str.data(), str.size())) { + LOG_VERBOSE("stream closed", {}); + llama_print_timings(llama.ctx); + return false; + } + } + + if (!llama.has_next_token) { + // Generation is done, send extra information. + const json data = format_final_response( + llama, + "", + std::vector(llama.generated_token_probs.begin(), llama.generated_token_probs.begin() + sent_token_probs_index) + ); + + const std::string str = + "data: " + + data.dump(-1, ' ', false, json::error_handler_t::replace) + + "\n\n"; + + LOG_VERBOSE("data stream", { + { "to_send", str } + }); + + if (!sink.write(str.data(), str.size())) { + LOG_VERBOSE("stream closed", {}); + llama_print_timings(llama.ctx); + return false; + } + } + } + + llama_print_timings(llama.ctx); + sink.done(); + return true; + }; + const auto on_complete = [&](bool) { + llama.mutex.unlock(); + }; + lock.release(); + res.set_chunked_content_provider("text/event-stream", chunked_content_provider, on_complete); + }); + svr.Get("/model.json", [&llama](const Request &, Response &res) { const json data = format_generation_settings(llama); diff --git a/llama.cpp b/llama.cpp index bff17135b..3a0b2c308 100644 --- a/llama.cpp +++ b/llama.cpp @@ -1076,6 +1076,10 @@ struct llama_vocab { id special_pad_id = -1; id linefeed_id = 13; + id special_prefix_id = 32007; + id special_middle_id = 32009; + id special_suffix_id = 32008; + id special_eot_id = 32010; int find_bpe_rank(std::string token_left, std::string token_right) const { replace_all(token_left, " ", "\u0120"); @@ -7489,6 +7493,22 @@ llama_token llama_token_eos(const struct llama_context * ctx) { llama_token llama_token_nl(const struct llama_context * ctx) { return ctx->model.vocab.linefeed_id; } +llama_token llama_token_prefix(const struct llama_context * ctx) { + return ctx->model.vocab.special_prefix_id; +} + +llama_token llama_token_middle(const struct llama_context * ctx) { + return ctx->model.vocab.special_middle_id; +} + +llama_token llama_token_suffix(const struct llama_context * ctx) { + return ctx->model.vocab.special_suffix_id; +} + +llama_token llama_token_eot(const struct llama_context * ctx) { + return ctx->model.vocab.special_eot_id; +} + int llama_tokenize( const struct llama_model * model, diff --git a/llama.h b/llama.h index fde4d6eca..fd2158400 100644 --- a/llama.h +++ b/llama.h @@ -490,6 +490,11 @@ extern "C" { LLAMA_API llama_token llama_token_bos(const struct llama_context * ctx); // beginning-of-sentence LLAMA_API llama_token llama_token_eos(const struct llama_context * ctx); // end-of-sentence LLAMA_API llama_token llama_token_nl (const struct llama_context * ctx); // next-line + // codellama infill tokens + LLAMA_API llama_token llama_token_prefix(const struct llama_context * ctx); // Beginning of infill prefix + LLAMA_API llama_token llama_token_middle(const struct llama_context * ctx); // Beginning of infill middle + LLAMA_API llama_token llama_token_suffix(const struct llama_context * ctx); // Beginning of infill suffix + LLAMA_API llama_token llama_token_eot (const struct llama_context * ctx); // End of infill middle // // Tokenization From ea55295a745c084f588be20710f5a1a12abb1109 Mon Sep 17 00:00:00 2001 From: Kevin Ji <1146876+kevinji@users.noreply.github.com> Date: Mon, 2 Oct 2023 04:53:53 -0400 Subject: [PATCH 18/73] docker : ignore Git files (#3314) --- .dockerignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.dockerignore b/.dockerignore index c6ef6c86c..633bbc3a9 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,9 @@ *.o *.a .cache/ +.git/ +.github/ +.gitignore .vs/ .vscode/ .DS_Store From 095231dfd32679e32300f8ffaf1770b693ea64b0 Mon Sep 17 00:00:00 2001 From: bandoti <141645996+bandoti@users.noreply.github.com> Date: Mon, 2 Oct 2023 06:51:49 -0300 Subject: [PATCH 19/73] cmake : fix transient definitions in find pkg (#3411) --- CMakeLists.txt | 1 + examples/main-cmake-pkg/CMakeLists.txt | 10 ++++++++++ scripts/LlamaConfig.cmake.in | 2 ++ 3 files changed, 13 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index d5acf8540..17d705422 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -705,6 +705,7 @@ set(LLAMA_BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR} set(LLAMA_BUILD_NUMBER ${BUILD_NUMBER}) set(LLAMA_BUILD_COMMIT ${BUILD_COMMIT}) set(LLAMA_INSTALL_VERSION 0.0.${BUILD_NUMBER}) +get_directory_property(LLAMA_TRANSIENT_DEFINES COMPILE_DEFINITIONS) configure_package_config_file( ${CMAKE_CURRENT_SOURCE_DIR}/scripts/LlamaConfig.cmake.in diff --git a/examples/main-cmake-pkg/CMakeLists.txt b/examples/main-cmake-pkg/CMakeLists.txt index 473738719..908131884 100644 --- a/examples/main-cmake-pkg/CMakeLists.txt +++ b/examples/main-cmake-pkg/CMakeLists.txt @@ -28,6 +28,16 @@ configure_file(${_common_path}/../build-info.h target_include_directories(common PUBLIC ${LLAMA_INCLUDE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) +# If the common project was part of "main-cmake-pkg" the transient +# defines would automatically be attached. Because the common func- +# tionality is separate, but dependent upon the defines, it must be +# explicitly extracted from the "llama" target. +# +get_target_property(_llama_transient_defines llama + INTERFACE_COMPILE_DEFINITIONS) + +target_compile_definitions(common PRIVATE "${_llama_transient_defines}") + add_executable(${TARGET} ${CMAKE_CURRENT_LIST_DIR}/../main/main.cpp) target_include_directories(${TARGET} PRIVATE ${_common_path}) install(TARGETS ${TARGET} RUNTIME) diff --git a/scripts/LlamaConfig.cmake.in b/scripts/LlamaConfig.cmake.in index e1fadc361..6a6d8e39e 100644 --- a/scripts/LlamaConfig.cmake.in +++ b/scripts/LlamaConfig.cmake.in @@ -56,11 +56,13 @@ find_library(llama_LIBRARY llama HINTS ${LLAMA_LIB_DIR}) set(_llama_link_deps "Threads::Threads" "@LLAMA_EXTRA_LIBS@") +set(_llama_transient_defines "@LLAMA_TRANSIENT_DEFINES@") add_library(llama UNKNOWN IMPORTED) set_target_properties(llama PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LLAMA_INCLUDE_DIR}" INTERFACE_LINK_LIBRARIES "${_llama_link_deps}" + INTERFACE_COMPILE_DEFINITIONS "${_llama_transient_defines}" IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" IMPORTED_LOCATION "${llama_LIBRARY}" INTERFACE_COMPILE_FEATURES cxx_std_11 From a84767698495d72e44044f1f6db1c1cc721bfd15 Mon Sep 17 00:00:00 2001 From: Adrian Date: Mon, 2 Oct 2023 03:49:59 -0700 Subject: [PATCH 20/73] metal : set log callback before initializing (#3427) --- llama.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/llama.cpp b/llama.cpp index 3a0b2c308..05b570bd1 100644 --- a/llama.cpp +++ b/llama.cpp @@ -6760,13 +6760,14 @@ struct llama_context * llama_new_context_with_model( #ifdef GGML_USE_METAL if (model->n_gpu_layers > 0) { + ggml_metal_log_set_callback(llama_log_callback_default, NULL); + ctx->ctx_metal = ggml_metal_init(1); if (!ctx->ctx_metal) { LLAMA_LOG_ERROR("%s: ggml_metal_init() failed\n", __func__); llama_free(ctx); return NULL; } - ggml_metal_log_set_callback(llama_log_callback_default, NULL); //ggml_metal_graph_find_concurrency(ctx->ctx_metal, gf, false); //ggml_allocr_set_parse_seq(ctx->alloc, ggml_metal_get_concur_list(ctx->ctx_metal), ggml_metal_if_optimized(ctx->ctx_metal)); } From a03ce38455544121c5c00cf845def1443acd6ac8 Mon Sep 17 00:00:00 2001 From: xaedes Date: Mon, 2 Oct 2023 15:15:45 +0200 Subject: [PATCH 21/73] finetune : fix #3404 (#3437) the shapes for init model of gqa models was wrong --- examples/finetune/finetune.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/finetune/finetune.cpp b/examples/finetune/finetune.cpp index 8ca1874da..9ae4bc198 100644 --- a/examples/finetune/finetune.cpp +++ b/examples/finetune/finetune.cpp @@ -332,8 +332,8 @@ static void init_model(struct llama_model * input, struct my_llama_model * model assert_shape_1d(layer.attention_norm, hparams.n_embd); assert_shape_2d(layer.wq, hparams.n_embd, hparams.n_embd); - assert_shape_2d(layer.wk, hparams.n_embd, hparams.n_embd); - assert_shape_2d(layer.wv, hparams.n_embd, hparams.n_embd); + assert_shape_2d(layer.wk, hparams.n_embd, hparams.n_embd_gqa()); + assert_shape_2d(layer.wv, hparams.n_embd, hparams.n_embd_gqa()); assert_shape_2d(layer.wo, hparams.n_embd, hparams.n_embd); assert_shape_1d(layer.ffn_norm, hparams.n_embd); assert_shape_2d(layer.w1, hparams.n_embd, hparams.n_ff); From 9476b012260a2fb6c67976582d64484ce7406ed9 Mon Sep 17 00:00:00 2001 From: cebtenzzre Date: Mon, 2 Oct 2023 09:16:50 -0400 Subject: [PATCH 22/73] cmake : make CUDA flags more similar to the Makefile (#3420) * cmake : fix misuse of cxx_flags * cmake : make CUDA flags more similar to the Makefile * cmake : fix MSVC build --- CMakeLists.txt | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 17d705422..221fc07a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -343,8 +343,9 @@ if (LLAMA_MPI) set(GGML_SOURCES_MPI ggml-mpi.c ggml-mpi.h) add_compile_definitions(GGML_USE_MPI) add_compile_definitions(${MPI_C_COMPILE_DEFINITIONS}) - set(cxx_flags ${cxx_flags} -Wno-cast-qual) - set(c_flags ${c_flags} -Wno-cast-qual) + if (NOT MSVC) + add_compile_options(-Wno-cast-qual) + endif() set(LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS} ${MPI_C_LIBRARIES}) set(LLAMA_EXTRA_INCLUDES ${LLAMA_EXTRA_INCLUDES} ${MPI_C_INCLUDE_DIRS}) # Even if you're only using the C header, C++ programs may bring in MPI @@ -418,10 +419,11 @@ if (LLAMA_ALL_WARNINGS) set(c_flags -Wshadow -Wstrict-prototypes -Wpointer-arith -Wmissing-prototypes -Werror=implicit-int -Werror=implicit-function-declaration) set(cxx_flags -Wmissing-declarations -Wmissing-noreturn) + set(host_cxx_flags "") if (CMAKE_C_COMPILER_ID MATCHES "Clang") set(warning_flags ${warning_flags} -Wunreachable-code-break -Wunreachable-code-return) - set(cxx_flags ${cxx_flags} -Wmissing-prototypes -Wextra-semi) + set(host_cxx_flags ${host_cxx_flags} -Wmissing-prototypes -Wextra-semi) if ( (CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 3.8.0) OR @@ -431,27 +433,38 @@ if (LLAMA_ALL_WARNINGS) endif() elseif (CMAKE_C_COMPILER_ID STREQUAL "GNU") set(c_flags ${c_flags} -Wdouble-promotion) - set(cxx_flags ${cxx_flags} -Wno-array-bounds) + set(host_cxx_flags ${host_cxx_flags} -Wno-array-bounds) if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 7.1.0) - set(cxx_flags ${cxx_flags} -Wno-format-truncation) + set(host_cxx_flags ${host_cxx_flags} -Wno-format-truncation) endif() if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 8.1.0) - set(cxx_flags ${cxx_flags} -Wextra-semi) + set(host_cxx_flags ${host_cxx_flags} -Wextra-semi) endif() endif() else() # todo : msvc endif() - add_compile_options( - ${warning_flags} - "$<$:${c_flags}>" - "$<$:${cxx_flags}>" - ) + set(c_flags ${c_flags} ${warning_flags}) + set(cxx_flags ${cxx_flags} ${warning_flags}) + add_compile_options("$<$:${c_flags}>" + "$<$:${cxx_flags} ${host_cxx_flags}>") endif() +if (NOT MSVC) + set(cuda_flags -Wno-pedantic) +endif() +set(cuda_flags ${cxx_flags} -use_fast_math ${cuda_flags}) + +list(JOIN host_cxx_flags " " cuda_host_flags) # pass host compiler flags as a single argument +if (NOT cuda_host_flags STREQUAL "") + set(cuda_flags ${cuda_flags} -Xcompiler ${cuda_host_flags}) +endif() + +add_compile_options("$<$:${cuda_flags}>") + if (WIN32) add_compile_definitions(_CRT_SECURE_NO_WARNINGS) From 0fe321031a5c670ab5fb5f49d69c4c91d783c93f Mon Sep 17 00:00:00 2001 From: cebtenzzre Date: Mon, 2 Oct 2023 14:58:46 -0400 Subject: [PATCH 23/73] gguf : general usability improvements (#3409) --- convert.py | 5 +- .../convert-finetune-checkpoint-to-gguf.py | 2 +- .../convert-train-checkpoint-to-gguf.py | 2 +- gguf-py/gguf/gguf.py | 210 ++++++++++-------- gguf-py/pyproject.toml | 2 +- 5 files changed, 120 insertions(+), 101 deletions(-) diff --git a/convert.py b/convert.py index 8bb6c7e41..e14b9ef80 100755 --- a/convert.py +++ b/convert.py @@ -41,8 +41,7 @@ if hasattr(faulthandler, 'register') and hasattr(signal, 'SIGUSR1'): NDArray: TypeAlias = 'np.ndarray[Any, Any]' -ARCH=gguf.MODEL_ARCH.LLAMA -NAMES=gguf.MODEL_TENSOR_NAMES[ARCH] +ARCH = gguf.MODEL_ARCH.LLAMA DEFAULT_CONCURRENCY = 8 # @@ -953,7 +952,7 @@ class OutputFile: of.close() def pick_output_type(model: LazyModel, output_type_str: str | None) -> GGMLFileType: - wq_type = model[NAMES[gguf.MODEL_TENSOR.ATTN_Q].format(bid=0)+".weight"].data_type + wq_type = model[gguf.TENSOR_NAMES[gguf.MODEL_TENSOR.ATTN_Q].format(bid=0)+".weight"].data_type if output_type_str == "f32" or (output_type_str is None and wq_type == DT_F32): return GGMLFileType.AllF32 diff --git a/examples/finetune/convert-finetune-checkpoint-to-gguf.py b/examples/finetune/convert-finetune-checkpoint-to-gguf.py index 96d6633ed..c8e14da87 100644 --- a/examples/finetune/convert-finetune-checkpoint-to-gguf.py +++ b/examples/finetune/convert-finetune-checkpoint-to-gguf.py @@ -313,7 +313,7 @@ class ModelParams: gguf_writer.add_feed_forward_length(self.get_n_ff()) def tensor_name(key, bid=None, suffix=".weight"): - return gguf.MODEL_TENSOR_NAMES[gguf.MODEL_ARCH.LLAMA][key].format(bid=bid) + suffix + return gguf.TENSOR_NAMES[key].format(bid=bid) + suffix class Layer: def __init__(self, params, lora_params, bid): diff --git a/examples/train-text-from-scratch/convert-train-checkpoint-to-gguf.py b/examples/train-text-from-scratch/convert-train-checkpoint-to-gguf.py index 351e7bc2d..887ed2e21 100644 --- a/examples/train-text-from-scratch/convert-train-checkpoint-to-gguf.py +++ b/examples/train-text-from-scratch/convert-train-checkpoint-to-gguf.py @@ -364,7 +364,7 @@ class ModelParams: gguf_writer.add_feed_forward_length(self.get_n_ff()) def tensor_name(key, bid=None): - return gguf.MODEL_TENSOR_NAMES[gguf.MODEL_ARCH.LLAMA][key].format(bid=bid) + ".weight" + return gguf.TENSOR_NAMES[key].format(bid=bid) + ".weight" class Layer: def __init__(self, params, bid): diff --git a/gguf-py/gguf/gguf.py b/gguf-py/gguf/gguf.py index 598cf8e59..e83187d30 100644 --- a/gguf-py/gguf/gguf.py +++ b/gguf-py/gguf/gguf.py @@ -118,76 +118,97 @@ MODEL_ARCH_NAMES: dict[MODEL_ARCH, str] = { MODEL_ARCH.STARCODER: "starcoder", } -MODEL_TENSOR_NAMES: dict[MODEL_ARCH, dict[MODEL_TENSOR, str]] = { - MODEL_ARCH.LLAMA: { - MODEL_TENSOR.TOKEN_EMBD: "token_embd", - MODEL_TENSOR.OUTPUT_NORM: "output_norm", - MODEL_TENSOR.OUTPUT: "output", - MODEL_TENSOR.ROPE_FREQS: "rope_freqs", - MODEL_TENSOR.ATTN_NORM: "blk.{bid}.attn_norm", - MODEL_TENSOR.ATTN_Q: "blk.{bid}.attn_q", - MODEL_TENSOR.ATTN_K: "blk.{bid}.attn_k", - MODEL_TENSOR.ATTN_V: "blk.{bid}.attn_v", - MODEL_TENSOR.ATTN_OUT: "blk.{bid}.attn_output", - MODEL_TENSOR.ATTN_ROT_EMBD: "blk.{bid}.attn_rot_embd", - MODEL_TENSOR.FFN_NORM: "blk.{bid}.ffn_norm", - MODEL_TENSOR.FFN_GATE: "blk.{bid}.ffn_gate", - MODEL_TENSOR.FFN_DOWN: "blk.{bid}.ffn_down", - MODEL_TENSOR.FFN_UP: "blk.{bid}.ffn_up", - }, - MODEL_ARCH.GPTNEOX: { - MODEL_TENSOR.TOKEN_EMBD: "token_embd", - MODEL_TENSOR.OUTPUT_NORM: "output_norm", - MODEL_TENSOR.OUTPUT: "output", - MODEL_TENSOR.ATTN_NORM: "blk.{bid}.attn_norm", - MODEL_TENSOR.ATTN_QKV: "blk.{bid}.attn_qkv", - MODEL_TENSOR.ATTN_OUT: "blk.{bid}.attn_output", - MODEL_TENSOR.FFN_NORM: "blk.{bid}.ffn_norm", - MODEL_TENSOR.FFN_DOWN: "blk.{bid}.ffn_down", - MODEL_TENSOR.FFN_UP: "blk.{bid}.ffn_up", - }, - MODEL_ARCH.FALCON: { - MODEL_TENSOR.TOKEN_EMBD: "token_embd", - MODEL_TENSOR.OUTPUT_NORM: "output_norm", - MODEL_TENSOR.OUTPUT: "output", - MODEL_TENSOR.ATTN_NORM: "blk.{bid}.attn_norm", - MODEL_TENSOR.ATTN_NORM_2: "blk.{bid}.attn_norm_2", - MODEL_TENSOR.ATTN_QKV: "blk.{bid}.attn_qkv", - MODEL_TENSOR.ATTN_OUT: "blk.{bid}.attn_output", - MODEL_TENSOR.FFN_DOWN: "blk.{bid}.ffn_down", - MODEL_TENSOR.FFN_UP: "blk.{bid}.ffn_up", - }, - MODEL_ARCH.BAICHUAN: { - MODEL_TENSOR.TOKEN_EMBD: "token_embd", - MODEL_TENSOR.OUTPUT_NORM: "output_norm", - MODEL_TENSOR.OUTPUT: "output", - MODEL_TENSOR.ROPE_FREQS: "rope_freqs", - MODEL_TENSOR.ATTN_NORM: "blk.{bid}.attn_norm", - MODEL_TENSOR.ATTN_Q: "blk.{bid}.attn_q", - MODEL_TENSOR.ATTN_K: "blk.{bid}.attn_k", - MODEL_TENSOR.ATTN_V: "blk.{bid}.attn_v", - MODEL_TENSOR.ATTN_OUT: "blk.{bid}.attn_output", - MODEL_TENSOR.ATTN_ROT_EMBD: "blk.{bid}.attn_rot_embd", - MODEL_TENSOR.FFN_NORM: "blk.{bid}.ffn_norm", - MODEL_TENSOR.FFN_GATE: "blk.{bid}.ffn_gate", - MODEL_TENSOR.FFN_DOWN: "blk.{bid}.ffn_down", - MODEL_TENSOR.FFN_UP: "blk.{bid}.ffn_up", - }, - MODEL_ARCH.STARCODER: { - MODEL_TENSOR.TOKEN_EMBD: "token_embd", - MODEL_TENSOR.POS_EMBD: "position_embd", - MODEL_TENSOR.OUTPUT_NORM: "output_norm", - MODEL_TENSOR.OUTPUT: "output", - MODEL_TENSOR.ATTN_NORM: "blk.{bid}.attn_norm", - MODEL_TENSOR.ATTN_QKV: "blk.{bid}.attn_qkv", - MODEL_TENSOR.ATTN_OUT: "blk.{bid}.attn_output", - MODEL_TENSOR.FFN_NORM: "blk.{bid}.ffn_norm", - MODEL_TENSOR.FFN_DOWN: "blk.{bid}.ffn_down", - MODEL_TENSOR.FFN_UP: "blk.{bid}.ffn_up", - }, - MODEL_ARCH.GPT2: { +TENSOR_NAMES: dict[MODEL_TENSOR, str] = { + MODEL_TENSOR.TOKEN_EMBD: "token_embd", + MODEL_TENSOR.POS_EMBD: "position_embd", + MODEL_TENSOR.OUTPUT_NORM: "output_norm", + MODEL_TENSOR.OUTPUT: "output", + MODEL_TENSOR.ROPE_FREQS: "rope_freqs", + + MODEL_TENSOR.ATTN_NORM: "blk.{bid}.attn_norm", + MODEL_TENSOR.ATTN_NORM_2: "blk.{bid}.attn_norm_2", + MODEL_TENSOR.ATTN_QKV: "blk.{bid}.attn_qkv", + MODEL_TENSOR.ATTN_Q: "blk.{bid}.attn_q", + MODEL_TENSOR.ATTN_K: "blk.{bid}.attn_k", + MODEL_TENSOR.ATTN_V: "blk.{bid}.attn_v", + MODEL_TENSOR.ATTN_OUT: "blk.{bid}.attn_output", + MODEL_TENSOR.ATTN_ROT_EMBD: "blk.{bid}.attn_rot_embd", + MODEL_TENSOR.FFN_NORM: "blk.{bid}.ffn_norm", + MODEL_TENSOR.FFN_GATE: "blk.{bid}.ffn_gate", + MODEL_TENSOR.FFN_DOWN: "blk.{bid}.ffn_down", + MODEL_TENSOR.FFN_UP: "blk.{bid}.ffn_up", +} + +MODEL_TENSORS: dict[MODEL_ARCH, list[MODEL_TENSOR]] = { + MODEL_ARCH.LLAMA: [ + MODEL_TENSOR.TOKEN_EMBD, + MODEL_TENSOR.OUTPUT_NORM, + MODEL_TENSOR.OUTPUT, + MODEL_TENSOR.ROPE_FREQS, + MODEL_TENSOR.ATTN_NORM, + MODEL_TENSOR.ATTN_Q, + MODEL_TENSOR.ATTN_K, + MODEL_TENSOR.ATTN_V, + MODEL_TENSOR.ATTN_OUT, + MODEL_TENSOR.ATTN_ROT_EMBD, + MODEL_TENSOR.FFN_NORM, + MODEL_TENSOR.FFN_GATE, + MODEL_TENSOR.FFN_DOWN, + MODEL_TENSOR.FFN_UP, + ], + MODEL_ARCH.GPTNEOX: [ + MODEL_TENSOR.TOKEN_EMBD, + MODEL_TENSOR.OUTPUT_NORM, + MODEL_TENSOR.OUTPUT, + MODEL_TENSOR.ATTN_NORM, + MODEL_TENSOR.ATTN_QKV, + MODEL_TENSOR.ATTN_OUT, + MODEL_TENSOR.FFN_NORM, + MODEL_TENSOR.FFN_DOWN, + MODEL_TENSOR.FFN_UP, + ], + MODEL_ARCH.FALCON: [ + MODEL_TENSOR.TOKEN_EMBD, + MODEL_TENSOR.OUTPUT_NORM, + MODEL_TENSOR.OUTPUT, + MODEL_TENSOR.ATTN_NORM, + MODEL_TENSOR.ATTN_NORM_2, + MODEL_TENSOR.ATTN_QKV, + MODEL_TENSOR.ATTN_OUT, + MODEL_TENSOR.FFN_DOWN, + MODEL_TENSOR.FFN_UP, + ], + MODEL_ARCH.BAICHUAN: [ + MODEL_TENSOR.TOKEN_EMBD, + MODEL_TENSOR.OUTPUT_NORM, + MODEL_TENSOR.OUTPUT, + MODEL_TENSOR.ROPE_FREQS, + MODEL_TENSOR.ATTN_NORM, + MODEL_TENSOR.ATTN_Q, + MODEL_TENSOR.ATTN_K, + MODEL_TENSOR.ATTN_V, + MODEL_TENSOR.ATTN_OUT, + MODEL_TENSOR.ATTN_ROT_EMBD, + MODEL_TENSOR.FFN_NORM, + MODEL_TENSOR.FFN_GATE, + MODEL_TENSOR.FFN_DOWN, + MODEL_TENSOR.FFN_UP, + ], + MODEL_ARCH.STARCODER: [ + MODEL_TENSOR.TOKEN_EMBD, + MODEL_TENSOR.POS_EMBD, + MODEL_TENSOR.OUTPUT_NORM, + MODEL_TENSOR.OUTPUT, + MODEL_TENSOR.ATTN_NORM, + MODEL_TENSOR.ATTN_QKV, + MODEL_TENSOR.ATTN_OUT, + MODEL_TENSOR.FFN_NORM, + MODEL_TENSOR.FFN_DOWN, + MODEL_TENSOR.FFN_UP, + ], + MODEL_ARCH.GPT2: [ # TODO - }, + ], # TODO } @@ -338,28 +359,24 @@ class TensorNameMap: mapping: dict[str, tuple[MODEL_TENSOR, str]] - tensor_names: dict[MODEL_TENSOR, str] - def __init__(self, arch: MODEL_ARCH, n_blocks: int): - mapping = self.mapping = {} - tensor_names = self.tensor_names = MODEL_TENSOR_NAMES[arch] + self.mapping = {} for tensor, keys in self.mappings_cfg.items(): - tensor_name = tensor_names.get(tensor) - if tensor_name is None: + if tensor not in MODEL_TENSORS[arch]: continue - mapping[tensor_name] = (tensor, tensor_name) + tensor_name = TENSOR_NAMES[tensor] + self.mapping[tensor_name] = (tensor, tensor_name) for key in keys: - mapping[key] = (tensor, tensor_name) + self.mapping[key] = (tensor, tensor_name) for bid in range(n_blocks): for tensor, keys in self.block_mappings_cfg.items(): - tensor_name = tensor_names.get(tensor) - if tensor_name is None: + if tensor not in MODEL_TENSORS[arch]: continue - tensor_name = tensor_name.format(bid = bid) - mapping[tensor_name] = (tensor, tensor_name) + tensor_name = TENSOR_NAMES[tensor].format(bid = bid) + self.mapping[tensor_name] = (tensor, tensor_name) for key in keys: key = key.format(bid = bid) - mapping[key] = (tensor, tensor_name) + self.mapping[key] = (tensor, tensor_name) def get_type_and_name(self, key: str, try_suffixes: Sequence[str] = ()) -> tuple[MODEL_TENSOR, str] | None: result = self.mapping.get(key) @@ -800,22 +817,25 @@ class SpecialVocab: special_token_types: tuple[str, ...] = ('bos', 'eos', 'unk', 'sep', 'pad') special_token_ids: dict[str, int] = {} - def __init__(self, path: Path, load_merges: bool = False, special_token_types: tuple[str, ...] | None = None): + def __init__( + self, path: str | os.PathLike[str], load_merges: bool = False, + special_token_types: tuple[str, ...] | None = None, + ): self.special_token_ids = {} self.load_merges = load_merges if special_token_types is not None: self.special_token_types = special_token_types - self.load(path) + self._load(Path(path)) - def load(self, path: Path): - if not self.try_load_from_tokenizer_json(path): - self.try_load_from_config_json(path) + def _load(self, path: Path) -> None: + if not self._try_load_from_tokenizer_json(path): + self._try_load_from_config_json(path) - def try_load_from_tokenizer_json(self, path: Path) -> bool: + def _try_load_from_tokenizer_json(self, path: Path) -> bool: tokenizer_file = path / 'tokenizer.json' if not tokenizer_file.is_file(): return False - with open(tokenizer_file, 'r', encoding = 'utf-8') as f: + with open(tokenizer_file, encoding = 'utf-8') as f: tokenizer = json.load(f) if self.load_merges: merges = tokenizer.get('model', {}).get('merges') @@ -825,7 +845,7 @@ class SpecialVocab: added_tokens = tokenizer.get('added_tokens') if added_tokens is None or not tokenizer_config_file.is_file(): return True - with open(tokenizer_config_file, 'r', encoding = 'utf-8') as f: + with open(tokenizer_config_file, encoding = 'utf-8') as f: tokenizer_config = json.load(f) for typ in self.special_token_types: entry = tokenizer_config.get(f'{typ}_token') @@ -844,11 +864,11 @@ class SpecialVocab: break return True - def try_load_from_config_json(self, path: Path) -> bool: + def _try_load_from_config_json(self, path: Path) -> bool: config_file = path / 'config.json' if not config_file.is_file(): return False - with open(config_file, 'r', encoding = 'utf-8') as f: + with open(config_file, encoding = 'utf-8') as f: config = json.load(f) for typ in self.special_token_types: maybe_token_id = config.get(f'{typ}_token_id') @@ -856,7 +876,7 @@ class SpecialVocab: self.special_token_ids[typ] = maybe_token_id return True - def add_to_gguf(self, gw: GGUFWriter): + def add_to_gguf(self, gw: GGUFWriter) -> None: if len(self.merges) > 0: print(f'gguf: Adding {len(self.merges)} merge(s).') gw.add_token_merges(self.merges) @@ -868,8 +888,8 @@ class SpecialVocab: print(f'gguf: Setting special token type {typ} to {tokid}') handler(tokid) - def __repr__(self): - return f'' + def __repr__(self) -> str: + return f'' # Example usage: diff --git a/gguf-py/pyproject.toml b/gguf-py/pyproject.toml index 9489ccd6f..400607ce1 100644 --- a/gguf-py/pyproject.toml +++ b/gguf-py/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "gguf" -version = "0.3.3" +version = "0.4.0" description = "Write ML models in GGUF for GGML" authors = ["GGML "] packages = [ From 29a404a951fb0b3f9c3b6ab8c4c9c76ac50d2bb3 Mon Sep 17 00:00:00 2001 From: cebtenzzre Date: Mon, 2 Oct 2023 15:20:28 -0400 Subject: [PATCH 24/73] gguf : add BERT, MPT, and GPT-J arch info (#3408) --- gguf-py/gguf/gguf.py | 170 +++++++++++++++++++++++++++++-------------- 1 file changed, 117 insertions(+), 53 deletions(-) diff --git a/gguf-py/gguf/gguf.py b/gguf-py/gguf/gguf.py index e83187d30..c975da0cb 100644 --- a/gguf-py/gguf/gguf.py +++ b/gguf-py/gguf/gguf.py @@ -85,10 +85,12 @@ class MODEL_ARCH(IntEnum): GPTNEOX : int = auto() MPT : int = auto() STARCODER : int = auto() + BERT : int = auto() class MODEL_TENSOR(IntEnum): TOKEN_EMBD : int = auto() + TOKEN_TYPES : int = auto() POS_EMBD : int = auto() OUTPUT : int = auto() OUTPUT_NORM : int = auto() @@ -116,10 +118,12 @@ MODEL_ARCH_NAMES: dict[MODEL_ARCH, str] = { MODEL_ARCH.GPTNEOX: "gptneox", MODEL_ARCH.MPT: "mpt", MODEL_ARCH.STARCODER: "starcoder", + MODEL_ARCH.BERT: "bert", } TENSOR_NAMES: dict[MODEL_TENSOR, str] = { MODEL_TENSOR.TOKEN_EMBD: "token_embd", + MODEL_TENSOR.TOKEN_TYPES: "token_types", MODEL_TENSOR.POS_EMBD: "position_embd", MODEL_TENSOR.OUTPUT_NORM: "output_norm", MODEL_TENSOR.OUTPUT: "output", @@ -206,6 +210,43 @@ MODEL_TENSORS: dict[MODEL_ARCH, list[MODEL_TENSOR]] = { MODEL_TENSOR.FFN_DOWN, MODEL_TENSOR.FFN_UP, ], + MODEL_ARCH.BERT: [ + MODEL_TENSOR.TOKEN_EMBD, + MODEL_TENSOR.TOKEN_TYPES, + MODEL_TENSOR.POS_EMBD, + MODEL_TENSOR.OUTPUT_NORM, + MODEL_TENSOR.ATTN_NORM, + MODEL_TENSOR.ATTN_Q, + MODEL_TENSOR.ATTN_K, + MODEL_TENSOR.ATTN_V, + MODEL_TENSOR.ATTN_OUT, + MODEL_TENSOR.FFN_NORM, + MODEL_TENSOR.FFN_DOWN, + MODEL_TENSOR.FFN_UP, + ], + MODEL_ARCH.MPT: [ + MODEL_TENSOR.TOKEN_EMBD, + MODEL_TENSOR.OUTPUT_NORM, + MODEL_TENSOR.OUTPUT, + MODEL_TENSOR.ATTN_NORM, + MODEL_TENSOR.ATTN_QKV, + MODEL_TENSOR.ATTN_OUT, + MODEL_TENSOR.FFN_NORM, + MODEL_TENSOR.FFN_DOWN, + MODEL_TENSOR.FFN_UP, + ], + MODEL_ARCH.GPTJ: [ + MODEL_TENSOR.TOKEN_EMBD, + MODEL_TENSOR.OUTPUT_NORM, + MODEL_TENSOR.OUTPUT, + MODEL_TENSOR.ATTN_NORM, + MODEL_TENSOR.ATTN_Q, + MODEL_TENSOR.ATTN_K, + MODEL_TENSOR.ATTN_V, + MODEL_TENSOR.ATTN_OUT, + MODEL_TENSOR.FFN_DOWN, + MODEL_TENSOR.FFN_UP, + ], MODEL_ARCH.GPT2: [ # TODO ], @@ -229,31 +270,40 @@ class TensorNameMap: mappings_cfg: dict[MODEL_TENSOR, tuple[str, ...]] = { # Token embeddings MODEL_TENSOR.TOKEN_EMBD: ( - "gpt_neox.embed_in", # gptneox - "transformer.wte", # gpt2 mpt - "transformer.word_embeddings", # falcon - "model.embed_tokens", # llama-hf - "tok_embeddings", # llama-pth + "gpt_neox.embed_in", # gptneox + "transformer.wte", # gpt2 gpt-j mpt + "transformer.word_embeddings", # falcon + "model.embed_tokens", # llama-hf + "tok_embeddings", # llama-pth + "embeddings.word_embeddings", # bert + ), + + # Token type embeddings + MODEL_TENSOR.TOKEN_TYPES: ( + "embeddings.token_type_embeddings", # bert ), # Position embeddings MODEL_TENSOR.POS_EMBD: ( - "transformer.wpe", # gpt2 + "transformer.wpe", # gpt2 + "embeddings.position_embeddings", # bert ), # Output MODEL_TENSOR.OUTPUT: ( - "embed_out", # gptneox - "lm_head", # gpt2 mpt falcon llama-hf baichuan - "output", # llama-pth + "embed_out", # gptneox + "lm_head", # gpt2 gpt-j mpt falcon llama-hf baichuan + "output", # llama-pth ), # Output norm MODEL_TENSOR.OUTPUT_NORM: ( - "gpt_neox.final_layer_norm", # gptneox - "transformer.ln_f", # gpt2 falcon - "model.norm", # llama-hf baichuan - "norm", # llama-pth + "gpt_neox.final_layer_norm", # gptneox + "transformer.ln_f", # gpt2 gpt-j falcon + "model.norm", # llama-hf baichuan + "norm", # llama-pth + "embeddings.LayerNorm", # bert + "transformer.norm_f", # mpt ), # Rope frequencies @@ -265,13 +315,14 @@ class TensorNameMap: block_mappings_cfg: dict[MODEL_TENSOR, tuple[str, ...]] = { # Attention norm MODEL_TENSOR.ATTN_NORM: ( - "gpt_neox.layers.{bid}.input_layernorm", # gptneox - "transformer.h.{bid}.ln_1", # gpt2 - "transformer.blocks.{bid}.norm_1", # mpt - "transformer.h.{bid}.input_layernorm", # falcon7b - "transformer.h.{bid}.ln_mlp", # falcon40b - "model.layers.{bid}.input_layernorm", # llama-hf - "layers.{bid}.attention_norm", # llama-pth + "gpt_neox.layers.{bid}.input_layernorm", # gptneox + "transformer.h.{bid}.ln_1", # gpt2 gpt-j + "transformer.blocks.{bid}.norm_1", # mpt + "transformer.h.{bid}.input_layernorm", # falcon7b + "transformer.h.{bid}.ln_mlp", # falcon40b + "model.layers.{bid}.input_layernorm", # llama-hf + "layers.{bid}.attention_norm", # llama-pth + "encoder.layer.{bid}.attention.output.LayerNorm", # bert ), # Attention norm 2 @@ -281,38 +332,46 @@ class TensorNameMap: # Attention query-key-value MODEL_TENSOR.ATTN_QKV: ( - "gpt_neox.layers.{bid}.attention.query_key_value", # gptneox - "transformer.h.{bid}.attn.c_attn", # gpt2 - "transformer.blocks.{bid}.attn.Wqkv", # mpt - "transformer.h.{bid}.self_attention.query_key_value", # falcon + "gpt_neox.layers.{bid}.attention.query_key_value", # gptneox + "transformer.h.{bid}.attn.c_attn", # gpt2 + "transformer.blocks.{bid}.attn.Wqkv", # mpt + "transformer.h.{bid}.self_attention.query_key_value", # falcon ), # Attention query MODEL_TENSOR.ATTN_Q: ( - "model.layers.{bid}.self_attn.q_proj", # llama-hf - "layers.{bid}.attention.wq", # llama-pth + "model.layers.{bid}.self_attn.q_proj", # llama-hf + "layers.{bid}.attention.wq", # llama-pth + "encoder.layer.{bid}.attention.self.query", # bert + "transformer.h.{bid}.attn.q_proj", # gpt-j ), # Attention key MODEL_TENSOR.ATTN_K: ( - "model.layers.{bid}.self_attn.k_proj", # llama-hf - "layers.{bid}.attention.wk", # llama-pth + "model.layers.{bid}.self_attn.k_proj", # llama-hf + "layers.{bid}.attention.wk", # llama-pth + "encoder.layer.{bid}.attention.self.key", # bert + "transformer.h.{bid}.attn.k_proj", # gpt-j ), # Attention value MODEL_TENSOR.ATTN_V: ( - "model.layers.{bid}.self_attn.v_proj", # llama-hf - "layers.{bid}.attention.wv", # llama-pth + "model.layers.{bid}.self_attn.v_proj", # llama-hf + "layers.{bid}.attention.wv", # llama-pth + "encoder.layer.{bid}.attention.self.value", # bert + "transformer.h.{bid}.attn.v_proj", # gpt-j ), # Attention output MODEL_TENSOR.ATTN_OUT: ( - "gpt_neox.layers.{bid}.attention.dense", # gptneox - "transformer.h.{bid}.attn.c_proj", # gpt2 - "transformer.blocks.{bid}.attn.out_proj", # mpt - "transformer.h.{bid}.self_attention.dense", # falcon - "model.layers.{bid}.self_attn.o_proj", # llama-hf - "layers.{bid}.attention.wo", # llama-pth + "gpt_neox.layers.{bid}.attention.dense", # gptneox + "transformer.h.{bid}.attn.c_proj", # gpt2 + "transformer.blocks.{bid}.attn.out_proj", # mpt + "transformer.h.{bid}.self_attention.dense", # falcon + "model.layers.{bid}.self_attn.o_proj", # llama-hf + "layers.{bid}.attention.wo", # llama-pth + "encoder.layer.{bid}.attention.output.dense", # bert + "transformer.h.{bid}.attn.out_proj", # gpt-j ), # Rotary embeddings @@ -323,21 +382,24 @@ class TensorNameMap: # Feed-forward norm MODEL_TENSOR.FFN_NORM: ( - "gpt_neox.layers.{bid}.post_attention_layernorm", # gptneox - "transformer.h.{bid}.ln_2", # gpt2 - "transformer.blocks.{bid}.norm_2", # mpt - "model.layers.{bid}.post_attention_layernorm", # llama-hf - "layers.{bid}.ffn_norm", # llama-pth + "gpt_neox.layers.{bid}.post_attention_layernorm", # gptneox + "transformer.h.{bid}.ln_2", # gpt2 + "transformer.blocks.{bid}.norm_2", # mpt + "model.layers.{bid}.post_attention_layernorm", # llama-hf + "layers.{bid}.ffn_norm", # llama-pth + "encoder.layer.{bid}.output.LayerNorm", # bert ), # Feed-forward up MODEL_TENSOR.FFN_UP: ( - "gpt_neox.layers.{bid}.mlp.dense_h_to_4h", # gptneox - "transformer.h.{bid}.mlp.c_fc", # gpt2 - "transformer.blocks.{bid}.ffn.up_proj", # mpt - "transformer.h.{bid}.mlp.dense_h_to_4h", # falcon - "model.layers.{bid}.mlp.up_proj", # llama-hf - "layers.{bid}.feed_forward.w3", # llama-pth + "gpt_neox.layers.{bid}.mlp.dense_h_to_4h", # gptneox + "transformer.h.{bid}.mlp.c_fc", # gpt2 + "transformer.blocks.{bid}.ffn.up_proj", # mpt + "transformer.h.{bid}.mlp.dense_h_to_4h", # falcon + "model.layers.{bid}.mlp.up_proj", # llama-hf + "layers.{bid}.feed_forward.w3", # llama-pth + "encoder.layer.{bid}.intermediate.dense", # bert + "transformer.h.{bid}.mlp.fc_in", # gpt-j ), # Feed-forward gate @@ -348,12 +410,14 @@ class TensorNameMap: # Feed-forward down MODEL_TENSOR.FFN_DOWN: ( - "gpt_neox.layers.{bid}.mlp.dense_4h_to_h", # gptneox - "transformer.h.{bid}.mlp.c_proj", # gpt2 - "transformer.blocks.{bid}.ffn.down_proj", # mpt - "transformer.h.{bid}.mlp.dense_4h_to_h", # falcon - "model.layers.{bid}.mlp.down_proj", # llama-hf - "layers.{bid}.feed_forward.w2", # llama-pth + "gpt_neox.layers.{bid}.mlp.dense_4h_to_h", # gptneox + "transformer.h.{bid}.mlp.c_proj", # gpt2 + "transformer.blocks.{bid}.ffn.down_proj", # mpt + "transformer.h.{bid}.mlp.dense_4h_to_h", # falcon + "model.layers.{bid}.mlp.down_proj", # llama-hf + "layers.{bid}.feed_forward.w2", # llama-pth + "encoder.layer.{bid}.output.dense", # bert + "transformer.h.{bid}.mlp.fc_out", # gpt-j ), } From 665018c749101e81c816675198e731e47d6b1dbe Mon Sep 17 00:00:00 2001 From: shibe2 Date: Mon, 2 Oct 2023 23:26:15 +0400 Subject: [PATCH 25/73] CLBlast: Add broadcast support for matrix multiplication (#3402) Broadcast src0 into src1 across dimensions 2 and 3 when needed. This is required for models that use GQA. --- ggml-opencl.cpp | 90 ++++++++++++++++++++++++++++++++++++------------- ggml.c | 5 --- 2 files changed, 67 insertions(+), 28 deletions(-) diff --git a/ggml-opencl.cpp b/ggml-opencl.cpp index c7d9150fe..7e4069d76 100644 --- a/ggml-opencl.cpp +++ b/ggml-opencl.cpp @@ -1476,10 +1476,15 @@ static void ggml_cl_mul_mat_f32(const ggml_tensor * src0, const ggml_tensor * sr const int64_t ne10 = src1->ne[0]; const int64_t ne11 = src1->ne[1]; + const int64_t ne12 = src1->ne[2]; + const int64_t ne13 = src1->ne[3]; const int nb2 = dst->nb[2]; const int nb3 = dst->nb[3]; + const int64_t r2 = ne12 / ne02; + const int64_t r3 = ne13 / ne03; + const float alpha = 1.0f; const float beta = 0.0f; const int x_ne = ne01 * ne00; @@ -1498,13 +1503,22 @@ static void ggml_cl_mul_mat_f32(const ggml_tensor * src0, const ggml_tensor * sr cl_mem d_Y = ggml_cl_pool_malloc(sizeof(float) * y_ne, &y_size); cl_mem d_D = ggml_cl_pool_malloc(sizeof(float) * d_ne, &d_size); - for (int64_t i03 = 0; i03 < ne03; i03++) { - for (int64_t i02 = 0; i02 < ne02; i02++) { + int64_t pi02 = -1; + int64_t pi03 = -1; + + for (int64_t i13 = 0; i13 < ne13; i13++) { + int64_t i03 = i13 / r3; + + for (int64_t i12 = 0; i12 < ne12; i12++) { + int64_t i02 = i12 / r2; + // copy data to device - if (src0->backend != GGML_BACKEND_GPU) { + if (src0->backend != GGML_BACKEND_GPU && (i02 != pi02 || i03 != pi03)) { CL_CHECK(ggml_cl_h2d_tensor_2d(queue, d_X, 0, src0, i03, i02, NULL)); + pi02 = i02; + pi03 = i03; } - CL_CHECK(ggml_cl_h2d_tensor_2d(queue, d_Y, 0, src1, i03, i02, NULL)); + CL_CHECK(ggml_cl_h2d_tensor_2d(queue, d_Y, 0, src1, i13, i12, NULL)); CL_CHECK(clFinish(queue)); @@ -1525,7 +1539,7 @@ static void ggml_cl_mul_mat_f32(const ggml_tensor * src0, const ggml_tensor * sr } // copy dst to host - float * d = (float *) ((char *) dst->data + i02*nb2 + i03*nb3); + float * d = (float *) ((char *) dst->data + i12*nb2 + i13*nb3); CL_CHECK(clEnqueueReadBuffer(queue, d_D, true, 0, sizeof(float) * d_ne, d, 1, &ev_sgemm, NULL)); } } @@ -1547,6 +1561,8 @@ static void ggml_cl_mul_mat_f16(const ggml_tensor * src0, const ggml_tensor * sr const int64_t ne10 = src1->ne[0]; const int64_t ne11 = src1->ne[1]; + const int64_t ne12 = src1->ne[2]; + const int64_t ne13 = src1->ne[3]; const int nb10 = src1->nb[0]; const int nb11 = src1->nb[1]; @@ -1556,6 +1572,9 @@ static void ggml_cl_mul_mat_f16(const ggml_tensor * src0, const ggml_tensor * sr const int nb2 = dst->nb[2]; const int nb3 = dst->nb[3]; + const int64_t r2 = ne12 / ne02; + const int64_t r3 = ne13 / ne03; + const ggml_fp16_t alpha = ggml_fp32_to_fp16(1.0f); const ggml_fp16_t beta = ggml_fp32_to_fp16(0.0f); const int x_ne = ne01 * ne00; @@ -1577,32 +1596,41 @@ static void ggml_cl_mul_mat_f16(const ggml_tensor * src0, const ggml_tensor * sr bool src1_cont_rows = nb10 == sizeof(float); bool src1_cont_cols = (size_t)nb11 == ne11*sizeof(float); - for (int64_t i03 = 0; i03 < ne03; i03++) { - for (int64_t i02 = 0; i02 < ne02; i02++) { + int64_t pi02 = -1; + int64_t pi03 = -1; + + for (int64_t i13 = 0; i13 < ne13; i13++) { + int64_t i03 = i13 / r3; + + for (int64_t i12 = 0; i12 < ne12; i12++) { + int64_t i02 = i12 / r2; + // copy src0 to device - if (src0->backend != GGML_BACKEND_GPU) { + if (src0->backend != GGML_BACKEND_GPU && (i02 != pi02 || i03 != pi03)) { CL_CHECK(ggml_cl_h2d_tensor_2d(queue, d_X, 0, src0, i03, i02, NULL)); + pi02 = i02; + pi03 = i03; } // convert src1 to fp16 // TODO: use multiple threads - ggml_fp16_t * const tmp = (ggml_fp16_t *) wdata + (ne11 * ne10) * (i03 * ne02 + i02); - char * src1i = (char *) src1->data + i03*nb13 + i02*nb12; + ggml_fp16_t * const tmp = (ggml_fp16_t *) wdata + (ne11 * ne10) * (i13 * ne12 + i12); + char * src1i = (char *) src1->data + i13*nb13 + i12*nb12; if (src1_cont_rows) { if (src1_cont_cols) { ggml_fp32_to_fp16_row((float *) src1i, tmp, ne10*ne11); } else { - for (int64_t i01 = 0; i01 < ne11; i01++) { - ggml_fp32_to_fp16_row((float *) (src1i + i01*nb11), tmp + i01*ne10, ne10); + for (int64_t i11 = 0; i11 < ne11; i11++) { + ggml_fp32_to_fp16_row((float *) (src1i + i11*nb11), tmp + i11*ne10, ne10); } } } else { - for (int64_t i01 = 0; i01 < ne11; i01++) { - for (int64_t i00 = 0; i00 < ne10; i00++) { + for (int64_t i11 = 0; i11 < ne11; i11++) { + for (int64_t i10 = 0; i10 < ne10; i10++) { // very slow due to no inlining - tmp[i01*ne10 + i00] = ggml_fp32_to_fp16(*(float *) (src1i + i01*nb11 + i00*nb10)); + tmp[i11*ne10 + i10] = ggml_fp32_to_fp16(*(float *) (src1i + i11*nb11 + i10*nb10)); } } } @@ -1631,7 +1659,7 @@ static void ggml_cl_mul_mat_f16(const ggml_tensor * src0, const ggml_tensor * sr // copy dst to host, then convert to float CL_CHECK(clEnqueueReadBuffer(queue, d_D, true, 0, sizeof(ggml_fp16_t) * d_ne, tmp, 1, &ev_sgemm, NULL)); - float * d = (float *) ((char *) dst->data + i02*nb2 + i03*nb3); + float * d = (float *) ((char *) dst->data + i12*nb2 + i13*nb3); ggml_fp16_to_fp32_row(tmp, d, d_ne); } @@ -1652,12 +1680,17 @@ static void ggml_cl_mul_mat_q_f32(const ggml_tensor * src0, const ggml_tensor * const int64_t ne10 = src1->ne[0]; const int64_t ne11 = src1->ne[1]; + const int64_t ne12 = src1->ne[2]; + const int64_t ne13 = src1->ne[3]; const int nb2 = dst->nb[2]; const int nb3 = dst->nb[3]; const ggml_type type = src0->type; const bool mul_mat_vec = ne11 == 1; + const int64_t r2 = ne12 / ne02; + const int64_t r3 = ne13 / ne03; + const float alpha = 1.0f; const float beta = 0.0f; const int x_ne = ne01 * ne00; @@ -1690,12 +1723,23 @@ static void ggml_cl_mul_mat_q_f32(const ggml_tensor * src0, const ggml_tensor * size_t ev_idx = 0; std::vector events; - for (int64_t i03 = 0; i03 < ne03; i03++) { - for (int64_t i02 = 0; i02 < ne02; i02++) { + int64_t pi02 = -1; + int64_t pi03 = -1; + + for (int64_t i13 = 0; i13 < ne13; i13++) { + int64_t i03 = i13 / r3; + + for (int64_t i12 = 0; i12 < ne12; i12++) { + int64_t i02 = i12 / r2; + // copy src0 to device if necessary if (src0->backend == GGML_BACKEND_CPU) { - events.emplace_back(); - CL_CHECK(ggml_cl_h2d_tensor_2d(queue, d_Q, 0, src0, i03, i02, events.data() + ev_idx++)); + if (i02 != pi02 || i03 != pi03) { + events.emplace_back(); + CL_CHECK(ggml_cl_h2d_tensor_2d(queue, d_Q, 0, src0, i03, i02, events.data() + ev_idx++)); + pi02 = i02; + pi03 = i03; + } } else if (src0->backend == GGML_BACKEND_GPU) { d_Q = (cl_mem) src0->extra; } else { @@ -1704,7 +1748,7 @@ static void ggml_cl_mul_mat_q_f32(const ggml_tensor * src0, const ggml_tensor * if (mul_mat_vec) { // specialized dequantize_mul_mat_vec kernel // copy src1 to device events.emplace_back(); - CL_CHECK(ggml_cl_h2d_tensor_2d(queue, d_Y, 0, src1, i03, i02, events.data() + ev_idx++)); + CL_CHECK(ggml_cl_h2d_tensor_2d(queue, d_Y, 0, src1, i13, i12, events.data() + ev_idx++)); // compute const size_t global = ne01 * CL_DMMV_BLOCK_SIZE; @@ -1725,7 +1769,7 @@ static void ggml_cl_mul_mat_q_f32(const ggml_tensor * src0, const ggml_tensor * CL_CHECK(clEnqueueNDRangeKernel(queue, *to_fp32_cl, 1, NULL, &global, local > 0 ? &local : NULL, events.size(), !events.empty() ? events.data() : NULL, NULL)); // copy src1 to device - CL_CHECK(ggml_cl_h2d_tensor_2d(queue, d_Y, 0, src1, i03, i02, NULL)); + CL_CHECK(ggml_cl_h2d_tensor_2d(queue, d_Y, 0, src1, i13, i12, NULL)); events.emplace_back(); @@ -1749,7 +1793,7 @@ static void ggml_cl_mul_mat_q_f32(const ggml_tensor * src0, const ggml_tensor * } // copy dst to host - float * d = (float *) ((char *) dst->data + i02*nb2 + i03*nb3); + float * d = (float *) ((char *) dst->data + i12*nb2 + i13*nb3); CL_CHECK(clEnqueueReadBuffer(queue, d_D, true, 0, sizeof(float) * d_ne, d, 1, &events[events.size() - 1], NULL)); for (auto *event : events) { clReleaseEvent(event); diff --git a/ggml.c b/ggml.c index 820fe2e74..bf1426d25 100644 --- a/ggml.c +++ b/ggml.c @@ -11621,11 +11621,6 @@ static void ggml_compute_forward_mul_mat( #if defined(GGML_USE_CLBLAST) if (ggml_cl_can_mul_mat(src0, src1, dst)) { - // TODO: handle case when src0 is broadcast-able into src1 across 2nd,3rd dimension - // ref: https://github.com/ggerganov/ggml/pull/224 - GGML_ASSERT(ne02 == ne12); - GGML_ASSERT(ne03 == ne13); - if (params->ith == 0 && params->type == GGML_TASK_COMPUTE) { ggml_cl_mul_mat(src0, src1, dst, params->wdata, params->wsize); } From e78f0b0d0572168f328dd0e2ed3175a53fe52acc Mon Sep 17 00:00:00 2001 From: cebtenzzre Date: Mon, 2 Oct 2023 15:38:43 -0400 Subject: [PATCH 26/73] cmake : increase minimum version for add_link_options (#3444) --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 221fc07a2..49b37f7d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.12) # Don't bump this version for no reason +cmake_minimum_required(VERSION 3.13) # for add_link_options project("llama.cpp" C CXX) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) From 1c84003c08027f5d3a4cb876f51d6b6224a34d0e Mon Sep 17 00:00:00 2001 From: cebtenzzre Date: Mon, 2 Oct 2023 18:07:24 -0400 Subject: [PATCH 27/73] convert : fix vocab size when not defined in hparams (#3421) --- convert-falcon-hf-to-gguf.py | 17 +++++------------ convert-gptneox-hf-to-gguf.py | 15 +++++---------- convert-starcoder-hf-to-gguf.py | 17 +++++------------ 3 files changed, 15 insertions(+), 34 deletions(-) diff --git a/convert-falcon-hf-to-gguf.py b/convert-falcon-hf-to-gguf.py index 958358563..3a9300c37 100755 --- a/convert-falcon-hf-to-gguf.py +++ b/convert-falcon-hf-to-gguf.py @@ -134,26 +134,19 @@ print("gguf: get tokenizer metadata") tokens: list[bytearray] = [] -tokenizer_json_file = dir_model / 'tokenizer.json' -if not tokenizer_json_file.is_file(): - print(f'Error: Missing {tokenizer_json_file}', file = sys.stderr) - sys.exit(1) - # gpt2 tokenizer gguf_writer.add_tokenizer_model("gpt2") -with open(tokenizer_json_file, "r", encoding="utf-8") as f: - tokenizer_json = json.load(f) - print("gguf: get gpt2 tokenizer vocab") -# The number of tokens in tokenizer.json can differ from the expected vocab size. -# This causes downstream issues with mismatched tensor sizes when running the inference -vocab_size = hparams["vocab_size"] if "vocab_size" in hparams else len(tokenizer_json["model"]["vocab"]) - # ref: https://github.com/cmp-nct/ggllm.cpp/blob/master/falcon_convert.py tokenizer = AutoTokenizer.from_pretrained(dir_model) +# The number of tokens in tokenizer.json can differ from the expected vocab size. +# This causes downstream issues with mismatched tensor sizes when running the inference +vocab_size = hparams.get("vocab_size", len(tokenizer.vocab)) +assert max(tokenizer.vocab.values()) < vocab_size + reverse_vocab = {id: encoded_tok for encoded_tok, id in tokenizer.vocab.items()} byte_encoder = bytes_to_unicode() byte_decoder = {v: k for k, v in byte_encoder.items()} diff --git a/convert-gptneox-hf-to-gguf.py b/convert-gptneox-hf-to-gguf.py index 782410e44..60679a2f4 100755 --- a/convert-gptneox-hf-to-gguf.py +++ b/convert-gptneox-hf-to-gguf.py @@ -131,24 +131,19 @@ print("gguf: get tokenizer metadata") tokens: list[bytearray] = [] -tokenizer_json_file = dir_model / 'tokenizer.json' -if not tokenizer_json_file.is_file(): - print(f'Error: Missing {tokenizer_json_file}', file = sys.stderr) - sys.exit(1) - # gpt2 tokenizer gguf_writer.add_tokenizer_model("gpt2") -with open(tokenizer_json_file, "r", encoding="utf-8") as f: - tokenizer_json = json.load(f) - print("gguf: get gpt2 tokenizer vocab") -vocab_size = len(tokenizer_json["model"]["vocab"]) - # ref: https://github.com/cmp-nct/ggllm.cpp/blob/master/falcon_convert.py tokenizer = AutoTokenizer.from_pretrained(dir_model) +# The number of tokens in tokenizer.json can differ from the expected vocab size. +# This causes downstream issues with mismatched tensor sizes when running the inference +vocab_size = hparams.get("vocab_size", len(tokenizer.vocab)) +assert max(tokenizer.vocab.values()) < vocab_size + reverse_vocab = {id: encoded_tok for encoded_tok, id in tokenizer.vocab.items()} byte_encoder = bytes_to_unicode() byte_decoder = {v: k for k, v in byte_encoder.items()} diff --git a/convert-starcoder-hf-to-gguf.py b/convert-starcoder-hf-to-gguf.py index 48e88a777..f469beb81 100755 --- a/convert-starcoder-hf-to-gguf.py +++ b/convert-starcoder-hf-to-gguf.py @@ -118,26 +118,19 @@ print("gguf: get tokenizer metadata") tokens: list[bytearray] = [] -tokenizer_json_file = dir_model / 'tokenizer.json' -if not tokenizer_json_file.is_file(): - print(f'Error: Missing {tokenizer_json_file}', file = sys.stderr) - sys.exit(1) - # gpt2 tokenizer gguf_writer.add_tokenizer_model("gpt2") -with open(tokenizer_json_file, "r", encoding="utf-8") as f: - tokenizer_json = json.load(f) - print("gguf: get gpt2 tokenizer vocab") -# The number of tokens in tokenizer.json can differ from the expected vocab size. -# This causes downstream issues with mismatched tensor sizes when running the inference -vocab_size = hparams["vocab_size"] if "vocab_size" in hparams else len(tokenizer_json["model"]["vocab"]) - # ref: https://github.com/cmp-nct/ggllm.cpp/blob/master/falcon_convert.py tokenizer = AutoTokenizer.from_pretrained(dir_model) +# The number of tokens in tokenizer.json can differ from the expected vocab size. +# This causes downstream issues with mismatched tensor sizes when running the inference +vocab_size = hparams.get("vocab_size", len(tokenizer.vocab)) +assert max(tokenizer.vocab.values()) < vocab_size + reverse_vocab = {id: encoded_tok for encoded_tok, id in tokenizer.vocab.items()} byte_encoder = bytes_to_unicode() byte_decoder = {v: k for k, v in byte_encoder.items()} From ff5a3f0c09dfa0a8e0bf76d1748df5c6dee0e8ff Mon Sep 17 00:00:00 2001 From: goerch Date: Tue, 3 Oct 2023 09:16:26 +0200 Subject: [PATCH 28/73] Work on the BPE tokenizer (#3252) * Work on the BPE tokenizer Tokenizer tests work for Falcon-7B * Try to fix build problem * Fix debug assertion failure * Fix MSVC Unicode BOM problem * Cleanup and an improvement * Fix compiler warning * Cleanup * Test doesn't work over the full range of Unicodes * Update .gitignore and Makefile * Another Makefile rule * Testing Aquila * Moving byte decoding back to `token_to_piece` ... ... because everyone is using it. * Guarding some unusable code pathes * Streamlining code and adding some more assertions Important change: I'm classifying added tokens as control tokens now for BPE. * Adding a comment * Adding another assertion * Fixed vocabulary guarding assertions * Fix PR for recent change * Fix PR for recent change * Fix for compiler warning * Fix PR for recent change * Fix PR for recent change * Fix PR for recent change * Fix for compiler warning * Fixes for more compiler warnings * Remove unused code * Fix initialization of static maps * Add scores and token types back, adapt gptneox * Update llama.cpp Co-authored-by: Georgi Gerganov * Update unicode.h Co-authored-by: Georgi Gerganov * Update unicode.h Co-authored-by: Georgi Gerganov * Ported Starcoder and added some assertions * Fix coding style * Apply @jploski 's fix for missing tokens --------- Co-authored-by: Georgi Gerganov --- .gitignore | 3 +- Makefile | 9 +- common/common.cpp | 1 + convert-falcon-hf-to-gguf.py | 47 +-- convert-gptneox-hf-to-gguf.py | 48 +--- convert-starcoder-hf-to-gguf.py | 47 +-- convert.py | 24 +- llama.cpp | 278 ++++++++++++++---- models/ggml-vocab-aquila.gguf | Bin 0 -> 4825676 bytes models/ggml-vocab-falcon.gguf | Bin 0 -> 2547782 bytes tests/CMakeLists.txt | 9 +- tests/test-tokenizer-0-falcon.cpp | 9 +- tests/test-tokenizer-1-bpe.cpp | 113 ++++++++ tests/test-tokenizer-1-llama.cpp | 29 +- unicode.h | 462 ++++++++++++++++++++++++++++++ 15 files changed, 852 insertions(+), 227 deletions(-) create mode 100644 models/ggml-vocab-aquila.gguf create mode 100644 models/ggml-vocab-falcon.gguf create mode 100644 tests/test-tokenizer-1-bpe.cpp create mode 100644 unicode.h diff --git a/.gitignore b/.gitignore index a552139f1..4d5767d22 100644 --- a/.gitignore +++ b/.gitignore @@ -91,4 +91,5 @@ tests/test-quantize-perf tests/test-sampling tests/test-tokenizer-0-llama tests/test-tokenizer-0-falcon -tests/test-tokenizer-1 +tests/test-tokenizer-1-llama +tests/test-tokenizer-1-bpe diff --git a/Makefile b/Makefile index 91198c555..b8b0d4b56 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ BUILD_TARGETS = main quantize quantize-stats perplexity embedding vdot q8dot train-text-from-scratch convert-llama2c-to-ggml simple batched save-load-state server embd-input-test gguf llama-bench baby-llama beam-search speculative infill benchmark-matmult parallel finetune export-lora tests/test-c.o # Binaries only useful for tests -TEST_TARGETS = tests/test-llama-grammar tests/test-grammar-parser tests/test-double-float tests/test-grad0 tests/test-opt tests/test-quantize-fns tests/test-quantize-perf tests/test-sampling tests/test-tokenizer-0-llama tests/test-tokenizer-0-falcon tests/test-tokenizer-1-llama +TEST_TARGETS = tests/test-llama-grammar tests/test-grammar-parser tests/test-double-float tests/test-grad0 tests/test-opt tests/test-quantize-fns tests/test-quantize-perf tests/test-sampling tests/test-tokenizer-0-llama tests/test-tokenizer-0-falcon tests/test-tokenizer-1-llama tests/test-tokenizer-1-bpe # Code coverage output files COV_TARGETS = *.gcno tests/*.gcno *.gcda tests/*.gcda *.gcov tests/*.gcov lcov-report gcovr-report @@ -62,9 +62,11 @@ test: $(TEST_TARGETS) if [ "$$test_target" = "tests/test-tokenizer-0-llama" ]; then \ ./$$test_target $(CURDIR)/models/ggml-vocab-llama.gguf; \ elif [ "$$test_target" = "tests/test-tokenizer-0-falcon" ]; then \ - continue; \ + ./$$test_target $(CURDIR)/models/ggml-vocab-falcon.gguf; \ elif [ "$$test_target" = "tests/test-tokenizer-1-llama" ]; then \ continue; \ + elif [ "$$test_target" = "tests/test-tokenizer-1-bpe" ]; then \ + continue; \ else \ echo "Running test $$test_target..."; \ ./$$test_target; \ @@ -670,6 +672,9 @@ tests/test-tokenizer-0-falcon: tests/test-tokenizer-0-falcon.cpp build-info.h gg tests/test-tokenizer-0-llama: tests/test-tokenizer-0-llama.cpp build-info.h ggml.o llama.o common.o $(OBJS) $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) +tests/test-tokenizer-1-bpe: tests/test-tokenizer-1-bpe.cpp build-info.h ggml.o llama.o common.o $(OBJS) + $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) + tests/test-tokenizer-1-llama: tests/test-tokenizer-1-llama.cpp build-info.h ggml.o llama.o common.o $(OBJS) $(CXX) $(CXXFLAGS) $(filter-out %.h,$^) -o $@ $(LDFLAGS) diff --git a/common/common.cpp b/common/common.cpp index 4b233786a..7370017f2 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -923,6 +923,7 @@ std::string llama_detokenize_bpe(llama_context * ctx, const std::vector int: num_parts = 0 for filename in os.listdir(dir_model): @@ -133,6 +111,8 @@ gguf_writer.add_file_type(ftype) print("gguf: get tokenizer metadata") tokens: list[bytearray] = [] +scores: list[float] = [] +toktypes: list[int] = [] # gpt2 tokenizer gguf_writer.add_tokenizer_model("gpt2") @@ -148,28 +128,15 @@ vocab_size = hparams.get("vocab_size", len(tokenizer.vocab)) assert max(tokenizer.vocab.values()) < vocab_size reverse_vocab = {id: encoded_tok for encoded_tok, id in tokenizer.vocab.items()} -byte_encoder = bytes_to_unicode() -byte_decoder = {v: k for k, v in byte_encoder.items()} for i in range(vocab_size): - if i in reverse_vocab: - try: - text = bytearray([byte_decoder[c] for c in reverse_vocab[i]]) - except KeyError: - text = bytearray() - for c in reverse_vocab[i]: - if ord(c) < 256: # single byte character - text.append(byte_decoder[ord(c)]) - else: # multibyte special token character - text.extend(c.encode('utf-8')) - else: - print(f"Key {i} not in tokenizer vocabulary. Padding with an arbitrary token.") - pad_token = f"[PAD{i}]".encode("utf8") - text = bytearray(pad_token) - - tokens.append(text) + tokens.append(reverse_vocab[i]) + scores.append(0.0) # dummy + toktypes.append(gguf.TokenType.NORMAL) gguf_writer.add_token_list(tokens) +gguf_writer.add_token_scores(scores) +gguf_writer.add_token_types(toktypes) special_vocab = gguf.SpecialVocab(dir_model, load_merges = True) special_vocab.add_to_gguf(gguf_writer) diff --git a/convert-gptneox-hf-to-gguf.py b/convert-gptneox-hf-to-gguf.py index 60679a2f4..d4e85f518 100755 --- a/convert-gptneox-hf-to-gguf.py +++ b/convert-gptneox-hf-to-gguf.py @@ -19,29 +19,6 @@ if 'NO_LOCAL_GGUF' not in os.environ: sys.path.insert(1, str(Path(__file__).parent / 'gguf-py' / 'gguf')) import gguf -# ref: https://github.com/openai/gpt-2/blob/master/src/encoder.py - - -def bytes_to_unicode(): - """ - Returns list of utf-8 byte and a corresponding list of unicode strings. - The reversible bpe codes work on unicode strings. - This means you need a large # of unicode characters in your vocab if you want to avoid UNKs. - When you're at something like a 10B token dataset you end up needing around 5K for decent coverage. - This is a significant percentage of your normal, say, 32K bpe vocab. - To avoid that, we want lookup tables between utf-8 bytes and unicode strings. - And avoids mapping to whitespace/control characters the bpe code barfs on. - """ - bs = list(range(ord("!"), ord("~")+1))+list(range(ord("¡"), ord("¬")+1))+list(range(ord("®"), ord("ÿ")+1)) - cs = bs[:] - n = 0 - for b in range(2**8): - if b not in bs: - bs.append(b) - cs.append(2**8+n) - n += 1 - return dict(zip(bs, (chr(n) for n in cs))) - def count_model_parts(dir_model: Path) -> int: num_parts = 0 @@ -130,6 +107,8 @@ gguf_writer.add_layer_norm_eps(hparams["layer_norm_eps"]) print("gguf: get tokenizer metadata") tokens: list[bytearray] = [] +scores: list[float] = [] +toktypes: list[int] = [] # gpt2 tokenizer gguf_writer.add_tokenizer_model("gpt2") @@ -145,28 +124,15 @@ vocab_size = hparams.get("vocab_size", len(tokenizer.vocab)) assert max(tokenizer.vocab.values()) < vocab_size reverse_vocab = {id: encoded_tok for encoded_tok, id in tokenizer.vocab.items()} -byte_encoder = bytes_to_unicode() -byte_decoder = {v: k for k, v in byte_encoder.items()} for i in range(vocab_size): - if i in reverse_vocab: - try: - text = bytearray([byte_decoder[c] for c in reverse_vocab[i]]) - except KeyError: - text = bytearray() - for c in reverse_vocab[i]: - if ord(c) < 256: # single byte character - text.append(byte_decoder[ord(c)]) - else: # multibyte special token character - text.extend(c.encode('utf-8')) - else: - print(f"Key {i} not in tokenizer vocabulary. Padding with an arbitrary token.") - pad_token = f"[PAD{i}]".encode("utf8") - text = bytearray(pad_token) - - tokens.append(text) + tokens.append(reverse_vocab[i] if i in reverse_vocab else f"[PAD{i}]") + scores.append(0.0) # dummy + toktypes.append(gguf.TokenType.NORMAL) gguf_writer.add_token_list(tokens) +gguf_writer.add_token_scores(scores) +gguf_writer.add_token_types(toktypes) special_vocab = gguf.SpecialVocab(dir_model, load_merges = True) special_vocab.add_to_gguf(gguf_writer) diff --git a/convert-starcoder-hf-to-gguf.py b/convert-starcoder-hf-to-gguf.py index f469beb81..90fa0c32f 100755 --- a/convert-starcoder-hf-to-gguf.py +++ b/convert-starcoder-hf-to-gguf.py @@ -20,28 +20,6 @@ if 'NO_LOCAL_GGUF' not in os.environ: import gguf -def bytes_to_unicode(): - # ref: https://github.com/openai/gpt-2/blob/master/src/encoder.py - """ - Returns list of utf-8 byte and a corresponding list of unicode strings. - The reversible bpe codes work on unicode strings. - This means you need a large # of unicode characters in your vocab if you want to avoid UNKs. - When you're at something like a 10B token dataset you end up needing around 5K for decent coverage. - This is a significant percentage of your normal, say, 32K bpe vocab. - To avoid that, we want lookup tables between utf-8 bytes and unicode strings. - And avoids mapping to whitespace/control characters the bpe code barfs on. - """ - bs = list(range(ord("!"), ord("~")+1))+list(range(ord("¡"), ord("¬")+1))+list(range(ord("®"), ord("ÿ")+1)) - cs = bs[:] - n = 0 - for b in range(2**8): - if b not in bs: - bs.append(b) - cs.append(2**8+n) - n += 1 - return dict(zip(bs, (chr(n) for n in cs))) - - def count_model_parts(dir_model: Path) -> int: num_parts = 0 for filename in os.listdir(dir_model): @@ -117,6 +95,8 @@ gguf_writer.add_file_type(ftype) print("gguf: get tokenizer metadata") tokens: list[bytearray] = [] +scores: list[float] = [] +toktypes: list[int] = [] # gpt2 tokenizer gguf_writer.add_tokenizer_model("gpt2") @@ -132,28 +112,15 @@ vocab_size = hparams.get("vocab_size", len(tokenizer.vocab)) assert max(tokenizer.vocab.values()) < vocab_size reverse_vocab = {id: encoded_tok for encoded_tok, id in tokenizer.vocab.items()} -byte_encoder = bytes_to_unicode() -byte_decoder = {v: k for k, v in byte_encoder.items()} for i in range(vocab_size): - if i in reverse_vocab: - try: - text = bytearray([byte_decoder[c] for c in reverse_vocab[i]]) - except KeyError: - text = bytearray() - for c in reverse_vocab[i]: - if ord(c) < 256: # single byte character - text.append(byte_decoder[ord(c)]) - else: # multibyte special token character - text.extend(c.encode('utf-8')) - else: - print(f"Key {i} not in tokenizer vocabulary. Padding with an arbitrary token.") - pad_token = f"[PAD{i}]".encode("utf8") - text = bytearray(pad_token) - - tokens.append(text) + tokens.append(reverse_vocab[i] if i in reverse_vocab else f"[PAD{i}]") + scores.append(0.0) # dummy + toktypes.append(gguf.TokenType.NORMAL) gguf_writer.add_token_list(tokens) +gguf_writer.add_token_scores(scores) +gguf_writer.add_token_types(toktypes) special_vocab = gguf.SpecialVocab(dir_model, load_merges = True) special_vocab.add_to_gguf(gguf_writer) diff --git a/convert.py b/convert.py index e14b9ef80..e9b08d344 100755 --- a/convert.py +++ b/convert.py @@ -338,29 +338,15 @@ class BpeVocab: def bpe_tokens(self) -> Iterable[tuple[bytes, float, gguf.TokenType]]: tokenizer = self.bpe_tokenizer from transformers.models.gpt2 import tokenization_gpt2 # type: ignore[import] - byte_encoder = tokenization_gpt2.bytes_to_unicode() - byte_decoder = {v: k for k, v in byte_encoder.items()} - score = 0.0 - for i, item in enumerate(tokenizer): - text: bytes = item.encode("utf-8") - # FIXME: These shouldn't be hardcoded, but it's probably better than the current behavior? - if i <= 258 and text.startswith(b'<') and text.endswith(b'>'): - if i == 0 and text == b'': - toktype = gguf.TokenType.UNKNOWN - elif i == 1 or i == 2: - toktype = gguf.TokenType.CONTROL - elif i >= 3 and text.startswith(b'<0x'): - toktype = gguf.TokenType.BYTE - else: - toktype = gguf.TokenType.NORMAL - else: - toktype = gguf.TokenType.NORMAL - yield text, score, toktype + reverse_vocab = {id: encoded_tok for encoded_tok, id in tokenizer.items()} + + for i, _ in enumerate(tokenizer): + yield reverse_vocab[i], 0.0, gguf.TokenType.NORMAL def added_tokens(self) -> Iterable[tuple[bytes, float, gguf.TokenType]]: for text in self.added_tokens_list: score = -1000.0 - yield text.encode("utf-8"), score, gguf.TokenType.USER_DEFINED + yield text.encode("utf-8"), score, gguf.TokenType.CONTROL def all_tokens(self) -> Iterable[tuple[bytes, float, gguf.TokenType]]: yield from self.bpe_tokens() diff --git a/llama.cpp b/llama.cpp index 05b570bd1..4a61eecdd 100644 --- a/llama.cpp +++ b/llama.cpp @@ -1,6 +1,8 @@ #define LLAMA_API_INTERNAL #include "llama.h" +#include "unicode.h" + #include "ggml.h" #include "ggml-alloc.h" @@ -1980,6 +1982,7 @@ static void llm_load_vocab( for (int i = 0; i < n_merges; i++) { const std::string word = gguf_get_arr_str(ctx, merges_keyidx, i); + GGML_ASSERT(codepoints_from_utf8(word).size() > 0); std::string first; std::string second; @@ -2014,6 +2017,7 @@ static void llm_load_vocab( for (uint32_t i = 0; i < n_vocab; i++) { std::string word = gguf_get_arr_str(ctx, token_idx, i); + GGML_ASSERT(codepoints_from_utf8(word).size() > 0); vocab.token_to_id[word] = i; @@ -2022,12 +2026,13 @@ static void llm_load_vocab( token_data.score = scores ? scores[i] : 0.0f; token_data.type = toktypes ? (llama_token_type) toktypes[i] : LLAMA_TOKEN_TYPE_NORMAL; } + GGML_ASSERT(vocab.id_to_token.size() == vocab.token_to_id.size()); // determine the newline token: LLaMA "<0x0A>" == 10 == '\n', Falcon 193 == '\n' if (vocab.type == LLAMA_VOCAB_TYPE_SPM) { vocab.linefeed_id = llama_byte_to_token(vocab, '\n'); } else { - vocab.linefeed_id = llama_tokenize_internal(vocab, "\n", false)[0]; + vocab.linefeed_id = llama_tokenize_internal(vocab, "\u010A", false)[0]; } // special tokens @@ -4236,18 +4241,41 @@ static bool llama_is_byte_token(const llama_vocab & vocab, llama_token id) { return vocab.id_to_token[id].type == LLAMA_TOKEN_TYPE_BYTE; } -static uint8_t llama_token_to_byte(const llama_vocab & vocab, llama_token id) { +static bool llama_is_user_defined_token(const llama_vocab& vocab, llama_token id) { + return vocab.id_to_token[id].type == LLAMA_TOKEN_TYPE_USER_DEFINED; +} + +static uint8_t llama_token_to_byte(const llama_vocab& vocab, llama_token id) { GGML_ASSERT(llama_is_byte_token(vocab, id)); const auto& token_data = vocab.id_to_token.at(id); - auto buf = token_data.text.substr(3, 2); - return strtol(buf.c_str(), NULL, 16); + switch (llama_vocab_get_type(vocab)) { + case LLAMA_VOCAB_TYPE_SPM: { + auto buf = token_data.text.substr(3, 2); + return strtol(buf.c_str(), NULL, 16); + } + case LLAMA_VOCAB_TYPE_BPE: { + GGML_ASSERT(false); + return unicode_to_bytes_bpe(token_data.text); + } + default: + GGML_ASSERT(false); + } } static llama_token llama_byte_to_token(const llama_vocab & vocab, uint8_t ch) { - char buf[7]; - int result = snprintf(buf, sizeof(buf), "<0x%02X>", ch); - GGML_ASSERT(0 <= result && result < 7); - return vocab.token_to_id.at(buf); + switch (llama_vocab_get_type(vocab)) { + case LLAMA_VOCAB_TYPE_SPM: { + char buf[7]; + int result = snprintf(buf, sizeof(buf), "<0x%02X>", ch); + GGML_ASSERT(0 <= result && result < 7); + return vocab.token_to_id.at(buf); + } + case LLAMA_VOCAB_TYPE_BPE: { + return vocab.token_to_id.at(bytes_to_unicode_bpe(ch)); + } + default: + GGML_ASSERT(false); + } } static void llama_escape_whitespace(std::string & text) { @@ -4527,15 +4555,9 @@ struct llm_tokenizer_bpe { std::string byte_str(1, *j); auto token_multibyte = vocab.token_to_id.find(byte_str); if (token_multibyte == vocab.token_to_id.end()) { - try { - llama_token token_byte = llama_byte_to_token(vocab, *j); - output.push_back(token_byte); - } catch (const std::out_of_range & err) { - fprintf(stderr,"ERROR: byte not found in vocab: '%s'\n", byte_str.c_str()); - } - } else { - output.push_back((*token_multibyte).second); + throw std::runtime_error("ERROR: byte not found in vocab"); } + output.push_back((*token_multibyte).second); } } else { output.push_back((*token).second); @@ -4572,23 +4594,144 @@ private: work_queue.push(bigram); } - // probably not 100% correct - static std::vector bpe_gpt2_preprocess(const std::string & text) { - std::vector words; + std::vector bpe_gpt2_preprocess(const std::string & text) { + std::vector bpe_words; + std::vector bpe_encoded_words; - // ref: https://github.com/openai/gpt-2/blob/a74da5d99abaaba920de8131d64da2862a8f213b/src/encoder.py#L53 - const std::string pattern = R"('s|'t|'re|'ve|'m|'ll|'d| ?[[:alpha:]]+| ?[[:digit:]]+| ?[^\s[:alpha:][:digit:]]+|\s+(?!\S)|\s+)"; - const std::regex re(pattern); + std::string token = ""; + // GPT2 system regex: 's|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+ + bool collecting_numeric = false; + bool collecting_letter = false; + bool collecting_special = false; + bool collecting_whitespace_lookahead = false; + bool collecting = false; - auto words_begin = std::sregex_iterator(text.begin(), text.end(), re); - auto words_end = std::sregex_iterator(); - auto n_words = std::distance(words_begin, words_end); - words.reserve(n_words); - for (auto it = words_begin; it != words_end; ++it) { - words.push_back(it->str()); + std::vector text_utf; + text_utf.reserve(text.size()); + bpe_words.reserve(text.size()); + bpe_encoded_words.reserve(text.size()); + + auto cps = codepoints_from_utf8(text); + for (size_t i = 0; i < cps.size(); ++i) + text_utf.emplace_back(codepoint_to_utf8(cps[i])); + + for (int i = 0; i < (int)text_utf.size(); i++) { + const std::string & utf_char = text_utf[i]; + bool split_condition = false; + // const char* text_pos = raw_text_p + utf_char.seq_offset_bytes; + int bytes_remain = text_utf.size() - i; + // forward backward lookups + const std::string & utf_char_next = (i + 1 < (int)text_utf.size()) ? text_utf[i + 1] : ""; + const std::string & utf_char_next_next = (i + 2 < (int)text_utf.size()) ? text_utf[i + 2] : ""; + + // handling contractions + if (!split_condition && bytes_remain >= 2) { + // 's|'t|'m|'d + if (utf_char == "\'" && (utf_char_next == "s" || utf_char_next == "t" || utf_char_next == "m" || utf_char_next == "d")) { + split_condition = true; + } + if (split_condition) { + if (token.size()) { + bpe_words.emplace_back(token); // push previous content as token + } + token = utf_char + utf_char_next; + bpe_words.emplace_back(token); + token = ""; + i++; + continue; + } + } + if (!split_condition && bytes_remain >= 3) { + // 're|'ve|'ll + if (utf_char == "\'" && ( + (utf_char_next == "r" || utf_char_next_next == "e") || + (utf_char_next == "v" || utf_char_next_next == "e") || + (utf_char_next == "l" || utf_char_next_next == "l")) + ) { + split_condition = true; + } + if (split_condition) { + // current token + next token can be defined + if (token.size()) { + bpe_words.emplace_back(token); // push previous content as token + } + token = utf_char + utf_char_next + utf_char_next_next; + bpe_words.emplace_back(token); // the contraction + token = ""; + i += 2; + continue; + } + } + + if (!split_condition && !collecting) { + if (codepoint_type(utf_char) == CODEPOINT_TYPE_LETTER || (!token.size() && utf_char == " " && codepoint_type(utf_char_next) == CODEPOINT_TYPE_LETTER)) { + collecting_letter = true; + collecting = true; + } + else if (codepoint_type(utf_char) == CODEPOINT_TYPE_DIGIT || (!token.size() && utf_char == " " && codepoint_type(utf_char_next) == CODEPOINT_TYPE_DIGIT)) { + collecting_numeric = true; + collecting = true; + } + else if ( + ((codepoint_type(utf_char) != CODEPOINT_TYPE_LETTER && codepoint_type(utf_char) != CODEPOINT_TYPE_DIGIT) && (codepoint_type(utf_char) != CODEPOINT_TYPE_WHITESPACE)) || + (!token.size() && utf_char == " " && codepoint_type(utf_char_next) != CODEPOINT_TYPE_LETTER && codepoint_type(utf_char_next) != CODEPOINT_TYPE_DIGIT && codepoint_type(utf_char_next) != CODEPOINT_TYPE_WHITESPACE) + ) { + collecting_special = true; + collecting = true; + } + else if (codepoint_type(utf_char) == CODEPOINT_TYPE_WHITESPACE && codepoint_type(utf_char_next) == CODEPOINT_TYPE_WHITESPACE) { + collecting_whitespace_lookahead = true; + collecting = true; + } + else if (codepoint_type(utf_char) == CODEPOINT_TYPE_WHITESPACE) { + split_condition = true; + } + } + else if (!split_condition && collecting) { + if (collecting_letter && codepoint_type(utf_char) != CODEPOINT_TYPE_LETTER) { + split_condition = true; + } + else if (collecting_numeric && codepoint_type(utf_char) != CODEPOINT_TYPE_DIGIT) { + split_condition = true; + } + else if (collecting_special && (codepoint_type(utf_char) == CODEPOINT_TYPE_LETTER || codepoint_type(utf_char) == CODEPOINT_TYPE_DIGIT || codepoint_type(utf_char) == CODEPOINT_TYPE_WHITESPACE)) { + split_condition = true; + } + else if (collecting_whitespace_lookahead && codepoint_type(utf_char_next) != CODEPOINT_TYPE_WHITESPACE) { + split_condition = true; + } + } + + if (utf_char_next == "") { + split_condition = true; // final + token += utf_char; + } + + if (split_condition) { + if (token.size()) { + bpe_words.emplace_back(token); + } + token = utf_char; + collecting = false; + collecting_letter = false; + collecting_numeric = false; + collecting_special = false; + collecting_whitespace_lookahead = false; + } + else { + token += utf_char; + } } - return words; + for (std::string & word : bpe_words) { + std::string encoded_token = ""; + for (char & c : word) { + encoded_token += bytes_to_unicode_bpe(c); + } + bpe_encoded_words.emplace_back(encoded_token); + } + + return bpe_encoded_words; } const llama_vocab & vocab; @@ -7532,35 +7675,66 @@ int llama_tokenize( return res.size(); } +static std::string llama_decode_text(const std::string & text) { + std::string decoded_text; + auto unicode_sequences = codepoints_from_utf8(text); + for (auto& unicode_sequence : unicode_sequences) { + decoded_text += unicode_to_bytes_bpe(codepoint_to_utf8(unicode_sequence)); + } + + return decoded_text; +} + // does not write null-terminator to buf int llama_token_to_piece(const struct llama_model * model, llama_token token, char * buf, int length) { if (0 <= token && token < llama_n_vocab(model)) { - if (llama_is_normal_token(model->vocab, token)) { - std::string result = model->vocab.id_to_token[token].text; - if (llama_vocab_get_type(model->vocab) == LLAMA_VOCAB_TYPE_SPM) { + switch (llama_vocab_get_type(model->vocab)) { + case LLAMA_VOCAB_TYPE_SPM: { + if (llama_is_normal_token(model->vocab, token)) { + std::string result = model->vocab.id_to_token[token].text; llama_unescape_whitespace(result); + if (length < (int) result.length()) { + return -result.length(); + } + memcpy(buf, result.c_str(), result.length()); + return result.length(); + } else if (llama_is_unknown_token(model->vocab, token)) { // NOLINT + if (length < 3) { + return -3; + } + memcpy(buf, "\xe2\x96\x85", 3); + return 3; + } else if (llama_is_control_token(model->vocab, token)) { + ; + } else if (llama_is_byte_token(model->vocab, token)) { + if (length < 1) { + return -1; + } + buf[0] = llama_token_to_byte(model->vocab, token); + return 1; + } else { + GGML_ASSERT(false); } - if (length < (int) result.length()) { - return -result.length(); + break; + } + case LLAMA_VOCAB_TYPE_BPE: { + if (llama_is_normal_token(model->vocab, token)) { + std::string result = model->vocab.id_to_token[token].text; + result = llama_decode_text(result); + if (length < (int) result.length()) { + return -result.length(); + } + memcpy(buf, result.c_str(), result.length()); + return result.length(); + } else if (llama_is_control_token(model->vocab, token)) { + ; + } else { + GGML_ASSERT(false); } - memcpy(buf, result.c_str(), result.length()); - return result.length(); - } else if (llama_is_unknown_token(model->vocab, token)) { // NOLINT - if (length < 3) { - return -3; - } - buf[0] = '\xe2'; - buf[1] = '\x96'; - buf[2] = '\x85'; - return 3; - } else if (llama_is_control_token(model->vocab, token)) { - // do nothing - } else if (llama_is_byte_token(model->vocab, token)) { - if (length < 1) { - return -1; - } - buf[0] = llama_token_to_byte(model->vocab, token); - return 1; + break; + } + default: + GGML_ASSERT(false); } } return 0; diff --git a/models/ggml-vocab-aquila.gguf b/models/ggml-vocab-aquila.gguf new file mode 100644 index 0000000000000000000000000000000000000000..7a9abb122ddd18706100e155535f29120ca7ebc4 GIT binary patch literal 4825676 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

Lq-*l5lPYyZ%kI6Zb(sTLRBt5E8n6 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�UU)k$o7N7}qv}X`Cj^3_Pd8IRUs1&JTb3 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౸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%0A0a(_GorJbk)b(g=)BT>n}$A|wt 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

=39nVjmiJ*{SXGYnpWo?r6 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

Ofln^PUm`w232ya3*>+OD&d*T`RqG!+~9yrqR% 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%0AUly`5UJf#c#ZiNtlqpKwn1lMMc!L4H~wg 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Í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
>dj@L1_v~LL;5>&S3zl;9f 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 zKmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l z00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck) z1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`; zKmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l z00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck) z1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`; zKmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l z00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck) z1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`; zKmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l z00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck) z1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`; zKmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l z00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck) z1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`; zKmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l z00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck) z1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`; zKmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l z00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck) z1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`; zKmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l z00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck) z1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`; zKmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l z00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck) z1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`; zKmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l z00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck) z1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`; zKmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l z00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck) z1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`; zKmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l z00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck) z1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`; 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

1VIr)AH%P#SWzRPyJmvcJviU z#>#6BkSw()%WR_&3)I{k=GsD?ppaGYg8trGw#J6f4}V*4lsdxfQzv6RPM_3+b5&dX z?cuJR3o(p!E81>!n^DTC0mSAk`9C#0oc{glP%Qm}Ez58KVzmbM48Kc(xNrD&KJ9|s zq#CL0Tlm1oO_YfnJFzBk#eN9TGKK|%Tj4|%y=NpvEN`>0s*xuiMen$(PU)l4vTKx6 z)HEVY+1aU+6*==dXsbgBLK)l5-x^0K2d)?$-GptHs z-F_wYBrm`K)Kf&-Z0c#oc#hm%b>ksQKi3`tI9C#(4Fq%wRoR}5*)mZevM^=d`7Bum z8%ey9V)KY4VtFO7TiZG)9||A5rMUwab0z~-(Gx!+(5*i5m@fPEk z;r~C3|E#IRQX999blOMtR}I3Ap=Kfz@o*h3NU(XL(7d<)P)~?fK8~EC4BciSCh6Cy zJ7ptaUKfM?rXR(RGld9$^oCbc!UbNEXMD|?9&Cdk$|oU)UMEPJu)S3uUhFS&X}9kz zCLrhQP#c9Nk}crKJ4A1CfqU4%+YSm%F-s(LyFq&i3 zFXfnHYRKBQNHiG%CvTdYw5wcFuG6D4Q6i2m{i6CMT(g`w6%a-}^tVOxe--`Te$7+H z%Fgi=Vm5p2vWECvQKOfS7w@BDtwn3T7|eV-5Mib&q!C)=QK2AEauvfIpn*5bOHj8Q zAA4#hl{6yMbaMp)lFAry+L%Bt(o@4P@&F)?DEXT{_h&ZfDsr&bYB$JoFZPVq3b$PS zv27DhquzXcQiZ*DwJdQM5mO-|oMTr{jvLuQ3&`m4O;?{^2U}8xS&-av>5S8{(zV?k z1lX=BfyF-F(VtAVS*4==e^o!4zswbCbCc|YapuWBiM;No zAQVdUu!}2at4P2{q=JgI2XS5Acx8uSW6#9Jp+m3`i|O`?Lm4!V5X6f$(GMLD!YS(1WPL zY7fGdtWDZnBUamLtqW8?SD$4hof?kE6C5lQRcWRd%$u2&Bh@p)ik2NgQIRCGQ5F17 z5l#?8Jh^aLF4rRhnJ7cW&OwE?`-ECkl0rUziDHf8FCl48 zU6bb0;RhY-`4K|oTyV5(&wdgSFXtLBMi3Pm`4#jZ;#&b08QHB`9i3M^gqUu9UcAi{ zA8isBLZs(umv9^_CrHqSzh1Pao!(62=!D)5CFBfd*8EIa1~V9;4_D&_60kK)xmQ7l z0-Uq;!4)nQCb!UVXmIUYY@zmnWn-BMK!LFf;WaJC6VO-nr9smaluN?25G+9tR4MyF zL0=*tUw>zw1bank(eRFPffZ{nwk@L2ngm4BZPZ^NU)ipfVgLGg$(~iBKPc>bb&z2T z_hoxCSUl=IlrLvsta#lg@$~SF#hgw`wd7Lh>^l4GzD4Be9?0hiOJD4H5)ooZO0KyB zcjUQKm%MQI@QwU3A0w?$Z9-lczFqGnS|>ZmdHt+y5s)u_ZGHPF*w{I4L3JJn#a*%= zp@HfPqHnj78i_klGTw4~XfT3{<#4KzR~7a*(C`mEh=^3?v1M`{)TZX5!~!%Vtzkjr zc;AciTuu#-r4qV(xTl7zB3n0DRVrokLfKt4dbh_e|5)wflw7RutC6&MB@j`X7Z5m} zGs;wYi+xI&LdR;?fLZHl@_J9MTGDsPB_8Zrg#|6q#xj!Yof$Y1J2b#r7*Xz3I-oAi zxd2omrKrf~sLyIAIs4kPrbVeHbXCv9Y_Aaq)2oWSAbzf$Pcun{JVY^LG@M29jW%*q z1cm}`EwuYJR#Mn4I3gQ+LN#HWmKw5JAStr|rJ@&&QK?bgsK7Hi+&p>{&P|ZOQFs+` zLJC*V9QIx<*EG%Nf8Kv5u=zjl%lejA6fknR*DUlIkeoc6X!MPaqIU*OiJw!XYRYO# z)QdVWOFnCL%H*>;DooCasbaU`NDF)g4_><5mlX1~qNh+bkxu~MoQ;4EkkbjQSqI7Y zW`5ybE)BT1hCGpIA~4RgwILa{s72dABlL>+-r+oh&{nYpdGaoFq(6S2uUpYO;2@tY z`@CynSolqEr_OuAyzN_mn{0` zg+{$6TWYhT=IbZsX-Bxt6mGxb8%*h;^}LIu&r-z@If2?~Vtd*72-xeFc=+6(BuWsA~eIti6_~it!gOY6Ef=@Q;7%7l^)5%@JN0o_`_# zgy4uT=|x2fN(TV{yoB4BLMDP}1%L6koxXVZ9Vd=hWlku-&_K(EvI6StQR~8Il=&9l zu2m(XKF#2k{K(l*pSb#-0xU?Hf&JGnDJzeaS5hTshdrc_%L1oE)^dh{l- zZ8a_&Y!7E#xCT=DQl%80Fqh=6;V<)DBjLa&=qgsBp%sL(V@?1oTVs|f#}!hoL>&Vy z85OupT@<`j7>@!ODsNWm%EG0i|q69UaG8LPx*m# zSBg3^rY>O>n%Vq@lTTFdA)LwJ(F9lp8rH;T*$Jr!*18C5Q84(oNnAV@$$k49>4AVE z;s^Yv{x5g)q2ZDI=Vdp8igNp$BI4ZOVsxfiGdfs+C9?`JncRc5^FAt1_7)V=H=+wk z?Tz-AL!co2qxxmUH(@i?xWc6^T$mmFu4h8ErX3DpuP0Y? zi~`c@xk>~;3(`A{cTc}$9eX^1(r}SDi__Q|*y$=T?S0-NPvC%-TmqIS1>}X{z7$f% ze(N<4o;C|bWkEpvhab+8@c<;{e#+Uf#fuJkJ}gj#Zl#JCx6os{Qr&v1`d z>9o6_gB!GlQ7`c;Qu4LTJAn54xa~2&45P`>z*T zR8$t$KJtc8^}w2QE!d^Ma=ulMU!yFezJk6GV8*l?nmg5yMbKEEoIK+>kyA~ptO=$y z5xcd50+sc(k4!lxjH7#`YhMb_iDh2cbqz{Og$9rT>b$QGpa0w8Z~rPK{pF!r{K}!8 zk#iwuIq`zk2g%Cy!86_K>jSS3cQhY*YSyBb)XwkgG|BUAy#6WB4kVy`h7ibMP9O`f z*I$)dTV1IIh8r)(BQjI33Xa=BuJG-fiR2Vd`^yNt%4B}`0xsRQM4Ld zw&0Y4`HhAfOx5>Xs&?{OE)RI1;zFL$hBu@BN8MP}F(??WXc&iz)@p_{0kH94EXe9P z)0W~>5m})>HUgByDr)#h=GOos%6qd8?5u%lq-*S-Md4Sq3Hh7h{Gu7?(`173p?D!dA8z#>oIh4odcNnHP?M%3DI1&fl&JBiHYRAgGUU+3>X(y6hCOytK0Xhr z#S+7)#aZJsP4Wv{Sd0?_0_r;L2*aTyhgMLaXx)~O(2~xXDJ9s>8!lnE>B>O1!II_( z3us@Hn^y`X;cRc6Eqa_Z+I58ua)EKN9PzT`XA6QxgWg|D20jVUoARbs?w0T%w>TaN z0Jbz2!264NECnCbn86~(Qe)aJ)-RPx1T|JV$ni#W?Q4}uKf%THHz4CEqpDb@MjKT4 zX5+?uRM@y23poHAkn%GdTFCS}q5JF6)xUA_W~v2_OGxO_#&KfMqwiM5kpqKu$|CrG z?r_BCi4JNms&fVN#!u)B&7kV#%7c0KjOq7#hDJAvom|NS0}+OvvQwuFk~ z+;U#r%r)Zmt-_qW+b^98c-s2yoEysPAj9EAo>o$jyaKb@j%#9ne&uz$#9iWGg5Ja_ zAPtzbR%43MqET<^OZ3xR4Rbb%26qd@&`mpJlmYE2o^v%hM9B-*T=?a!ZJ8Q+*gw!2 z5weZrT!ILevZTH(B}j;54R*rsRaar!ne5(-YZC;lu$Vca)#1-u>oWETSH7hYS)4p?R&}CB{(gidy6J$)O~6FQ%NSxj^}nPY%CGqwv)5 zY|R-PB(6Y&rS;Ufa=~5Cl>gyC&vzF8JtA~m&#r|9WQ+&dOT4gXX)pLd^!M=`>FU1= zLgP7dD19JRHo^iD8uZK{6;IAVpa|zo_|B3Kpto_{E^;Ien%k=S@z(M;ZiR4QA{(L{ zmXNBpKo}pZs-qQ^pe;s4s!9Vxh_pl^t$-inO4h^F0x#=B+on$GPGAckA#@JO?RT*Tpi!ur*H`*W_WSJ%@n4@whP7l9G(Lala zx#qW%!a%KGP6M|MZbr2O!2a4q#%&vw6HpaGkwz)d?206kO;TIeTYGXo zk!l?ZR=A?prh5m#QXKOKyyczqUM#>><@fD!D=@<$l~(C}N}_rwAkh@qWuu0L_g!fTV#~e4 zM;60xYuzSeD0kjQJ_1QC!G|r8D%~~}lv#aXC^R&_(5UPoNnVI($n=JH63WII_{)|_ ztZ~CeTl8KmLe3?L;hxluhCWdjma9ln}YcHTTQBGK9fl^;Kzn|0Ul-TH2_BE`$E`Jgdc5V%Kt zXVSWICX0O1L&Kwf61xO$9z2g4eq3ql#Z=4nm9yyArQTo7*WMzZW=CIaNFipu zEQJS1ux~direy*Bapgz^uBw)*o`H$ypl}p%PinwOb-UP1u}59=vx!FYwHblUwxr2~ zv%yMm$(K;n%g){Gs3!tqV6(+hVVbhQt%@ArqgXv78vS0LU6gW{UZRfjr^K1sGCTI0 z1{gtuF4z|n!zl=N)YI2eV2hbIvi{~t>xA=TNL;zo-<-kar|K?9N@!~BbW^fz*tZ(E zM=Q(|q0*|}&+Wd*T2#H}t^YWz-fUV(w{i@0pulyA3-R5|`2dpY5S8RyaUq9wSa^Zv*AxPQl3y#$Ifig&bbBd2HJUe}6q z;o?ZC__7gTA=RRh5Qk4(r>acI;4~>O#+=MeX3ogC4JA^_ zk+QB%$;032ZHtcBtI*d0P1o#OEY1mlZKp^OQA>Su*@bAaa~iwAlQ}7^`oKh)dpD_g z17@Ufw%mJa6K+(OzXA$r*l-6&@dKeQY`J9!wT@1g@2ZDr{r2n(w7i|?| zk%X7~M1^@N6)24R)0F#f4d2ei#ydV^nG-yJW~<=;ZL?cA*Q|LfmP2ufa4l_@o6Cv< z15_=udX4PaB<;z;-aKovl1x;Ym~dko?0#J*tWv%Q7#11j9O;wN(dTBMicrSZjEq{2 z&8=pNaN&?zBBRzX3CddyJrr&AW(M3gKt@xR(eVX|$Q697-A51%wo220jGXVCfVuC? zfG3BCFwrrMdMD>jFyafTYiaJkxkX6hPvR#P&?CNGesXpA8x?=HiRezP%I$0nFXoUR z8XorJWJyYVNbBAvY-INueL(1Er)^L!ro z<{`kfzKtHT8XKI-`WDV$(i7jxW2vjP?PmcKD@_*uUy3VQ5AIJ_YvN3yg5p0piETon z9`K5#TJm|78T2A}WT0Z^hla;(_g??NWgqz=+TrFu?;gJ6 zHwlX`PPuSsYkvTJ0`H|$)>t$1PoiegwL+qWtc>$blmHk8|ALBo^DRe5xHIRE+G;k&g! z0-#n^SKcYoe=^)vd#ue3B1pgeMwhIfR59HTsX?o!M!4NtUp+HyTuSu?QGVM>3Eow6 zoKY>n1jUR{cijA%v{(Kc;r+KcnWq{FNbnuVgGT#KjXgj!Ef{`?R~$9jMj>CmWq05% zIK1W3W(F0pbL9b|7-Ug=F%g8<8jLIJ$U$yHsQy`o^BHA#mlSqIu?OweQo?s<&6AKh zY(mca(%^b~ff0ncxaz(9np1`50HAidh=sfL``V==RZ3K5Q#G6y9Sj6E7`ncPU${$U ziKSV=baG9XTg!7MOJPB&hi+af0xD8*etOKs^fmY)ki68K0T^YP$e^BNtwb=qjrD7Pi-axYSy* zMBlM8p-(hZufnyK+Mt|utVf`J%`5OM4nP|u!3raXHBn0%in!>_xIt^hb$Os=Q}IZ( z(_9D9qJ(fZ>LlUh7-QG@fDt0J%85LM+hiAoH#xMYG$3a#TUqdEM2=@`7o@YkFWG-e;;6$}9H%o8;IXBI?2&!=0>$XqBS-0%gQG6xIwWG+|ath`7UxwY{M?LVj0g|39Sg zsn5t-+rMozf91*O^VT?Cq?PJ}XhG6l@8%<)L#&#E3H^)8#&YEUkt@_kj$+PH_>|f& zMc9Wtza+tR469MK?-qTFi8U*G$RCF-+I>;|NS*H6$j6~p)$CY3CpDY}x`VWAC=w z$PM_N;r}C{G`=fAEeA0Ol#0j#M*pG_y25VCj>H(;&Q@KshsP_>MjKeWkTmMf~nO8c2>2=+Ii_)o#vMS?UwL>TuE9QYL{@rhv1REy=-o1UR*K zCoyB#LX}_7IX>E4vFIJu5^n3L=8fI*Yve&za(}r?Qm1tSn6TjJOqnx7v0QMQinG!A zYW5}h2$8seNRb12*o(fd)>8Q}ykct*zKAzl%Zhgy%3Wm<`FXe!XX^uE%0w|Iy=%PN z>d9oDJSMixEnXWLg!;PNE8H^u=be-sw#{B1z6X~<6jue*p&g?myw&CdVVYYkKs7ly zhBe1?NTgxpAU({e!ES&?r|jWzPlhBP37;ID%2W4B%jD)LO^9tk5%IHiy-y`IK?~i^^_LP@EdW%kW^MFXUZFq<`O4H1>3{I z-R^H}bxw$*rIC~0Q($oek9bw>A>&nYWc+Wxmg05BO||ZBVY^a{`1EpTdfX}OHP6;) z3G*jNL>t3-D>~xh-GkN$O+8!M(Tke%2qYZV0KOt7xny%Jo4$$yNHm@Te{o%V0y8R{ zYahiv&{Z|$NE;Z+g#s5nVx>Ro3sbH>M7uUcw8@rG3V^yWdxTnmaf(KSGMCIuz^AL= zk4rjtU(A`^qHM5G-iL++6$4cjdC>T zCHWN@@r9RXb@&5QV4?{%8X>h9TIPRC(LFsplmC2Rcrc$PmCpgq#a4LtV*U+{1*GP{ zFj8(U#Uy>8MR?bgg@{-8S~;|MK>IBf2M|(8W+E~25h)Onyru6=y*=myw(aB-8_!lf zd|GW3H+o#Qtq`!W9-M)CSVYRsb%rz2EI$%wKRaR#?Hs(%d;r@oE=~!bT#GnicQ*K1 z&AG>bc>yG*fZ`&x>J>cFLO(FprN{-!ccmYWn(=o|Ys-wS4xefL!gX&G0}F0w4jxHI zTUK`oZE`ohlVeYY_x7un`o;R4ybJun$T3hqX-*6vs&X-E=b(;Tzl-y7Dy8~`=P9|W0RVm8 zrYMRXT)82!RzLS>b$GV7oVzYgd>ucw6YbF9oY8R=6)E3$i$r=2OiME(?ZII1Mh7#_ zt4TM0d~&|>mg`Z#B9?9NglCf_u)yyvgQv!(=0ZI=Jm;ur<0Vnv4d#KmsSjBWcXjw= z4@^L`SJlNq?MX{7uMU6KLSD?VY=0Dl)cClyNQjGew;=xTZPzM?`OvI_hC^KrEBt^) z!;V@uuY2_Qbl!*bpde`Fgl?2ek)Db&L~Jm<&ud^DA$>loSaPFD@GX~CI8m$O7Y2F1 zA3DOBJ2Z$Lp==$c+TvVSu%cF9E)yG-2z2PJgDFWrc|E_NHV6B;gHO2uBKP{_Zy)xB zbid-_s9&Y_#GI0m?MM^8*4dtfLD#6sTfRCrW!<5}F$u?2@uwbd&0!)h(mXGvA&rcL z)<9x~9@JthT_Ye8w!fE%pM>uR`!Pp>pkV*ndZ-i2mHI2t-Yh#y1N;Jhh{Zb)8TU$S zca3O7Y@@?O6T=!>K$Maj;h>XiJGr9m^W)tkWHoNqFBN%Ai8Q}%0?ooLsTrU% zXZ>}Ra&nSN1V)}CXR4aHu#d~jKD#nJJD`2_L;)46n|2*p2i4Q%-(`WDRYjLUwc2Wo zKJ`>|-Tpzx_@f@mqtlULbnsi8b{-QrshX92$rrPv_~6}l(VYm$0Ey}PjM%BGH}mT% z_DR8hWO$^GC8g0jHnlQO=tNbm`{|00h2q1#v4r8TAjK>vL(Yf6+uJ$6$Tyy!6O0H0 zyC#pj5+XaA-&T3jvci24s0}Xb-KwU){aPzgikh|pDwSdOPOUAsDe1mYQlzH2S|Jhd zav5G8?)JMWEO8|i;j?eVkif>8z~o8ofwSi>F$5Thfu$zEnC9@%2+K2>#Bc`v5imQ= zC@^<5yMks`+7oxc3LdZqh%CO;Ej3xW`=N4dg_t<-lMj1T6ckL)$_u}!3Vy{42c;aj z!_mt`PNZ$o?}l&qg)F%VZyR*x0g0*gSKJ@#Pxox=Q9Ra$oa;FC+j8(6PCl{W1p%Ok z{>+==#LK;iti*$rcX8_y)_&vdFkXyNmehzX-#tBcz-LgwV8Y7n9B-^i^a z0O)>bHkG>lYU2gN4Q_ z36*;hd+=)gE&R2jr@-;G{)=$8g-6(X;y=C3Iwsal%hy?y6Y?Gxx%~H&#OSI({V(ne z)IV~hxGW8$WR1~+BwX9k1BVMOC?-#;m3tcNJNzPzpRzqxDd}{LxMnCs{|;Q>1z<lhtAqb&A)UO4YpdF= zcLKiJJt6pRqZ|6(tPL&Xm{)Tll?QCw3dQ0$mT=-n=u!ox>gYl{Fho?!oD`tcZEE^2T zacMcHAFE$g>Th^ESb;eL{rhxVk!B3I_Gp7&d+dv z(y%z^S!eXBEwH(`?i|2DuKTgQ|T0N7kliiD|?wp^z zkS^C#AzW~B@?2w*qoGZHho1>et4iQZ^Nq0kaM^e$S1zU+c*1FPReQXikCFOnKkCv% z3h{F_xB>k6+<6>=&F;w(@oYBOhV`Z!fc%is>m2f8|H>t*JH`>PwjL9%!P?a?1@Nf# zIcsdmP!qkF7XN9(CrBwK@8F|eYYs>QG$ey}!^0nnc zaaq&Y(>FuT>YG7Ll}9*h{Cn?ke|1@!_$jL!e$_VE-oCpTs~weYCm_o3 zjs#*;cU@CO*GeRKgIkeoTsX(W^1dQY1dFZ_s!f=H+Z+7<58RSn5c+(zjNBgao!h@p zS-;#WW3CGSxzT*aZB-E{U0-qyablT22)U}pkJ2*!!)X^DKRi5E>xNGzT#l0YSux#L zW6Hlb0K*XqzRn6-Oicv-3&uNtRH_oEECo$Pg6&1bsZueBr8S{i{aO~W!;7ufxbz>R z|9C~(lm63Izaf+Eg6*kKd5!}I8l3HYZ#)fRA>-z_R2$yL6}?1-J(*1s$r!1F85N8K ztvMh|toAQyHy%x6cjh>>Zp_|52kH0t4_CgdQgXCjb5SGP<`jxZM!Zg9uU)sG)sA11OsXxMg6fD0bN=dyQOs1P-v%gbsd=Pw z+41qh64xWukS}sIn7Q1hH8rehdf=PGH=obHsr;}nG47R#G$Ih#2Fa{Pm+00^9sWgY zeF_lM&d|A~qNMIYM@Ch4!J;jzp7i=0lj5C?^-_^>B-rign$yk}r9n|IrVR(T;rA*} zYRCeIy6mw`@WXA@!iR?A&_6HcQ*H|(p`C6{HQ+@l5bq{pOUQkXzfTD+ntP2pSHpZswtsM)mlg z9oBN?DJR0s^Yg{7tTIAoh3;(;^l1`I{wA_HYoM~3Z{QIB<{(e{FNUY`_n_b{OO6jt zRyl7VK_| zUKB31Mcx}OQXkl*7vfj_T7N5gEX#-aw_NgTB5}osVJ%<%`u9enua`r?K!%D6_EDcO;K^oIT6C@ zfoOF;uyd$ZPIK~vGVQltaRjq=9^+1hU(+_&8-ko#r%3WitKFOx_}vgPPLqh$|I3Y} z#9MqGHPr?N>{D$c$GXb=qeQV?zqLC2p)Y$NBhN^K@q-2F-Qi&kDEv z_g(IYgh85P5?!k(x=UR7-fl%E7&2q-E$&Tz4Nk=NB7YE{Xz6*QhL|^vb80s=L})9r zG;ez(gi)7xx}QSUzP>UMBt*vRs1Mwoazi3L+frhHEzGo@Fh!)%VPK|}*pXHVuKobc z)Kl22h#&y|dQ>zAQ|!*QT=h%YE&@z`*|JB9M55yku9)|c62bk=-g8nN{;cv5_SUgQ zH=?5A>pgN}aad+>u$n;tDCf~pX_#jIN$zDTu++hU`oROeiC zQ>>sq7Ro8-+ell`cDO#GTz7PzoYi#cWas|rLY*8p@UEe-)5Ej5LhKp$+S>AjwA+OY zhpn>Ai|sSRdYw;jsLevc6nZ?74^=?Wl|>XDy`IC;*01Gr`Zec4Ud_H8!3@LoGB^Z2)Bw5IkdqEPdt^^zcY}Kc zHuf5CiI>n$p&HNXQjWIblhe+6dKhO8W{oHEBr645i+fe24yBcO2g4{4Q8@URpSK`T z*sLm#9bcgX27_a5RUa3n+AOn8Bk}RQlgfarr_+X+_8Qw8V;D2}B)Qxoj^w{*TuFdQ zhFVL&k)qHX+YgN;g>Lg)Gjtq?Rsp1I!(6rx-@7&Fpa&ue5RR-MF-dU|mw`Z%|!gU(Z$FRgS+yH5gVk&62N@n4`=O!#Q7 z0fyRlN^f4o2{|y;SQS?!_wut$#QpxM(KMKIRWYv*JO&SLeIebqumbGv$s68}J1Q4CkV)T;w`YT00< z9Pi#0p(5l>S^iox3>OyD`G@H_0Sna_L+kca2IeJIbhFh@#JQ3xMuc*giPL7AMf_rx zpsX=DAZ6iA2vv2}jBOU6lb&67c5zH=)=HCzAEqu(xqaC4`nzyxxoKjox%1^#L{N3;J z-*~kZ?T&Z16i62-?`4(Jkg(ZYt7+6tPj8#DOd@2f8mfXR5l!{tkRP=I@2e*ynGJ&# zAN#|OVQbyQg?oGTd9KZ$PVAuE=%^6RWyIX$&(#oP6C_p0ajGs(1(DmP8LxyDaF;6G zOD@`BNpxH<>JENS(|FZ%3=UPTx{ONm3!+ZssDwhHTvT+h^LGfvbtoiIu>|Fp!i-xR zH;c6R)bImOVvn=TTBl-o!d+u%((8}?l5Fh$hC^Lgprye!2wxmy34lc1s3NZtNXRJO zLE&QZEZDO)*;$Wd-GSGGPfG5y1w-u!T1Pm)j{7IMgX$07Z6tJvQg{!vhRG9EJPuQS zm%iL?q>feg-fPqKCLEeq>-Dm1SdxI3@|WP!FNK%5hm)IgQ)fuJ<@!gqzSRu_kzkDd zS8y4_8UnhjEJtBrzKLl^aZSu1zf3ch-NjD3esg)Yw@JoCa?3-WRi0+y43FU0o;r>A zh(4AxV(uFXSfrT@i-k;9Ssh>=?ut3kan>e{l|y9Q^m2TyepG||hF~ZEkZM7zet{PR zh4LuMgs>SvE!A#lV|Hg5S;7X~>hkZFTA$FRAjQ^dPJWMQpN&p{&8zId>hPyMe=_14 zF|w2&T|R$bO-vr*s_p>4m;Z4s;=T9g-&JCE#*{OhzH;NKfXSoy`0!XA_}FP3D!80u ziZwMA9mpGqy?M41K1A}b_H*hp=o`kUp9i>XS{^#@Nkyv%+*zJ45Z}SfW8|5>bxk#+ z%D3$s)6D|!pb#@0T8PhQYNaO{Sn#~_`SLEBrhEg8*XD*3#sPV^9+2pf^m(pkNR?em zof@k1n|w#a`koE%p2&x2;CevdmNPZdxQnWCtWT=2zcJV*_bduLa@!sl9!?XZMdnu0 z@^y$H#VE~BzC8S@9vs|G$Mq`G37n&`W~9YszBkti8A>wb_PxgvMBBZ&e=up{S!An} z#ICWRTgSM5W;rPU+1y=AEuq{0YJ?%vA9&Zc=)jgAWQ|&h&mQ(|6B9Q3WX{MvIH7ea1obUb{F6`=OyD_RG$Cn1k|y+{RB*G3koLkYOBxWM^@ z@3pJ7qO45X?>*NDt`7fVxIb5ZNpHv+aOC)lQup%kZI7KL3q&cuM;uxwoN^LI-JZgd zRSRNrW?nKLQIl6YL)czK56xCj=QH@0`87c!emW2=pj`fqGSp=;cYxM>a-w3|nbnEK zkF?+ZeT_6ikIq^`b(E2aV7etD1x~lr1rY+>TiT<@&Q#Q^@aK_SDu`%jbG+&Z(AHZx zOM@!ea4VIl!0G+alx;P)2f&xckL_}T$gVdCK5j3n)&Q$RdZ{6Od;6_#-Rh7AhdG6y z|G06Pm?mCzrR$nI77cGILmf<4Pb|kJZUz~j8*x^}7ru!R}`ug|7 zzt5qq4u3ryls$ZDc&WV{x{`acw#F9D8cmHCVCkMz$um*cTE&^G!&B}HBR}K7o;Z66 z(Yy+;)gP^;&z>C`X+-6@xdXxl>)%vFwgCgm7)By66O0uOTkWupKy;P_7q+{-cAkF3 zoYuxl!lT{UTDGqJGO+Y(SlkiWwu1T>2XlcjO(HpF_B+`JSpM)&4I=0r<{fQhOi{s=FDG6C?ZHHI*rsPDG1#Pkwe)f=h@T>H(72wmoXJ!D2Y^{ zx^l273Ib~K-_p4CP`V4$hcw8Nk>D(TocieW@bmgh@O6&!N9E{gx!@mVh_}4T6BLzy zXSp!p@8xsh2h?9ev0ben!P&rA{h;$CCVC6JNfu+~UVh#3G3{af5_!?-QCxi0zE)hQ zxY;@fNmivR0qU;#W8@Te_W=WP#ZWEg3Ps*?Yu%s52rGoIV@I~Ef)s?Zizp3K`_(C| zQ^RXz^!olzvMGzy%`!{b&*2|O(fiWZN|4E|1?6__8Au8f-*Ll{qR`q@b_tPei?8c` zHkVd6lXeKwK*|+2S#MZh?m-`kcJZ|h>TII(qW^eX$D6=P3dGb|ZWVY-?Kw})DR2Q( z52F=kwWoiregOfKr*yqA{CRF0?4KrT(X64}>drZHdQ!e}fL0WVJDmZP83-^?p+I!jr;mT&JxP?|;RgJ$fobj^4^5@XxHfc>r8Q1HT z_`(lR|M=FwQ>wE*GC7*FAng_{FTcunplfL6+3zZ#Jj*_V=&c-xYxM0u&Q(!~d~3J# z&xki@K()x@KOdyzgRzvkokGzbiI-)M*E!Pd72vWzI(7b4x4yB-O;%Xv6wogtSX zV%@dUjUY@er@G{}z}^mwec$W&Z9t9g@`)iUODU^Atlr4CJ}^8~D=ayM%?G~eE>mR7 z8&Ofl4J;_X{OIs_&gB4>L~8;ipqo%(?z{+h3Z~5aCgh?=iz1Czz;@)rA2vy43rWQ| zdVjW4Zq3Fmcy`TrL_kn*qjiy52|Q!8rU0-q*v{#6i}rm zSVTO=H*@j_c4}lWUbW2f4+Baf0h;Fl!#Sf}N<;Osn|&I*HR$h1e9^8l z-xy2SXi(cAwl7y##vQmr+eB9eAN@$vYOf%zxu}P0nY)e>sk`>M^Vv z%w^Q#0PJzT>XyetHfa`MSwp2W*0DAXwNw=)|J-w zZ`O~@9#(F>eF~W3Uax$f#&;^e0AWz!W&X(HVB{8N`hYu`M)grWcQU`qjoSQB^euH2 z^q<@@<-iuZ=i05Q)UT#m`PJ~eH}d?{86bx;x;#ye;ECessg$i5H^L74SfqxO|0HTX zIj$2dpyj&YmXS9AO!GM+*tW4x)@c9om!KYk4atdoE8gfFR^O$Brjsw`iu#g_UL1%uMRPguZ~)gHC` z#e6Qi3zB#t=l^gspqRU{;uNA}ew>lM18Xxs{)^#f9??D~scCi5_gvA-YzRS$st1ed zTs~xT*i41>W3pUcDP=JHVt}z3@gy!Jg@o0TP{&%MFWMqB2HiX@BQyr(6j(#8yMQ7R z%28!k@1;c8>9`I!MO!%9;jHvz! z+u&4`bSc3rNbPOk*`yN~C1hWiP=OwWMz}ba!;fRXWuREmk5CZxxX48(Xyh;k;bQ5S1}H!TW|oBA$!d%MdlbJk2se>O1hE}kzyx*I;FVVN#BjeI8$cShqL1F$ zALcZG*h>Hc|H?V35aFYIINF_}sO_B7WA-#vlHfl)#0*fH{7CcIvRjNl}*?zk~5;h5SX!S(yNS8kwO-Aai!D4MxazR%0$0IQU8*7X+ zC5{MT@CVlB+S}c8C2&`Q}_1hq9X%p zF;Y#{$*~8rzHt^sSJ*?Oyvtc9jnIq7#Xk4i$Ia1ujt)uj$&-q+REu#8l6lf@F5M&7 z*qP%nSg=BKDkA4f7-RGk$eBr?3egUr=%B9YJJ=&$16!wSO_RSyH-R&PQOfNMhq3VNsx>IL8A$jB1tKL1?WN zH9s*tl(SGBvHizM(?P&?z7%Ipkg4ZGl?K1-tP82q7O2z`ax+$~D;Lm00g_z!wvq>0 z_MRmsub-pcrM*F}EkqMh*7L_8beyYjdS@tocY63~y-wIwT-V)idx<2Rbav~{fxk); zFdweJksMAzfoi*}F^F{y>gZ^k ze3FM4N045q=)kX~!RF4DaBSiaDf9C2QO*|{TtT$=Vpsekq=d_hea?*_!x5EZxu2o) zdrlmTVRx&}4h5ODJ2Ln1B4){+xE>+b7X(XJqwUy@S4;6mYrsLA_a6pk>Zm6b`r)?E zc90^pk8)Smh|~*nI2c~aokOYJ;~8 zUFuwifZ#uJR)0q={V(jd9QY%{V}1aE^yr=Bs~>4?0;l|5bWHG7N9&5Kz=2iYnG&7|@)@GE#VeTw`&_jv~Iaw#V?8r6r$$R{poN| zzGrp#_ru?}?;^vFqwAD@*)A>$2brNOSz2Ed#@ghZ8Xa)z{3|XBB6P8dni^O&&Ivun z7&K{-R~v6tfVo?N?qbOfcAb8hc07)6?yV4_&9&WSDWLeP&Y<*A)RE_q!dA4>!nhUj zV?PK8c)I~ymDfN_Y7Zg3jVt?=(`~=Bg9Ky&x%-L*0Igg3X||BY1@$ONUtCQCZgS`7 z1Mo#tzTQeOr&@91j8)0!Gs+j{wkmB_&ALTr#2++%!zEk-d&^2A=y*V`Sg70%oZeco zP%^K3iFCVdqsL1<1L#o2eL~m!Oqmow0S782r+p#rY_&IiD!mM^TP1ds1x~P zBW<*8egE`S&-I=EkN;6B@}K@+uAI6V_}~d6Z)~*i6b*_;$dWV8CGu0OTYthzt=?ggV;yJK zZgqI~@VB+nOiey3t=Laq_biA!U73^{bQ zb{Zldi8vOmW7UeTC8;mB0k4}yLGYFYDA zs+sNneORARzJ27E=d2K zZ!LGo*t8<&JKRe}I0|%_cTt{4b6Y`7~xWiCFUQ@JR$MU~45s(#Sp!fPF`h3YxI#U9-9M)-;a-rA_x89$Y&q-1JY_k9YY zTy|7Zy%aJo6vn^m7`n)B*4Zjz5+p*tr*M`7I@{%XJup0x5>BLnzjsjZA324Vztk;@ zu%~N$LI$dk$&Tze*#{7m^t?Ca} z86NEV|6%n;mnfXpo*r3WLIP=kBeez_jl3cl8~i7yB0R+|7a~e1bIq1ittSPUm{rj_ z_(7DN?NV?~!&$OJkfj*~52FT9jBUD+(VQCr@|#ND&5E{H|0fqPr@9yS`C%`@#@Vx? zel*oLLYiUQ{4w-#z>>9Dkw)aWMXUpVDg8eJlm}`>N@RtVM8D|JIR+X$upWb>p(IrN zCzTRJC|cgng*RRlY;;DGt44)YYj==Xr*13ri1t{iv+aI0zS8ebL_JD}mPpbBxyGh> zC$-%V6sdQuLB<3dEl3?9y9-5S##B1p!vnehJg2D~a#MxVEd+SL{s?YlXXH_K9^4f30`4ZS3V zdSq3?%ak>SW86F7^Be-cyx_G!twcH@2T%9p8V0^N&}bf4{0I|a6=ZI@oM}^acs0DK zAv|iR6PUP`fDos$Q-3-9MSVeHC3K#X(VzpgSTr)|nN2VUWkkR(tw#unH_M-0!(lRI zpC&u9W1<}Q2V;!1P#>Elqr5i`d9DJT4y~NmaFv>uMIImdOqH{2uryjuS=Cyv~_kk z#zklpB-JLKbR3vCbay@Hhly!1v;YzBbCi&2Gg@0-um?*U>O&eZB}g=OdjZjv=<1!S zV+5|%)v;)PzcrWSKs7zJzJwO-4pqGR?N%`f^_N306`8Nc-mIN3nTyIVS->ydF;TfR z_>4JsGJ9|P0pznaM?SA7c+!jRUm0>yXOCc_4vOCMV2{X~OkMRmMrce|0qB3`p= zi$@JJ8GZUuYgEFO&aI`Ls09ZtZrDRED*`6y_|uv0Djejc=oO4CLLEa&(5@Nj;gq%+0J`G-g5#6A_wMea5qg<2p9r=+^i zs}5Tjty%EEyANSlW%~+S;?V4 z?-mW%Ry9Mb%@Aw=Vxj*SxECVo?*9QPw~H2o6|196BlkQn2O@jrX0k3s=T40%Ha__% z=fwTR59SI7eYixCN1|<98LOpW!{Si*8{`U_GyVPM#mODv^8p*y1a${6&|8F)zP z$f%(Pc_Vb>sx`&k3p#Nbt<9G(TKNnyi=l0`Mj93W5z-*)M?J|LRrl!odX^lmb~!5E zPvn@}fW8uq_K2%y->qLNxyCBfpv>t<@^$p>DdPi;^`%nQv5Ty4c#P;iYd;y%EjMM6 z=_RFEFCvMfx(G3o-c31M9fIQL52O%VkCki63AKD8#mH{+!0W*|QH$@b-mj4bYQ*p8 zL99tqERpNFv7kQx2lnYHn5d8knB)VRjuFzpwHkHE{SXPv+cTopAFB|7in)G z{U$7=@uwAQm%AwI#%Ob3a*+tFb8T1SMMb0Udxre@(@1l2-dU<;}w7myW0+g7Z8pqvJ!Bw+b3l8b>DBzT*UimuGu}wkXniS z2Ms3>)(dqO{o*7u?dQ%~EEE7Y?igxN>`wVBb(#C#ZwA+%@Fy7F#S7p^vX}*NU%E6j zW;dl~)uxUQ(jMxgnu8qQXq8A$R?l^t6zj0bz2)^ef>cFlvd8ZHT$g+T0oah~nxE$2 zgu534GBo`AWQV4*)g^SA6B8r1xm#mOnBO z8qT)D#2qwHZ&ElG+qS4kWh4;*z1J$FRC)VWEC*OX?0H+NH*nDT8#e^kTWMARpqBdn zzTuu+3Q-w6^mR^U52G%EdZ;g1e({mv;d*4G%xw`S08owc?BaDDrub6eHBjGfCJ@`6;=x+VXwCjn{^h<#O3(ogkeNzWZzq+vn2oS!^$h#~ zOl!&~{!JBUt7g>)Ntc;49fx6)0{|i2MG27(-ERQocGS^Wo{mqVt)DWxts5EMy;t%y zYO>iW7bNx2bno&|iO1)3iDep>F-9Mq)+=L;aLyis7%unT4#}yUefYe~I&ak7)stcc z*=VjMoOZzbxw`>DXSbe$fWO}&c1piF1$88}23`VrqQW|bF6Gc7wK~-_+o(npV4v;D zUfmsZ#)DzT4azw2F7AQ_gwemQlF4CS3`!}n;yT&1#4KQsKOJ|6{Y zQZ#fj^a-NsCZOc@v1qF}7dS@MvhCp=oP1&dI3qav#gysC8YNRBm(PhJD0D;&Ei&-6 zYnn1Arg@h6B<^&y&Y7-WxmbQFVBoS1JE8@JgDoLE#c=IYHv|C9SXlgoqt+_gwoycQ zRTc1x&eTvKQ4Vjvl829mb2hASd_R7^$=T)}lBP{1=>)Pv?-5bR=3i#5F+@OD^B13f^R7(N+1P;EJ zF~mWSuG3o>9lzn|0=5ZWs-L*ENfLdlG7FmD?3uGD$%z^SHJba6;X96#1hSoprm~U5JmRY+A0GIuLCy@{w`=UTh#qM7u{d41|8f z>0!U+qCVOn1o6?(i*fx;eQB!t5R`T^XQwW&1^w=~)(BGz;Goac#PTTQD@m8+K6Vy0 z^9A2;2`v=zOLd+OmuEzqpx1^+Hm2C)M({k5iuVDq@<-`-IxOT@ME+97jiUGl@x_(d zp+?*t99I2?Z}s@u@N7=~)@xLJ=kr2g27L6UZ7DnSd8hKKTq(2(w=>kZ#Em%lqc`p{ z&Bh#_D)#8yb8rRUT7a>H?Np>=G=qEA-D9CAKv;OK#Db6ohv(MP{BT+q&1C|%Tl&rg z1^(iQdyr!4v`~_;bZ9MJ2}NZw0) zJ@|Jx(=Vpb0&W&Vkr`$)PzLZ$~{OeV-H@+1>t?$&V9zwe_Wt%bbT?fXsgB zS;Q+k7|H70@JFOg{1d#K@<<58n%<`(Lph%sv3wKuLd)FliJ+gDT4EE<*9YYgf!7Gc zY~DZsYQ3@py2&{>bfDG=wn0xfv?o z&c{90DOmWy(W3dX_Rm^|K$-(ZvL>Iei=pe({sH&=)*t-Lk(Lrg z6Zv`FqS-zWagqQZS2<6$Tw2eM>XQH@%BcibuU>am3D07IZc+<37o4c8j$+mJl`s3n zV!6A(LRWKy#PHo1qGKU?Rc3m=fb&inI~L05MdNAM#dgJ z;0`W^Gn#kxDmLmpt0&xsmGQONr`=HFhj~p)$SfHbz;@jgQ^#DVDd~x4KnwfM%2VLoV69K;Hgq~uSa9Ur zLv{F1h{6X9)VUR(V0^6m~S2VyW#mqqnLU)6f~IK}Bx))Y-38j8qmXL~RXxWHsmQuR7t3}a3vRw~4k>pw zDWLg$G2Jb#5VFFfA_y=If$)Cchsk`6@F8 zuCC)XHsP%00N*c;z;8Ajb3fNT`nW6XenyjFd4$A?EKyh7km8OXYxBS-=agcb11S-#5&4L~(m20HR1BYXgUu75@yS25`N`*5SOaIn?n{-Ze#@1L+NJ_dj zk)b!F>tN6`%`nL7uo(eVv`O92FM)-OVvFq3@>vj{UA=+UBe{OFW+OMR5!ELYi#_Q# z;hbeD+cz*pWkLnDpm%FL(ab=Dl`Z^>_I{h) z!KSiI2Y@4+Ux+psK9}dYbg?j*VyGYZABDZs~ZRdm<>!KeT~Z~Ym=k$SPmN)gpc5YZ3c+R z$EgRSJ;fOLnoV*z<_<69^oTr6*mpG_K%Tirx;Frg+PS&9!-D0&#ZTQ3|>MjmH~_OpJ>lnPDv2xZ|GAtAI!LwB#{iCbaE0>yxTf2@V?V5Uby6iSe*+e3HlG6HfcYS*Sm*9;z;tHm%eiEM$L`F$w=Q|aIJNLF+GJGE zl%EYh^%{JCXvtrAe;3ZV;X4{zWpO?UIFZB^HPZ~>F@DZqLI~2lq6jqg%jx0!7U4)Z zE~|8dT!Rm|G#e=_TGKboP?QAW6f0O?`NXGN3ng)Pg3j^j$)`28DrACJkze}maCeFi zl;9qSqu#KZ-YxZ#+UEml2MN%c=c&u2X4IR>TM#+FPEF8%iXFz3`lTt{dspU6R|Gzj z8=@Pm3gOtNEo4n7U=ryAxb-;;PA}C&`P1faXJ;8jE^k3F-)A|G1ANz94f^VOXX%nL ztTz|sr$lH4FUUO43M<#}8Ay`lTvvzOcD`wWj6A%C`su0^%@(EJuDR8ms~y(fU|?A& zw$O9>C|%9RGlgS1!dQafuc)<6Els1nmgzwNxjn9$w!mp5FIP9RQ?{^~&qJ5#G8$i+ zsra0-Qb%}16~O>pkjtn+sS&0Teu*qu!CYsRUjBEb&{V~-NsC}OPpp4#b+B;ianW(a z;v4R$G|LAkS8ATovsJniU^t&5Z0?DA%8^F#R(&Cmq*2)x+m%}Z@6Tb93aRjmcfFj_< zc6pCXg?zqqg^IvMuGFz?+dxvX+m5h#;X`@4D3R@hjsgjnBf_oe=xz?|bwtwjOXdA2 z8xrF3PHrQ{&P<4@nM5o?4hUQUM7R`%{K?I8^~gY=c_e5svchx=w8=%phkiF%k_d2gX6CP4t)fXXRfg3b5V2PH;x(#~vD| z5y1sn%c=M! z7C4uS>*}n-Zyj>wR_+Z8X-G#fZR3zmIo#mt<>vveEdgRUM;Q9sHGthfi)r z4ugO9=IBpRS_~voBPVYt^h%MbnZF^=H|o4XZdYbHGzXvjytzOV&=~ahdZvm&YS4wzk*b!k}LU{K#;B#~j4dP|M-C&S<7JcPaP^wdStvl{JMRT++tmq3<=cs5sh=R1$gWVNj(wD zdhR>!ag=hJH58)WcinyQS$2$8rHu(wICn)Mj;l5eiA{v4e%;zndnh|~ND4XiVNt*I zEqm%Rov1JU=Suwl>bQW#_c@F^idCN_ve0!PP`1DE zSp~vVKvQYVa4eclQhAF*ueheksr_S07n(Otb6&BiB#Kv4s0fczj$VG*d1j6@^uKlw zEu@@&Oxfy>a$32QUJV6O6RWLK?Kl|gQv;1w&&6&Jj_HVhA#1`WQ{N-60sLmDFRdp- zAOli6MI%h0 zoPC!I%KSzf=g)mzPxyzW%)&sUlL#9f8bbCK(Lp|NOU~}FYq}?*zN^B0EM}imvW%??Db}l5E+AD!FdM>bk1*{sSnl7 zS5)q`U8h?@yJGaGkoof!6!+erPg9;}<}$0Or}cTkYzr8my4xe zHnWa(Bu*!?Iyug@`+2LZRf<30QZA{h!AAq5E4f%v7;kyq+{f+NI$P7vst_S2^~=d9 z2iTj_R+l6{^VIO5$MbBxnoaE8iz4Q%05N)It{VZ23(y;FN#*2bg8gv#VZM$#beqN{ zL=XowB8B{f3eU^;qlkXkuT&6#Lw*XMc)xx?4D5+3{8PZ2`?@+*H&EAr)4tOlp5}43 zLz$2+`=-M^m%!t{w{9(AAY>b<&#raWv65%aE?0h-?-6ymxl|M*cJ^QROX08OvWNfP zh~H>cI9-X{&#@*Tq5MTI%PmTmzqEv4_h)S}Fa^}ASS@dEt1{xEeXgnh?EH3j@u8{J z312?P8BF~4#mV~*NU_#L;qllspe3zgUZBBpccfti%$33q2SDriJ{)1W=C9eNJi~N6 zxuCi>VVWw=I0d&~wSw0CF_-v1H7sEaoHW9feh=i{hQQH$S@a`lUb-l*yUXgt?jh;sh<1ew<}zdN)p@Ew3}~9UlY+Uy$?BO?b07uF<;8QLY|^H#(K9?>uDx4} zvv1J2?Y2g%j8F1~s6b@;hKDAvsfT-jvxRhW@j`u1%FwkSSTI6co3M$Xq|Nman<9DX z*2?7|4vkD3?sr{i%%NuFjmHLlNkNr2^*RNFD`Om5gplwro6@H97V}FMLG-xnOwx0x)e0p6?QE5y#%I|)Hpx`7g26XdJr_zB~sXHiOI zRLgwn0iAkaI8}wex=HVW+CHjmsLQFNikqkUr!oCRmGbS^>Q98R<54A5tCeWAf2s0> zXt2Nl@wpW6AX>*6l_a}sk5US)GDq{#b)c;{Lb_crMSI zPb96~^t$`+AMU?DA3Ws=@<((Dr>h82qv_o*HMcsX8AHjk>>lA(R8!>A3+dd4#*`1l z=&-<*3&3G-Ux)9muhZ3|ei=6^N=m=B^1_2IUik)&LaqW)Oml6ObH*qLAhY{*P4?R? z5kdQ8gWzkgDhR)WC(0czgrej-@-3H8W-~jYeDI=G(WCn3&Gbj`G42;=^NNPnp?d3= zs4n@$M=P$V&IJ?mgxBYf0ulim>MKHMg&UFjZy7V?Q0wZ-aNR(d^AU2&XU(jp(s4hN zd;-8f4IXIyHk6?ZN=Y5`7?qqIHy*sx%Fd zzagO?HwwGx+Un$|1@?$&7^EvB@FH*K%;lsux}LJ^U}tL7S?p3G#9m0N>n?Y;7L^fs zdiY7bLFIDP63F*?Elq#~E#DTgO~DrOT+S`>b6mdGiV~A=%tgzrJt@7~#fc;vKAGn3 zW&-F}V&K+IYPk!$UOmV&u=wThY##9`&bB{+Kqz4bblTJ8FVa5cl0i9{B|+?UdT)`1 zEy@KWRd-mw;u2(*&DX)L~d)5w>%idP%)TBiiL8~8ZMCHZX8*3J@@w( z+$sf#mpB$Mmx!@)gaNf#T0vD6fHRflhx5yJ?c^Bm8D6e+k5Y*d@0QHr|K+ZR>()KD zFGfFrJ3akwtWI+dqXm#ek&l)eYu9oj+mW9z9_F`os=Tg-8aAtXl#th=IRnsB{vE6tEW%qQnFsPAS?(Sc0&sR)T^50x z@ZpHxQr-zE%MX5f`0HG9NUfHiJ5J|>d*Da4Xilc78;9GkD3PuR$Rq~g&2MPe{&-R( zk=5Z3S}7=+QH>CUU4L$IU#t(%Y=I;^B#~-b@*-SXop`Qr$(fNOH3wV^Eo!_fLbX1{UPy?K%Kj#JAbQXB)VC$o~!JPXQ~>$ z4eC7RZ91YT+D+Kx;DbwQrvp}cIRA|5Ae}n#CZPt{vk=3odIya_QP7DyCQ%|JV zvAvN8t!D&-X~@ohMN#xS}%|ZJBa#_ zTpb=S8c!PnWl$QztR7sQIkq7D=C| z4y$rojYMj0F_I5k@F~ZI%%9AD@!-yqZ3GRh!Kjhkj8}*1lrss!l%K)ZBH*n?bUy%R zZw~L+!zI+7BQP9pK-1RxA@YWdBv|s%-5`Y{kTHV&U6Z5mDOBWfCTNj43KE#utE2y^ z7y*egjsGpssdbi&W`m9|5Ln-gS>X-0VYx7H+U->92y!gsp_QmSGjjOnSmv`=rJ>*Q;s8*ES}Uizr*KOOSe}va@vE;S|?r?vz;e8nBq^QufcGtA|@8*wmI}rJ$z7heclq1QnG*Yw=PC1HRF?J+qKHN!^6P$-E z-*Hz#bN-?gr$H-~kGI}&6UY`OCf~^gsx7EOJ$5F6zMy2C+TZ1z^b?V4ejgBM-9i>k zU`F*?fwwC8zhf z6>~p-lj^j)t7h5ft(bA&kn!e=a#A8gfTVrukLiMVr4(y3aWW%15I-`<_SEoGkL?G& zcaao)AWl$?bM01#4-W-V;byFJV(anj^X=cWlr#DaDVNRsHm+xnOGVN80O6-uU@oj| zR!a>9rFqd9E-W6`a^`?xd2DRi3Tm5AzVXe7R`#NtF>ytX$@< zwPDpcCo`BWTChdi&0Jct)I|RkN-;Ztx|W*RTIx~~OIOx2i^g9=;BBGqI2T{^UkY)W zZI8k+9V@(&eo<>P+Sedvp4bQmqqe1biCIrtCP1vtQKuZsw9RC9Y<+=hD}mn|wsQAZ zhqThIp-#7iViHWCM7uvwAK=-N?0~Ox<-(Spd}ZS}GQekM22^QmJ&GG;YqS76-lc@u zzge;kdlWP^M{$dNh8|qt-p_`g`>(_!(*LcK1k~p7O_=?hq|m{Nge8X^Uzj9>W70q~ z#jzN=AkEf1k8nhqKR$)fs*!8#zUPJ?KUL?mGgNplU|K$mqF9+N&s=3AC`=3Bu^b4C zmc%FMVla=acK!{4WLph7b44STd`rxARl&f>DlT0=UL5SRFH#(_<{a*h7{;n_I?=)N zwCWu%8fs*>@p5tdjKo^X=cyylmmV+dv9K%tT(A=~1ZXRM{8&@qldjGQk;{3@s#G~) zs$^jw(VVB|kBf|F=qH^~h_>x1PbjlwphyA=T&Zem2~Ey)^S&kgq5dF)){Fii$lX0T zqE2{3CK`QIx^+~oI;&WxRDNhU7wsvj`A=vp&@4$H{l4lgT$I@w^RZ0ym$iuK;A548 z#Fk%C#J#y@sS>MbmMi!Q)5^Y3{ghuBePc&Q@Y9uz^;a#utm|=B zpOp09kzYYI)+?g=>Mcvco-WbVIj%1&nnRayTL!LB*tz;L1RlZ@e;E**keqv+>J#)d zBX@6udWrPM;zAx9K1@^6`Y<(AryR6tuT6*;2njo7pKt#PGP`z=670IkNP3 zFr&X1H7E8c2Lc*)-+gs?ooIRO>czlGHFbQfRAfu4#4Ws&9lirkz_)sj;ZF2;if(Jq zf>I;Ndu!$SMWZAQwsZ84l|p#a!z2hen-=)4;l94~3WIPB{VN=~wF4>tTHv6f8p=bH zDI(^~^_-57A)`<7#C68Rsr5FVQ6j0l1jdYpthNTL!|(fk3SHhRB54}~A?;`NBVYrl zi1mW(4q!$t)zuNnCvI7N==X2ax_@)69-?{mB$DbmtBOXpJ+}?SsJZTwcNjG9ClmGh z$A)vw0kHqSKY8r<^N630t=&O5y;7MWlQ}G1IrdN;xL{*SEeXdDneyi-C-hozH5uxv zyfZpMU#y47JP59oO&lN6hV_+h(usD1&Frb(cz@$uK3*5l$0bqu3!-Cq2^73|G^d8g zy(c?l>06>AdU)KSFvN1lLe)r;#!qjccT%c*~J$4s6gKeQOC&J0_Wpjy8 zb_OPdUGzZM-Jx(+%&y*lD&z`xnDAr}I@@Jv6-JA5dUv(}4Z& zt64_PTD-KO?9u>o3S_o&@iF7veS5AI6psDnTeDNLWmKzS>~kwn6VRw^2PcnCYS^Wh z)3oCN9lr@tKcR9j2sPR{PBXNKoI?bE}#eCB<_uRNEy!*!9X zj24Aloj(bs+o%v1F$arp)7}$Taj&%Q^TWM<>?Jk1@sZix9Pb*W$m9vF3oHBS6RRkbTtEtF`5Bc%jgh%Z|&17`|;Pzy<-{!NplBKtmMj~Bk*9grOBflXL_@IR+dbU1f?W*$<$abt_~GHZPq zB=8t(&AGZ5y}x?PFvSkj17@Qftv;B!VR_HBm{L1IZTRQ+eai!n1oY=8AJ*sNS})%Ham-%yArmob?p?s zslrKhwElk>d$Z=at}D;?GgQCcxDlu1s4_Q1hn*2{HXpa>>o; z_DP9~04&bU zQ?wvrd=T}}4Pwr3&7*XZSQhXuSG0QpNnJLD_>Ms(Zl#-Jo$P|`D6s%X5x6IR(%6z! z9m|QS&~Q+(GTq~y&5A7I^gQZdZ~~T2lsfG|M7ByXs9$M0N$$v2>@*C^8UjE%iTSgw zlePb#*4>}MnYIRUu`k1NWkLKYNqT$zf;<{oSWr|q3%-n#I&0C0*ZF=LhKHMwBTZMS z;h_L@5>4wB5z`mI!!&gah9DFm_$y)BqamL!%jHV4BiitQCMc>1U-tcn>L~wtKVH%B zb0{eD5`LwM+0wet(b;H=NUukdh3%IUmBc9p0^cq!scnuzP8=>QwD71?)mG z=iC|a%9P^T$@|f|y_0$pE91UW_$fEokiKB^BDsJf{o&Chu@KUVRUKlQ!NAF4o!`!R zZYc={xT>=^%ITDNmO{D~8vLpR$`qcoct1DHFD3#k=%7!`9KV~hra0816wan(MFEwn zxa1^uMgGpc^s>|712=_FPO13GV2$%w1lzSjbc3aJb0$*s;@1sPYSYM{hA zfxSe+Tr8P^s27R;`0Y?WG%g;lB<;X`${6rN0QyfofgpFKGly-?CSs|Tvj1Z%eCk`H zJn^69eN{D@@k-I6&Xd$v((X<4G=<5BP!GDes}lXbJh)NFgkER3mTwYetxN--C*Vc? zaYw>t&{tLDTlfwbBlveIhA3A*Hp1YF{Q9>jy1qwfL@?01adKLTffUFqcG^<=ufbjX zsCP+xl?gAV?99$4uc2(iQ70tf^!xc*X@np7UJ(o3h`S>{{%lgXCEQcVq&^+#D%IhO zD~1S`0?cV>n%$Xo8bM7cJZC{mHlq}*k+-0)y|kY~40y{VH{!2*~O1Xc!MHgW_s z4?5xa`cHSK{iWPC+!2ADMfHeH;~tPDTxE;(29oI;D9pZ?X0oOhqcZ&$euA?ob_r;J zSd%=^rG67>LKGg1hvZCy$`q9=xkT#xycIGM@+$aZm?wQDZ^e2bdLoy}AdpJfC$rqO z42k=1CX^vT;`n7+?9-d@TuiA!?_0Z8s=$Z&p%;iPSa5aVdstuyEU( zcE|4)y~*nDn%GThVYO5HYOhck=vue_C~Wd?lQ)AZGk@bCnbN%^6_9 zi89X3K9u?(-OqA$l=NCGBj`<9?yV#O(#to{A!D4w{!mR9_CtL{hE;87{2{^cu*~g9 zm_HmF(vc`NYKi;@;~8r~y!JRmX8Gi1jmE2+b!A*Mz7);M2Z~Hi%2S}t9E21Gs*_A0 zpW>wE?j-2pPax2$7lZiwZsye^Z>{oX5|>5e(9)AXl0Pj0Ld+?qC$7$&A>Ayi>fs2& z0TStw-|M~`kKa}hrtAB3`e~yrOCb9lzJNa9{|(3`{i^|_znLkMsx+y}Ama^c68eD9 zBx#>TNYLd16jLezJJVIl`oTt%3`qA<9nk!OI+ZGdkY9)oua;7Wumq{{7U^S~_41ZLBh;*46Z%|b%Jv5Y^>(=5hxVCcd(3e;mQ=y1MHltQ2VY4c- z(kKwJ_URM0sw@nZ!@?HOuD=f!#bHm1@49anoW&%kYakESy9-VmVrsdwLU;%80Y@0# zB7ZqBr$?Fpuf(*)SHAD32CW>a;gKgY9<0iGL;T@$zc{pvi(}|gJc+N zUa)4n06a*SC_y7@^`c`c#jwQX_I5I_%y=0ZWP{NlzH=W=SMWENL!w3)#dw6UIuzq{ zhuSdm|Awyw4W8(VOZGH+U_vrPR@kyZqRQNt(^WM^eJkJV-pd_-rF$hmoG7hG)XKX6 z08NZB5Nxa%A>a#8LJN!kYW^AG@}a24_ecwk~Wb`Y3}lzIz{gNtqP5i80{aWDxuQH z?BzOPlMVQmzdv0e41F1JV}!}fxo_$blN)>*J=F)WLUH~lMNFsX^OvCLYv-`HNH-|6 zu|x(t@{l(F($U7&Vza&oG47gJqBedgCPo{{UsP9jy`fde;7Ok)8CSz ztd2m;N;gblP2kFbjKmX?UTjj_##y|L4)3L8kc>kiDo{V}<@`CXXrwsI^oEp%^ zB5{)qTPOYYV;>GBhqT{O+!BS5$|X_(4;W7gPjXPSzD}UDT1W&jBb^aeQ$3XJK%lbLy{^I?Z?bf=t zK>Bh81b-;Mk(eKp@rzZ>F%YJxjZkXtFz&;pC@rEg#OWrXW=p9bIi9Jpr0)R-i8hvd zfW~b$&BF}5E%sF!#oxqQR2eOPq1qnUcjl~(XJ90F0CT}-W;olzTgfF2jGFw9K+Vc< zmt^mXWnD|18e5)RbYZ!3%uQ6!WJgqVofLN;6}m@RTGgyXF+c=u98eR`e-c*8nj~HX zD$a8;57GdT@DJipzLRE;Wz^yjC2jF({+jSK_dRhv7Bt!}%C!(iV0m)5C%dFo);RlX`*-wCFIkph~`6h0c?FD^;O0CR~k(Ilw{$k%D3(gIKOOo_FGTMlH zW&Bu|2V0!u23e4UQ+R7sLij|(6^*FbeJUwL$WUtY=NuxXVSJ^eVRog6GXiE$zs$k8 z^OFFJDBAK7(!@!^hyKRJK1~^7_gh66@w*bnIEh7-GTnRZ z72(MB%M%nMG9~8D;$o;NLzsRtJ(-69DZx?Z^w8`R@6kkznZ0E}-*iRltDZ-5*QHJ& ze5-}czAVdLiZ( zMjHBYG%<>R$ygp@G>37Cl#H!gIl#()~67dmPFru&T_ zovBV;JzmQ_HNU4n1HEDsSJ)H%y`-NFEZ8q4DhQ{{@24DCLMIpne))9wLQ?rpyC3?F zqI;EC=gT6%xB%c6dx$VDotTeGFV3TF=qh427{Rx_eeox)Nts?*2O|a~g#~=J&*$wy z(>n4Q@ebsK2zK-!$_o8mRyp9f!*H<8YH%}mlncU)IyDdoF<8UO@UH@+lqWBqkiVB( zBOi4DWXa=q`X)VyoF!j}1npWTn8-Q$Ws>Sv-!8e3DyoTLvO$c+3!{Sp#Tw(wCZ|-~ z_O9zkp1*hq~yek;quRVHz_9fLnf>IVvY?zy4|wl4>@06LS*N3NnO8di*d z`G(*bFKG`78?RMA7Z-VcCuf6Na|wB6=&d19pkPT6w9+bmUt~3;(?r;K-hMDYERg|4 zG7b25@r&y*-u#6D~1@ z{HsMqt1U6Cz3m9$t8cv6D@t3WhGS6@?u}r`V*k&(zw`Ag!|P|xzD_0|c|_sv8m9Zq ziV%dlAtA6nn!>z!?Q_3H=m|~ovvRdXJ z`wsHg;wY5PrmFgbq6*C?XnwyOg>xFXb?$15B}fZ-9LLK>g${q$V*k~F#@rh=;(Y$Z zXm2h38c6t3%)`J9_J(u|6ZJ&r4Ec4kJ0A1H1|$R&J113Bg(xXXau8p(d~m40fP>v( zD7a!gX*Z*Pd2vm=NvL^{A=eiPQ^@g1u;~gR=7+l0SkJI4bd)l*m0?o&CuO-TeS!hj z8`6&!2o@f&WOK(h$1{0a{qMr4%%(}-ufZx4pCHUc4Fg%8nC9}u{F0M6PNl3IA3lS~ zbWEaM-Wb8hLb2S|;3=DBep@{VsyD|nx%7|UX9txt?59l!vOzctfW}@bIp(s}o>S*G zj@2}n!<-4JSSn~8uOXvKbZBm?_>nyF6}$kG=B7((WHDkLJNA&|K*{zZf<$?SaaM~_ ziJ9>>DKY45F+MV!>Mj1!lBd(Q#&DpxNR8BfBg4sfdyZS02Bjb-{k>O>ze>AL)vfT; z`pbHMOjtE=7Zs|G?T~{Fzz7ug_=EVe`MCv6tMMwTRkQ^;J^_XU+QR z@5y2{w^cl8#HFPU>@EOFUHVw0bBofYY$t8Y`2bg|>J{yGZ6W0#nCWECNdL;QjYk8{(h16;sO>f{|HP@TQPUk~)eRKff zFD}QfSU)rE3h{y@WIUDJ?-F~$FLyrF0wEksE`p%YCg;oe1n?{~y(q3A)4+n9E*QZD zI+IX^`Hk?vpsR(;2!h7?O*>>;#p`4pWHIM8RA(BgX7|P+{mh_9aA{!~FxLp>L zERYcsj2B5JnrOtVi!Y5CX%|68#Ft{*GPH19CHKr8Ol4oIPK^(u3{Ko4{z?#c8(HB42TL!D(5icW@6X|iOUcZi zWR=GP)k_=aq%~%YFIyWC9K_kU`&3C;lG+OYHH2dPNbY2D4K7&JES3lEH>J~%-0>gg zauDm=X;26%!~pX5W*8AyYAq#ei5X3vB^}ALFpjn(FBHsrsFW%o*^|}@t7;V-Et(J@oV~Y_xo(lY8kgX+qlA|1}F2| z858?dZfopiGq^2(%BPLfAKfDY9pa`D=pei-tJB}QT3ZOiU=+(NW8adTw+hfcwh%W2 zTKxC#)lSVj1ih-(E;)Kn>|30+#2Q zlfk)V9O>aa_TWVKYVO%ecVTN3!IVcIa4ENPg0K~Cu6Xhn;>NWK4>6ss!ot`e63+_s zjnJ!{_@+xbvBS2`mEW8PYCa$q+185FsEk-n@kI(-?1VU7%3Ki3Q7@#5lacGCZlEOr z>19j}e?OF6gZbzHO;AQ+>?_@izQ5CD0RAJIX9I?U7CxPNlD=A0GZNCWM~5LDjMCQ7#$_NPZO|629@DKi?e>0uXhh z!wRjFYH|a1qWooB0){~5e3&j4w7zDZrzR+{-Sx$Nf6*_y*L}C}cKqeT0(-^G9+52Z5z~pNq*gL#UNm7sew6#Rry@DmScgs#iALh0r4e15QBNa0Sda9 z*j*@_@EpRTIeXz|0y2v4k^=UzpM)l2j?0bcAK~IE!IFp4qpfFq*_hNcuGAcqd{!)uR*TA9`>_T=L=>w>dki?| zGRbu@N`II?%GX-+ry*8T?h5msL$|&#RNX`dFZTa^_wRj+9BttAA=JvOV8)f8wR5Ci z1Mee=C_Kf+?>074^loyV(pr-?)cI^Yi)FAv!n2?H?Bsb3lcM+B`94GZp!x5{N1VqT zU~E`(Fq@~vN5hM~U1AVwVkgdpIq7Tu7Q9s&D|b~%2bcX-{Z{`tUS;fCS}h@Dzh)=1 z!IuzB82$chbO}}%kdR0J9kHB$lOr_|%d|TXKn8wO3wD6py^vNt4rj?CDJs{Jp>3*` z3O@Vd=j5PW<3SlIC2p`sio;4G*eDIKv_CK7(aC`3sGtsG#<+n|-*VY;E$F@75j)LY zBJa#FI&g|S{$<&T<5_;Og6T{znHc|)+>6obPA>cyvAIQu@C=GK;Es%E6qU5lJQXB- z1w#N26o3M7IUjtQ_wzqz5t*FVE2z}TrhfX`bQQADlhV{q&Nu`Zs`HO9jK30 z`;&$P^hoq{F^^@sgwdFWm`<%Y7myU`4-t0IN-a}!KIVbGOI*TtVGqF)t7>jj6%@T2 zU%FW)Z6>MOG&%rK5q;?|(?vh6wNmIyHHQ%N9OvR{jsR@u8%4CD*K`iS(&oYMDM<^%uJu?OWljHR2+H=YDi6ngIS0`H49&| z`6CnfQJQ|IPf9@|8G4IL#Rns)Z`o$V;(Y=NtQ`0UD~RkL9;v}dE{4lScW~cmR2o9X z>7-Lu0j?p zQA{Z>rOagG>a}+H0d!YF2lDQkYpSppto=W9HI?X`a5Ev2_W@3D$g6o?VR7m=LO zpZo%O03*}mDcWiHjd-V|0Z_}iFRDGr!&;O^mje?;ipi;5H{3SW39wQWtw}n9*I`jO zkpXNk-9s_*3nEGx^;>HZizM#O!fUJbUD>Wg68+8F03Yij&>XBB1C7_?LQ#nY@gh}v z;8iEy+?ymJacMCB7e4S}|DSNB28CF#Fo#r>)?76J29j;9gB>m?Rk6Y9or1lhXZVm@ z3|hRVN+E`2tb)i>(w((bP!DcDveVsh|If4CTCCALuSSh^<0<{JQo~93PT61QX2ANR ztevWv%QB4t6@bPdHVY`HbIdXDf7Iz+C#d-HmN}-BD8xNN} zYUOpEc$jmoD1myAQ&@1+0WRCmH4y*ECNibxwS@ z|GfM2*qkUU2;d;TG$f+9(#;Yn3jTY&5Tuk=dAH}+=a+q9=(pX^V=Q@DnZO{~gP`!% z+HL_(gI2RrKfVeQPr=@9Bn9J&DVS9_DjI@$n4JQEMx+Z`>=d9Q7IG;~FUj=>of*~Z za!*fp7k22m;B&`iI$rTHi53@mxCFsv{~c5z$`3tA3Rza}`0}^Uoe~<59>B!d5h+oc z-JIJTUp9A-oY4g?CEYejw(n>Lz#)ExIWJS6GLJ>;SM1hGhLKs98w$+0N^{;LuP#1< z(h2LY2QdS4mB_Vn%}1FmAxE>?6$Apu%V3WvMEFvnfP6y%49q6}dr<-C_L#m@H*0Kp zDO(2%o%oaT#BF)fg)|7emF~v{kE@GP^M56^pUbynh5Fm^ZOG5*r%SMU>dzf@t5Kdy zn}hD}BuL+6g6lpM_C1F0pU~d%oZ4i=hs_?rIqwHu*a7RrNXM0nbaCxjufNx_Jo;RZ zKlRT+MZU#;Y?2)7Y@__Hp}z25wmKE!Xomq<-**5J6*~YkS{wOx$fztj?B)d}NUrAl z7N7L>8U~55lzBn_E9LP=GyLR26Z-pv(DeP3gKS*gj`yu#3TnpJEQCZkXIAfZqq6HT zg)m7U{g;91s~Y5K`l_)8p21<*LfV$a;sCPcYFb!AHHq>|_!sA87(_IRvc9%>1QL5QWQ=XDm^4ayNkDl!rO*TlE?pl43Hg@3A#)k1vzQm8cOw zT%txnZ05z)DxxiQ{2YJ2n1ufIwZHT@YJ#t;uWI20fvQrf_`^btlghY?cUc}b`wd=6 zlB44C8tn;^U(h(q>*gR#^$zQdC{5Z*B9ZmPT*5pkAXuz9D$q;+N*@K}JWCy4cOtPl z(wPQeQ@la)v&Dvhu9m-DoaUl$f{JR?jOSyD2c#xtx^`sl3;GkvoR#BPbF$zBz67}$ z9|3ok0`|sCRL^U|T}f`wb_|nUKq1J|_EGv^z}ciG+=z7L%|E}%W)^=esPOUXUWtwN z&R#!anNq>%#Y@0`=UAt3+7ty3H==w-#7xsfS1Qfo&}r$Z-*(^0ZJfe9b1;xpqfoKU zRazYEXwl*XikOuO1h~N7O|yMGGeaOpG{ZhgQ90!-p^x=Q?~hYP+wIeu0ei*sZf8?} zvz5s6O@T<3chdy4(lrAU5M2j(^TS*zk|cdrO=U7R?~{cPaWt2%9DNlb^kN?bbB|*_ zI=hnCHMlaQL#4)Yszg5UrdlbXlaDri+<%!zl7RR!62Y zJ9*1nJ(`3-#2*G1PIKhy94CvWf~z4`(T?5%7x85a%&S(*mH1MIiKY3V!#k(>&Ud=+ zX6wz*c-s{y_>xXh7A#m`{(Gupq@(2FZUA*4IA#-Y|3Z_w` zJNnc>FNE?#qVF^DFtIr+(7Pa`FTNB&L*9D*E52;-wyP-m>EyA@f)DeasVMYz?zuT_ zvwpcy%yJrt)M8wU=UDO!lp1M7llPDqd58W1T*zKk_a(&&)=D5b1ykj1@%^?0+2zRJ z6p|rRC~^IfvId9|IhVqOiYL9d28}qU*XJ*w29(DDK;WHexV7=y z*E;W@CuPZK@@WdnQvz#Hu<4S^oHN~^Sd$X9y8v|vs&gTxVcWwrNDPa#3veDze%t6r zz7^Q3sG^lAS)zxDaDTIIa!lU}V5EA4g)gyeXPzsjz8dl_NrnPg8l(`>OKggow#Ph7 z54)La&JJhCRjZm0Ty6uX)8O8b8rg5Rc8inG8^25sU^FjZgsMuu;X8nd7Yd;qaO;y& zfo&$hOon+)OKxYHqo0RdDbE|zN5SnD7X!j3zs^G@hND5elpa#tvxkdFKSAOI`V8+) zDRC_jfc$RI!=`ORy8%;o{no}uM@1Gxzk>MmuU+^g`JXUrqtJsNkO;D8KGqkZwfq`+9q+a z&7fdeUr6z=>s=3E23$52Yv3xEx@jB-x3dO3?YG(>k|T2nRUn})*S0INMHaT4UYoL^StEQtgRg(*^{;PTiCMEF)N_WyC9kG1aEf*B?bmi>MF zf%do5bcBSj^igK&Dy977edNQgkce8G+S)z~>;R06g_{48edmg6x8TK2WUw20kJ!bU zr=PXqTdd-XKZ&A7A@a2&i7(=A9y9jMQ-HIim?+;0Uk_tuSnI5w@O_abf}bIkg=Oiq zIJL%6DeiZf0i^THEH#UhNBfQ+gl{h#t#(;L&zDk@@E)^0!pbkT_wt8m*~L88LZ1gHSJlrzHVxiZu_4LNym-WV=L~I?+)- zqOlYJ8mamQv!5XiY0f|qhKQXC3l+{n)g&QbybpByy)n%$^#RM&*S(=UYtoOwF_8B0 z#&>JdZXXsh!|_{}|AxUVDf*MM?fI94NHp8QQ*GXY+#t@(*l_+# zP*iaPa`SSlasP#+HI`^pc{?pNYZjBIuhQdYIt-jwJKgyZG-j9O3sB3~d=(grNyr;M z=a`{5GKP&Q-~L=*QGGO%~OtdIK= zVCT(IY@u8W2GOV~%mT;5-7O0tu7mZAgyyX6ukl+S@+|7t`BLOz1^Z$|s5(?pxpF@> zhb~50`QQVnQcY204+OkQI}<)7?ybX)QiHhW#wxB@E(&+TLi_-oeXF4H?O3U>`FLZ7 z;6phv6rkpM-SrI<#UmT?=(cSGdQY<>U&xQ?)Os9SYJ=4km{vJqsQ#7=jScc=3*My{J7{n0b#&H)GcbNDm>Lg!O2F zOM#p@Er86K#bIGYx6ISV;T)PS63A^Ly5B$YzgRE@2Wa@?9~XV;x*W4tucTAn=Kf;? zBx7El%t*J5ZZ2F*P$dcV!6hE;7M|};`{AjPW;lNSvWwon!1%Y8qy7za2d=1OQD9}S zhr8Wiai!bi#&mkNnk+4l$d(nS17Ls)IJe@05offd3&OfLa#5gm2ee^e#i$^GGp6X+WEBas zUx7ZD4n!w>e}P?0tIpT5*0D&FVilHBl-CK5@I@^S(|i^N)~G+ikp(-B={E?Tg(ZEY zzHLi9(n<-+B7K;9NQqPs5w6Re>CX7}w_wdQEff{}QP#bbCI7+MA~mG(p$6)99QYh0 z=f_Ji2kp5*ZVrk|oZ?m0#|&S!;>sxScfS)lP*idJw*Jz8<9m(*HjOSCxWYE`?ahV} zY$C0yhL<)LE+hS?52VeAQ-C)2(eohie;no3bh9LLRmM^m8_ z-TxJ{#v4|W3ORno-~6xQWbm_;fA|r)y;V?&apu}}8DuyUBJ2-(d%9PAiJR&_63$i= z8>8Yv!05{?O>QNSm5_C+Gn^YJjU$VUu?fJ}2Ph+;($V9T9HTI`UZJ!_Oj-IDR)vDu z#n~*tk=B9S@=JnQKoGo$Z29#VH77*s4S9QhU4GF0B3^=pYJyv}A^q5XPEo^?+%0uD6xm~&rB-F=LQVu!U}cU(vvg47 z1Mrn);#yoV=b<8~>i`&H9)8gHeh1qI2H_AIkgdW#vR{&VdtMuT5lqP}}wv?)5?ok*&o9Qt@x27~ibYE5C2 z;s_(WD31&t;(I|6mW?eU#psugu=pf*$U==Aq|?(x<-%0xF4o+f>Jm1|AX_L^1eKo5 z=IuYiHF20+$Q)0QXg|uK9rHjUl~em$-FM59)vPw+97kL)-0ITh!pmirv+fOeGyi<_ zC%Y$orG0$?+WN(G8YW0g>Ck`h*WD9-G`&5M_eKpv&GLx>v>oOqCLrqrYLJ0;Iv(U|N2Ial@QiqQXYhu6` zMDiYW{r!_fR?(8w_@xB~!zr{asJ0XCVt;TrsIaQ397N|JSejp{o&~9iF&EK4c80}7 zd{x%xAcsat%C=WReMg!#jpOq%6_ZVrGtRBvDLbezAfT2Oj)I(orLLF7&)S-+>TZOl z&HQK~e>G>V)JVxrg3&$$p22!4ZRU3;BO!>g|H;&M{#XhoHvk{@xi`#3LdkJx#$L0K@!MJ~O9L@^#7O&kQi=U@kCXMK7I z4BU?5CzK0KiamkxxiKinyt4^=fD^?JMJWcAd{}p)uiIQDz$fN-N5BO(0-7QFFZY5V zEkP{b3#$~BYn6}FoXu27_61QT+C4zJf76(DtU@{u^w$M5^5 ztg5Pkb8j#JC1)74J(aJ^x~+n&(ROYaD1UVItka7%$wwa@_L_-j!X(9L;;6PfB)>n+ zVb4MhKh?bvM+~EB>hSz3(;o)(`>r@y(KKG66Slq}{3|zI#Q|$6hVi?q3UfpNKo|x~ z_p_nY9|pD0(_(+|nikzR%JU~kKF<&=w28WSn0wYcNC!R+D&E|W5h?gD`g$q6>?L8EkYErJ-?KX(OLwmoJEuxZb~tLvwl%|ZTZt_ zbkmYUXL&8N@(R>-l{r$JGS_G2X0*NsC0I&&Ha=axyjGN~7Sb}25~uCh16im!Z4VKb z$NG#3Vb$|X&jh3GgKw>h)9e-$0I@+-gX}SArJK%WDVhP-H{qK^OUVWHJvoXEc>J+ zgP@E6baB1ubb&`Y+KO;cMAz^TPf|Ff-IS%tZO0NRLT*9|JMK*np}4*%b#q8;NUyUs zVEo9B!=O8P@2o0)gk%@{&vnl_tCJ}e-df;M^gIiBwAdd61(CUwQrAJ$MpAgRbOGc! zxssHmGsGWXHQteGl@GJ!FeSo-;ilh_o+Yg`l`pg!oxMd9a&cUr5PAfmmlJbfyhl{U#zm(z=l7xt8sd5fFUz!E} zx2*Xj7iL(erc>djKhnI3Y_UFBr?4*tOpqbM6Wz&Ol@5;Dq_bXyqNbk9=F+?*2o$Ulc)?H>py}adg|Ac!^c> z(Xo-%lV9RFGkfFCJW8aOZ<{`>#*vkoGYJkj*7zKiE>#WcAWLHyF z4kYX(2#Ocs1-T&<2lDZyP?i8VQ~##lyLmRJXH;YKSx3PN>%bKQj!yx5;)`1#2G1I&TX}S`8&~M$ZAM;lQM9uygFW; zGyz8&9W@3hF_3hzdO;LBNtnek4c6YA=gdrsXd=$K^tVR0P&B zQY{OBT;3wZpXA0$u7Dl4lI>SVEMpC@^YJN(Et!Jp;kW0Vomu5EXPbA z1qHWORR!8I>To1`j4ETSR%8wll;tdVQq@R&dc^4CaX)96YTCq*JIZ@5fo3Ws;>2&{ zf+J#p;+%bH;Y`Xj%Po7oLwbvw#8omym0dTu^6*5OGs@ggej?BCzfS+~9f8>?Q98zJ zaZBrDC&pM(b)`!6QmUAa*C6P5l;{}%6_lzw@I~ViUfgp&Hp0gf;Z3dLsxFTthU8l7 zI^nYvS0%jZtDqF@lv0(OW!l&)7kR4h@F?(D-Y+h1)Z-gP z-WMVWKUA5RJl;YF=2sSlK35$fhECN@B^4o#xG#s*P+ZbE(h*`oyaF?aItau2DOlBx zs%jAr+u5G%7H&mqo1o`1sY4}I>5kKbZRQDKozjwRu}2+21O%l${wP`ZHYMp*3eh+0 z`4ofaLDrOvc_(2!ToKF`Na#W#H(J24D?Kb)Xg!GTR+ddv^Y!FPSUH5ET=?lvh2>gU zI2I=zRl-WndjEm4jDH+Yv`Y0NfhZ(80$&$H!g+8;B?MJhyZ2C5vF32h zl{dm-vIuwo6>*4kTFBw`M|0?)5!*WA_2j0*=92%=T~%?O_`6|oGW*teeI~40U<4AQ z#*B!Ayy)09`%_b3eY9tu`2jro2fok9b*`b`1X|~?>Tb8FNU8>{oB%2mUiF2MLmoDs zI_Uhu2Un^qSyMhZE%eB{@$8I#auvJ@FYKE8gyccshU8w9P) zCF*~E4c;GfYw-8d2PKAXfEB}BIOiE)lu#g2E1PVh@0dxraUpl3*K_13@G}r_v=;X< zfNV)YHRxtWF39B;4%j+J`Vay{;imSFP!)X{A}0M}_i8Qm+9bshfT*SWAX8!=499QG zi!=(;WOEU8!)plB+#7B%7e%+afa~7GrMZ!&tvzJCNqBF=`4H?0+wRzJF)(*d;7O<`36XXMUBk~_cW;D;!bFWHj98Z6$vK!Vr&@e zmFdswmShX1B|~cYt6&WF)dfQ~Vx+kmP$UC5eo{_}x+$ zGhBj0`&!Khl)QL{iaufj1(he1_Oui(!M$p_6cOUoIW1wa?5Er=U-{&8I3V;H&d1F%ADgb&|T$+)KaOykcOqRC}rC%F`We2SZtc$KsO_@pd}&`f&x{9pNY zDD!GH$3T3_tuO#mSdjg>$N+hfWc85G#;L1R;q1CC$nInEib49DcyZ+#RX@ngYNrmQHbx zm`CX%$zh(LgnEWo~{WpXvVMFLE(f9~KxujtUoLSH?`=Hw_o>KmT)X zn%ebFrzLZ-zZXS*6Z|kE8{v30h!wwCO=xL?$c);UzG?Dy#Df9`0!9^&hL>)Nu}#VvBk@Xj#Zrt?xButy zj5Wj3-J~dzua42^ko%R-$MPD&4~SM)JhEw_)aeNFQ~Gp>e={C;z{4$j^TM4 zY@8Ds_DvwH=xtjL5RalIN#b@Y^Sve5m6W(sPPg9gAcVGt(o zdEs7Saq=YNA2rfSno|7{^3_TWykG(o zN{5K0ULH}_Y2#huHVl9w9)(!MHe(m89#QxJkY}X=El%af?{is9ZMV(y3$oZh)1}ei z8Ux^nh76D4uW=<7m;HpFqVscZxG~sF)0UER-=Eyv=@Kj{do$}xYc$A5tOfnWRnV7{bJhgIWb$emy!(qJKa-xH>we-Np6-7A+u!BR?P#kxa$gG5s?t5S zb|RcPK^|kAW#-dCzjgs&QZC7biz0q6|SbDDnG%D6S4zvqp6v2-OAUw015AL4mR1p3Ggf3ajZW zR`wtDhp1aR-HWO#+WD9*m`UOcxxw5LQ>+V#%P%jB3b1D>ys08UD^-wfvRpF2>{2Q#qufs0(RgQ9y#pK_`}V-MDLfNkGCA zY_rCmLXB3uasV&kOLR6vgy+w(n~4Glm|eoL61vk2^?Fo{@JRan%z0T<6LzQ%2o_IO z+craF`byabT*@&4v3T=RLV$ibp6cHA|0EO~kK&Z<<8X8vbLR8*Z@VXxgOFrMRtL_r zJR_kkakA_cQEf>j$!1mJ)1vu=RN`ID?8Jnv?YX#RTW5=>PB^Azsu<EuA47)DdRREfh%-jJ23NZyqi!KVrW1EEAqX$zNB5 zH`$89IwY=-BWCqdmhB$84e(!oq+2+*qU7#;YH`>R^2E!>?TrhV7Z{|Au*iuo4o@_JtzrM&$kIr9N^ zE)JbMmIm*fvM+!bbOEDXM_QLi5Bew=1kG`Sfso_@V@g{Qq(=Gphy+1iMugOJgdbLDD7` zngnx{tM7da28zzt8$2#Z234&TZEqk+i($nu-eHxZH9^|)jFsM6ra1JbOj=cq9U8MC9L6)ih$Rx!9dC zUR#+vDS;+icA4YILf-)%;baQgO!9WhxWv^g0TYL+C-Qn*3fxAdp5iR+rj=cwRPGM* zmrc5WwOriF6MYijMt)+A8Mu@aN)ZV>ydOeA)YXsOBUsoCpzBtQ(mdj^#zy#dnc_<~ z5akjtJ4PVGH1>D_4r$O&`4Kg5@V@JSe^Ba({^hY-&+=dbKxeR@ipH$}@D=YNP{NrS#U}RLXu(<2bs@>mr-Nmurr-T3h{j)hdVr>UZ=Tq42 zp{x$`wCDXXJsTfsfYY)-MRX7R7jIN~g`!4e%bu3wa8(K+mEIi~WDd zga8stfw3gAOxfX+Dsf5Vuo8r%y!kZV&Ad*In@T%XrL$%;3gv~Z0W`E*OKrJ9Y-{m( zT{pu@6MON4z#vKwp{XuHBz=)B3keO3yS+5}DZ?g;MwK(WzDg_o};%Er1 z=~M@RL#3qMDw`*X;2-4^fP{T3Uh4`PZFBSvs!r`wEQJO>0%W!p>bcz9`?Hz;>i41v&*nMTNK*Z)=_isb`VTqdO4}4uzz`J#hE_9pQ;i;i0RH^RSvQAAK z@KNO*2T$nR_vl}h@AR)(Cm2&>x{F>E_%Q)HOHc@3`(!ud8S$Cw(KGc-0)WcKu{P6F zbaou!;7fCsqparC2wQcfhduCcgAF?=u8q6j#0cVrTviKV$GI|@bstW2Qurfx@0%oW^n$&L zpTeuPH^UGqKU0jomwi5IN^^r3^3~EopgZdyfOV%8V?ffdLng`_y;lm{5ZD9JSY8F+ z<5jw3w^Ay+I3{GM()vNw=38b)xR%8vi2jzXA|4)TUaCF37b}Tm)0?HMR^zp%pvMao zKVnn4Fb2p$1&%*8zm3V;p2PXOv6Zm~^C*=BB4;kn@-#9J74W{~ghb=PCw+QyuWflt zWZzAauf`>X^5@+T^YJ%v0SibCj@r*!wKx-X z{U3jjE0dWUPCQ3ey4~8#QnsCP+6^K=DqPw-+{j*M~rW^$-r9 zk&>4u0aw);O1lwDla^iQ)N~vPSaK=HM3m#m(1ob`<=ZbeQTY>DPninPR%r1EXsFtU zat~U9Gnw{2XRbwG^&oHbYbuPX*~RIZLa8&jJ-<~|1^P2gOMFBu9J^NZa^Dwq27Z$Y zqY<;70BIIy0&fOhZqY4OEoRfU9G-Ac{>Zg?nFT++@#h6RFwhF5L8>Z8EuBX zDL7JY%d=yCW&aY7*4~zB>ga;;zC)=@sa4{bM7#CBLP(hHQBdas_j9_DsxMT~TG03p zdY$&RPyf3#z>Pnd5dJEEy)<4Uq^xWl=UTNAzo^7m1W+^|Lax!#xx7G9_ZES)gv9`? z$ngzVumW>VzN0eK7M!H*yl)FCi-C(wn}{!E)hmvK_a(4E&{_D26gGRypGJ<1HUx5m zRaF19L8XN53_V8zfHU+T;s^e0j?==7gj^*-w;C(O!How<5#Z0`LRb^5o^&LS;RuDw z1wkK|Qp}r#*I}%=57Id;1P2?Axkwwgq-zX;98BdacedB#six-*nGm8`OyA6#n4;;P zx?D74l!8%`s@nU-RIZkh4$yoG(H^hms&)9hu(pY=_$T5~!}@y$g&ZCQ=DWOa`d9k(5#J@J_B;Hq`_6Y_ z-sX^y>V9!?KZ)=KsCndX2GRx3&#h2}g#l_o1x*HLbc$q_ji3daqi8`{lja0=S%S~K zI0aF=VL%e9^8;rhPyDX?UYRQ}jmEKkauyQUPLkQ#TU%3BKw<~TrPY6JFjUIl(^fgOgW_!x)Qp zj)*d#qaPoKi+NmJ5ylUed?jE^cH&YT17hp~ez`EeW~))1Jk=enrHsY)K{50IIrz-0 z5=)fh#moR|p2nA6I%aV<3)~Rl>%tgDn&Y}FrP44s$X1>#`?Ap9$hpr{RRrC*CVz2EAJ!j#RiMgDnF!zoPk=BH;x?XT_|GHULpWD#n)b_T$_t`u*)dK#Lsmtq0~>PeZ*h(B5X2O|U6 zzuXlCMQ1?UtzDG7t_k*GNemw2l#j>)d>!KUFx&|?sglrm9=t_HHjZ@2e-GyYs zDxx<(%#2>cssr+oepYE0HQ(v|s(K1R0O_5xRUzPAsmd;PNqQ@7ZcWLrWfy=j9NC zg9tvJUTARU(y6tGD5JWt?9-o>y}{{oF~-qx_D=Z1zlB#fDT<#zdC`fz8L1iQync?y zvp6TULf0k!{0NaSafFL~+_E*@2=zeHjTL8a28sTU_>Rm(-Brx}yacPr{j5>N4XuL9 z+G1Iakyw+sI*~^M%=m7%u4V&&f zG1w3my~(te3=_=fmnSelA?Z1i7XWCITBK)rb5eia`hs_K7g0Rgsl)!yEM7#H?cmmz^N*`yc)l-62RI5!qWK*!A@685Dikg z0VTB{T8)Gr3Q1GEHOlX>q?9-o6{L^Xq0aW;QwpcWm%7z3QEPsdbJ#?aTS|Xf%k|`a z<;LN|maaRfBqyC-bvZ2=+h>6xSE82Xq81eyNdqHs!e0E#;=gr^e~Dx73-A=5YmMn! zo&&vm=IP8-Qz%8-7hjc5#^`x~I9MrZias@BXrr17#C{;{I=@fSf5;T!67LtkR#C+bZIBhMFy&53w$pVgeuJ`;-AyvIjB*HKU;zntF^AsDzcmS?Se4&oUF#*CHTm3u7NBp1gG4(6lzVe-r!c;s$j$`V*83gR}=^Y}&9RRk3#kUKOuOH^5O}AX#=f}kglS!7Utm=!#y3Z6Tqp2>Y5n55lA6m! z^tZ?dy_xGhN9Ap51^!v6u%net>ZnV&nIaZ5_P!S zLq5kE5M5GqDeYA2K*4CSbn0`BBO7D%Y00lND#tFufE@{^5ePXo9~*k73|Y zu6}mE3QBTy3{X{ypGrQ{pg^q{5)N$O>2v{NpK`J}LjuzSNVK(tlzEhjXQLkzT4Q`dYtVv49O{ye>8q{TT6ob3L||MPe$;3ny*NQ>A` zGK4cGBlEKy-vj>73&pxYIQyW#>fVm&b08+SmD}XRqyFhpyvG>jQrsjiECmCbL&LVk zDd)tykl3~;B66h6e_~v~wD4$hoa;VDykZ)YF%*baSe+-PwrT~n01iE*29<#N!k98) z{@~X~B{}^?45_rxy!5yh1g5O1P^Od@r&GJSVyWpYlq=7+69>P)=yW%Zf-xt%ld&30 z*%K247FE8qHVC$JzTa5*laY_c%`MS3ONtwBx^OU8c;b2*Sz6cyilWL{EcgJ?G`|@i z31$(Kic@SqRCoa+1CMe_H9APR?>6cSJVDoySV1$dP22SGcgBRZYRk=I-7F@JQh#B) zWG=|pnJT|jhQfN~%k7~YPOU%ao=oaq z{JEc4AJtiP-BQ5R9VD6kslI}lzl3Nh8rLR`H6V3A!jsG*Vw5;MV9ovx1?UETP`i-k zy7M7>9isVU;!EJrGHK0Y>hD?X|2WgyUlG&Dy}`*v4PXB`lh~D|rQluRKCm6=cfg}z zs}~U+v0sF<0e=Rq^f%rD4!VU9zTbEQr*esQLSYkqA_bk6-}-g;y&M+LVYx{ZkZvl% z;-kEmOB7^R(m>8wQpNZyN%}Ds_EK$qsS>zI0=QB-w5{@|ZyP6-Xb!7fu;Kdzd0dwo z2U!SJ84238cU!ECslT)0g!P$`t7cTZ5hRD|U<*cR6WLLXtB! zd|`}%NEO}aED|UME3SoSFQKt9WbZFWvq(jZDOrORZgJUUU@so6nF&K2c=cK&8`q?h!FRjAb~1pGjGz$zh*h9|V*b%| z$r2XViCXB78uU&WDqCJEk;s5Xi$~aJi+F12#UietXqwZjVxk(Q;1Vj)Ex#0kGWpA7 zJ#Q3;`D+|zpmtT-_NRFfUZGmcWR%DAT=%mwi~D^j|3O7Xzp{gdKaLQ=uf^fwCuRw1 zVYQK`j@d3awp3p575o7sP`Z)Kux;72F_bu(0wTEJGJJ`8qbS>z`Q1hAKg2;8=}tWk zs)zWJNGva<303!40)@cY=l%nJ|0&Qz|A==~5!c)zsncD!G0`p0=c5}VDvHIFo9$_5 z;sOBKH}Qi}(nZN+;5qqbhmyz^6NZ6c6CuyIXuX?M1u1gOV|C0%e0s9Rw3>Uh);*Rh zgWF?eQPb{I!3Gl*EBW2hSWWvT)X0jJTAvc#e7v%L%jDm&K6N=YO0p%xR0@Lml>vzO z>0qYp7F3A(;ONMSSmz#NSeF*GSLZkod1l~;P_n6kPUt)w8^7DVm((_XSElK}=pkrT zOT4L-6gsibY_SjO$Uh*6X3PFTnMAMoqJcxHe!vk7yCMWKv2!P+@r6DiPwXX#I6D;O zW)nYG<~(QMKUOWraj6;bf?~tV$t;w9WGF3KdE~BtgH2^-%HnnjGlk&XH_aQRWqkR+p6$O^R;Dm~x`7Ws4DerW0| z7epqfJqxqR`WVVHDc#n%I|@sn7%eWwoNFyo)$u#>FqN~U`x z2Hc)s%&E)0_*4JLp^#^P#Xo9(HG|y>{_2`wmFH#B@$OWURFI*1km5MpE*t^17>oKb zX5bdKM8#h{^!YsU%%1o~_qVZ)=0Je3KJKw8WQ7IMwMc?=n*7o%J@HB?)+y1H&MbLq zPC=Vk>Oy7<)G!waQTW?{pcnfX&pAxUa{@m3CQ=vE!)Ywu*63L;F?kuL@-4w%Zj~>I zSLu!rkxi*4fcj3dUJYt!A7YMvwPCwm)K**UzuJw?=Scx4*dj3R7XlOY`-QTgGmb3- zCf5imAa{jHD0QObGTo}>1e?NaSk|1XWr(KVRExAY3&kMvp=~&9)$rHH#OZSa&1Am@ zqX>dU4M4jO8lS9E8laYrA+!luMOm^2Yk)I5O>;*`po_+RqE-G{T+@_*?uvP;;(G-* zZYEq@5H^Rhf`PU}S3n>IdI#@x=32=frYNBb3p8qq!{*jnLLfe>Qmp8CHfK2ixQqSQ z@mwa#nVeMpeJt4@SA>44IEt-Nd1wEM#1}a<_hOOUGVF?jJO~J5vJuhHNB=iL1Se#b z^i32!@)&Qt{|#U%E`wNyvJ({e#DV|NHS*`XWB#AVOU*DUm@BSmoFsm4mqbL5UhF^m zMfVFQS73!Dpt+`=d9fl`Fy>Ejbz7nA-2(e#ZdW*a!qa*KQrrnba2-g<*EHG^{luK) zyG5&q$O~?ac0xUf_V(gypXiD1rTCFGtI%s67Bd`aV)n!QLE*{r*K#k+8jGKkl4=4{ zoF~snfSpoplaQY(Wr=O1R!oQqmq=Xr|E4%1{|EvJRh&K#Os|v-TPrHDSt}w^YWKuX z(N5>z@SQngj2k-3v24?reB;Fe_(lqyp|?XN=B!#xG16S}cfDgp!Se!o_>c0crINti zG;CGeZ>e&WLn!AbeSMm|St;rGVMJPK?q0)sudwNJlmdr(oFXtTxYeb5Lqqn(->=D! zljU#C)ueZTm-J0}1Xksy)5a?a>m>tiQoGWRHoB$KSi`^zqMTZ{PA0oWGKlBK98?)$ zo~Up;5uF+05t(;q{-Mvr;Ap9o-3ImZ$L`6phHn%k)DB0jnHMv6A0^Rvsy`1oja9_kVn)8DLZJkF zhLD@@-eMoFl=ACwn zp>P_>P~n4k8&Te+geCU%Dw~cXXw^@B(aThcPV=F8mk0-!pIMNq8Lob%=;>Rgc%%1K zT$z9ByzdA6uhT!A5a1MQl@?S9e)Q%6#viv)cq$vWSAG8@p!o$ z0&sBd=sa~#T+@9?kb8@pzEH{0!nY_iU{3CwAG$V9JU<7$hORL|;s$9mNkRQSqxYDC zaSMq8$SuAU$78P*%T8B}c{MdzVp{$p@r+tZDmV$;zxPeYn5`MPdDH#paC7!83Z9Wl zSoh{ef8NNqh^`r|3+m=#G82o-L1Trp2|YEx@7s+!$5qcMkU0g=(C{HX1$e|q75CBD zlzHk>V|sCKW+fIjK|ec{;3O2NvXt9nUSJOMP*!k4F9rNyXG&x7^4g0uQHqZOL{yg+ z1?Q)!NHlpZKX?8F>z|1`gD{}talS^(MmKH2?doL74 zQjtIH0xTn^VdP~h6t=RLz)-~1Z2GRM7VJ{sD9#;nRw&)PX+9Tv5oMoEyi${>>w``E z<5;(DC_goqU4L`(csB)vOaxW9jV!Y)huszO@Srq zDf7+JW)jRX{3E0`f8MkBR#DaRPJn1PubFo@#`uR!8OB@cT z-~Yb*eXPLHK9Y5Pji{R6+B_Rp89lc^O;_mT=P!a2z`Y_`1@Z1JTTNj+pRVBG7W}od z6KET&smz_gjBXXN2d4@$sE0@rgjnzSr=@1R_dwBz&>&vxPQ;jO;A5$4+N=0dY7FEc zE3oW7jlRuQQlt_)wGrK$SF$qrDsGmuF`PUX#@&Gr$Cs@=2fVT1pUj#P9pYx~uTLz2 zOfmZRFy|#9rR2x5#0Zqds~JEMW8zs3bOQ1F{1;n ztI={TBFJ01%*camu`J>j5}U;Bu3|TRUB0wrDMF|7uT#q&!yh(Gn}`Q>!Lg3nor20V z=!b?RVC&O-^k2X{q_|vsY#k%4$ciMdN}-@e#ki_|4k=i1Yd_j;wFoROS6n$Vw?&c% zPUdK~Z1Gl>!Z$MmLiw`iTO^{zJDT9f?K{7hizKV%=v8S_P65`TDuQe8U~%X12Yx4& zvFmqIIeJ~xy5Y9&1(@tKs)g^1>MaCf<(GLgl#u&GOjT^&5?s;mgUd8IRcu%v6o*D) zx}Sc!dnz{G1SKbfsjO4`6zf;a{A*tUyf`64CY^g&pp+9b^7$vJ<+)iilF4ZdU9oSZ z$m7b2nd@|LHJDwLmvTc55+#$ z9b$8Re2zX)ep?ix*^M(-(F|-6sXY>*x5y*ZX(qZ}%}XJ{1M#caHP;!tVuZ{c# z@!M2Rq?$lCn^m@$++)=h7k*kjEPNE^aDaElr~H(>-2Oq%{i&0r(Cn&{X>yvoJkVcX4+t9L0rf;+}_W9;eE5_rS)K>aT*)@~H=m81|A zvD<}91ag9#0I=YTa)cB)F^&XFwgk$YAHFxLkq-%X*T;tCRtoaTBBrnF3!Yc{+m4$>i_4@A`kf+@0}JEURdzChAf{SerwG zcbMJ9nj@_{ArAO)YSv_VfcBeA^Ri^J!zHuLsHT*Z` ztV?Oxp?7#?q!IWgp6({^l_H5Q?=t-r#(=F{s?bO`UVNE3VElx3PKvg`!+mF-?`lhO zx^FR&+e*D5Jda&wiPJ$&R$TxR1n?@Bh_c(S&IyC`&cL2hxOBQ3o5G5KXGMumR7>A3 z;Ul>2L2%7UU_oYI`zm;jC}3laFr&Sk^08isA2+v&c?RN3NLWEYZq@u@a)Xz~GeHRa z>R`lB10_?{d7L6f7k!&v?9Rk^%1yHSh_5`pR4ON6BSo*HZ?;(Vny*ti&(y~8_u-Qu zFSkqouel9H7m`Ew=Vc6L5g?7)ui=jL_(z}((m0P=!iRh=SdWI3C6y z-Pdw3DmuqH8&{EjdyjQi#my8c5d+*mr^fAv+*fk><9Ek1UQm*JTHMPlxt!yxJd+C3 zfLU2nAKw0D76n4%qksig_iy$}a07Rg6jO<#&-o|jX6}k=ljG_sv_OZiZ`DmR1Xl@w zDgTPC_xt(X?r;1|>@Nu!lSv|>3(Pmu3#Eo*VOi0-*it!UVSf??BAp7JRWr@Ue@wmC zIzE9|E50d6u6JjU)!~~5Fa2TwU+F<)_Nfd+ z6ZS2SUFx-hH>mUpdX|les|=lf@i65gD*CDp6gNvIc}WCUhrI5FgdWrs7)a8BN!ZGz z%d?>=;zW!|ZBbz@FJWV!e)i-ZQSd2qxDi5|!P!>TLuV`e&jf$)i^sNG>@@h0CANom z5~2xdiGoa|H0F2>jxUffvM>NK$5A3B`*y=4Nje}zl&-o~r$9AjKl8bB(N*=kFwYgZ z*C^fH#+ur8B-c?(Mf~E^S&pN4WhwwM6&KINHD+onE#j1=e3ZW`i?^Z;il5!f1t8&6 zlQL_z2t$etJUYDC3hiG>42^zai~V1A|LD8a*FrB@HsqS5Pf;Fxm^;la_PI_Y}ft)%Kx+}>&w0A9)h)P``K-*B>f zru%h9_ocL0-Dhld=N!@b$~OYG`)N0iQiX()x5}}v1J%{F_op#h#3@rKcw?rd46Ugs zT=-OqT7$y1F<6Wcmp}2@zgOIk*g_G8!3&COBKf1(ZXd)dF+sUm6~9L_C}uZCJ>th- zAf+h@YXy|WHmui0{|nt4aTG05V1*p~*C$SQXY$}-qO18h92;PyajM)t3_3x!D`)Q` zy;o6mLVm#^cVdP=>V8s?`@1UO6|gsHal57FkleM)mA8H&f1`!={Jdadpm*-ZJk6eg zwW+jge%Z=vsFFooXo2%S*Bz7kYk54rO~343i>FMv>DA-groMgYn}vTf8m5`VDH+5{ z9mY1XI;NGBHha%&9<=G;I#U`a#*(%Q;b9`8=Z42ThrIhxg@$paXIr34ANsYPeTxn`||%>+*U>s4Pjus>f^NE7xf#VyT^} z;OLDwGxV>olNI$HbMpq_fKdm&gsd>GOdDbgkKZqgpa76o#tU5Ns0?ALULjJRp;_k8 z=V?%{XJQnU(p4-2b?jl#UkkTt=#~T<^v6j%$sqKR$9s7($I4Kk8}N}dTqAeGuTYUT zr=lq7StjRmSLvSI(>5=|);V?jy8BhkTPlXUAj&B635iRQ{20q4`IGtFO%SrLRC|eyu~sKi^5}R{zWheIzJL{_m9!9=vngH@ zU&e8SWRk~udX-4X#3=IP!`@W&{uAFD!d7WuJbJ(6>ROf6gn%f2VpKRFQVkVE3Ugs& zRzV~aK2LWq=X4Y&P>UYt0zv`EJrPLvXXz)BY=gxi$!43`@?8mb&-rFUPFQ7;s>Wnx zNaoMeMvvvA1oc5j!aY6=O$oFC`B8mibH|XI`ibdVzGIJQ$y}=WV#R4${#VPy@!@F7 z0Ujll(ca@|AzT}DaV;E=+zxX_TE`8`+<`*b-IVKSK+CzCpzt@Cdm1ARU#6>iDP3BV zEgEL;I^59bh2}`ff-4D2Vyx!*Iu~9jp+lyn@Q}j46+GB-n}OLDlr4BMr9>PN0fOcd zL}R0!QaP;cWZ&DERa-mB235lGLigUdq{^ML*yrwKHU094X&~^qB@|3V52<#SLX(ri z&DZ7qDziXwIvwNz>w}~u4d#JV=`9BFF2eUoTviva1F9ICwb*|X7=|C#3Dm-&T{|1) zJjwnr(=W#xZLCda6OJ=N>J+@lOed+1rdHx+&*`E>^QBcG@^e)s8EWnL#!fe;tbbfK zc9rrS-4Zcd7YLhOLF=!~_A0_W;>7rS;=Oav^9SeDoQM$+%B z7!k+1l}Ov)>I%A}d-Ok&yQt?LJiITDoW3+ASrcWR-;^?KDn#;p75?2!yGo)-EhZ4`WP=5dc!ek3O7_By)#V3P7#8Ycd zU$UzAHgfmRlSR5a#^m+qdF5eOkSk)I7L}k-u@6Gb`f{qgum$>Jz3+dNYPOdGQkNI! zU0(~yqHs>0*fp=`HBw*$9ly9!Ev2kpO0UC<<0NrlCRlaBhDxg?FIc8c5s5oH!0cG> zQ2n%csV@9O-{{5u6Wywep$D1k=rYC94v4V_5kL#ZeS% ziIPD`t$vW<+2Tt@yhL3{i_GJ|3)%xjN+Bzz_k{ws2B?gmx8@5pah^x}zZbgGu`>BF z(D=;rz(0xD$DeeaR8Z7v*69pONJFWr?hn`Xy?KSX(dSW_ma8`)Cb~x`Lh9 zYdF7cWGOnwKCQOIZ^1PJdbg$n?bP6IC?hZX_yWL zG%wl?$9aoIpL{(AZjo+-0mi`1iZw!J_}h!?x$7%<$V=wE%8wL!kU69xk_hnIPGJ^m zC`=TeJK0E7+e?C(id0KjR+i3>lP_R7fn!|aBzEKGNIp$7p24lBBi-d#mpS~{FdW_= z`eh?*h_M(2ln5q$`)bG+obx)NdMAWbV^~F8&HDnv#sv`qw*0;Ci~v7KQ(tj^!%z{r z|1*b&ybpAd|AW5j|08#JXAj*YD=dJ3g-aF=@(#5RN~ll58&<1}ldtrCj_T!*7vv?u zR+4Y1N)#HJ#hGITfTVhUd8ZZ;JY5Ve%769_JbW=ZwrZSD0>u328o^ZGptrjJ>_>n^ zAPFY@dSPD@ok)7Yj1NNqbaSH7tOL7dOqy2=X&r*nX&NF9L{wQ7DF~uVto7gpz*iEc zX8N)&6Dnk$1#aFI9OE&Lgpr{zNG3@7!~|~bt`nt8%FbpI(sY$BF;v9MZxneV%e~Mu zipN&%zTDq12@e-yg*@#FB{BM#$00lwQ%eOv6iGC zE9NUbA7_6E3C$WM1)og z=&_C9UyqduFd)>9Qr7)lkAPQ}1Z`5sCgJ0P)PX6LdQqfnqob8Q<>+rn=QQCM?`hPo ze-#h~eVGCfr=a7wh&9=AXep8CMoLPtgn zhy{K$k=OhPM$G-W`Vq>3npH#be$pN`(GKd$I4_yj4IYxd)Tg??_mME;={gmpBuC4K zy#Q>tsF0`%&ee7|4FqiPyWp-?SUS0@9FGdFvG14SXsj|}6Cu7&N;8ZH6#TS8b{JfK zGUSS<2N}hwHnNt{fU8i9qclp{+QWLs=J#O{|1FD|`|T69vc_3PmTs+FcHf;d5+udx zCmVdSxwjenWzbX6lbT(bFo-`{D2QWwAlI77LMH=rX5yDB zA!_6TDk2{aqyRgW>4OnnDBM*OvH<+&iwDU$m&}u2pnW?R=q-!@k348xY0h+(3wRlZ zS6J}my`EgFbOGbabp8Y%LJgLJX2xzT8nxop2F93V&SV#Oc7a-O zr5pphFWCtu{c|6OO~DnCN-QbpvN(zPEV4YOU;&F_F^*T|2LC#FkqpN zh-yaE1@*lk*OkzYf5#`N{DQ$-LET3Ds9CudsE;q5K!mUM zNj|z*YV>feIF_67g9i9CUEhyxv9CU1cYLaxKq|^jR%tJi`X?i)y1M&tmAp|H3N zU=@7ypTRmxjh`m)D4l>+WT>3Hi^ml|AD2B2Zx8js${x4$=Lhp|Tu`W2@k&|2v7#Nz znkK(GFD_>R3tA}#oqBx&UomKA($#dfrU=t}rj+ODsp3!7R2xo{D-{OdFjr9681{)f z`)s>k-~V6yuRHqpUBZb(@!DDgP&YV*muQ{k@V`Oa`MJ|cd#$p-{CqZy+GxRd-^2tuDR8n7wH|RN>g>;u* zQH|+0rOeVBoPcl*Z~*V_{vR$whnUSO|6&~Z_A!89b0z&ld!sTHy#9(0j#4(ePz$rd zIn8+v3jSWqThqGD(OB~#b369l7a!$`9!zuD@7D6!jtxphU}d5fLj(;gd!st5yf=qg zwaEHp_!`hS*u0~qFVt6ng$cQMHBRjSH*2<^m)bYY`^K~hIz%Q2Xy`}(Z@Ct?EY~Ot z!}*y?ZBItkbbi`j#+$}>Wj4l^HYTBkO%emsO*ik}*>Ccxh)e*7Xq&1_U<8A|LI z*FE8vDtcXzA#xe#tIr?^V*6AK$`TB}oPXv5L1<5ExTbeZOo;0LsE&x?T;=v?S2L?n zTdt$=rCMzh>QqGyN!BbpL|B?~B~& za%M^%C0mknC|4FlQ4&?ukfLmt!?H6DfCJ!&01kWrkfKzI&`^1i7u}V<%esR&fs`nU z6e&>?$%w`tiBD(A@-C|{u;Y)KkM zTU;F%3rIIZcp6}IC{Z!-Y4*uc!Y?dW-v~$!Y>lW~;!qkAUm`Szsw^8~Q09DaiV$>S zL;WRPGP0kdXfsMuIa1Drx!q^h|%cpBD~MXqS7K(?Nx;WRU2 zxLj^0@r_bT-U>&xv;qW2?X&%7DsB41J+i+E^doD{XX6;D_jjZCT~z$qFL zJ1y3OG*~SiWgVPmbxfE1Lo$g9PZko_d@&RV%~>78CpB8F2nznp+-0UFdHo848`9S(l2X?c~Z4^d5YNe!#KJ;#+*mydTaKU+G>>MTI~Wz0@=00}lL| z+`m36g<~nb32A*X|HN`Z>|&XOn=0g7_FdvnE?`S#sKnBe@&3$Q39_m;N12>6()#+IhwWkSe zXBV4i`TqQT?#&UYZkSq2|BAyeCB8x#$ zyVNxp7NWcK30aXf@Rpx-&j5E6y_6ILtxw%-X3 zqp~zsg@O^+a+Rq=h{zDaHo+$r1^Iy9~L;V4_mi0#$_?&w7Qx8Cl}6Pn;93wqU8Ka9Sw5 zQ43XA?~{VS)hejgI!yMwzeY+MIUBxUEc})-DDBicEeTdM0)&>|8k4R*JxAl!!1EI)tw8})~*!Z7Q8-5q~5r-8w`T@vzOB+L2rt?|~fPEsUGYseAM zQ!dmQ|DKiQacWuvGhFLm;hvKf5y!+*Fhs)vLiZ`wYH$nMV6?g#(1pj2q2_}Js!-{fY1XM^J<%YTvRT}La)gI4c#j@7$|88zPPAgHCt~_pr&eJE75`ow0!H|_*BZ=a`0L(8~mTB2riFO?-7_L3%`z+O{V3!_)5XLx69ip6mt7wZRXr0Zjt zbpay76AT!4T9Lq1I>cvLy|w1;obC=x1L#Mbf_lHcT&K|ILbhXblE`A2RhkPKWXL!u zBc^HErT#=Q=C~Mz=UCX7hpGD_D|Ng6!sHyRc(W{_TiQR( z#a74}FoUK3NuE6^k>Jr(cr|TqnZf3#16LOhUV^meAI5h@91=MAcCR>lP$FK*(z13* zvv`43ODXS@gR97@5s2MU$t72w-KNT-Cx%ws!_19O7X*-WD9g)9GrwIHfJ{0Dm&RiJ z2}L<;-~u?Wodx)1(j5p|dTIMSawNPo=$OC8BKRqL9~uiB5x8*F2Y#`8*>9%=CFKYO zdf44c&w$)8Dtu#_uK`e@YSM80DUn9+)UJ>8UeGIt-7OGUfJp6hn#v(-srimU{;)1efEoJAcBn`YWt0C3V zg=XVqC4CJMOlRLslPr?}i}Q1zJi+=vi;tzG+?vv?aWnj|5B{X!AUM)8Qp4*T%)!6I zIzZErA-^~fekdPNnLbO2!m0Sf|K32~;vl{vr((9QS2&w)L@}_Yn%IqcayG-}7eg+8?51gVldxn*zgoyl&AonZs3lt9s2U>TNF zK)!!1E`;)Ml&!&*yZN0snv+W7Fg(Hh-KXAx8p(C4ho;LC7=41AXSAB54)P8*U^em5*4lRG%{on^qd5ZP_m(svkskNwq=7I7<&K|8qw&CMXb&u8031oz$FV}7f zH)pow;|?gmPv6?~(&43vCLd zm9kjuS`34(F;{#n1hR_BWQnc*Iq-ng?X75AHJzg9tlvP{ApGhfLCK<$b?SfRJ48}5 zI@%nr2L0>Vbl$1_f|MX8cXWcNBItA=e3&nP_%Kl->t}S~#e9Y}q<;LLZhXVc6%C%x}~yWS=^_ zp=d!8ft<_I9p+a`l7LiFJl`l*rIAcC1k8~b9C!dcG={*IK(MEy6W{h>!#5@RoZefVfo1!yWS1GVRZ08z0O!m);au_%z^kmFc4E!>k2 z-}AjeDB{iem-$^kOiQJak9;SvF+<=c9|+K7?z!niLLP+4$#T$OE6f_!v_)hoQ|;qZ zB|oqb`SYbQC^9Dj#ms939wNL0#|p2!uHd{RUwXKkie%O%e?ogo3!A!1#FVpG(&FH^ zun{M+BVoKb&5(D|xL%47IU5r@=aY@n#;+nx+WLv&POK+8L#|`Mq(FqsRu9o>V??LbV%WA7Is?D%^C&+f6FV-|kOhsV8zk)Du zp6up9lPzT#J5(b{{wUifMIo=lbyuD7*tlY_fYWlP0RqYC8@1{%%13$1T2;X#W%Mkp z#a`rF$fQMR)V)%GN~?z|?(@@0qa;skg=`E3xeTIdHmHS9V+f3n0%%2#Ra`^i z+WR^3ttkP{dSuLfEXoeIEUQnk^!J_bsnG$@zVuhT)J4iGZsAfLpQfijBxar6J#SCp&WQP(; z`@0yW@vT;3kxCzlPeE`)b8(AA7wVD)HRGbuDZ-QUciRuDl=D(j#6W^#2t*g13~1q* z&7#x*W3%{Z1p45>exy2}>`TTomiPi=X~5G9`O9ub zDu7&`f98W%MU;XVX?a@OgA&D7t2^}DSOsMZDW6(y$hdg;@ZC9TgN1MM;sRn9BmX*e zM-bz`fBT&u#XU_Sk<7XmOxmJ(tcvxy6}2Yb2hu8ea%x}Ur-+kHnCe)};lBjYS_#vfki=*+KeZ*7MHcg88L+ZqU9oW!y*UqB+=AITX@EX4;TQ1<#=m4Q|Ok#^Xtb)C%mnl$_^}bQm>UJ`OWqB1!l)%=l7a^arx#Yz<0sf@>-M@FLm-<^u zSnh)1vlUF&5Ls=a8S#aJ7NzthT$>YuoE@S89;Sa9lXUaPNE6a6P#9zmdOMCMy%)u;{V%;#A5Tx3ec zhtGyMoeBU(P8e(_`yRd6MQjX$!G{@|(k^6{>57!s8J+cWu|z+BL5BmYQ!DpSN-S%o z)g)Hz0Nm)|yYPfNa^13k4=UB4p`

gSYoJTvIQJ5-; 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¥Zq~y4O{{3u%-I~qMoBHHPvD^65;luYA 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%0DEAVoCHjSKs|4FuLMXJo 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 literal 0 HcmV?d00001 diff --git a/models/ggml-vocab-falcon.gguf b/models/ggml-vocab-falcon.gguf new file mode 100644 index 0000000000000000000000000000000000000000..d4ea2e82271d06db7b9cf08adfd8ea71f4b32280 GIT binary patch literal 2547782 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⁡>-Zuc_{K5L(R-YEohf5Cn#BAU6cvYA)+Ao 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⪙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

G%y=j)x3>Nv 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

kdR3FRD=23?3d^m!B6|Q5YYUvE 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Ð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⁣w@jF22fw}2q~#gJC33t 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%0DPT2tA~BN z9=1VAxHm$6skpPVN>YbJu# z%_0xMN3WJ%Yxx@UafBg`L>!}nntvC^+e``t2MHB~>!bqKzUf@%UroRMvw9_^xwTNj zJKwup)`UC7@!C*&=1`TRyS zkbmhV%j%=wRIQV+ZJ;HTZz@|og4nbtfCfKorTe+*v)%+*DiI{c>%$kw%t?H{Q;CHX zzc>^0U8vV15aMMj;7&5V`ZL`1FVrc@+r>;MV!u7zsQ=uW?wNJ~26HL^^sd*)M)sG( z%%&Qi*?X;<5afX~KBgqJ*o&lI5Ok`PiueRbc&M5F0S8vExaMZBWWEu|VHj3jd+o7} zQrYr1{KPx(!P#>QjjL)qHsT|`y{E=`%Z@Fm)QSj(zkrHFsU1DH@1h>o2tvdU%v0+i zh;Q-qS(mB4-zIzvzTQ%}D<_ z{@Pijexs1bjM9{PJK0kSdpl@HB2$lAK=)$}Mcq=JcU?UCp^$3-QLSn;-}QZy z4j)BH$lm$|h{GOTqfJ3>BtRwa@I!zZ&9rYnfu3NiJ`rvgoA(11vg^}Uzaq70^eOgT16lg(MiWF|5jy-r(u-dg%SR^Ui;>k zrv_`Z9f39f@(R5A{HOjmed_PeoAOZCX4e)vkou&41yfk+E`jd4r8TcgBOjB)Enit< zs|ISlUjNcmz60vh&y$Yv8EW{jur_~LW|YMuEa!YU|MSK!ZmTp)*3&C9o?45=InMToBn3cmKZ~SFZnOVZ8JYv|YR8Om5e_Ci^<*v&Rpcv+p`NMd0azTZYt0+b$Gw5Smy1JDwy#}~p!32c_QQC8eR1Pwt5HEJ0srbBL)(7Fjv@=*^i};AXR;NRBwjJ<=Z(N4w0Ba zaUzX0$*%4tm8Y)%jA>jLGU zAJ=!jF@3dGg5&oSTJzR*-sG)j(oupDOnF0AMTCUz%vl`uEV8eac;a2n9s{ec$0G-$ z!^6Y516uu@OF%wat4x_jZ6}aj_KyV5y`2rxIO?gmevtt2h*Z~YW%@W*WEgs01>BP7 zs-D=av4{hi>rTrYiC$FK$jRKH-IgW2PC-&*JrYjk`CbD9Bac7Lc@%e6c%bD+$#-q- zxgdyUtE-?}?G&LBcCZR)>Jxdp=2hjZD9CEkBASoFFIW03h{W)*>&-Y|tLa5P1UUod z=znrYB>I3m|mN1nne{s(`>B}f16~4E8VePM|0DxI7AW; z_uaI`<$BUlqc`80zFy0g5uBC}+W_4zM!PXxtJ4F?Xk1V!abX6cZ|Sm9PlN+01NEzM zU~@_sT6S+Y$gZh;P{!W}8N7(9-y8C{&z7Hp%C4)m5t$NUlH8>}zScmB8fhnfCL!CS z{!p;A`5e-DJ)}j=T zu)1Wb)JG$&CHrq`@RPgt;2HiEod=4Av`F3RS|*q2F#HW%Hip6Z(U^O?DXQt=9Ciw@ z(|3%gfqwVy>Fn&h(IJUn{?JN{XAZjs?V3fJTX27CEH;lGsbxRHm6O(}lNu#XeTl?m zzEWzFaug`+$l9{Hc?<`z$=V|jv$j+(5-71`(s|PdIoL-x&%!I#W~|wo=t^37?p zmP;B#ELSiV{lm?M7y)yWPVZQ=r@GFiHz|z7D?ASCVZPGAQ+L*CwxIMf;0FyK zahc_&f?IJ=C?4TJzC57dqpjw!`-@EpOd8?C0L#P^%(n&wM(gsT87W|~Xo7zf$MMVJDhFz&(#1eFV`{r7u7R!$!nX@lV+(bZCV z&#xMGQwY5 z>x|plcqU$t0qM%*t8>xPTGP`{<-60%AN%*}*oUmCFH3Q>1xs?qa|C*QrZ8+s`*TKU zquCS;_T%;u)9BGUC?(vW@ruxMxkr6?9gvA%*PolrC8q+h{!|(~^I6OW=iuNdNNm?2 z9CWrHcmSi}t+++Bf)1CB7ODFD(L?_jvWh=3&2Y1J?P99oycOme*AhjRfHpmh353A-z~Oq{>>iHBqd& zgJfe986gqeiEkZ8ttbXvQEE@GsGR@MY%-cM2x&J{0#gx!tnc4rg`J@_dLhTP!Ez%O z=cnx`)mj3pe*Jj8XS56@`h^x@7SqbM#6XkE`!KzzM}1UJ8wFJU2%hO(mA0tJFi_mS&BxhG`NSt7f~*yK05eIj*GklpEA!PMS>P|qRDQk__8P8x zyP=qkPN)W98U9c`7x7N=LoxLM33f$@5qR*4sV~mnaeXKhYQy3Vi}jziK9`;#Hs0An z+wynoR5lXy$0ga>+l$EA-U%tZSMxRN7t!*0ImWDeX$XGmflW(+BM4xA3pL$!2 zk|Q$}9b{lLg1nZ6Ag#W0CI&|hqd()rUi0T27$F5q9f8isPEW%iS(WI+EB40Vwz;uX)d2snCh zo&}CX!Wa{sjQrsM^eHH!*8VN|4-c>(r~Hy>1(9xx+Xg70 zYE_IYuYOGV3O3ji;!M?s&+Mv$RFF%SQn3l6=Z^f{tGUB#5jEI%`0S?7Rn3x*hbiT+ z{=9fbWxLxQZ022EORQ9o&V~0D9;r1q%c~ch$lYAuVsBuJB)(71mIY!tb)bf6(&?ivoSf?x{^r|Sd<(S#;6$GdR;2r*3*eKy{z zD#O05ss#Cr`Hy5A*jGgG-J*8`v!l#igzLIs0EK*Z9`g%;$LZB8W~%QadFZEB=SH&c z(dA&aBC-N9_1&TE8>3g0fI^%4DN0U_E1;sk&Xf8g-6xOTWVuEx^hHjBW&W*lOq#i1 zUz*Fr%fMH6LZaNlq}%CrD>x^c@;o?fA9=|}&0(ukV!;T9ws!7YkPF#cgf**%Eq0ec zeZ-q}CAeFceWFy&zx<9*Ljlgyb^rW+On&GyW@a|w^%`|-iLwjSm62Iw7=x>51L(g=i#s}MR{&$8$t|5=xd))u=Z$GA zOEgT0F;^ia6CS2Ai+xzz)JL|f3>yA3Qf6w=(iMp#1NLdyPVo>}{z&&A2g1|?+H`tHa|G(}-c95izl z2Hk+y{V&L?VYv7=pbm7UHA|s0RE$Bx$a)E=o8LGZRQh?xs+Y!9sPDoixmIkzXkeh| z2Z@$88Nn6Lz|dQ!P=o@baf7^h8cXj*68))CMdg~*H%4Rkm%sFWsOO5lb}vR>34b~a z=1_SA-6YoHg{Y5uU3qG2$ka3 zxF#bO=P%p>n>n^UM#Tlqywt=%MoBG#To>5H;-TwM>#e$wPkpdZ{%99tbk(L2-dCjW zE_TGivF5GmdMT-gkEX}<-`x5DrmKRwKHVVisuloNK0WoWC_MMnhDSF&JC}6)$Gt1L zIU%&>Ztm1X)^o6){()9N^(Q7BdAgBCrz#<`o{~~HQz(gg1Nkq%oWhbh2BJDk6a7A| z7Dfeio&0eMNrj;^ERRJATlexbVVJiUIc{(t%za9#TC|xdYZMiG+FvH5(^KnYB>0*M zVLA<=pimh1$m)JuIZ~OH&eeyp4O^jqQJf^Rm|?UNV1Y!yDcIj7zeo6>uUFbmsf-rr08ZE@>iOd8FBxsX=z@?ZIVL+*B38gCLOkv(Gf?b z*r{r0v$$lGI;JR=3R|^8B;)dFk z#sYt2*1!k=&x!>pP&DKAtw$6-jY_c%a@vTr2L~=^m|3Rm z$MwA>nJG4?@b1SLP99e@`Ns5?uMQAZJ6pdoz2W2C-eYG+G1dG~vk!U~W8#3n&9SJ1 zK&^q;>sRX?a*doIB$tc)x!9;uEa2m_xG%g}vz!6~QbMr1rwxTt?^-UVNcq{ma+8Wu z*kwN=QKA+z+GR%wcMIj0El)8n)hn$xLY{VuU^zmR=X>e6E^`cf%`{RdE3It=S z1PWA-=A|9IQ2t9+V^IFzvQ**5vq)fI3)^*{_LUS9hn&c=(E6#r7aX( ztL3oJ)B11tAh0Q^Y>y)y*jcvB7(+7AnF9~V3m|)CbS*7*<=oUN;kKH4~2-3qF+Ca$RTa9hjW7RNIBmU|Exb6ng z+3g{8>MYE+r`z>C40$J)!{9AD*$?8aB+YYo-KUH?M&NBs9W2AWBNDV;WH+@2o!G4Jr0pr-;|QM-FxEtC_h*5{OVhZ@*WW*-4++cT2c%e6W=A_0pC zK@4nnbUEo;28Iwt^|(EVlVK-#CujkHnuQuOnv8Uo#o;YByqV39E`)IdVU(GTB^zmS?-%m#BGna>ouR9{zE-fSvwhb*k$W$^)6&3k$BLC$CIhCBh@Tt zVcyV+Iq7eoteZqJt|{}jmV}wTI7@eB3wTn6%tcaFZ+v2zsH=@q8#Jx20I{!HIG{Vg zd`#P?IzpU;+Vt;CpEKFt*<+4J*nSLJBmf`_+=QVo)s1?S0w~drcvFR;9c&$0iR*oQ zN3dWn=&TJZBuiuA`t#NI=&1JkFMXU3&;dfN+VaJy^k~b0OrC`(*qTwlTA%=gw)i&J zJwqir0Hxc4xq?tIp1j-Rz3DyU4bkZtrCMvAlieHNI*0zCfAuNdg8zPc`8Ty90>URx zEL15T*gFYGm%zp^OMSxjt=CXdiD#+#)~XjU6D@M}NzH7?7;IE^Cq?jhyPN z{QpJ!+@Jsa^m)?;F1tz@wLlmEBh)HZx}Vn+Mp%-U(4vrHE_H*hy+QjhjHo!_tM!=* zto)Yc3Hd*Z<4&DIbwG?PO4=YX%M{%uUU`^Zs@0DIJEG1MgDCRc5lGLom|0;CB_m>p z`dTPHlrN<3i)sJEm-H3?{ zn1DXFk9(AH{Y!uN}2Aaf*6 z)L&|T`s%;bUrgwHIKAyH!r*E&S_C2I=j-*~%8kl{WgJ9ECS>k_`}`%JZ(b(6TrhUl@=o(q#-G63{#{)%*}O$Ntc zk1xUp++8ljWdH*{41O~tOfZrhP*2KIJp3q}jxC73XiYGNSDS4|+UF;}klj2h;^p&< zaN{z{2iWNws8lY7URifsjY(5O>sAM!oj&g`(B^ieXsAPt_oW0Gq=B30!KCV;jEAkjt^jD~pMS;RHW|Az% zKc?0HV7dA-Tlt4f4^zw8h5UA36li!FiKGH5=?P@>MN3q@G+MRf;9(+XyI4&M2AQjI zbcIOz6{k=y;*0E6Y}n@HP< zc(7I$9bvxt&FP!NEp-C6Nf9u)x^IslT!&id=z1V`*`TOKkA2m$Fz z9WWRV<2an6zcO>P<0;fVHaJd4%Ey)wFe^SC?`+#-bO1bwKcV$O!zx2F#!aVt9rrH~ z9R(a4Eq-UZYoSm*kD4KbZme~BRSyCB{uilfk&r0g?ozovYUS2K_|>0JFT=PTbt`S1 z+`aC8%G}})U7JXJpf`l^y13}Sl^?nPbo zuTNj94XpvY0#e9=-sn2L*B|`v{@?V!`%s_Na*$sU{NQ|v`7RrIg5qHeNCjg1SPH+G z!mePsj?GZ2su_&toGVN>D!mZ$WYTto?Cv`W?L30e%TE1x|2dFsV;ialM;t|DY&G+F z+znw94CY;nwyHfjfnyueBfg!s)3>o9t*plNnG+d;g{yV4{ihG6mmm5P)5JlUw3g>L zWiR18N3y%ToGzGG+vrRv1=i^}&f5?uvq|wT@u?T>x~SDw&_T6;r+^D3GnB_NE%tjJ z?fvOm@!2<~FV}zG&;Ep>5&E&%1MutAd%KVQjpJl_gUIg8J@v?h1N?2ar5d|p=S__6 z^%j4_ksac)Ep^ht`<%%J2SLiX=?Q&q!~IejNP9)7ZH&3bi$wF@1?sW84D%z`#J&12 z3=>WNlv85W>JwVa)&$l5;|AfRp!WuMM&t8^UM80JSCxFGrUBpic8M)91cW`_crBEH~ycVo^VN z_69OFl1m4t1~!F?f4Y_x6+RW=iZxI0kR&Pd#(-{p!PR&>OCTNx8?fhr=*EvZTPR~G z3V=gsnoQ~1+zrg>2#?ZLOM$^SxlKtB_}r>_2Z_-ZkaW#5EG+8FNuY>;q>>v*U8|pu zkjl%Cy+k_m$|S4xa1K61O3Z)&(=1S@#W1gEEGnIVi1S6hChZdQI>%WYJ&gpV8mDA* zozMjxcZ)NSL3ASb`CcKj(Q-kSC;dX#Vcn7S@%qQL6E39Fu>e&gxJp5v=B$MsIY8uk zKjh-76~*NK(?i=ER4YtR`9*T6S#vS2{3Cz$nzHfZ#rGla7(`Ty1o}>~P9AEfj{>a# zyVnmVD?M@&?G5&!eP~gR~kP{>KOs7a=e~ zfnFoaavmcPyt=PMOUP;h;7^0(_{Ae5%9g3*pkJw+P-Pc*q{^$0G(!3N_4}9Knbe!% z^^a>w)F}KkhLLg*i@0orW5{p74fH;t0vw&`P4eyW^?uG)jERtf#XsX*NsbUgc zS2G1JWGhMFz$})%%1MSu#c;~Tk&7DcA!37Ddf8VCaku6;fj?#%3aA&S)}Z4<%|Q01 z{yopu#Fl>Fe|!Dkrq}$R{s*Nt!bDMda-ia(lQ~ja`y^Buc_EvkoS%RIMo2f1#&8z% zmn@&~r;rM5QDfjF_#ils@Jx$Eu-(4{{3}M6ixL*q8R_1fmtS-rgEh*xPeD55Owf$_{Xo}i!A49ec;F0c`wNxbA6mbw_T6X5=stdL- zASM&|uWOyEc=V=_RVPglGNqMYX4yC9-|iG+$^drLw5xtj<^`dq z1-}nMH7;brhm(tX|GVk+PrL|X-cRfX8HZm`saCAJ7QLMS7Z-9A$}}>i&W&aFc}>MKJ6HF>n^Grf*%2h{!}&voLx# zW>2QJHY{pzyLzi4;mz{^2x{14n%iV+4->@yOJg?@y5%35z_}+Byx{sKIlpyeZ ziUy8*;;rIu?pucuy9U2ttxg?Mdo*qOnb(MMS%%^FV(?Ka?tdaR6@UdHQ`D!L{Y&-V zH;6UYf5RwoqYo8!-z77*_<1h)`+0qvKyrpD$jo=8#?>PFmrA90{jn8>L^B{UE6q&5 z$N1>pmn@$mI!S@&;R}v9f9Fnp@rw!lmm&#A_YtVzn73)&Ad1Mz8%0b(sxhAebhcIw z4TRWxRcMR`gi#hn3`iGgV>jW+9f!ttiAIdP$h8yweTrZ>V0_K9 z6>BBK-|M4U63XP2#o$s)3ZB(2hMnM=SfSmUcI!`ZyjJJbej8s>g-U4hZ!xU7b}A#K z7O~Kb+_2^@@T#2)s?ZW+th@-NRd+s(Eb3n1rTVI^mFzJXQSqVBCu+L&`n%rZ3Gpd+ zZGL{FvfyP*e%nIPlADPHuBG1sQ}n%7$>vcuf>uc&S>o+x$fVA;mLzvYKS11v1dT_4 zG$j*VqZa33U#S%^{C4O|KtB`~r$9(rO~|kjs7Phegq+dLxw6LYO+LAcZL;kHJZ!6Rkqx2G(EbSx-Ej5cV@r-LizdiTohI2oMAFFn-U9A zmbJCo%-Pj1tWI=miprIF&~Su27+Wt0A#UL{9=K=#;nkm!KI#>rR@NF#VWWLw{(#{- z?N6h;e_S68anpn*S;ajwIS$9Wu&qXNcadkfB(?-LxTI>Zl({q4WWFH_d^5L50R?sN z&mNE2LhAX{&y^opi(6>6e9ID5#-Lj2!x;mp-|0<9^@pt9W`(&X&iD%ZB;~�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⋘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 literal 0 HcmV?d00001 diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a19e1376e..61407e573 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -7,9 +7,6 @@ endfunction() function(llama_test_executable name source) get_filename_component(TEST_TARGET ${source} NAME_WE) - # add_executable(${TEST_TARGET} ${source}) - # install(TARGETS ${TEST_TARGET} RUNTIME) - # target_link_libraries(${TEST_TARGET} PRIVATE llama) add_test(NAME ${name} COMMAND $ ${ARGN}) endfunction() @@ -28,10 +25,12 @@ llama_build_and_test_executable(test-sampling.cpp) llama_build_executable(test-tokenizer-0-llama.cpp) llama_test_executable (test-tokenizer-0-llama test-tokenizer-0-llama.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-llama.gguf) llama_build_executable(test-tokenizer-0-falcon.cpp) -#llama_test_executable (test-tokenizer-0-falcon test-tokenizer-0-falcon.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-falcon.gguf) +llama_test_executable (test-tokenizer-0-falcon test-tokenizer-0-falcon.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-falcon.gguf) llama_build_executable(test-tokenizer-1-llama.cpp) llama_test_executable (test-tokenizer-1-llama test-tokenizer-1-llama.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-llama.gguf) -#llama_test_executable(test-tokenizer-1.aquila test-tokenizer-1.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-aquila.gguf) +llama_build_executable(test-tokenizer-1-bpe.cpp) +llama_test_executable (test-tokenizer-1-falcon test-tokenizer-1-bpe.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-falcon.gguf) +llama_test_executable(test-tokenizer-1-aquila test-tokenizer-1-bpe.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../models/ggml-vocab-aquila.gguf) llama_build_and_test_executable(test-grammar-parser.cpp) llama_build_and_test_executable(test-llama-grammar.cpp) llama_build_and_test_executable(test-grad0.cpp) # SLOW diff --git a/tests/test-tokenizer-0-falcon.cpp b/tests/test-tokenizer-0-falcon.cpp index d51851e20..0f3c50bce 100644 --- a/tests/test-tokenizer-0-falcon.cpp +++ b/tests/test-tokenizer-0-falcon.cpp @@ -1,5 +1,6 @@ #include "llama.h" #include "common.h" +#include "console.h" #include #include @@ -85,12 +86,18 @@ int main(int argc, char **argv) { } if (llama_vocab_type(model) != LLAMA_VOCAB_TYPE_BPE) { - fprintf(stderr, "%s : error: vocab type is not SPM\n", __func__); + fprintf(stderr, "%s : error: vocab type is not BPE\n", __func__); llama_free_model(model); llama_free(ctx); return 2; } +#ifdef _WIN32 + // We need this for unicode console support + console::init(false, false); + atexit([]() { console::cleanup(); }); +#endif + bool success = true; for (const auto & test_kv : k_tests()) { diff --git a/tests/test-tokenizer-1-bpe.cpp b/tests/test-tokenizer-1-bpe.cpp new file mode 100644 index 000000000..85a59a14d --- /dev/null +++ b/tests/test-tokenizer-1-bpe.cpp @@ -0,0 +1,113 @@ +#include "llama.h" +#include "common.h" +#include "unicode.h" +#include "console.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv) { + if (argc < 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + const std::string fname = argv[1]; + + fprintf(stderr, "%s : reading vocab from: '%s'\n", __func__, fname.c_str()); + + llama_model * model; + llama_context * ctx; + + llama_backend_init(false); + + // load the vocab + { + auto mparams = llama_model_default_params(); + + mparams.vocab_only = true; + + model = llama_load_model_from_file(fname.c_str(), mparams); + + if (model == NULL) { + fprintf(stderr, "%s: error: failed to load vocab '%s'\n", __func__, fname.c_str()); + return 1; + } + + auto cparams = llama_context_default_params(); + + ctx = llama_new_context_with_model(model, cparams); + + if (ctx == NULL) { + fprintf(stderr, "%s: error: failed to load vocab '%s'\n", __func__, fname.c_str()); + llama_free_model(model); + return 1; + } + } + + GGML_ASSERT(llama_vocab_type(model) == LLAMA_VOCAB_TYPE_BPE); + +#ifdef _WIN32 + // We need this for unicode console support + console::init(false, false); + atexit([]() { console::cleanup(); }); +#endif + + const int n_vocab = llama_n_vocab(model); + + for (int i = 0; i < n_vocab; ++i) { + std::string str = llama_detokenize_bpe(ctx, std::vector(1, i)); + try { + auto cps = codepoints_from_utf8(str); + std::vector tokens = llama_tokenize(ctx, str, false); + std::string check = llama_detokenize_bpe(ctx, tokens); + if (check != str) { + fprintf(stderr, "%s : error: token %d detokenizes to '%s'(%zu) but tokenization of this detokenizes to '%s'(%zu)\n", + __func__, i, str.c_str(), str.length(), check.c_str(), check.length()); + return 2; + } + } + catch (const std::invalid_argument &) { + fprintf(stderr, "%s : info: utf8 conversion %d '%s'\n", __func__, i, str.c_str()); + } + } + + for (uint32_t cp = 0x0000; cp < 0xffff; ++cp) { + // NOTE: these exceptions seem to be necessary, because the GPT2 tokenizer doesn't want to interfere with some ASCII control characters + if ((cp < 0x03 || cp > 0x05) && cp != 0x0b && cp != 0x11 && (cp < 0x13 || cp > 0x17) && cp != 0x19 && (cp < 0x1c || cp > 0x1e) && (cp < 0xd800 || cp > 0xdfff)) { + std::string str = " " + codepoint_to_utf8(cp); + std::vector tokens = llama_tokenize(ctx, str, false); + std::string check = llama_detokenize_bpe(ctx, tokens); + if (str != check) { + fprintf(stderr, "%s : error: codepoint %x detokenizes to '%s'(%zu) instead of '%s'(%zu)\n", + __func__, cp, check.c_str(), check.length(), str.c_str(), str.length()); + return 3; + } + } + } + // TODO: why doesn't this work for the full range of Unicodes? + // for (uint32_t cp = 0x10000; cp < 0x0010ffff; ++cp) { + for (uint32_t cp = 0x10000; cp < 0x00080000; ++cp) { + std::string str = codepoint_to_utf8(cp); + std::vector tokens = llama_tokenize(ctx, str, false); + std::string check = llama_detokenize_bpe(ctx, tokens); + if (str != check) { + fprintf(stderr, "%s : error: codepoint %x detokenizes to '%s'(%zu) instead of '%s'(%zu)\n", + __func__, cp, check.c_str(), check.length(), str.c_str(), str.length()); + return 4; + } + } + + llama_free_model(model); + llama_free(ctx); + + llama_backend_free(); + + return 0; +} diff --git a/tests/test-tokenizer-1-llama.cpp b/tests/test-tokenizer-1-llama.cpp index 3b2fc87ac..4b58fe495 100644 --- a/tests/test-tokenizer-1-llama.cpp +++ b/tests/test-tokenizer-1-llama.cpp @@ -1,5 +1,6 @@ #include "llama.h" #include "common.h" +#include "unicode.h" #include "console.h" #include @@ -11,30 +12,6 @@ #include #include -typedef int codepoint; - -static std::string codepoint_to_utf8(codepoint cp) { - std::string result; - if (0x00 <= cp && cp <= 0x7f) { - result.push_back(cp); - } else if (0x80 <= cp && cp <= 0x7ff) { - result.push_back(0xc0 | ((cp >> 6) & 0x1f)); - result.push_back(0x80 | (cp & 0x3f)); - } else if (0x800 <= cp && cp <= 0xffff) { - result.push_back(0xe0 | ((cp >> 12) & 0x0f)); - result.push_back(0x80 | ((cp >> 6) & 0x3f)); - result.push_back(0x80 | (cp & 0x3f)); - } else if (0x10000 <= cp && cp <= 0x10ffff) { - result.push_back(0xf0 | ((cp >> 18) & 0x07)); - result.push_back(0x80 | ((cp >> 12) & 0x3f)); - result.push_back(0x80 | ((cp >> 6) & 0x3f)); - result.push_back(0x80 | (cp & 0x3f)); - } else { - throw std::invalid_argument("invalid codepoint"); - } - return result; -} - int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "Usage: %s \n", argv[0]); @@ -95,7 +72,7 @@ int main(int argc, char **argv) { } } - for (codepoint cp = 0x0000; cp < 0xffff; ++cp) { + for (uint32_t cp = 0x0000; cp < 0xffff; ++cp) { if (cp < 0xd800 || cp > 0xdfff) { std::string str = codepoint_to_utf8(cp); std::vector tokens = llama_tokenize(ctx, str, false); @@ -107,7 +84,7 @@ int main(int argc, char **argv) { } } } - for (codepoint cp = 0x10000; cp < 0x0010ffff; ++cp) { + for (uint32_t cp = 0x10000; cp < 0x0010ffff; ++cp) { std::string str = codepoint_to_utf8(cp); std::vector tokens = llama_tokenize(ctx, str, false); std::string check = llama_detokenize_spm(ctx, tokens); diff --git a/unicode.h b/unicode.h new file mode 100644 index 000000000..aeca879ea --- /dev/null +++ b/unicode.h @@ -0,0 +1,462 @@ +#pragma once + +#include +#include +#include +#include + +static const std::vector> digit_ranges = { +{0x30, 0x39}, {0xB2, 0xB3}, {0xB9, 0xB9}, {0x660, 0x669}, {0x6F0, 0x6F9}, {0x7C0, 0x7C9}, {0x966, 0x96F}, {0x9E6, 0x9EF}, {0xA66, 0xA6F}, {0xAE6, 0xAEF}, {0xB66, 0xB6F}, {0xBE6, 0xBEF}, {0xC66, 0xC6F}, +{0xCE6, 0xCEF}, {0xD66, 0xD6F}, {0xDE6, 0xDEF}, {0xE50, 0xE59}, {0xED0, 0xED9}, {0xF20, 0xF29}, {0x1040, 0x1049}, {0x1090, 0x1099}, {0x1369, 0x1371}, {0x17E0, 0x17E9}, {0x1810, 0x1819}, {0x1946, 0x194F}, +{0x19D0, 0x19DA}, {0x1A80, 0x1A89}, {0x1A90, 0x1A99}, {0x1B50, 0x1B59}, {0x1BB0, 0x1BB9}, {0x1C40, 0x1C49}, {0x1C50, 0x1C59}, {0x2070, 0x2070}, {0x2074, 0x2079}, {0x2080, 0x2089}, {0x2460, 0x2468}, +{0x2474, 0x247C}, {0x2488, 0x2490}, {0x24EA, 0x24EA}, {0x24F5, 0x24FD}, {0x24FF, 0x24FF}, {0x2776, 0x277E}, {0x2780, 0x2788}, {0x278A, 0x2792}, {0xA620, 0xA629}, {0xA8D0, 0xA8D9}, {0xA900, 0xA909}, +{0xA9D0, 0xA9D9}, {0xA9F0, 0xA9F9}, {0xAA50, 0xAA59}, {0xABF0, 0xABF9}, {0xFF10, 0xFF19}, {0x104A0, 0x104A9}, {0x10A40, 0x10A43}, {0x10D30, 0x10D39}, {0x10E60, 0x10E68}, {0x11052, 0x1105A}, +{0x11066, 0x1106F}, {0x110F0, 0x110F9}, {0x11136, 0x1113F}, {0x111D0, 0x111D9}, {0x112F0, 0x112F9}, {0x11450, 0x11459}, {0x114D0, 0x114D9}, {0x11650, 0x11659}, {0x116C0, 0x116C9}, {0x11730, 0x11739}, +{0x118E0, 0x118E9}, {0x11950, 0x11959}, {0x11C50, 0x11C59}, {0x11D50, 0x11D59}, {0x11DA0, 0x11DA9}, {0x16A60, 0x16A69}, {0x16B50, 0x16B59}, {0x1D7CE, 0x1D7FF}, {0x1E140, 0x1E149}, {0x1E2F0, 0x1E2F9}, +{0x1E950, 0x1E959}, {0x1F100, 0x1F10A}, {0x1FBF0, 0x1FBF9}, +}; + +static const std::vector> letter_ranges = { +{0x41, 0x5A}, {0x61, 0x7A}, {0xAA, 0xAA}, {0xB5, 0xB5}, {0xBA, 0xBA}, {0xC0, 0xD6}, {0xD8, 0xF6}, {0xF8, 0x2C1}, {0x2C6, 0x2D1}, {0x2E0, 0x2E4}, {0x2EC, 0x2EC}, {0x2EE, 0x2EE}, {0x370, 0x374}, +{0x376, 0x377}, {0x37A, 0x37D}, {0x37F, 0x37F}, {0x386, 0x386}, {0x388, 0x38A}, {0x38C, 0x38C}, {0x38E, 0x3A1}, {0x3A3, 0x3F5}, {0x3F7, 0x481}, {0x48A, 0x52F}, {0x531, 0x556}, {0x559, 0x559}, +{0x560, 0x588}, {0x5D0, 0x5EA}, {0x5EF, 0x5F2}, {0x620, 0x64A}, {0x66E, 0x66F}, {0x671, 0x6D3}, {0x6D5, 0x6D5}, {0x6E5, 0x6E6}, {0x6EE, 0x6EF}, {0x6FA, 0x6FC}, {0x6FF, 0x6FF}, {0x710, 0x710}, +{0x712, 0x72F}, {0x74D, 0x7A5}, {0x7B1, 0x7B1}, {0x7CA, 0x7EA}, {0x7F4, 0x7F5}, {0x7FA, 0x7FA}, {0x800, 0x815}, {0x81A, 0x81A}, {0x824, 0x824}, {0x828, 0x828}, {0x840, 0x858}, {0x860, 0x86A}, +{0x8A0, 0x8B4}, {0x8B6, 0x8C7}, {0x904, 0x939}, {0x93D, 0x93D}, {0x950, 0x950}, {0x958, 0x961}, {0x971, 0x980}, {0x985, 0x98C}, {0x98F, 0x990}, {0x993, 0x9A8}, {0x9AA, 0x9B0}, {0x9B2, 0x9B2}, +{0x9B6, 0x9B9}, {0x9BD, 0x9BD}, {0x9CE, 0x9CE}, {0x9DC, 0x9DD}, {0x9DF, 0x9E1}, {0x9F0, 0x9F1}, {0x9FC, 0x9FC}, {0xA05, 0xA0A}, {0xA0F, 0xA10}, {0xA13, 0xA28}, {0xA2A, 0xA30}, {0xA32, 0xA33}, +{0xA35, 0xA36}, {0xA38, 0xA39}, {0xA59, 0xA5C}, {0xA5E, 0xA5E}, {0xA72, 0xA74}, {0xA85, 0xA8D}, {0xA8F, 0xA91}, {0xA93, 0xAA8}, {0xAAA, 0xAB0}, {0xAB2, 0xAB3}, {0xAB5, 0xAB9}, {0xABD, 0xABD}, +{0xAD0, 0xAD0}, {0xAE0, 0xAE1}, {0xAF9, 0xAF9}, {0xB05, 0xB0C}, {0xB0F, 0xB10}, {0xB13, 0xB28}, {0xB2A, 0xB30}, {0xB32, 0xB33}, {0xB35, 0xB39}, {0xB3D, 0xB3D}, {0xB5C, 0xB5D}, {0xB5F, 0xB61}, +{0xB71, 0xB71}, {0xB83, 0xB83}, {0xB85, 0xB8A}, {0xB8E, 0xB90}, {0xB92, 0xB95}, {0xB99, 0xB9A}, {0xB9C, 0xB9C}, {0xB9E, 0xB9F}, {0xBA3, 0xBA4}, {0xBA8, 0xBAA}, {0xBAE, 0xBB9}, {0xBD0, 0xBD0}, +{0xC05, 0xC0C}, {0xC0E, 0xC10}, {0xC12, 0xC28}, {0xC2A, 0xC39}, {0xC3D, 0xC3D}, {0xC58, 0xC5A}, {0xC60, 0xC61}, {0xC80, 0xC80}, {0xC85, 0xC8C}, {0xC8E, 0xC90}, {0xC92, 0xCA8}, {0xCAA, 0xCB3}, +{0xCB5, 0xCB9}, {0xCBD, 0xCBD}, {0xCDE, 0xCDE}, {0xCE0, 0xCE1}, {0xCF1, 0xCF2}, {0xD04, 0xD0C}, {0xD0E, 0xD10}, {0xD12, 0xD3A}, {0xD3D, 0xD3D}, {0xD4E, 0xD4E}, {0xD54, 0xD56}, {0xD5F, 0xD61}, +{0xD7A, 0xD7F}, {0xD85, 0xD96}, {0xD9A, 0xDB1}, {0xDB3, 0xDBB}, {0xDBD, 0xDBD}, {0xDC0, 0xDC6}, {0xE01, 0xE30}, {0xE32, 0xE33}, {0xE40, 0xE46}, {0xE81, 0xE82}, {0xE84, 0xE84}, {0xE86, 0xE8A}, +{0xE8C, 0xEA3}, {0xEA5, 0xEA5}, {0xEA7, 0xEB0}, {0xEB2, 0xEB3}, {0xEBD, 0xEBD}, {0xEC0, 0xEC4}, {0xEC6, 0xEC6}, {0xEDC, 0xEDF}, {0xF00, 0xF00}, {0xF40, 0xF47}, {0xF49, 0xF6C}, {0xF88, 0xF8C}, +{0x1000, 0x102A}, {0x103F, 0x103F}, {0x1050, 0x1055}, {0x105A, 0x105D}, {0x1061, 0x1061}, {0x1065, 0x1066}, {0x106E, 0x1070}, {0x1075, 0x1081}, {0x108E, 0x108E}, {0x10A0, 0x10C5}, {0x10C7, 0x10C7}, +{0x10CD, 0x10CD}, {0x10D0, 0x10FA}, {0x10FC, 0x1248}, {0x124A, 0x124D}, {0x1250, 0x1256}, {0x1258, 0x1258}, {0x125A, 0x125D}, {0x1260, 0x1288}, {0x128A, 0x128D}, {0x1290, 0x12B0}, {0x12B2, 0x12B5}, +{0x12B8, 0x12BE}, {0x12C0, 0x12C0}, {0x12C2, 0x12C5}, {0x12C8, 0x12D6}, {0x12D8, 0x1310}, {0x1312, 0x1315}, {0x1318, 0x135A}, {0x1380, 0x138F}, {0x13A0, 0x13F5}, {0x13F8, 0x13FD}, {0x1401, 0x166C}, +{0x166F, 0x167F}, {0x1681, 0x169A}, {0x16A0, 0x16EA}, {0x16F1, 0x16F8}, {0x1700, 0x170C}, {0x170E, 0x1711}, {0x1720, 0x1731}, {0x1740, 0x1751}, {0x1760, 0x176C}, {0x176E, 0x1770}, {0x1780, 0x17B3}, +{0x17D7, 0x17D7}, {0x17DC, 0x17DC}, {0x1820, 0x1878}, {0x1880, 0x1884}, {0x1887, 0x18A8}, {0x18AA, 0x18AA}, {0x18B0, 0x18F5}, {0x1900, 0x191E}, {0x1950, 0x196D}, {0x1970, 0x1974}, {0x1980, 0x19AB}, +{0x19B0, 0x19C9}, {0x1A00, 0x1A16}, {0x1A20, 0x1A54}, {0x1AA7, 0x1AA7}, {0x1B05, 0x1B33}, {0x1B45, 0x1B4B}, {0x1B83, 0x1BA0}, {0x1BAE, 0x1BAF}, {0x1BBA, 0x1BE5}, {0x1C00, 0x1C23}, {0x1C4D, 0x1C4F}, +{0x1C5A, 0x1C7D}, {0x1C80, 0x1C88}, {0x1C90, 0x1CBA}, {0x1CBD, 0x1CBF}, {0x1CE9, 0x1CEC}, {0x1CEE, 0x1CF3}, {0x1CF5, 0x1CF6}, {0x1CFA, 0x1CFA}, {0x1D00, 0x1DBF}, {0x1E00, 0x1F15}, {0x1F18, 0x1F1D}, +{0x1F20, 0x1F45}, {0x1F48, 0x1F4D}, {0x1F50, 0x1F57}, {0x1F59, 0x1F59}, {0x1F5B, 0x1F5B}, {0x1F5D, 0x1F5D}, {0x1F5F, 0x1F7D}, {0x1F80, 0x1FB4}, {0x1FB6, 0x1FBC}, {0x1FBE, 0x1FBE}, {0x1FC2, 0x1FC4}, +{0x1FC6, 0x1FCC}, {0x1FD0, 0x1FD3}, {0x1FD6, 0x1FDB}, {0x1FE0, 0x1FEC}, {0x1FF2, 0x1FF4}, {0x1FF6, 0x1FFC}, {0x2071, 0x2071}, {0x207F, 0x207F}, {0x2090, 0x209C}, {0x2102, 0x2102}, {0x2107, 0x2107}, +{0x210A, 0x2113}, {0x2115, 0x2115}, {0x2119, 0x211D}, {0x2124, 0x2124}, {0x2126, 0x2126}, {0x2128, 0x2128}, {0x212A, 0x212D}, {0x212F, 0x2139}, {0x213C, 0x213F}, {0x2145, 0x2149}, {0x214E, 0x214E}, +{0x2183, 0x2184}, {0x2C00, 0x2C2E}, {0x2C30, 0x2C5E}, {0x2C60, 0x2CE4}, {0x2CEB, 0x2CEE}, {0x2CF2, 0x2CF3}, {0x2D00, 0x2D25}, {0x2D27, 0x2D27}, {0x2D2D, 0x2D2D}, {0x2D30, 0x2D67}, {0x2D6F, 0x2D6F}, +{0x2D80, 0x2D96}, {0x2DA0, 0x2DA6}, {0x2DA8, 0x2DAE}, {0x2DB0, 0x2DB6}, {0x2DB8, 0x2DBE}, {0x2DC0, 0x2DC6}, {0x2DC8, 0x2DCE}, {0x2DD0, 0x2DD6}, {0x2DD8, 0x2DDE}, {0x2E2F, 0x2E2F}, {0x3005, 0x3006}, +{0x3031, 0x3035}, {0x303B, 0x303C}, {0x3041, 0x3096}, {0x309D, 0x309F}, {0x30A1, 0x30FA}, {0x30FC, 0x30FF}, {0x3105, 0x312F}, {0x3131, 0x318E}, {0x31A0, 0x31BF}, {0x31F0, 0x31FF}, {0x3400, 0x4DBF}, +{0x4E00, 0x9FFC}, {0xA000, 0xA48C}, {0xA4D0, 0xA4FD}, {0xA500, 0xA60C}, {0xA610, 0xA61F}, {0xA62A, 0xA62B}, {0xA640, 0xA66E}, {0xA67F, 0xA69D}, {0xA6A0, 0xA6E5}, {0xA717, 0xA71F}, {0xA722, 0xA788}, +{0xA78B, 0xA7BF}, {0xA7C2, 0xA7CA}, {0xA7F5, 0xA801}, {0xA803, 0xA805}, {0xA807, 0xA80A}, {0xA80C, 0xA822}, {0xA840, 0xA873}, {0xA882, 0xA8B3}, {0xA8F2, 0xA8F7}, {0xA8FB, 0xA8FB}, {0xA8FD, 0xA8FE}, +{0xA90A, 0xA925}, {0xA930, 0xA946}, {0xA960, 0xA97C}, {0xA984, 0xA9B2}, {0xA9CF, 0xA9CF}, {0xA9E0, 0xA9E4}, {0xA9E6, 0xA9EF}, {0xA9FA, 0xA9FE}, {0xAA00, 0xAA28}, {0xAA40, 0xAA42}, {0xAA44, 0xAA4B}, +{0xAA60, 0xAA76}, {0xAA7A, 0xAA7A}, {0xAA7E, 0xAAAF}, {0xAAB1, 0xAAB1}, {0xAAB5, 0xAAB6}, {0xAAB9, 0xAABD}, {0xAAC0, 0xAAC0}, {0xAAC2, 0xAAC2}, {0xAADB, 0xAADD}, {0xAAE0, 0xAAEA}, {0xAAF2, 0xAAF4}, +{0xAB01, 0xAB06}, {0xAB09, 0xAB0E}, {0xAB11, 0xAB16}, {0xAB20, 0xAB26}, {0xAB28, 0xAB2E}, {0xAB30, 0xAB5A}, {0xAB5C, 0xAB69}, {0xAB70, 0xABE2}, {0xAC00, 0xD7A3}, {0xD7B0, 0xD7C6}, {0xD7CB, 0xD7FB}, +{0xF900, 0xFA6D}, {0xFA70, 0xFAD9}, {0xFB00, 0xFB06}, {0xFB13, 0xFB17}, {0xFB1D, 0xFB1D}, {0xFB1F, 0xFB28}, {0xFB2A, 0xFB36}, {0xFB38, 0xFB3C}, {0xFB3E, 0xFB3E}, {0xFB40, 0xFB41}, {0xFB43, 0xFB44}, +{0xFB46, 0xFBB1}, {0xFBD3, 0xFD3D}, {0xFD50, 0xFD8F}, {0xFD92, 0xFDC7}, {0xFDF0, 0xFDFB}, {0xFE70, 0xFE74}, {0xFE76, 0xFEFC}, {0xFF21, 0xFF3A}, {0xFF41, 0xFF5A}, {0xFF66, 0xFFBE}, {0xFFC2, 0xFFC7}, +{0xFFCA, 0xFFCF}, {0xFFD2, 0xFFD7}, {0xFFDA, 0xFFDC}, {0x10000, 0x1000B}, {0x1000D, 0x10026}, {0x10028, 0x1003A}, {0x1003C, 0x1003D}, {0x1003F, 0x1004D}, {0x10050, 0x1005D}, {0x10080, 0x100FA}, +{0x10280, 0x1029C}, {0x102A0, 0x102D0}, {0x10300, 0x1031F}, {0x1032D, 0x10340}, {0x10342, 0x10349}, {0x10350, 0x10375}, {0x10380, 0x1039D}, {0x103A0, 0x103C3}, {0x103C8, 0x103CF}, {0x10400, 0x1049D}, +{0x104B0, 0x104D3}, {0x104D8, 0x104FB}, {0x10500, 0x10527}, {0x10530, 0x10563}, {0x10600, 0x10736}, {0x10740, 0x10755}, {0x10760, 0x10767}, {0x10800, 0x10805}, {0x10808, 0x10808}, {0x1080A, 0x10835}, +{0x10837, 0x10838}, {0x1083C, 0x1083C}, {0x1083F, 0x10855}, {0x10860, 0x10876}, {0x10880, 0x1089E}, {0x108E0, 0x108F2}, {0x108F4, 0x108F5}, {0x10900, 0x10915}, {0x10920, 0x10939}, {0x10980, 0x109B7}, +{0x109BE, 0x109BF}, {0x10A00, 0x10A00}, {0x10A10, 0x10A13}, {0x10A15, 0x10A17}, {0x10A19, 0x10A35}, {0x10A60, 0x10A7C}, {0x10A80, 0x10A9C}, {0x10AC0, 0x10AC7}, {0x10AC9, 0x10AE4}, {0x10B00, 0x10B35}, +{0x10B40, 0x10B55}, {0x10B60, 0x10B72}, {0x10B80, 0x10B91}, {0x10C00, 0x10C48}, {0x10C80, 0x10CB2}, {0x10CC0, 0x10CF2}, {0x10D00, 0x10D23}, {0x10E80, 0x10EA9}, {0x10EB0, 0x10EB1}, {0x10F00, 0x10F1C}, +{0x10F27, 0x10F27}, {0x10F30, 0x10F45}, {0x10FB0, 0x10FC4}, {0x10FE0, 0x10FF6}, {0x11003, 0x11037}, {0x11083, 0x110AF}, {0x110D0, 0x110E8}, {0x11103, 0x11126}, {0x11144, 0x11144}, {0x11147, 0x11147}, +{0x11150, 0x11172}, {0x11176, 0x11176}, {0x11183, 0x111B2}, {0x111C1, 0x111C4}, {0x111DA, 0x111DA}, {0x111DC, 0x111DC}, {0x11200, 0x11211}, {0x11213, 0x1122B}, {0x11280, 0x11286}, {0x11288, 0x11288}, +{0x1128A, 0x1128D}, {0x1128F, 0x1129D}, {0x1129F, 0x112A8}, {0x112B0, 0x112DE}, {0x11305, 0x1130C}, {0x1130F, 0x11310}, {0x11313, 0x11328}, {0x1132A, 0x11330}, {0x11332, 0x11333}, {0x11335, 0x11339}, +{0x1133D, 0x1133D}, {0x11350, 0x11350}, {0x1135D, 0x11361}, {0x11400, 0x11434}, {0x11447, 0x1144A}, {0x1145F, 0x11461}, {0x11480, 0x114AF}, {0x114C4, 0x114C5}, {0x114C7, 0x114C7}, {0x11580, 0x115AE}, +{0x115D8, 0x115DB}, {0x11600, 0x1162F}, {0x11644, 0x11644}, {0x11680, 0x116AA}, {0x116B8, 0x116B8}, {0x11700, 0x1171A}, {0x11800, 0x1182B}, {0x118A0, 0x118DF}, {0x118FF, 0x11906}, {0x11909, 0x11909}, +{0x1190C, 0x11913}, {0x11915, 0x11916}, {0x11918, 0x1192F}, {0x1193F, 0x1193F}, {0x11941, 0x11941}, {0x119A0, 0x119A7}, {0x119AA, 0x119D0}, {0x119E1, 0x119E1}, {0x119E3, 0x119E3}, {0x11A00, 0x11A00}, +{0x11A0B, 0x11A32}, {0x11A3A, 0x11A3A}, {0x11A50, 0x11A50}, {0x11A5C, 0x11A89}, {0x11A9D, 0x11A9D}, {0x11AC0, 0x11AF8}, {0x11C00, 0x11C08}, {0x11C0A, 0x11C2E}, {0x11C40, 0x11C40}, {0x11C72, 0x11C8F}, +{0x11D00, 0x11D06}, {0x11D08, 0x11D09}, {0x11D0B, 0x11D30}, {0x11D46, 0x11D46}, {0x11D60, 0x11D65}, {0x11D67, 0x11D68}, {0x11D6A, 0x11D89}, {0x11D98, 0x11D98}, {0x11EE0, 0x11EF2}, {0x11FB0, 0x11FB0}, +{0x12000, 0x12399}, {0x12480, 0x12543}, {0x13000, 0x1342E}, {0x14400, 0x14646}, {0x16800, 0x16A38}, {0x16A40, 0x16A5E}, {0x16AD0, 0x16AED}, {0x16B00, 0x16B2F}, {0x16B40, 0x16B43}, {0x16B63, 0x16B77}, +{0x16B7D, 0x16B8F}, {0x16E40, 0x16E7F}, {0x16F00, 0x16F4A}, {0x16F50, 0x16F50}, {0x16F93, 0x16F9F}, {0x16FE0, 0x16FE1}, {0x16FE3, 0x16FE3}, {0x17000, 0x187F7}, {0x18800, 0x18CD5}, {0x18D00, 0x18D08}, +{0x1B000, 0x1B11E}, {0x1B150, 0x1B152}, {0x1B164, 0x1B167}, {0x1B170, 0x1B2FB}, {0x1BC00, 0x1BC6A}, {0x1BC70, 0x1BC7C}, {0x1BC80, 0x1BC88}, {0x1BC90, 0x1BC99}, {0x1D400, 0x1D454}, {0x1D456, 0x1D49C}, +{0x1D49E, 0x1D49F}, {0x1D4A2, 0x1D4A2}, {0x1D4A5, 0x1D4A6}, {0x1D4A9, 0x1D4AC}, {0x1D4AE, 0x1D4B9}, {0x1D4BB, 0x1D4BB}, {0x1D4BD, 0x1D4C3}, {0x1D4C5, 0x1D505}, {0x1D507, 0x1D50A}, {0x1D50D, 0x1D514}, +{0x1D516, 0x1D51C}, {0x1D51E, 0x1D539}, {0x1D53B, 0x1D53E}, {0x1D540, 0x1D544}, {0x1D546, 0x1D546}, {0x1D54A, 0x1D550}, {0x1D552, 0x1D6A5}, {0x1D6A8, 0x1D6C0}, {0x1D6C2, 0x1D6DA}, {0x1D6DC, 0x1D6FA}, +{0x1D6FC, 0x1D714}, {0x1D716, 0x1D734}, {0x1D736, 0x1D74E}, {0x1D750, 0x1D76E}, {0x1D770, 0x1D788}, {0x1D78A, 0x1D7A8}, {0x1D7AA, 0x1D7C2}, {0x1D7C4, 0x1D7CB}, {0x1E100, 0x1E12C}, {0x1E137, 0x1E13D}, +{0x1E14E, 0x1E14E}, {0x1E2C0, 0x1E2EB}, {0x1E800, 0x1E8C4}, {0x1E900, 0x1E943}, {0x1E94B, 0x1E94B}, {0x1EE00, 0x1EE03}, {0x1EE05, 0x1EE1F}, {0x1EE21, 0x1EE22}, {0x1EE24, 0x1EE24}, {0x1EE27, 0x1EE27}, +{0x1EE29, 0x1EE32}, {0x1EE34, 0x1EE37}, {0x1EE39, 0x1EE39}, {0x1EE3B, 0x1EE3B}, {0x1EE42, 0x1EE42}, {0x1EE47, 0x1EE47}, {0x1EE49, 0x1EE49}, {0x1EE4B, 0x1EE4B}, {0x1EE4D, 0x1EE4F}, {0x1EE51, 0x1EE52}, +{0x1EE54, 0x1EE54}, {0x1EE57, 0x1EE57}, {0x1EE59, 0x1EE59}, {0x1EE5B, 0x1EE5B}, {0x1EE5D, 0x1EE5D}, {0x1EE5F, 0x1EE5F}, {0x1EE61, 0x1EE62}, {0x1EE64, 0x1EE64}, {0x1EE67, 0x1EE6A}, {0x1EE6C, 0x1EE72}, +{0x1EE74, 0x1EE77}, {0x1EE79, 0x1EE7C}, {0x1EE7E, 0x1EE7E}, {0x1EE80, 0x1EE89}, {0x1EE8B, 0x1EE9B}, {0x1EEA1, 0x1EEA3}, {0x1EEA5, 0x1EEA9}, {0x1EEAB, 0x1EEBB}, {0x20000, 0x2A6DD}, {0x2A700, 0x2B734}, +{0x2B740, 0x2B81D}, {0x2B820, 0x2CEA1}, {0x2CEB0, 0x2EBE0}, {0x2F800, 0x2FA1D}, {0x30000, 0x3134A}, +}; + +static const std::vector> whitespace_ranges = { +{0x9, 0xD}, {0x1C, 0x20}, {0x85, 0x85}, {0xA0, 0xA0}, {0x1680, 0x1680}, {0x2000, 0x200A}, {0x2028, 0x2029}, {0x202F, 0x202F}, {0x205F, 0x205F}, {0x3000, 0x3000}, +}; + +static const std::vector> accent_mark_ranges = { +{0x300, 0x36F}, {0x483, 0x489}, {0x591, 0x5BD}, {0x5BF, 0x5BF}, {0x5C1, 0x5C2}, {0x5C4, 0x5C5}, {0x5C7, 0x5C7}, {0x610, 0x61A}, {0x64B, 0x65F}, {0x670, 0x670}, {0x6D6, 0x6DC}, {0x6DF, 0x6E4}, +{0x6E7, 0x6E8}, {0x6EA, 0x6ED}, {0x711, 0x711}, {0x730, 0x74A}, {0x7A6, 0x7B0}, {0x7EB, 0x7F3}, {0x7FD, 0x7FD}, {0x816, 0x819}, {0x81B, 0x823}, {0x825, 0x827}, {0x829, 0x82D}, {0x859, 0x85B}, +{0x8D3, 0x8E1}, {0x8E3, 0x903}, {0x93A, 0x93C}, {0x93E, 0x94F}, {0x951, 0x957}, {0x962, 0x963}, {0x981, 0x983}, {0x9BC, 0x9BC}, {0x9BE, 0x9C4}, {0x9C7, 0x9C8}, {0x9CB, 0x9CD}, {0x9D7, 0x9D7}, +{0x9E2, 0x9E3}, {0x9FE, 0x9FE}, {0xA01, 0xA03}, {0xA3C, 0xA3C}, {0xA3E, 0xA42}, {0xA47, 0xA48}, {0xA4B, 0xA4D}, {0xA51, 0xA51}, {0xA70, 0xA71}, {0xA75, 0xA75}, {0xA81, 0xA83}, {0xABC, 0xABC}, +{0xABE, 0xAC5}, {0xAC7, 0xAC9}, {0xACB, 0xACD}, {0xAE2, 0xAE3}, {0xAFA, 0xAFF}, {0xB01, 0xB03}, {0xB3C, 0xB3C}, {0xB3E, 0xB44}, {0xB47, 0xB48}, {0xB4B, 0xB4D}, {0xB55, 0xB57}, {0xB62, 0xB63}, +{0xB82, 0xB82}, {0xBBE, 0xBC2}, {0xBC6, 0xBC8}, {0xBCA, 0xBCD}, {0xBD7, 0xBD7}, {0xC00, 0xC04}, {0xC3E, 0xC44}, {0xC46, 0xC48}, {0xC4A, 0xC4D}, {0xC55, 0xC56}, {0xC62, 0xC63}, {0xC81, 0xC83}, +{0xCBC, 0xCBC}, {0xCBE, 0xCC4}, {0xCC6, 0xCC8}, {0xCCA, 0xCCD}, {0xCD5, 0xCD6}, {0xCE2, 0xCE3}, {0xD00, 0xD03}, {0xD3B, 0xD3C}, {0xD3E, 0xD44}, {0xD46, 0xD48}, {0xD4A, 0xD4D}, {0xD57, 0xD57}, +{0xD62, 0xD63}, {0xD81, 0xD83}, {0xDCA, 0xDCA}, {0xDCF, 0xDD4}, {0xDD6, 0xDD6}, {0xDD8, 0xDDF}, {0xDF2, 0xDF3}, {0xE31, 0xE31}, {0xE34, 0xE3A}, {0xE47, 0xE4E}, {0xEB1, 0xEB1}, {0xEB4, 0xEBC}, +{0xEC8, 0xECD}, {0xF18, 0xF19}, {0xF35, 0xF35}, {0xF37, 0xF37}, {0xF39, 0xF39}, {0xF3E, 0xF3F}, {0xF71, 0xF84}, {0xF86, 0xF87}, {0xF8D, 0xF97}, {0xF99, 0xFBC}, {0xFC6, 0xFC6}, {0x102B, 0x103E}, +{0x1056, 0x1059}, {0x105E, 0x1060}, {0x1062, 0x1064}, {0x1067, 0x106D}, {0x1071, 0x1074}, {0x1082, 0x108D}, {0x108F, 0x108F}, {0x109A, 0x109D}, {0x135D, 0x135F}, {0x1712, 0x1714}, {0x1732, 0x1734}, +{0x1752, 0x1753}, {0x1772, 0x1773}, {0x17B4, 0x17D3}, {0x17DD, 0x17DD}, {0x180B, 0x180D}, {0x1885, 0x1886}, {0x18A9, 0x18A9}, {0x1920, 0x192B}, {0x1930, 0x193B}, {0x1A17, 0x1A1B}, {0x1A55, 0x1A5E}, +{0x1A60, 0x1A7C}, {0x1A7F, 0x1A7F}, {0x1AB0, 0x1AC0}, {0x1B00, 0x1B04}, {0x1B34, 0x1B44}, {0x1B6B, 0x1B73}, {0x1B80, 0x1B82}, {0x1BA1, 0x1BAD}, {0x1BE6, 0x1BF3}, {0x1C24, 0x1C37}, {0x1CD0, 0x1CD2}, +{0x1CD4, 0x1CE8}, {0x1CED, 0x1CED}, {0x1CF4, 0x1CF4}, {0x1CF7, 0x1CF9}, {0x1DC0, 0x1DF9}, {0x1DFB, 0x1DFF}, {0x20D0, 0x20F0}, {0x2CEF, 0x2CF1}, {0x2D7F, 0x2D7F}, {0x2DE0, 0x2DFF}, {0x302A, 0x302F}, +{0x3099, 0x309A}, {0xA66F, 0xA672}, {0xA674, 0xA67D}, {0xA69E, 0xA69F}, {0xA6F0, 0xA6F1}, {0xA802, 0xA802}, {0xA806, 0xA806}, {0xA80B, 0xA80B}, {0xA823, 0xA827}, {0xA82C, 0xA82C}, {0xA880, 0xA881}, +{0xA8B4, 0xA8C5}, {0xA8E0, 0xA8F1}, {0xA8FF, 0xA8FF}, {0xA926, 0xA92D}, {0xA947, 0xA953}, {0xA980, 0xA983}, {0xA9B3, 0xA9C0}, {0xA9E5, 0xA9E5}, {0xAA29, 0xAA36}, {0xAA43, 0xAA43}, {0xAA4C, 0xAA4D}, +{0xAA7B, 0xAA7D}, {0xAAB0, 0xAAB0}, {0xAAB2, 0xAAB4}, {0xAAB7, 0xAAB8}, {0xAABE, 0xAABF}, {0xAAC1, 0xAAC1}, {0xAAEB, 0xAAEF}, {0xAAF5, 0xAAF6}, {0xABE3, 0xABEA}, {0xABEC, 0xABED}, {0xFB1E, 0xFB1E}, +{0xFE00, 0xFE0F}, {0xFE20, 0xFE2F}, {0x101FD, 0x101FD}, {0x102E0, 0x102E0}, {0x10376, 0x1037A}, {0x10A01, 0x10A03}, {0x10A05, 0x10A06}, {0x10A0C, 0x10A0F}, {0x10A38, 0x10A3A}, {0x10A3F, 0x10A3F}, +{0x10AE5, 0x10AE6}, {0x10D24, 0x10D27}, {0x10EAB, 0x10EAC}, {0x10F46, 0x10F50}, {0x11000, 0x11002}, {0x11038, 0x11046}, {0x1107F, 0x11082}, {0x110B0, 0x110BA}, {0x11100, 0x11102}, {0x11127, 0x11134}, +{0x11145, 0x11146}, {0x11173, 0x11173}, {0x11180, 0x11182}, {0x111B3, 0x111C0}, {0x111C9, 0x111CC}, {0x111CE, 0x111CF}, {0x1122C, 0x11237}, {0x1123E, 0x1123E}, {0x112DF, 0x112EA}, {0x11300, 0x11303}, +{0x1133B, 0x1133C}, {0x1133E, 0x11344}, {0x11347, 0x11348}, {0x1134B, 0x1134D}, {0x11357, 0x11357}, {0x11362, 0x11363}, {0x11366, 0x1136C}, {0x11370, 0x11374}, {0x11435, 0x11446}, {0x1145E, 0x1145E}, +{0x114B0, 0x114C3}, {0x115AF, 0x115B5}, {0x115B8, 0x115C0}, {0x115DC, 0x115DD}, {0x11630, 0x11640}, {0x116AB, 0x116B7}, {0x1171D, 0x1172B}, {0x1182C, 0x1183A}, {0x11930, 0x11935}, {0x11937, 0x11938}, +{0x1193B, 0x1193E}, {0x11940, 0x11940}, {0x11942, 0x11943}, {0x119D1, 0x119D7}, {0x119DA, 0x119E0}, {0x119E4, 0x119E4}, {0x11A01, 0x11A0A}, {0x11A33, 0x11A39}, {0x11A3B, 0x11A3E}, {0x11A47, 0x11A47}, +{0x11A51, 0x11A5B}, {0x11A8A, 0x11A99}, {0x11C2F, 0x11C36}, {0x11C38, 0x11C3F}, {0x11C92, 0x11CA7}, {0x11CA9, 0x11CB6}, {0x11D31, 0x11D36}, {0x11D3A, 0x11D3A}, {0x11D3C, 0x11D3D}, {0x11D3F, 0x11D45}, +{0x11D47, 0x11D47}, {0x11D8A, 0x11D8E}, {0x11D90, 0x11D91}, {0x11D93, 0x11D97}, {0x11EF3, 0x11EF6}, {0x16AF0, 0x16AF4}, {0x16B30, 0x16B36}, {0x16F4F, 0x16F4F}, {0x16F51, 0x16F87}, {0x16F8F, 0x16F92}, +{0x16FE4, 0x16FE4}, {0x16FF0, 0x16FF1}, {0x1BC9D, 0x1BC9E}, {0x1D165, 0x1D169}, {0x1D16D, 0x1D172}, {0x1D17B, 0x1D182}, {0x1D185, 0x1D18B}, {0x1D1AA, 0x1D1AD}, {0x1D242, 0x1D244}, {0x1DA00, 0x1DA36}, +{0x1DA3B, 0x1DA6C}, {0x1DA75, 0x1DA75}, {0x1DA84, 0x1DA84}, {0x1DA9B, 0x1DA9F}, {0x1DAA1, 0x1DAAF}, {0x1E000, 0x1E006}, {0x1E008, 0x1E018}, {0x1E01B, 0x1E021}, {0x1E023, 0x1E024}, {0x1E026, 0x1E02A}, +{0x1E130, 0x1E136}, {0x1E2EC, 0x1E2EF}, {0x1E8D0, 0x1E8D6}, {0x1E944, 0x1E94A}, {0xE0100, 0xE01EF}, +}; + +static const std::vector> punctuation_ranges = { +{0x21, 0x23}, {0x25, 0x2A}, {0x2C, 0x2F}, {0x3A, 0x3B}, {0x3F, 0x40}, {0x5B, 0x5D}, {0x5F, 0x5F}, {0x7B, 0x7B}, {0x7D, 0x7D}, {0xA1, 0xA1}, {0xA7, 0xA7}, {0xAB, 0xAB}, {0xB6, 0xB7}, {0xBB, 0xBB}, +{0xBF, 0xBF}, {0x37E, 0x37E}, {0x387, 0x387}, {0x55A, 0x55F}, {0x589, 0x58A}, {0x5BE, 0x5BE}, {0x5C0, 0x5C0}, {0x5C3, 0x5C3}, {0x5C6, 0x5C6}, {0x5F3, 0x5F4}, {0x609, 0x60A}, {0x60C, 0x60D}, +{0x61B, 0x61B}, {0x61E, 0x61F}, {0x66A, 0x66D}, {0x6D4, 0x6D4}, {0x700, 0x70D}, {0x7F7, 0x7F9}, {0x830, 0x83E}, {0x85E, 0x85E}, {0x964, 0x965}, {0x970, 0x970}, {0x9FD, 0x9FD}, {0xA76, 0xA76}, +{0xAF0, 0xAF0}, {0xC77, 0xC77}, {0xC84, 0xC84}, {0xDF4, 0xDF4}, {0xE4F, 0xE4F}, {0xE5A, 0xE5B}, {0xF04, 0xF12}, {0xF14, 0xF14}, {0xF3A, 0xF3D}, {0xF85, 0xF85}, {0xFD0, 0xFD4}, {0xFD9, 0xFDA}, +{0x104A, 0x104F}, {0x10FB, 0x10FB}, {0x1360, 0x1368}, {0x1400, 0x1400}, {0x166E, 0x166E}, {0x169B, 0x169C}, {0x16EB, 0x16ED}, {0x1735, 0x1736}, {0x17D4, 0x17D6}, {0x17D8, 0x17DA}, {0x1800, 0x180A}, +{0x1944, 0x1945}, {0x1A1E, 0x1A1F}, {0x1AA0, 0x1AA6}, {0x1AA8, 0x1AAD}, {0x1B5A, 0x1B60}, {0x1BFC, 0x1BFF}, {0x1C3B, 0x1C3F}, {0x1C7E, 0x1C7F}, {0x1CC0, 0x1CC7}, {0x1CD3, 0x1CD3}, {0x2010, 0x2027}, +{0x2030, 0x2043}, {0x2045, 0x2051}, {0x2053, 0x205E}, {0x207D, 0x207E}, {0x208D, 0x208E}, {0x2308, 0x230B}, {0x2329, 0x232A}, {0x2768, 0x2775}, {0x27C5, 0x27C6}, {0x27E6, 0x27EF}, {0x2983, 0x2998}, +{0x29D8, 0x29DB}, {0x29FC, 0x29FD}, {0x2CF9, 0x2CFC}, {0x2CFE, 0x2CFF}, {0x2D70, 0x2D70}, {0x2E00, 0x2E2E}, {0x2E30, 0x2E4F}, {0x2E52, 0x2E52}, {0x3001, 0x3003}, {0x3008, 0x3011}, {0x3014, 0x301F}, +{0x3030, 0x3030}, {0x303D, 0x303D}, {0x30A0, 0x30A0}, {0x30FB, 0x30FB}, {0xA4FE, 0xA4FF}, {0xA60D, 0xA60F}, {0xA673, 0xA673}, {0xA67E, 0xA67E}, {0xA6F2, 0xA6F7}, {0xA874, 0xA877}, {0xA8CE, 0xA8CF}, +{0xA8F8, 0xA8FA}, {0xA8FC, 0xA8FC}, {0xA92E, 0xA92F}, {0xA95F, 0xA95F}, {0xA9C1, 0xA9CD}, {0xA9DE, 0xA9DF}, {0xAA5C, 0xAA5F}, {0xAADE, 0xAADF}, {0xAAF0, 0xAAF1}, {0xABEB, 0xABEB}, {0xFD3E, 0xFD3F}, +{0xFE10, 0xFE19}, {0xFE30, 0xFE52}, {0xFE54, 0xFE61}, {0xFE63, 0xFE63}, {0xFE68, 0xFE68}, {0xFE6A, 0xFE6B}, {0xFF01, 0xFF03}, {0xFF05, 0xFF0A}, {0xFF0C, 0xFF0F}, {0xFF1A, 0xFF1B}, {0xFF1F, 0xFF20}, +{0xFF3B, 0xFF3D}, {0xFF3F, 0xFF3F}, {0xFF5B, 0xFF5B}, {0xFF5D, 0xFF5D}, {0xFF5F, 0xFF65}, {0x10100, 0x10102}, {0x1039F, 0x1039F}, {0x103D0, 0x103D0}, {0x1056F, 0x1056F}, {0x10857, 0x10857}, +{0x1091F, 0x1091F}, {0x1093F, 0x1093F}, {0x10A50, 0x10A58}, {0x10A7F, 0x10A7F}, {0x10AF0, 0x10AF6}, {0x10B39, 0x10B3F}, {0x10B99, 0x10B9C}, {0x10EAD, 0x10EAD}, {0x10F55, 0x10F59}, {0x11047, 0x1104D}, +{0x110BB, 0x110BC}, {0x110BE, 0x110C1}, {0x11140, 0x11143}, {0x11174, 0x11175}, {0x111C5, 0x111C8}, {0x111CD, 0x111CD}, {0x111DB, 0x111DB}, {0x111DD, 0x111DF}, {0x11238, 0x1123D}, {0x112A9, 0x112A9}, +{0x1144B, 0x1144F}, {0x1145A, 0x1145B}, {0x1145D, 0x1145D}, {0x114C6, 0x114C6}, {0x115C1, 0x115D7}, {0x11641, 0x11643}, {0x11660, 0x1166C}, {0x1173C, 0x1173E}, {0x1183B, 0x1183B}, {0x11944, 0x11946}, +{0x119E2, 0x119E2}, {0x11A3F, 0x11A46}, {0x11A9A, 0x11A9C}, {0x11A9E, 0x11AA2}, {0x11C41, 0x11C45}, {0x11C70, 0x11C71}, {0x11EF7, 0x11EF8}, {0x11FFF, 0x11FFF}, {0x12470, 0x12474}, {0x16A6E, 0x16A6F}, +{0x16AF5, 0x16AF5}, {0x16B37, 0x16B3B}, {0x16B44, 0x16B44}, {0x16E97, 0x16E9A}, {0x16FE2, 0x16FE2}, {0x1BC9F, 0x1BC9F}, {0x1DA87, 0x1DA8B}, {0x1E95E, 0x1E95F}, +}; + +static const std::vector> symbol_ranges = { +{0x24, 0x24}, {0x2B, 0x2B}, {0x3C, 0x3E}, {0x5E, 0x5E}, {0x60, 0x60}, {0x7C, 0x7C}, {0x7E, 0x7E}, {0xA2, 0xA6}, {0xA8, 0xA9}, {0xAC, 0xAC}, {0xAE, 0xB1}, {0xB4, 0xB4}, {0xB8, 0xB8}, {0xD7, 0xD7}, +{0xF7, 0xF7}, {0x2C2, 0x2C5}, {0x2D2, 0x2DF}, {0x2E5, 0x2EB}, {0x2ED, 0x2ED}, {0x2EF, 0x2FF}, {0x375, 0x375}, {0x384, 0x385}, {0x3F6, 0x3F6}, {0x482, 0x482}, {0x58D, 0x58F}, {0x606, 0x608}, +{0x60B, 0x60B}, {0x60E, 0x60F}, {0x6DE, 0x6DE}, {0x6E9, 0x6E9}, {0x6FD, 0x6FE}, {0x7F6, 0x7F6}, {0x7FE, 0x7FF}, {0x9F2, 0x9F3}, {0x9FA, 0x9FB}, {0xAF1, 0xAF1}, {0xB70, 0xB70}, {0xBF3, 0xBFA}, +{0xC7F, 0xC7F}, {0xD4F, 0xD4F}, {0xD79, 0xD79}, {0xE3F, 0xE3F}, {0xF01, 0xF03}, {0xF13, 0xF13}, {0xF15, 0xF17}, {0xF1A, 0xF1F}, {0xF34, 0xF34}, {0xF36, 0xF36}, {0xF38, 0xF38}, {0xFBE, 0xFC5}, +{0xFC7, 0xFCC}, {0xFCE, 0xFCF}, {0xFD5, 0xFD8}, {0x109E, 0x109F}, {0x1390, 0x1399}, {0x166D, 0x166D}, {0x17DB, 0x17DB}, {0x1940, 0x1940}, {0x19DE, 0x19FF}, {0x1B61, 0x1B6A}, {0x1B74, 0x1B7C}, +{0x1FBD, 0x1FBD}, {0x1FBF, 0x1FC1}, {0x1FCD, 0x1FCF}, {0x1FDD, 0x1FDF}, {0x1FED, 0x1FEF}, {0x1FFD, 0x1FFE}, {0x2044, 0x2044}, {0x2052, 0x2052}, {0x207A, 0x207C}, {0x208A, 0x208C}, {0x20A0, 0x20BF}, +{0x2100, 0x2101}, {0x2103, 0x2106}, {0x2108, 0x2109}, {0x2114, 0x2114}, {0x2116, 0x2118}, {0x211E, 0x2123}, {0x2125, 0x2125}, {0x2127, 0x2127}, {0x2129, 0x2129}, {0x212E, 0x212E}, {0x213A, 0x213B}, +{0x2140, 0x2144}, {0x214A, 0x214D}, {0x214F, 0x214F}, {0x218A, 0x218B}, {0x2190, 0x2307}, {0x230C, 0x2328}, {0x232B, 0x2426}, {0x2440, 0x244A}, {0x249C, 0x24E9}, {0x2500, 0x2767}, {0x2794, 0x27C4}, +{0x27C7, 0x27E5}, {0x27F0, 0x2982}, {0x2999, 0x29D7}, {0x29DC, 0x29FB}, {0x29FE, 0x2B73}, {0x2B76, 0x2B95}, {0x2B97, 0x2BFF}, {0x2CE5, 0x2CEA}, {0x2E50, 0x2E51}, {0x2E80, 0x2E99}, {0x2E9B, 0x2EF3}, +{0x2F00, 0x2FD5}, {0x2FF0, 0x2FFB}, {0x3004, 0x3004}, {0x3012, 0x3013}, {0x3020, 0x3020}, {0x3036, 0x3037}, {0x303E, 0x303F}, {0x309B, 0x309C}, {0x3190, 0x3191}, {0x3196, 0x319F}, {0x31C0, 0x31E3}, +{0x3200, 0x321E}, {0x322A, 0x3247}, {0x3250, 0x3250}, {0x3260, 0x327F}, {0x328A, 0x32B0}, {0x32C0, 0x33FF}, {0x4DC0, 0x4DFF}, {0xA490, 0xA4C6}, {0xA700, 0xA716}, {0xA720, 0xA721}, {0xA789, 0xA78A}, +{0xA828, 0xA82B}, {0xA836, 0xA839}, {0xAA77, 0xAA79}, {0xAB5B, 0xAB5B}, {0xAB6A, 0xAB6B}, {0xFB29, 0xFB29}, {0xFBB2, 0xFBC1}, {0xFDFC, 0xFDFD}, {0xFE62, 0xFE62}, {0xFE64, 0xFE66}, {0xFE69, 0xFE69}, +{0xFF04, 0xFF04}, {0xFF0B, 0xFF0B}, {0xFF1C, 0xFF1E}, {0xFF3E, 0xFF3E}, {0xFF40, 0xFF40}, {0xFF5C, 0xFF5C}, {0xFF5E, 0xFF5E}, {0xFFE0, 0xFFE6}, {0xFFE8, 0xFFEE}, {0xFFFC, 0xFFFD}, {0x10137, 0x1013F}, +{0x10179, 0x10189}, {0x1018C, 0x1018E}, {0x10190, 0x1019C}, {0x101A0, 0x101A0}, {0x101D0, 0x101FC}, {0x10877, 0x10878}, {0x10AC8, 0x10AC8}, {0x1173F, 0x1173F}, {0x11FD5, 0x11FF1}, {0x16B3C, 0x16B3F}, +{0x16B45, 0x16B45}, {0x1BC9C, 0x1BC9C}, {0x1D000, 0x1D0F5}, {0x1D100, 0x1D126}, {0x1D129, 0x1D164}, {0x1D16A, 0x1D16C}, {0x1D183, 0x1D184}, {0x1D18C, 0x1D1A9}, {0x1D1AE, 0x1D1E8}, {0x1D200, 0x1D241}, +{0x1D245, 0x1D245}, {0x1D300, 0x1D356}, {0x1D6C1, 0x1D6C1}, {0x1D6DB, 0x1D6DB}, {0x1D6FB, 0x1D6FB}, {0x1D715, 0x1D715}, {0x1D735, 0x1D735}, {0x1D74F, 0x1D74F}, {0x1D76F, 0x1D76F}, {0x1D789, 0x1D789}, +{0x1D7A9, 0x1D7A9}, {0x1D7C3, 0x1D7C3}, {0x1D800, 0x1D9FF}, {0x1DA37, 0x1DA3A}, {0x1DA6D, 0x1DA74}, {0x1DA76, 0x1DA83}, {0x1DA85, 0x1DA86}, {0x1E14F, 0x1E14F}, {0x1E2FF, 0x1E2FF}, {0x1ECAC, 0x1ECAC}, +{0x1ECB0, 0x1ECB0}, {0x1ED2E, 0x1ED2E}, {0x1EEF0, 0x1EEF1}, {0x1F000, 0x1F02B}, {0x1F030, 0x1F093}, {0x1F0A0, 0x1F0AE}, {0x1F0B1, 0x1F0BF}, {0x1F0C1, 0x1F0CF}, {0x1F0D1, 0x1F0F5}, {0x1F10D, 0x1F1AD}, +{0x1F1E6, 0x1F202}, {0x1F210, 0x1F23B}, {0x1F240, 0x1F248}, {0x1F250, 0x1F251}, {0x1F260, 0x1F265}, {0x1F300, 0x1F6D7}, {0x1F6E0, 0x1F6EC}, {0x1F6F0, 0x1F6FC}, {0x1F700, 0x1F773}, {0x1F780, 0x1F7D8}, +{0x1F7E0, 0x1F7EB}, {0x1F800, 0x1F80B}, {0x1F810, 0x1F847}, {0x1F850, 0x1F859}, {0x1F860, 0x1F887}, {0x1F890, 0x1F8AD}, {0x1F8B0, 0x1F8B1}, {0x1F900, 0x1F978}, {0x1F97A, 0x1F9CB}, {0x1F9CD, 0x1FA53}, +{0x1FA60, 0x1FA6D}, {0x1FA70, 0x1FA74}, {0x1FA78, 0x1FA7A}, {0x1FA80, 0x1FA86}, {0x1FA90, 0x1FAA8}, {0x1FAB0, 0x1FAB6}, {0x1FAC0, 0x1FAC2}, {0x1FAD0, 0x1FAD6}, {0x1FB00, 0x1FB92}, {0x1FB94, 0x1FBCA}, +}; + +static const std::vector> control_ranges = { +{0x0, 0x8}, {0xE, 0x1B}, {0x7F, 0x84}, {0x86, 0x9F}, {0xAD, 0xAD}, {0x378, 0x379}, {0x380, 0x383}, {0x38B, 0x38B}, {0x38D, 0x38D}, {0x3A2, 0x3A2}, {0x530, 0x530}, {0x557, 0x558}, {0x58B, 0x58C}, +{0x590, 0x590}, {0x5C8, 0x5CF}, {0x5EB, 0x5EE}, {0x5F5, 0x605}, {0x61C, 0x61D}, {0x6DD, 0x6DD}, {0x70E, 0x70F}, {0x74B, 0x74C}, {0x7B2, 0x7BF}, {0x7FB, 0x7FC}, {0x82E, 0x82F}, {0x83F, 0x83F}, +{0x85C, 0x85D}, {0x85F, 0x85F}, {0x86B, 0x89F}, {0x8B5, 0x8B5}, {0x8C8, 0x8D2}, {0x8E2, 0x8E2}, {0x984, 0x984}, {0x98D, 0x98E}, {0x991, 0x992}, {0x9A9, 0x9A9}, {0x9B1, 0x9B1}, {0x9B3, 0x9B5}, +{0x9BA, 0x9BB}, {0x9C5, 0x9C6}, {0x9C9, 0x9CA}, {0x9CF, 0x9D6}, {0x9D8, 0x9DB}, {0x9DE, 0x9DE}, {0x9E4, 0x9E5}, {0x9FF, 0xA00}, {0xA04, 0xA04}, {0xA0B, 0xA0E}, {0xA11, 0xA12}, {0xA29, 0xA29}, +{0xA31, 0xA31}, {0xA34, 0xA34}, {0xA37, 0xA37}, {0xA3A, 0xA3B}, {0xA3D, 0xA3D}, {0xA43, 0xA46}, {0xA49, 0xA4A}, {0xA4E, 0xA50}, {0xA52, 0xA58}, {0xA5D, 0xA5D}, {0xA5F, 0xA65}, {0xA77, 0xA80}, +{0xA84, 0xA84}, {0xA8E, 0xA8E}, {0xA92, 0xA92}, {0xAA9, 0xAA9}, {0xAB1, 0xAB1}, {0xAB4, 0xAB4}, {0xABA, 0xABB}, {0xAC6, 0xAC6}, {0xACA, 0xACA}, {0xACE, 0xACF}, {0xAD1, 0xADF}, {0xAE4, 0xAE5}, +{0xAF2, 0xAF8}, {0xB00, 0xB00}, {0xB04, 0xB04}, {0xB0D, 0xB0E}, {0xB11, 0xB12}, {0xB29, 0xB29}, {0xB31, 0xB31}, {0xB34, 0xB34}, {0xB3A, 0xB3B}, {0xB45, 0xB46}, {0xB49, 0xB4A}, {0xB4E, 0xB54}, +{0xB58, 0xB5B}, {0xB5E, 0xB5E}, {0xB64, 0xB65}, {0xB78, 0xB81}, {0xB84, 0xB84}, {0xB8B, 0xB8D}, {0xB91, 0xB91}, {0xB96, 0xB98}, {0xB9B, 0xB9B}, {0xB9D, 0xB9D}, {0xBA0, 0xBA2}, {0xBA5, 0xBA7}, +{0xBAB, 0xBAD}, {0xBBA, 0xBBD}, {0xBC3, 0xBC5}, {0xBC9, 0xBC9}, {0xBCE, 0xBCF}, {0xBD1, 0xBD6}, {0xBD8, 0xBE5}, {0xBFB, 0xBFF}, {0xC0D, 0xC0D}, {0xC11, 0xC11}, {0xC29, 0xC29}, {0xC3A, 0xC3C}, +{0xC45, 0xC45}, {0xC49, 0xC49}, {0xC4E, 0xC54}, {0xC57, 0xC57}, {0xC5B, 0xC5F}, {0xC64, 0xC65}, {0xC70, 0xC76}, {0xC8D, 0xC8D}, {0xC91, 0xC91}, {0xCA9, 0xCA9}, {0xCB4, 0xCB4}, {0xCBA, 0xCBB}, +{0xCC5, 0xCC5}, {0xCC9, 0xCC9}, {0xCCE, 0xCD4}, {0xCD7, 0xCDD}, {0xCDF, 0xCDF}, {0xCE4, 0xCE5}, {0xCF0, 0xCF0}, {0xCF3, 0xCFF}, {0xD0D, 0xD0D}, {0xD11, 0xD11}, {0xD45, 0xD45}, {0xD49, 0xD49}, +{0xD50, 0xD53}, {0xD64, 0xD65}, {0xD80, 0xD80}, {0xD84, 0xD84}, {0xD97, 0xD99}, {0xDB2, 0xDB2}, {0xDBC, 0xDBC}, {0xDBE, 0xDBF}, {0xDC7, 0xDC9}, {0xDCB, 0xDCE}, {0xDD5, 0xDD5}, {0xDD7, 0xDD7}, +{0xDE0, 0xDE5}, {0xDF0, 0xDF1}, {0xDF5, 0xE00}, {0xE3B, 0xE3E}, {0xE5C, 0xE80}, {0xE83, 0xE83}, {0xE85, 0xE85}, {0xE8B, 0xE8B}, {0xEA4, 0xEA4}, {0xEA6, 0xEA6}, {0xEBE, 0xEBF}, {0xEC5, 0xEC5}, +{0xEC7, 0xEC7}, {0xECE, 0xECF}, {0xEDA, 0xEDB}, {0xEE0, 0xEFF}, {0xF48, 0xF48}, {0xF6D, 0xF70}, {0xF98, 0xF98}, {0xFBD, 0xFBD}, {0xFCD, 0xFCD}, {0xFDB, 0xFFF}, {0x10C6, 0x10C6}, {0x10C8, 0x10CC}, +{0x10CE, 0x10CF}, {0x1249, 0x1249}, {0x124E, 0x124F}, {0x1257, 0x1257}, {0x1259, 0x1259}, {0x125E, 0x125F}, {0x1289, 0x1289}, {0x128E, 0x128F}, {0x12B1, 0x12B1}, {0x12B6, 0x12B7}, {0x12BF, 0x12BF}, +{0x12C1, 0x12C1}, {0x12C6, 0x12C7}, {0x12D7, 0x12D7}, {0x1311, 0x1311}, {0x1316, 0x1317}, {0x135B, 0x135C}, {0x137D, 0x137F}, {0x139A, 0x139F}, {0x13F6, 0x13F7}, {0x13FE, 0x13FF}, {0x169D, 0x169F}, +{0x16F9, 0x16FF}, {0x170D, 0x170D}, {0x1715, 0x171F}, {0x1737, 0x173F}, {0x1754, 0x175F}, {0x176D, 0x176D}, {0x1771, 0x1771}, {0x1774, 0x177F}, {0x17DE, 0x17DF}, {0x17EA, 0x17EF}, {0x17FA, 0x17FF}, +{0x180E, 0x180F}, {0x181A, 0x181F}, {0x1879, 0x187F}, {0x18AB, 0x18AF}, {0x18F6, 0x18FF}, {0x191F, 0x191F}, {0x192C, 0x192F}, {0x193C, 0x193F}, {0x1941, 0x1943}, {0x196E, 0x196F}, {0x1975, 0x197F}, +{0x19AC, 0x19AF}, {0x19CA, 0x19CF}, {0x19DB, 0x19DD}, {0x1A1C, 0x1A1D}, {0x1A5F, 0x1A5F}, {0x1A7D, 0x1A7E}, {0x1A8A, 0x1A8F}, {0x1A9A, 0x1A9F}, {0x1AAE, 0x1AAF}, {0x1AC1, 0x1AFF}, {0x1B4C, 0x1B4F}, +{0x1B7D, 0x1B7F}, {0x1BF4, 0x1BFB}, {0x1C38, 0x1C3A}, {0x1C4A, 0x1C4C}, {0x1C89, 0x1C8F}, {0x1CBB, 0x1CBC}, {0x1CC8, 0x1CCF}, {0x1CFB, 0x1CFF}, {0x1DFA, 0x1DFA}, {0x1F16, 0x1F17}, {0x1F1E, 0x1F1F}, +{0x1F46, 0x1F47}, {0x1F4E, 0x1F4F}, {0x1F58, 0x1F58}, {0x1F5A, 0x1F5A}, {0x1F5C, 0x1F5C}, {0x1F5E, 0x1F5E}, {0x1F7E, 0x1F7F}, {0x1FB5, 0x1FB5}, {0x1FC5, 0x1FC5}, {0x1FD4, 0x1FD5}, {0x1FDC, 0x1FDC}, +{0x1FF0, 0x1FF1}, {0x1FF5, 0x1FF5}, {0x1FFF, 0x1FFF}, {0x200B, 0x200F}, {0x202A, 0x202E}, {0x2060, 0x206F}, {0x2072, 0x2073}, {0x208F, 0x208F}, {0x209D, 0x209F}, {0x20C0, 0x20CF}, {0x20F1, 0x20FF}, +{0x218C, 0x218F}, {0x2427, 0x243F}, {0x244B, 0x245F}, {0x2B74, 0x2B75}, {0x2B96, 0x2B96}, {0x2C2F, 0x2C2F}, {0x2C5F, 0x2C5F}, {0x2CF4, 0x2CF8}, {0x2D26, 0x2D26}, {0x2D28, 0x2D2C}, {0x2D2E, 0x2D2F}, +{0x2D68, 0x2D6E}, {0x2D71, 0x2D7E}, {0x2D97, 0x2D9F}, {0x2DA7, 0x2DA7}, {0x2DAF, 0x2DAF}, {0x2DB7, 0x2DB7}, {0x2DBF, 0x2DBF}, {0x2DC7, 0x2DC7}, {0x2DCF, 0x2DCF}, {0x2DD7, 0x2DD7}, {0x2DDF, 0x2DDF}, +{0x2E53, 0x2E7F}, {0x2E9A, 0x2E9A}, {0x2EF4, 0x2EFF}, {0x2FD6, 0x2FEF}, {0x2FFC, 0x2FFF}, {0x3040, 0x3040}, {0x3097, 0x3098}, {0x3100, 0x3104}, {0x3130, 0x3130}, {0x318F, 0x318F}, {0x31E4, 0x31EF}, +{0x321F, 0x321F}, {0x9FFD, 0x9FFF}, {0xA48D, 0xA48F}, {0xA4C7, 0xA4CF}, {0xA62C, 0xA63F}, {0xA6F8, 0xA6FF}, {0xA7C0, 0xA7C1}, {0xA7CB, 0xA7F4}, {0xA82D, 0xA82F}, {0xA83A, 0xA83F}, {0xA878, 0xA87F}, +{0xA8C6, 0xA8CD}, {0xA8DA, 0xA8DF}, {0xA954, 0xA95E}, {0xA97D, 0xA97F}, {0xA9CE, 0xA9CE}, {0xA9DA, 0xA9DD}, {0xA9FF, 0xA9FF}, {0xAA37, 0xAA3F}, {0xAA4E, 0xAA4F}, {0xAA5A, 0xAA5B}, {0xAAC3, 0xAADA}, +{0xAAF7, 0xAB00}, {0xAB07, 0xAB08}, {0xAB0F, 0xAB10}, {0xAB17, 0xAB1F}, {0xAB27, 0xAB27}, {0xAB2F, 0xAB2F}, {0xAB6C, 0xAB6F}, {0xABEE, 0xABEF}, {0xABFA, 0xABFF}, {0xD7A4, 0xD7AF}, {0xD7C7, 0xD7CA}, +{0xD7FC, 0xF8FF}, {0xFA6E, 0xFA6F}, {0xFADA, 0xFAFF}, {0xFB07, 0xFB12}, {0xFB18, 0xFB1C}, {0xFB37, 0xFB37}, {0xFB3D, 0xFB3D}, {0xFB3F, 0xFB3F}, {0xFB42, 0xFB42}, {0xFB45, 0xFB45}, {0xFBC2, 0xFBD2}, +{0xFD40, 0xFD4F}, {0xFD90, 0xFD91}, {0xFDC8, 0xFDEF}, {0xFDFE, 0xFDFF}, {0xFE1A, 0xFE1F}, {0xFE53, 0xFE53}, {0xFE67, 0xFE67}, {0xFE6C, 0xFE6F}, {0xFE75, 0xFE75}, {0xFEFD, 0xFF00}, {0xFFBF, 0xFFC1}, +{0xFFC8, 0xFFC9}, {0xFFD0, 0xFFD1}, {0xFFD8, 0xFFD9}, {0xFFDD, 0xFFDF}, {0xFFE7, 0xFFE7}, {0xFFEF, 0xFFFB}, {0xFFFE, 0xFFFF}, {0x1000C, 0x1000C}, {0x10027, 0x10027}, {0x1003B, 0x1003B}, +{0x1003E, 0x1003E}, {0x1004E, 0x1004F}, {0x1005E, 0x1007F}, {0x100FB, 0x100FF}, {0x10103, 0x10106}, {0x10134, 0x10136}, {0x1018F, 0x1018F}, {0x1019D, 0x1019F}, {0x101A1, 0x101CF}, {0x101FE, 0x1027F}, +{0x1029D, 0x1029F}, {0x102D1, 0x102DF}, {0x102FC, 0x102FF}, {0x10324, 0x1032C}, {0x1034B, 0x1034F}, {0x1037B, 0x1037F}, {0x1039E, 0x1039E}, {0x103C4, 0x103C7}, {0x103D6, 0x103FF}, {0x1049E, 0x1049F}, +{0x104AA, 0x104AF}, {0x104D4, 0x104D7}, {0x104FC, 0x104FF}, {0x10528, 0x1052F}, {0x10564, 0x1056E}, {0x10570, 0x105FF}, {0x10737, 0x1073F}, {0x10756, 0x1075F}, {0x10768, 0x107FF}, {0x10806, 0x10807}, +{0x10809, 0x10809}, {0x10836, 0x10836}, {0x10839, 0x1083B}, {0x1083D, 0x1083E}, {0x10856, 0x10856}, {0x1089F, 0x108A6}, {0x108B0, 0x108DF}, {0x108F3, 0x108F3}, {0x108F6, 0x108FA}, {0x1091C, 0x1091E}, +{0x1093A, 0x1093E}, {0x10940, 0x1097F}, {0x109B8, 0x109BB}, {0x109D0, 0x109D1}, {0x10A04, 0x10A04}, {0x10A07, 0x10A0B}, {0x10A14, 0x10A14}, {0x10A18, 0x10A18}, {0x10A36, 0x10A37}, {0x10A3B, 0x10A3E}, +{0x10A49, 0x10A4F}, {0x10A59, 0x10A5F}, {0x10AA0, 0x10ABF}, {0x10AE7, 0x10AEA}, {0x10AF7, 0x10AFF}, {0x10B36, 0x10B38}, {0x10B56, 0x10B57}, {0x10B73, 0x10B77}, {0x10B92, 0x10B98}, {0x10B9D, 0x10BA8}, +{0x10BB0, 0x10BFF}, {0x10C49, 0x10C7F}, {0x10CB3, 0x10CBF}, {0x10CF3, 0x10CF9}, {0x10D28, 0x10D2F}, {0x10D3A, 0x10E5F}, {0x10E7F, 0x10E7F}, {0x10EAA, 0x10EAA}, {0x10EAE, 0x10EAF}, {0x10EB2, 0x10EFF}, +{0x10F28, 0x10F2F}, {0x10F5A, 0x10FAF}, {0x10FCC, 0x10FDF}, {0x10FF7, 0x10FFF}, {0x1104E, 0x11051}, {0x11070, 0x1107E}, {0x110BD, 0x110BD}, {0x110C2, 0x110CF}, {0x110E9, 0x110EF}, {0x110FA, 0x110FF}, +{0x11135, 0x11135}, {0x11148, 0x1114F}, {0x11177, 0x1117F}, {0x111E0, 0x111E0}, {0x111F5, 0x111FF}, {0x11212, 0x11212}, {0x1123F, 0x1127F}, {0x11287, 0x11287}, {0x11289, 0x11289}, {0x1128E, 0x1128E}, +{0x1129E, 0x1129E}, {0x112AA, 0x112AF}, {0x112EB, 0x112EF}, {0x112FA, 0x112FF}, {0x11304, 0x11304}, {0x1130D, 0x1130E}, {0x11311, 0x11312}, {0x11329, 0x11329}, {0x11331, 0x11331}, {0x11334, 0x11334}, +{0x1133A, 0x1133A}, {0x11345, 0x11346}, {0x11349, 0x1134A}, {0x1134E, 0x1134F}, {0x11351, 0x11356}, {0x11358, 0x1135C}, {0x11364, 0x11365}, {0x1136D, 0x1136F}, {0x11375, 0x113FF}, {0x1145C, 0x1145C}, +{0x11462, 0x1147F}, {0x114C8, 0x114CF}, {0x114DA, 0x1157F}, {0x115B6, 0x115B7}, {0x115DE, 0x115FF}, {0x11645, 0x1164F}, {0x1165A, 0x1165F}, {0x1166D, 0x1167F}, {0x116B9, 0x116BF}, {0x116CA, 0x116FF}, +{0x1171B, 0x1171C}, {0x1172C, 0x1172F}, {0x11740, 0x117FF}, {0x1183C, 0x1189F}, {0x118F3, 0x118FE}, {0x11907, 0x11908}, {0x1190A, 0x1190B}, {0x11914, 0x11914}, {0x11917, 0x11917}, {0x11936, 0x11936}, +{0x11939, 0x1193A}, {0x11947, 0x1194F}, {0x1195A, 0x1199F}, {0x119A8, 0x119A9}, {0x119D8, 0x119D9}, {0x119E5, 0x119FF}, {0x11A48, 0x11A4F}, {0x11AA3, 0x11ABF}, {0x11AF9, 0x11BFF}, {0x11C09, 0x11C09}, +{0x11C37, 0x11C37}, {0x11C46, 0x11C4F}, {0x11C6D, 0x11C6F}, {0x11C90, 0x11C91}, {0x11CA8, 0x11CA8}, {0x11CB7, 0x11CFF}, {0x11D07, 0x11D07}, {0x11D0A, 0x11D0A}, {0x11D37, 0x11D39}, {0x11D3B, 0x11D3B}, +{0x11D3E, 0x11D3E}, {0x11D48, 0x11D4F}, {0x11D5A, 0x11D5F}, {0x11D66, 0x11D66}, {0x11D69, 0x11D69}, {0x11D8F, 0x11D8F}, {0x11D92, 0x11D92}, {0x11D99, 0x11D9F}, {0x11DAA, 0x11EDF}, {0x11EF9, 0x11FAF}, +{0x11FB1, 0x11FBF}, {0x11FF2, 0x11FFE}, {0x1239A, 0x123FF}, {0x1246F, 0x1246F}, {0x12475, 0x1247F}, {0x12544, 0x12FFF}, {0x1342F, 0x143FF}, {0x14647, 0x167FF}, {0x16A39, 0x16A3F}, {0x16A5F, 0x16A5F}, +{0x16A6A, 0x16A6D}, {0x16A70, 0x16ACF}, {0x16AEE, 0x16AEF}, {0x16AF6, 0x16AFF}, {0x16B46, 0x16B4F}, {0x16B5A, 0x16B5A}, {0x16B62, 0x16B62}, {0x16B78, 0x16B7C}, {0x16B90, 0x16E3F}, {0x16E9B, 0x16EFF}, +{0x16F4B, 0x16F4E}, {0x16F88, 0x16F8E}, {0x16FA0, 0x16FDF}, {0x16FE5, 0x16FEF}, {0x16FF2, 0x16FFF}, {0x187F8, 0x187FF}, {0x18CD6, 0x18CFF}, {0x18D09, 0x1AFFF}, {0x1B11F, 0x1B14F}, {0x1B153, 0x1B163}, +{0x1B168, 0x1B16F}, {0x1B2FC, 0x1BBFF}, {0x1BC6B, 0x1BC6F}, {0x1BC7D, 0x1BC7F}, {0x1BC89, 0x1BC8F}, {0x1BC9A, 0x1BC9B}, {0x1BCA0, 0x1CFFF}, {0x1D0F6, 0x1D0FF}, {0x1D127, 0x1D128}, {0x1D173, 0x1D17A}, +{0x1D1E9, 0x1D1FF}, {0x1D246, 0x1D2DF}, {0x1D2F4, 0x1D2FF}, {0x1D357, 0x1D35F}, {0x1D379, 0x1D3FF}, {0x1D455, 0x1D455}, {0x1D49D, 0x1D49D}, {0x1D4A0, 0x1D4A1}, {0x1D4A3, 0x1D4A4}, {0x1D4A7, 0x1D4A8}, +{0x1D4AD, 0x1D4AD}, {0x1D4BA, 0x1D4BA}, {0x1D4BC, 0x1D4BC}, {0x1D4C4, 0x1D4C4}, {0x1D506, 0x1D506}, {0x1D50B, 0x1D50C}, {0x1D515, 0x1D515}, {0x1D51D, 0x1D51D}, {0x1D53A, 0x1D53A}, {0x1D53F, 0x1D53F}, +{0x1D545, 0x1D545}, {0x1D547, 0x1D549}, {0x1D551, 0x1D551}, {0x1D6A6, 0x1D6A7}, {0x1D7CC, 0x1D7CD}, {0x1DA8C, 0x1DA9A}, {0x1DAA0, 0x1DAA0}, {0x1DAB0, 0x1DFFF}, {0x1E007, 0x1E007}, {0x1E019, 0x1E01A}, +{0x1E022, 0x1E022}, {0x1E025, 0x1E025}, {0x1E02B, 0x1E0FF}, {0x1E12D, 0x1E12F}, {0x1E13E, 0x1E13F}, {0x1E14A, 0x1E14D}, {0x1E150, 0x1E2BF}, {0x1E2FA, 0x1E2FE}, {0x1E300, 0x1E7FF}, {0x1E8C5, 0x1E8C6}, +{0x1E8D7, 0x1E8FF}, {0x1E94C, 0x1E94F}, {0x1E95A, 0x1E95D}, {0x1E960, 0x1EC70}, {0x1ECB5, 0x1ED00}, {0x1ED3E, 0x1EDFF}, {0x1EE04, 0x1EE04}, {0x1EE20, 0x1EE20}, {0x1EE23, 0x1EE23}, {0x1EE25, 0x1EE26}, +{0x1EE28, 0x1EE28}, {0x1EE33, 0x1EE33}, {0x1EE38, 0x1EE38}, {0x1EE3A, 0x1EE3A}, {0x1EE3C, 0x1EE41}, {0x1EE43, 0x1EE46}, {0x1EE48, 0x1EE48}, {0x1EE4A, 0x1EE4A}, {0x1EE4C, 0x1EE4C}, {0x1EE50, 0x1EE50}, +{0x1EE53, 0x1EE53}, {0x1EE55, 0x1EE56}, {0x1EE58, 0x1EE58}, {0x1EE5A, 0x1EE5A}, {0x1EE5C, 0x1EE5C}, {0x1EE5E, 0x1EE5E}, {0x1EE60, 0x1EE60}, {0x1EE63, 0x1EE63}, {0x1EE65, 0x1EE66}, {0x1EE6B, 0x1EE6B}, +{0x1EE73, 0x1EE73}, {0x1EE78, 0x1EE78}, {0x1EE7D, 0x1EE7D}, {0x1EE7F, 0x1EE7F}, {0x1EE8A, 0x1EE8A}, {0x1EE9C, 0x1EEA0}, {0x1EEA4, 0x1EEA4}, {0x1EEAA, 0x1EEAA}, {0x1EEBC, 0x1EEEF}, {0x1EEF2, 0x1EFFF}, +{0x1F02C, 0x1F02F}, {0x1F094, 0x1F09F}, {0x1F0AF, 0x1F0B0}, {0x1F0C0, 0x1F0C0}, {0x1F0D0, 0x1F0D0}, {0x1F0F6, 0x1F0FF}, {0x1F1AE, 0x1F1E5}, {0x1F203, 0x1F20F}, {0x1F23C, 0x1F23F}, {0x1F249, 0x1F24F}, +{0x1F252, 0x1F25F}, {0x1F266, 0x1F2FF}, {0x1F6D8, 0x1F6DF}, {0x1F6ED, 0x1F6EF}, {0x1F6FD, 0x1F6FF}, {0x1F774, 0x1F77F}, {0x1F7D9, 0x1F7DF}, {0x1F7EC, 0x1F7FF}, {0x1F80C, 0x1F80F}, {0x1F848, 0x1F84F}, +{0x1F85A, 0x1F85F}, {0x1F888, 0x1F88F}, {0x1F8AE, 0x1F8AF}, {0x1F8B2, 0x1F8FF}, {0x1F979, 0x1F979}, {0x1F9CC, 0x1F9CC}, {0x1FA54, 0x1FA5F}, {0x1FA6E, 0x1FA6F}, {0x1FA75, 0x1FA77}, {0x1FA7B, 0x1FA7F}, +{0x1FA87, 0x1FA8F}, {0x1FAA9, 0x1FAAF}, {0x1FAB7, 0x1FABF}, {0x1FAC3, 0x1FACF}, {0x1FAD7, 0x1FAFF}, {0x1FB93, 0x1FB93}, {0x1FBCB, 0x1FBEF}, {0x1FBFA, 0x1FFFF}, {0x2A6DE, 0x2A6FF}, {0x2B735, 0x2B73F}, +{0x2B81E, 0x2B81F}, {0x2CEA2, 0x2CEAF}, {0x2EBE1, 0x2F7FF}, {0x2FA1E, 0x2FFFF}, {0x3134B, 0xE00FF}, {0xE01F0, 0x10FFFF}, +}; + +static std::string codepoint_to_utf8(uint32_t cp) { + std::string result; + if (/* 0x00 <= cp && */ cp <= 0x7f) { + result.push_back(cp); + } + else if (0x80 <= cp && cp <= 0x7ff) { + result.push_back(0xc0 | ((cp >> 6) & 0x1f)); + result.push_back(0x80 | (cp & 0x3f)); + } + else if (0x800 <= cp && cp <= 0xffff) { + result.push_back(0xe0 | ((cp >> 12) & 0x0f)); + result.push_back(0x80 | ((cp >> 6) & 0x3f)); + result.push_back(0x80 | (cp & 0x3f)); + } + else if (0x10000 <= cp && cp <= 0x10ffff) { + result.push_back(0xf0 | ((cp >> 18) & 0x07)); + result.push_back(0x80 | ((cp >> 12) & 0x3f)); + result.push_back(0x80 | ((cp >> 6) & 0x3f)); + result.push_back(0x80 | (cp & 0x3f)); + } + else { + throw std::invalid_argument("invalid codepoint"); + } + return result; +} + +static std::string codepoints_to_utf8(const std::vector & cps) { + std::string result; + for (size_t i = 0; i < cps.size(); ++i) { + result.append(codepoint_to_utf8(cps[i])); + } + return result; +} + +static uint32_t codepoint_from_utf8(const std::string & utf8, size_t & offset) { + assert(offset < utf8.size()); + if (!(utf8[offset + 0] & 0x80)) { + auto result = utf8[offset + 0]; + offset += 1; + return result; + } + else if (!(utf8[offset + 0] & 0x40)) { + throw std::invalid_argument("invalid character"); + } + else if (!(utf8[offset + 0] & 0x20)) { + if (offset + 1 >= utf8.size() || ! ((utf8[offset + 1] & 0xc0) == 0x80)) + throw std::invalid_argument("invalid character"); + auto result = ((utf8[offset + 0] & 0x1f) << 6) | (utf8[offset + 1] & 0x3f); + offset += 2; + return result; + } + else if (!(utf8[offset + 0] & 0x10)) { + if (offset + 2 >= utf8.size() || ! ((utf8[offset + 1] & 0xc0) == 0x80) || ! ((utf8[offset + 2] & 0xc0) == 0x80)) + throw std::invalid_argument("invalid character"); + auto result = ((utf8[offset + 0] & 0x0f) << 12) | ((utf8[offset + 1] & 0x3f) << 6) | (utf8[offset + 2] & 0x3f); + offset += 3; + return result; + } + else if (!(utf8[offset + 0] & 0x08)) { + if (offset + 3 >= utf8.size() || ! ((utf8[offset + 1] & 0xc0) == 0x80) || ! ((utf8[offset + 2] & 0xc0) == 0x80) || !((utf8[offset + 3] & 0xc0) == 0x80)) + throw std::invalid_argument("invalid character"); + auto result = ((utf8[offset + 0] & 0x07) << 18) | ((utf8[offset + 1] & 0x3f) << 12) | ((utf8[offset + 2] & 0x3f) << 6) | (utf8[offset + 3] & 0x3f); + offset += 4; + return result; + } + throw std::invalid_argument("invalid string"); +} + +static std::vector codepoints_from_utf8(const std::string & utf8) { + std::vector result; + size_t offset = 0; + while (offset < utf8.size()) { + result.push_back(codepoint_from_utf8(utf8, offset)); + } + return result; +} + +static std::vector codepoint_to_utf16(uint32_t cp) { + std::vector result; + if (/* 0x0000 <= cp && */ cp <= 0xffff) { + result.emplace_back(cp); + } + else if (0x10000 <= cp && cp <= 0x10ffff) { + result.emplace_back(0xd800 | ((cp - 0x10000) >> 10)); + result.emplace_back(0xdc00 | ((cp - 0x10000) & 0x03ff)); + } + else { + throw std::invalid_argument("invalid codepoint"); + } + return result; +} + +static std::vector codepoints_to_utf16(const std::vector & cps) { + std::vector result; + for (size_t i = 0; i < cps.size(); ++i) { + auto temp = codepoint_to_utf16(cps[i]); + result.insert(result.end(), temp.begin(), temp.end()); + } + return result; +} + +static uint32_t codepoint_from_utf16(const std::vector & utf16, size_t & offset) { + assert(offset < utf16.size()); + if (((utf16[0] >> 10) << 10) != 0xd800) { + auto result = utf16[offset + 0]; + offset += 1; + return result; + } + else { + if (offset + 1 >= utf16.size() || !((utf16[1] & 0xdc00) == 0xdc00)) + throw std::invalid_argument("invalid character"); + auto result = 0x10000 + (((utf16[0] & 0x03ff) << 10) | (utf16[1] & 0x03ff)); + offset += 2; + return result; + } + throw std::invalid_argument("invalid string"); +} + +static std::vector codepoints_from_utf16(const std::vector & utf16) { + std::vector result; + size_t offset = 0; + while (offset < utf16.size()) + result.push_back(codepoint_from_utf16(utf16, offset)); + return result; +} + +#define CODEPOINT_TYPE_UNIDENTIFIED 0 +#define CODEPOINT_TYPE_DIGIT 1 +#define CODEPOINT_TYPE_LETTER 2 +#define CODEPOINT_TYPE_WHITESPACE 3 +#define CODEPOINT_TYPE_ACCENT_MARK 4 +#define CODEPOINT_TYPE_PUNCTUATION 5 +#define CODEPOINT_TYPE_SYMBOL 6 +#define CODEPOINT_TYPE_CONTROL 7 + +static std::unordered_map codepoint_type_map() { + std::unordered_map codepoint_types; + for (auto p : digit_ranges) { + for(auto i = p.first; i <= p.second; ++ i) + codepoint_types[i] = CODEPOINT_TYPE_DIGIT; + } + for(auto p : letter_ranges) { + for(auto i = p.first; i <= p.second; ++ i) + codepoint_types[i] = CODEPOINT_TYPE_LETTER; + } + for(auto p : whitespace_ranges) { + for(auto i = p.first; i <= p.second; ++ i) + codepoint_types[i] = CODEPOINT_TYPE_WHITESPACE; + } + for(auto p : accent_mark_ranges) { + for(auto i = p.first; i <= p.second; ++ i) + codepoint_types[i] = CODEPOINT_TYPE_ACCENT_MARK; + } + for(auto p : punctuation_ranges) { + for(auto i = p.first; i <= p.second; ++ i) + codepoint_types[i] = CODEPOINT_TYPE_PUNCTUATION; + } + for (auto p : symbol_ranges) { + for (auto i = p.first; i <= p.second; ++i) + codepoint_types[i] = CODEPOINT_TYPE_SYMBOL; + } + for(auto p : control_ranges) { + for(auto i = p.first; i <= p.second; ++ i) + codepoint_types[i] = CODEPOINT_TYPE_CONTROL; + } + return codepoint_types; +} + +static int codepoint_type(uint32_t cp) { + static std::unordered_map codepoint_types = codepoint_type_map(); + return codepoint_types[cp]; +} + +static int codepoint_type(const std::string & utf8) { + if (utf8.length() == 0) + return CODEPOINT_TYPE_UNIDENTIFIED; + size_t offset = 0; + return codepoint_type(codepoint_from_utf8(utf8, offset)); +} + +static std::unordered_map bytes_to_unicode_map_bpe() { + std::unordered_map map; + for (int ch = u'!'; ch <= u'~'; ++ch) { + assert(0 <= ch && ch < 256); + map[ch] = codepoint_to_utf8(ch); + } + for (int ch = u'¡'; ch <= u'¬'; ++ch) { + assert(0 <= ch && ch < 256); + map[ch] = codepoint_to_utf8(ch); + } + for (int ch = u'®'; ch <= u'ÿ'; ++ch) { + assert(0 <= ch && ch < 256); + map[ch] = codepoint_to_utf8(ch); + } + auto n = 0; + for (int ch = 0; ch < 256; ++ch) { + if (map.find(ch) == map.end()) { + map[ch] = codepoint_to_utf8(256 + n); + ++n; + } + } + return map; +} + +static std::string bytes_to_unicode_bpe(uint8_t byte) { + static std::unordered_map map = bytes_to_unicode_map_bpe(); + return map.at(byte); +} + +static std::unordered_map unicode_to_bytes_map_bpe() { + std::unordered_map map; + for (int ch = u'!'; ch <= u'~'; ++ch) { + assert(0 <= ch && ch < 256); + map[codepoint_to_utf8(ch)] = ch; + } + for (int ch = u'¡'; ch <= u'¬'; ++ch) { + assert(0 <= ch && ch < 256); + map[codepoint_to_utf8(ch)] = ch; + } + for (int ch = u'®'; ch <= u'ÿ'; ++ch) { + assert(0 <= ch && ch < 256); + map[codepoint_to_utf8(ch)] = ch; + } + auto n = 0; + for (int ch = 0; ch < 256; ++ch) { + if (map.find(codepoint_to_utf8(ch)) == map.end()) { + map[codepoint_to_utf8(256 + n)] = ch; + ++n; + } + } + return map; +} + +static uint8_t unicode_to_bytes_bpe(const std::string & utf8) { + static std::unordered_map map = unicode_to_bytes_map_bpe(); + return map.at(utf8); +} + From 017efe899d8fa76118aef88e963210d48da01172 Mon Sep 17 00:00:00 2001 From: Eve <139727413+netrunnereve@users.noreply.github.com> Date: Tue, 3 Oct 2023 16:53:15 +0000 Subject: [PATCH 29/73] cmake : make LLAMA_NATIVE flag actually use the instructions supported by the processor (#3273) * fix LLAMA_NATIVE * syntax * alternate implementation * my eyes must be getting bad... * set cmake LLAMA_NATIVE=ON by default * march=native doesn't work for ios/tvos, so disable for those targets. also see what happens if we use it on msvc * revert 8283237 and only allow LLAMA_NATIVE on x86 like the Makefile * remove -DLLAMA_MPI=ON --------- Co-authored-by: netrunnereve --- .github/workflows/build.yml | 16 ++++++++-------- CMakeLists.txt | 28 +++++++++++++++++----------- flake.nix | 2 +- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2fb101d78..35f84e404 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -188,7 +188,7 @@ jobs: sysctl -a mkdir build cd build - cmake -DLLAMA_AVX2=OFF -DLLAMA_FMA=OFF .. + cmake .. cmake --build . --config Release -j $(sysctl -n hw.logicalcpu) - name: Test @@ -265,17 +265,17 @@ jobs: matrix: include: - build: 'noavx' - defines: '-DLLAMA_BUILD_SERVER=ON -DLLAMA_AVX=OFF -DLLAMA_AVX2=OFF -DLLAMA_FMA=OFF -DBUILD_SHARED_LIBS=ON' + defines: '-DLLAMA_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON -DLLAMA_AVX=OFF -DLLAMA_AVX2=OFF -DLLAMA_FMA=OFF -DBUILD_SHARED_LIBS=ON' - build: 'avx2' - defines: '-DLLAMA_BUILD_SERVER=ON -DBUILD_SHARED_LIBS=ON' + defines: '-DLLAMA_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON -DBUILD_SHARED_LIBS=ON' - build: 'avx' - defines: '-DLLAMA_BUILD_SERVER=ON -DLLAMA_AVX2=OFF -DBUILD_SHARED_LIBS=ON' + defines: '-DLLAMA_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON -DLLAMA_AVX2=OFF -DBUILD_SHARED_LIBS=ON' - build: 'avx512' - defines: '-DLLAMA_BUILD_SERVER=ON -DLLAMA_AVX512=ON -DBUILD_SHARED_LIBS=ON' + defines: '-DLLAMA_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON -DLLAMA_AVX512=ON -DBUILD_SHARED_LIBS=ON' - build: 'clblast' - defines: '-DLLAMA_BUILD_SERVER=ON -DLLAMA_CLBLAST=ON -DBUILD_SHARED_LIBS=ON -DCMAKE_PREFIX_PATH="$env:RUNNER_TEMP/clblast"' + defines: '-DLLAMA_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON -DLLAMA_CLBLAST=ON -DBUILD_SHARED_LIBS=ON -DCMAKE_PREFIX_PATH="$env:RUNNER_TEMP/clblast"' - build: 'openblas' - defines: '-DLLAMA_BUILD_SERVER=ON -DLLAMA_BLAS=ON -DBUILD_SHARED_LIBS=ON -DLLAMA_BLAS_VENDOR=OpenBLAS -DBLAS_INCLUDE_DIRS="$env:RUNNER_TEMP/openblas/include" -DBLAS_LIBRARIES="$env:RUNNER_TEMP/openblas/lib/openblas.lib"' + defines: '-DLLAMA_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON -DLLAMA_BLAS=ON -DBUILD_SHARED_LIBS=ON -DLLAMA_BLAS_VENDOR=OpenBLAS -DBLAS_INCLUDE_DIRS="$env:RUNNER_TEMP/openblas/include" -DBLAS_LIBRARIES="$env:RUNNER_TEMP/openblas/lib/openblas.lib"' steps: - name: Clone @@ -414,7 +414,7 @@ jobs: run: | mkdir build cd build - cmake .. -DLLAMA_BUILD_SERVER=ON -DLLAMA_CUBLAS=ON -DBUILD_SHARED_LIBS=ON + cmake .. -DLLAMA_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON -DLLAMA_CUBLAS=ON -DBUILD_SHARED_LIBS=ON cmake --build . --config Release -j ${env:NUMBER_OF_PROCESSORS} - name: Determine tag name diff --git a/CMakeLists.txt b/CMakeLists.txt index 49b37f7d5..7c79ec486 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,7 +44,7 @@ endif() # general option(LLAMA_STATIC "llama: static link libraries" OFF) -option(LLAMA_NATIVE "llama: enable -march=native flag" OFF) +option(LLAMA_NATIVE "llama: enable -march=native flag" ON) option(LLAMA_LTO "llama: enable link time optimization" OFF) # debug @@ -58,15 +58,21 @@ option(LLAMA_SANITIZE_ADDRESS "llama: enable address sanitizer" option(LLAMA_SANITIZE_UNDEFINED "llama: enable undefined sanitizer" OFF) # instruction set specific -option(LLAMA_AVX "llama: enable AVX" ON) -option(LLAMA_AVX2 "llama: enable AVX2" ON) -option(LLAMA_AVX512 "llama: enable AVX512" OFF) -option(LLAMA_AVX512_VBMI "llama: enable AVX512-VBMI" OFF) -option(LLAMA_AVX512_VNNI "llama: enable AVX512-VNNI" OFF) -option(LLAMA_FMA "llama: enable FMA" ON) +if (LLAMA_NATIVE) + set(INS_ENB OFF) +else() + set(INS_ENB ON) +endif() + +option(LLAMA_AVX "llama: enable AVX" ${INS_ENB}) +option(LLAMA_AVX2 "llama: enable AVX2" ${INS_ENB}) +option(LLAMA_AVX512 "llama: enable AVX512" OFF) +option(LLAMA_AVX512_VBMI "llama: enable AVX512-VBMI" OFF) +option(LLAMA_AVX512_VNNI "llama: enable AVX512-VNNI" OFF) +option(LLAMA_FMA "llama: enable FMA" ${INS_ENB}) # in MSVC F16C is implied with AVX2/AVX512 if (NOT MSVC) - option(LLAMA_F16C "llama: enable F16C" ON) + option(LLAMA_F16C "llama: enable F16C" ${INS_ENB}) endif() # 3rd party libs @@ -504,9 +510,6 @@ if (NOT MSVC) if (LLAMA_GPROF) add_compile_options(-pg) endif() - if (LLAMA_NATIVE) - add_compile_options(-march=native) - endif() endif() if ((${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") OR (${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64") OR ("${CMAKE_GENERATOR_PLATFORM_LWR}" MATCHES "arm64")) @@ -561,6 +564,9 @@ elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(x86_64|i686|AMD64)$" OR "${CMAKE_GE add_compile_options($<$:/arch:AVX>) endif() else() + if (LLAMA_NATIVE) + add_compile_options(-march=native) + endif() if (LLAMA_F16C) add_compile_options(-mf16c) endif() diff --git a/flake.nix b/flake.nix index 433d3d942..cfc4776a4 100644 --- a/flake.nix +++ b/flake.nix @@ -62,7 +62,7 @@ mkdir -p $out/include cp ${src}/llama.h $out/include/ ''; - cmakeFlags = [ "-DLLAMA_BUILD_SERVER=ON" "-DLLAMA_MPI=ON" "-DBUILD_SHARED_LIBS=ON" "-DCMAKE_SKIP_BUILD_RPATH=ON" ]; + cmakeFlags = [ "-DLLAMA_NATIVE=OFF" "-DLLAMA_BUILD_SERVER=ON" "-DBUILD_SHARED_LIBS=ON" "-DCMAKE_SKIP_BUILD_RPATH=ON" ]; in { packages.default = pkgs.stdenv.mkDerivation { From f56e1baec361b5381e32ee6b6e56e4f00e002dfe Mon Sep 17 00:00:00 2001 From: Jiahao Li Date: Wed, 4 Oct 2023 00:55:21 +0800 Subject: [PATCH 30/73] metal : alibi for arbitrary number of heads (#3426) --- ggml-metal.m | 9 ++++----- ggml-metal.metal | 11 +++++++++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/ggml-metal.m b/ggml-metal.m index b3c463f03..866fed434 100644 --- a/ggml-metal.m +++ b/ggml-metal.m @@ -1213,12 +1213,9 @@ void ggml_metal_graph_compute( float max_bias; memcpy(&max_bias, (int32_t *) dst->op_params + 2, sizeof(float)); - if (__builtin_popcount(n_head) != 1) { - GGML_ASSERT(false && "only power-of-two n_head implemented"); - } - const int n_heads_log2_floor = 1 << (int) floor(log2(n_head)); const float m0 = powf(2.0f, -(max_bias) / n_heads_log2_floor); + const float m1 = powf(2.0f, -(max_bias / 2.0f) / n_heads_log2_floor); [encoder setComputePipelineState:ctx->pipeline_alibi_f32]; [encoder setBuffer:id_src0 offset:offs_src0 atIndex:0]; @@ -1239,7 +1236,9 @@ void ggml_metal_graph_compute( [encoder setBytes:&nb1 length:sizeof(uint64_t) atIndex:15]; [encoder setBytes:&nb2 length:sizeof(uint64_t) atIndex:16]; [encoder setBytes:&nb3 length:sizeof(uint64_t) atIndex:17]; - [encoder setBytes:&m0 length:sizeof( float) atIndex:18]; + [encoder setBytes:&m0 length:sizeof( float) atIndex:18]; + [encoder setBytes:&m1 length:sizeof( float) atIndex:19]; + [encoder setBytes:&n_heads_log2_floor length:sizeof(int) atIndex:20]; [encoder dispatchThreadgroups:MTLSizeMake(ne01, ne02, ne03) threadsPerThreadgroup:MTLSizeMake(nth, 1, 1)]; } break; diff --git a/ggml-metal.metal b/ggml-metal.metal index 5e1af6a09..5a860098f 100644 --- a/ggml-metal.metal +++ b/ggml-metal.metal @@ -830,7 +830,9 @@ kernel void kernel_alibi_f32( constant uint64_t & nb1, constant uint64_t & nb2, constant uint64_t & nb3, - constant float & m0, + constant float & m0, + constant float & m1, + constant int & n_heads_log2_floor, uint3 tgpig[[threadgroup_position_in_grid]], uint3 tpitg[[thread_position_in_threadgroup]], uint3 ntg[[threads_per_threadgroup]]) { @@ -846,7 +848,12 @@ kernel void kernel_alibi_f32( const int64_t i0 = (n - i3*ne2*ne1*ne0 - i2*ne1*ne0 - i1*ne0); device float * dst_data = (device float *) ((device char *) dst + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); - float m_k = pow(m0, i2 + 1); + float m_k; + if (i2 < n_heads_log2_floor) { + m_k = pow(m0, i2 + 1); + } else { + m_k = pow(m1, 2 * (i2 - n_heads_log2_floor) + 1); + } for (int64_t i00 = tpitg.x; i00 < ne00; i00 += ntg.x) { device const float * src = (device float *)((device char *) src0 + i03*nb03 + i02*nb02 + i01*nb01 + i00*nb00); dst_data[i00] = src[0] + m_k * (i00 - ne00 + 1); From 48be797ffbd80b062f55778e09e97180eb25d2ab Mon Sep 17 00:00:00 2001 From: Alex Klinkhamer Date: Tue, 3 Oct 2023 10:09:28 -0700 Subject: [PATCH 31/73] llama : expose model's rope_freq_scale in the API (#3418) so it can be scaled further before creating a context. --- llama.cpp | 4 ++++ llama.h | 3 +++ 2 files changed, 7 insertions(+) diff --git a/llama.cpp b/llama.cpp index 4a61eecdd..aa1b4732c 100644 --- a/llama.cpp +++ b/llama.cpp @@ -7038,6 +7038,10 @@ int llama_n_embd(const struct llama_model * model) { return model->hparams.n_embd; } +float llama_rope_freq_scale_train(const struct llama_model * model) { + return model->hparams.rope_freq_scale_train; +} + int llama_model_desc(const struct llama_model * model, char * buf, size_t buf_size) { return snprintf(buf, buf_size, "%s %s %s", llama_model_arch_name(model->arch).c_str(), diff --git a/llama.h b/llama.h index fd2158400..0177d07a9 100644 --- a/llama.h +++ b/llama.h @@ -282,6 +282,9 @@ extern "C" { LLAMA_API int llama_n_ctx_train(const struct llama_model * model); LLAMA_API int llama_n_embd (const struct llama_model * model); + // Get the model's RoPE frequency scaling factor + LLAMA_API float llama_rope_freq_scale_train(const struct llama_model * model); + // Get a string describing the model type LLAMA_API int llama_model_desc(const struct llama_model * model, char * buf, size_t buf_size); From ac2219fef34eb5b713c286c34c6e4162c39c8f3b Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Tue, 3 Oct 2023 21:04:01 +0300 Subject: [PATCH 32/73] llama : fix session saving/loading (#3400) * llama : fix session saving/loading * llama : temp fix for clearing "future" tokens from the KV cache * llama : fix handling of "future" tokens when loading sessions * llama : fix comments for llama_kv_cache API --- examples/chat-persistent.sh | 8 +- examples/main/main.cpp | 3 + examples/parallel/parallel.cpp | 2 +- examples/server/server.cpp | 2 +- examples/speculative/speculative.cpp | 6 +- llama.cpp | 134 +++++++++++++++++---------- llama.h | 10 +- 7 files changed, 106 insertions(+), 59 deletions(-) diff --git a/examples/chat-persistent.sh b/examples/chat-persistent.sh index e0c251e5b..22f5b83d3 100755 --- a/examples/chat-persistent.sh +++ b/examples/chat-persistent.sh @@ -9,7 +9,7 @@ if [[ -z "${PROMPT_CACHE_FILE+x}" || -z "${CHAT_SAVE_DIR+x}" ]]; then exit 1 fi -MODEL="${MODEL:-./models/13B/ggml-model-q4_0.bin}" +MODEL="${MODEL:-./models/llama-13b/ggml-model-q4_0.gguf}" PROMPT_TEMPLATE="${PROMPT_TEMPLATE:-./prompts/chat.txt}" USER_NAME="${USER_NAME:-User}" AI_NAME="${AI_NAME:-ChatLLaMa}" @@ -61,9 +61,9 @@ fi if [[ ! -e "$PROMPT_CACHE_FILE" ]]; then echo 'Prompt cache does not exist, building...' - # Default batch_size to 8 here for better user feedback during initial prompt processing + # Default batch_size to 64 here for better user feedback during initial prompt processing ./main 2>>"$LOG" \ - --batch_size 8 \ + --batch_size 64 \ "${OPTS[@]}" \ --prompt-cache "$PROMPT_CACHE_FILE" \ --file "$CUR_PROMPT_FILE" \ @@ -132,7 +132,7 @@ while read -e line; do # HACK get num tokens from debug message # TODO get both messages in one go if ! session_size_msg="$(tail -n30 "$LOG" | grep -oE "$SESSION_SIZE_MSG_PATTERN")" || - ! sample_time_msg="$( tail -n10 "$LOG" | grep -oE "$SAMPLE_TIME_MSG_PATTERN")"; then + ! sample_time_msg="$(tail -n10 "$LOG" | grep -oE "$SAMPLE_TIME_MSG_PATTERN")"; then echo >&2 "Couldn't get number of tokens from ./main output!" exit 1 fi diff --git a/examples/main/main.cpp b/examples/main/main.cpp index 3a4ed3f78..7367ae362 100644 --- a/examples/main/main.cpp +++ b/examples/main/main.cpp @@ -543,6 +543,9 @@ int main(int argc, char ** argv) { if (i > 0) { embd.erase(embd.begin(), embd.begin() + i); } + + // remove any "future" tokens that we might have inherited from the session from the KV cache + llama_kv_cache_tokens_rm(ctx, n_past, -1); } // evaluate tokens in batches diff --git a/examples/parallel/parallel.cpp b/examples/parallel/parallel.cpp index 0434ded23..ffd7b1db4 100644 --- a/examples/parallel/parallel.cpp +++ b/examples/parallel/parallel.cpp @@ -332,7 +332,7 @@ int main(int argc, char ** argv) { } // delete only the generated part of the sequence, i.e. keep the system prompt in the cache - llama_kv_cache_seq_rm(ctx, client.id, n_tokens_system, n_ctx); + llama_kv_cache_seq_rm(ctx, client.id, n_tokens_system, -1); const auto t_main_end = ggml_time_us(); diff --git a/examples/server/server.cpp b/examples/server/server.cpp index 6dda5e36b..921eb5da4 100644 --- a/examples/server/server.cpp +++ b/examples/server/server.cpp @@ -448,7 +448,7 @@ struct llama_server_context n_past = common_part(embd, prompt_tokens); // since #3228 we now have to manually manage the KV cache - llama_kv_cache_seq_rm(ctx, 0, n_past, params.n_ctx); + llama_kv_cache_seq_rm(ctx, 0, n_past, -1); embd = prompt_tokens; if (n_past == num_prompt_tokens) diff --git a/examples/speculative/speculative.cpp b/examples/speculative/speculative.cpp index c5e5b234f..75a2e5e22 100644 --- a/examples/speculative/speculative.cpp +++ b/examples/speculative/speculative.cpp @@ -172,7 +172,7 @@ int main(int argc, char ** argv) { LOG("out of drafted tokens\n"); } - llama_kv_cache_seq_rm(ctx_dft, 0, n_past_dft, n_ctx); + llama_kv_cache_seq_rm(ctx_dft, 0, n_past_dft, -1); llama_decode(ctx_dft, llama_batch_get_one(&id, 1, n_past_dft, 0)); ++n_past_dft; @@ -257,7 +257,7 @@ int main(int argc, char ** argv) { } // evaluate the drafted token on the draft model - llama_kv_cache_seq_rm(ctx_dft, 0, n_past_cur, n_ctx); + llama_kv_cache_seq_rm(ctx_dft, 0, n_past_cur, -1); llama_decode(ctx_dft, llama_batch_get_one(&drafted.back(), 1, n_past_cur, 0)); ++n_past_cur; @@ -267,7 +267,7 @@ int main(int argc, char ** argv) { } // evaluate the target model on the drafted tokens - llama_kv_cache_seq_rm(ctx_tgt, 0, n_past_tgt, n_ctx); + llama_kv_cache_seq_rm(ctx_tgt, 0, n_past_tgt, -1); llama_decode(ctx_tgt, llama_batch_get_one(drafted.data(), drafted.size(), n_past_tgt, 0)); ++n_past_tgt; diff --git a/llama.cpp b/llama.cpp index aa1b4732c..a40da6839 100644 --- a/llama.cpp +++ b/llama.cpp @@ -1283,8 +1283,8 @@ static bool llama_kv_cache_init( // find an empty slot of size "n_tokens" in the cache // updates the cache head static bool llama_kv_cache_find_slot( - struct llama_kv_cache & cache, - const struct llama_batch & batch) { + struct llama_kv_cache & cache, + const struct llama_batch & batch) { const uint32_t n_ctx = cache.size; const uint32_t n_tokens = batch.n_tokens; @@ -1352,10 +1352,13 @@ static void llama_kv_cache_tokens_rm(struct llama_kv_cache & cache, int32_t c0, } static void llama_kv_cache_seq_rm( - struct llama_kv_cache & cache, - llama_seq_id seq_id, - llama_pos p0, - llama_pos p1) { + struct llama_kv_cache & cache, + llama_seq_id seq_id, + llama_pos p0, + llama_pos p1) { + if (p0 < 0) p0 = 0; + if (p1 < 0) p1 = std::numeric_limits::max(); + for (uint32_t i = 0; i < cache.size; ++i) { if (cache.cells[i].has_seq_id(seq_id) && cache.cells[i].pos >= p0 && cache.cells[i].pos < p1) { cache.cells[i].seq_id.erase(seq_id); @@ -1367,11 +1370,14 @@ static void llama_kv_cache_seq_rm( } static void llama_kv_cache_seq_cp( - struct llama_kv_cache & cache, - llama_seq_id seq_id_src, - llama_seq_id seq_id_dst, - llama_pos p0, - llama_pos p1) { + struct llama_kv_cache & cache, + llama_seq_id seq_id_src, + llama_seq_id seq_id_dst, + llama_pos p0, + llama_pos p1) { + if (p0 < 0) p0 = 0; + if (p1 < 0) p1 = std::numeric_limits::max(); + for (uint32_t i = 0; i < cache.size; ++i) { if (cache.cells[i].has_seq_id(seq_id_src) && cache.cells[i].pos >= p0 && cache.cells[i].pos < p1) { cache.cells[i].seq_id.insert(seq_id_dst); @@ -1389,11 +1395,14 @@ static void llama_kv_cache_seq_keep(struct llama_kv_cache & cache, llama_seq_id } static void llama_kv_cache_seq_shift( - struct llama_kv_cache & cache, - llama_seq_id seq_id, - llama_pos p0, - llama_pos p1, - llama_pos delta) { + struct llama_kv_cache & cache, + llama_seq_id seq_id, + llama_pos p0, + llama_pos p1, + llama_pos delta) { + if (p0 < 0) p0 = 0; + if (p1 < 0) p1 = std::numeric_limits::max(); + for (uint32_t i = 0; i < cache.size; ++i) { if (cache.cells[i].has_seq_id(seq_id) && cache.cells[i].pos >= p0 && cache.cells[i].pos < p1) { cache.cells[i].pos += delta; @@ -7209,16 +7218,6 @@ struct llama_data_file_context : llama_data_context { * */ static void llama_copy_state_data_internal(struct llama_context * ctx, llama_data_context * data_ctx) { - // TODO: does not support multi-sequence states - { - const auto & kv_self = ctx->kv_self; - for (uint32_t i = 0; i < kv_self.head; ++i) { - GGML_ASSERT(kv_self.cells[i].pos == (int32_t) i); - GGML_ASSERT(kv_self.cells[i].seq_id.size() == 1); - GGML_ASSERT(kv_self.cells[i].has_seq_id(0)); - } - } - // copy rng { std::stringstream rng_ss; @@ -7271,36 +7270,38 @@ static void llama_copy_state_data_internal(struct llama_context * ctx, llama_dat const auto & hparams = ctx->model.hparams; const auto & cparams = ctx->cparams; - const int n_layer = hparams.n_layer; - const int n_embd = hparams.n_embd_gqa(); - const int n_ctx = cparams.n_ctx; + const auto n_layer = hparams.n_layer; + const auto n_embd = hparams.n_embd_gqa(); + const auto n_ctx = cparams.n_ctx; - const size_t kv_size = kv_self.buf.size; - const int kv_ntok = kv_self.head; + const size_t kv_buf_size = kv_self.buf.size; + const uint32_t kv_head = kv_self.head; + const uint32_t kv_size = kv_self.size; - data_ctx->write(&kv_size, sizeof(kv_size)); - data_ctx->write(&kv_ntok, sizeof(kv_ntok)); + data_ctx->write(&kv_buf_size, sizeof(kv_buf_size)); + data_ctx->write(&kv_head, sizeof(kv_head)); + data_ctx->write(&kv_size, sizeof(kv_size)); - if (kv_size) { + if (kv_buf_size) { const size_t elt_size = ggml_element_size(kv_self.k); ggml_context * cpy_ctx = ggml_init({ 4096, NULL, /* no_alloc */ true }); ggml_cgraph gf{}; - ggml_tensor * kout3d = ggml_new_tensor_3d(cpy_ctx, kv_self.k->type, n_embd, kv_ntok, n_layer); + ggml_tensor * kout3d = ggml_new_tensor_3d(cpy_ctx, kv_self.k->type, n_embd, kv_head, n_layer); std::vector kout3d_data(ggml_nbytes(kout3d), 0); kout3d->data = kout3d_data.data(); - ggml_tensor * vout3d = ggml_new_tensor_3d(cpy_ctx, kv_self.v->type, kv_ntok, n_embd, n_layer); + ggml_tensor * vout3d = ggml_new_tensor_3d(cpy_ctx, kv_self.v->type, kv_head, n_embd, n_layer); std::vector vout3d_data(ggml_nbytes(vout3d), 0); vout3d->data = vout3d_data.data(); ggml_tensor * k3d = ggml_view_3d(cpy_ctx, kv_self.k, - n_embd, kv_ntok, n_layer, + n_embd, kv_head, n_layer, elt_size*n_embd, elt_size*n_embd*n_ctx, 0); ggml_tensor * v3d = ggml_view_3d(cpy_ctx, kv_self.v, - kv_ntok, n_embd, n_layer, + kv_head, n_embd, n_layer, elt_size*n_ctx, elt_size*n_ctx*n_embd, 0); ggml_build_forward_expand(&gf, ggml_cpy(cpy_ctx, k3d, kout3d)); @@ -7314,6 +7315,20 @@ static void llama_copy_state_data_internal(struct llama_context * ctx, llama_dat data_ctx->write(kout3d_data.data(), kout3d_data.size()); data_ctx->write(vout3d_data.data(), vout3d_data.size()); } + + for (uint32_t i = 0; i < kv_size; ++i) { + const auto & cell = kv_self.cells[i]; + + const llama_pos pos = cell.pos; + const size_t seq_id_size = cell.seq_id.size(); + + data_ctx->write(&pos, sizeof(pos)); + data_ctx->write(&seq_id_size, sizeof(seq_id_size)); + + for (auto seq_id : cell.seq_id) { + data_ctx->write(&seq_id, sizeof(seq_id)); + } + } } } @@ -7385,34 +7400,36 @@ size_t llama_set_state_data(struct llama_context * ctx, uint8_t * src) { const int n_embd = hparams.n_embd_gqa(); const int n_ctx = cparams.n_ctx; - size_t kv_size; - int kv_ntok; + size_t kv_buf_size; + uint32_t kv_head; + uint32_t kv_size; - memcpy(&kv_size, inp, sizeof(kv_size)); inp += sizeof(kv_size); - memcpy(&kv_ntok, inp, sizeof(kv_ntok)); inp += sizeof(kv_ntok); + memcpy(&kv_buf_size, inp, sizeof(kv_buf_size)); inp += sizeof(kv_buf_size); + memcpy(&kv_head, inp, sizeof(kv_head)); inp += sizeof(kv_head); + memcpy(&kv_size, inp, sizeof(kv_size)); inp += sizeof(kv_size); - if (kv_size) { - GGML_ASSERT(kv_self.buf.size == kv_size); + if (kv_buf_size) { + GGML_ASSERT(kv_self.buf.size == kv_buf_size); const size_t elt_size = ggml_element_size(kv_self.k); ggml_context * cpy_ctx = ggml_init({ 4096, NULL, /* no_alloc */ true }); ggml_cgraph gf{}; - ggml_tensor * kin3d = ggml_new_tensor_3d(cpy_ctx, kv_self.k->type, n_embd, kv_ntok, n_layer); + ggml_tensor * kin3d = ggml_new_tensor_3d(cpy_ctx, kv_self.k->type, n_embd, kv_head, n_layer); kin3d->data = (void *) inp; inp += ggml_nbytes(kin3d); - ggml_tensor * vin3d = ggml_new_tensor_3d(cpy_ctx, kv_self.v->type, kv_ntok, n_embd, n_layer); + ggml_tensor * vin3d = ggml_new_tensor_3d(cpy_ctx, kv_self.v->type, kv_head, n_embd, n_layer); vin3d->data = (void *) inp; inp += ggml_nbytes(vin3d); ggml_tensor * k3d = ggml_view_3d(cpy_ctx, kv_self.k, - n_embd, kv_ntok, n_layer, + n_embd, kv_head, n_layer, elt_size*n_embd, elt_size*n_embd*n_ctx, 0); ggml_tensor * v3d = ggml_view_3d(cpy_ctx, kv_self.v, - kv_ntok, n_embd, n_layer, + kv_head, n_embd, n_layer, elt_size*n_ctx, elt_size*n_ctx*n_embd, 0); ggml_build_forward_expand(&gf, ggml_cpy(cpy_ctx, kin3d, k3d)); @@ -7422,8 +7439,27 @@ size_t llama_set_state_data(struct llama_context * ctx, uint8_t * src) { ggml_free(cpy_ctx); } - ctx->kv_self.head = kv_ntok; + ctx->kv_self.head = kv_head; ctx->kv_self.size = kv_size; + + ctx->kv_self.cells.resize(kv_size); + + for (uint32_t i = 0; i < kv_size; ++i) { + llama_pos pos; + size_t seq_id_size; + + memcpy(&pos, inp, sizeof(pos)); inp += sizeof(pos); + memcpy(&seq_id_size, inp, sizeof(seq_id_size)); inp += sizeof(seq_id_size); + + ctx->kv_self.cells[i].pos = pos; + + llama_seq_id seq_id; + + for (size_t j = 0; j < seq_id_size; ++j) { + memcpy(&seq_id, inp, sizeof(seq_id)); inp += sizeof(seq_id); + ctx->kv_self.cells[i].seq_id.insert(seq_id); + } + } } const size_t nread = inp - src; diff --git a/llama.h b/llama.h index 0177d07a9..a78015ada 100644 --- a/llama.h +++ b/llama.h @@ -42,7 +42,7 @@ #define LLAMA_FILE_MAGIC_GGSN 0x6767736eu // 'ggsn' #define LLAMA_SESSION_MAGIC LLAMA_FILE_MAGIC_GGSN -#define LLAMA_SESSION_VERSION 1 +#define LLAMA_SESSION_VERSION 2 #if defined(GGML_USE_CUBLAS) || defined(GGML_USE_CLBLAST) || defined(GGML_USE_METAL) // Defined when llama.cpp is compiled with support for offloading model layers to GPU. @@ -333,12 +333,16 @@ extern "C" { "avoid using this, it will be removed in the future, instead - count the tokens in user code"); // Remove all tokens data of cells in [c0, c1) + // c0 < 0 : [0, c1] + // c1 < 0 : [c0, inf) LLAMA_API void llama_kv_cache_tokens_rm( struct llama_context * ctx, int32_t c0, int32_t c1); // Removes all tokens that belong to the specified sequence and have positions in [p0, p1) + // p0 < 0 : [0, p1] + // p1 < 0 : [p0, inf) LLAMA_API void llama_kv_cache_seq_rm( struct llama_context * ctx, llama_seq_id seq_id, @@ -347,6 +351,8 @@ extern "C" { // Copy all tokens that belong to the specified sequence to another sequence // Note that this does not allocate extra KV cache memory - it simply assigns the tokens to the new sequence + // p0 < 0 : [0, p1] + // p1 < 0 : [p0, inf) LLAMA_API void llama_kv_cache_seq_cp( struct llama_context * ctx, llama_seq_id seq_id_src, @@ -361,6 +367,8 @@ extern "C" { // Adds relative position "delta" to all tokens that belong to the specified sequence and have positions in [p0, p1) // If the KV cache is RoPEd, the KV data is updated accordingly + // p0 < 0 : [0, p1] + // p1 < 0 : [p0, inf) LLAMA_API void llama_kv_cache_seq_shift( struct llama_context * ctx, llama_seq_id seq_id, From 8186242b6d67cf87ae179fb1a62f52fdf0e5c5eb Mon Sep 17 00:00:00 2001 From: h-h-h-h <13482553+h-h-h-h@users.noreply.github.com> Date: Tue, 3 Oct 2023 20:16:15 +0200 Subject: [PATCH 33/73] main : consistent prefix/suffix coloring (#3425) * Typo * No `--in-prefix` coloring The `--in-prefix` text was inconsistently colored. Now, it's never colored, just like the `--in-suffix` text. --- examples/main/main.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/examples/main/main.cpp b/examples/main/main.cpp index 7367ae362..775a5a201 100644 --- a/examples/main/main.cpp +++ b/examples/main/main.cpp @@ -670,7 +670,7 @@ int main(int argc, char ** argv) { } fflush(stdout); } - // reset color to default if we there is no pending user input + // reset color to default if there is no pending user input if (input_echo && (int) embd_inp.size() == n_consumed) { console::set_display(console::reset); } @@ -697,10 +697,8 @@ int main(int argc, char ** argv) { if (last_output.find(antiprompt, search_start_pos) != std::string::npos) { if (params.interactive) { is_interacting = true; - console::set_display(console::user_input); } is_antiprompt = true; - fflush(stdout); break; } } @@ -724,8 +722,6 @@ int main(int argc, char ** argv) { is_interacting = true; printf("\n"); - console::set_display(console::user_input); - fflush(stdout); } else if (params.instruct) { is_interacting = true; } @@ -750,6 +746,9 @@ int main(int argc, char ** argv) { printf("%s", buffer.c_str()); } + // color user input only + console::set_display(console::user_input); + std::string line; bool another_line = true; do { From 79f34abddb72ac5ddbf118f3d87520b611a10a7d Mon Sep 17 00:00:00 2001 From: Tameem <113388789+AhmadTameem@users.noreply.github.com> Date: Tue, 3 Oct 2023 23:38:19 +0500 Subject: [PATCH 34/73] ggml : add RISC-V Vector Support for K-Quants and improved the existing intrinsics (#3453) * Added RVV intrinsics support for Q8 quantize row and also improved the existing dot product function for risc-v. The RVV intrinsics is added for the following quantize row functions quantize_row_q8_0 quantize_row_q8_1 The following dot product functions have also been optimized by using LMUL = 1/2 instead of LMUL = 1 ggml_vec_dot_q4_0_q8_0 ggml_vec_dot_q4_1_q8_1 ggml_vec_dot_q5_0_q8_0 ggml_vec_dot_q5_1_q8_1 And vector initialization in Q5 by temporary array is also replaced by the vid intrinsics Signed-off-by: Ahmad Tameem * Added RVV intrinsics support for k_quants This adds RISC-V Vector intrinsics support for the following K_quants functions for both QKK = 256 and QKK = 64 ggml_vec_dot_q2_K_q8_K ggml_vec_dot_q3_K_q8_K ggml_vec_dot_q4_K_q8_K ggml_vec_dot_q5_K_q8_K ggml_vec_dot_q6_K_q8_K Signed-off-by: Ahmad Tameem --------- Signed-off-by: Ahmad Tameem --- ggml.c | 250 +++++++++++------- k_quants.c | 744 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 897 insertions(+), 97 deletions(-) diff --git a/ggml.c b/ggml.c index bf1426d25..dd1d00bc8 100644 --- a/ggml.c +++ b/ggml.c @@ -1272,6 +1272,33 @@ static void quantize_row_q8_0(const float * restrict x, void * restrict vy, int _mm_storeu_si128((__m128i *)(y[i].qs + 16), ni4); #endif } +#elif defined(__riscv_v_intrinsic) + + size_t vl = __riscv_vsetvl_e32m4(QK8_0); + + for (int i = 0; i < nb; i++) { + // load elements + vfloat32m4_t v_x = __riscv_vle32_v_f32m4(x+i*QK8_0, vl); + + vfloat32m4_t vfabs = __riscv_vfabs_v_f32m4(v_x, vl); + vfloat32m1_t tmp = __riscv_vfmv_v_f_f32m1(0.0f, vl); + vfloat32m1_t vmax = __riscv_vfredmax_vs_f32m4_f32m1(vfabs, tmp, vl); + float amax = __riscv_vfmv_f_s_f32m1_f32(vmax); + + const float d = amax / ((1 << 7) - 1); + const float id = d ? 1.0f/d : 0.0f; + + y[i].d = GGML_FP32_TO_FP16(d); + + vfloat32m4_t x0 = __riscv_vfmul_vf_f32m4(v_x, id, vl); + + // convert to integer + vint16m2_t vi = __riscv_vfncvt_x_f_w_i16m2(x0, vl); + vint8m1_t vs = __riscv_vncvt_x_x_w_i8m1(vi, vl); + + // store result + __riscv_vse8_v_i8m1(y[i].qs , vs, vl); + } #else // scalar quantize_row_q8_0_reference(x, y, k); @@ -1490,6 +1517,41 @@ static void quantize_row_q8_1(const float * restrict x, void * restrict vy, int _mm_storeu_si128((__m128i *)(y[i].qs + 16), ni4); #endif } +#elif defined(__riscv_v_intrinsic) + + size_t vl = __riscv_vsetvl_e32m4(QK8_1); + + for (int i = 0; i < nb; i++) { + // load elements + vfloat32m4_t v_x = __riscv_vle32_v_f32m4(x+i*QK8_1, vl); + + vfloat32m4_t vfabs = __riscv_vfabs_v_f32m4(v_x, vl); + vfloat32m1_t tmp = __riscv_vfmv_v_f_f32m1(0.0, vl); + vfloat32m1_t vmax = __riscv_vfredmax_vs_f32m4_f32m1(vfabs, tmp, vl); + float amax = __riscv_vfmv_f_s_f32m1_f32(vmax); + + const float d = amax / ((1 << 7) - 1); + const float id = d ? 1.0f/d : 0.0f; + + y[i].d = d; + + vfloat32m4_t x0 = __riscv_vfmul_vf_f32m4(v_x, id, vl); + + // convert to integer + vint16m2_t vi = __riscv_vfncvt_x_f_w_i16m2(x0, vl); + vint8m1_t vs = __riscv_vncvt_x_x_w_i8m1(vi, vl); + + // store result + __riscv_vse8_v_i8m1(y[i].qs , vs, vl); + + // compute sum for y[i].s + vint16m1_t tmp2 = __riscv_vmv_v_x_i16m1(0, vl); + vint16m1_t vwrs = __riscv_vwredsum_vs_i8m1_i16m1(vs, tmp2, vl); + + // set y[i].s + int sum = __riscv_vmv_x_s_i16m1_i16(vwrs); + y[i].s = sum*d; + } #else // scalar quantize_row_q8_1_reference(x, y, k); @@ -2662,30 +2724,32 @@ static void ggml_vec_dot_q4_0_q8_0(const int n, float * restrict s, const void * size_t vl = __riscv_vsetvl_e8m1(qk/2); for (int i = 0; i < nb; i++) { - vuint8m1_t tx = __riscv_vle8_v_u8m1(x[i].qs, vl); + // load elements + vuint8mf2_t tx = __riscv_vle8_v_u8mf2(x[i].qs, vl); - vint8m1_t y0 = __riscv_vle8_v_i8m1(y[i].qs, vl); - vint8m1_t y1 = __riscv_vle8_v_i8m1(y[i].qs+16, vl); + vint8mf2_t y0 = __riscv_vle8_v_i8mf2(y[i].qs, vl); + vint8mf2_t y1 = __riscv_vle8_v_i8mf2(y[i].qs+16, vl); - vuint8m1_t x_a = __riscv_vand_vx_u8m1(tx, 0x0F, vl); - vuint8m1_t x_l = __riscv_vsrl_vx_u8m1(tx, 0x04, vl); + // mask and store lower part of x, and then upper part + vuint8mf2_t x_a = __riscv_vand_vx_u8mf2(tx, 0x0F, vl); + vuint8mf2_t x_l = __riscv_vsrl_vx_u8mf2(tx, 0x04, vl); - vint8m1_t x_ai = __riscv_vreinterpret_v_u8m1_i8m1(x_a); - vint8m1_t x_li = __riscv_vreinterpret_v_u8m1_i8m1(x_l); + vint8mf2_t x_ai = __riscv_vreinterpret_v_u8mf2_i8mf2(x_a); + vint8mf2_t x_li = __riscv_vreinterpret_v_u8mf2_i8mf2(x_l); - vint8m1_t v0 = __riscv_vsub_vx_i8m1(x_ai, 8, vl); - vint8m1_t v1 = __riscv_vsub_vx_i8m1(x_li, 8, vl); + // subtract offset + vint8mf2_t v0 = __riscv_vsub_vx_i8mf2(x_ai, 8, vl); + vint8mf2_t v1 = __riscv_vsub_vx_i8mf2(x_li, 8, vl); - vint16m2_t vec_mul1 = __riscv_vwmul_vv_i16m2(v0, y0, vl); - vint16m2_t vec_mul2 = __riscv_vwmul_vv_i16m2(v1, y1, vl); + vint16m1_t vec_mul1 = __riscv_vwmul_vv_i16m1(v0, y0, vl); + vint16m1_t vec_mul2 = __riscv_vwmul_vv_i16m1(v1, y1, vl); vint32m1_t vec_zero = __riscv_vmv_v_x_i32m1(0, vl); - vint32m1_t vs1 = __riscv_vwredsum_vs_i16m2_i32m1(vec_mul1, vec_zero, vl); - vint32m1_t vs2 = __riscv_vwredsum_vs_i16m2_i32m1(vec_mul2, vec_zero, vl); + vint32m1_t vs1 = __riscv_vwredsum_vs_i16m1_i32m1(vec_mul1, vec_zero, vl); + vint32m1_t vs2 = __riscv_vwredsum_vs_i16m1_i32m1(vec_mul2, vs1, vl); - int sumi = __riscv_vmv_x_s_i32m1_i32(vs1); - sumi += __riscv_vmv_x_s_i32m1_i32(vs2); + int sumi = __riscv_vmv_x_s_i32m1_i32(vs2); sumf += sumi*GGML_FP16_TO_FP32(x[i].d)*GGML_FP16_TO_FP32(y[i].d); } @@ -2823,27 +2887,28 @@ static void ggml_vec_dot_q4_1_q8_1(const int n, float * restrict s, const void * size_t vl = __riscv_vsetvl_e8m1(qk/2); for (int i = 0; i < nb; i++) { - vuint8m1_t tx = __riscv_vle8_v_u8m1(x[i].qs, vl); + // load elements + vuint8mf2_t tx = __riscv_vle8_v_u8mf2(x[i].qs, vl); - vint8m1_t y0 = __riscv_vle8_v_i8m1(y[i].qs, vl); - vint8m1_t y1 = __riscv_vle8_v_i8m1(y[i].qs+16, vl); + vint8mf2_t y0 = __riscv_vle8_v_i8mf2(y[i].qs, vl); + vint8mf2_t y1 = __riscv_vle8_v_i8mf2(y[i].qs+16, vl); - vuint8m1_t x_a = __riscv_vand_vx_u8m1(tx, 0x0F, vl); - vuint8m1_t x_l = __riscv_vsrl_vx_u8m1(tx, 0x04, vl); + // mask and store lower part of x, and then upper part + vuint8mf2_t x_a = __riscv_vand_vx_u8mf2(tx, 0x0F, vl); + vuint8mf2_t x_l = __riscv_vsrl_vx_u8mf2(tx, 0x04, vl); - vint8m1_t v0 = __riscv_vreinterpret_v_u8m1_i8m1(x_a); - vint8m1_t v1 = __riscv_vreinterpret_v_u8m1_i8m1(x_l); + vint8mf2_t v0 = __riscv_vreinterpret_v_u8mf2_i8mf2(x_a); + vint8mf2_t v1 = __riscv_vreinterpret_v_u8mf2_i8mf2(x_l); - vint16m2_t vec_mul1 = __riscv_vwmul_vv_i16m2(v0, y0, vl); - vint16m2_t vec_mul2 = __riscv_vwmul_vv_i16m2(v1, y1, vl); + vint16m1_t vec_mul1 = __riscv_vwmul_vv_i16m1(v0, y0, vl); + vint16m1_t vec_mul2 = __riscv_vwmul_vv_i16m1(v1, y1, vl); vint32m1_t vec_zero = __riscv_vmv_v_x_i32m1(0, vl); - vint32m1_t vs1 = __riscv_vwredsum_vs_i16m2_i32m1(vec_mul1, vec_zero, vl); - vint32m1_t vs2 = __riscv_vwredsum_vs_i16m2_i32m1(vec_mul2, vec_zero, vl); + vint32m1_t vs1 = __riscv_vwredsum_vs_i16m1_i32m1(vec_mul1, vec_zero, vl); + vint32m1_t vs2 = __riscv_vwredsum_vs_i16m1_i32m1(vec_mul2, vs1, vl); - int sumi = __riscv_vmv_x_s_i32m1_i32(vs1); - sumi += __riscv_vmv_x_s_i32m1_i32(vs2); + int sumi = __riscv_vmv_x_s_i32m1_i32(vs2); sumf += (GGML_FP16_TO_FP32(x[i].d)*y[i].d)*sumi + GGML_FP16_TO_FP32(x[i].m)*y[i].s; } @@ -3088,66 +3153,61 @@ static void ggml_vec_dot_q5_0_q8_0(const int n, float * restrict s, const void * uint32_t qh; - // These temp values are for masking and shift operations - uint32_t temp_1[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; - uint32_t temp_2[16] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, - 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000}; - size_t vl = __riscv_vsetvl_e8m1(qk/2); + // These tempory registers are for masking and shift operations + vuint32m2_t vt_1 = __riscv_vid_v_u32m2(vl); + vuint32m2_t vt_2 = __riscv_vsll_vv_u32m2(__riscv_vmv_v_x_u32m2(1, vl), vt_1, vl); + + vuint32m2_t vt_3 = __riscv_vsll_vx_u32m2(vt_2, 16, vl); + vuint32m2_t vt_4 = __riscv_vadd_vx_u32m2(vt_1, 12, vl); + for (int i = 0; i < nb; i++) { memcpy(&qh, x[i].qh, sizeof(uint32_t)); - // temporary registers - vuint32m4_t vt_1 = __riscv_vle32_v_u32m4(temp_2, vl); - vuint32m4_t vt_2 = __riscv_vle32_v_u32m4(temp_1, vl); - vuint32m4_t vt_3 = __riscv_vsll_vx_u32m4(vt_1, 16, vl); - vuint32m4_t vt_4 = __riscv_vadd_vx_u32m4(vt_2, 12, vl); - // ((qh & (1u << (j + 0 ))) >> (j + 0 )) << 4; - vuint32m4_t xha_0 = __riscv_vand_vx_u32m4(vt_1, qh, vl); - vuint32m4_t xhr_0 = __riscv_vsrl_vv_u32m4(xha_0, vt_2, vl); - vuint32m4_t xhl_0 = __riscv_vsll_vx_u32m4(xhr_0, 4, vl); + vuint32m2_t xha_0 = __riscv_vand_vx_u32m2(vt_2, qh, vl); + vuint32m2_t xhr_0 = __riscv_vsrl_vv_u32m2(xha_0, vt_1, vl); + vuint32m2_t xhl_0 = __riscv_vsll_vx_u32m2(xhr_0, 4, vl); // ((qh & (1u << (j + 16))) >> (j + 12)); - vuint32m4_t xha_1 = __riscv_vand_vx_u32m4(vt_3, qh, vl); - vuint32m4_t xhl_1 = __riscv_vsrl_vv_u32m4(xha_1, vt_4, vl); + vuint32m2_t xha_1 = __riscv_vand_vx_u32m2(vt_3, qh, vl); + vuint32m2_t xhl_1 = __riscv_vsrl_vv_u32m2(xha_1, vt_4, vl); // narrowing - vuint16m2_t xhc_0 = __riscv_vncvt_x_x_w_u16m2(xhl_0, vl); - vuint8m1_t xh_0 = __riscv_vncvt_x_x_w_u8m1(xhc_0, vl); + vuint16m1_t xhc_0 = __riscv_vncvt_x_x_w_u16m1(xhl_0, vl); + vuint8mf2_t xh_0 = __riscv_vncvt_x_x_w_u8mf2(xhc_0, vl); - vuint16m2_t xhc_1 = __riscv_vncvt_x_x_w_u16m2(xhl_1, vl); - vuint8m1_t xh_1 = __riscv_vncvt_x_x_w_u8m1(xhc_1, vl); + vuint16m1_t xhc_1 = __riscv_vncvt_x_x_w_u16m1(xhl_1, vl); + vuint8mf2_t xh_1 = __riscv_vncvt_x_x_w_u8mf2(xhc_1, vl); // load - vuint8m1_t tx = __riscv_vle8_v_u8m1(x[i].qs, vl); + vuint8mf2_t tx = __riscv_vle8_v_u8mf2(x[i].qs, vl); - vint8m1_t y0 = __riscv_vle8_v_i8m1(y[i].qs, vl); - vint8m1_t y1 = __riscv_vle8_v_i8m1(y[i].qs+16, vl); + vint8mf2_t y0 = __riscv_vle8_v_i8mf2(y[i].qs, vl); + vint8mf2_t y1 = __riscv_vle8_v_i8mf2(y[i].qs+16, vl); - vuint8m1_t x_at = __riscv_vand_vx_u8m1(tx, 0x0F, vl); - vuint8m1_t x_lt = __riscv_vsrl_vx_u8m1(tx, 0x04, vl); + vuint8mf2_t x_at = __riscv_vand_vx_u8mf2(tx, 0x0F, vl); + vuint8mf2_t x_lt = __riscv_vsrl_vx_u8mf2(tx, 0x04, vl); - vuint8m1_t x_a = __riscv_vor_vv_u8m1(x_at, xh_0, vl); - vuint8m1_t x_l = __riscv_vor_vv_u8m1(x_lt, xh_1, vl); + vuint8mf2_t x_a = __riscv_vor_vv_u8mf2(x_at, xh_0, vl); + vuint8mf2_t x_l = __riscv_vor_vv_u8mf2(x_lt, xh_1, vl); - vint8m1_t x_ai = __riscv_vreinterpret_v_u8m1_i8m1(x_a); - vint8m1_t x_li = __riscv_vreinterpret_v_u8m1_i8m1(x_l); + vint8mf2_t x_ai = __riscv_vreinterpret_v_u8mf2_i8mf2(x_a); + vint8mf2_t x_li = __riscv_vreinterpret_v_u8mf2_i8mf2(x_l); - vint8m1_t v0 = __riscv_vsub_vx_i8m1(x_ai, 16, vl); - vint8m1_t v1 = __riscv_vsub_vx_i8m1(x_li, 16, vl); + vint8mf2_t v0 = __riscv_vsub_vx_i8mf2(x_ai, 16, vl); + vint8mf2_t v1 = __riscv_vsub_vx_i8mf2(x_li, 16, vl); - vint16m2_t vec_mul1 = __riscv_vwmul_vv_i16m2(v0, y0, vl); - vint16m2_t vec_mul2 = __riscv_vwmul_vv_i16m2(v1, y1, vl); + vint16m1_t vec_mul1 = __riscv_vwmul_vv_i16m1(v0, y0, vl); + vint16m1_t vec_mul2 = __riscv_vwmul_vv_i16m1(v1, y1, vl); vint32m1_t vec_zero = __riscv_vmv_v_x_i32m1(0, vl); - vint32m1_t vs1 = __riscv_vwredsum_vs_i16m2_i32m1(vec_mul1, vec_zero, vl); - vint32m1_t vs2 = __riscv_vwredsum_vs_i16m2_i32m1(vec_mul2, vec_zero, vl); + vint32m1_t vs1 = __riscv_vwredsum_vs_i16m1_i32m1(vec_mul1, vec_zero, vl); + vint32m1_t vs2 = __riscv_vwredsum_vs_i16m1_i32m1(vec_mul2, vs1, vl); - int sumi = __riscv_vmv_x_s_i32m1_i32(vs1); - sumi += __riscv_vmv_x_s_i32m1_i32(vs2); + int sumi = __riscv_vmv_x_s_i32m1_i32(vs2); sumf += (GGML_FP16_TO_FP32(x[i].d)*GGML_FP16_TO_FP32(y[i].d)) * sumi; } @@ -3414,62 +3474,58 @@ static void ggml_vec_dot_q5_1_q8_1(const int n, float * restrict s, const void * uint32_t qh; - // These temp values are for shift operations - uint32_t temp_1[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; - size_t vl = __riscv_vsetvl_e8m1(qk/2); + // temporary registers for shift operations + vuint32m2_t vt_1 = __riscv_vid_v_u32m2(vl); + vuint32m2_t vt_2 = __riscv_vadd_vx_u32m2(vt_1, 12, vl); + for (int i = 0; i < nb; i++) { memcpy(&qh, x[i].qh, sizeof(uint32_t)); - // temporary registers - vuint32m4_t vt_1 = __riscv_vle32_v_u32m4(temp_1, vl); - vuint32m4_t vt_2 = __riscv_vadd_vx_u32m4(vt_1, 12, vl); - // load qh - vuint32m4_t vqh = __riscv_vmv_v_x_u32m4(qh, vl); + vuint32m2_t vqh = __riscv_vmv_v_x_u32m2(qh, vl); // ((qh >> (j + 0)) << 4) & 0x10; - vuint32m4_t xhr_0 = __riscv_vsrl_vv_u32m4(vqh, vt_1, vl); - vuint32m4_t xhl_0 = __riscv_vsll_vx_u32m4(xhr_0, 4, vl); - vuint32m4_t xha_0 = __riscv_vand_vx_u32m4(xhl_0, 0x10, vl); + vuint32m2_t xhr_0 = __riscv_vsrl_vv_u32m2(vqh, vt_1, vl); + vuint32m2_t xhl_0 = __riscv_vsll_vx_u32m2(xhr_0, 4, vl); + vuint32m2_t xha_0 = __riscv_vand_vx_u32m2(xhl_0, 0x10, vl); // ((qh >> (j + 12)) ) & 0x10; - vuint32m4_t xhr_1 = __riscv_vsrl_vv_u32m4(vqh, vt_2, vl); - vuint32m4_t xha_1 = __riscv_vand_vx_u32m4(xhr_1, 0x10, vl); + vuint32m2_t xhr_1 = __riscv_vsrl_vv_u32m2(vqh, vt_2, vl); + vuint32m2_t xha_1 = __riscv_vand_vx_u32m2(xhr_1, 0x10, vl); // narrowing - vuint16m2_t xhc_0 = __riscv_vncvt_x_x_w_u16m2(xha_0, vl); - vuint8m1_t xh_0 = __riscv_vncvt_x_x_w_u8m1(xhc_0, vl); + vuint16m1_t xhc_0 = __riscv_vncvt_x_x_w_u16m1(xha_0, vl); + vuint8mf2_t xh_0 = __riscv_vncvt_x_x_w_u8mf2(xhc_0, vl); - vuint16m2_t xhc_1 = __riscv_vncvt_x_x_w_u16m2(xha_1, vl); - vuint8m1_t xh_1 = __riscv_vncvt_x_x_w_u8m1(xhc_1, vl); + vuint16m1_t xhc_1 = __riscv_vncvt_x_x_w_u16m1(xha_1, vl); + vuint8mf2_t xh_1 = __riscv_vncvt_x_x_w_u8mf2(xhc_1, vl); // load - vuint8m1_t tx = __riscv_vle8_v_u8m1(x[i].qs, vl); + vuint8mf2_t tx = __riscv_vle8_v_u8mf2(x[i].qs, vl); - vint8m1_t y0 = __riscv_vle8_v_i8m1(y[i].qs, vl); - vint8m1_t y1 = __riscv_vle8_v_i8m1(y[i].qs+16, vl); + vint8mf2_t y0 = __riscv_vle8_v_i8mf2(y[i].qs, vl); + vint8mf2_t y1 = __riscv_vle8_v_i8mf2(y[i].qs+16, vl); - vuint8m1_t x_at = __riscv_vand_vx_u8m1(tx, 0x0F, vl); - vuint8m1_t x_lt = __riscv_vsrl_vx_u8m1(tx, 0x04, vl); + vuint8mf2_t x_at = __riscv_vand_vx_u8mf2(tx, 0x0F, vl); + vuint8mf2_t x_lt = __riscv_vsrl_vx_u8mf2(tx, 0x04, vl); - vuint8m1_t x_a = __riscv_vor_vv_u8m1(x_at, xh_0, vl); - vuint8m1_t x_l = __riscv_vor_vv_u8m1(x_lt, xh_1, vl); + vuint8mf2_t x_a = __riscv_vor_vv_u8mf2(x_at, xh_0, vl); + vuint8mf2_t x_l = __riscv_vor_vv_u8mf2(x_lt, xh_1, vl); - vint8m1_t v0 = __riscv_vreinterpret_v_u8m1_i8m1(x_a); - vint8m1_t v1 = __riscv_vreinterpret_v_u8m1_i8m1(x_l); + vint8mf2_t v0 = __riscv_vreinterpret_v_u8mf2_i8mf2(x_a); + vint8mf2_t v1 = __riscv_vreinterpret_v_u8mf2_i8mf2(x_l); - vint16m2_t vec_mul1 = __riscv_vwmul_vv_i16m2(v0, y0, vl); - vint16m2_t vec_mul2 = __riscv_vwmul_vv_i16m2(v1, y1, vl); + vint16m1_t vec_mul1 = __riscv_vwmul_vv_i16m1(v0, y0, vl); + vint16m1_t vec_mul2 = __riscv_vwmul_vv_i16m1(v1, y1, vl); vint32m1_t vec_zero = __riscv_vmv_v_x_i32m1(0, vl); - vint32m1_t vs1 = __riscv_vwredsum_vs_i16m2_i32m1(vec_mul1, vec_zero, vl); - vint32m1_t vs2 = __riscv_vwredsum_vs_i16m2_i32m1(vec_mul2, vec_zero, vl); + vint32m1_t vs1 = __riscv_vwredsum_vs_i16m1_i32m1(vec_mul1, vec_zero, vl); + vint32m1_t vs2 = __riscv_vwredsum_vs_i16m1_i32m1(vec_mul2, vs1, vl); - int sumi = __riscv_vmv_x_s_i32m1_i32(vs1); - sumi += __riscv_vmv_x_s_i32m1_i32(vs2); + int sumi = __riscv_vmv_x_s_i32m1_i32(vs2); sumf += (GGML_FP16_TO_FP32(x[i].d)*y[i].d)*sumi + GGML_FP16_TO_FP32(x[i].m)*y[i].s; } diff --git a/k_quants.c b/k_quants.c index 62085882d..a1e687dd9 100644 --- a/k_quants.c +++ b/k_quants.c @@ -54,6 +54,10 @@ inline static int32_t vaddvq_s32(int32x4_t v) { #endif #endif +#ifdef __riscv_v_intrinsic +#include +#endif + #undef MIN #undef MAX #define MIN(a, b) ((a) < (b) ? (a) : (b)) @@ -1582,6 +1586,90 @@ void ggml_vec_dot_q2_K_q8_K(const int n, float * restrict s, const void * restri *s = hsum_float_8(acc); +#elif defined __riscv_v_intrinsic + + float sumf = 0; + uint8_t temp_01[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + + for (int i = 0; i < nb; ++i) { + + const uint8_t * q2 = x[i].qs; + const int8_t * q8 = y[i].qs; + const uint8_t * sc = x[i].scales; + + const float dall = y[i].d * ggml_fp16_to_fp32(x[i].d); + const float dmin = -y[i].d * ggml_fp16_to_fp32(x[i].dmin); + + size_t vl = 16; + + vuint8m1_t scales = __riscv_vle8_v_u8m1(sc, vl); + vuint8m1_t aux = __riscv_vand_vx_u8m1(scales, 0x0F, vl); + + vint16m1_t q8sums = __riscv_vle16_v_i16m1(y[i].bsums, vl); + + vuint8mf2_t scales_2 = __riscv_vle8_v_u8mf2(sc, vl); + vuint8mf2_t mins8 = __riscv_vsrl_vx_u8mf2(scales_2, 0x4, vl); + vint16m1_t mins = __riscv_vreinterpret_v_u16m1_i16m1(__riscv_vzext_vf2_u16m1(mins8, vl)); + vint32m2_t prod = __riscv_vwmul_vv_i32m2(q8sums, mins, vl); + vint32m1_t vsums = __riscv_vredsum_vs_i32m2_i32m1(prod, __riscv_vmv_v_x_i32m1(0, 1), vl); + + sumf += dmin * __riscv_vmv_x_s_i32m1_i32(vsums); + + vl = 32; + + vint32m1_t vzero = __riscv_vmv_v_x_i32m1(0, 1); + vuint8m1_t v_b = __riscv_vle8_v_u8m1(temp_01, vl); + + uint8_t is=0; + int isum=0; + + for (int j = 0; j < QK_K/128; ++j) { + // load Q2 + vuint8m1_t q2_x = __riscv_vle8_v_u8m1(q2, vl); + + vuint8m1_t q2_0 = __riscv_vand_vx_u8m1(q2_x, 0x03, vl); + vuint8m1_t q2_1 = __riscv_vand_vx_u8m1(__riscv_vsrl_vx_u8m1(q2_x, 0x2, vl), 0x03 , vl); + vuint8m1_t q2_2 = __riscv_vand_vx_u8m1(__riscv_vsrl_vx_u8m1(q2_x, 0x4, vl), 0x03 , vl); + vuint8m1_t q2_3 = __riscv_vand_vx_u8m1(__riscv_vsrl_vx_u8m1(q2_x, 0x6, vl), 0x03 , vl); + + // duplicate scale elements for product + vuint8m1_t sc0 = __riscv_vrgather_vv_u8m1(aux, __riscv_vadd_vx_u8m1(v_b, 0+is, vl), vl); + vuint8m1_t sc1 = __riscv_vrgather_vv_u8m1(aux, __riscv_vadd_vx_u8m1(v_b, 2+is, vl), vl); + vuint8m1_t sc2 = __riscv_vrgather_vv_u8m1(aux, __riscv_vadd_vx_u8m1(v_b, 4+is, vl), vl); + vuint8m1_t sc3 = __riscv_vrgather_vv_u8m1(aux, __riscv_vadd_vx_u8m1(v_b, 6+is, vl), vl); + + vint16m2_t p0 = __riscv_vreinterpret_v_u16m2_i16m2(__riscv_vwmulu_vv_u16m2(q2_0, sc0, vl)); + vint16m2_t p1 = __riscv_vreinterpret_v_u16m2_i16m2(__riscv_vwmulu_vv_u16m2(q2_1, sc1, vl)); + vint16m2_t p2 = __riscv_vreinterpret_v_u16m2_i16m2(__riscv_vwmulu_vv_u16m2(q2_2, sc2, vl)); + vint16m2_t p3 = __riscv_vreinterpret_v_u16m2_i16m2(__riscv_vwmulu_vv_u16m2(q2_3, sc3, vl)); + + // load Q8 + vint8m1_t q8_0 = __riscv_vle8_v_i8m1(q8, vl); + vint8m1_t q8_1 = __riscv_vle8_v_i8m1(q8+32, vl); + vint8m1_t q8_2 = __riscv_vle8_v_i8m1(q8+64, vl); + vint8m1_t q8_3 = __riscv_vle8_v_i8m1(q8+96, vl); + + vint32m4_t s0 = __riscv_vwmul_vv_i32m4(p0, __riscv_vwcvt_x_x_v_i16m2(q8_0, vl), vl); + vint32m4_t s1 = __riscv_vwmul_vv_i32m4(p1, __riscv_vwcvt_x_x_v_i16m2(q8_1, vl), vl); + vint32m4_t s2 = __riscv_vwmul_vv_i32m4(p2, __riscv_vwcvt_x_x_v_i16m2(q8_2, vl), vl); + vint32m4_t s3 = __riscv_vwmul_vv_i32m4(p3, __riscv_vwcvt_x_x_v_i16m2(q8_3, vl), vl); + + vint32m1_t isum0 = __riscv_vredsum_vs_i32m4_i32m1(__riscv_vadd_vv_i32m4(s0, s1, vl), vzero, vl); + vint32m1_t isum1 = __riscv_vredsum_vs_i32m4_i32m1(__riscv_vadd_vv_i32m4(s2, s3, vl), isum0, vl); + + isum += __riscv_vmv_x_s_i32m1_i32(isum1); + + q2+=32; q8+=128; is=8; + + } + + sumf += dall * isum; + + } + + *s = sumf; + #else float sumf = 0; @@ -1807,6 +1895,64 @@ void ggml_vec_dot_q2_K_q8_K(const int n, float * restrict s, const void * restri *s = hsum_float_8(acc) + summs; +#elif defined __riscv_v_intrinsic + + uint32_t aux32[2]; + const uint8_t * scales = (const uint8_t *)aux32; + + float sumf = 0; + + for (int i = 0; i < nb; ++i) { + + const float d = y[i].d * (float)x[i].d; + const float dmin = -y[i].d * (float)x[i].dmin; + + const uint8_t * restrict q2 = x[i].qs; + const int8_t * restrict q8 = y[i].qs; + const uint32_t * restrict sc = (const uint32_t *)x[i].scales; + + aux32[0] = sc[0] & 0x0f0f0f0f; + aux32[1] = (sc[0] >> 4) & 0x0f0f0f0f; + + sumf += dmin * (scales[4] * y[i].bsums[0] + scales[5] * y[i].bsums[1] + scales[6] * y[i].bsums[2] + scales[7] * y[i].bsums[3]); + + int isum1 = 0; + int isum2 = 0; + + size_t vl = 16; + + vint16m1_t vzero = __riscv_vmv_v_x_i16m1(0, 1); + + // load Q2 + vuint8mf2_t q2_x = __riscv_vle8_v_u8mf2(q2, vl); + + vint8mf2_t q2_0 = __riscv_vreinterpret_v_u8mf2_i8mf2(__riscv_vand_vx_u8mf2(q2_x, 0x03, vl)); + vint8mf2_t q2_1 = __riscv_vreinterpret_v_u8mf2_i8mf2(__riscv_vand_vx_u8mf2(__riscv_vsrl_vx_u8mf2(q2_x, 0x2, vl), 0x03 , vl)); + vint8mf2_t q2_2 = __riscv_vreinterpret_v_u8mf2_i8mf2(__riscv_vand_vx_u8mf2(__riscv_vsrl_vx_u8mf2(q2_x, 0x4, vl), 0x03 , vl)); + vint8mf2_t q2_3 = __riscv_vreinterpret_v_u8mf2_i8mf2(__riscv_vand_vx_u8mf2(__riscv_vsrl_vx_u8mf2(q2_x, 0x6, vl), 0x03 , vl)); + + // load Q8, and take product with Q2 + vint16m1_t p0 = __riscv_vwmul_vv_i16m1(q2_0, __riscv_vle8_v_i8mf2(q8, vl), vl); + vint16m1_t p1 = __riscv_vwmul_vv_i16m1(q2_1, __riscv_vle8_v_i8mf2(q8+16, vl), vl); + vint16m1_t p2 = __riscv_vwmul_vv_i16m1(q2_2, __riscv_vle8_v_i8mf2(q8+32, vl), vl); + vint16m1_t p3 = __riscv_vwmul_vv_i16m1(q2_3, __riscv_vle8_v_i8mf2(q8+48, vl), vl); + + vint16m1_t vs_0 = __riscv_vredsum_vs_i16m1_i16m1(p0, vzero, vl); + vint16m1_t vs_1 = __riscv_vredsum_vs_i16m1_i16m1(p1, vzero, vl); + vint16m1_t vs_2 = __riscv_vredsum_vs_i16m1_i16m1(p2, vzero, vl); + vint16m1_t vs_3 = __riscv_vredsum_vs_i16m1_i16m1(p3, vzero, vl); + + isum1 += __riscv_vmv_x_s_i16m1_i16(vs_0) * scales[0]; + isum2 += __riscv_vmv_x_s_i16m1_i16(vs_1) * scales[1]; + isum1 += __riscv_vmv_x_s_i16m1_i16(vs_2) * scales[2]; + isum2 += __riscv_vmv_x_s_i16m1_i16(vs_3) * scales[3]; + + sumf += d * (isum1 + isum2); + + } + + *s = sumf; + #else float sumf = 0; @@ -2220,6 +2366,106 @@ void ggml_vec_dot_q3_K_q8_K(const int n, float * restrict s, const void * restri *s = hsum_float_8(acc); +#elif defined __riscv_v_intrinsic + + uint32_t aux[3]; + uint32_t utmp[4]; + + float sumf = 0; + for (int i = 0; i < nb; ++i) { + + const uint8_t * restrict q3 = x[i].qs; + const uint8_t * restrict qh = x[i].hmask; + const int8_t * restrict q8 = y[i].qs; + + memcpy(aux, x[i].scales, 12); + utmp[3] = ((aux[1] >> 4) & kmask2) | (((aux[2] >> 6) & kmask1) << 4); + utmp[2] = ((aux[0] >> 4) & kmask2) | (((aux[2] >> 4) & kmask1) << 4); + utmp[1] = (aux[1] & kmask2) | (((aux[2] >> 2) & kmask1) << 4); + utmp[0] = (aux[0] & kmask2) | (((aux[2] >> 0) & kmask1) << 4); + + int8_t * scale = (int8_t *)utmp; + for (int j = 0; j < 16; ++j) scale[j] -= 32; + + + size_t vl = 32; + uint8_t m = 1; + + vint32m1_t vzero = __riscv_vmv_v_x_i32m1(0, 1); + vuint8m1_t vqh = __riscv_vle8_v_u8m1(qh, vl); + + int sum_t = 0; + + for (int j = 0; j < QK_K; j += 128) { + + vl = 32; + + // load Q3 + vuint8m1_t q3_x = __riscv_vle8_v_u8m1(q3, vl); + + vint8m1_t q3_0 = __riscv_vreinterpret_v_u8m1_i8m1(__riscv_vand_vx_u8m1(q3_x, 0x03, vl)); + vint8m1_t q3_1 = __riscv_vreinterpret_v_u8m1_i8m1(__riscv_vand_vx_u8m1(__riscv_vsrl_vx_u8m1(q3_x, 0x2, vl), 0x03 , vl)); + vint8m1_t q3_2 = __riscv_vreinterpret_v_u8m1_i8m1(__riscv_vand_vx_u8m1(__riscv_vsrl_vx_u8m1(q3_x, 0x4, vl), 0x03 , vl)); + vint8m1_t q3_3 = __riscv_vreinterpret_v_u8m1_i8m1(__riscv_vand_vx_u8m1(__riscv_vsrl_vx_u8m1(q3_x, 0x6, vl), 0x03 , vl)); + + // compute mask for subtraction + vuint8m1_t qh_m0 = __riscv_vand_vx_u8m1(vqh, m, vl); + vbool8_t vmask_0 = __riscv_vmseq_vx_u8m1_b8(qh_m0, 0, vl); + vint8m1_t q3_m0 = __riscv_vsub_vx_i8m1_m(vmask_0, q3_0, 0x4, vl); + m <<= 1; + + vuint8m1_t qh_m1 = __riscv_vand_vx_u8m1(vqh, m, vl); + vbool8_t vmask_1 = __riscv_vmseq_vx_u8m1_b8(qh_m1, 0, vl); + vint8m1_t q3_m1 = __riscv_vsub_vx_i8m1_m(vmask_1, q3_1, 0x4, vl); + m <<= 1; + + vuint8m1_t qh_m2 = __riscv_vand_vx_u8m1(vqh, m, vl); + vbool8_t vmask_2 = __riscv_vmseq_vx_u8m1_b8(qh_m2, 0, vl); + vint8m1_t q3_m2 = __riscv_vsub_vx_i8m1_m(vmask_2, q3_2, 0x4, vl); + m <<= 1; + + vuint8m1_t qh_m3 = __riscv_vand_vx_u8m1(vqh, m, vl); + vbool8_t vmask_3 = __riscv_vmseq_vx_u8m1_b8(qh_m3, 0, vl); + vint8m1_t q3_m3 = __riscv_vsub_vx_i8m1_m(vmask_3, q3_3, 0x4, vl); + m <<= 1; + + // load Q8 and take product with Q3 + vint16m2_t a0 = __riscv_vwmul_vv_i16m2(q3_m0, __riscv_vle8_v_i8m1(q8, vl), vl); + vint16m2_t a1 = __riscv_vwmul_vv_i16m2(q3_m1, __riscv_vle8_v_i8m1(q8+32, vl), vl); + vint16m2_t a2 = __riscv_vwmul_vv_i16m2(q3_m2, __riscv_vle8_v_i8m1(q8+64, vl), vl); + vint16m2_t a3 = __riscv_vwmul_vv_i16m2(q3_m3, __riscv_vle8_v_i8m1(q8+96, vl), vl); + + vl = 16; + + // retreive lane to multiply with scale + vint32m2_t aux0_0 = __riscv_vwmul_vx_i32m2(__riscv_vget_v_i16m2_i16m1(a0, 0), (scale[0]), vl); + vint32m2_t aux0_1 = __riscv_vwmul_vx_i32m2(__riscv_vget_v_i16m2_i16m1(a0, 1), (scale[1]), vl); + vint32m2_t aux1_0 = __riscv_vwmul_vx_i32m2(__riscv_vget_v_i16m2_i16m1(a1, 0), (scale[2]), vl); + vint32m2_t aux1_1 = __riscv_vwmul_vx_i32m2(__riscv_vget_v_i16m2_i16m1(a1, 1), (scale[3]), vl); + vint32m2_t aux2_0 = __riscv_vwmul_vx_i32m2(__riscv_vget_v_i16m2_i16m1(a2, 0), (scale[4]), vl); + vint32m2_t aux2_1 = __riscv_vwmul_vx_i32m2(__riscv_vget_v_i16m2_i16m1(a2, 1), (scale[5]), vl); + vint32m2_t aux3_0 = __riscv_vwmul_vx_i32m2(__riscv_vget_v_i16m2_i16m1(a3, 0), (scale[6]), vl); + vint32m2_t aux3_1 = __riscv_vwmul_vx_i32m2(__riscv_vget_v_i16m2_i16m1(a3, 1), (scale[7]), vl); + + vint32m1_t isum0 = __riscv_vredsum_vs_i32m2_i32m1(__riscv_vadd_vv_i32m2(aux0_0, aux0_1, vl), vzero, vl); + vint32m1_t isum1 = __riscv_vredsum_vs_i32m2_i32m1(__riscv_vadd_vv_i32m2(aux1_0, aux1_1, vl), isum0, vl); + vint32m1_t isum2 = __riscv_vredsum_vs_i32m2_i32m1(__riscv_vadd_vv_i32m2(aux2_0, aux2_1, vl), isum1, vl); + vint32m1_t isum3 = __riscv_vredsum_vs_i32m2_i32m1(__riscv_vadd_vv_i32m2(aux3_0, aux3_1, vl), isum2, vl); + + sum_t += __riscv_vmv_x_s_i32m1_i32(isum3); + + q3 += 32; q8 += 128; scale += 8; + + } + + const float d = ggml_fp16_to_fp32(x[i].d) * y[i].d; + + sumf += d*sum_t; + + } + + *s = sumf; + #else // scalar version // This function is written like this so the compiler can manage to vectorize most of it @@ -2523,6 +2769,79 @@ void ggml_vec_dot_q3_K_q8_K(const int n, float * restrict s, const void * restri *s = hsum_float_8(acc); +#elif defined __riscv_v_intrinsic + + uint16_t aux16[2]; + int8_t * scales = (int8_t *)aux16; + + float sumf = 0; + + for (int i = 0; i < nb; ++i) { + + const uint8_t * restrict q3 = x[i].qs; + const int8_t * restrict q8 = y[i].qs; + + const uint16_t a = *(const uint16_t *)x[i].scales; + aux16[0] = a & 0x0f0f; + aux16[1] = (a >> 4) & 0x0f0f; + + for (int j = 0; j < 4; ++j) scales[j] -= 8; + + int32_t isum = -4*(scales[0] * y[i].bsums[0] + scales[2] * y[i].bsums[1] + scales[1] * y[i].bsums[2] + scales[3] * y[i].bsums[3]); + + const float d = y[i].d * (float)x[i].d; + + vint32m1_t vzero = __riscv_vmv_v_x_i32m1(0, 1); + + // load qh + vuint8mf4_t qh_x1 = __riscv_vle8_v_u8mf4(x[i].hmask, 8); + vuint8mf2_t qh_x2 = __riscv_vlmul_ext_v_u8mf4_u8mf2(__riscv_vsrl_vx_u8mf4(qh_x1, 1, 8)); + + size_t vl = 16; + + // extend and combine both qh_x1 and qh_x2 + vuint8mf2_t qh_x = __riscv_vslideup_vx_u8mf2(__riscv_vlmul_ext_v_u8mf4_u8mf2(qh_x1), qh_x2, vl/2, vl); + + vuint8mf2_t qh_0 = __riscv_vand_vx_u8mf2(__riscv_vsll_vx_u8mf2(qh_x, 0x2, vl), 0x4, vl); + vuint8mf2_t qh_1 = __riscv_vand_vx_u8mf2(qh_x, 0x4, vl); + vuint8mf2_t qh_2 = __riscv_vand_vx_u8mf2(__riscv_vsrl_vx_u8mf2(qh_x, 0x2, vl), 0x4, vl); + vuint8mf2_t qh_3 = __riscv_vand_vx_u8mf2(__riscv_vsrl_vx_u8mf2(qh_x, 0x4, vl), 0x4, vl); + + // load Q3 + vuint8mf2_t q3_x = __riscv_vle8_v_u8mf2(q3, vl); + + vuint8mf2_t q3h_0 = __riscv_vor_vv_u8mf2(__riscv_vand_vx_u8mf2(q3_x, 0x3, vl), qh_0, vl); + vuint8mf2_t q3h_1 = __riscv_vor_vv_u8mf2(__riscv_vand_vx_u8mf2(__riscv_vsrl_vx_u8mf2(q3_x, 2, vl), 0x3, vl), qh_1, vl); + vuint8mf2_t q3h_2 = __riscv_vor_vv_u8mf2(__riscv_vand_vx_u8mf2(__riscv_vsrl_vx_u8mf2(q3_x, 4, vl), 0x3, vl), qh_2, vl); + vuint8mf2_t q3h_3 = __riscv_vor_vv_u8mf2(__riscv_vsrl_vx_u8mf2(q3_x, 0x6, vl), qh_3, vl); + + vint8mf2_t q3_0 = __riscv_vreinterpret_v_u8mf2_i8mf2(q3h_0); + vint8mf2_t q3_1 = __riscv_vreinterpret_v_u8mf2_i8mf2(q3h_1); + vint8mf2_t q3_2 = __riscv_vreinterpret_v_u8mf2_i8mf2(q3h_2); + vint8mf2_t q3_3 = __riscv_vreinterpret_v_u8mf2_i8mf2(q3h_3); + + // load Q8 and take product with Q3 + vint16m1_t p0 = __riscv_vwmul_vv_i16m1(q3_0, __riscv_vle8_v_i8mf2(q8, vl), vl); + vint16m1_t p1 = __riscv_vwmul_vv_i16m1(q3_1, __riscv_vle8_v_i8mf2(q8+16, vl), vl); + vint16m1_t p2 = __riscv_vwmul_vv_i16m1(q3_2, __riscv_vle8_v_i8mf2(q8+32, vl), vl); + vint16m1_t p3 = __riscv_vwmul_vv_i16m1(q3_3, __riscv_vle8_v_i8mf2(q8+48, vl), vl); + + vint32m1_t vs_0 = __riscv_vwredsum_vs_i16m1_i32m1(p0, vzero, vl); + vint32m1_t vs_1 = __riscv_vwredsum_vs_i16m1_i32m1(p1, vzero, vl); + vint32m1_t vs_2 = __riscv_vwredsum_vs_i16m1_i32m1(p2, vzero, vl); + vint32m1_t vs_3 = __riscv_vwredsum_vs_i16m1_i32m1(p3, vzero, vl); + + isum += __riscv_vmv_x_s_i32m1_i32(vs_0) * scales[0]; + isum += __riscv_vmv_x_s_i32m1_i32(vs_1) * scales[2]; + isum += __riscv_vmv_x_s_i32m1_i32(vs_2) * scales[1]; + isum += __riscv_vmv_x_s_i32m1_i32(vs_3) * scales[3]; + + sumf += d * isum; + + } + + *s = sumf; + #else int8_t aux8[QK_K]; @@ -2823,6 +3142,78 @@ void ggml_vec_dot_q4_K_q8_K(const int n, float * restrict s, const void * restri *s = hsum_float_8(acc) + _mm_cvtss_f32(acc_m); +#elif defined __riscv_v_intrinsic + + const uint8_t * scales = (const uint8_t*)&utmp[0]; + const uint8_t * mins = (const uint8_t*)&utmp[2]; + + float sumf = 0; + + for (int i = 0; i < nb; ++i) { + + size_t vl = 8; + + const float d = y[i].d * ggml_fp16_to_fp32(x[i].d); + const float dmin = y[i].d * ggml_fp16_to_fp32(x[i].dmin); + + vint16mf2_t q8sums_0 = __riscv_vlse16_v_i16mf2(y[i].bsums, 4, vl); + vint16mf2_t q8sums_1 = __riscv_vlse16_v_i16mf2(y[i].bsums+1, 4, vl); + vint16mf2_t q8sums = __riscv_vadd_vv_i16mf2(q8sums_0, q8sums_1, vl); + + memcpy(utmp, x[i].scales, 12); + utmp[3] = ((utmp[2] >> 4) & kmask2) | (((utmp[1] >> 6) & kmask3) << 4); + const uint32_t uaux = utmp[1] & kmask1; + utmp[1] = (utmp[2] & kmask2) | (((utmp[0] >> 6) & kmask3) << 4); + utmp[2] = uaux; + utmp[0] &= kmask1; + + vuint8mf4_t mins8 = __riscv_vle8_v_u8mf4(mins, vl); + vint16mf2_t v_mins = __riscv_vreinterpret_v_u16mf2_i16mf2(__riscv_vzext_vf2_u16mf2(mins8, vl)); + vint32m1_t prod = __riscv_vwmul_vv_i32m1(q8sums, v_mins, vl); + + vint32m1_t sumi = __riscv_vredsum_vs_i32m1_i32m1(prod, __riscv_vmv_v_x_i32m1(0, 1), vl); + sumf -= dmin * __riscv_vmv_x_s_i32m1_i32(sumi); + + const uint8_t * restrict q4 = x[i].qs; + const int8_t * restrict q8 = y[i].qs; + + vl = 32; + + int32_t sum_1 = 0; + int32_t sum_2 = 0; + + vint16m1_t vzero = __riscv_vmv_v_x_i16m1(0, 1); + + for (int j = 0; j < QK_K/64; ++j) { + // load Q4 + vuint8m1_t q4_x = __riscv_vle8_v_u8m1(q4, vl); + + // load Q8 and multiply it with lower Q4 nibble + vint8m1_t q8_0 = __riscv_vle8_v_i8m1(q8, vl); + vint8m1_t q4_0 = __riscv_vreinterpret_v_u8m1_i8m1(__riscv_vand_vx_u8m1(q4_x, 0x0F, vl)); + vint16m2_t qv_0 = __riscv_vwmul_vv_i16m2(q4_0, q8_0, vl); + vint16m1_t vs_0 = __riscv_vredsum_vs_i16m2_i16m1(qv_0, vzero, vl); + + sum_1 += __riscv_vmv_x_s_i16m1_i16(vs_0) * scales[2*j+0]; + + // load Q8 and multiply it with upper Q4 nibble + vint8m1_t q8_1 = __riscv_vle8_v_i8m1(q8+32, vl); + vint8m1_t q4_1 = __riscv_vreinterpret_v_u8m1_i8m1(__riscv_vsrl_vx_u8m1(q4_x, 0x04, vl)); + vint16m2_t qv_1 = __riscv_vwmul_vv_i16m2(q4_1, q8_1, vl); + vint16m1_t vs_1 = __riscv_vredsum_vs_i16m2_i16m1(qv_1, vzero, vl); + + sum_2 += __riscv_vmv_x_s_i16m1_i16(vs_1) * scales[2*j+1]; + + q4 += 32; q8 += 64; + + } + + sumf += d*(sum_1 + sum_2); + + } + + *s = sumf; + #else @@ -3064,6 +3455,50 @@ void ggml_vec_dot_q4_K_q8_K(const int n, float * restrict s, const void * restri *s = hsum_float_8(acc) - summs; +#elif defined __riscv_v_intrinsic + + uint16_t s16[2]; + const uint8_t * restrict scales = (const uint8_t *)s16; + + float sumf = 0; + + for (int i = 0; i < nb; ++i) { + + const uint8_t * restrict q4 = x[i].qs; + const int8_t * restrict q8 = y[i].qs; + + const uint16_t * restrict b = (const uint16_t *)x[i].scales; + s16[0] = b[0] & 0x0f0f; + s16[1] = (b[0] >> 4) & 0x0f0f; + + sumf -= y[i].d * ggml_fp16_to_fp32(x[i].d[1]) * (scales[2] * (y[i].bsums[0] + y[i].bsums[1]) + scales[3] * (y[i].bsums[2] + y[i].bsums[3])); + const float d = y[i].d * ggml_fp16_to_fp32(x[i].d[0]); + + size_t vl = 32; + + vint16m1_t vzero = __riscv_vmv_v_x_i16m1(0, 1); + + // load Q4 + vuint8m1_t q4_x = __riscv_vle8_v_u8m1(q4, vl); + + // load Q8 and multiply it with lower Q4 nibble + vint8m1_t q4_a = __riscv_vreinterpret_v_u8m1_i8m1(__riscv_vand_vx_u8m1(q4_x, 0x0F, vl)); + vint16m2_t va_0 = __riscv_vwmul_vv_i16m2(q4_a, __riscv_vle8_v_i8m1(q8, vl), vl); + vint16m1_t aux1 = __riscv_vredsum_vs_i16m2_i16m1(va_0, vzero, vl); + + sumf += d*scales[0]*__riscv_vmv_x_s_i16m1_i16(aux1); + + // load Q8 and multiply it with upper Q4 nibble + vint8m1_t q4_s = __riscv_vreinterpret_v_u8m1_i8m1(__riscv_vsrl_vx_u8m1(q4_x, 0x04, vl)); + vint16m2_t va_1 = __riscv_vwmul_vv_i16m2(q4_s, __riscv_vle8_v_i8m1(q8+32, vl), vl); + vint16m1_t aux2 = __riscv_vredsum_vs_i16m2_i16m1(va_1, vzero, vl); + + sumf += d*scales[1]*__riscv_vmv_x_s_i16m1_i16(aux2); + + } + + *s = sumf; + #else uint8_t aux8[QK_K]; @@ -3394,6 +3829,93 @@ void ggml_vec_dot_q5_K_q8_K(const int n, float * restrict s, const void * restri *s = hsum_float_8(acc) + summs; +#elif defined __riscv_v_intrinsic + + const uint8_t * scales = (const uint8_t*)&utmp[0]; + const uint8_t * mins = (const uint8_t*)&utmp[2]; + + float sumf = 0; + float sums = 0.0; + + size_t vl; + + for (int i = 0; i < nb; ++i) { + + vl = 8; + + const uint8_t * restrict q5 = x[i].qs; + const uint8_t * restrict hm = x[i].qh; + const int8_t * restrict q8 = y[i].qs; + + const float d = ggml_fp16_to_fp32(x[i].d) * y[i].d; + const float dmin = ggml_fp16_to_fp32(x[i].dmin) * y[i].d; + + vint16mf2_t q8sums_0 = __riscv_vlse16_v_i16mf2(y[i].bsums, 4, vl); + vint16mf2_t q8sums_1 = __riscv_vlse16_v_i16mf2(y[i].bsums+1, 4, vl); + vint16mf2_t q8sums = __riscv_vadd_vv_i16mf2(q8sums_0, q8sums_1, vl); + + memcpy(utmp, x[i].scales, 12); + utmp[3] = ((utmp[2] >> 4) & kmask2) | (((utmp[1] >> 6) & kmask3) << 4); + const uint32_t uaux = utmp[1] & kmask1; + utmp[1] = (utmp[2] & kmask2) | (((utmp[0] >> 6) & kmask3) << 4); + utmp[2] = uaux; + utmp[0] &= kmask1; + + vuint8mf4_t mins8 = __riscv_vle8_v_u8mf4(mins, vl); + vint16mf2_t v_mins = __riscv_vreinterpret_v_u16mf2_i16mf2(__riscv_vzext_vf2_u16mf2(mins8, vl)); + vint32m1_t prod = __riscv_vwmul_vv_i32m1(q8sums, v_mins, vl); + + vint32m1_t sumi = __riscv_vredsum_vs_i32m1_i32m1(prod, __riscv_vmv_v_x_i32m1(0, 1), vl); + sumf -= dmin * __riscv_vmv_x_s_i32m1_i32(sumi); + + vl = 32; + int32_t aux32 = 0; + int is = 0; + + uint8_t m = 1; + vint32m1_t vzero = __riscv_vmv_v_x_i32m1(0, 1); + vuint8m1_t vqh = __riscv_vle8_v_u8m1(hm, vl); + + for (int j = 0; j < QK_K/64; ++j) { + // load Q5 and Q8 + vuint8m1_t q5_x = __riscv_vle8_v_u8m1(q5, vl); + vint8m1_t q8_y1 = __riscv_vle8_v_i8m1(q8, vl); + vint8m1_t q8_y2 = __riscv_vle8_v_i8m1(q8+32, vl); + + // compute mask for addition + vint8m1_t q5_a = __riscv_vreinterpret_v_u8m1_i8m1(__riscv_vand_vx_u8m1(q5_x, 0x0F, vl)); + vuint8m1_t qh_m1 = __riscv_vand_vx_u8m1(vqh, m, vl); + vbool8_t vmask_1 = __riscv_vmsne_vx_u8m1_b8(qh_m1, 0, vl); + vint8m1_t q5_m1 = __riscv_vadd_vx_i8m1_m(vmask_1, q5_a, 16, vl); + m <<= 1; + + vint8m1_t q5_l = __riscv_vreinterpret_v_u8m1_i8m1(__riscv_vsrl_vx_u8m1(q5_x, 0x04, vl)); + vuint8m1_t qh_m2 = __riscv_vand_vx_u8m1(vqh, m, vl); + vbool8_t vmask_2 = __riscv_vmsne_vx_u8m1_b8(qh_m2, 0, vl); + vint8m1_t q5_m2 = __riscv_vadd_vx_i8m1_m(vmask_2, q5_l, 16, vl); + m <<= 1; + + vint16m2_t v0 = __riscv_vwmul_vv_i16m2(q5_m1, q8_y1, vl); + vint16m2_t v1 = __riscv_vwmul_vv_i16m2(q5_m2, q8_y2, vl); + + vint32m4_t vs1 = __riscv_vwmul_vx_i32m4(v0, scales[is++], vl); + vint32m4_t vs2 = __riscv_vwmul_vx_i32m4(v1, scales[is++], vl); + + vint32m1_t vacc1 = __riscv_vredsum_vs_i32m4_i32m1(vs1, vzero, vl); + vint32m1_t vacc2 = __riscv_vredsum_vs_i32m4_i32m1(vs2, vzero, vl); + + aux32 += __riscv_vmv_x_s_i32m1_i32(vacc1) + __riscv_vmv_x_s_i32m1_i32(vacc2); + q5 += 32; q8 += 64; + + } + + vfloat32m1_t vaux = __riscv_vfmul_vf_f32m1(__riscv_vfmv_v_f_f32m1(aux32, 1), d, 1); + sums += __riscv_vfmv_f_s_f32m1_f32(vaux); + + } + + *s = sumf+sums; + #else const uint8_t * scales = (const uint8_t*)&utmp[0]; @@ -3639,6 +4161,76 @@ void ggml_vec_dot_q5_K_q8_K(const int n, float * restrict s, const void * restri *s = hsum_float_8(acc); +#elif defined __riscv_v_intrinsic + + float sumf = 0; + + for (int i = 0; i < nb; ++i) { + + const float d = y[i].d * (float)x[i].d; + const int8_t * sc = x[i].scales; + + const uint8_t * restrict q5 = x[i].qs; + const uint8_t * restrict qh = x[i].qh; + const int8_t * restrict q8 = y[i].qs; + + vint32m1_t vzero = __riscv_vmv_v_x_i32m1(0, 1); + + // load qh + vuint8mf4_t qh_x1 = __riscv_vle8_v_u8mf4(qh, 8); + vuint8mf2_t qh_x2 = __riscv_vlmul_ext_v_u8mf4_u8mf2(__riscv_vsrl_vx_u8mf4(qh_x1, 1, 8)); + + size_t vl = 16; + + // combine both qh_1 and qh_2 + vuint8mf2_t qh_x = __riscv_vslideup_vx_u8mf2(__riscv_vlmul_ext_v_u8mf4_u8mf2(qh_x1), qh_x2, vl/2, vl); + + vuint8mf2_t qh_h0 = __riscv_vand_vx_u8mf2(__riscv_vnot_v_u8mf2(__riscv_vsll_vx_u8mf2(qh_x, 0x4, vl), vl), 16, vl); + vuint8mf2_t qh_h1 = __riscv_vand_vx_u8mf2(__riscv_vnot_v_u8mf2(__riscv_vsll_vx_u8mf2(qh_x, 0x2, vl), vl), 16, vl); + vuint8mf2_t qh_h2 = __riscv_vand_vx_u8mf2(__riscv_vnot_v_u8mf2(qh_x, vl), 16, vl); + vuint8mf2_t qh_h3 = __riscv_vand_vx_u8mf2(__riscv_vnot_v_u8mf2(__riscv_vsrl_vx_u8mf2(qh_x, 0x4, vl), vl), 16, vl); + + vint8mf2_t qh_0 = __riscv_vreinterpret_v_u8mf2_i8mf2(qh_h0); + vint8mf2_t qh_1 = __riscv_vreinterpret_v_u8mf2_i8mf2(qh_h1); + vint8mf2_t qh_2 = __riscv_vreinterpret_v_u8mf2_i8mf2(qh_h2); + vint8mf2_t qh_3 = __riscv_vreinterpret_v_u8mf2_i8mf2(qh_h3); + + // load q5 + vuint8mf2_t q5_x1 = __riscv_vle8_v_u8mf2(q5, vl); + vuint8mf2_t q5_x2 = __riscv_vle8_v_u8mf2(q5+16, vl); + + vint8mf2_t q5s_0 = __riscv_vreinterpret_v_u8mf2_i8mf2(__riscv_vand_vx_u8mf2(q5_x1, 0xF, vl)); + vint8mf2_t q5s_1 = __riscv_vreinterpret_v_u8mf2_i8mf2(__riscv_vand_vx_u8mf2(q5_x2, 0xF, vl)); + vint8mf2_t q5s_2 = __riscv_vreinterpret_v_u8mf2_i8mf2(__riscv_vsrl_vx_u8mf2(q5_x1, 0x4, vl)); + vint8mf2_t q5s_3 = __riscv_vreinterpret_v_u8mf2_i8mf2(__riscv_vsrl_vx_u8mf2(q5_x2, 0x4, vl)); + + vint8mf2_t q5_0 = __riscv_vsub_vv_i8mf2(q5s_0, qh_0, vl); + vint8mf2_t q5_1 = __riscv_vsub_vv_i8mf2(q5s_1, qh_1, vl); + vint8mf2_t q5_2 = __riscv_vsub_vv_i8mf2(q5s_2, qh_2, vl); + vint8mf2_t q5_3 = __riscv_vsub_vv_i8mf2(q5s_3, qh_3, vl); + + // load Q8 and multiply it with Q5 + vint16m1_t p0 = __riscv_vwmul_vv_i16m1(q5_0, __riscv_vle8_v_i8mf2(q8, vl), vl); + vint16m1_t p1 = __riscv_vwmul_vv_i16m1(q5_1, __riscv_vle8_v_i8mf2(q8+16, vl), vl); + vint16m1_t p2 = __riscv_vwmul_vv_i16m1(q5_2, __riscv_vle8_v_i8mf2(q8+32, vl), vl); + vint16m1_t p3 = __riscv_vwmul_vv_i16m1(q5_3, __riscv_vle8_v_i8mf2(q8+48, vl), vl); + + vint32m1_t vs_0 = __riscv_vwredsum_vs_i16m1_i32m1(p0, vzero, vl); + vint32m1_t vs_1 = __riscv_vwredsum_vs_i16m1_i32m1(p1, vzero, vl); + vint32m1_t vs_2 = __riscv_vwredsum_vs_i16m1_i32m1(p2, vzero, vl); + vint32m1_t vs_3 = __riscv_vwredsum_vs_i16m1_i32m1(p3, vzero, vl); + + int32_t sumi1 = sc[0] * __riscv_vmv_x_s_i32m1_i32(vs_0); + int32_t sumi2 = sc[1] * __riscv_vmv_x_s_i32m1_i32(vs_1); + int32_t sumi3 = sc[2] * __riscv_vmv_x_s_i32m1_i32(vs_2); + int32_t sumi4 = sc[3] * __riscv_vmv_x_s_i32m1_i32(vs_3); + + sumf += d * (sumi1 + sumi2 + sumi3 + sumi4); + + } + + *s = sumf; + #else int8_t aux8[QK_K]; @@ -4023,6 +4615,91 @@ void ggml_vec_dot_q6_K_q8_K(const int n, float * restrict s, const void * restri *s = hsum_float_8(acc); +#elif defined __riscv_v_intrinsic + + float sumf = 0; + for (int i = 0; i < nb; ++i) { + + const float d = ggml_fp16_to_fp32(x[i].d) * y[i].d; + + const uint8_t * restrict q6 = x[i].ql; + const uint8_t * restrict qh = x[i].qh; + const int8_t * restrict q8 = y[i].qs; + + const int8_t * restrict scale = x[i].scales; + + size_t vl; + + vint32m1_t vzero = __riscv_vmv_v_x_i32m1(0, 1); + + int sum_t = 0; + int is = 0; + + for (int j = 0; j < QK_K/128; ++j) { + + vl = 32; + + // load qh + vuint8m1_t qh_x = __riscv_vle8_v_u8m1(qh, vl); + + // load Q6 + vuint8m1_t q6_0 = __riscv_vle8_v_u8m1(q6, vl); + vuint8m1_t q6_1 = __riscv_vle8_v_u8m1(q6+32, vl); + + vuint8m1_t q6a_0 = __riscv_vand_vx_u8m1(q6_0, 0x0F, vl); + vuint8m1_t q6a_1 = __riscv_vand_vx_u8m1(q6_1, 0x0F, vl); + vuint8m1_t q6s_0 = __riscv_vsrl_vx_u8m1(q6_0, 0x04, vl); + vuint8m1_t q6s_1 = __riscv_vsrl_vx_u8m1(q6_1, 0x04, vl); + + vuint8m1_t qh_0 = __riscv_vand_vx_u8m1(qh_x, 0x03, vl); + vuint8m1_t qh_1 = __riscv_vand_vx_u8m1(__riscv_vsrl_vx_u8m1(qh_x, 0x2, vl), 0x03 , vl); + vuint8m1_t qh_2 = __riscv_vand_vx_u8m1(__riscv_vsrl_vx_u8m1(qh_x, 0x4, vl), 0x03 , vl); + vuint8m1_t qh_3 = __riscv_vand_vx_u8m1(__riscv_vsrl_vx_u8m1(qh_x, 0x6, vl), 0x03 , vl); + + vuint8m1_t qhi_0 = __riscv_vor_vv_u8m1(q6a_0, __riscv_vsll_vx_u8m1(qh_0, 0x04, vl), vl); + vuint8m1_t qhi_1 = __riscv_vor_vv_u8m1(q6a_1, __riscv_vsll_vx_u8m1(qh_1, 0x04, vl), vl); + vuint8m1_t qhi_2 = __riscv_vor_vv_u8m1(q6s_0, __riscv_vsll_vx_u8m1(qh_2, 0x04, vl), vl); + vuint8m1_t qhi_3 = __riscv_vor_vv_u8m1(q6s_1, __riscv_vsll_vx_u8m1(qh_3, 0x04, vl), vl); + + vint8m1_t a_0 = __riscv_vsub_vx_i8m1(__riscv_vreinterpret_v_u8m1_i8m1(qhi_0), 32, vl); + vint8m1_t a_1 = __riscv_vsub_vx_i8m1(__riscv_vreinterpret_v_u8m1_i8m1(qhi_1), 32, vl); + vint8m1_t a_2 = __riscv_vsub_vx_i8m1(__riscv_vreinterpret_v_u8m1_i8m1(qhi_2), 32, vl); + vint8m1_t a_3 = __riscv_vsub_vx_i8m1(__riscv_vreinterpret_v_u8m1_i8m1(qhi_3), 32, vl); + + // load Q8 and take product + vint16m2_t va_q_0 = __riscv_vwmul_vv_i16m2(a_0, __riscv_vle8_v_i8m1(q8, vl), vl); + vint16m2_t va_q_1 = __riscv_vwmul_vv_i16m2(a_1, __riscv_vle8_v_i8m1(q8+32, vl), vl); + vint16m2_t va_q_2 = __riscv_vwmul_vv_i16m2(a_2, __riscv_vle8_v_i8m1(q8+64, vl), vl); + vint16m2_t va_q_3 = __riscv_vwmul_vv_i16m2(a_3, __riscv_vle8_v_i8m1(q8+96, vl), vl); + + vl = 16; + + vint32m2_t vaux_0 = __riscv_vwmul_vx_i32m2(__riscv_vget_v_i16m2_i16m1(va_q_0, 0), scale[is+0], vl); + vint32m2_t vaux_1 = __riscv_vwmul_vx_i32m2(__riscv_vget_v_i16m2_i16m1(va_q_0, 1), scale[is+1], vl); + vint32m2_t vaux_2 = __riscv_vwmul_vx_i32m2(__riscv_vget_v_i16m2_i16m1(va_q_1, 0), scale[is+2], vl); + vint32m2_t vaux_3 = __riscv_vwmul_vx_i32m2(__riscv_vget_v_i16m2_i16m1(va_q_1, 1), scale[is+3], vl); + vint32m2_t vaux_4 = __riscv_vwmul_vx_i32m2(__riscv_vget_v_i16m2_i16m1(va_q_2, 0), scale[is+4], vl); + vint32m2_t vaux_5 = __riscv_vwmul_vx_i32m2(__riscv_vget_v_i16m2_i16m1(va_q_2, 1), scale[is+5], vl); + vint32m2_t vaux_6 = __riscv_vwmul_vx_i32m2(__riscv_vget_v_i16m2_i16m1(va_q_3, 0), scale[is+6], vl); + vint32m2_t vaux_7 = __riscv_vwmul_vx_i32m2(__riscv_vget_v_i16m2_i16m1(va_q_3, 1), scale[is+7], vl); + + vint32m1_t isum0 = __riscv_vredsum_vs_i32m2_i32m1(__riscv_vadd_vv_i32m2(vaux_0, vaux_1, vl), vzero, vl); + vint32m1_t isum1 = __riscv_vredsum_vs_i32m2_i32m1(__riscv_vadd_vv_i32m2(vaux_2, vaux_3, vl), isum0, vl); + vint32m1_t isum2 = __riscv_vredsum_vs_i32m2_i32m1(__riscv_vadd_vv_i32m2(vaux_4, vaux_5, vl), isum1, vl); + vint32m1_t isum3 = __riscv_vredsum_vs_i32m2_i32m1(__riscv_vadd_vv_i32m2(vaux_6, vaux_7, vl), isum2, vl); + + sum_t += __riscv_vmv_x_s_i32m1_i32(isum3); + + q6 += 64; qh += 32; q8 += 128; is=8; + + } + + sumf += d * sum_t; + + } + + *s = sumf; + #else int8_t aux8[QK_K]; @@ -4276,6 +4953,73 @@ void ggml_vec_dot_q6_K_q8_K(const int n, float * restrict s, const void * restri *s = hsum_float_8(acc); +#elif defined __riscv_v_intrinsic + + float sumf = 0; + + for (int i = 0; i < nb; ++i) { + + const float d_all = (float)x[i].d; + + const uint8_t * restrict q6 = x[i].ql; + const uint8_t * restrict qh = x[i].qh; + const int8_t * restrict q8 = y[i].qs; + + const int8_t * restrict scale = x[i].scales; + + int32_t isum = 0; + + size_t vl = 16; + + vint32m1_t vzero = __riscv_vmv_v_x_i32m1(0, 1); + + // load Q6 + vuint8mf2_t q6_0 = __riscv_vle8_v_u8mf2(q6, vl); + vuint8mf2_t q6_1 = __riscv_vle8_v_u8mf2(q6+16, vl); + + // load qh + vuint8mf2_t qh_x = __riscv_vle8_v_u8mf2(qh, vl); + + vuint8mf2_t qh0 = __riscv_vsll_vx_u8mf2(__riscv_vand_vx_u8mf2(qh_x, 0x3, vl), 0x4, vl); + qh_x = __riscv_vsrl_vx_u8mf2(qh_x, 0x2, vl); + vuint8mf2_t qh1 = __riscv_vsll_vx_u8mf2(__riscv_vand_vx_u8mf2(qh_x, 0x3, vl), 0x4, vl); + qh_x = __riscv_vsrl_vx_u8mf2(qh_x, 0x2, vl); + vuint8mf2_t qh2 = __riscv_vsll_vx_u8mf2(__riscv_vand_vx_u8mf2(qh_x, 0x3, vl), 0x4, vl); + qh_x = __riscv_vsrl_vx_u8mf2(qh_x, 0x2, vl); + vuint8mf2_t qh3 = __riscv_vsll_vx_u8mf2(__riscv_vand_vx_u8mf2(qh_x, 0x3, vl), 0x4, vl); + + vuint8mf2_t q6h_0 = __riscv_vor_vv_u8mf2(__riscv_vand_vx_u8mf2(q6_0, 0xF, vl), qh0, vl); + vuint8mf2_t q6h_1 = __riscv_vor_vv_u8mf2(__riscv_vand_vx_u8mf2(q6_1, 0xF, vl), qh1, vl); + vuint8mf2_t q6h_2 = __riscv_vor_vv_u8mf2(__riscv_vsrl_vx_u8mf2(q6_0, 0x4, vl), qh2, vl); + vuint8mf2_t q6h_3 = __riscv_vor_vv_u8mf2(__riscv_vsrl_vx_u8mf2(q6_1, 0x4, vl), qh3, vl); + + vint8mf2_t q6v_0 = __riscv_vsub_vx_i8mf2(__riscv_vreinterpret_v_u8mf2_i8mf2(q6h_0), 32, vl); + vint8mf2_t q6v_1 = __riscv_vsub_vx_i8mf2(__riscv_vreinterpret_v_u8mf2_i8mf2(q6h_1), 32, vl); + vint8mf2_t q6v_2 = __riscv_vsub_vx_i8mf2(__riscv_vreinterpret_v_u8mf2_i8mf2(q6h_2), 32, vl); + vint8mf2_t q6v_3 = __riscv_vsub_vx_i8mf2(__riscv_vreinterpret_v_u8mf2_i8mf2(q6h_3), 32, vl); + + // load Q8 and take product + vint16m1_t p0 = __riscv_vwmul_vv_i16m1(q6v_0, __riscv_vle8_v_i8mf2(q8, vl), vl); + vint16m1_t p1 = __riscv_vwmul_vv_i16m1(q6v_1, __riscv_vle8_v_i8mf2(q8+16, vl), vl); + vint16m1_t p2 = __riscv_vwmul_vv_i16m1(q6v_2, __riscv_vle8_v_i8mf2(q8+32, vl), vl); + vint16m1_t p3 = __riscv_vwmul_vv_i16m1(q6v_3, __riscv_vle8_v_i8mf2(q8+48, vl), vl); + + vint32m1_t vs_0 = __riscv_vwredsum_vs_i16m1_i32m1(p0, vzero, vl); + vint32m1_t vs_1 = __riscv_vwredsum_vs_i16m1_i32m1(p1, vzero, vl); + vint32m1_t vs_2 = __riscv_vwredsum_vs_i16m1_i32m1(p2, vzero, vl); + vint32m1_t vs_3 = __riscv_vwredsum_vs_i16m1_i32m1(p3, vzero, vl); + + isum += __riscv_vmv_x_s_i32m1_i32(vs_0) * scale[0]; + isum += __riscv_vmv_x_s_i32m1_i32(vs_1) * scale[1]; + isum += __riscv_vmv_x_s_i32m1_i32(vs_2) * scale[2]; + isum += __riscv_vmv_x_s_i32m1_i32(vs_3) * scale[3]; + + sumf += isum * d_all * y[i].d; + + } + + *s = sumf; + #else int8_t aux8[QK_K]; From f72f8f22c9cb60465b2e79df2767e4ba9604e576 Mon Sep 17 00:00:00 2001 From: Merrick Christensen Date: Wed, 4 Oct 2023 00:33:13 -0600 Subject: [PATCH 35/73] finetune : readme fix typo (#3465) Fix small typo --- examples/finetune/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/finetune/README.md b/examples/finetune/README.md index b7347c20c..36e62578c 100644 --- a/examples/finetune/README.md +++ b/examples/finetune/README.md @@ -61,7 +61,7 @@ For example to apply 40% of the 'shakespeare' LORA adapter, 80% of the 'bible' L --lora lora-open-llama-3b-v2-q8_0-yet-another-one-LATEST.bin ``` -The scale numbers don't need to add up to one, and you can also use numbers creater than 1 to further increase the influence of an adapter. But making the values to big will sometimes result in worse output. Play around to find good values. +The scale numbers don't need to add up to one, and you can also use numbers greater than 1 to further increase the influence of an adapter. But making the values to big will sometimes result in worse output. Play around to find good values. Gradient checkpointing reduces the memory requirements by ~50% but increases the runtime. If you have enough RAM, you can make finetuning a bit faster by disabling checkpointing with `--no-checkpointing`. From f93af02488179b9c52d0d391b08ae4c4d891b8d3 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Wed, 4 Oct 2023 15:29:58 +0300 Subject: [PATCH 36/73] sync : ggml (conv 1d + 2d updates, UB fixes) (#3468) * sync : ggml (conv 1d + 2d updates) ggml-ci * ggml : fix UB in q5_0 and q5_1 quantize code ggml.c:1033:39: runtime error: left shift of 1 by 31 places cannot be represented in type 'int' SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior ggml.c:1081:39: runtime error: left shift of 1 by 31 places cannot be represented in type 'int' SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior ggml-ci * tests : fix UB in test-quantize-perf --- ggml.c | 1011 +++++++++++++++++++++++----------- ggml.h | 13 + k_quants.c | 2 - tests/test-grad0.cpp | 20 - tests/test-opt.cpp | 29 - tests/test-quantize-perf.cpp | 29 +- 6 files changed, 725 insertions(+), 379 deletions(-) diff --git a/ggml.c b/ggml.c index dd1d00bc8..4a94b0f33 100644 --- a/ggml.c +++ b/ggml.c @@ -1032,8 +1032,8 @@ static void quantize_row_q5_0_reference(const float * restrict x, block_q5_0 * r y[i].qs[j] = (xi0 & 0x0F) | ((xi1 & 0x0F) << 4); // get the 5-th bit and store it in qh at the right position - qh |= ((xi0 & 0x10) >> 4) << (j + 0); - qh |= ((xi1 & 0x10) >> 4) << (j + qk/2); + qh |= ((xi0 & 0x10u) >> 4) << (j + 0); + qh |= ((xi1 & 0x10u) >> 4) << (j + qk/2); } memcpy(&y[i].qh, &qh, sizeof(qh)); @@ -1080,8 +1080,8 @@ static void quantize_row_q5_1_reference(const float * restrict x, block_q5_1 * r y[i].qs[j] = (xi0 & 0x0F) | ((xi1 & 0x0F) << 4); // get the 5-th bit and store it in qh at the right position - qh |= ((xi0 & 0x10) >> 4) << (j + 0); - qh |= ((xi1 & 0x10) >> 4) << (j + qk/2); + qh |= ((xi0 & 0x10u) >> 4) << (j + 0); + qh |= ((xi1 & 0x10u) >> 4) << (j + qk/2); } memcpy(&y[i].qh, &qh, sizeof(y[i].qh)); @@ -4081,12 +4081,16 @@ static const char * GGML_OP_NAME[GGML_OP_COUNT] = { "ALIBI", "CLAMP", "CONV_1D", + "CONV_TRANSPOSE_1D", "CONV_2D", "CONV_TRANSPOSE_2D", "POOL_1D", "POOL_2D", "UPSCALE", + "CONV_1D_STAGE_0", + "CONV_1D_STAGE_1", + "FLASH_ATTN", "FLASH_FF", "FLASH_ATTN_BACK", @@ -4112,7 +4116,7 @@ static const char * GGML_OP_NAME[GGML_OP_COUNT] = { "CROSS_ENTROPY_LOSS_BACK", }; -static_assert(GGML_OP_COUNT == 68, "GGML_OP_COUNT != 68"); +static_assert(GGML_OP_COUNT == 71, "GGML_OP_COUNT != 71"); static const char * GGML_OP_SYMBOL[GGML_OP_COUNT] = { "none", @@ -4163,12 +4167,16 @@ static const char * GGML_OP_SYMBOL[GGML_OP_COUNT] = { "alibi(x)", "clamp(x)", "conv_1d(x)", + "conv_transpose_1d(x)", "conv_2d(x)", "conv_transpose_2d(x)", "pool_1d(x)", "pool_2d(x)", "upscale(x)", + "conv_1d_stage_0(x)", + "conv_1d_stage_1(x)", + "flash_attn(x)", "flash_ff(x)", "flash_attn_back(x)", @@ -4194,7 +4202,7 @@ static const char * GGML_OP_SYMBOL[GGML_OP_COUNT] = { "cross_entropy_loss_back(x,y)", }; -static_assert(GGML_OP_COUNT == 68, "GGML_OP_COUNT != 68"); +static_assert(GGML_OP_COUNT == 71, "GGML_OP_COUNT != 71"); static_assert(GGML_OP_POOL_COUNT == 2, "GGML_OP_POOL_COUNT != 2"); @@ -4223,7 +4231,10 @@ static void ggml_setup_op_has_task_pass(void) { p[GGML_OP_DIAG_MASK_INF ] = true; p[GGML_OP_DIAG_MASK_ZERO ] = true; p[GGML_OP_CONV_1D ] = true; + p[GGML_OP_CONV_1D_STAGE_0 ] = true; + p[GGML_OP_CONV_1D_STAGE_1 ] = true; p[GGML_OP_CONV_2D ] = true; + p[GGML_OP_CONV_TRANSPOSE_1D ] = true; p[GGML_OP_CONV_TRANSPOSE_2D ] = true; p[GGML_OP_FLASH_ATTN_BACK ] = true; p[GGML_OP_CROSS_ENTROPY_LOSS ] = true; @@ -6746,7 +6757,6 @@ struct ggml_tensor * ggml_cont_4d( return result; } - // ggml_reshape struct ggml_tensor * ggml_reshape( @@ -7504,14 +7514,17 @@ static int64_t ggml_calc_conv_output_size(int64_t ins, int64_t ks, int s, int p, return (ins + 2 * p - d * (ks - 1) - 1) / s + 1; } -GGML_API struct ggml_tensor * ggml_conv_1d( - struct ggml_context * ctx, - struct ggml_tensor * a, - struct ggml_tensor * b, - int s0, - int p0, - int d0) { - GGML_ASSERT(ggml_is_matrix(b)); +// im2col: [N, IC, IL] => [N, OL, IC*K] +// a: [OC,IC, K] +// b: [N, IC, IL] +// result: [N, OL, IC*K] +static struct ggml_tensor * ggml_conv_1d_stage_0( + struct ggml_context * ctx, + struct ggml_tensor * a, + struct ggml_tensor * b, + int s0, + int p0, + int d0) { GGML_ASSERT(a->ne[1] == b->ne[1]); bool is_node = false; @@ -7520,16 +7533,20 @@ GGML_API struct ggml_tensor * ggml_conv_1d( is_node = true; } + const int64_t OL = ggml_calc_conv_output_size(b->ne[0], a->ne[0], s0, p0, d0); + const int64_t ne[4] = { - ggml_calc_conv_output_size(b->ne[0], a->ne[0], s0, p0, d0), - a->ne[2], 1, 1, + a->ne[1] * a->ne[0], + OL, + b->ne[2], + 1, }; - struct ggml_tensor * result = ggml_new_tensor(ctx, GGML_TYPE_F32, 2, ne); + struct ggml_tensor * result = ggml_new_tensor(ctx, GGML_TYPE_F16, 4, ne); int32_t params[] = { s0, p0, d0 }; ggml_set_op_params(result, params, sizeof(params)); - result->op = GGML_OP_CONV_1D; + result->op = GGML_OP_CONV_1D_STAGE_0; result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL; result->src[0] = a; result->src[1] = b; @@ -7537,6 +7554,87 @@ GGML_API struct ggml_tensor * ggml_conv_1d( return result; } +// ggml_conv_1d_stage_1 + +// gemm: [N, OC, OL] = [OC, IC * K] x [N*OL, IC * K] +// a: [OC, IC, K] +// b: [N, OL, IC * K] +// result: [N, OC, OL] +static struct ggml_tensor * ggml_conv_1d_stage_1( + struct ggml_context * ctx, + struct ggml_tensor * a, + struct ggml_tensor * b) { + + bool is_node = false; + + if (a->grad || b->grad) { + GGML_ASSERT(false); // TODO: implement backward + is_node = true; + } + + const int64_t ne[4] = { + b->ne[1], + a->ne[2], + b->ne[2], + 1, + }; + struct ggml_tensor * result = ggml_new_tensor(ctx, GGML_TYPE_F32, 4, ne); + + result->op = GGML_OP_CONV_1D_STAGE_1; + result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL; + result->src[0] = a; + result->src[1] = b; + + return result; +} + +// ggml_conv_1d + +GGML_API struct ggml_tensor * ggml_conv_1d( + struct ggml_context * ctx, + struct ggml_tensor * a, + struct ggml_tensor * b, + int s0, + int p0, + int d0) { + struct ggml_tensor * result = ggml_conv_1d_stage_0(ctx, a, b, s0, p0, d0); + result = ggml_conv_1d_stage_1(ctx, a, result); + return result; +} + +// GGML_API struct ggml_tensor * ggml_conv_1d( +// struct ggml_context * ctx, +// struct ggml_tensor * a, +// struct ggml_tensor * b, +// int s0, +// int p0, +// int d0) { +// GGML_ASSERT(ggml_is_matrix(b)); +// GGML_ASSERT(a->ne[1] == b->ne[1]); +// bool is_node = false; + +// if (a->grad || b->grad) { +// GGML_ASSERT(false); // TODO: implement backward +// is_node = true; +// } + +// const int64_t ne[4] = { +// ggml_calc_conv_output_size(b->ne[0], a->ne[0], s0, p0, d0), +// a->ne[2], 1, 1, +// }; +// struct ggml_tensor * result = ggml_new_tensor(ctx, GGML_TYPE_F32, 2, ne); + +// int32_t params[] = { s0, p0, d0 }; +// ggml_set_op_params(result, params, sizeof(params)); + +// result->op = GGML_OP_CONV_1D; +// result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL; +// result->src[0] = a; +// result->src[1] = b; + +// return result; +// } + // ggml_conv_1d_ph struct ggml_tensor* ggml_conv_1d_ph( @@ -7548,6 +7646,50 @@ struct ggml_tensor* ggml_conv_1d_ph( return ggml_conv_1d(ctx, a, b, s, a->ne[0] / 2, d); } +// ggml_conv_transpose_1d + +static int64_t ggml_calc_conv_transpose_1d_output_size(int64_t ins, int64_t ks, int s, int p, int d) { + return (ins - 1) * s - 2 * p + d * (ks - 1) + 1; +} + +GGML_API struct ggml_tensor * ggml_conv_transpose_1d( + struct ggml_context * ctx, + struct ggml_tensor * a, + struct ggml_tensor * b, + int s0, + int p0, + int d0) { + GGML_ASSERT(ggml_is_matrix(b)); + GGML_ASSERT(a->ne[2] == b->ne[1]); + GGML_ASSERT(a->ne[3] == 1); + + GGML_ASSERT(p0 == 0); + GGML_ASSERT(d0 == 1); + + bool is_node = false; + + if (a->grad || b->grad) { + GGML_ASSERT(false); // TODO: implement backward + is_node = true; + } + + const int64_t ne[4] = { + ggml_calc_conv_transpose_1d_output_size(b->ne[0], a->ne[0], s0, 0 /*p0*/, 1 /*d0*/), + a->ne[1], b->ne[2], 1, + }; + struct ggml_tensor * result = ggml_new_tensor(ctx, GGML_TYPE_F32, 4, ne); + + int32_t params[] = { s0, p0, d0 }; + ggml_set_op_params(result, params, sizeof(params)); + + result->op = GGML_OP_CONV_TRANSPOSE_1D; + result->grad = is_node ? ggml_dup_tensor(ctx, result) : NULL; + result->src[0] = a; + result->src[1] = b; + + return result; +} + // ggml_conv_2d struct ggml_tensor * ggml_conv_2d( @@ -13687,7 +13829,7 @@ static void ggml_compute_forward_rope_back( // ggml_compute_forward_conv_1d -static void ggml_compute_forward_conv_1d_s1_ph_f16_f32( +static void ggml_compute_forward_conv_1d_f16_f32( const struct ggml_compute_params * params, const struct ggml_tensor * src0, const struct ggml_tensor * src1, @@ -13705,46 +13847,37 @@ static void ggml_compute_forward_conv_1d_s1_ph_f16_f32( const int nth = params->nth; const int nk = ne00; - const int nh = nk/2; - const int ew0 = ggml_up32(ne01); + // size of the convolution row - the kernel size unrolled across all input channels + const int ew0 = nk*ne01; + + const int32_t s0 = ((const int32_t*)(dst->op_params))[0]; + const int32_t p0 = ((const int32_t*)(dst->op_params))[1]; + const int32_t d0 = ((const int32_t*)(dst->op_params))[2]; - GGML_ASSERT(ne00 % 2 == 1); // TODO: support even kernel sizes GGML_ASSERT(nb00 == sizeof(ggml_fp16_t)); GGML_ASSERT(nb10 == sizeof(float)); if (params->type == GGML_TASK_INIT) { - // TODO: fix this memset (wsize is overestimated) memset(params->wdata, 0, params->wsize); - // prepare kernel data (src0) - { - ggml_fp16_t * const wdata = (ggml_fp16_t *) params->wdata + 0; + ggml_fp16_t * const wdata = (ggml_fp16_t *) params->wdata + 0; - for (int64_t i02 = 0; i02 < ne02; i02++) { - for (int64_t i01 = 0; i01 < ne01; i01++) { - const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i02*nb02 + i01*nb01); - ggml_fp16_t * dst_data = wdata + i02*ew0*ne00; - for (int64_t i00 = 0; i00 < ne00; i00++) { - dst_data[i00*ew0 + i01] = src[i00]; + for (int64_t i11 = 0; i11 < ne11; i11++) { + const float * const src = (float *)((char *) src1->data + i11*nb11); + ggml_fp16_t * dst_data = wdata; + + for (int64_t i0 = 0; i0 < ne0; i0++) { + for (int64_t ik = 0; ik < nk; ik++) { + const int idx0 = i0*s0 + ik*d0 - p0; + + if(!(idx0 < 0 || idx0 >= ne10)) { + dst_data[i0*ew0 + i11*nk + ik] = GGML_FP32_TO_FP16(src[idx0]); } } } } - // prepare source data (src1) - { - ggml_fp16_t * const wdata = (ggml_fp16_t *) params->wdata + ne02*ew0*ne00; - - for (int64_t i11 = 0; i11 < ne11; i11++) { - const float * const src = (float *)((char *) src1->data + i11*nb11); - ggml_fp16_t * dst_data = wdata; - for (int64_t i10 = 0; i10 < ne10; i10++) { - dst_data[(i10 + nh)*ew0 + i11] = GGML_FP32_TO_FP16(src[i10]); - } - } - } - return; } @@ -13753,7 +13886,7 @@ static void ggml_compute_forward_conv_1d_s1_ph_f16_f32( } // total rows in dst - const int nr = ne02; + const int nr = ne2; // rows per thread const int dr = (nr + nth - 1)/nth; @@ -13762,23 +13895,22 @@ static void ggml_compute_forward_conv_1d_s1_ph_f16_f32( const int ir0 = dr*ith; const int ir1 = MIN(ir0 + dr, nr); - for (int i1 = ir0; i1 < ir1; i1++) { - float * dst_data = (float *)((char *) dst->data + i1*nb1); - for (int64_t i0 = 0; i0 < ne10; ++i0) { - dst_data[i0] = 0; - for (int k = -nh; k <= nh; k++) { - float v = 0.0f; - ggml_vec_dot_f16(ew0, &v, - (ggml_fp16_t *) params->wdata + i1*ew0*ne00 + (nh + k)*ew0, - (ggml_fp16_t *) params->wdata + ne02*ew0*ne00 + (i0 + nh + k)*ew0); + ggml_fp16_t * const wdata = (ggml_fp16_t *) params->wdata + 0; - dst_data[i0] += v; + for (int i2 = 0; i2 < ne2; i2++) { + for (int i1 = ir0; i1 < ir1; i1++) { + float * dst_data = (float *)((char *) dst->data + i2*nb2 + i1*nb1); + + for (int i0 = 0; i0 < ne0; i0++) { + ggml_vec_dot_f16(ew0, dst_data + i0, + (ggml_fp16_t *) ((char *) src0->data + i1*nb02), + (ggml_fp16_t *) wdata + i2*nb2 + i0*ew0); } } } } -static void ggml_compute_forward_conv_1d_s1_ph_f32( +static void ggml_compute_forward_conv_1d_f32( const struct ggml_compute_params * params, const struct ggml_tensor * src0, const struct ggml_tensor * src1, @@ -13796,46 +13928,36 @@ static void ggml_compute_forward_conv_1d_s1_ph_f32( const int nth = params->nth; const int nk = ne00; - const int nh = nk/2; - const int ew0 = ggml_up32(ne01); + const int ew0 = nk*ne01; + + const int32_t s0 = ((const int32_t*)(dst->op_params))[0]; + const int32_t p0 = ((const int32_t*)(dst->op_params))[1]; + const int32_t d0 = ((const int32_t*)(dst->op_params))[2]; - GGML_ASSERT(ne00 % 2 == 1); // TODO: support even kernel sizes GGML_ASSERT(nb00 == sizeof(float)); GGML_ASSERT(nb10 == sizeof(float)); if (params->type == GGML_TASK_INIT) { - // TODO: fix this memset (wsize is overestimated) memset(params->wdata, 0, params->wsize); - // prepare kernel data (src0) - { - float * const wdata = (float *) params->wdata + 0; + float * const wdata = (float *) params->wdata + 0; - for (int64_t i02 = 0; i02 < ne02; i02++) { - for (int64_t i01 = 0; i01 < ne01; i01++) { - const float * const src = (float *)((char *) src0->data + i02*nb02 + i01*nb01); - float * dst_data = wdata + i02*ew0*ne00; - for (int64_t i00 = 0; i00 < ne00; i00++) { - dst_data[i00*ew0 + i01] = src[i00]; + for (int64_t i11 = 0; i11 < ne11; i11++) { + const float * const src = (float *)((char *) src1->data + i11*nb11); + float * dst_data = wdata; + + for (int64_t i0 = 0; i0 < ne0; i0++) { + for (int64_t ik = 0; ik < nk; ik++) { + const int idx0 = i0*s0 + ik*d0 - p0; + + if(!(idx0 < 0 || idx0 >= ne10)) { + dst_data[i0*ew0 + i11*nk + ik] = src[idx0]; } } } } - // prepare source data (src1) - { - float * const wdata = (float *) params->wdata + ne02*ew0*ne00; - - for (int64_t i11 = 0; i11 < ne11; i11++) { - const float * const src = (float *)((char *) src1->data + i11*nb11); - float * dst_data = wdata; - for (int64_t i10 = 0; i10 < ne10; i10++) { - dst_data[(i10 + nh)*ew0 + i11] = src[i10]; - } - } - } - return; } @@ -13853,101 +13975,126 @@ static void ggml_compute_forward_conv_1d_s1_ph_f32( const int ir0 = dr*ith; const int ir1 = MIN(ir0 + dr, nr); - for (int i1 = ir0; i1 < ir1; i1++) { - float * dst_data = (float *)((char *) dst->data + i1*nb1); - for (int64_t i0 = 0; i0 < ne10; ++i0) { - dst_data[i0] = 0; - for (int k = -nh; k <= nh; k++) { - float v = 0.0f; - ggml_vec_dot_f32(ew0, &v, - (float *) params->wdata + i1*ew0*ne00 + (nh + k)*ew0, - (float *) params->wdata + ne02*ew0*ne00 + (i0 + nh + k)*ew0); + float * const wdata = (float *) params->wdata + 0; - dst_data[i0] += v; + for (int i2 = 0; i2 < ne2; i2++) { + for (int i1 = ir0; i1 < ir1; i1++) { + float * dst_data = (float *)((char *) dst->data + i2*nb2 + i1*nb1); + + for (int i0 = 0; i0 < ne0; i0++) { + ggml_vec_dot_f32(ew0, dst_data + i0, + (float *) ((char *) src0->data + i1*nb02), + (float *) wdata + i2*nb2 + i0*ew0); } } } } -static void ggml_compute_forward_conv_1d_s1_ph( - const struct ggml_compute_params * params, - const struct ggml_tensor * src0, - const struct ggml_tensor * src1, - struct ggml_tensor * dst) { - switch (src0->type) { - case GGML_TYPE_F16: - { - ggml_compute_forward_conv_1d_s1_ph_f16_f32(params, src0, src1, dst); - } break; - case GGML_TYPE_F32: - { - ggml_compute_forward_conv_1d_s1_ph_f32(params, src0, src1, dst); - } break; - default: - { - GGML_ASSERT(false); - } break; +static void gemm_f16_out_f32(int64_t m, int64_t n, int64_t k, + ggml_fp16_t * A, + ggml_fp16_t * B, + float * C, + const int ith, const int nth) { + // does not seem to make a difference + int64_t m0, m1, n0, n1; + // patches per thread + if (m > n) { + n0 = 0; + n1 = n; + + // total patches in dst + const int np = m; + + // patches per thread + const int dp = (np + nth - 1)/nth; + + // patch range for this thread + m0 = dp*ith; + m1 = MIN(m0 + dp, np); + } else { + m0 = 0; + m1 = m; + + // total patches in dst + const int np = n; + + // patches per thread + const int dp = (np + nth - 1)/nth; + + // patch range for this thread + n0 = dp*ith; + n1 = MIN(n0 + dp, np); + } + + // block-tiling attempt + int64_t blck_n = 16; + int64_t blck_m = 16; + + // int64_t CACHE_SIZE = 2 * 1024 * 1024; // 2MB + // int64_t blck_size = CACHE_SIZE / (sizeof(float) + 2 * sizeof(ggml_fp16_t) * K); + // if (blck_size > 0) { + // blck_0 = 4; + // blck_1 = blck_size / blck_0; + // if (blck_1 < 0) { + // blck_1 = 1; + // } + // // blck_0 = (int64_t)sqrt(blck_size); + // // blck_1 = blck_0; + // } + // // printf("%zd %zd %zd %zd\n", blck_size, K, blck_0, blck_1); + + for (int j = n0; j < n1; j+=blck_n) { + for (int i = m0; i < m1; i+=blck_m) { + // printf("i j k => %d %d %d\n", i, j, K); + for (int ii = i; ii < i + blck_m && ii < m1; ii++) { + for (int jj = j; jj < j + blck_n && jj < n1; jj++) { + ggml_vec_dot_f16(k, + C + ii*n + jj, + A + ii * k, + B + jj * k); + } + } + } } } -static void ggml_compute_forward_conv_1d_s2_ph_f16_f32( +// src0: kernel [OC, IC, K] +// src1: signal [N, IC, IL] +// dst: result [N, OL, IC*K] +static void ggml_compute_forward_conv_1d_stage_0_f32( const struct ggml_compute_params * params, const struct ggml_tensor * src0, const struct ggml_tensor * src1, struct ggml_tensor * dst) { GGML_ASSERT(src0->type == GGML_TYPE_F16); GGML_ASSERT(src1->type == GGML_TYPE_F32); - GGML_ASSERT( dst->type == GGML_TYPE_F32); + GGML_ASSERT( dst->type == GGML_TYPE_F16); int64_t t0 = ggml_perf_time_us(); UNUSED(t0); - GGML_TENSOR_BINARY_OP_LOCALS + GGML_TENSOR_BINARY_OP_LOCALS; + + const int64_t N = ne12; + const int64_t IC = ne11; + const int64_t IL = ne10; + + const int64_t K = ne00; + + const int64_t OL = ne1; const int ith = params->ith; const int nth = params->nth; - const int nk = ne00; - const int nh = nk/2; + const int32_t s0 = ((const int32_t*)(dst->op_params))[0]; + const int32_t p0 = ((const int32_t*)(dst->op_params))[1]; + const int32_t d0 = ((const int32_t*)(dst->op_params))[2]; - const int ew0 = ggml_up32(ne01); - - GGML_ASSERT(ne00 % 2 == 1); // TODO: support even kernel sizes GGML_ASSERT(nb00 == sizeof(ggml_fp16_t)); GGML_ASSERT(nb10 == sizeof(float)); if (params->type == GGML_TASK_INIT) { - // TODO: fix this memset (wsize is overestimated) - memset(params->wdata, 0, params->wsize); - - // prepare kernel data (src0) - { - ggml_fp16_t * const wdata = (ggml_fp16_t *) params->wdata + 0; - - for (int64_t i02 = 0; i02 < ne02; i02++) { - for (int64_t i01 = 0; i01 < ne01; i01++) { - const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i02*nb02 + i01*nb01); - ggml_fp16_t * dst_data = wdata + i02*ew0*ne00; - for (int64_t i00 = 0; i00 < ne00; i00++) { - dst_data[i00*ew0 + i01] = src[i00]; - } - } - } - } - - // prepare source data (src1) - { - ggml_fp16_t * const wdata = (ggml_fp16_t *) params->wdata + ne02*ew0*ne00; - - for (int64_t i11 = 0; i11 < ne11; i11++) { - const float * const src = (float *)((char *) src1->data + i11*nb11); - ggml_fp16_t * dst_data = wdata; - for (int64_t i10 = 0; i10 < ne10; i10++) { - dst_data[(i10 + nh)*ew0 + i11] = GGML_FP32_TO_FP16(src[i10]); - } - } - } - + memset(dst->data, 0, ggml_nbytes(dst)); return; } @@ -13955,90 +14102,48 @@ static void ggml_compute_forward_conv_1d_s2_ph_f16_f32( return; } - // total rows in dst - const int nr = ne02; + // im2col: [N, IC, IL] => [N, OL, IC*K] + { + ggml_fp16_t * const wdata = (ggml_fp16_t *) dst->data; - // rows per thread - const int dr = (nr + nth - 1)/nth; + for (int64_t in = 0; in < N; in++) { + for (int64_t iol = 0; iol < OL; iol++) { + for (int64_t iic = ith; iic < IC; iic+=nth) { - // row range for this thread - const int ir0 = dr*ith; - const int ir1 = MIN(ir0 + dr, nr); + // micro kernel + ggml_fp16_t * dst_data = wdata + (in*OL + iol)*(IC*K); // [IC, K] + const float * const src_data = (float *)((char *) src1->data + in*nb12 + iic*nb11); // [IL] - for (int i1 = ir0; i1 < ir1; i1++) { - float * dst_data = (float *)((char *) dst->data + i1*nb1); - for (int64_t i0 = 0; i0 < ne10; i0 += 2) { - dst_data[i0/2] = 0; - for (int k = -nh; k <= nh; k++) { - float v = 0.0f; - ggml_vec_dot_f16(ew0, &v, - (ggml_fp16_t *) params->wdata + i1*ew0*ne00 + (nh + k)*ew0, - (ggml_fp16_t *) params->wdata + ne02*ew0*ne00 + (i0 + nh + k)*ew0); + for (int64_t ik = 0; ik < K; ik++) { + const int64_t iil = iol*s0 + ik*d0 - p0; - dst_data[i0/2] += v; + if (!(iil < 0 || iil >= IL)) { + dst_data[iic*K + ik] = GGML_FP32_TO_FP16(src_data[iil]); + } + } + } } } } } -static void ggml_compute_forward_conv_1d_s2_ph_f32( +// gemm: [N, OC, OL] = [OC, IC * K] x [N*OL, IC * K] +// src0: [OC, IC, K] +// src1: [N, OL, IC * K] +// result: [N, OC, OL] +static void ggml_compute_forward_conv_1d_stage_1_f16( const struct ggml_compute_params * params, const struct ggml_tensor * src0, const struct ggml_tensor * src1, struct ggml_tensor * dst) { - GGML_ASSERT(src0->type == GGML_TYPE_F32); - GGML_ASSERT(src1->type == GGML_TYPE_F32); + GGML_ASSERT(src0->type == GGML_TYPE_F16); + GGML_ASSERT(src1->type == GGML_TYPE_F16); GGML_ASSERT( dst->type == GGML_TYPE_F32); int64_t t0 = ggml_perf_time_us(); UNUSED(t0); - GGML_TENSOR_BINARY_OP_LOCALS - - const int ith = params->ith; - const int nth = params->nth; - - const int nk = ne00; - const int nh = nk/2; - - const int ew0 = ggml_up32(ne01); - - GGML_ASSERT(ne00 % 2 == 1); // TODO: support even kernel sizes - GGML_ASSERT(nb00 == sizeof(float)); - GGML_ASSERT(nb10 == sizeof(float)); - if (params->type == GGML_TASK_INIT) { - // TODO: fix this memset (wsize is overestimated) - memset(params->wdata, 0, params->wsize); - - // prepare kernel data (src0) - { - float * const wdata = (float *) params->wdata + 0; - - for (int64_t i02 = 0; i02 < ne02; i02++) { - for (int64_t i01 = 0; i01 < ne01; i01++) { - const float * const src = (float *)((char *) src0->data + i02*nb02 + i01*nb01); - float * dst_data = wdata + i02*ew0*ne00; - for (int64_t i00 = 0; i00 < ne00; i00++) { - dst_data[i00*ew0 + i01] = src[i00]; - } - } - } - } - - // prepare source data (src1) - { - float * const wdata = (float *) params->wdata + ne02*ew0*ne00; - - for (int64_t i11 = 0; i11 < ne11; i11++) { - const float * const src = (float *)((char *) src1->data + i11*nb11); - float * dst_data = wdata; - for (int64_t i10 = 0; i10 < ne10; i10++) { - dst_data[(i10 + nh)*ew0 + i11] = src[i10]; - } - } - } - return; } @@ -14046,71 +14151,293 @@ static void ggml_compute_forward_conv_1d_s2_ph_f32( return; } - // total rows in dst - const int nr = ne02; + GGML_TENSOR_BINARY_OP_LOCALS; - // rows per thread - const int dr = (nr + nth - 1)/nth; + GGML_ASSERT(nb00 == sizeof(ggml_fp16_t)); + GGML_ASSERT(nb10 == sizeof(ggml_fp16_t)); + GGML_ASSERT(nb0 == sizeof(float)); - // row range for this thread - const int ir0 = dr*ith; - const int ir1 = MIN(ir0 + dr, nr); + const int N = ne12; + const int OL = ne11; - for (int i1 = ir0; i1 < ir1; i1++) { - float * dst_data = (float *)((char *) dst->data + i1*nb1); - for (int64_t i0 = 0; i0 < ne10; i0 += 2) { - dst_data[i0/2] = 0; - for (int k = -nh; k <= nh; k++) { - float v = 0.0f; - ggml_vec_dot_f32(ew0, &v, - (float *) params->wdata + i1*ew0*ne00 + (nh + k)*ew0, - (float *) params->wdata + ne02*ew0*ne00 + (i0 + nh + k)*ew0); + const int OC = ne02; + const int IC = ne01; + const int K = ne00; - dst_data[i0/2] += v; - } - } + const int ith = params->ith; + const int nth = params->nth; + + int64_t m = OC; + int64_t n = OL; + int64_t k = IC * K; + + // [N, OC, OL] = [OC, IC * K] x [N*OL, IC * K] + for (int i = 0; i < N; i++) { + ggml_fp16_t * A = (ggml_fp16_t *)src0->data; // [m, k] + ggml_fp16_t * B = (ggml_fp16_t *)src1->data + i * m * k; // [n, k] + float * C = (float *)dst->data + i * m * n; // [m, n] + + gemm_f16_out_f32(m, n, k, A, B, C, ith, nth); } } -static void ggml_compute_forward_conv_1d_s2_ph( - const struct ggml_compute_params * params, - const struct ggml_tensor * src0, - const struct ggml_tensor * src1, - struct ggml_tensor * dst) { - switch (src0->type) { - case GGML_TYPE_F16: - { - ggml_compute_forward_conv_1d_s2_ph_f16_f32(params, src0, src1, dst); - } break; - case GGML_TYPE_F32: - { - ggml_compute_forward_conv_1d_s2_ph_f32(params, src0, src1, dst); - } break; - default: - { - GGML_ASSERT(false); - } break; - } -} - -// ggml_compute_forward_conv_1d - static void ggml_compute_forward_conv_1d( const struct ggml_compute_params * params, const struct ggml_tensor * src0, const struct ggml_tensor * src1, struct ggml_tensor * dst) { + switch(src0->type) { + case GGML_TYPE_F16: + { + ggml_compute_forward_conv_1d_f16_f32(params, src0, src1, dst); + } break; + case GGML_TYPE_F32: + { + ggml_compute_forward_conv_1d_f32(params, src0, src1, dst); + } break; + default: + { + GGML_ASSERT(false); + } break; + } +} + +static void ggml_compute_forward_conv_1d_stage_0( + const struct ggml_compute_params * params, + const struct ggml_tensor * src0, + const struct ggml_tensor * src1, + struct ggml_tensor * dst) { + switch(src0->type) { + case GGML_TYPE_F16: + { + ggml_compute_forward_conv_1d_stage_0_f32(params, src0, src1, dst); + } break; + default: + { + GGML_ASSERT(false); + } break; + } +} + +static void ggml_compute_forward_conv_1d_stage_1( + const struct ggml_compute_params * params, + const struct ggml_tensor * src0, + const struct ggml_tensor * src1, + struct ggml_tensor * dst) { + switch(src0->type) { + case GGML_TYPE_F16: + { + ggml_compute_forward_conv_1d_stage_1_f16(params, src0, src1, dst); + } break; + default: + { + GGML_ASSERT(false); + } break; + } +} + +// ggml_compute_forward_conv_transpose_1d + +static void ggml_compute_forward_conv_transpose_1d_f16_f32( + const struct ggml_compute_params * params, + const struct ggml_tensor * src0, + const struct ggml_tensor * src1, + struct ggml_tensor * dst) { + GGML_ASSERT(src0->type == GGML_TYPE_F16); + GGML_ASSERT(src1->type == GGML_TYPE_F32); + GGML_ASSERT( dst->type == GGML_TYPE_F32); + + int64_t t0 = ggml_perf_time_us(); + UNUSED(t0); + + GGML_TENSOR_BINARY_OP_LOCALS + + const int ith = params->ith; + const int nth = params->nth; + + const int nk = ne00*ne01*ne02; + + GGML_ASSERT(nb00 == sizeof(ggml_fp16_t)); + GGML_ASSERT(nb10 == sizeof(float)); + + if (params->type == GGML_TASK_INIT) { + memset(params->wdata, 0, params->wsize); + + // permute kernel data (src0) from (K x Cout x Cin) to (Cin x K x Cout) + { + ggml_fp16_t * const wdata = (ggml_fp16_t *) params->wdata + 0; + + for (int64_t i02 = 0; i02 < ne02; i02++) { + for (int64_t i01 = 0; i01 < ne01; i01++) { + const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i02*nb02 + i01*nb01); + ggml_fp16_t * dst_data = wdata + i01*ne00*ne02; + for (int64_t i00 = 0; i00 < ne00; i00++) { + dst_data[i00*ne02 + i02] = src[i00]; + } + } + } + } + + // permute source data (src1) from (L x Cin) to (Cin x L) + { + ggml_fp16_t * const wdata = (ggml_fp16_t *) params->wdata + nk; + ggml_fp16_t * dst_data = wdata; + + for (int64_t i11 = 0; i11 < ne11; i11++) { + const float * const src = (float *)((char *) src1->data + i11*nb11); + for (int64_t i10 = 0; i10 < ne10; i10++) { + dst_data[i10*ne11 + i11] = GGML_FP32_TO_FP16(src[i10]); + } + } + } + + return; + } + + if (params->type == GGML_TASK_FINALIZE) { + return; + } + const int32_t s0 = ((const int32_t*)(dst->op_params))[0]; - const int32_t p0 = ((const int32_t*)(dst->op_params))[1]; - const int32_t d0 = ((const int32_t*)(dst->op_params))[2]; - GGML_ASSERT(d0 == 1); // dilation not supported - GGML_ASSERT(p0 == src0->ne[0]/2); // only half padding supported - if (s0 == 1) { - ggml_compute_forward_conv_1d_s1_ph(params, src0, src1, dst); - } else if (s0 == 2) { - ggml_compute_forward_conv_1d_s2_ph(params, src0, src1, dst); - } else { - GGML_ASSERT(false); // only stride 1 and 2 supported + + // total rows in dst + const int nr = ne1; + + // rows per thread + const int dr = (nr + nth - 1)/nth; + + // row range for this thread + const int ir0 = dr*ith; + const int ir1 = MIN(ir0 + dr, nr); + + ggml_fp16_t * const wdata = (ggml_fp16_t *) params->wdata + 0; + ggml_fp16_t * const wdata_src = wdata + nk; + + for (int i1 = ir0; i1 < ir1; i1++) { + float * dst_data = (float *)((char *) dst->data + i1*nb1); + ggml_fp16_t * wdata_kernel = wdata + i1*ne02*ne00; + for (int i10 = 0; i10 < ne10; i10++) { + const int i1n = i10*ne11; + for (int i00 = 0; i00 < ne00; i00++) { + float v = 0; + ggml_vec_dot_f16(ne02, &v, + (ggml_fp16_t *) wdata_src + i1n, + (ggml_fp16_t *) wdata_kernel + i00*ne02); + dst_data[i10*s0 + i00] += v; + } + } + } +} + +static void ggml_compute_forward_conv_transpose_1d_f32( + const struct ggml_compute_params * params, + const struct ggml_tensor * src0, + const struct ggml_tensor * src1, + struct ggml_tensor * dst) { + GGML_ASSERT(src0->type == GGML_TYPE_F32); + GGML_ASSERT(src1->type == GGML_TYPE_F32); + GGML_ASSERT( dst->type == GGML_TYPE_F32); + + int64_t t0 = ggml_perf_time_us(); + UNUSED(t0); + + GGML_TENSOR_BINARY_OP_LOCALS + + const int ith = params->ith; + const int nth = params->nth; + + const int nk = ne00*ne01*ne02; + + GGML_ASSERT(nb00 == sizeof(float)); + GGML_ASSERT(nb10 == sizeof(float)); + + if (params->type == GGML_TASK_INIT) { + memset(params->wdata, 0, params->wsize); + + // prepare kernel data (src0) from (K x Cout x Cin) to (Cin x K x Cout) + { + float * const wdata = (float *) params->wdata + 0; + + for (int64_t i02 = 0; i02 < ne02; i02++) { + for (int64_t i01 = 0; i01 < ne01; i01++) { + const float * const src = (float *)((char *) src0->data + i02*nb02 + i01*nb01); + float * dst_data = wdata + i01*ne00*ne02; + for (int64_t i00 = 0; i00 < ne00; i00++) { + dst_data[i01*ne00*ne02 + i00*ne02 + i02] = src[i00]; + } + } + } + } + + // prepare source data (src1) + { + float * const wdata = (float *) params->wdata + nk; + float * dst_data = wdata; + + for (int64_t i11 = 0; i11 < ne11; i11++) { + const float * const src = (float *)((char *) src1->data + i11*nb11); + for (int64_t i10 = 0; i10 < ne10; i10++) { + dst_data[i10*ne11 + i11] = src[i10]; + } + } + } + + return; + } + + if (params->type == GGML_TASK_FINALIZE) { + return; + } + + const int32_t s0 = ((const int32_t*)(dst->op_params))[0]; + + // total rows in dst + const int nr = ne1; + + // rows per thread + const int dr = (nr + nth - 1)/nth; + + // row range for this thread + const int ir0 = dr*ith; + const int ir1 = MIN(ir0 + dr, nr); + + float * const wdata = (float *) params->wdata + 0; + float * const wdata_src = wdata + nk; + + for (int i1 = ir0; i1 < ir1; i1++) { + float * dst_data = (float *)((char *) dst->data + i1*nb1); + float * wdata_kernel = wdata + i1*ne02*ne00; + for (int i10 = 0; i10 < ne10; i10++) { + const int i1n = i10*ne11; + for (int i00 = 0; i00 < ne00; i00++) { + float v = 0; + ggml_vec_dot_f32(ne02, &v, + wdata_src + i1n, + wdata_kernel + i00*ne02); + dst_data[i10*s0 + i00] += v; + } + } + } +} + +static void ggml_compute_forward_conv_transpose_1d( + const struct ggml_compute_params * params, + const struct ggml_tensor * src0, + const struct ggml_tensor * src1, + struct ggml_tensor * dst) { + switch (src0->type) { + case GGML_TYPE_F16: + { + ggml_compute_forward_conv_transpose_1d_f16_f32(params, src0, src1, dst); + } break; + case GGML_TYPE_F32: + { + ggml_compute_forward_conv_transpose_1d_f32(params, src0, src1, dst); + } break; + default: + { + GGML_ASSERT(false); + } break; } } @@ -14156,20 +14483,22 @@ static void ggml_compute_forward_conv_2d_f16_f32( { ggml_fp16_t * const wdata = (ggml_fp16_t *) params->wdata + 0; - for (int i12 = 0; i12 < ne12; i12++) { - const float * const src = (float *)((char *) src1->data + i12*nb12); - ggml_fp16_t * dst_data = wdata; + for (int i13 = 0; i13 < ne13; i13++) { + for (int i12 = 0; i12 < ne12; i12++) { + const float * const src = (float *)((char *) src1->data + i13*nb13 + i12*nb12); + ggml_fp16_t * dst_data = wdata + i13*(ne1*ne0*ew0); - for (int i1 = 0; i1 < ne1; i1++) { - for (int i0 = 0; i0 < ne0; i0++) { - for (int ik1 = 0; ik1 < nk1; ik1++) { - for (int ik0 = 0; ik0 < nk0; ik0++) { - const int idx0 = i0*s0 + ik0*d0 - p0; - const int idx1 = i1*s1 + ik1*d1 - p1; + for (int i1 = 0; i1 < ne1; i1++) { + for (int i0 = 0; i0 < ne0; i0++) { + for (int ik1 = 0; ik1 < nk1; ik1++) { + for (int ik0 = 0; ik0 < nk0; ik0++) { + const int idx0 = i0*s0 + ik0*d0 - p0; + const int idx1 = i1*s1 + ik1*d1 - p1; - if (!(idx1 < 0 || idx1 >= ne11 || idx0 < 0 || idx0 >= ne10)) { - dst_data[(i1*ne0 + i0)*ew0 + i12*(nk0*nk1) + ik1*nk0 + ik0] = - GGML_FP32_TO_FP16(src[idx1*ne10 + idx0]); + if (!(idx1 < 0 || idx1 >= ne11 || idx0 < 0 || idx0 >= ne10)) { + dst_data[(i1*ne0 + i0)*ew0 + i12*(nk0*nk1) + ik1*nk0 + ik0] = + GGML_FP32_TO_FP16(src[idx1*ne10 + idx0]); + } } } } @@ -16452,6 +16781,18 @@ static void ggml_compute_forward(struct ggml_compute_params * params, struct ggm { ggml_compute_forward_conv_1d(params, tensor->src[0], tensor->src[1], tensor); } break; + case GGML_OP_CONV_1D_STAGE_0: + { + ggml_compute_forward_conv_1d_stage_0(params, tensor->src[0], tensor->src[1], tensor); + } break; + case GGML_OP_CONV_1D_STAGE_1: + { + ggml_compute_forward_conv_1d_stage_1(params, tensor->src[0], tensor->src[1], tensor); + } break; + case GGML_OP_CONV_TRANSPOSE_1D: + { + ggml_compute_forward_conv_transpose_1d(params, tensor->src[0], tensor->src[1], tensor); + } break; case GGML_OP_CONV_2D: { ggml_compute_forward_conv_2d(params, tensor->src[0], tensor->src[1], tensor); @@ -17377,10 +17718,22 @@ static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor { GGML_ASSERT(false); // TODO: not implemented } break; + case GGML_OP_CONV_1D_STAGE_0: + { + GGML_ASSERT(false); // TODO: not implemented + } break; + case GGML_OP_CONV_1D_STAGE_1: + { + GGML_ASSERT(false); // TODO: not implemented + } break; case GGML_OP_CONV_2D: { GGML_ASSERT(false); // TODO: not implemented } break; + case GGML_OP_CONV_TRANSPOSE_1D: + { + GGML_ASSERT(false); // TODO: not implemented + } break; case GGML_OP_CONV_TRANSPOSE_2D: { GGML_ASSERT(false); // TODO: not implemented @@ -18222,21 +18575,68 @@ struct ggml_cplan ggml_graph_plan(struct ggml_cgraph * cgraph, int n_threads) { GGML_ASSERT(node->src[1]->ne[2] == 1); GGML_ASSERT(node->src[1]->ne[3] == 1); + const int64_t ne00 = node->src[0]->ne[0]; + const int64_t ne01 = node->src[0]->ne[1]; + const int64_t ne02 = node->src[0]->ne[2]; + + const int64_t ne10 = node->src[1]->ne[0]; + const int64_t ne11 = node->src[1]->ne[1]; + + const int64_t ne0 = node->ne[0]; + const int64_t ne1 = node->ne[1]; + const int64_t nk = ne00; + const int64_t ew0 = nk * ne01; + + UNUSED(ne02); + UNUSED(ne10); + UNUSED(ne11); + size_t cur = 0; - const int nk = node->src[0]->ne[0]; if (node->src[0]->type == GGML_TYPE_F16 && - node->src[1]->type == GGML_TYPE_F32) { - cur = sizeof(ggml_fp16_t)*( - nk*ggml_up32(node->src[0]->ne[1])*node->src[0]->ne[2] + - ( 2*(nk/2) + node->src[1]->ne[0])*node->src[1]->ne[1] - ); + node->src[1]->type == GGML_TYPE_F32) { + cur = sizeof(ggml_fp16_t)*(ne0*ne1*ew0); } else if (node->src[0]->type == GGML_TYPE_F32 && - node->src[1]->type == GGML_TYPE_F32) { - cur = sizeof(float)*( - nk*ggml_up32(node->src[0]->ne[1])*node->src[0]->ne[2] + - ( 2*(nk/2) + node->src[1]->ne[0])*node->src[1]->ne[1] - ); + node->src[1]->type == GGML_TYPE_F32) { + cur = sizeof(float)*(ne0*ne1*ew0); + } else { + GGML_ASSERT(false); + } + + work_size = MAX(work_size, cur); + } break; + case GGML_OP_CONV_1D_STAGE_0: + { + n_tasks = n_threads; + } break; + case GGML_OP_CONV_1D_STAGE_1: + { + n_tasks = n_threads; + } break; + case GGML_OP_CONV_TRANSPOSE_1D: + { + n_tasks = n_threads; + + GGML_ASSERT(node->src[0]->ne[3] == 1); + GGML_ASSERT(node->src[1]->ne[2] == 1); + GGML_ASSERT(node->src[1]->ne[3] == 1); + + const int64_t ne00 = node->src[0]->ne[0]; // K + const int64_t ne01 = node->src[0]->ne[1]; // Cout + const int64_t ne02 = node->src[0]->ne[2]; // Cin + + const int64_t ne10 = node->src[1]->ne[0]; // L + const int64_t ne11 = node->src[1]->ne[1]; // Cin + + size_t cur = 0; + if (node->src[0]->type == GGML_TYPE_F16 && + node->src[1]->type == GGML_TYPE_F32) { + cur += sizeof(ggml_fp16_t)*ne00*ne01*ne02; + cur += sizeof(ggml_fp16_t)*ne10*ne11; + } else if (node->src[0]->type == GGML_TYPE_F32 && + node->src[1]->type == GGML_TYPE_F32) { + cur += sizeof(float)*ne00*ne01*ne02; + cur += sizeof(float)*ne10*ne11; } else { GGML_ASSERT(false); } @@ -19362,7 +19762,7 @@ static enum ggml_opt_result ggml_opt_adam( if (callback) { callback(callback_data, accum_step, &sched, &cancel); if (cancel) { - break; + return GGML_OPT_CANCEL; } } // ggml_graph_reset (gf); @@ -19371,9 +19771,6 @@ static enum ggml_opt_result ggml_opt_adam( ggml_opt_acc_grad(np, ps, g, accum_norm); fx += ggml_get_f32_1d(f, 0); } - if (cancel) { - return GGML_OPT_DID_NOT_CONVERGE; - } fx *= accum_norm; opt->adam.fx_prev = fx; @@ -19399,9 +19796,6 @@ static enum ggml_opt_result ggml_opt_adam( // run the optimizer for (int t = 0; t < params.adam.n_iter; ++t) { - if (cancel) { - break; - } opt->iter = iter0 + t + 1; GGML_PRINT_DEBUG ("=== iter %d ===\n", t); @@ -19459,7 +19853,7 @@ static enum ggml_opt_result ggml_opt_adam( if (callback) { callback(callback_data, accum_step, &sched, &cancel); if (cancel) { - break; + return GGML_OPT_CANCEL;; } } // ggml_graph_reset (gf); @@ -19468,9 +19862,6 @@ static enum ggml_opt_result ggml_opt_adam( ggml_opt_acc_grad(np, ps, g, accum_norm); fx += ggml_get_f32_1d(f, 0); } - if (cancel) { - break; - } fx *= accum_norm; opt->loss_after = fx; @@ -19589,7 +19980,7 @@ static enum ggml_opt_result linesearch_backtracking( finit = *fx; dgtest = params->lbfgs.ftol*dginit; - while (!*cancel) { + while (true) { ggml_vec_cpy_f32(nx, x, xp); ggml_vec_mad_f32(nx, x, d, *step); @@ -19605,7 +19996,7 @@ static enum ggml_opt_result linesearch_backtracking( float sched = 0; callback(callback_data, accum_step, &sched, cancel); if (*cancel) { - break; + return GGML_OPT_CANCEL; } } // ggml_graph_reset (gf); @@ -19614,9 +20005,6 @@ static enum ggml_opt_result linesearch_backtracking( ggml_opt_acc_grad(np, ps, g, accum_norm); *fx += ggml_get_f32_1d(f, 0); } - if (*cancel) { - break; - } *fx *= accum_norm; } @@ -19749,7 +20137,7 @@ static enum ggml_opt_result ggml_opt_lbfgs( float sched = 0; callback(callback_data, accum_step, &sched, &cancel); if (cancel) { - break; + return GGML_OPT_CANCEL; } } // ggml_graph_reset (gf); @@ -19758,9 +20146,6 @@ static enum ggml_opt_result ggml_opt_lbfgs( ggml_opt_acc_grad(np, ps, g, accum_norm); fx += ggml_get_f32_1d(f, 0); } - if (cancel) { - return GGML_OPT_DID_NOT_CONVERGE; - } fx *= accum_norm; opt->loss_before = fx; @@ -19820,8 +20205,8 @@ static enum ggml_opt_result ggml_opt_lbfgs( ggml_vec_cpy_f32(nx, gp, g); ls = linesearch_backtracking(¶ms, nx, x, &fx, g, d, step, xp, f, gb, &cplan, np, ps, &cancel, callback, callback_data); - if (!cancel) { - break; + if (cancel) { + return GGML_OPT_CANCEL; } if (ls < 0) { diff --git a/ggml.h b/ggml.h index 460857fa4..a9d4e33d9 100644 --- a/ggml.h +++ b/ggml.h @@ -401,10 +401,14 @@ extern "C" { GGML_OP_CLAMP, GGML_OP_CONV_1D, GGML_OP_CONV_2D, + GGML_OP_CONV_TRANSPOSE_1D, GGML_OP_CONV_TRANSPOSE_2D, GGML_OP_POOL_1D, GGML_OP_POOL_2D, + GGML_OP_CONV_1D_STAGE_0, // internal + GGML_OP_CONV_1D_STAGE_1, // internal + GGML_OP_UPSCALE, // nearest interpolate GGML_OP_FLASH_ATTN, @@ -1386,6 +1390,14 @@ extern "C" { int s, int d); + GGML_API struct ggml_tensor * ggml_conv_transpose_1d( + struct ggml_context * ctx, + struct ggml_tensor * a, + struct ggml_tensor * b, + int s0, + int p0, + int d0); + GGML_API struct ggml_tensor * ggml_conv_2d( struct ggml_context * ctx, struct ggml_tensor * a, @@ -1759,6 +1771,7 @@ extern "C" { GGML_OPT_NO_CONTEXT, GGML_OPT_INVALID_WOLFE, GGML_OPT_FAIL, + GGML_OPT_CANCEL, GGML_LINESEARCH_FAIL = -128, GGML_LINESEARCH_MINIMUM_STEP, diff --git a/k_quants.c b/k_quants.c index a1e687dd9..558f5fda8 100644 --- a/k_quants.c +++ b/k_quants.c @@ -69,7 +69,6 @@ inline static int32_t vaddvq_s32(int32x4_t v) { // 2-6 bit quantization in super-blocks // - // // ===================== Helper functions // @@ -348,7 +347,6 @@ void quantize_row_q2_K_reference(const float * restrict x, block_q2_K * restrict const float q4scale = 15.f; for (int i = 0; i < nb; i++) { - float max_scale = 0; // as we are deducting the min, scales are always positive float max_min = 0; for (int j = 0; j < QK_K/16; ++j) { diff --git a/tests/test-grad0.cpp b/tests/test-grad0.cpp index c3cd73bcb..0a559b27a 100644 --- a/tests/test-grad0.cpp +++ b/tests/test-grad0.cpp @@ -208,26 +208,6 @@ static struct ggml_tensor * get_random_tensor_i32( return result; } -static void print_elements(const char* label, const struct ggml_tensor * t) { - if (!t) { - printf("%s: %s = null\n", __func__, label); - return; - } - const int nelements = ggml_nelements(t); - printf("%s: %s = [", __func__, label); - for (int k = 0; k < nelements; ++k) { - if (k > 0) { printf(", "); } - printf("%.5f", ggml_get_f32_1d(t, k)); - } - printf("] shape: ["); - for (int k = 0; k < t->n_dims; ++k) { - if (k > 0) { printf(", "); } - printf("%d", (int)t->ne[k]); - } - printf("]\n"); - -} - static bool check_gradient( const char * op_name, struct ggml_context * ctx0, diff --git a/tests/test-opt.cpp b/tests/test-opt.cpp index fb4e0be98..bb8af5962 100644 --- a/tests/test-opt.cpp +++ b/tests/test-opt.cpp @@ -40,27 +40,6 @@ static float frand(void) { return (float)rand()/(float)RAND_MAX; } -static int irand(int n) { - return rand()%n; -} - -static void get_random_dims(int64_t * dims, int ndims) { - dims[0] = dims[1] = dims[2] = dims[3] = 1; - - for (int i = 0; i < ndims; i++) { - dims[i] = 1 + irand(4); - } -} - -static void get_random_dims_minmax(int64_t * dims, int ndims, int min, int max) { - dims[0] = dims[1] = dims[2] = dims[3] = 1; - - for (int i = 0; i < ndims; i++) { - dims[i] = min + irand(max-min); - } -} - - static struct ggml_tensor * get_random_tensor( struct ggml_context * ctx0, int ndims, int64_t ne[], float fmin, float fmax ) { @@ -106,14 +85,6 @@ static struct ggml_tensor * get_random_tensor( return result; } -static float get_element(const struct ggml_tensor * t, int idx) { - return ((float *)t->data)[idx]; -} - -static void set_element(struct ggml_tensor * t, int idx, float value) { - ((float *)t->data)[idx] = value; -} - int main(void) { struct ggml_init_params params = { /* .mem_size = */ 1024*1024*1024, diff --git a/tests/test-quantize-perf.cpp b/tests/test-quantize-perf.cpp index 01aa69877..88fac0e23 100644 --- a/tests/test-quantize-perf.cpp +++ b/tests/test-quantize-perf.cpp @@ -76,22 +76,21 @@ static void * align_with_offset(void * ptr, int offset) { return (char *) std::align(MAX_ALIGNMENT, MAX_ALIGNMENT, ptr, dummy_size) + offset; } -static void benchmark_function(size_t size, size_t q_size, int64_t iterations, const std::function & function) { +static void benchmark_function(size_t size, size_t q_size, int64_t iterations, const std::function & func) { int64_t min_time_us = INT64_MAX; int64_t total_time_us = 0; int64_t min_time_cycles = INT64_MAX; int64_t total_time_cycles = 0; for (int i = 0; i < WARMUP; i++) { - function(); + func(); } - for (int i = 0; i < iterations; i++) { const int64_t start_time = ggml_time_us(); const int64_t start_cycles = cpu_cycles(); - function(); + func(); const int64_t end_cycles = cpu_cycles(); const int64_t end_time = ggml_time_us(); @@ -245,15 +244,15 @@ int main(int argc, char * argv[]) { std::vector test_data1_v(largest*4 + MAX_ALIGNMENT*2); std::vector test_data2_v(largest*4 + MAX_ALIGNMENT*2); - std::vector test_q1_v(largest*4 + MAX_ALIGNMENT*2); - std::vector test_q2_v(largest*4 + MAX_ALIGNMENT*2); - std::vector test_out_v(largest*4 + MAX_ALIGNMENT*2); + std::vector test_q1_v (largest*4 + MAX_ALIGNMENT*2); + std::vector test_q2_v (largest*4 + MAX_ALIGNMENT*2); + std::vector test_out_v (largest*4 + MAX_ALIGNMENT*2); float * test_data1 = (float *) align_with_offset(test_data1_v.data(), params.alignment_offset); float * test_data2 = (float *) align_with_offset(test_data2_v.data(), params.alignment_offset); - float * test_q1 = (float *) align_with_offset(test_q1_v.data(), params.alignment_offset); - float * test_q2 = (float *) align_with_offset(test_q2_v.data(), params.alignment_offset); - float * test_out = (float *) align_with_offset(test_out_v.data(), params.alignment_offset); + float * test_q1 = (float *) align_with_offset(test_q1_v.data(), params.alignment_offset); + float * test_q2 = (float *) align_with_offset(test_q2_v.data(), params.alignment_offset); + float * test_out = (float *) align_with_offset(test_out_v.data(), params.alignment_offset); generate_data(0, largest, test_data1); generate_data(1, largest, test_data2); @@ -283,7 +282,7 @@ int main(int argc, char * argv[]) { printf(" quantize_row_q_reference\n"); for (size_t size : params.test_sizes) { printf(" %zu values (%.2f MB)\n", size, 4*size/(float)(1024*1024)); - auto quantize_fn = [&](void ) { + auto quantize_fn = [&](void) -> float { qfns.from_float_reference(test_data1, test_q1, size); return test_q1[0]; }; @@ -297,7 +296,7 @@ int main(int argc, char * argv[]) { printf(" quantize_row_q\n"); for (size_t size : params.test_sizes) { printf(" %zu values (%.2f MB)\n", size, 4*size/(float)(1024*1024)); - auto quantize_fn = [&](void ) { + auto quantize_fn = [&](void) -> float { qfns.from_float(test_data1, test_q1, size); return test_q1[0]; }; @@ -312,7 +311,7 @@ int main(int argc, char * argv[]) { qfns.from_float(test_data1, test_q1, largest); for (size_t size : params.test_sizes) { printf(" %zu values (%.2f MB)\n", size, 4*size/(float)(1024*1024)); - auto quantize_fn = [&](void ) { + auto quantize_fn = [&](void) -> float { qfns.to_float(test_q1, test_out, size); return test_out[0]; }; @@ -326,7 +325,7 @@ int main(int argc, char * argv[]) { printf(" quantize_row_q_dot\n"); for (size_t size : params.test_sizes) { printf(" %zu values (%.2f MB)\n", size, 4*size/(float)(1024*1024)); - auto quantize_fn = [&](void ) { + auto quantize_fn = [&](void) -> float { auto vdot = ggml_internal_get_type_traits(qfns.vec_dot_type); vdot.from_float(test_data1, test_q1, size); return test_q1[0]; @@ -343,7 +342,7 @@ int main(int argc, char * argv[]) { qfns.from_float(test_data2, test_q2, largest); for (size_t size : params.test_sizes) { printf(" %zu values (%.2f MB)\n", size, 4*size/(float)(1024*1024)); - auto quantize_fn = [&](void ) { + auto quantize_fn = [&](void) -> float { float result; qfns.vec_dot(size, &result, test_q1, test_q2); return result; From f8c90cdbaa729e64493164c1aba7ea80da7b716f Mon Sep 17 00:00:00 2001 From: ds5t5 <145942675+ds5t5@users.noreply.github.com> Date: Wed, 4 Oct 2023 06:23:39 -0700 Subject: [PATCH 37/73] llm : add Refact model (#3329) * add refact model * resolve comments * rebase to the latest * solve alibi cpu error --------- Co-authored-by: Georgi Gerganov --- convert-refact-hf-to-gguf.py | 318 +++++++++++++++++++++++++++++ ggml.c | 2 - gguf-py/gguf/gguf.py | 31 ++- llama.cpp | 382 ++++++++++++++++++++++++++++++++++- 4 files changed, 723 insertions(+), 10 deletions(-) create mode 100755 convert-refact-hf-to-gguf.py diff --git a/convert-refact-hf-to-gguf.py b/convert-refact-hf-to-gguf.py new file mode 100755 index 000000000..e0cd417db --- /dev/null +++ b/convert-refact-hf-to-gguf.py @@ -0,0 +1,318 @@ +#!/usr/bin/env python3 +# HF refact--> gguf conversion + +from __future__ import annotations + +import argparse +import json +import os +import sys +from pathlib import Path + +import numpy as np +import torch +from transformers import AutoTokenizer # type: ignore[import] + +if "NO_LOCAL_GGUF" not in os.environ: + sys.path.insert(1, str(Path(__file__).parent / "gguf-py" / "gguf")) +import gguf + + +def bytes_to_unicode(): + # ref: https://github.com/openai/gpt-2/blob/master/src/encoder.py + """ + Returns list of utf-8 byte and a corresponding list of unicode strings. + The reversible bpe codes work on unicode strings. + This means you need a large # of unicode characters in your vocab if you want to avoid UNKs. + When you're at something like a 10B token dataset you end up needing around 5K for decent coverage. + This is a significant percentage of your normal, say, 32K bpe vocab. + To avoid that, we want lookup tables between utf-8 bytes and unicode strings. + And avoids mapping to whitespace/control characters the bpe code barfs on. + """ + bs = ( + list(range(ord("!"), ord("~") + 1)) + + list(range(ord("¡"), ord("¬") + 1)) + + list(range(ord("®"), ord("ÿ") + 1)) + ) + cs = bs[:] + n = 0 + for b in range(2**8): + if b not in bs: + bs.append(b) + cs.append(2**8 + n) + n += 1 + return dict(zip(bs, (chr(n) for n in cs))) + + +def count_model_parts(dir_model: Path) -> int: + num_parts = 0 + for filename in os.listdir(dir_model): + if filename.startswith("pytorch_model-"): + num_parts += 1 + + if num_parts > 0: + print("gguf: found " + str(num_parts) + " model parts") + return num_parts + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="Convert a Refact model to a GGML compatible file" + ) + parser.add_argument( + "--vocab-only", + action="store_true", + help="extract only the vocab", + ) + parser.add_argument( + "--outfile", + type=Path, + help="path to write to; default: based on input", + ) + parser.add_argument( + "model", + type=Path, + help="directory containing model file, or model file itself (*.bin)", + ) + parser.add_argument( + "ftype", + type=int, + choices=[0, 1], + default=1, + nargs="?", + help="output format - use 0 for float32, 1 for float16", + ) + return parser.parse_args() + + +args = parse_args() + +dir_model = args.model +ftype = args.ftype +if not dir_model.is_dir(): + print(f"Error: {args.model} is not a directory", file=sys.stderr) + sys.exit(1) + +# possible tensor data types +# ftype == 0 -> float32 +# ftype == 1 -> float16 + +# map from ftype to string +ftype_str = ["f32", "f16"] + +if args.outfile is not None: + fname_out = args.outfile +else: + # output in the same directory as the model by default + fname_out = dir_model / f"ggml-model-{ftype_str[ftype]}.gguf" + +print("gguf: loading model " + dir_model.name) + +with open(dir_model / "config.json", "r", encoding="utf-8") as f: + hparams = json.load(f) + +if hparams["architectures"][0] != "GPTRefactForCausalLM": + print("Model architecture not supported: " + hparams["architectures"][0]) + + sys.exit(1) + +# get number of model parts +num_parts = count_model_parts(dir_model) + +ARCH = gguf.MODEL_ARCH.REFACT +gguf_writer = gguf.GGUFWriter(fname_out, gguf.MODEL_ARCH_NAMES[ARCH]) + +print("gguf: get model metadata") + +# Get refact feed forward dimension +hidden_dim = hparams["n_embd"] +inner_dim = 4 * hidden_dim +hidden_dim = int(2 * inner_dim / 3) +multiple_of = 256 +ff_dim = multiple_of * ((hidden_dim + multiple_of - 1) // multiple_of) + +block_count = hparams["n_layer"] + +gguf_writer.add_name("Refact") +# refact uses Alibi. So this is from config.json which might be used by training. +gguf_writer.add_context_length(hparams["n_positions"]) +gguf_writer.add_embedding_length(hparams["n_embd"]) + +gguf_writer.add_feed_forward_length(ff_dim) +gguf_writer.add_block_count(block_count) +gguf_writer.add_head_count(hparams["n_head"]) +gguf_writer.add_head_count_kv(1) +gguf_writer.add_layer_norm_rms_eps(hparams["layer_norm_epsilon"]) +gguf_writer.add_file_type(ftype) + +# TOKENIZATION + +print("gguf: get tokenizer metadata") + +tokens: list[bytearray] = [] +scores: list[float] = [] +toktypes: list[int] = [] + +tokenizer_json_file = dir_model / "tokenizer.json" +if not tokenizer_json_file.is_file(): + print(f"Error: Missing {tokenizer_json_file}", file=sys.stderr) + sys.exit(1) + +# gpt2 tokenizer +gguf_writer.add_tokenizer_model("gpt2") + +with open(tokenizer_json_file, "r", encoding="utf-8") as f: + tokenizer_json = json.load(f) + +print("gguf: get gpt2 tokenizer vocab") + +# The number of tokens in tokenizer.json can differ from the expected vocab size. +# This causes downstream issues with mismatched tensor sizes when running the inference +vocab_size = ( + hparams["vocab_size"] + if "vocab_size" in hparams + else len(tokenizer_json["model"]["vocab"]) +) + +tokenizer = AutoTokenizer.from_pretrained(dir_model, trust_remote_code=True) + +reverse_vocab = {id: encoded_tok for encoded_tok, id in tokenizer.vocab.items()} +byte_encoder = bytes_to_unicode() +byte_decoder = {v: k for k, v in byte_encoder.items()} + +for i in range(vocab_size): + if i in reverse_vocab: + text = reverse_vocab[i] + try: + text = bytearray([byte_decoder[c] for c in reverse_vocab[i]]) + except KeyError: + text = bytearray() + for c in reverse_vocab[i]: + if ord(c) < 256: # single byte character + text.append(byte_decoder[ord(c)]) + else: # multibyte special token character + text.extend(c.encode("utf-8")) + else: + print(f"Key {i} not in tokenizer vocabulary. Padding with an arbitrary token.") + pad_token = f"[PAD{i}]".encode("utf8") + text = bytearray(pad_token) + + tokens.append(text) + scores.append(0.0) # dymmy + toktypes.append(gguf.TokenType.NORMAL) # dummy + +gguf_writer.add_token_list(tokens) +gguf_writer.add_token_scores(scores) +gguf_writer.add_token_types(toktypes) + +special_vocab = gguf.SpecialVocab(dir_model, load_merges=True) +special_vocab.add_to_gguf(gguf_writer) + +# TENSORS + +tensor_map = gguf.get_tensor_name_map(ARCH, block_count) + +# params for qkv transform +n_head = hparams["n_head"] +n_head_kv = 1 + +head_dim = hparams["n_embd"] // n_head + +# tensor info +print("gguf: get tensor metadata") + +if num_parts == 0: + part_names = iter(("pytorch_model.bin",)) +else: + part_names = ( + f"pytorch_model-{n:05}-of-{num_parts:05}.bin" for n in range(1, num_parts + 1) + ) +for part_name in part_names: + if args.vocab_only: + break + print("gguf: loading model part '" + part_name + "'") + model_part = torch.load(dir_model / part_name, map_location="cpu") + + for i in range(block_count): + if f"transformer.h.{i}.attn.kv.weight" in model_part: + data = model_part[f"transformer.h.{i}.attn.kv.weight"] + model_part[f"model.layers.{i}.self_attn.k_proj.weight"] = data[ + : n_head_kv * head_dim + ] + model_part[f"model.layers.{i}.self_attn.v_proj.weight"] = data[ + n_head_kv * head_dim : + ] + del model_part[f"transformer.h.{i}.attn.kv.weight"] + if f"transformer.h.{i}.attn.q.weight" in model_part: + model_part[f"model.layers.{i}.self_attn.q_proj.weight"] = model_part[ + f"transformer.h.{i}.attn.q.weight" + ] + del model_part[f"transformer.h.{i}.attn.q.weight"] + if f"transformer.h.{i}.mlp.gate_up_proj.weight" in model_part: + data = model_part[f"transformer.h.{i}.mlp.gate_up_proj.weight"] + model_part[f"model.layers.{i}.mlp.gate_proj.weight"] = data[:ff_dim] + model_part[f"model.layers.{i}.mlp.up_proj.weight"] = data[ff_dim:] + del model_part[f"transformer.h.{i}.mlp.gate_up_proj.weight"] + + for name in model_part.keys(): + data = model_part[name] + + old_dtype = data.dtype + + # convert any unsupported data types to float32 + if data.dtype != torch.float16 and data.dtype != torch.float32: + data = data.to(torch.float32) + + data = data.squeeze().numpy() + + # map tensor names + new_name = tensor_map.get_name(name, try_suffixes=(".weight",)) + if new_name is None: + print("Can not map tensor '" + name + "'") + sys.exit() + + n_dims = len(data.shape) + data_dtype = data.dtype + + # if f32 desired, convert any float16 to float32 + if ftype == 0 and data_dtype == np.float16: + data = data.astype(np.float32) + + # TODO: Why cant we use these float16 as-is? There should be not reason to store float16 as float32 + if ftype == 1 and data_dtype == np.float16 and n_dims == 1: + data = data.astype(np.float32) + + # if f16 desired, convert any float32 2-dim weight tensors to float16 + if ( + ftype == 1 + and data_dtype == np.float32 + and name.endswith(".weight") + and n_dims == 2 + ): + data = data.astype(np.float16) + + print( + new_name + + ", n_dims = " + + str(n_dims) + + ", " + + str(old_dtype) + + " --> " + + str(data.dtype) + ) + + gguf_writer.add_tensor(new_name, data) + + +print("gguf: write header") +gguf_writer.write_header_to_file() +print("gguf: write metadata") +gguf_writer.write_kv_data_to_file() +if not args.vocab_only: + print("gguf: write tensors") + gguf_writer.write_tensors_to_file() + +gguf_writer.close() + +print(f"gguf: model successfully exported to '{fname_out}'") +print("") diff --git a/ggml.c b/ggml.c index 4a94b0f33..f56d6ac72 100644 --- a/ggml.c +++ b/ggml.c @@ -13082,7 +13082,6 @@ static void ggml_compute_forward_alibi_f32( return; } - const int n_past = ((int32_t *) dst->op_params)[0]; const int n_head = ((int32_t *) dst->op_params)[1]; float max_bias; memcpy(&max_bias, (int32_t *) dst->op_params + 2, sizeof(float)); @@ -13103,7 +13102,6 @@ static void ggml_compute_forward_alibi_f32( //const int nb3 = src0->nb[3]; GGML_ASSERT(nb0 == sizeof(float)); - GGML_ASSERT(ne1 + n_past == ne0); GGML_ASSERT(n_head == ne2); // add alibi to src0 (KQ_scaled) diff --git a/gguf-py/gguf/gguf.py b/gguf-py/gguf/gguf.py index c975da0cb..a2c570d7e 100644 --- a/gguf-py/gguf/gguf.py +++ b/gguf-py/gguf/gguf.py @@ -85,6 +85,7 @@ class MODEL_ARCH(IntEnum): GPTNEOX : int = auto() MPT : int = auto() STARCODER : int = auto() + REFACT : int = auto() BERT : int = auto() @@ -118,6 +119,7 @@ MODEL_ARCH_NAMES: dict[MODEL_ARCH, str] = { MODEL_ARCH.GPTNEOX: "gptneox", MODEL_ARCH.MPT: "mpt", MODEL_ARCH.STARCODER: "starcoder", + MODEL_ARCH.REFACT: "refact", MODEL_ARCH.BERT: "bert", } @@ -247,6 +249,20 @@ MODEL_TENSORS: dict[MODEL_ARCH, list[MODEL_TENSOR]] = { MODEL_TENSOR.FFN_DOWN, MODEL_TENSOR.FFN_UP, ], + MODEL_ARCH.REFACT: [ + MODEL_TENSOR.TOKEN_EMBD, + MODEL_TENSOR.OUTPUT_NORM, + MODEL_TENSOR.OUTPUT, + MODEL_TENSOR.ATTN_NORM, + MODEL_TENSOR.ATTN_Q, + MODEL_TENSOR.ATTN_K, + MODEL_TENSOR.ATTN_V, + MODEL_TENSOR.ATTN_OUT, + MODEL_TENSOR.FFN_NORM, + MODEL_TENSOR.FFN_GATE, + MODEL_TENSOR.FFN_DOWN, + MODEL_TENSOR.FFN_UP, + ], MODEL_ARCH.GPT2: [ # TODO ], @@ -271,7 +287,7 @@ class TensorNameMap: # Token embeddings MODEL_TENSOR.TOKEN_EMBD: ( "gpt_neox.embed_in", # gptneox - "transformer.wte", # gpt2 gpt-j mpt + "transformer.wte", # gpt2 gpt-j mpt refact "transformer.word_embeddings", # falcon "model.embed_tokens", # llama-hf "tok_embeddings", # llama-pth @@ -304,6 +320,7 @@ class TensorNameMap: "norm", # llama-pth "embeddings.LayerNorm", # bert "transformer.norm_f", # mpt + "ln_f", # refact ), # Rope frequencies @@ -316,7 +333,7 @@ class TensorNameMap: # Attention norm MODEL_TENSOR.ATTN_NORM: ( "gpt_neox.layers.{bid}.input_layernorm", # gptneox - "transformer.h.{bid}.ln_1", # gpt2 gpt-j + "transformer.h.{bid}.ln_1", # gpt2 gpt-j refact "transformer.blocks.{bid}.norm_1", # mpt "transformer.h.{bid}.input_layernorm", # falcon7b "transformer.h.{bid}.ln_mlp", # falcon40b @@ -365,7 +382,7 @@ class TensorNameMap: # Attention output MODEL_TENSOR.ATTN_OUT: ( "gpt_neox.layers.{bid}.attention.dense", # gptneox - "transformer.h.{bid}.attn.c_proj", # gpt2 + "transformer.h.{bid}.attn.c_proj", # gpt2 refact "transformer.blocks.{bid}.attn.out_proj", # mpt "transformer.h.{bid}.self_attention.dense", # falcon "model.layers.{bid}.self_attn.o_proj", # llama-hf @@ -383,7 +400,7 @@ class TensorNameMap: # Feed-forward norm MODEL_TENSOR.FFN_NORM: ( "gpt_neox.layers.{bid}.post_attention_layernorm", # gptneox - "transformer.h.{bid}.ln_2", # gpt2 + "transformer.h.{bid}.ln_2", # gpt2 refact "transformer.blocks.{bid}.norm_2", # mpt "model.layers.{bid}.post_attention_layernorm", # llama-hf "layers.{bid}.ffn_norm", # llama-pth @@ -396,7 +413,7 @@ class TensorNameMap: "transformer.h.{bid}.mlp.c_fc", # gpt2 "transformer.blocks.{bid}.ffn.up_proj", # mpt "transformer.h.{bid}.mlp.dense_h_to_4h", # falcon - "model.layers.{bid}.mlp.up_proj", # llama-hf + "model.layers.{bid}.mlp.up_proj", # llama-hf refact "layers.{bid}.feed_forward.w3", # llama-pth "encoder.layer.{bid}.intermediate.dense", # bert "transformer.h.{bid}.mlp.fc_in", # gpt-j @@ -404,14 +421,14 @@ class TensorNameMap: # Feed-forward gate MODEL_TENSOR.FFN_GATE: ( - "model.layers.{bid}.mlp.gate_proj", # llama-hf + "model.layers.{bid}.mlp.gate_proj", # llama-hf refact "layers.{bid}.feed_forward.w1", # llama-pth ), # Feed-forward down MODEL_TENSOR.FFN_DOWN: ( "gpt_neox.layers.{bid}.mlp.dense_4h_to_h", # gptneox - "transformer.h.{bid}.mlp.c_proj", # gpt2 + "transformer.h.{bid}.mlp.c_proj", # gpt2 refact "transformer.blocks.{bid}.ffn.down_proj", # mpt "transformer.h.{bid}.mlp.dense_4h_to_h", # falcon "model.layers.{bid}.mlp.down_proj", # llama-hf diff --git a/llama.cpp b/llama.cpp index a40da6839..08d6c162a 100644 --- a/llama.cpp +++ b/llama.cpp @@ -165,6 +165,7 @@ enum llm_arch { LLM_ARCH_GPTNEOX, LLM_ARCH_MPT, LLM_ARCH_STARCODER, + LLM_ARCH_REFACT, LLM_ARCH_UNKNOWN, }; @@ -177,6 +178,7 @@ static std::map LLM_ARCH_NAMES = { { LLM_ARCH_MPT, "mpt" }, { LLM_ARCH_BAICHUAN, "baichuan" }, { LLM_ARCH_STARCODER, "starcoder" }, + { LLM_ARCH_REFACT, "refact" }, }; enum llm_kv { @@ -397,6 +399,23 @@ static std::map> LLM_TENSOR_NAMES = { LLM_TENSOR_FFN_DOWN, "blk.%d.ffn_down" }, }, }, + { + LLM_ARCH_REFACT, + { + { LLM_TENSOR_TOKEN_EMBD, "token_embd" }, + { LLM_TENSOR_OUTPUT_NORM, "output_norm" }, + { LLM_TENSOR_OUTPUT, "output" }, + { LLM_TENSOR_ATTN_NORM, "blk.%d.attn_norm" }, + { LLM_TENSOR_ATTN_Q, "blk.%d.attn_q" }, + { LLM_TENSOR_ATTN_K, "blk.%d.attn_k" }, + { LLM_TENSOR_ATTN_V, "blk.%d.attn_v" }, + { LLM_TENSOR_ATTN_OUT, "blk.%d.attn_output" }, + { LLM_TENSOR_FFN_NORM, "blk.%d.ffn_norm" }, + { LLM_TENSOR_FFN_GATE, "blk.%d.ffn_gate" }, + { LLM_TENSOR_FFN_DOWN, "blk.%d.ffn_down" }, + { LLM_TENSOR_FFN_UP, "blk.%d.ffn_up" }, + }, + }, { LLM_ARCH_UNKNOWN, { @@ -1927,6 +1946,14 @@ static void llm_load_hparams( default: model.type = e_model::MODEL_UNKNOWN; } } break; + case LLM_ARCH_REFACT: + { + GGUF_GET_KEY(ctx, hparams.f_norm_rms_eps, gguf_get_val_f32, GGUF_TYPE_FLOAT32, true, kv(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS)); + switch (hparams.n_layer) { + case 32: model.type = e_model::MODEL_1B; break; + default: model.type = e_model::MODEL_UNKNOWN; + } + } break; default: (void)0; } @@ -2164,6 +2191,7 @@ static void llm_load_tensors( const auto tn = LLM_TN(model.arch); switch (model.arch) { case LLM_ARCH_LLAMA: + case LLM_ARCH_REFACT: { model.tok_embeddings = ml.create_tensor(ctx, tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, GGML_BACKEND_CPU); @@ -3357,6 +3385,353 @@ static struct ggml_cgraph * llm_build_baichaun( return gf; } +static struct ggml_cgraph * llm_build_refact( + llama_context & lctx, + const llama_batch & batch) { + const auto & model = lctx.model; + const auto & hparams = model.hparams; + const auto & cparams = lctx.cparams; + + const auto & kv_self = lctx.kv_self; + + GGML_ASSERT(!!kv_self.ctx); + + const int64_t n_embd = hparams.n_embd; + const int64_t n_layer = hparams.n_layer; + const int64_t n_ctx = cparams.n_ctx; + const int64_t n_head = hparams.n_head; + const int64_t n_head_kv = hparams.n_head_kv; + const int64_t n_embd_head = hparams.n_embd_head(); + const int64_t n_embd_gqa = hparams.n_embd_gqa(); + + const float norm_rms_eps = hparams.f_norm_rms_eps; + + const int n_gpu_layers = model.n_gpu_layers; + + const int32_t n_tokens = batch.n_tokens; + const int32_t n_kv = ggml_allocr_is_measure(lctx.alloc) ? n_ctx : kv_self.n; + const int32_t kv_head = ggml_allocr_is_measure(lctx.alloc) ? n_ctx - n_tokens : kv_self.head; + + // printf("n_kv = %d\n", n_kv); + + auto & buf_compute = lctx.buf_compute; + + struct ggml_init_params params = { + /*.mem_size =*/ buf_compute.size, + /*.mem_buffer =*/ buf_compute.data, + /*.no_alloc =*/ false, + }; + + params.no_alloc = true; + + struct ggml_context * ctx0 = ggml_init(params); + + ggml_cgraph * gf = ggml_new_graph(ctx0); + + struct ggml_tensor * cur; + struct ggml_tensor * inpL; + + if (batch.token) { + struct ggml_tensor * inp_tokens = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, n_tokens); + + ggml_allocr_alloc(lctx.alloc, inp_tokens); + if (!ggml_allocr_is_measure(lctx.alloc)) { + memcpy(inp_tokens->data, batch.token, n_tokens*ggml_element_size(inp_tokens)); + } + ggml_set_name(inp_tokens, "inp_tokens"); + + inpL = ggml_get_rows(ctx0, model.tok_embeddings, inp_tokens); + } else { +#ifdef GGML_USE_MPI + GGML_ASSERT(false && "not implemented"); +#endif + + inpL = ggml_new_tensor_2d(ctx0, GGML_TYPE_F32, n_embd, n_tokens); + + ggml_allocr_alloc(lctx.alloc, inpL); + if (!ggml_allocr_is_measure(lctx.alloc)) { + memcpy(inpL->data, batch.embd, n_tokens * n_embd * ggml_element_size(inpL)); + } + } + + const int i_gpu_start = n_layer - n_gpu_layers; + (void) i_gpu_start; + + // offload functions set the tensor output backend to GPU + // tensors are GPU-accelerated if any input or the output has been offloaded + offload_func_t offload_func_nr = llama_nop; // nr = non-repeating + offload_func_t offload_func_kq = llama_nop; + offload_func_t offload_func_v = llama_nop; + +#ifdef GGML_USE_CUBLAS + if (n_gpu_layers > n_layer) { + offload_func_nr = ggml_cuda_assign_buffers_no_alloc; + } + if (n_gpu_layers > n_layer + 1) { + offload_func_v = ggml_cuda_assign_buffers_no_alloc; + } + if (n_gpu_layers > n_layer + 2) { + offload_func_kq = ggml_cuda_assign_buffers_no_alloc; + } +#endif // GGML_USE_CUBLAS + + // KQ_scale + struct ggml_tensor * KQ_scale = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 1); + ggml_set_name(KQ_scale, "1/sqrt(n_embd_head)"); + ggml_allocr_alloc(lctx.alloc, KQ_scale); + if (!ggml_allocr_is_measure(lctx.alloc)) { + ggml_set_f32(KQ_scale, 1.0f/sqrtf(float(n_embd_head))); + } + + // KQ_mask (mask for 1 head, it will be broadcasted to all heads) + struct ggml_tensor * KQ_mask = ggml_new_tensor_3d(ctx0, GGML_TYPE_F32, n_kv, n_tokens, 1); + offload_func_kq(KQ_mask); + ggml_set_name(KQ_mask, "KQ_mask"); + ggml_allocr_alloc(lctx.alloc, KQ_mask); + if (!ggml_allocr_is_measure(lctx.alloc)) { + float * data = (float *) KQ_mask->data; + memset(data, 0, ggml_nbytes(KQ_mask)); + + for (int h = 0; h < 1; ++h) { + for (int j = 0; j < n_tokens; ++j) { + const llama_pos pos = batch.pos[j]; + const llama_seq_id seq_id = batch.seq_id[j]; + + for (int i = 0; i < n_kv; ++i) { + if (!kv_self.cells[i].has_seq_id(seq_id) || kv_self.cells[i].pos > pos) { + data[h*(n_kv*n_tokens) + j*n_kv + i] = -INFINITY; + } + } + } + } + } + + for (int il = 0; il < n_layer; ++il) { + ggml_format_name(inpL, "layer_inp_%d", il); + + offload_func_t offload_func = llama_nop; + +#ifdef GGML_USE_CUBLAS + if (il >= i_gpu_start) { + offload_func = ggml_cuda_assign_buffers_no_alloc; + } +#endif // GGML_USE_CUBLAS + + struct ggml_tensor * inpSA = inpL; + + // norm + { + cur = ggml_rms_norm(ctx0, inpL, norm_rms_eps); + offload_func(cur); + ggml_set_name(cur, "rms_norm_0"); + + // cur = cur*attn_norm(broadcasted) + cur = ggml_mul(ctx0, cur, model.layers[il].attn_norm); + offload_func(cur); + ggml_set_name(cur, "attention_norm_0"); + } + + // self-attention + { + // compute Q and K + struct ggml_tensor * tmpk = ggml_mul_mat(ctx0, model.layers[il].wk, cur); + offload_func_kq(tmpk); + ggml_set_name(tmpk, "tmpk"); + + struct ggml_tensor * tmpq = ggml_mul_mat(ctx0, model.layers[il].wq, cur); + offload_func_kq(tmpq); + ggml_set_name(tmpq, "tmpq"); + + struct ggml_tensor * Kcur = ggml_reshape_3d(ctx0, tmpk, n_embd_head, n_head_kv, n_tokens); + offload_func_kq(Kcur); + ggml_set_name(Kcur, "Kcur"); + + struct ggml_tensor * Qcur = ggml_reshape_3d(ctx0, tmpq, n_embd_head, n_head, n_tokens); + offload_func_kq(Qcur); + ggml_set_name(Qcur, "Qcur"); + + // store key and value to memory + { + // compute the transposed [n_tokens, n_embd] V matrix + + struct ggml_tensor * tmpv = ggml_mul_mat(ctx0, model.layers[il].wv, cur); + offload_func_v(tmpv); + ggml_set_name(tmpv, "tmpv"); + + struct ggml_tensor * Vcur = ggml_transpose(ctx0, ggml_reshape_2d(ctx0, tmpv, n_embd_gqa, n_tokens)); + offload_func_v(Vcur); + ggml_set_name(Vcur, "Vcur"); + + struct ggml_tensor * k = ggml_view_1d(ctx0, kv_self.k, n_tokens*n_embd_gqa, (ggml_element_size(kv_self.k)*n_embd_gqa)*(il*n_ctx + kv_head)); + offload_func_kq(k); + ggml_set_name(k, "k"); + + struct ggml_tensor * v = ggml_view_2d(ctx0, kv_self.v, n_tokens, n_embd_gqa, + ( n_ctx)*ggml_element_size(kv_self.v), + (il*n_ctx)*ggml_element_size(kv_self.v)*n_embd_gqa + kv_head*ggml_element_size(kv_self.v)); + offload_func_v(v); + ggml_set_name(v, "v"); + + ggml_build_forward_expand(gf, ggml_cpy(ctx0, Kcur, k)); + ggml_build_forward_expand(gf, ggml_cpy(ctx0, Vcur, v)); + } + + struct ggml_tensor * Q = ggml_permute(ctx0, Qcur, 0, 2, 1, 3); + offload_func_kq(Q); + ggml_set_name(Q, "Q"); + + struct ggml_tensor * K = + ggml_view_3d(ctx0, kv_self.k, + n_embd_head, n_kv, n_head_kv, + ggml_element_size(kv_self.k)*n_embd_gqa, + ggml_element_size(kv_self.k)*n_embd_head, + ggml_element_size(kv_self.k)*n_embd_gqa*n_ctx*il); + offload_func_kq(K); + ggml_set_name(K, "K"); + + // K * Q + struct ggml_tensor * KQ = ggml_mul_mat(ctx0, K, Q); + offload_func_kq(KQ); + ggml_set_name(KQ, "KQ"); + + // KQ_scaled = KQ / sqrt(n_embd_head) + // KQ_scaled shape [n_kv, n_tokens, n_head, 1] + struct ggml_tensor * KQ_scaled = ggml_scale(ctx0, KQ, KQ_scale); + offload_func_kq(KQ_scaled); + ggml_set_name(KQ_scaled, "KQ_scaled"); + + // KQ_masked = mask_past(KQ_scaled) + struct ggml_tensor * KQ_scaled_alibi = ggml_alibi(ctx0, KQ_scaled, /*n_past*/ 0, n_head, 8); + ggml_set_name(KQ_scaled_alibi, "KQ_scaled_alibi"); + + struct ggml_tensor * KQ_masked = ggml_add(ctx0, KQ_scaled_alibi, KQ_mask); + offload_func_kq(KQ_masked); + ggml_set_name(KQ_masked, "KQ_masked"); + + // KQ = soft_max(KQ_masked) + struct ggml_tensor * KQ_soft_max = ggml_soft_max(ctx0, KQ_masked); + offload_func_v(KQ_soft_max); + ggml_set_name(KQ_soft_max, "KQ_soft_max"); + + // split cached V into n_head heads + struct ggml_tensor * V = + ggml_view_3d(ctx0, kv_self.v, + n_kv, n_embd_head, n_head_kv, + ggml_element_size(kv_self.v)*n_ctx, + ggml_element_size(kv_self.v)*n_ctx*n_embd_head, + ggml_element_size(kv_self.v)*n_ctx*n_embd_gqa*il); + offload_func_v(V); + ggml_set_name(V, "V"); + +#if 1 + struct ggml_tensor * KQV = ggml_mul_mat(ctx0, V, KQ_soft_max); + offload_func_v(KQV); + ggml_set_name(KQV, "KQV"); +#else + // make V contiguous in memory to speed up the matmul, however we waste time on the copy + // on M1 this is faster for the perplexity computation, but ~5% slower for the single-token generation + // is there a better way? + struct ggml_tensor * V_cont = ggml_cpy(ctx0, V, ggml_new_tensor_3d(ctx0, kv_self.v->type, n_ctx, n_embd_head, n_head)); + struct ggml_tensor * KQV = ggml_mul_mat(ctx0, V_cont, KQ_soft_max); +#endif + + // KQV_merged = KQV.permute(0, 2, 1, 3) + struct ggml_tensor * KQV_merged = ggml_permute(ctx0, KQV, 0, 2, 1, 3); + offload_func_v(KQV_merged); + ggml_set_name(KQV_merged, "KQV_merged"); + + // cur = KQV_merged.contiguous().view(n_embd, n_tokens) + cur = ggml_cont_2d(ctx0, KQV_merged, n_embd, n_tokens); + offload_func_v(cur); + ggml_set_name(cur, "KQV_merged_contiguous"); + + // projection (no bias) + cur = ggml_mul_mat(ctx0, + model.layers[il].wo, + cur); + offload_func(cur); + ggml_set_name(cur, "result_wo"); + } + + struct ggml_tensor * inpFF = ggml_add(ctx0, cur, inpSA); + offload_func(inpFF); + ggml_set_name(inpFF, "inpFF"); + + // feed-forward network + { + // norm + { + cur = ggml_rms_norm(ctx0, inpFF, norm_rms_eps); + offload_func(cur); + ggml_set_name(cur, "rms_norm_1"); + + // cur = cur*ffn_norm(broadcasted) + cur = ggml_mul(ctx0, cur, model.layers[il].ffn_norm); + offload_func(cur); + ggml_set_name(cur, "ffn_norm"); + } + + struct ggml_tensor * tmp = ggml_mul_mat(ctx0, + model.layers[il].w3, + cur); + offload_func(tmp); + ggml_set_name(tmp, "result_w3"); + + cur = ggml_mul_mat(ctx0, + model.layers[il].w1, + cur); + offload_func(cur); + ggml_set_name(cur, "result_w1"); + + // SILU activation + cur = ggml_silu(ctx0, cur); + offload_func(cur); + ggml_set_name(cur, "silu"); + + cur = ggml_mul(ctx0, cur, tmp); + offload_func(cur); + ggml_set_name(cur, "silu_x_result_w3"); + + cur = ggml_mul_mat(ctx0, + model.layers[il].w2, + cur); + offload_func(cur); + ggml_set_name(cur, "result_w2"); + } + + cur = ggml_add(ctx0, cur, inpFF); + offload_func(cur); + ggml_set_name(cur, "inpFF_+_result_w2"); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + // norm + { + cur = ggml_rms_norm(ctx0, cur, norm_rms_eps); + offload_func_nr(cur); + ggml_set_name(cur, "rms_norm_2"); + + // cur = cur*norm(broadcasted) + cur = ggml_mul(ctx0, cur, model.output_norm); + // offload_func_nr(cur); // TODO CPU + GPU mirrored backend + ggml_set_name(cur, "result_norm"); + } + + // lm_head + cur = ggml_mul_mat(ctx0, model.output, cur); + ggml_set_name(cur, "result_output"); + + ggml_build_forward_expand(gf, cur); + + ggml_free(ctx0); + + return gf; +} + static struct ggml_cgraph * llm_build_falcon( llama_context & lctx, const llama_batch & batch) { @@ -3997,6 +4372,10 @@ static struct ggml_cgraph * llama_build_graph( { result = llm_build_starcoder(lctx, batch); } break; + case LLM_ARCH_REFACT: + { + result = llm_build_refact(lctx, batch); + } break; default: GGML_ASSERT(false); } @@ -4130,7 +4509,8 @@ static int llama_decode_internal( // If all tensors can be run on the GPU then using more than 1 thread is detrimental. const bool full_offload_supported = model.arch == LLM_ARCH_LLAMA || model.arch == LLM_ARCH_BAICHUAN || - model.arch == LLM_ARCH_FALCON; + model.arch == LLM_ARCH_FALCON || + model.arch == LLM_ARCH_REFACT; const bool fully_offloaded = model.n_gpu_layers >= (int) hparams.n_layer + 3; if (ggml_cpu_has_cublas() && full_offload_supported && fully_offloaded) { n_threads = 1; From 0d152b37fecd5a4838330d47bb034cebf1681779 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Wed, 4 Oct 2023 16:25:41 +0300 Subject: [PATCH 38/73] ggml : fix build after #3329 --- ggml.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ggml.c b/ggml.c index f56d6ac72..911a63988 100644 --- a/ggml.c +++ b/ggml.c @@ -13082,6 +13082,7 @@ static void ggml_compute_forward_alibi_f32( return; } + const int n_past = ((int32_t *) dst->op_params)[0]; UNUSED(n_past); const int n_head = ((int32_t *) dst->op_params)[1]; float max_bias; memcpy(&max_bias, (int32_t *) dst->op_params + 2, sizeof(float)); From beabc8cfb0145b48aad68fefc573d316fe9c3a8a Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Wed, 4 Oct 2023 16:50:44 +0300 Subject: [PATCH 39/73] readme : add project status link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec7b58943..e436818fa 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![Actions Status](https://github.com/ggerganov/llama.cpp/workflows/CI/badge.svg)](https://github.com/ggerganov/llama.cpp/actions) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://opensource.org/licenses/MIT) -[Roadmap](https://github.com/users/ggerganov/projects/7) / [Manifesto](https://github.com/ggerganov/llama.cpp/discussions/205) / [ggml](https://github.com/ggerganov/ggml) +[Roadmap](https://github.com/users/ggerganov/projects/7) / [Project status](https://github.com/ggerganov/llama.cpp/discussions/3471) / [Manifesto](https://github.com/ggerganov/llama.cpp/discussions/205) / [ggml](https://github.com/ggerganov/ggml) Inference of [LLaMA](https://arxiv.org/abs/2302.13971) model in pure C/C++ From 019ba1dcd0c7775a5ac0f7442634a330eb0173cc Mon Sep 17 00:00:00 2001 From: Kerfuffle <44031344+KerfuffleV2@users.noreply.github.com> Date: Wed, 4 Oct 2023 08:20:28 -0600 Subject: [PATCH 40/73] convert : fix Baichuan2 models by using vocab size in config.json (#3299) Use local GGUF package when possible in Baichuan converter --- convert-baichuan-hf-to-gguf.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/convert-baichuan-hf-to-gguf.py b/convert-baichuan-hf-to-gguf.py index 8bd34dc44..513a7516a 100755 --- a/convert-baichuan-hf-to-gguf.py +++ b/convert-baichuan-hf-to-gguf.py @@ -11,11 +11,14 @@ import sys from pathlib import Path from typing import TYPE_CHECKING, Any import itertools -import gguf import numpy as np import torch from sentencepiece import SentencePieceProcessor # type: ignore[import] +if 'NO_LOCAL_GGUF' not in os.environ: + sys.path.insert(1, str(Path(__file__).parent / 'gguf-py' / 'gguf')) +import gguf + if TYPE_CHECKING: from typing import TypeAlias @@ -174,8 +177,11 @@ if not tokenizer_model_file.is_file(): print("gguf: get sentencepiece tokenizer vocab, scores and token types") tokenizer = SentencePieceProcessor(str(tokenizer_model_file)) +vocab_size = hparams.get('vocab_size') +if vocab_size is None: + vocab_size = tokenizer.vocab_size() -for i in range(tokenizer.vocab_size()): +for i in range(vocab_size): text: bytes score: float From 0745384449fe8d89d6d99c93153569079e853247 Mon Sep 17 00:00:00 2001 From: Jhen-Jie Hong Date: Thu, 5 Oct 2023 08:56:21 -0500 Subject: [PATCH 41/73] ci : add swift build via xcodebuild (#3482) --- .github/workflows/build.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 35f84e404..d3e4651c7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -253,6 +253,29 @@ jobs: -DCMAKE_OSX_DEPLOYMENT_TARGET=14.0 cmake --build . --config Release -j $(sysctl -n hw.logicalcpu) + macOS-latest-swift: + runs-on: macos-latest + + strategy: + matrix: + destination: ['platform=macOS,name=Any Mac', 'platform=iOS,name=Any iOS Device', 'platform=tvOS,name=Any tvOS Device'] + + steps: + - name: Clone + id: checkout + uses: actions/checkout@v1 + + - name: Dependencies + id: depends + continue-on-error: true + run: | + brew update + + - name: xcodebuild for swift package + id: xcodebuild + run: | + xcodebuild -scheme llama -destination "${{ matrix.destination }}" + windows-latest-cmake: runs-on: windows-latest From 8f3a642ec1d878b2d0a0d15e3a4277f522790d4c Mon Sep 17 00:00:00 2001 From: Jhen-Jie Hong Date: Thu, 5 Oct 2023 09:00:07 -0500 Subject: [PATCH 42/73] swift : disable ACCELERATE_NEW_LAPACK (#3481) --- Package.swift | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Package.swift b/Package.swift index 5fbcdb9db..3ee3b2a20 100644 --- a/Package.swift +++ b/Package.swift @@ -44,9 +44,12 @@ let package = Package( cSettings: [ .unsafeFlags(["-Wno-shorten-64-to-32"]), .define("GGML_USE_K_QUANTS"), - .define("GGML_USE_ACCELERATE"), - .define("ACCELERATE_NEW_LAPACK"), - .define("ACCELERATE_LAPACK_ILP64") + .define("GGML_USE_ACCELERATE") + // NOTE: NEW_LAPACK will required iOS version 16.4+ + // We should consider add this in the future when we drop support for iOS 14 + // (ref: ref: https://developer.apple.com/documentation/accelerate/1513264-cblas_sgemm?language=objc) + // .define("ACCELERATE_NEW_LAPACK"), + // .define("ACCELERATE_LAPACK_ILP64") ] + additionalSettings, linkerSettings: [ .linkedFramework("Accelerate") From e8b8d32e8663ffc55a02c9721af3a5190382cbb0 Mon Sep 17 00:00:00 2001 From: Jhen-Jie Hong Date: Thu, 5 Oct 2023 09:02:55 -0500 Subject: [PATCH 43/73] server : fix incorrect num_tokens_predicted (#3480) --- examples/server/server.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/server/server.cpp b/examples/server/server.cpp index 921eb5da4..6e31e1332 100644 --- a/examples/server/server.cpp +++ b/examples/server/server.cpp @@ -504,9 +504,11 @@ struct llama_server_context }); } + bool tg = true; while (n_past < embd.size()) { int n_eval = (int)embd.size() - n_past; + tg = n_eval == 1; if (n_eval > params.n_batch) { n_eval = params.n_batch; @@ -633,7 +635,9 @@ struct llama_server_context last_n_tokens.erase(last_n_tokens.begin()); last_n_tokens.push_back(result.tok); - num_tokens_predicted++; + if (tg) { + num_tokens_predicted++; + } } // add it to the context @@ -1124,8 +1128,6 @@ static json format_timings(llama_server_context &llama) { const auto timings = llama_get_timings(llama.ctx); - assert(timings.n_eval == ptrdiff_t(llama.num_tokens_predicted)); - return json{ {"prompt_n", timings.n_p_eval}, {"prompt_ms", timings.t_p_eval_ms}, From e2583cbc29cd7d6d1403f338842c07dfc0467e6c Mon Sep 17 00:00:00 2001 From: shibe2 Date: Thu, 5 Oct 2023 15:57:03 +0400 Subject: [PATCH 44/73] CLBlast: Fix handling of on-device tensor data Fix uploading tensor data to device, including 3D, 4D, and non-contiguous tensors. Use correct offsets into data that is already in VRAM. Correct handling of OpenCL events when multiple commands are queued. --- ggml-opencl.cpp | 86 +++++++++++++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 32 deletions(-) diff --git a/ggml-opencl.cpp b/ggml-opencl.cpp index 7e4069d76..4a331f24a 100644 --- a/ggml-opencl.cpp +++ b/ggml-opencl.cpp @@ -202,14 +202,14 @@ inline void get_scale_min_k4(int j, const __global uint8_t *q, uint8_t *d, uint8 __kernel void dequantize_block_q2_K(__global const struct block_q2_K *x, __global float *yy) { - const int i = get_group_id(0); + const int i = get_group_id(0) + get_global_offset(0); const int tid = get_local_id(0); const int n = tid / 32; const int l = tid - 32 * n; const int is = 8 * n + l / 16; const uint8_t q = x[i].qs[32 * n + l]; - __global float *y = yy + i * QK_K + 128 * n; + __global float *y = yy + get_group_id(0) * QK_K + 128 * n; const float dall = vload_half(0, &x[i].d); const float dmin = vload_half(0, &x[i].dmin); @@ -223,7 +223,7 @@ __kernel void dequantize_block_q2_K(__global const struct block_q2_K *x, __globa __kernel void dequantize_block_q3_K(__global const struct block_q3_K *x, __global float *yy) { int r = get_local_id(0) / 4; - int i = get_group_id(0); + int i = get_group_id(0) + get_global_offset(0); int tid = r / 2; int is0 = r % 2; int l0 = 16 * is0 + 4 * (get_local_id(0) % 4); @@ -241,7 +241,7 @@ __kernel void dequantize_block_q3_K(__global const struct block_q3_K *x, __globa float d_all = vload_half(0, &x[i].d); float dl = d_all * (us - 32); - __global float *y = yy + i * QK_K + 128 * n + 32 * j; + __global float *y = yy + get_group_id(0) * QK_K + 128 * n + 32 * j; const __global uint8_t *q = x[i].qs + 32 * n; const __global uint8_t *hm = x[i].hmask; @@ -251,14 +251,14 @@ __kernel void dequantize_block_q3_K(__global const struct block_q3_K *x, __globa __kernel void dequantize_block_q4_K(__global const struct block_q4_K *x, __global float *yy) { - const int i = get_group_id(0); + const int i = get_group_id(0) + get_global_offset(0); const int tid = get_local_id(0); const int il = tid / 8; const int ir = tid % 8; const int is = 2 * il; const int n = 4; - __global float *y = yy + i * QK_K + 64 * il + n * ir; + __global float *y = yy + get_group_id(0) * QK_K + 64 * il + n * ir; const float dall = vload_half(0, &x[i].d); const float dmin = vload_half(0, &x[i].dmin); @@ -281,13 +281,13 @@ __kernel void dequantize_block_q4_K(__global const struct block_q4_K *x, __globa __kernel void dequantize_block_q5_K(__global const struct block_q5_K *x, __global float *yy) { - const int i = get_group_id(0); + const int i = get_group_id(0) + get_global_offset(0); const int tid = get_local_id(0); const int il = tid / 16; const int ir = tid % 16; const int is = 2 * il; - __global float *y = yy + i * QK_K + 64 * il + 2 * ir; + __global float *y = yy + get_group_id(0) * QK_K + 64 * il + 2 * ir; const float dall = vload_half(0, &x[i].d); const float dmin = vload_half(0, &x[i].dmin); @@ -313,13 +313,13 @@ __kernel void dequantize_block_q5_K(__global const struct block_q5_K *x, __globa __kernel void dequantize_block_q6_K(__global const struct block_q6_K *x, __global float *yy) { - const int i = get_group_id(0); + const int i = get_group_id(0) + get_global_offset(0); const int tid = get_local_id(0); const int ip = tid / 32; const int il = tid - 32 * ip; const int is = 8 * ip + il / 16; - __global float *y = yy + i * QK_K + 128 * ip + il; + __global float *y = yy + get_group_id(0) * QK_K + 128 * ip + il; const float d = vload_half(0, &x[i].d); @@ -730,7 +730,7 @@ __kernel void KERNEL_NAME(__global X_TYPE* x, __global float* y) { const uint qk = QUANT_K; const uint qr = QUANT_R; - const int ib = i/qk; // block index + const int ib = i/qk + get_global_offset(0); // block index const int iqs = (i%qk)/qr; // quant index const int iybs = i - i%qk; // y block start index const int y_offset = qr == 1 ? 1 : qk/2; @@ -1349,30 +1349,42 @@ static cl_int ggml_cl_h2d_tensor_2d(cl_command_queue queue, cl_mem dst, size_t o const enum ggml_type type = src->type; const size_t ts = ggml_type_size(type); const size_t bs = ggml_blck_size(type); + const uint64_t row_size = ts*ne0/bs; - const void * x = (const void *) ((const char *) src->data + i2*nb2 + i3*nb3); - if (nb0 == ts && nb1 == ts*ne0/bs) { - err = clEnqueueWriteBuffer(queue, dst, CL_FALSE, offset, ne1*nb1, x, 0, NULL, ev); - return err; + const char * x = (const char *) src->data + i2*nb2 + i3*nb3; + if (nb0 == ts && nb1 == row_size) { + return clEnqueueWriteBuffer(queue, dst, CL_FALSE, offset, ne1*row_size, x, 0, NULL, ev); } if (nb0 == ts) { const size_t buffer_origin[3] = { offset, 0, 0 }; const size_t host_origin[3] = { 0, 0, 0 }; - const size_t region[3] = { ts*ne0/bs, ne1, 1 }; - err = clEnqueueWriteBufferRect(queue, dst, CL_FALSE, buffer_origin, host_origin, region, ts*ne0/bs, 0, nb1, 0, x, 0, NULL, ev); - return err; + const size_t region[3] = { row_size, ne1, 1 }; + return clEnqueueWriteBufferRect(queue, dst, CL_FALSE, buffer_origin, host_origin, region, row_size, 0, nb1, 0, x, 0, NULL, ev); } + std::vector events; + if (ev && ne1>1) events.reserve(ne1-1); for (uint64_t i1 = 0; i1 < ne1; i1++) { // pretend the row is a matrix with cols=1 - const size_t buffer_origin[3] = { offset, i1, 0 }; + const size_t buffer_origin[3] = { offset + i1*row_size, 0, 0 }; const size_t host_origin[3] = { 0, 0, 0 }; - const size_t region[3] = { ts/bs, ne0, 1 }; - err = clEnqueueWriteBufferRect(queue, dst, CL_FALSE, buffer_origin, host_origin, region, 0, 0, nb0, 0, ((const char *)x) + i1*nb0, 0, NULL, ev); + const size_t region[3] = { ts, ne0/bs, 1 }; + // if an event is requested, make the last write wait for all previous writes to complete + if (ev && i1) { + events.push_back(*ev); + } + cl_uint nevents = i1 == ne1-1 ? events.size() : 0U; + err = clEnqueueWriteBufferRect(queue, dst, CL_FALSE, buffer_origin, host_origin, region, ts, 0, nb0, 0, x + i1*nb1, nevents, nevents ? events.data() : nullptr, ev); if (err != CL_SUCCESS) { - break; + for (auto event : events) { + clReleaseEvent(event); + } + return err; } } - return err; + for (auto event : events) { + CL_CHECK(clReleaseEvent(event)); + } + return CL_SUCCESS; } static void ggml_cl_mul_f32(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { @@ -1503,6 +1515,7 @@ static void ggml_cl_mul_mat_f32(const ggml_tensor * src0, const ggml_tensor * sr cl_mem d_Y = ggml_cl_pool_malloc(sizeof(float) * y_ne, &y_size); cl_mem d_D = ggml_cl_pool_malloc(sizeof(float) * d_ne, &d_size); + size_t x_offset = 0; int64_t pi02 = -1; int64_t pi03 = -1; @@ -1513,7 +1526,9 @@ static void ggml_cl_mul_mat_f32(const ggml_tensor * src0, const ggml_tensor * sr int64_t i02 = i12 / r2; // copy data to device - if (src0->backend != GGML_BACKEND_GPU && (i02 != pi02 || i03 != pi03)) { + if (src0->backend == GGML_BACKEND_GPU) { + x_offset = (i03 * ne02 + i02) * x_ne; + } else if (i02 != pi02 || i03 != pi03) { CL_CHECK(ggml_cl_h2d_tensor_2d(queue, d_X, 0, src0, i03, i02, NULL)); pi02 = i02; pi03 = i03; @@ -1528,7 +1543,7 @@ static void ggml_cl_mul_mat_f32(const ggml_tensor * src0, const ggml_tensor * sr clblast::Transpose::kYes, clblast::Transpose::kNo, ne01, ne11, ne10, alpha, - d_X, 0, ne00, + d_X, x_offset, ne00, d_Y, 0, ne10, beta, d_D, 0, ne01, @@ -1596,6 +1611,7 @@ static void ggml_cl_mul_mat_f16(const ggml_tensor * src0, const ggml_tensor * sr bool src1_cont_rows = nb10 == sizeof(float); bool src1_cont_cols = (size_t)nb11 == ne11*sizeof(float); + size_t x_offset = 0; int64_t pi02 = -1; int64_t pi03 = -1; @@ -1606,7 +1622,9 @@ static void ggml_cl_mul_mat_f16(const ggml_tensor * src0, const ggml_tensor * sr int64_t i02 = i12 / r2; // copy src0 to device - if (src0->backend != GGML_BACKEND_GPU && (i02 != pi02 || i03 != pi03)) { + if (src0->backend == GGML_BACKEND_GPU) { + x_offset = (i03 * ne02 + i02) * x_ne; + } else if (i02 != pi02 || i03 != pi03) { CL_CHECK(ggml_cl_h2d_tensor_2d(queue, d_X, 0, src0, i03, i02, NULL)); pi02 = i02; pi03 = i03; @@ -1646,7 +1664,7 @@ static void ggml_cl_mul_mat_f16(const ggml_tensor * src0, const ggml_tensor * sr clblast::Transpose::kYes, clblast::Transpose::kNo, ne01, ne11, ne10, alpha, - d_X, 0, ne00, + d_X, x_offset, ne00, d_Y, 0, ne10, beta, d_D, 0, ne01, @@ -1696,7 +1714,8 @@ static void ggml_cl_mul_mat_q_f32(const ggml_tensor * src0, const ggml_tensor * const int x_ne = ne01 * ne00; const int y_ne = ne11 * ne10; const int d_ne = ne11 * ne01; - const size_t q_sz = ggml_type_size(type) * x_ne / ggml_blck_size(type); + const int x_bps = x_ne / ggml_blck_size(type); // blocks per 2D slice + const size_t q_sz = ggml_type_size(type) * x_bps; size_t x_size; size_t y_size; @@ -1764,9 +1783,10 @@ static void ggml_cl_mul_mat_q_f32(const ggml_tensor * src0, const ggml_tensor * } else { // general dequantization kernel + CLBlast matrix matrix multiplication // convert src0 to fp32 on device const size_t global = x_ne / global_denom; + const size_t offset = src0->backend == GGML_BACKEND_GPU ? (i03 * ne02 + i02) * x_bps : 0; CL_CHECK(clSetKernelArg(*to_fp32_cl, 0, sizeof(cl_mem), &d_Q)); CL_CHECK(clSetKernelArg(*to_fp32_cl, 1, sizeof(cl_mem), &d_X)); - CL_CHECK(clEnqueueNDRangeKernel(queue, *to_fp32_cl, 1, NULL, &global, local > 0 ? &local : NULL, events.size(), !events.empty() ? events.data() : NULL, NULL)); + CL_CHECK(clEnqueueNDRangeKernel(queue, *to_fp32_cl, 1, offset > 0 ? &offset : NULL, &global, local > 0 ? &local : NULL, events.size(), !events.empty() ? events.data() : NULL, NULL)); // copy src1 to device CL_CHECK(ggml_cl_h2d_tensor_2d(queue, d_Y, 0, src1, i13, i12, NULL)); @@ -1888,17 +1908,19 @@ void ggml_cl_transform_tensor(void * data, ggml_tensor * tensor) { const int64_t ne3 = tensor->ne[3]; const ggml_type type = tensor->type; - const size_t q_sz = ggml_type_size(type) * ne0 * ne1 * ne2 * ne3 / ggml_blck_size(type); + const size_t s_sz = ggml_type_size(type) * (size_t) (ne0 * ne1 / ggml_blck_size(type)); + const size_t q_sz = s_sz * (size_t) (ne2 * ne3); size_t q_size; cl_mem dst = ggml_cl_pool_malloc(q_sz, &q_size); tensor->data = data; // copy tensor to device + size_t offset = 0; for (int64_t i3 = 0; i3 < ne3; i3++) { for (int64_t i2 = 0; i2 < ne2; i2++) { - int i = i3*ne2 + i2; - CL_CHECK(ggml_cl_h2d_tensor_2d(queue, dst, i*ne0*ne1, tensor, i3, i2, NULL)); + CL_CHECK(ggml_cl_h2d_tensor_2d(queue, dst, offset, tensor, i3, i2, NULL)); + offset += s_sz; } } From acec9eaaa93315711c11d15afa8d245d164b7cff Mon Sep 17 00:00:00 2001 From: staviq Date: Thu, 5 Oct 2023 18:17:29 +0200 Subject: [PATCH 45/73] common : process escape sequences in reverse prompts (#3461) --- common/common.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/common.cpp b/common/common.cpp index 7370017f2..269672b9f 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -616,6 +616,9 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) { process_escapes(params.prompt); process_escapes(params.input_prefix); process_escapes(params.input_suffix); + for (auto & antiprompt : params.antiprompt) { + process_escapes(antiprompt); + } } return true; From 45eba9369fbcbd7f677eba9a2d3e4ffcfdc81824 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kenvix=20=E2=AD=90?= Date: Fri, 6 Oct 2023 01:16:39 +0800 Subject: [PATCH 46/73] build : use std::make_tuple() for compatibility with older GCC versions (#3488) --- common/common.cpp | 4 ++-- examples/server/server.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common/common.cpp b/common/common.cpp index 269672b9f..6b9b4695c 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -361,7 +361,7 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) { invalid_param = true; break; } - params.lora_adapter.push_back({argv[i], 1.0f}); + params.lora_adapter.push_back(std::make_tuple(argv[i], 1.0f)); params.use_mmap = false; } else if (arg == "--lora-scaled") { if (++i >= argc) { @@ -373,7 +373,7 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) { invalid_param = true; break; } - params.lora_adapter.push_back({lora_adapter, std::stof(argv[i])}); + params.lora_adapter.push_back(std::make_tuple(lora_adapter, std::stof(argv[i]))); params.use_mmap = false; } else if (arg == "--lora-base") { if (++i >= argc) { diff --git a/examples/server/server.cpp b/examples/server/server.cpp index 6e31e1332..5f9cdecd5 100644 --- a/examples/server/server.cpp +++ b/examples/server/server.cpp @@ -1015,7 +1015,7 @@ static void server_params_parse(int argc, char **argv, server_params &sparams, invalid_param = true; break; } - params.lora_adapter.push_back({argv[i], 1.0f}); + params.lora_adapter.push_back(std::make_tuple(argv[i], 1.0f)); params.use_mmap = false; } else if (arg == "--lora-scaled") @@ -1031,7 +1031,7 @@ static void server_params_parse(int argc, char **argv, server_params &sparams, invalid_param = true; break; } - params.lora_adapter.push_back({lora_adapter, std::stof(argv[i])}); + params.lora_adapter.push_back(std::make_tuple(lora_adapter, std::stof(argv[i]))); params.use_mmap = false; } else if (arg == "--lora-base") From 48edda30ee545fdac2e7a33d505382888f748bbf Mon Sep 17 00:00:00 2001 From: cebtenzzre Date: Thu, 5 Oct 2023 15:00:34 -0400 Subject: [PATCH 47/73] convert : update Falcon script for new HF config (#3448) Also adds Falcon-180B support. Closes #3049 Co-authored-by: jb --- convert-falcon-hf-to-gguf.py | 117 ++++++++++++++++++++--------------- 1 file changed, 66 insertions(+), 51 deletions(-) diff --git a/convert-falcon-hf-to-gguf.py b/convert-falcon-hf-to-gguf.py index cb79586d6..9252e1c46 100755 --- a/convert-falcon-hf-to-gguf.py +++ b/convert-falcon-hf-to-gguf.py @@ -4,6 +4,7 @@ from __future__ import annotations import argparse +import contextlib import json import os import struct @@ -20,10 +21,10 @@ if 'NO_LOCAL_GGUF' not in os.environ: import gguf -def count_model_parts(dir_model: Path) -> int: +def count_model_parts(dir_model: Path, prefix: str) -> int: num_parts = 0 for filename in os.listdir(dir_model): - if filename.startswith("pytorch_model-"): + if filename.startswith(prefix): num_parts += 1 if num_parts > 0: @@ -77,20 +78,26 @@ print("gguf: loading model "+dir_model.name) with open(dir_model / "config.json", "r", encoding="utf-8") as f: hparams = json.load(f) -if hparams["architectures"][0] != "RWForCausalLM": +if hparams["architectures"][0] != "FalconForCausalLM": print("Model architecture not supported: " + hparams["architectures"][0]) sys.exit(1) # get number of model parts -num_parts = count_model_parts(dir_model) +num_parts = count_model_parts(dir_model, "model-00") +if num_parts: + is_safetensors = True + from safetensors import safe_open +else: + is_safetensors = False + num_parts = count_model_parts(dir_model, "pytorch_model-") ARCH=gguf.MODEL_ARCH.FALCON gguf_writer = gguf.GGUFWriter(fname_out, gguf.MODEL_ARCH_NAMES[ARCH]) print("gguf: get model metadata") -block_count = hparams["n_layer"] +block_count = hparams["num_hidden_layers"] gguf_writer.add_name("Falcon") gguf_writer.add_context_length(2048) # not in config.json @@ -98,9 +105,9 @@ gguf_writer.add_tensor_data_layout("jploski") # qkv tensor transform gguf_writer.add_embedding_length(hparams["hidden_size"]) gguf_writer.add_feed_forward_length(4 * hparams["hidden_size"]) gguf_writer.add_block_count(block_count) -gguf_writer.add_head_count(hparams["n_head"]) -if "n_head_kv" in hparams: - gguf_writer.add_head_count_kv(hparams["n_head_kv"]) +gguf_writer.add_head_count(hparams["num_attention_heads"]) +if "num_kv_heads" in hparams: + gguf_writer.add_head_count_kv(hparams["num_kv_heads"]) else: gguf_writer.add_head_count_kv(1) gguf_writer.add_layer_norm_eps(hparams["layer_norm_epsilon"]) @@ -146,8 +153,8 @@ special_vocab.add_to_gguf(gguf_writer) tensor_map = gguf.get_tensor_name_map(ARCH,block_count) # params for qkv transform -n_head = hparams["n_head"] -n_head_kv = hparams["n_head_kv"] if "n_head_kv" in hparams else 1 +n_head = hparams["num_attention_heads"] +n_head_kv = hparams["num_kv_heads"] if "num_kv_heads" in hparams else 1 head_dim = hparams["hidden_size"] // n_head @@ -156,6 +163,10 @@ print("gguf: get tensor metadata") if num_parts == 0: part_names = iter(("pytorch_model.bin",)) +elif is_safetensors: + part_names = ( + f"model-{n:05}-of-{num_parts:05}.safetensors" for n in range(1, num_parts + 1) + ) else: part_names = ( f"pytorch_model-{n:05}-of-{num_parts:05}.bin" for n in range(1, num_parts + 1) @@ -165,60 +176,64 @@ for part_name in part_names: if args.vocab_only: break print("gguf: loading model part '" + part_name + "'") - model_part = torch.load(dir_model / part_name, map_location="cpu") + if is_safetensors: + ctx = safe_open(dir_model / part_name, framework="pt", device="cpu") + else: + ctx = contextlib.nullcontext(torch.load(dir_model / part_name, map_location="cpu")) - for name in model_part.keys(): - data = model_part[name] + with ctx as model_part: + for name in model_part.keys(): + data = model_part.get_tensor(name) if is_safetensors else model_part[name] - old_dtype = data.dtype + old_dtype = data.dtype - # convert any unsupported data types to float32 - if data.dtype != torch.float16 and data.dtype != torch.float32: - data = data.to(torch.float32) + # convert any unsupported data types to float32 + if data.dtype != torch.float16 and data.dtype != torch.float32: + data = data.to(torch.float32) - # QKV tensor transform - # The original query_key_value tensor contains n_head_kv "kv groups", - # each consisting of n_head/n_head_kv query weights followed by one key - # and one value weight (shared by all query heads in the kv group). - # This layout makes it a big pain to work with in GGML. - # So we rearrange them here,, so that we have n_head query weights - # followed by n_head_kv key weights followed by n_head_kv value weights, - # in contiguous fashion. - # ref: https://github.com/jploski/ggml/blob/falcon40b/examples/falcon/convert-hf-to-ggml.py + # QKV tensor transform + # The original query_key_value tensor contains n_head_kv "kv groups", + # each consisting of n_head/n_head_kv query weights followed by one key + # and one value weight (shared by all query heads in the kv group). + # This layout makes it a big pain to work with in GGML. + # So we rearrange them here,, so that we have n_head query weights + # followed by n_head_kv key weights followed by n_head_kv value weights, + # in contiguous fashion. + # ref: https://github.com/jploski/ggml/blob/falcon40b/examples/falcon/convert-hf-to-ggml.py - if "query_key_value" in name: - qkv = data.view(n_head_kv, n_head // n_head_kv + 2, head_dim, head_dim * n_head) - q = qkv[:, :-2 ].reshape(n_head * head_dim, head_dim * n_head) - k = qkv[:, [-2]].reshape(n_head_kv * head_dim, head_dim * n_head) - v = qkv[:, [-1]].reshape(n_head_kv * head_dim, head_dim * n_head) - data = torch.cat((q,k,v)).reshape_as(data) + if "query_key_value" in name: + qkv = data.view(n_head_kv, n_head // n_head_kv + 2, head_dim, head_dim * n_head) + q = qkv[:, :-2 ].reshape(n_head * head_dim, head_dim * n_head) + k = qkv[:, [-2]].reshape(n_head_kv * head_dim, head_dim * n_head) + v = qkv[:, [-1]].reshape(n_head_kv * head_dim, head_dim * n_head) + data = torch.cat((q,k,v)).reshape_as(data) - data = data.squeeze().numpy() + data = data.squeeze().numpy() - # map tensor names - new_name = tensor_map.get_name(name, try_suffixes = (".weight", ".bias")) - if new_name is None: - print("Can not map tensor '" + name + "'") - sys.exit() + # map tensor names + new_name = tensor_map.get_name(name, try_suffixes = (".weight", ".bias")) + if new_name is None: + print("Can not map tensor '" + name + "'") + sys.exit() - n_dims = len(data.shape) - data_dtype = data.dtype + n_dims = len(data.shape) + data_dtype = data.dtype - # if f32 desired, convert any float16 to float32 - if ftype == 0 and data_dtype == np.float16: - data = data.astype(np.float32) + # if f32 desired, convert any float16 to float32 + if ftype == 0 and data_dtype == np.float16: + data = data.astype(np.float32) - # TODO: Why cant we use these float16 as-is? There should be not reason to store float16 as float32 - if ftype == 1 and data_dtype == np.float16 and n_dims == 1: - data = data.astype(np.float32) + # TODO: Why cant we use these float16 as-is? There should be not reason to store float16 as float32 + if ftype == 1 and data_dtype == np.float16 and n_dims == 1: + data = data.astype(np.float32) - # if f16 desired, convert any float32 2-dim weight tensors to float16 - if ftype == 1 and data_dtype == np.float32 and name.endswith(".weight") and n_dims == 2: - data = data.astype(np.float16) + # if f16 desired, convert any float32 2-dim weight tensors to float16 + if ftype == 1 and data_dtype == np.float32 and name.endswith(".weight") and n_dims == 2: + data = data.astype(np.float16) - print(new_name + ", n_dims = " + str(n_dims) + ", " + str(old_dtype) + " --> " + str(data.dtype)) + print(new_name + ", n_dims = " + str(n_dims) + ", " + str(old_dtype) + " --> " + str(data.dtype)) - gguf_writer.add_tensor(new_name, data) + gguf_writer.add_tensor(new_name, data) print("gguf: write header") From 04b2f4386eda0264287156104cbf9d1b87895422 Mon Sep 17 00:00:00 2001 From: Jhen-Jie Hong Date: Fri, 6 Oct 2023 05:36:43 -0500 Subject: [PATCH 48/73] ci : fix xcodebuild destinations (#3491) * ci : fix xcodebuild destinations * ci : add .swift to paths --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d3e4651c7..c1e36ee28 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,10 +10,10 @@ on: push: branches: - master - paths: ['.github/workflows/**', '**/CMakeLists.txt', '**/Makefile', '**/*.h', '**/*.hpp', '**/*.c', '**/*.cpp', '**/*.cu'] + paths: ['.github/workflows/**', '**/CMakeLists.txt', '**/Makefile', '**/*.h', '**/*.hpp', '**/*.c', '**/*.cpp', '**/*.cu', '**/*.swift'] pull_request: types: [opened, synchronize, reopened] - paths: ['**/CMakeLists.txt', '**/Makefile', '**/*.h', '**/*.hpp', '**/*.c', '**/*.cpp', '**/*.cu'] + paths: ['**/CMakeLists.txt', '**/Makefile', '**/*.h', '**/*.hpp', '**/*.c', '**/*.cpp', '**/*.cu', '**/*.swift'] env: BRANCH_NAME: ${{ github.head_ref || github.ref_name }} @@ -258,7 +258,7 @@ jobs: strategy: matrix: - destination: ['platform=macOS,name=Any Mac', 'platform=iOS,name=Any iOS Device', 'platform=tvOS,name=Any tvOS Device'] + destination: ['generic/platform=macOS', 'generic/platform=iOS', 'generic/platform=tvOS'] steps: - name: Clone From 16820a5a0d885113f21021ce934f0b0027b9d69a Mon Sep 17 00:00:00 2001 From: l3utterfly Date: Fri, 6 Oct 2023 18:47:59 +0800 Subject: [PATCH 49/73] llama : correct hparams comparison (#3446) * fixed floating point comparison issues * updated implementation for hparam comparison to handle inf and NaN * fixed code review comments * minor simplification * rename is_float_eq -> is_float_close --------- Co-authored-by: Cebtenzzre --- llama.cpp | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/llama.cpp b/llama.cpp index 08d6c162a..56413f3a2 100644 --- a/llama.cpp +++ b/llama.cpp @@ -125,6 +125,27 @@ static void replace_all(std::string & s, const std::string & search, const std:: } s = std::move(result); } + +static bool is_float_close(float a, float b, float abs_tol) { + // Check for non-negative tolerance + if (abs_tol < 0.0) { + throw std::invalid_argument("Tolerance must be non-negative"); + } + + // Exact equality check + if (a == b) { + return true; + } + + // Check for infinities + if (std::isinf(a) || std::isinf(b)) { + return false; + } + + // Regular comparison using the provided absolute tolerance + return std::fabs(b - a) <= abs_tol; +} + #ifdef GGML_USE_CPU_HBM #include #endif @@ -969,7 +990,24 @@ struct llama_hparams { float rope_freq_scale_train; bool operator!=(const llama_hparams & other) const { - return static_cast(memcmp(this, &other, sizeof(llama_hparams))); // NOLINT + if (this->vocab_only != other.vocab_only) return true; + if (this->n_vocab != other.n_vocab) return true; + if (this->n_ctx_train != other.n_ctx_train) return true; + if (this->n_embd != other.n_embd) return true; + if (this->n_head != other.n_head) return true; + if (this->n_head_kv != other.n_head_kv) return true; + if (this->n_layer != other.n_layer) return true; + if (this->n_rot != other.n_rot) return true; + if (this->n_ff != other.n_ff) return true; + + const float EPSILON = 1e-9; + + if (!is_float_close(this->f_norm_eps, other.f_norm_eps, EPSILON)) return true; + if (!is_float_close(this->f_norm_rms_eps, other.f_norm_rms_eps, EPSILON)) return true; + if (!is_float_close(this->rope_freq_base_train, other.rope_freq_base_train, EPSILON)) return true; + if (!is_float_close(this->rope_freq_scale_train, other.rope_freq_scale_train, EPSILON)) return true; + + return false; } uint32_t n_gqa() const { From 97af49fa395df77e4c18af0e1655b2fee67c9686 Mon Sep 17 00:00:00 2001 From: Jhen-Jie Hong Date: Fri, 6 Oct 2023 07:44:24 -0500 Subject: [PATCH 50/73] server : reuse llama_sample_token common util (#3494) * server : reuse llama_sample_token common function * common : use n_probs for temperature sampling --- common/common.cpp | 9 ++-- examples/server/server.cpp | 100 ++++--------------------------------- 2 files changed, 16 insertions(+), 93 deletions(-) diff --git a/common/common.cpp b/common/common.cpp index 6b9b4695c..186f5b268 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -1020,10 +1020,11 @@ llama_token llama_sample_token( id = llama_sample_token_mirostat_v2(ctx, &cur_p, mirostat_tau, mirostat_eta, &mirostat_mu); } else { // Temperature sampling - llama_sample_top_k (ctx, &cur_p, top_k, 1); - llama_sample_tail_free (ctx, &cur_p, tfs_z, 1); - llama_sample_typical (ctx, &cur_p, typical_p, 1); - llama_sample_top_p (ctx, &cur_p, top_p, 1); + size_t min_keep = std::max(1, params.n_probs); + llama_sample_top_k (ctx, &cur_p, top_k, min_keep); + llama_sample_tail_free (ctx, &cur_p, tfs_z, min_keep); + llama_sample_typical (ctx, &cur_p, typical_p, min_keep); + llama_sample_top_p (ctx, &cur_p, top_p, min_keep); llama_sample_temp(ctx, &cur_p, temp); { diff --git a/examples/server/server.cpp b/examples/server/server.cpp index 5f9cdecd5..c53a64867 100644 --- a/examples/server/server.cpp +++ b/examples/server/server.cpp @@ -534,98 +534,20 @@ struct llama_server_context return result; } - // out of user input, sample next token - const float temp = params.temp; - const int32_t top_k = params.top_k <= 0 ? llama_n_vocab(model) : params.top_k; - const float top_p = params.top_p; - const float tfs_z = params.tfs_z; - const float typical_p = params.typical_p; - const int32_t repeat_last_n = params.repeat_last_n < 0 ? n_ctx : params.repeat_last_n; - const float repeat_penalty = params.repeat_penalty; - const float alpha_presence = params.presence_penalty; - const float alpha_frequency = params.frequency_penalty; - const int mirostat = params.mirostat; - const float mirostat_tau = params.mirostat_tau; - const float mirostat_eta = params.mirostat_eta; - const bool penalize_nl = params.penalize_nl; - const int32_t n_probs = params.n_probs; - { - auto *logits = llama_get_logits(ctx); - auto n_vocab = llama_n_vocab(model); - - // Apply params.logit_bias map - for (const auto &it : params.logit_bias) - { - logits[it.first] += it.second; - } - + // out of user input, sample next token std::vector candidates; - candidates.reserve(n_vocab); - for (llama_token token_id = 0; token_id < n_vocab; token_id++) + candidates.reserve(llama_n_vocab(model)); + + result.tok = llama_sample_token(ctx, NULL, grammar, params, last_n_tokens, candidates); + + llama_token_data_array candidates_p = { candidates.data(), candidates.size(), false }; + + const int32_t n_probs = params.n_probs; + if (params.temp <= 0 && n_probs > 0) { - candidates.emplace_back(llama_token_data{token_id, logits[token_id], 0.0f}); - } - - llama_token_data_array candidates_p = {candidates.data(), candidates.size(), false}; - - // Apply penalties - float nl_logit = logits[llama_token_nl(ctx)]; - auto last_n_repeat = std::min(std::min((int)last_n_tokens.size(), repeat_last_n), n_ctx); - llama_sample_repetition_penalty(ctx, &candidates_p, - last_n_tokens.data() + last_n_tokens.size() - last_n_repeat, - last_n_repeat, repeat_penalty); - llama_sample_frequency_and_presence_penalties(ctx, &candidates_p, - last_n_tokens.data() + last_n_tokens.size() - last_n_repeat, - last_n_repeat, alpha_frequency, alpha_presence); - if (!penalize_nl) - { - logits[llama_token_nl(ctx)] = nl_logit; - } - - if (grammar != nullptr) { - llama_sample_grammar(ctx, &candidates_p, grammar); - } - - if (temp <= 0) - { - // Greedy sampling - result.tok = llama_sample_token_greedy(ctx, &candidates_p); - if (n_probs > 0) - { - llama_sample_softmax(ctx, &candidates_p); - } - } - else - { - if (mirostat == 1) - { - static float mirostat_mu = 2.0f * mirostat_tau; - const int mirostat_m = 100; - llama_sample_temp(ctx, &candidates_p, temp); - result.tok = llama_sample_token_mirostat(ctx, &candidates_p, mirostat_tau, mirostat_eta, mirostat_m, &mirostat_mu); - } - else if (mirostat == 2) - { - static float mirostat_mu = 2.0f * mirostat_tau; - llama_sample_temp(ctx, &candidates_p, temp); - result.tok = llama_sample_token_mirostat_v2(ctx, &candidates_p, mirostat_tau, mirostat_eta, &mirostat_mu); - } - else - { - // Temperature sampling - size_t min_keep = std::max(1, n_probs); - llama_sample_top_k(ctx, &candidates_p, top_k, min_keep); - llama_sample_tail_free(ctx, &candidates_p, tfs_z, min_keep); - llama_sample_typical(ctx, &candidates_p, typical_p, min_keep); - llama_sample_top_p(ctx, &candidates_p, top_p, min_keep); - llama_sample_temp(ctx, &candidates_p, temp); - result.tok = llama_sample_token(ctx, &candidates_p); - } - } - - if (grammar != nullptr) { - llama_grammar_accept_token(ctx, grammar, result.tok); + // For llama_sample_token_greedy we need to sort candidates + llama_sample_softmax(ctx, &candidates_p); } for (size_t i = 0; i < std::min(candidates_p.size, (size_t)n_probs); ++i) From a8777ad84e00cda0399e827cdf971e2c3fab1da2 Mon Sep 17 00:00:00 2001 From: pudepiedj Date: Fri, 6 Oct 2023 14:16:38 +0100 Subject: [PATCH 51/73] parallel : add option to load external prompt file (#3416) * Enable external file and add datestamp * Add name of external file at end * Upload ToK2024 * Delete ToK2024.txt * Experiments with jeopardy * Move ParallelQuestions to /proimpts and rename * Interim commit * Interim commit * Final revision * Remove trailing whitespace * remove cmake_all.sh * Remove cmake_all.sh * Changed .gitignore * Improved reporting and new question files. * Corrected typo * More LLM questions * Update LLM-questions.txt * Yet more LLM-questions * Remove jeopardy results file * Reinstate original jeopardy.sh * Update examples/parallel/parallel.cpp --------- Co-authored-by: Georgi Gerganov --- common/common.cpp | 2 ++ common/common.h | 1 + examples/jeopardy/README.md | 2 +- examples/parallel/parallel.cpp | 56 +++++++++++++++++++++++++++++++--- llama.cpp | 10 +++--- prompts/LLM-questions.txt | 49 +++++++++++++++++++++++++++++ prompts/parallel-questions.txt | 42 +++++++++++++++++++++++++ 7 files changed, 151 insertions(+), 11 deletions(-) create mode 100644 prompts/LLM-questions.txt create mode 100644 prompts/parallel-questions.txt diff --git a/common/common.cpp b/common/common.cpp index 186f5b268..60b00b5fb 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -167,6 +167,8 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) { invalid_param = true; break; } + // store the external file name in params + params.prompt_file = argv[i]; std::copy(std::istreambuf_iterator(file), std::istreambuf_iterator(), back_inserter(params.prompt)); if (params.prompt.back() == '\n') { params.prompt.pop_back(); diff --git a/common/common.h b/common/common.h index e095c56e3..c80215279 100644 --- a/common/common.h +++ b/common/common.h @@ -79,6 +79,7 @@ struct gpt_params { std::string model_draft = ""; // draft model for speculative decoding std::string model_alias = "unknown"; // model alias std::string prompt = ""; + std::string prompt_file = ""; // store the external prompt file name std::string path_prompt_cache = ""; // path to file for saving/loading prompt eval state std::string input_prefix = ""; // string to prefix user inputs with std::string input_suffix = ""; // string to suffix user inputs with diff --git a/examples/jeopardy/README.md b/examples/jeopardy/README.md index 4c42e3cdb..ffa13cbf3 100644 --- a/examples/jeopardy/README.md +++ b/examples/jeopardy/README.md @@ -2,7 +2,7 @@ This is pretty much just a straight port of aigoopy/llm-jeopardy/ with an added graph viewer. -The jeopardy test can be used to compare the fact knowledge of different models and compare them to eachother. This is in contrast to some other tests, which test logical deduction, creativity, writing skills, etc. +The jeopardy test can be used to compare the fact knowledge of different models and compare them to each other. This is in contrast to some other tests, which test logical deduction, creativity, writing skills, etc. Step 1: Open jeopardy.sh and modify the following: diff --git a/examples/parallel/parallel.cpp b/examples/parallel/parallel.cpp index ffd7b1db4..721888da7 100644 --- a/examples/parallel/parallel.cpp +++ b/examples/parallel/parallel.cpp @@ -10,6 +10,7 @@ #include #include #include +#include // trim whitespace from the beginning and end of a string static std::string trim(const std::string & str) { @@ -70,6 +71,26 @@ struct client { std::vector tokens_prev; }; +static void print_date_time() { + std::time_t current_time = std::time(nullptr); + std::tm* local_time = std::localtime(¤t_time); + char buffer[80]; + strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_time); + + printf("\n\033[35mrun parameters as at %s\033[0m\n", buffer); +} + +// Define a split string function to ... +static std::vector split_string(const std::string& input, char delimiter) { + std::vector tokens; + std::istringstream stream(input); + std::string token; + while (std::getline(stream, token, delimiter)) { + tokens.push_back(token); + } + return tokens; +} + int main(int argc, char ** argv) { srand(1234); @@ -104,6 +125,23 @@ int main(int argc, char ** argv) { params.logits_all = true; std::tie(model, ctx) = llama_init_from_gpt_params(params); + // load the prompts from an external file if there are any + if (params.prompt.empty()) { + printf("\n\033[32mNo new questions so proceed with build-in defaults.\033[0m\n"); + } else { + // Output each line of the input params.prompts vector and copy to k_prompts + int index = 0; + printf("\n\033[32mNow printing the external prompt file %s\033[0m\n\n", params.prompt_file.c_str()); + + std::vector prompts = split_string(params.prompt, '\n'); + for (const auto& prompt : prompts) { + k_prompts.resize(index + 1); + k_prompts[index] = prompt; + index++; + printf("%3d prompt: %s\n", index, prompt.c_str()); + } + } + fprintf(stderr, "\n\n"); fflush(stderr); @@ -233,7 +271,7 @@ int main(int argc, char ** argv) { client.n_decoded = 0; client.i_batch = batch.n_tokens - 1; - LOG_TEE("\033[1mClient %3d, seq %4d, started decoding ...\033[0m\n", client.id, client.seq_id); + LOG_TEE("\033[31mClient %3d, seq %4d, started decoding ...\033[0m\n", client.id, client.seq_id); g_seq_id += 1; @@ -336,8 +374,8 @@ int main(int argc, char ** argv) { const auto t_main_end = ggml_time_us(); - LOG_TEE("\033[1mClient %3d, seq %4d, prompt %4d t, response %4d t, time %5.2f s, speed %5.2f t/s, cache miss %d \033[0m \n\nInput: %s\nResponse: %s\n\n", - client.id, client.seq_id, client.n_prompt, client.n_decoded, + LOG_TEE("\033[31mClient %3d, seq %3d/%3d, prompt %4d t, response %4d t, time %5.2f s, speed %5.2f t/s, cache miss %d \033[0m \nInput: %s\n\033[35mResponse: %s\033[0m\n\n", + client.id, client.seq_id, n_seq, client.n_prompt, client.n_decoded, (t_main_end - client.t_start_prompt) / 1e6, (double) (client.n_prompt + client.n_decoded) / (t_main_end - client.t_start_prompt) * 1e6, n_cache_miss, @@ -357,13 +395,21 @@ int main(int argc, char ** argv) { const auto t_main_end = ggml_time_us(); - LOG_TEE("\n\n"); + print_date_time(); + + LOG_TEE("\n%s: n_parallel = %d, n_sequences = %d, cont_batching = %d, system tokens = %d\n", __func__, n_clients, n_seq, cont_batching, n_tokens_system); + if (params.prompt_file.empty()) { + params.prompt_file = "used built-in defaults"; + } + LOG_TEE("External prompt file: \033[32m%s\033[0m\n", params.prompt_file.c_str()); + LOG_TEE("Model and path used: \033[32m%s\033[0m\n\n", params.model.c_str()); + LOG_TEE("Total prompt tokens: %6d, speed: %5.2f t/s\n", n_total_prompt, (double) (n_total_prompt ) / (t_main_end - t_main_start) * 1e6); LOG_TEE("Total gen tokens: %6d, speed: %5.2f t/s\n", n_total_gen, (double) (n_total_gen ) / (t_main_end - t_main_start) * 1e6); LOG_TEE("Total speed (AVG): %6s speed: %5.2f t/s\n", "", (double) (n_total_prompt + n_total_gen) / (t_main_end - t_main_start) * 1e6); LOG_TEE("Cache misses: %6d\n", n_cache_miss); - LOG_TEE("\n\n"); + LOG_TEE("\n"); llama_print_timings(ctx); diff --git a/llama.cpp b/llama.cpp index 56413f3a2..1a7d37b8d 100644 --- a/llama.cpp +++ b/llama.cpp @@ -8219,14 +8219,14 @@ void llama_print_timings(struct llama_context * ctx) { const llama_timings timings = llama_get_timings(ctx); LLAMA_LOG_INFO("\n"); - LLAMA_LOG_INFO("%s: load time = %8.2f ms\n", __func__, timings.t_load_ms); - LLAMA_LOG_INFO("%s: sample time = %8.2f ms / %5d runs (%8.2f ms per token, %8.2f tokens per second)\n", + LLAMA_LOG_INFO("%s: load time = %10.2f ms\n", __func__, timings.t_load_ms); + LLAMA_LOG_INFO("%s: sample time = %10.2f ms / %5d runs (%8.2f ms per token, %8.2f tokens per second)\n", __func__, timings.t_sample_ms, timings.n_sample, timings.t_sample_ms / timings.n_sample, 1e3 / timings.t_sample_ms * timings.n_sample); - LLAMA_LOG_INFO("%s: prompt eval time = %8.2f ms / %5d tokens (%8.2f ms per token, %8.2f tokens per second)\n", + LLAMA_LOG_INFO("%s: prompt eval time = %10.2f ms / %5d tokens (%8.2f ms per token, %8.2f tokens per second)\n", __func__, timings.t_p_eval_ms, timings.n_p_eval, timings.t_p_eval_ms / timings.n_p_eval, 1e3 / timings.t_p_eval_ms * timings.n_p_eval); - LLAMA_LOG_INFO("%s: eval time = %8.2f ms / %5d runs (%8.2f ms per token, %8.2f tokens per second)\n", + LLAMA_LOG_INFO("%s: eval time = %10.2f ms / %5d runs (%8.2f ms per token, %8.2f tokens per second)\n", __func__, timings.t_eval_ms, timings.n_eval, timings.t_eval_ms / timings.n_eval, 1e3 / timings.t_eval_ms * timings.n_eval); - LLAMA_LOG_INFO("%s: total time = %8.2f ms\n", __func__, (timings.t_end_ms - timings.t_start_ms)); + LLAMA_LOG_INFO("%s: total time = %10.2f ms\n", __func__, (timings.t_end_ms - timings.t_start_ms)); } void llama_reset_timings(struct llama_context * ctx) { diff --git a/prompts/LLM-questions.txt b/prompts/LLM-questions.txt new file mode 100644 index 000000000..fdf3d52f4 --- /dev/null +++ b/prompts/LLM-questions.txt @@ -0,0 +1,49 @@ +In the context of LLMs, what is "Attention"? +In the context of LLMs, what is a completion? +In the context of LLMs, what is a prompt? +In the context of LLMs, what is GELU? +In the context of LLMs, what is RELU? +In the context of LLMs, what is softmax? +In the context of LLMs, what is decoding? +In the context of LLMs, what is encoding? +In the context of LLMs, what is tokenizing? +In the context of LLMs, what is an embedding? +In the context of LLMs, what is quantization? +In the context of LLMs, what is a tensor? +In the context of LLMs, what is a sparse tensor? +In the context of LLMs, what is a vector? +In the context of LLMs, how is attention implemented? +In the context of LLMs, why is attention all you need? +In the context of LLMs, what is "RoPe" and what is it used for? +In the context of LLMs, what is "LoRA" and what is it used for? +In the context of LLMs, what are weights? +In the context of LLMs, what are biases? +In the context of LLMs, what are checkpoints? +In the context of LLMs, what is "perplexity"? +In the context of LLMs, what are models? +In the context of machine-learning, what is "catastrophic forgetting"? +In the context of machine-learning, what is "elastic weight consolidation (EWC)"? +In the context of neural nets, what is a hidden layer? +In the context of neural nets, what is a convolution? +In the context of neural nets, what is dropout? +In the context of neural nets, what is cross-entropy? +In the context of neural nets, what is over-fitting? +In the context of neural nets, what is under-fitting? +What is the difference between an interpreted computer language and a compiled computer language? +In the context of software development, what is a debugger? +When processing using a GPU, what is off-loading? +When processing using a GPU, what is a batch? +When processing using a GPU, what is a block? +When processing using a GPU, what is the difference between a batch and a block? +When processing using a GPU, what is a scratch tensor? +When processing using a GPU, what is a layer? +When processing using a GPU, what is a cache? +When processing using a GPU, what is unified memory? +When processing using a GPU, what is VRAM? +When processing using a GPU, what is a kernel? +When processing using a GPU, what is "metal"? +In the context of LLMs, what are "Zero-Shot", "One-Shot" and "Few-Shot" learning models? +In the context of LLMs, what is the "Transformer-model" architecture? +In the context of LLMs, what is "Multi-Head Attention"? +In the context of LLMs, what is "Self-Attention"? +In the context of transformer-model architectures, how do attention mechanisms use masks? \ No newline at end of file diff --git a/prompts/parallel-questions.txt b/prompts/parallel-questions.txt new file mode 100644 index 000000000..0ef9d8893 --- /dev/null +++ b/prompts/parallel-questions.txt @@ -0,0 +1,42 @@ +What do you know about Hobbits? +What is quantum field theory? +Why did the chicken cross the road? +Who is the president of the United States? +How do I run CMake on MacOS? +Do you agree that C++ is a really finicky language compared with Python3? +Is it a good idea to invest in technology? +Do you like Wagner's Ring? +Do you think this file input option is really neat? +What should we all do about climate change? +Is time-travel possible within the laws of current physics? +Is it like anything to be a bat? +Once the chicken has crossed the road, does it try to go back? +Who is the greatest of all musical composers? +What is art? +Is there life elsewhere in the universe? +What is intelligence? +What is the difference between knowledge and intelligence? +Will religion ever die? +Do we understand ourselves? +What is the best way to cook eggs? +If you cannot see things, on what basis do you evaluate them? +Explain the role of the np junction in photovoltaic cells? +Is professional sport a good or bad influence on human behaviour? +Is capital punishment immoral? +Should we care about other people? +Who are you? +Which sense would you surrender if you could? +Was Henry Ford a hero or a villain? +Do we need leaders? +What is nucleosynthesis? +Who is the greatest scientist of all time? +Who first observed what came to be known as the photovoltaic effect? +What is nuclear fusion and why does it release energy? +Can you know that you exist? +What is an exoplanet? +Do you like cream? +What is the difference? +Can I know that I exist while I'm dreaming that I'm Descartes? +Who said "I didn't know I thought that until I heard myself saying it"? +Does anything really matter? +Can you explain the unreasonable effectiveness of mathematics? \ No newline at end of file From 0c731ca4039ccff86ffab90eaae4ca98037c4496 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Fri, 6 Oct 2023 16:35:55 +0300 Subject: [PATCH 52/73] prompts : fix editorconfig checks after #3416 --- prompts/parallel-questions.txt | 85 +++++++++++++++++----------------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/prompts/parallel-questions.txt b/prompts/parallel-questions.txt index 0ef9d8893..c9fc7b8b4 100644 --- a/prompts/parallel-questions.txt +++ b/prompts/parallel-questions.txt @@ -1,42 +1,43 @@ -What do you know about Hobbits? -What is quantum field theory? -Why did the chicken cross the road? -Who is the president of the United States? -How do I run CMake on MacOS? -Do you agree that C++ is a really finicky language compared with Python3? -Is it a good idea to invest in technology? -Do you like Wagner's Ring? -Do you think this file input option is really neat? -What should we all do about climate change? -Is time-travel possible within the laws of current physics? -Is it like anything to be a bat? -Once the chicken has crossed the road, does it try to go back? -Who is the greatest of all musical composers? -What is art? -Is there life elsewhere in the universe? -What is intelligence? -What is the difference between knowledge and intelligence? -Will religion ever die? -Do we understand ourselves? -What is the best way to cook eggs? -If you cannot see things, on what basis do you evaluate them? -Explain the role of the np junction in photovoltaic cells? -Is professional sport a good or bad influence on human behaviour? -Is capital punishment immoral? -Should we care about other people? -Who are you? -Which sense would you surrender if you could? -Was Henry Ford a hero or a villain? -Do we need leaders? -What is nucleosynthesis? -Who is the greatest scientist of all time? -Who first observed what came to be known as the photovoltaic effect? -What is nuclear fusion and why does it release energy? -Can you know that you exist? -What is an exoplanet? -Do you like cream? -What is the difference? -Can I know that I exist while I'm dreaming that I'm Descartes? -Who said "I didn't know I thought that until I heard myself saying it"? -Does anything really matter? -Can you explain the unreasonable effectiveness of mathematics? \ No newline at end of file +What do you know about Hobbits? +What is quantum field theory? +Why did the chicken cross the road? +Who is the president of the United States? +How do I run CMake on MacOS? +Do you agree that C++ is a really finicky language compared with Python3? +Is it a good idea to invest in technology? +Do you like Wagner's Ring? +Do you think this file input option is really neat? +What should we all do about climate change? +Is time-travel possible within the laws of current physics? +Is it like anything to be a bat? +Once the chicken has crossed the road, does it try to go back? +Who is the greatest of all musical composers? +What is art? +Is there life elsewhere in the universe? +What is intelligence? +What is the difference between knowledge and intelligence? +Will religion ever die? +Do we understand ourselves? +What is the best way to cook eggs? +If you cannot see things, on what basis do you evaluate them? +Explain the role of the np junction in photovoltaic cells? +Is professional sport a good or bad influence on human behaviour? +Is capital punishment immoral? +Should we care about other people? +Who are you? +Which sense would you surrender if you could? +Was Henry Ford a hero or a villain? +Do we need leaders? +What is nucleosynthesis? +Who is the greatest scientist of all time? +Who first observed what came to be known as the photovoltaic effect? +What is nuclear fusion and why does it release energy? +Can you know that you exist? +What is an exoplanet? +Do you like cream? +What is the difference? +Can I know that I exist while I'm dreaming that I'm Descartes? +Who said "I didn't know I thought that until I heard myself saying it"? +Does anything really matter? +Can you explain the unreasonable effectiveness of mathematics? + From 9ca79d5cbbc8d43f2bff951404b6a40ff1ee3788 Mon Sep 17 00:00:00 2001 From: Kerfuffle <44031344+KerfuffleV2@users.noreply.github.com> Date: Fri, 6 Oct 2023 10:10:13 -0600 Subject: [PATCH 53/73] kv cache slot search improvements (#3493) * kv cache slot search improvements * Use n_ctx in kv find slot for consistency * Ensure kv cache head points to a valid slot in llama_decode internal * Add some comments to prevent dumb people (like me) from getting confused. --- llama.cpp | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/llama.cpp b/llama.cpp index 1a7d37b8d..79ea2b235 100644 --- a/llama.cpp +++ b/llama.cpp @@ -1082,6 +1082,9 @@ struct llama_kv_cell { struct llama_kv_cache { bool has_shift = false; + // Note: The value of head isn't only used to optimize searching + // for a free KV slot. llama_decode_internal also uses it, so it + // cannot be freely changed after a slot has been allocated. uint32_t head = 0; uint32_t size = 0; @@ -1339,6 +1342,8 @@ static bool llama_kv_cache_init( // find an empty slot of size "n_tokens" in the cache // updates the cache head +// Note: On success, it's important that cache.head points +// to the first cell of the slot. static bool llama_kv_cache_find_slot( struct llama_kv_cache & cache, const struct llama_batch & batch) { @@ -1354,8 +1359,8 @@ static bool llama_kv_cache_find_slot( while (true) { if (cache.head + n_tokens > n_ctx) { + n_tested += n_ctx - cache.head; cache.head = 0; - n_tested += n_ctx - cache.head; continue; } @@ -1406,6 +1411,9 @@ static void llama_kv_cache_tokens_rm(struct llama_kv_cache & cache, int32_t c0, cache.cells[i].pos = -1; cache.cells[i].seq_id.clear(); } + + // Searching for a free slot can start here since we know it will be empty. + cache.head = uint32_t(c0); } static void llama_kv_cache_seq_rm( @@ -1413,6 +1421,8 @@ static void llama_kv_cache_seq_rm( llama_seq_id seq_id, llama_pos p0, llama_pos p1) { + uint32_t new_head = cache.size; + if (p0 < 0) p0 = 0; if (p1 < 0) p1 = std::numeric_limits::max(); @@ -1421,9 +1431,13 @@ static void llama_kv_cache_seq_rm( cache.cells[i].seq_id.erase(seq_id); if (cache.cells[i].seq_id.empty()) { cache.cells[i].pos = -1; + if (new_head == cache.size) new_head = i; } } } + + // If we freed up a slot, set head to it so searching can start there. + if (new_head != cache.size) cache.head = new_head; } static void llama_kv_cache_seq_cp( @@ -1435,6 +1449,8 @@ static void llama_kv_cache_seq_cp( if (p0 < 0) p0 = 0; if (p1 < 0) p1 = std::numeric_limits::max(); + cache.head = 0; + for (uint32_t i = 0; i < cache.size; ++i) { if (cache.cells[i].has_seq_id(seq_id_src) && cache.cells[i].pos >= p0 && cache.cells[i].pos < p1) { cache.cells[i].seq_id.insert(seq_id_dst); @@ -1443,12 +1459,18 @@ static void llama_kv_cache_seq_cp( } static void llama_kv_cache_seq_keep(struct llama_kv_cache & cache, llama_seq_id seq_id) { + uint32_t new_head = cache.size; + for (uint32_t i = 0; i < cache.size; ++i) { if (!cache.cells[i].has_seq_id(seq_id)) { cache.cells[i].pos = -1; cache.cells[i].seq_id.clear(); + if (new_head == cache.size) new_head = i; } } + + // If we freed up a slot, set head to it so searching can start there. + if (new_head != cache.size) cache.head = new_head; } static void llama_kv_cache_seq_shift( @@ -1457,6 +1479,8 @@ static void llama_kv_cache_seq_shift( llama_pos p0, llama_pos p1, llama_pos delta) { + uint32_t new_head = cache.size; + if (p0 < 0) p0 = 0; if (p1 < 0) p1 = std::numeric_limits::max(); @@ -1466,12 +1490,17 @@ static void llama_kv_cache_seq_shift( if (cache.cells[i].pos < 0) { cache.cells[i].pos = -1; cache.cells[i].seq_id.clear(); + if (new_head == cache.size) new_head = i; } else { cache.has_shift = true; cache.cells[i].delta = delta; } } } + + // If we freed up a slot, set head to it so searching can start there. + // Otherwise we just start the next search from the beginning. + cache.head = new_head != cache.size ? new_head : 0; } // @@ -4492,10 +4521,6 @@ static int llama_decode_internal( batch.seq_id = seq_id.data(); } - // we always start to search for a free slot from the start of the cache - // TODO: better strategies can be implemented - kv_self.head = 0; - if (!llama_kv_cache_find_slot(kv_self, batch)) { return 1; } @@ -4581,8 +4606,12 @@ static int llama_decode_internal( #endif // update the kv ring buffer - lctx.kv_self.head += n_tokens; lctx.kv_self.has_shift = false; + lctx.kv_self.head += n_tokens; + // Ensure kv cache head points to a valid index. + if (lctx.kv_self.head >= lctx.kv_self.size) { + lctx.kv_self.head = 0; + } #ifdef GGML_PERF // print timing information per ggml operation (for debugging purposes) From cb13d73a720c42d1958bff79b6869d77b26b8cea Mon Sep 17 00:00:00 2001 From: Mihai Date: Fri, 6 Oct 2023 21:39:33 +0300 Subject: [PATCH 54/73] server : docs fix default values and add n_probs (#3506) --- examples/server/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/server/README.md b/examples/server/README.md index 9ee62d06a..8a079ae26 100644 --- a/examples/server/README.md +++ b/examples/server/README.md @@ -114,9 +114,9 @@ node index.js `top_k`: Limit the next token selection to the K most probable tokens (default: 40). - `top_p`: Limit the next token selection to a subset of tokens with a cumulative probability above a threshold P (default: 0.9). + `top_p`: Limit the next token selection to a subset of tokens with a cumulative probability above a threshold P (default: 0.95). - `n_predict`: Set the number of tokens to predict when generating text. **Note:** May exceed the set limit slightly if the last token is a partial multibyte character. When 0, no tokens will be generated but the prompt is evaluated into the cache. (default: 128, -1 = infinity). + `n_predict`: Set the number of tokens to predict when generating text. **Note:** May exceed the set limit slightly if the last token is a partial multibyte character. When 0, no tokens will be generated but the prompt is evaluated into the cache. (default: -1, -1 = infinity). `n_keep`: Specify the number of tokens from the initial prompt to retain when the model resets its internal context. By default, this value is set to 0 (meaning no tokens are kept). Use `-1` to retain all tokens from the initial prompt. @@ -156,6 +156,8 @@ node index.js `logit_bias`: Modify the likelihood of a token appearing in the generated text completion. For example, use `"logit_bias": [[15043,1.0]]` to increase the likelihood of the token 'Hello', or `"logit_bias": [[15043,-1.0]]` to decrease its likelihood. Setting the value to false, `"logit_bias": [[15043,false]]` ensures that the token `Hello` is never produced (default: []). + `n_probs`: If greater than 0, the response also contains the probabilities of top N tokens for each generated token (default: 0) + - **POST** `/tokenize`: Tokenize a given text. *Options:* From 1faaae8c2bdc4a21302e367e0754c3fe74a8113e Mon Sep 17 00:00:00 2001 From: BarfingLemurs <128182951+BarfingLemurs@users.noreply.github.com> Date: Fri, 6 Oct 2023 15:13:36 -0400 Subject: [PATCH 55/73] readme : update models, cuda + ppl instructions (#3510) --- README.md | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index e436818fa..056279562 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,7 @@ as the main playground for developing new features for the [ggml](https://github - [X] [Aquila-7B](https://huggingface.co/BAAI/Aquila-7B) / [AquilaChat-7B](https://huggingface.co/BAAI/AquilaChat-7B) - [X] [Starcoder models](https://github.com/ggerganov/llama.cpp/pull/3187) - [X] [Mistral AI v0.1](https://huggingface.co/mistralai/Mistral-7B-v0.1) +- [X] [Refact](https://huggingface.co/smallcloudai/Refact-1_6B-fim) **Bindings:** @@ -377,7 +378,7 @@ Building the program with BLAS support may lead to some performance improvements - #### cuBLAS - This provides BLAS acceleration using the CUDA cores of your Nvidia GPU. Make sure to have the CUDA toolkit installed. You can download it from your Linux distro's package manager or from here: [CUDA Toolkit](https://developer.nvidia.com/cuda-downloads). + This provides BLAS acceleration using the CUDA cores of your Nvidia GPU. Make sure to have the CUDA toolkit installed. You can download it from your Linux distro's package manager (e.g. `apt install nvidia-cuda-toolkit`) or from here: [CUDA Toolkit](https://developer.nvidia.com/cuda-downloads). - Using `make`: ```bash make LLAMA_CUBLAS=1 @@ -613,6 +614,18 @@ For more information, see [https://huggingface.co/docs/transformers/perplexity]( The perplexity measurements in table above are done against the `wikitext2` test dataset (https://paperswithcode.com/dataset/wikitext-2), with context length of 512. The time per token is measured on a MacBook M1 Pro 32GB RAM using 4 and 8 threads. +#### How to run + +1. Download/extract: https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-2-raw-v1.zip?ref=salesforce-research +2. Run `./perplexity -m models/7B/ggml-model-q4_0.gguf -f wiki.test.raw` +3. Output: +``` +perplexity : calculating perplexity over 655 chunks +24.43 seconds per pass - ETA 4.45 hours +[1]4.5970,[2]5.1807,[3]6.0382,... +``` +And after 4.45 hours, you will have the final perplexity. + ### Interactive mode If you want a more ChatGPT-like experience, you can run in interactive mode by passing `-i` as a parameter. @@ -775,18 +788,6 @@ If your issue is with model generation quality, then please at least scan the fo - [Aligning language models to follow instructions](https://openai.com/research/instruction-following) - [Training language models to follow instructions with human feedback](https://arxiv.org/abs/2203.02155) -#### How to run - -1. Download/extract: https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-2-raw-v1.zip?ref=salesforce-research -2. Run `./perplexity -m models/7B/ggml-model-q4_0.gguf -f wiki.test.raw` -3. Output: -``` -perplexity : calculating perplexity over 655 chunks -24.43 seconds per pass - ETA 4.45 hours -[1]4.5970,[2]5.1807,[3]6.0382,... -``` -And after 4.45 hours, you will have the final perplexity. - ### Android #### Building the Project using Android NDK From 3a716b4dae545c3db307594fbc509a95d3e21b6e Mon Sep 17 00:00:00 2001 From: goerch Date: Sat, 7 Oct 2023 06:57:01 +0200 Subject: [PATCH 56/73] Fix for #3454 (#3455) Fix: `sentencepiece` tokenizers with added tokens failed with an incorrect assertion --- llama.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/llama.cpp b/llama.cpp index 79ea2b235..89dc403b9 100644 --- a/llama.cpp +++ b/llama.cpp @@ -8200,7 +8200,9 @@ int llama_token_to_piece(const struct llama_model * model, llama_token token, ch buf[0] = llama_token_to_byte(model->vocab, token); return 1; } else { - GGML_ASSERT(false); + // TODO: for now we accept all unsupported token types, + // suppressing them like CONTROL tokens. + // GGML_ASSERT(false); } break; } @@ -8216,7 +8218,9 @@ int llama_token_to_piece(const struct llama_model * model, llama_token token, ch } else if (llama_is_control_token(model->vocab, token)) { ; } else { - GGML_ASSERT(false); + // TODO: for now we accept all unsupported token types, + // suppressing them like CONTROL tokens. + // GGML_ASSERT(false); } break; } From 0e797c2fc571b866090f7d60ac7d39d8533593f2 Mon Sep 17 00:00:00 2001 From: Phillip Kravtsov Date: Sat, 7 Oct 2023 00:12:43 -0700 Subject: [PATCH 57/73] llm : support Adept Persimmon 8B (#3410) * Produces garbage output * wip: correct tensors up to RoPE * correct tensors thru RoPE * Correct outputs through masked & softmax'd KQ * fp32 works * Rename adept->persimmon * Produces correct outputs * clean up convert scripts * remove printing logic from ggml.c * remove prints from llama.cpp & fix merge * trivial cleanups * Add offload funcs * update conversion script to directly take adept artifacts rather than .saftensors file * Fix norm eps bug * Support sqr and concat on metal, persimmon-8b-q4 runs correctly * Small changes from review * Formatting changes * Minor changes to conversion script * Remove old script * Fix editorconfig formatting * Fix build * add overlooked offload code ggml-ci --- convert-persimmon-to-gguf.py | 130 +++++++++ ggml-metal.m | 54 ++++ ggml-metal.metal | 63 +++++ gguf-py/gguf/gguf.py | 161 +++++++---- llama.cpp | 522 +++++++++++++++++++++++++++++++++-- 5 files changed, 854 insertions(+), 76 deletions(-) create mode 100644 convert-persimmon-to-gguf.py diff --git a/convert-persimmon-to-gguf.py b/convert-persimmon-to-gguf.py new file mode 100644 index 000000000..e022ffe46 --- /dev/null +++ b/convert-persimmon-to-gguf.py @@ -0,0 +1,130 @@ +import torch +import os +from pprint import pprint +import sys +import argparse +from pathlib import Path +from sentencepiece import SentencePieceProcessor +if 'NO_LOCAL_GGUF' not in os.environ: + sys.path.insert(1, str(Path(__file__).parent / 'gguf-py' / 'gguf')) +import gguf + +def _flatten_dict(dct, tensors, prefix=None): + assert isinstance(dct, dict) + for key in dct.keys(): + new_prefix = prefix + '.' + key if prefix is not None else key + if isinstance(dct[key], torch.Tensor): + tensors[new_prefix] = dct[key] + elif isinstance(dct[key], dict): + _flatten_dict(dct[key], tensors, new_prefix) + else: + raise ValueError(type(dct[key])) + return None + +def _get_sentencepiece_tokenizer_info(dir_model: Path): + tokenizer_path = dir_model / 'adept_vocab.model' + print('gguf: getting sentencepiece tokenizer from', tokenizer_path) + tokenizer = SentencePieceProcessor(str(tokenizer_path)) + print('gguf: adding tokens') + tokens: list[bytes] = [] + scores: list[float] = [] + toktypes: list[int] = [] + + for i in range(tokenizer.vocab_size()): + text: bytes + score: float + + piece = tokenizer.id_to_piece(i) + text = piece.encode("utf-8") + score = tokenizer.get_score(i) + + toktype = 1 + if tokenizer.is_unknown(i): + toktype = 2 + if tokenizer.is_control(i): + toktype = 3 + if tokenizer.is_unused(i): + toktype = 5 + if tokenizer.is_byte(i): + toktype = 6 + + tokens.append(text) + scores.append(score) + toktypes.append(toktype) + pass + return tokens, scores, toktypes + +def main(): + parser = argparse.ArgumentParser(description="Convert a Persimmon model from Adept (e.g. Persimmon 8b chat) to a GGML compatible file") + parser.add_argument("--outfile", type=Path, help="path to write to; default: based on input") + parser.add_argument("--ckpt-path", type=Path, help="path to persimmon checkpoint .pt file") + parser.add_argument("--model-dir", type=Path, help="directory containing model e.g. 8b_chat_model_release") + parser.add_argument("--adept-inference-dir", type=str, help="path to adept-inference code directory") + args = parser.parse_args() + sys.path.append(str(args.adept_inference_dir)) + persimmon_model = torch.load(args.ckpt_path) + hparams = persimmon_model['args'] + pprint(hparams) + tensors = {} + _flatten_dict(persimmon_model['model'], tensors, None) + + arch = gguf.MODEL_ARCH.PERSIMMON + gguf_writer = gguf.GGUFWriter(args.outfile, gguf.MODEL_ARCH_NAMES[arch]) + + block_count = hparams.num_layers + head_count = hparams.num_attention_heads + head_count_kv = head_count + ctx_length = hparams.seq_length + hidden_size = hparams.hidden_size + + gguf_writer.add_name('persimmon-8b-chat') + gguf_writer.add_context_length(ctx_length) + gguf_writer.add_embedding_length(hidden_size) + gguf_writer.add_block_count(block_count) + gguf_writer.add_feed_forward_length(hparams.ffn_hidden_size) + gguf_writer.add_rope_dimension_count(hidden_size // head_count) + gguf_writer.add_head_count(head_count) + gguf_writer.add_head_count_kv(head_count_kv) + gguf_writer.add_rope_freq_base(hparams.rotary_emb_base) + gguf_writer.add_layer_norm_eps(hparams.layernorm_epsilon) + + tokens, scores, toktypes = _get_sentencepiece_tokenizer_info(args.model_dir) + gguf_writer.add_tokenizer_model('llama') + gguf_writer.add_token_list(tokens) + gguf_writer.add_token_scores(scores) + gguf_writer.add_token_types(toktypes) + gguf_writer.add_bos_token_id(71013) + gguf_writer.add_eos_token_id(71013) + + tensor_map = gguf.get_tensor_name_map(arch, block_count) + print(tensor_map) + for name in tensors.keys(): + data = tensors[name] + if name.endswith(".self_attention.rotary_emb.inv_freq"): + continue + old_dtype = data.dtype + # TODO: FP16 conversion produces garbage outputs. (Q8_0 does not, so..?) + data = data.to(torch.float32).squeeze().numpy() + new_name = tensor_map.get_name(name, try_suffixes = (".weight", ".bias")) + if new_name is None: + print("Can not map tensor '" + name + "'") + sys.exit() + n_dims = len(data.shape) + print(new_name + ", n_dims = " + str(n_dims) + ", " + str(old_dtype) + " --> " + str(data.dtype)) + gguf_writer.add_tensor(new_name, data) + print("gguf: write header") + gguf_writer.write_header_to_file() + print("gguf: write metadata") + gguf_writer.write_kv_data_to_file() + print("gguf: write tensors") + gguf_writer.write_tensors_to_file() + + gguf_writer.close() + + print(f"gguf: model successfully exported to '{args.outfile}'") + print("") + + + +if __name__ == '__main__': + main() diff --git a/ggml-metal.m b/ggml-metal.m index 866fed434..c7fb89054 100644 --- a/ggml-metal.m +++ b/ggml-metal.m @@ -109,6 +109,8 @@ struct ggml_metal_context { GGML_METAL_DECL_KERNEL(cpy_f32_f16); GGML_METAL_DECL_KERNEL(cpy_f32_f32); GGML_METAL_DECL_KERNEL(cpy_f16_f16); + GGML_METAL_DECL_KERNEL(concat); + GGML_METAL_DECL_KERNEL(sqr); #undef GGML_METAL_DECL_KERNEL }; @@ -300,6 +302,8 @@ struct ggml_metal_context * ggml_metal_init(int n_cb) { GGML_METAL_ADD_KERNEL(cpy_f32_f16); GGML_METAL_ADD_KERNEL(cpy_f32_f32); GGML_METAL_ADD_KERNEL(cpy_f16_f16); + GGML_METAL_ADD_KERNEL(concat); + GGML_METAL_ADD_KERNEL(sqr); #undef GGML_METAL_ADD_KERNEL } @@ -375,6 +379,8 @@ void ggml_metal_free(struct ggml_metal_context * ctx) { GGML_METAL_DEL_KERNEL(cpy_f32_f16); GGML_METAL_DEL_KERNEL(cpy_f32_f32); GGML_METAL_DEL_KERNEL(cpy_f16_f16); + GGML_METAL_DEL_KERNEL(concat); + GGML_METAL_DEL_KERNEL(sqr); #undef GGML_METAL_DEL_KERNEL @@ -766,6 +772,43 @@ void ggml_metal_graph_compute( { // noop } break; + case GGML_OP_CONCAT: + { + + int64_t nb = ne00; + [encoder setComputePipelineState:ctx->pipeline_concat]; + [encoder setBuffer:id_src0 offset:offs_src0 atIndex:0]; + [encoder setBuffer:id_src1 offset:offs_src1 atIndex:1]; + [encoder setBuffer:id_dst offset:offs_dst atIndex:2]; + [encoder setBytes:&ne00 length:sizeof(ne00) atIndex:3]; + [encoder setBytes:&ne01 length:sizeof(ne01) atIndex:4]; + [encoder setBytes:&ne02 length:sizeof(ne02) atIndex:5]; + [encoder setBytes:&ne03 length:sizeof(ne03) atIndex:6]; + [encoder setBytes:&nb00 length:sizeof(nb00) atIndex:7]; + [encoder setBytes:&nb01 length:sizeof(nb01) atIndex:8]; + [encoder setBytes:&nb02 length:sizeof(nb02) atIndex:9]; + [encoder setBytes:&nb03 length:sizeof(nb03) atIndex:10]; + [encoder setBytes:&ne10 length:sizeof(ne10) atIndex:11]; + [encoder setBytes:&ne11 length:sizeof(ne11) atIndex:12]; + [encoder setBytes:&ne12 length:sizeof(ne12) atIndex:13]; + [encoder setBytes:&ne13 length:sizeof(ne13) atIndex:14]; + [encoder setBytes:&nb10 length:sizeof(nb10) atIndex:15]; + [encoder setBytes:&nb11 length:sizeof(nb11) atIndex:16]; + [encoder setBytes:&nb12 length:sizeof(nb12) atIndex:17]; + [encoder setBytes:&nb13 length:sizeof(nb13) atIndex:18]; + [encoder setBytes:&ne0 length:sizeof(ne0) atIndex:19]; + [encoder setBytes:&ne1 length:sizeof(ne1) atIndex:20]; + [encoder setBytes:&ne2 length:sizeof(ne2) atIndex:21]; + [encoder setBytes:&ne3 length:sizeof(ne3) atIndex:22]; + [encoder setBytes:&nb0 length:sizeof(nb0) atIndex:23]; + [encoder setBytes:&nb1 length:sizeof(nb1) atIndex:24]; + [encoder setBytes:&nb2 length:sizeof(nb2) atIndex:25]; + [encoder setBytes:&nb3 length:sizeof(nb3) atIndex:26]; + [encoder setBytes:&nb length:sizeof(nb) atIndex:27]; + + const int nth = MIN(1024, ne0); + [encoder dispatchThreadgroups:MTLSizeMake(ne1, ne2, ne3) threadsPerThreadgroup:MTLSizeMake(nth, 1, 1)]; + } break; case GGML_OP_ADD: { GGML_ASSERT(ggml_is_contiguous(src0)); @@ -903,6 +946,17 @@ void ggml_metal_graph_compute( GGML_ASSERT(false); } } break; + case GGML_OP_SQR: + { + GGML_ASSERT(ggml_is_contiguous(src0)); + + [encoder setComputePipelineState:ctx->pipeline_sqr]; + [encoder setBuffer:id_src0 offset:offs_src0 atIndex:0]; + [encoder setBuffer:id_dst offset:offs_dst atIndex:1]; + + const int64_t n = ggml_nelements(dst); + [encoder dispatchThreadgroups:MTLSizeMake(n, 1, 1) threadsPerThreadgroup:MTLSizeMake(1, 1, 1)]; + } break; case GGML_OP_SOFT_MAX: { const int nth = MIN(32, ne00); diff --git a/ggml-metal.metal b/ggml-metal.metal index 5a860098f..9bd94e82b 100644 --- a/ggml-metal.metal +++ b/ggml-metal.metal @@ -132,6 +132,13 @@ kernel void kernel_relu( dst[tpig] = max(0.0f, src0[tpig]); } +kernel void kernel_sqr( + device const float * src0, + device float * dst, + uint tpig[[thread_position_in_grid]]) { + dst[tpig] = src0[tpig] * src0[tpig]; +} + constant float GELU_COEF_A = 0.044715f; constant float SQRT_2_OVER_PI = 0.79788456080286535587989211986876f; @@ -1098,6 +1105,62 @@ kernel void kernel_cpy_f32_f32( } } +kernel void kernel_concat( + device const char * src0, + device const char * src1, + device char * dst, + constant int64_t & ne00, + constant int64_t & ne01, + constant int64_t & ne02, + constant int64_t & ne03, + constant uint64_t & nb00, + constant uint64_t & nb01, + constant uint64_t & nb02, + constant uint64_t & nb03, + constant int64_t & ne10, + constant int64_t & ne11, + constant int64_t & ne12, + constant int64_t & ne13, + constant uint64_t & nb10, + constant uint64_t & nb11, + constant uint64_t & nb12, + constant uint64_t & nb13, + constant int64_t & ne0, + constant int64_t & ne1, + constant int64_t & ne2, + constant int64_t & ne3, + constant uint64_t & nb0, + constant uint64_t & nb1, + constant uint64_t & nb2, + constant uint64_t & nb3, + uint3 tgpig[[threadgroup_position_in_grid]], + uint3 tpitg[[thread_position_in_threadgroup]], + uint3 ntg[[threads_per_threadgroup]]) { + + const int64_t i03 = tgpig.z; + const int64_t i02 = tgpig.y; + const int64_t i01 = tgpig.x; + + const int64_t i13 = i03 % ne13; + const int64_t i12 = i02 % ne12; + const int64_t i11 = i01 % ne11; + + device const char * src0_ptr = src0 + i03 * nb03 + i02 * nb02 + i01 * nb01 + tpitg.x*nb00; + device const char * src1_ptr = src1 + i13*nb13 + i12*nb12 + i11*nb11 + tpitg.x*nb10; + device char * dst_ptr = dst + i03*nb3 + i02*nb2 + i01*nb1 + tpitg.x*nb0; + + for (int i0 = tpitg.x; i0 < ne0; i0 += ntg.x) { + if (i02 < ne02) { + ((device float *)dst_ptr)[0] = ((device float *)src0_ptr)[0]; + src0_ptr += ntg.x*nb00; + } else { + ((device float *)dst_ptr)[0] = ((device float *)src1_ptr)[0]; + src1_ptr += ntg.x*nb10; + } + dst_ptr += ntg.x*nb0; + } +} + //============================================ k-quants ====================================================== #ifndef QK_K diff --git a/gguf-py/gguf/gguf.py b/gguf-py/gguf/gguf.py index a2c570d7e..fb677a6ed 100644 --- a/gguf-py/gguf/gguf.py +++ b/gguf-py/gguf/gguf.py @@ -85,6 +85,7 @@ class MODEL_ARCH(IntEnum): GPTNEOX : int = auto() MPT : int = auto() STARCODER : int = auto() + PERSIMMON : int = auto() REFACT : int = auto() BERT : int = auto() @@ -108,6 +109,8 @@ class MODEL_TENSOR(IntEnum): FFN_DOWN : int = auto() FFN_UP : int = auto() FFN_NORM : int = auto() + ATTN_Q_NORM : int = auto() + ATTN_K_NORM : int = auto() MODEL_ARCH_NAMES: dict[MODEL_ARCH, str] = { @@ -119,6 +122,7 @@ MODEL_ARCH_NAMES: dict[MODEL_ARCH, str] = { MODEL_ARCH.GPTNEOX: "gptneox", MODEL_ARCH.MPT: "mpt", MODEL_ARCH.STARCODER: "starcoder", + MODEL_ARCH.PERSIMMON: "persimmon", MODEL_ARCH.REFACT: "refact", MODEL_ARCH.BERT: "bert", } @@ -130,7 +134,6 @@ TENSOR_NAMES: dict[MODEL_TENSOR, str] = { MODEL_TENSOR.OUTPUT_NORM: "output_norm", MODEL_TENSOR.OUTPUT: "output", MODEL_TENSOR.ROPE_FREQS: "rope_freqs", - MODEL_TENSOR.ATTN_NORM: "blk.{bid}.attn_norm", MODEL_TENSOR.ATTN_NORM_2: "blk.{bid}.attn_norm_2", MODEL_TENSOR.ATTN_QKV: "blk.{bid}.attn_qkv", @@ -139,6 +142,8 @@ TENSOR_NAMES: dict[MODEL_TENSOR, str] = { MODEL_TENSOR.ATTN_V: "blk.{bid}.attn_v", MODEL_TENSOR.ATTN_OUT: "blk.{bid}.attn_output", MODEL_TENSOR.ATTN_ROT_EMBD: "blk.{bid}.attn_rot_embd", + MODEL_TENSOR.ATTN_Q_NORM: "blk.{bid}.attn_q_norm", + MODEL_TENSOR.ATTN_K_NORM: "blk.{bid}.attn_k_norm", MODEL_TENSOR.FFN_NORM: "blk.{bid}.ffn_norm", MODEL_TENSOR.FFN_GATE: "blk.{bid}.ffn_gate", MODEL_TENSOR.FFN_DOWN: "blk.{bid}.ffn_down", @@ -249,6 +254,20 @@ MODEL_TENSORS: dict[MODEL_ARCH, list[MODEL_TENSOR]] = { MODEL_TENSOR.FFN_DOWN, MODEL_TENSOR.FFN_UP, ], + MODEL_ARCH.PERSIMMON: [ + MODEL_TENSOR.TOKEN_EMBD, + MODEL_TENSOR.OUTPUT, + MODEL_TENSOR.OUTPUT_NORM, + MODEL_TENSOR.ATTN_NORM, + MODEL_TENSOR.ATTN_QKV, + MODEL_TENSOR.ATTN_OUT, + MODEL_TENSOR.FFN_NORM, + MODEL_TENSOR.FFN_DOWN, + MODEL_TENSOR.FFN_UP, + MODEL_TENSOR.ATTN_Q_NORM, + MODEL_TENSOR.ATTN_K_NORM, + MODEL_TENSOR.ATTN_ROT_EMBD, + ], MODEL_ARCH.REFACT: [ MODEL_TENSOR.TOKEN_EMBD, MODEL_TENSOR.OUTPUT_NORM, @@ -279,6 +298,9 @@ MODEL_TENSOR_SKIP: dict[MODEL_ARCH, list[MODEL_TENSOR]] = { MODEL_TENSOR.ROPE_FREQS, MODEL_TENSOR.ATTN_ROT_EMBD, ], + MODEL_ARCH.PERSIMMON: [ + MODEL_TENSOR.ROPE_FREQS, + ] } @@ -286,12 +308,13 @@ class TensorNameMap: mappings_cfg: dict[MODEL_TENSOR, tuple[str, ...]] = { # Token embeddings MODEL_TENSOR.TOKEN_EMBD: ( - "gpt_neox.embed_in", # gptneox - "transformer.wte", # gpt2 gpt-j mpt refact - "transformer.word_embeddings", # falcon - "model.embed_tokens", # llama-hf - "tok_embeddings", # llama-pth - "embeddings.word_embeddings", # bert + "gpt_neox.embed_in", # gptneox + "transformer.wte", # gpt2 gpt-j mpt refact + "transformer.word_embeddings", # falcon + "model.embed_tokens", # llama-hf + "tok_embeddings", # llama-pth + "embeddings.word_embeddings", # bert + "language_model.embedding.word_embeddings", # persimmon ), # Token type embeddings @@ -307,20 +330,22 @@ class TensorNameMap: # Output MODEL_TENSOR.OUTPUT: ( - "embed_out", # gptneox - "lm_head", # gpt2 gpt-j mpt falcon llama-hf baichuan - "output", # llama-pth + "embed_out", # gptneox + "lm_head", # gpt2 mpt falcon llama-hf baichuan + "output", # llama-pth + "word_embeddings_for_head", # persimmon ), # Output norm MODEL_TENSOR.OUTPUT_NORM: ( - "gpt_neox.final_layer_norm", # gptneox - "transformer.ln_f", # gpt2 gpt-j falcon - "model.norm", # llama-hf baichuan - "norm", # llama-pth - "embeddings.LayerNorm", # bert - "transformer.norm_f", # mpt - "ln_f", # refact + "gpt_neox.final_layer_norm", # gptneox + "transformer.ln_f", # gpt2 gpt-j falcon + "model.norm", # llama-hf baichuan + "norm", # llama-pth + "embeddings.LayerNorm", # bert + "transformer.norm_f", # mpt + "ln_f", # refact + "language_model.encoder.final_layernorm", # persimmon ), # Rope frequencies @@ -332,14 +357,15 @@ class TensorNameMap: block_mappings_cfg: dict[MODEL_TENSOR, tuple[str, ...]] = { # Attention norm MODEL_TENSOR.ATTN_NORM: ( - "gpt_neox.layers.{bid}.input_layernorm", # gptneox - "transformer.h.{bid}.ln_1", # gpt2 gpt-j refact - "transformer.blocks.{bid}.norm_1", # mpt - "transformer.h.{bid}.input_layernorm", # falcon7b - "transformer.h.{bid}.ln_mlp", # falcon40b - "model.layers.{bid}.input_layernorm", # llama-hf - "layers.{bid}.attention_norm", # llama-pth - "encoder.layer.{bid}.attention.output.LayerNorm", # bert + "gpt_neox.layers.{bid}.input_layernorm", # gptneox + "transformer.h.{bid}.ln_1", # gpt2 gpt-j refact + "transformer.blocks.{bid}.norm_1", # mpt + "transformer.h.{bid}.input_layernorm", # falcon7b + "transformer.h.{bid}.ln_mlp", # falcon40b + "model.layers.{bid}.input_layernorm", # llama-hf + "layers.{bid}.attention_norm", # llama-pth + "encoder.layer.{bid}.attention.output.LayerNorm", # bert + "language_model.encoder.layers.{bid}.input_layernorm", # persimmon ), # Attention norm 2 @@ -349,10 +375,11 @@ class TensorNameMap: # Attention query-key-value MODEL_TENSOR.ATTN_QKV: ( - "gpt_neox.layers.{bid}.attention.query_key_value", # gptneox - "transformer.h.{bid}.attn.c_attn", # gpt2 - "transformer.blocks.{bid}.attn.Wqkv", # mpt - "transformer.h.{bid}.self_attention.query_key_value", # falcon + "gpt_neox.layers.{bid}.attention.query_key_value", # gptneox + "transformer.h.{bid}.attn.c_attn", # gpt2 + "transformer.blocks.{bid}.attn.Wqkv", # mpt + "transformer.h.{bid}.self_attention.query_key_value", # falcon + "language_model.encoder.layers.{bid}.self_attention.query_key_value", # persimmon ), # Attention query @@ -381,14 +408,15 @@ class TensorNameMap: # Attention output MODEL_TENSOR.ATTN_OUT: ( - "gpt_neox.layers.{bid}.attention.dense", # gptneox - "transformer.h.{bid}.attn.c_proj", # gpt2 refact - "transformer.blocks.{bid}.attn.out_proj", # mpt - "transformer.h.{bid}.self_attention.dense", # falcon - "model.layers.{bid}.self_attn.o_proj", # llama-hf - "layers.{bid}.attention.wo", # llama-pth - "encoder.layer.{bid}.attention.output.dense", # bert - "transformer.h.{bid}.attn.out_proj", # gpt-j + "gpt_neox.layers.{bid}.attention.dense", # gptneox + "transformer.h.{bid}.attn.c_proj", # gpt2 refact + "transformer.blocks.{bid}.attn.out_proj", # mpt + "transformer.h.{bid}.self_attention.dense", # falcon + "model.layers.{bid}.self_attn.o_proj", # llama-hf + "layers.{bid}.attention.wo", # llama-pth + "encoder.layer.{bid}.attention.output.dense", # bert + "transformer.h.{bid}.attn.out_proj", # gpt-j + "language_model.encoder.layers.{bid}.self_attention.dense" # persimmon ), # Rotary embeddings @@ -399,24 +427,26 @@ class TensorNameMap: # Feed-forward norm MODEL_TENSOR.FFN_NORM: ( - "gpt_neox.layers.{bid}.post_attention_layernorm", # gptneox - "transformer.h.{bid}.ln_2", # gpt2 refact - "transformer.blocks.{bid}.norm_2", # mpt - "model.layers.{bid}.post_attention_layernorm", # llama-hf - "layers.{bid}.ffn_norm", # llama-pth - "encoder.layer.{bid}.output.LayerNorm", # bert + "gpt_neox.layers.{bid}.post_attention_layernorm", # gptneox + "transformer.h.{bid}.ln_2", # gpt2 refact + "transformer.blocks.{bid}.norm_2", # mpt + "model.layers.{bid}.post_attention_layernorm", # llama-hf + "layers.{bid}.ffn_norm", # llama-pth + "encoder.layer.{bid}.output.LayerNorm", # bert + "language_model.encoder.layers.{bid}.post_attention_layernorm", # persimmon ), # Feed-forward up MODEL_TENSOR.FFN_UP: ( - "gpt_neox.layers.{bid}.mlp.dense_h_to_4h", # gptneox - "transformer.h.{bid}.mlp.c_fc", # gpt2 - "transformer.blocks.{bid}.ffn.up_proj", # mpt - "transformer.h.{bid}.mlp.dense_h_to_4h", # falcon - "model.layers.{bid}.mlp.up_proj", # llama-hf refact - "layers.{bid}.feed_forward.w3", # llama-pth - "encoder.layer.{bid}.intermediate.dense", # bert - "transformer.h.{bid}.mlp.fc_in", # gpt-j + "gpt_neox.layers.{bid}.mlp.dense_h_to_4h", # gptneox + "transformer.h.{bid}.mlp.c_fc", # gpt2 + "transformer.blocks.{bid}.ffn.up_proj", # mpt + "transformer.h.{bid}.mlp.dense_h_to_4h", # falcon + "model.layers.{bid}.mlp.up_proj", # llama-hf refact + "layers.{bid}.feed_forward.w3", # llama-pth + "encoder.layer.{bid}.intermediate.dense", # bert + "transformer.h.{bid}.mlp.fc_in", # gpt-j + "language_model.encoder.layers.{bid}.mlp.dense_h_to_4h", # persimmon ), # Feed-forward gate @@ -427,15 +457,28 @@ class TensorNameMap: # Feed-forward down MODEL_TENSOR.FFN_DOWN: ( - "gpt_neox.layers.{bid}.mlp.dense_4h_to_h", # gptneox - "transformer.h.{bid}.mlp.c_proj", # gpt2 refact - "transformer.blocks.{bid}.ffn.down_proj", # mpt - "transformer.h.{bid}.mlp.dense_4h_to_h", # falcon - "model.layers.{bid}.mlp.down_proj", # llama-hf - "layers.{bid}.feed_forward.w2", # llama-pth - "encoder.layer.{bid}.output.dense", # bert - "transformer.h.{bid}.mlp.fc_out", # gpt-j + "gpt_neox.layers.{bid}.mlp.dense_4h_to_h", # gptneox + "transformer.h.{bid}.mlp.c_proj", # gpt2 refact + "transformer.blocks.{bid}.ffn.down_proj", # mpt + "transformer.h.{bid}.mlp.dense_4h_to_h", # falcon + "model.layers.{bid}.mlp.down_proj", # llama-hf + "layers.{bid}.feed_forward.w2", # llama-pth + "encoder.layer.{bid}.output.dense", # bert + "transformer.h.{bid}.mlp.fc_out", # gpt-j + "language_model.encoder.layers.{bid}.mlp.dense_4h_to_h", # persimmon ), + + MODEL_TENSOR.ATTN_Q_NORM: ( + "language_model.encoder.layers.{bid}.self_attention.q_layernorm", + ), + + MODEL_TENSOR.ATTN_K_NORM: ( + "language_model.encoder.layers.{bid}.self_attention.k_layernorm", + ), + + MODEL_TENSOR.ROPE_FREQS: ( + "language_model.encoder.layers.{bid}.self_attention.rotary_emb.inv_freq", # persimmon + ) } mapping: dict[str, tuple[MODEL_TENSOR, str]] diff --git a/llama.cpp b/llama.cpp index 89dc403b9..227cd9d03 100644 --- a/llama.cpp +++ b/llama.cpp @@ -186,6 +186,7 @@ enum llm_arch { LLM_ARCH_GPTNEOX, LLM_ARCH_MPT, LLM_ARCH_STARCODER, + LLM_ARCH_PERSIMMON, LLM_ARCH_REFACT, LLM_ARCH_UNKNOWN, }; @@ -199,6 +200,7 @@ static std::map LLM_ARCH_NAMES = { { LLM_ARCH_MPT, "mpt" }, { LLM_ARCH_BAICHUAN, "baichuan" }, { LLM_ARCH_STARCODER, "starcoder" }, + { LLM_ARCH_PERSIMMON, "persimmon" }, { LLM_ARCH_REFACT, "refact" }, }; @@ -318,6 +320,8 @@ enum llm_tensor { LLM_TENSOR_FFN_DOWN, LLM_TENSOR_FFN_UP, LLM_TENSOR_FFN_NORM, + LLM_TENSOR_ATTN_Q_NORM, + LLM_TENSOR_ATTN_K_NORM, }; static std::map> LLM_TENSOR_NAMES = { @@ -399,6 +403,23 @@ static std::map> LLM_TENSOR_NAMES = { LLM_TENSOR_FFN_UP, "blk.%d.ffn_up" }, }, }, + { + LLM_ARCH_PERSIMMON, + { + { LLM_TENSOR_TOKEN_EMBD, "token_embd"}, + { LLM_TENSOR_OUTPUT_NORM, "output_norm"}, + { LLM_TENSOR_OUTPUT, "output"}, + { LLM_TENSOR_ATTN_NORM, "blk.%d.attn_norm"}, + { LLM_TENSOR_ATTN_QKV, "blk.%d.attn_qkv"}, + { LLM_TENSOR_ATTN_OUT, "blk.%d.attn_output"}, + { LLM_TENSOR_ATTN_Q_NORM, "blk.%d.attn_q_norm"}, + { LLM_TENSOR_ATTN_K_NORM, "blk.%d.attn_k_norm"}, + { LLM_TENSOR_FFN_NORM, "blk.%d.ffn_norm"}, + { LLM_TENSOR_FFN_DOWN, "blk.%d.ffn_down"}, + { LLM_TENSOR_FFN_UP, "blk.%d.ffn_up"}, + { LLM_TENSOR_ATTN_ROT_EMBD, "blk.%d.attn_rot_embd"}, + }, + }, { LLM_ARCH_MPT, { @@ -959,6 +980,7 @@ enum e_model { MODEL_1B, MODEL_3B, MODEL_7B, + MODEL_8B, MODEL_13B, MODEL_15B, MODEL_30B, @@ -1041,6 +1063,10 @@ struct llama_layer { struct ggml_tensor * attn_norm_b; struct ggml_tensor * attn_norm_2; struct ggml_tensor * attn_norm_2_b; + struct ggml_tensor * attn_q_norm; + struct ggml_tensor * attn_q_norm_b; + struct ggml_tensor * attn_k_norm; + struct ggml_tensor * attn_k_norm_b; // attention struct ggml_tensor * wq; @@ -1901,6 +1927,7 @@ static const char * llama_model_type_name(e_model type) { case MODEL_1B: return "1B"; case MODEL_3B: return "3B"; case MODEL_7B: return "7B"; + case MODEL_8B: return "8B"; case MODEL_13B: return "13B"; case MODEL_15B: return "15B"; case MODEL_30B: return "30B"; @@ -2013,6 +2040,14 @@ static void llm_load_hparams( default: model.type = e_model::MODEL_UNKNOWN; } } break; + case LLM_ARCH_PERSIMMON: + { + GGUF_GET_KEY(ctx, hparams.f_norm_eps, gguf_get_val_f32, GGUF_TYPE_FLOAT32, true, kv(LLM_KV_ATTENTION_LAYERNORM_EPS)); + switch (hparams.n_layer) { + case 36: model.type = e_model::MODEL_8B; break; + default: model.type = e_model::MODEL_UNKNOWN; + } + } case LLM_ARCH_REFACT: { GGUF_GET_KEY(ctx, hparams.f_norm_rms_eps, gguf_get_val_f32, GGUF_TYPE_FLOAT32, true, kv(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS)); @@ -2549,6 +2584,67 @@ static void llm_load_tensors( } } } break; + case LLM_ARCH_PERSIMMON: + { + model.tok_embeddings = ml.create_tensor(ctx, tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, GGML_BACKEND_CPU); + + { + ggml_backend backend_norm; + ggml_backend backend_output; + + if (n_gpu_layers > int(n_layer)) { + // norm is not performance relevant on its own but keeping it in VRAM reduces data copying + // on Windows however this is detrimental unless everything is on the GPU +#ifndef _WIN32 + backend_norm = LLAMA_BACKEND_OFFLOAD; +#else + backend_norm = n_gpu_layers <= (int) n_layer + 2 ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; +#endif // _WIN32 + + backend_output = LLAMA_BACKEND_OFFLOAD_SPLIT; + } else { + backend_norm = GGML_BACKEND_CPU; + backend_output = GGML_BACKEND_CPU; + } + + model.output_norm = ml.create_tensor(ctx, tn(LLM_TENSOR_OUTPUT_NORM, "weight"), {n_embd}, backend_norm); + model.output_norm_b = ml.create_tensor(ctx, tn(LLM_TENSOR_OUTPUT_NORM, "bias"), {n_embd}, backend_norm); + model.output = ml.create_tensor(ctx, tn(LLM_TENSOR_OUTPUT, "weight"), {n_embd, n_vocab}, backend_output); + + if (backend_norm == GGML_BACKEND_GPU) { + vram_weights += ggml_nbytes(model.output_norm); + vram_weights += ggml_nbytes(model.output_norm_b); + } + if (backend_output == GGML_BACKEND_GPU_SPLIT) { + vram_weights += ggml_nbytes(model.output); + } + } + + const uint32_t n_ff = hparams.n_ff; + const int i_gpu_start = n_layer - n_gpu_layers; + model.layers.resize(n_layer); + for (uint32_t i = 0; i < n_layer; ++i) { + const ggml_backend backend = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; + const ggml_backend backend_split = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD_SPLIT; + auto & layer = model.layers[i]; + layer.attn_norm = ml.create_tensor(ctx, tn(LLM_TENSOR_ATTN_NORM, "weight", i), {n_embd}, backend); + layer.attn_norm_b = ml.create_tensor(ctx, tn(LLM_TENSOR_ATTN_NORM, "bias", i), {n_embd}, backend); + layer.wqkv = ml.create_tensor(ctx, tn(LLM_TENSOR_ATTN_QKV, "weight", i), {n_embd, n_embd + 2*n_embd_gqa}, backend_split); + layer.bqkv = ml.create_tensor(ctx, tn(LLM_TENSOR_ATTN_QKV, "bias", i), {n_embd + 2*n_embd_gqa}, backend_split); + layer.wo = ml.create_tensor(ctx, tn(LLM_TENSOR_ATTN_OUT, "weight", i), {n_embd, n_embd}, backend_split); + layer.bo = ml.create_tensor(ctx, tn(LLM_TENSOR_ATTN_OUT, "bias", i), {n_embd}, backend_split); + layer.w2 = ml.create_tensor(ctx, tn(LLM_TENSOR_FFN_DOWN, "weight", i), {n_ff, n_embd}, backend_split); + layer.b2 = ml.create_tensor(ctx, tn(LLM_TENSOR_FFN_DOWN, "bias", i), {n_embd}, backend_split); + layer.w3 = ml.create_tensor(ctx, tn(LLM_TENSOR_FFN_UP, "weight", i), {n_embd, n_ff}, backend_split); + layer.b3 = ml.create_tensor(ctx, tn(LLM_TENSOR_FFN_UP, "bias", i), {n_ff}, backend_split); + layer.ffn_norm = ml.create_tensor(ctx, tn(LLM_TENSOR_FFN_NORM, "weight", i), {n_embd}, backend); + layer.ffn_norm_b = ml.create_tensor(ctx, tn(LLM_TENSOR_FFN_NORM, "bias", i), {n_embd}, backend); + layer.attn_q_norm = ml.create_tensor(ctx, tn(LLM_TENSOR_ATTN_Q_NORM, "weight", i), {64}, backend); + layer.attn_q_norm_b = ml.create_tensor(ctx, tn(LLM_TENSOR_ATTN_Q_NORM, "bias", i), {64}, backend); + layer.attn_k_norm = ml.create_tensor(ctx, tn(LLM_TENSOR_ATTN_K_NORM, "weight", i), {64}, backend); + layer.attn_k_norm_b = ml.create_tensor(ctx, tn(LLM_TENSOR_ATTN_K_NORM, "bias", i), {64}, backend); + } + } break; default: throw std::runtime_error("unknown architecture"); } @@ -2658,8 +2754,8 @@ static bool llama_model_load( } static struct ggml_cgraph * llm_build_llama( - llama_context & lctx, - const llama_batch & batch) { + llama_context & lctx, + const llama_batch & batch) { const auto & model = lctx.model; const auto & hparams = model.hparams; const auto & cparams = lctx.cparams; @@ -2697,11 +2793,9 @@ static struct ggml_cgraph * llm_build_llama( struct ggml_init_params params = { /*.mem_size =*/ buf_compute.size, /*.mem_buffer =*/ buf_compute.data, - /*.no_alloc =*/ false, + /*.no_alloc =*/ true, }; - params.no_alloc = true; - struct ggml_context * ctx0 = ggml_init(params); ggml_cgraph * gf = ggml_new_graph(ctx0); @@ -3085,11 +3179,9 @@ static struct ggml_cgraph * llm_build_baichaun( struct ggml_init_params params = { /*.mem_size =*/ buf_compute.size, /*.mem_buffer =*/ buf_compute.data, - /*.no_alloc =*/ false, + /*.no_alloc =*/ true, }; - params.no_alloc = true; - struct ggml_context * ctx0 = ggml_init(params); ggml_cgraph * gf = ggml_new_graph(ctx0); @@ -3486,11 +3578,9 @@ static struct ggml_cgraph * llm_build_refact( struct ggml_init_params params = { /*.mem_size =*/ buf_compute.size, /*.mem_buffer =*/ buf_compute.data, - /*.no_alloc =*/ false, + /*.no_alloc =*/ true, }; - params.no_alloc = true; - struct ggml_context * ctx0 = ggml_init(params); ggml_cgraph * gf = ggml_new_graph(ctx0); @@ -3840,11 +3930,9 @@ static struct ggml_cgraph * llm_build_falcon( struct ggml_init_params params = { /*.mem_size =*/ buf_compute.size, /*.mem_buffer =*/ buf_compute.data, - /*.no_alloc =*/ false, + /*.no_alloc =*/ true, }; - params.no_alloc = true; - struct ggml_context * ctx0 = ggml_init(params); ggml_cgraph * gf = ggml_new_graph(ctx0); @@ -4200,11 +4288,9 @@ static struct ggml_cgraph * llm_build_starcoder( struct ggml_init_params params = { /*.mem_size =*/ buf_compute.size, /*.mem_buffer =*/ buf_compute.data, - /*.no_alloc =*/ false, + /*.no_alloc =*/ true, }; - params.no_alloc = true; - struct ggml_context * ctx0 = ggml_init(params); ggml_cgraph * gf = ggml_new_graph(ctx0); @@ -4415,6 +4501,404 @@ static struct ggml_cgraph * llm_build_starcoder( return gf; } + +static struct ggml_cgraph * llm_build_persimmon( + llama_context & lctx, + const llama_batch & batch) { + const auto & model = lctx.model; + const auto & hparams = model.hparams; + + const auto & kv_self = lctx.kv_self; + + GGML_ASSERT(!!kv_self.ctx); + + const auto & cparams = lctx.cparams; + const int64_t n_embd = hparams.n_embd; + const int64_t n_layer = hparams.n_layer; + const int64_t n_ctx = cparams.n_ctx; + const int64_t n_head_kv = hparams.n_head_kv; + const int64_t n_head = hparams.n_head; + const int64_t n_embd_head = hparams.n_embd_head(); + const int64_t n_embd_gqa = hparams.n_embd_gqa(); + const size_t n_rot = n_embd_head / 2; + + const float freq_base = cparams.rope_freq_base; + const float freq_scale = cparams.rope_freq_scale; + const float norm_eps = hparams.f_norm_eps; + + const int n_gpu_layers = model.n_gpu_layers; + + + const int32_t n_tokens = batch.n_tokens; + const int32_t n_kv = ggml_allocr_is_measure(lctx.alloc) ? n_ctx : kv_self.n; + const int32_t kv_head = ggml_allocr_is_measure(lctx.alloc) ? n_ctx - n_tokens : kv_self.head; + + const bool do_rope_shift = ggml_allocr_is_measure(lctx.alloc) || kv_self.has_shift; + + auto & buf_compute = lctx.buf_compute; + struct ggml_init_params params = { + /*.mem_size =*/ buf_compute.size, + /*.mem_buffer =*/ buf_compute.data, + /*.no_alloc =*/ true, + }; + + struct ggml_context * ctx0 = ggml_init(params); + + ggml_cgraph * gf = ggml_new_graph(ctx0); + + struct ggml_tensor * cur; + struct ggml_tensor * inpL; + + if (batch.token) { + struct ggml_tensor * inp_tokens = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, n_tokens); + + ggml_allocr_alloc(lctx.alloc, inp_tokens); + if (!ggml_allocr_is_measure(lctx.alloc)) { + memcpy(inp_tokens->data, batch.token, n_tokens*ggml_element_size(inp_tokens)); + } + ggml_set_name(inp_tokens, "inp_tokens"); + inpL = ggml_get_rows(ctx0, model.tok_embeddings, inp_tokens); + } else { + inpL = ggml_new_tensor_2d(ctx0, GGML_TYPE_F32, n_embd, n_tokens); + ggml_allocr_alloc(lctx.alloc, inpL); + if (!ggml_allocr_is_measure(lctx.alloc)) { + memcpy(inpL->data, batch.embd, n_tokens * n_embd * ggml_element_size(inpL)); + } + } + const int i_gpu_start = n_layer - n_gpu_layers; + (void) i_gpu_start; + offload_func_t offload_func_nr = llama_nop; // nr = non-repeating + offload_func_t offload_func_kq = llama_nop; + offload_func_t offload_func_v = llama_nop; + // KQ_scale + struct ggml_tensor * KQ_scale = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, 1); + ggml_allocr_alloc(lctx.alloc, KQ_scale); + if (!ggml_allocr_is_measure(lctx.alloc)) { + ggml_set_f32(KQ_scale, 1.0f/sqrtf(float(n_embd_head))); + } + ggml_set_name(KQ_scale, "1/sqrt(n_embd_head)"); + struct ggml_tensor * KQ_mask = ggml_new_tensor_3d(ctx0, GGML_TYPE_F32, n_kv, n_tokens, 1); + offload_func_kq(KQ_mask); + ggml_set_name(KQ_mask, "KQ_mask"); + ggml_allocr_alloc(lctx.alloc, KQ_mask); + + if (!ggml_allocr_is_measure(lctx.alloc)) { + float * data = (float *) KQ_mask->data; + memset(data, 0, ggml_nbytes(KQ_mask)); + for (int h = 0; h < 1; ++h) { + for (int j = 0; j < n_tokens; ++j) { + const llama_pos pos = batch.pos[j]; + const llama_seq_id seq_id = batch.seq_id[j]; + for (int i = 0; i < n_kv; ++i) { + if (!kv_self.cells[i].has_seq_id(seq_id) || kv_self.cells[i].pos > pos) { + data[h*(n_kv*n_tokens) + j*n_kv + i] = -INFINITY; + } + } + } + } + } + + struct ggml_tensor * KQ_pos = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, n_tokens); + offload_func_kq(KQ_pos); + ggml_set_name(KQ_pos, "KQ_pos"); + ggml_allocr_alloc(lctx.alloc, KQ_pos); + if (!ggml_allocr_is_measure(lctx.alloc)) { + int * data = (int *) KQ_pos->data; + for (int i = 0; i < n_tokens; ++i) { + data[i] = batch.pos[i]; + } + } + if (do_rope_shift) { + struct ggml_tensor * K_shift = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, n_ctx); + offload_func_kq(K_shift); + ggml_set_name(K_shift, "K_shift"); + ggml_allocr_alloc(lctx.alloc, K_shift); + if (!ggml_allocr_is_measure(lctx.alloc)) { + int * data = (int *) K_shift->data; + for (int i = 0; i < n_ctx; ++i) { + data[i] = kv_self.cells[i].delta; + } + } + for (int il = 0; il < n_layer; ++il) { + struct ggml_tensor * tmp = + // we rotate only the first n_rot dimensions. + ggml_rope_custom_inplace(ctx0, + ggml_view_3d(ctx0, kv_self.k, + n_rot, n_head, n_ctx, + ggml_element_size(kv_self.k)*n_embd_gqa, + ggml_element_size(kv_self.k)*n_embd_head, + ggml_element_size(kv_self.k)*(n_embd_head*n_ctx*il) + ), + K_shift, n_rot, 2, 0, freq_base, freq_scale); + offload_func_kq(tmp); + ggml_build_forward_expand(gf, tmp); + } + } + for (int il=0; il < n_layer; ++il) { + struct ggml_tensor * residual = inpL; + offload_func_t offload_func = llama_nop; + { + cur = ggml_norm(ctx0, inpL, norm_eps); + offload_func(cur); + cur = ggml_mul(ctx0, cur, model.layers[il].attn_norm); + offload_func(cur); + cur = ggml_add(ctx0, cur, model.layers[il].attn_norm_b); + offload_func(cur); + ggml_format_name(cur, "input_layernorm_%d", il); + } + // self attention + { + cur = ggml_mul_mat(ctx0, model.layers[il].wqkv, cur); + offload_func_kq(cur); + cur = ggml_add(ctx0, cur, model.layers[il].bqkv); + offload_func_kq(cur); + + // split qkv + GGML_ASSERT(n_head_kv == n_head); + ggml_set_name(cur, format("qkv_%d", il).c_str()); + struct ggml_tensor * tmpqkv = ggml_reshape_4d(ctx0, cur, n_embd_head, 3, n_head, n_tokens); + offload_func_kq(tmpqkv); + struct ggml_tensor * tmpqkv_perm = ggml_cont(ctx0, ggml_permute(ctx0, tmpqkv, 0, 3, 1, 2)); + offload_func_kq(tmpqkv_perm); + ggml_format_name(tmpqkv_perm, "tmpqkv_perm_%d", il); + struct ggml_tensor * tmpq = ggml_view_3d( + ctx0, tmpqkv_perm, n_embd_head, n_head, n_tokens, + ggml_element_size(tmpqkv_perm) * n_embd_head, + ggml_element_size(tmpqkv_perm) * n_embd_head * n_head, + 0 + ); + offload_func_kq(tmpq); + struct ggml_tensor * tmpk = ggml_view_3d( + ctx0, tmpqkv_perm, n_embd_head, n_head, n_tokens, + ggml_element_size(tmpqkv_perm) * n_embd_head, + ggml_element_size(tmpqkv_perm) * n_embd_head * n_head, + ggml_element_size(tmpqkv_perm) * n_embd_head * n_head * n_tokens + ); + offload_func_kq(tmpk); + // Q/K Layernorm + tmpq = ggml_norm(ctx0, tmpq, norm_eps); + offload_func_kq(tmpq); + tmpq = ggml_mul(ctx0, tmpq, model.layers[il].attn_q_norm); + offload_func_kq(tmpq); + tmpq = ggml_add(ctx0, tmpq, model.layers[il].attn_q_norm_b); + offload_func_kq(tmpq); + + tmpk = ggml_norm(ctx0, tmpk, norm_eps); + offload_func_v(tmpk); + tmpk = ggml_mul(ctx0, tmpk, model.layers[il].attn_k_norm); + offload_func_v(tmpk); + tmpk = ggml_add(ctx0, tmpk, model.layers[il].attn_k_norm_b); + offload_func_v(tmpk); + + // RoPE the first n_rot of q/k, pass the other half, and concat. + struct ggml_tensor * qrot = ggml_view_3d( + ctx0, tmpq, n_rot, n_head, n_tokens, + ggml_element_size(tmpq) * n_embd_head, + ggml_element_size(tmpq) * n_embd_head * n_head, + 0 + ); + offload_func_kq(qrot); + ggml_format_name(qrot, "qrot_%d", il); + struct ggml_tensor * krot = ggml_view_3d( + ctx0, tmpk, n_rot, n_head, n_tokens, + ggml_element_size(tmpk) * n_embd_head, + ggml_element_size(tmpk) * n_embd_head * n_head, + 0 + ); + offload_func_kq(krot); + ggml_format_name(krot, "krot_%d", il); + + // get the second half of tmpq, e.g tmpq[n_rot:, :, :] + struct ggml_tensor * qpass = ggml_view_3d( + ctx0, tmpq, n_rot, n_head, n_tokens, + ggml_element_size(tmpq) * n_embd_head, + ggml_element_size(tmpq) * n_embd_head * n_head, + ggml_element_size(tmpq) * n_rot + ); + offload_func_kq(qpass); + ggml_format_name(qpass, "qpass_%d", il); + struct ggml_tensor * kpass = ggml_view_3d( + ctx0, tmpk, n_rot, n_head, n_tokens, + ggml_element_size(tmpk) * n_embd_head, + ggml_element_size(tmpk) * n_embd_head * n_head, + ggml_element_size(tmpk) * n_rot + ); + offload_func_kq(kpass); + ggml_format_name(kpass, "kpass_%d", il); + + struct ggml_tensor * qrotated = ggml_rope_custom( + ctx0, qrot, KQ_pos, n_rot, 2, 0, freq_base, freq_scale + ); + offload_func_kq(qrotated); + struct ggml_tensor * krotated = ggml_rope_custom( + ctx0, krot, KQ_pos, n_rot, 2, 0, freq_base, freq_scale + ); + offload_func_kq(krotated); + // ggml currently only supports concatenation on dim=2 + // so we need to permute qrot, qpass, concat, then permute back. + qrotated = ggml_cont(ctx0, ggml_permute(ctx0, qrotated, 2, 1, 0, 3)); + offload_func_kq(qrotated); + krotated = ggml_cont(ctx0, ggml_permute(ctx0, krotated, 2, 1, 0, 3)); + offload_func_kq(krotated); + + qpass = ggml_cont(ctx0, ggml_permute(ctx0, qpass, 2, 1, 0, 3)); + offload_func_kq(qpass); + kpass = ggml_cont(ctx0, ggml_permute(ctx0, kpass, 2, 1, 0, 3)); + offload_func_kq(kpass); + + struct ggml_tensor * Qcur = ggml_concat(ctx0, qrotated, qpass); + offload_func_kq(Qcur); + struct ggml_tensor * Kcur = ggml_concat(ctx0, krotated, kpass); + offload_func_kq(Kcur); + + struct ggml_tensor * Q = ggml_cont(ctx0, ggml_permute(ctx0, Qcur, 1, 2, 0, 3)); + offload_func_kq(Q); + + Kcur = ggml_cont(ctx0, ggml_permute(ctx0, Kcur, 2, 1, 0, 3)); + offload_func_kq(Kcur); + { + struct ggml_tensor * tmpv = ggml_view_3d( + ctx0, tmpqkv_perm, n_embd_head, n_head, n_tokens, + ggml_element_size(tmpqkv_perm) * n_embd_head, + ggml_element_size(tmpqkv_perm) * n_embd_head * n_head, + ggml_element_size(tmpqkv_perm) * n_embd_head * n_head * n_tokens * 2 + ); + offload_func_v(tmpv); + // store K, V in cache + struct ggml_tensor * Vcur = ggml_transpose(ctx0, ggml_reshape_2d(ctx0, tmpv, n_embd_gqa, n_tokens)); + offload_func_v(Vcur); + ggml_set_name(Vcur, "Vcur"); + + struct ggml_tensor * k = ggml_view_1d( + ctx0, kv_self.k, n_tokens*n_embd_gqa, + (ggml_element_size(kv_self.k)*n_embd_gqa)*(il*n_ctx + kv_head) + ); + offload_func_kq(k); + ggml_set_name(k, "k"); + + struct ggml_tensor * v = ggml_view_2d(ctx0, kv_self.v, n_tokens, n_embd_gqa, + ( n_ctx)*ggml_element_size(kv_self.v), + (il*n_ctx)*ggml_element_size(kv_self.v)*n_embd_gqa + kv_head*ggml_element_size(kv_self.v)); + offload_func_v(v); + ggml_set_name(v, "v"); + + // important: storing RoPE-ed version of K in the KV cache! + ggml_build_forward_expand(gf, ggml_cpy(ctx0, Kcur, k)); + ggml_build_forward_expand(gf, ggml_cpy(ctx0, Vcur, v)); + } + struct ggml_tensor * K = ggml_view_3d(ctx0, kv_self.k, + n_embd_head, n_kv, n_head_kv, + ggml_element_size(kv_self.k)*n_embd_gqa, + ggml_element_size(kv_self.k)*n_embd_head, + ggml_element_size(kv_self.k)*n_embd_gqa*n_ctx*il); + + offload_func_kq(K); + ggml_format_name(K, "K_%d", il); + + struct ggml_tensor * KQ = ggml_mul_mat(ctx0, K, Q); + offload_func_kq(KQ); + ggml_set_name(KQ, "KQ"); + + struct ggml_tensor * KQ_scaled = ggml_scale(ctx0, KQ, KQ_scale); + offload_func_kq(KQ_scaled); + ggml_set_name(KQ_scaled, "KQ_scaled"); + + struct ggml_tensor * KQ_masked = ggml_add(ctx0, KQ_scaled, KQ_mask); + offload_func_kq(KQ_masked); + ggml_set_name(KQ_masked, "KQ_masked"); + + struct ggml_tensor * KQ_soft_max = ggml_soft_max_inplace(ctx0, KQ_masked); + offload_func_kq(KQ_soft_max); + ggml_set_name(KQ_soft_max, "KQ_soft_max"); + + struct ggml_tensor * V = + ggml_view_3d(ctx0, kv_self.v, + n_kv, n_embd_head, n_head_kv, + ggml_element_size(kv_self.v)*n_ctx, + ggml_element_size(kv_self.v)*n_ctx*n_embd_head, + ggml_element_size(kv_self.v)*n_ctx*n_embd_gqa*il); + offload_func_v(V); + ggml_set_name(V, "V"); + + struct ggml_tensor * KQV = ggml_mul_mat(ctx0, V, KQ_soft_max); + offload_func_v(KQV); + ggml_set_name(KQV, "KQV"); + + struct ggml_tensor * KQV_merged = ggml_permute(ctx0, KQV, 0, 2, 1, 3); + offload_func_v(KQV_merged); + ggml_set_name(KQV_merged, "KQV_merged"); + + cur = ggml_cont_2d(ctx0, KQV_merged, n_embd, n_tokens); + offload_func_v(cur); + ggml_set_name(cur, "KQV_merged_contiguous"); + + cur = ggml_mul_mat(ctx0, model.layers[il].wo, cur); + offload_func(cur); + cur = ggml_add(ctx0, cur, model.layers[il].bo); + offload_func(cur); + ggml_set_name(cur, "result_wo"); + } + + struct ggml_tensor * inpFF = ggml_add(ctx0, residual, cur); + offload_func(inpFF); + ggml_set_name(inpFF, "inpFF"); + { + // MLP + { + // Norm + cur = ggml_norm(ctx0, inpFF, norm_eps); + offload_func(cur); + cur = ggml_add(ctx0, + ggml_mul(ctx0, cur, model.layers[il].ffn_norm), + model.layers[il].ffn_norm_b + ); + ggml_set_name(cur, "ffn_norm"); + offload_func(cur); + } + cur = ggml_mul_mat(ctx0, model.layers[il].w3, cur); + offload_func(cur); + + cur = ggml_add(ctx0, cur, model.layers[il].b3); + offload_func(cur); + ggml_set_name(cur, "result_ffn_up"); + + cur = ggml_sqr(ctx0, ggml_relu(ctx0, cur)); + ggml_set_name(cur, "result_ffn_act"); + offload_func(cur); + offload_func(cur->src[0]); + + cur = ggml_mul_mat(ctx0, model.layers[il].w2, cur); + offload_func(cur); + cur = ggml_add(ctx0, + cur, + model.layers[il].b2); + offload_func(cur); + ggml_set_name(cur, "outFF"); + } + cur = ggml_add(ctx0, cur, inpFF); + offload_func(cur); + ggml_set_name(cur, "inpFF_+_outFF"); + inpL = cur; + } + cur = inpL; + { + cur = ggml_norm(ctx0, cur, norm_eps); + offload_func_nr(cur); + cur = ggml_mul(ctx0, cur, model.output_norm); + offload_func_nr(cur); + + cur = ggml_add(ctx0, cur, model.output_norm_b); + // offload_func_nr(cur); + + ggml_set_name(cur, "result_norm"); + } + cur = ggml_mul_mat(ctx0, model.output, cur); + ggml_set_name(cur, "result_output"); + ggml_build_forward_expand(gf, cur); + ggml_free(ctx0); + return gf; +} + static struct ggml_cgraph * llama_build_graph( llama_context & lctx, const llama_batch & batch) { @@ -4439,6 +4923,10 @@ static struct ggml_cgraph * llama_build_graph( { result = llm_build_starcoder(lctx, batch); } break; + case LLM_ARCH_PERSIMMON: + { + result = llm_build_persimmon(lctx, batch); + } case LLM_ARCH_REFACT: { result = llm_build_refact(lctx, batch); From c26765a0a148b47e5b541df32438c3ad2a0a8314 Mon Sep 17 00:00:00 2001 From: Jhen-Jie Hong Date: Sat, 7 Oct 2023 03:40:27 -0500 Subject: [PATCH 58/73] metal : support default.metallib load & reuse code for swift package (#3522) * metal : support load default.metallib & reuse code for swift package * metal : use SWIFT_PACKAGE def instead of define GGML_SWIFT --- .gitignore | 1 + Package.swift | 8 +++++-- ggml-metal.m | 66 +++++++++++++++++++++------------------------------ 3 files changed, 34 insertions(+), 41 deletions(-) diff --git a/.gitignore b/.gitignore index 4d5767d22..420e0d6d0 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ *.gcno *.gcda *.dot +*.metallib .DS_Store .build/ .cache/ diff --git a/Package.swift b/Package.swift index 3ee3b2a20..1ea414cc1 100644 --- a/Package.swift +++ b/Package.swift @@ -10,15 +10,18 @@ let platforms: [SupportedPlatform]? = [ .tvOS(.v14) ] let exclude: [String] = [] -let additionalSources: [String] = ["ggml-metal.m", "ggml-metal.metal"] +let resources: [Resource] = [ + .process("ggml-metal.metal") +] +let additionalSources: [String] = ["ggml-metal.m"] let additionalSettings: [CSetting] = [ .unsafeFlags(["-fno-objc-arc"]), - .define("GGML_SWIFT"), .define("GGML_USE_METAL") ] #else let platforms: [SupportedPlatform]? = nil let exclude: [String] = ["ggml-metal.metal"] +let resources: [Resource] = [] let additionalSources: [String] = [] let additionalSettings: [CSetting] = [] #endif @@ -40,6 +43,7 @@ let package = Package( "ggml-alloc.c", "k_quants.c", ] + additionalSources, + resources: resources, publicHeadersPath: "spm-headers", cSettings: [ .unsafeFlags(["-Wno-shorten-64-to-32"]), diff --git a/ggml-metal.m b/ggml-metal.m index c7fb89054..f8fa05dd9 100644 --- a/ggml-metal.m +++ b/ggml-metal.m @@ -185,56 +185,44 @@ struct ggml_metal_context * ggml_metal_init(int n_cb) { ctx->d_queue = dispatch_queue_create("ggml-metal", DISPATCH_QUEUE_CONCURRENT); -#ifdef GGML_SWIFT - // load the default.metallib file + // load library { - NSError * error = nil; - - NSBundle * bundle = [NSBundle bundleForClass:[GGMLMetalClass class]]; - NSString * llamaBundlePath = [bundle pathForResource:@"llama_llama" ofType:@"bundle"]; - NSBundle * llamaBundle = [NSBundle bundleWithPath:llamaBundlePath]; - NSString * libPath = [llamaBundle pathForResource:@"default" ofType:@"metallib"]; - NSURL * libURL = [NSURL fileURLWithPath:libPath]; - - // Load the metallib file into a Metal library - ctx->library = [ctx->device newLibraryWithURL:libURL error:&error]; - - if (error) { - GGML_METAL_LOG_ERROR("%s: error: %s\n", __func__, [[error description] UTF8String]); - return NULL; - } - } + NSBundle * bundle = nil; +#ifdef SWIFT_PACKAGE + bundle = SWIFTPM_MODULE_BUNDLE; #else - UNUSED(msl_library_source); - - // read the source from "ggml-metal.metal" into a string and use newLibraryWithSource - { + bundle = [NSBundle bundleForClass:[GGMLMetalClass class]]; +#endif NSError * error = nil; + NSString * libPath = [bundle pathForResource:@"default" ofType:@"metallib"]; + if (libPath != nil) { + NSURL * libURL = [NSURL fileURLWithPath:libPath]; + GGML_METAL_LOG_INFO("%s: loading '%s'\n", __func__, [libPath UTF8String]); + ctx->library = [ctx->device newLibraryWithURL:libURL error:&error]; + } else { + GGML_METAL_LOG_INFO("%s: default.metallib not found, loading from source\n", __func__); - //NSString * path = [[NSBundle mainBundle] pathForResource:@"../../examples/metal/metal" ofType:@"metal"]; - NSBundle * bundle = [NSBundle bundleForClass:[GGMLMetalClass class]]; - NSString * path = [bundle pathForResource:@"ggml-metal" ofType:@"metal"]; - GGML_METAL_LOG_INFO("%s: loading '%s'\n", __func__, [path UTF8String]); - - NSString * src = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; - if (error) { - GGML_METAL_LOG_ERROR("%s: error: %s\n", __func__, [[error description] UTF8String]); - return NULL; - } + NSString * sourcePath = [bundle pathForResource:@"ggml-metal" ofType:@"metal"]; + GGML_METAL_LOG_INFO("%s: loading '%s'\n", __func__, [sourcePath UTF8String]); + NSString * src = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:&error]; + if (error) { + GGML_METAL_LOG_ERROR("%s: error: %s\n", __func__, [[error description] UTF8String]); + return NULL; + } + MTLCompileOptions* options = nil; #ifdef GGML_QKK_64 - MTLCompileOptions* options = [MTLCompileOptions new]; - options.preprocessorMacros = @{ @"QK_K" : @(64) }; - ctx->library = [ctx->device newLibraryWithSource:src options:options error:&error]; -#else - ctx->library = [ctx->device newLibraryWithSource:src options:nil error:&error]; + options = [MTLCompileOptions new]; + options.preprocessorMacros = @{ @"QK_K" : @(64) }; #endif + ctx->library = [ctx->device newLibraryWithSource:src options:options error:&error]; + } + if (error) { GGML_METAL_LOG_ERROR("%s: error: %s\n", __func__, [[error description] UTF8String]); return NULL; } } -#endif // load kernels { @@ -437,7 +425,7 @@ static id ggml_metal_get_buffer(struct ggml_metal_context * ctx, stru for (int i = 0; i < ctx->n_buffers; ++i) { const int64_t ioffs = (int64_t) t->data - (int64_t) ctx->buffers[i].data; - //metal_printf("ioffs = %10ld, tsize = %10ld, sum = %10ld, ctx->buffers[%d].size = %10ld, name = %s\n", ioffs, tsize, ioffs + tsize, i, ctx->buffers[i].size, ctx->buffers[i].name); + //GGML_METAL_LOG_INFO("ioffs = %10ld, tsize = %10ld, sum = %10ld, ctx->buffers[%d].size = %10ld, name = %s\n", ioffs, tsize, ioffs + tsize, i, ctx->buffers[i].size, ctx->buffers[i].name); if (ioffs >= 0 && ioffs + tsize <= (int64_t) ctx->buffers[i].size) { *offs = (size_t) ioffs; From f1782c68de13b64bb5283fc2038f584e47be9fd2 Mon Sep 17 00:00:00 2001 From: cebtenzzre Date: Sat, 7 Oct 2023 04:41:52 -0400 Subject: [PATCH 59/73] quantize : fail fast on write errors (#3521) --- llama.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/llama.cpp b/llama.cpp index 227cd9d03..d10656bb8 100644 --- a/llama.cpp +++ b/llama.cpp @@ -7194,6 +7194,7 @@ static void llama_model_quantize_internal(const std::string & fname_inp, const s } std::ofstream fout(fname_out, std::ios::binary); + fout.exceptions(std::ofstream::failbit); // fail fast on write errors const size_t meta_size = gguf_get_meta_size(ctx_out); From c47066d833c6c112e0d23342aa62c3250dd33c81 Mon Sep 17 00:00:00 2001 From: Tom C Date: Sat, 7 Oct 2023 02:56:15 -0700 Subject: [PATCH 60/73] py : change version of numpy requirement to 1.24.4 (#3515) Co-authored-by: Lyjia --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 7dc51edb1..81c909d0b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -numpy==1.24 +numpy==1.24.4 sentencepiece==0.1.98 gguf>=0.1.0 From 4d0383321184aadf91968d9e3c6a45286ed2473b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Yusuf=20Sar=C4=B1g=C3=B6z?= Date: Sat, 7 Oct 2023 22:14:10 +0300 Subject: [PATCH 61/73] gguf.py : fix CI for publishing GGUF package (#3532) * Fix CI for publishing GGUF package * Bump version * fix * bump version * bump version * bump version --- .github/workflows/gguf-publish.yml | 3 ++- gguf-py/README.md | 1 - gguf-py/pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/gguf-publish.yml b/.github/workflows/gguf-publish.yml index e61bfc6c3..57db17512 100644 --- a/.github/workflows/gguf-publish.yml +++ b/.github/workflows/gguf-publish.yml @@ -36,8 +36,9 @@ jobs: poetry install - name: Build package - run: poetry build + run: cd gguf-py && poetry build - name: Publish package uses: pypa/gh-action-pypi-publish@release/v1 with: password: ${{ secrets.PYPI_API_TOKEN }} + packages-dir: gguf-py/dist diff --git a/gguf-py/README.md b/gguf-py/README.md index ffe25c495..a28d8c57a 100644 --- a/gguf-py/README.md +++ b/gguf-py/README.md @@ -69,4 +69,3 @@ python -m twine upload dist/* ## TODO - [ ] Add tests - [ ] Include conversion scripts as command line entry points in this package. -- Add CI workflow for releasing the package. diff --git a/gguf-py/pyproject.toml b/gguf-py/pyproject.toml index 400607ce1..07a7ab4dd 100644 --- a/gguf-py/pyproject.toml +++ b/gguf-py/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "gguf" -version = "0.4.0" +version = "0.4.4" description = "Write ML models in GGUF for GGML" authors = ["GGML "] packages = [ From a16e89cec83b4bd5f6af8f1ce1400f94c12356f9 Mon Sep 17 00:00:00 2001 From: Kerfuffle <44031344+KerfuffleV2@users.noreply.github.com> Date: Sat, 7 Oct 2023 15:31:41 -0600 Subject: [PATCH 62/73] Fix trying to strip newline from empty prompt and cfg prompt file content (#3534) --- common/common.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/common.cpp b/common/common.cpp index 60b00b5fb..0f55c33a7 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -170,7 +170,7 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) { // store the external file name in params params.prompt_file = argv[i]; std::copy(std::istreambuf_iterator(file), std::istreambuf_iterator(), back_inserter(params.prompt)); - if (params.prompt.back() == '\n') { + if (!params.prompt.empty() && params.prompt.back() == '\n') { params.prompt.pop_back(); } } else if (arg == "-n" || arg == "--n-predict") { @@ -295,7 +295,7 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) { break; } std::copy(std::istreambuf_iterator(file), std::istreambuf_iterator(), back_inserter(params.cfg_negative_prompt)); - if (params.cfg_negative_prompt.back() == '\n') { + if (!params.cfg_negative_prompt.empty() && params.cfg_negative_prompt.back() == '\n') { params.cfg_negative_prompt.pop_back(); } } else if (arg == "--cfg-scale") { From 63d3b06a4318329f92b078e8aa0be7ab6e9f871f Mon Sep 17 00:00:00 2001 From: Kerfuffle <44031344+KerfuffleV2@users.noreply.github.com> Date: Sat, 7 Oct 2023 23:22:17 -0600 Subject: [PATCH 63/73] llama : fix missing break in Persimmon arch case statements (#3535) --- llama.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llama.cpp b/llama.cpp index d10656bb8..a4312ab72 100644 --- a/llama.cpp +++ b/llama.cpp @@ -2047,7 +2047,7 @@ static void llm_load_hparams( case 36: model.type = e_model::MODEL_8B; break; default: model.type = e_model::MODEL_UNKNOWN; } - } + } break; case LLM_ARCH_REFACT: { GGUF_GET_KEY(ctx, hparams.f_norm_rms_eps, gguf_get_val_f32, GGUF_TYPE_FLOAT32, true, kv(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS)); @@ -4926,7 +4926,7 @@ static struct ggml_cgraph * llama_build_graph( case LLM_ARCH_PERSIMMON: { result = llm_build_persimmon(lctx, batch); - } + } break; case LLM_ARCH_REFACT: { result = llm_build_refact(lctx, batch); From b0ec5218c3d24755786b80ecce9cf4ffc07583f8 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Sun, 8 Oct 2023 10:01:53 +0300 Subject: [PATCH 64/73] metal : support MTLGPUFamily < Apple7, formatting, style (#3524) * metal : improve decoding speed for batches of 2-16 * metal : rename kernels mul_mat_ to mul_mv_ * metal : indentations * minor * metal : print more GPU info + disable mul_mm for MTLGPUFamiliy < Apple7 --- ggml-metal.m | 202 +++++++++++++++++++++++++++++------------------ ggml-metal.metal | 92 ++++++++++++--------- 2 files changed, 176 insertions(+), 118 deletions(-) diff --git a/ggml-metal.m b/ggml-metal.m index f8fa05dd9..57c238dda 100644 --- a/ggml-metal.m +++ b/ggml-metal.m @@ -81,18 +81,18 @@ struct ggml_metal_context { GGML_METAL_DECL_KERNEL(get_rows_q6_K); GGML_METAL_DECL_KERNEL(rms_norm); GGML_METAL_DECL_KERNEL(norm); - GGML_METAL_DECL_KERNEL(mul_mat_f32_f32); - GGML_METAL_DECL_KERNEL(mul_mat_f16_f32); - GGML_METAL_DECL_KERNEL(mul_mat_f16_f32_1row); - GGML_METAL_DECL_KERNEL(mul_mat_f16_f32_l4); - GGML_METAL_DECL_KERNEL(mul_mat_q4_0_f32); - GGML_METAL_DECL_KERNEL(mul_mat_q4_1_f32); - GGML_METAL_DECL_KERNEL(mul_mat_q8_0_f32); - GGML_METAL_DECL_KERNEL(mul_mat_q2_K_f32); - GGML_METAL_DECL_KERNEL(mul_mat_q3_K_f32); - GGML_METAL_DECL_KERNEL(mul_mat_q4_K_f32); - GGML_METAL_DECL_KERNEL(mul_mat_q5_K_f32); - GGML_METAL_DECL_KERNEL(mul_mat_q6_K_f32); + GGML_METAL_DECL_KERNEL(mul_mv_f32_f32); + GGML_METAL_DECL_KERNEL(mul_mv_f16_f32); + GGML_METAL_DECL_KERNEL(mul_mv_f16_f32_1row); + GGML_METAL_DECL_KERNEL(mul_mv_f16_f32_l4); + GGML_METAL_DECL_KERNEL(mul_mv_q4_0_f32); + GGML_METAL_DECL_KERNEL(mul_mv_q4_1_f32); + GGML_METAL_DECL_KERNEL(mul_mv_q8_0_f32); + GGML_METAL_DECL_KERNEL(mul_mv_q2_K_f32); + GGML_METAL_DECL_KERNEL(mul_mv_q3_K_f32); + GGML_METAL_DECL_KERNEL(mul_mv_q4_K_f32); + GGML_METAL_DECL_KERNEL(mul_mv_q5_K_f32); + GGML_METAL_DECL_KERNEL(mul_mv_q6_K_f32); GGML_METAL_DECL_KERNEL(mul_mm_f32_f32); GGML_METAL_DECL_KERNEL(mul_mm_f16_f32); GGML_METAL_DECL_KERNEL(mul_mm_q4_0_f32); @@ -262,28 +262,30 @@ struct ggml_metal_context * ggml_metal_init(int n_cb) { GGML_METAL_ADD_KERNEL(get_rows_q6_K); GGML_METAL_ADD_KERNEL(rms_norm); GGML_METAL_ADD_KERNEL(norm); - GGML_METAL_ADD_KERNEL(mul_mat_f32_f32); - GGML_METAL_ADD_KERNEL(mul_mat_f16_f32); - GGML_METAL_ADD_KERNEL(mul_mat_f16_f32_1row); - GGML_METAL_ADD_KERNEL(mul_mat_f16_f32_l4); - GGML_METAL_ADD_KERNEL(mul_mat_q4_0_f32); - GGML_METAL_ADD_KERNEL(mul_mat_q4_1_f32); - GGML_METAL_ADD_KERNEL(mul_mat_q8_0_f32); - GGML_METAL_ADD_KERNEL(mul_mat_q2_K_f32); - GGML_METAL_ADD_KERNEL(mul_mat_q3_K_f32); - GGML_METAL_ADD_KERNEL(mul_mat_q4_K_f32); - GGML_METAL_ADD_KERNEL(mul_mat_q5_K_f32); - GGML_METAL_ADD_KERNEL(mul_mat_q6_K_f32); - GGML_METAL_ADD_KERNEL(mul_mm_f32_f32); - GGML_METAL_ADD_KERNEL(mul_mm_f16_f32); - GGML_METAL_ADD_KERNEL(mul_mm_q4_0_f32); - GGML_METAL_ADD_KERNEL(mul_mm_q8_0_f32); - GGML_METAL_ADD_KERNEL(mul_mm_q4_1_f32); - GGML_METAL_ADD_KERNEL(mul_mm_q2_K_f32); - GGML_METAL_ADD_KERNEL(mul_mm_q3_K_f32); - GGML_METAL_ADD_KERNEL(mul_mm_q4_K_f32); - GGML_METAL_ADD_KERNEL(mul_mm_q5_K_f32); - GGML_METAL_ADD_KERNEL(mul_mm_q6_K_f32); + GGML_METAL_ADD_KERNEL(mul_mv_f32_f32); + GGML_METAL_ADD_KERNEL(mul_mv_f16_f32); + GGML_METAL_ADD_KERNEL(mul_mv_f16_f32_1row); + GGML_METAL_ADD_KERNEL(mul_mv_f16_f32_l4); + GGML_METAL_ADD_KERNEL(mul_mv_q4_0_f32); + GGML_METAL_ADD_KERNEL(mul_mv_q4_1_f32); + GGML_METAL_ADD_KERNEL(mul_mv_q8_0_f32); + GGML_METAL_ADD_KERNEL(mul_mv_q2_K_f32); + GGML_METAL_ADD_KERNEL(mul_mv_q3_K_f32); + GGML_METAL_ADD_KERNEL(mul_mv_q4_K_f32); + GGML_METAL_ADD_KERNEL(mul_mv_q5_K_f32); + GGML_METAL_ADD_KERNEL(mul_mv_q6_K_f32); + if ([ctx->device supportsFamily:MTLGPUFamilyApple7]) { + GGML_METAL_ADD_KERNEL(mul_mm_f32_f32); + GGML_METAL_ADD_KERNEL(mul_mm_f16_f32); + GGML_METAL_ADD_KERNEL(mul_mm_q4_0_f32); + GGML_METAL_ADD_KERNEL(mul_mm_q8_0_f32); + GGML_METAL_ADD_KERNEL(mul_mm_q4_1_f32); + GGML_METAL_ADD_KERNEL(mul_mm_q2_K_f32); + GGML_METAL_ADD_KERNEL(mul_mm_q3_K_f32); + GGML_METAL_ADD_KERNEL(mul_mm_q4_K_f32); + GGML_METAL_ADD_KERNEL(mul_mm_q5_K_f32); + GGML_METAL_ADD_KERNEL(mul_mm_q6_K_f32); + } GGML_METAL_ADD_KERNEL(rope_f32); GGML_METAL_ADD_KERNEL(rope_f16); GGML_METAL_ADD_KERNEL(alibi_f32); @@ -296,8 +298,22 @@ struct ggml_metal_context * ggml_metal_init(int n_cb) { #undef GGML_METAL_ADD_KERNEL } - GGML_METAL_LOG_INFO("%s: hasUnifiedMemory = %s\n", __func__, ctx->device.hasUnifiedMemory ? "true" : "false"); #if TARGET_OS_OSX + // print MTL GPU family: + GGML_METAL_LOG_INFO("%s: GPU name: %s\n", __func__, [[ctx->device name] UTF8String]); + GGML_METAL_LOG_INFO("%s: GPU arch: %s\n", __func__, [[ctx->device architecture].name UTF8String]); + + // determine max supported GPU family + // https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf + // https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf + for (int i = MTLGPUFamilyApple9 + 10; i >= MTLGPUFamilyApple1; --i) { + if ([ctx->device supportsFamily:i]) { + GGML_METAL_LOG_INFO("%s: GPU family: MTLGPUFamilyApple%d (%d)\n", __func__, i - MTLGPUFamilyApple1 + 1, i); + break; + } + } + + GGML_METAL_LOG_INFO("%s: hasUnifiedMemory = %s\n", __func__, ctx->device.hasUnifiedMemory ? "true" : "false"); GGML_METAL_LOG_INFO("%s: recommendedMaxWorkingSetSize = %8.2f MB\n", __func__, ctx->device.recommendedMaxWorkingSetSize / 1024.0 / 1024.0); if (ctx->device.maxTransferRate != 0) { GGML_METAL_LOG_INFO("%s: maxTransferRate = %8.2f MB/s\n", __func__, ctx->device.maxTransferRate / 1024.0 / 1024.0); @@ -339,28 +355,30 @@ void ggml_metal_free(struct ggml_metal_context * ctx) { GGML_METAL_DEL_KERNEL(get_rows_q6_K); GGML_METAL_DEL_KERNEL(rms_norm); GGML_METAL_DEL_KERNEL(norm); - GGML_METAL_DEL_KERNEL(mul_mat_f32_f32); - GGML_METAL_DEL_KERNEL(mul_mat_f16_f32); - GGML_METAL_DEL_KERNEL(mul_mat_f16_f32_1row); - GGML_METAL_DEL_KERNEL(mul_mat_f16_f32_l4); - GGML_METAL_DEL_KERNEL(mul_mat_q4_0_f32); - GGML_METAL_DEL_KERNEL(mul_mat_q4_1_f32); - GGML_METAL_DEL_KERNEL(mul_mat_q8_0_f32); - GGML_METAL_DEL_KERNEL(mul_mat_q2_K_f32); - GGML_METAL_DEL_KERNEL(mul_mat_q3_K_f32); - GGML_METAL_DEL_KERNEL(mul_mat_q4_K_f32); - GGML_METAL_DEL_KERNEL(mul_mat_q5_K_f32); - GGML_METAL_DEL_KERNEL(mul_mat_q6_K_f32); - GGML_METAL_DEL_KERNEL(mul_mm_f32_f32); - GGML_METAL_DEL_KERNEL(mul_mm_f16_f32); - GGML_METAL_DEL_KERNEL(mul_mm_q4_0_f32); - GGML_METAL_DEL_KERNEL(mul_mm_q8_0_f32); - GGML_METAL_DEL_KERNEL(mul_mm_q4_1_f32); - GGML_METAL_DEL_KERNEL(mul_mm_q2_K_f32); - GGML_METAL_DEL_KERNEL(mul_mm_q3_K_f32); - GGML_METAL_DEL_KERNEL(mul_mm_q4_K_f32); - GGML_METAL_DEL_KERNEL(mul_mm_q5_K_f32); - GGML_METAL_DEL_KERNEL(mul_mm_q6_K_f32); + GGML_METAL_DEL_KERNEL(mul_mv_f32_f32); + GGML_METAL_DEL_KERNEL(mul_mv_f16_f32); + GGML_METAL_DEL_KERNEL(mul_mv_f16_f32_1row); + GGML_METAL_DEL_KERNEL(mul_mv_f16_f32_l4); + GGML_METAL_DEL_KERNEL(mul_mv_q4_0_f32); + GGML_METAL_DEL_KERNEL(mul_mv_q4_1_f32); + GGML_METAL_DEL_KERNEL(mul_mv_q8_0_f32); + GGML_METAL_DEL_KERNEL(mul_mv_q2_K_f32); + GGML_METAL_DEL_KERNEL(mul_mv_q3_K_f32); + GGML_METAL_DEL_KERNEL(mul_mv_q4_K_f32); + GGML_METAL_DEL_KERNEL(mul_mv_q5_K_f32); + GGML_METAL_DEL_KERNEL(mul_mv_q6_K_f32); + if ([ctx->device supportsFamily:MTLGPUFamilyApple7]) { + GGML_METAL_DEL_KERNEL(mul_mm_f32_f32); + GGML_METAL_DEL_KERNEL(mul_mm_f16_f32); + GGML_METAL_DEL_KERNEL(mul_mm_q4_0_f32); + GGML_METAL_DEL_KERNEL(mul_mm_q8_0_f32); + GGML_METAL_DEL_KERNEL(mul_mm_q4_1_f32); + GGML_METAL_DEL_KERNEL(mul_mm_q2_K_f32); + GGML_METAL_DEL_KERNEL(mul_mm_q3_K_f32); + GGML_METAL_DEL_KERNEL(mul_mm_q4_K_f32); + GGML_METAL_DEL_KERNEL(mul_mm_q5_K_f32); + GGML_METAL_DEL_KERNEL(mul_mm_q6_K_f32); + } GGML_METAL_DEL_KERNEL(rope_f32); GGML_METAL_DEL_KERNEL(rope_f16); GGML_METAL_DEL_KERNEL(alibi_f32); @@ -986,21 +1004,46 @@ void ggml_metal_graph_compute( } break; case GGML_OP_MUL_MAT: { - // TODO: needs to be updated after PR: https://github.com/ggerganov/ggml/pull/224 - GGML_ASSERT(ne00 == ne10); - // GGML_ASSERT(ne02 == ne12); // Should be checked on individual data types until broadcast is implemented everywhere - uint gqa = ne12/ne02; GGML_ASSERT(ne03 == ne13); + const uint gqa = ne12/ne02; + + // find the break-even point where the matrix-matrix kernel becomes more efficient compared + // to the matrix-vector kernel + int ne11_mm_min = 1; + +#if 0 + // the numbers below are measured on M2 Ultra for 7B and 13B models + // these numbers do not translate to other devices or model sizes + // TODO: need to find a better approach + if ([ctx->device.name isEqualToString:@"Apple M2 Ultra"]) { + switch (src0t) { + case GGML_TYPE_F16: ne11_mm_min = 2; break; + case GGML_TYPE_Q8_0: ne11_mm_min = 7; break; + case GGML_TYPE_Q2_K: ne11_mm_min = 15; break; + case GGML_TYPE_Q3_K: ne11_mm_min = 7; break; + case GGML_TYPE_Q4_0: + case GGML_TYPE_Q4_1: ne11_mm_min = 15; break; + case GGML_TYPE_Q4_K: ne11_mm_min = 11; break; + case GGML_TYPE_Q5_0: // not tested yet + case GGML_TYPE_Q5_1: ne11_mm_min = 13; break; // not tested yet + case GGML_TYPE_Q5_K: ne11_mm_min = 7; break; + case GGML_TYPE_Q6_K: ne11_mm_min = 7; break; + default: ne11_mm_min = 1; break; + } + } +#endif + // for now the matrix-matrix multiplication kernel only works on A14+/M1+ SoCs // AMD GPU and older A-chips will reuse matrix-vector multiplication kernel - if (!ggml_is_transposed(src0) && + if ([ctx->device supportsFamily:MTLGPUFamilyApple7] && + !ggml_is_transposed(src0) && !ggml_is_transposed(src1) && src1t == GGML_TYPE_F32 && - [ctx->device supportsFamily:MTLGPUFamilyApple7] && - ne00%32 == 0 && - ne11 > 2) { + ne00 % 32 == 0 && + ne11 > ne11_mm_min) { + //printf("matrix: ne00 = %6d, ne01 = %6d, ne02 = %6d, ne11 = %6d, ne12 = %6d\n", ne00, ne01, ne02, ne11, ne12); switch (src0->type) { case GGML_TYPE_F32: [encoder setComputePipelineState:ctx->pipeline_mul_mm_f32_f32]; break; case GGML_TYPE_F16: [encoder setComputePipelineState:ctx->pipeline_mul_mm_f16_f32]; break; @@ -1029,17 +1072,18 @@ void ggml_metal_graph_compute( [encoder setBytes:&ne1 length:sizeof(ne1) atIndex:12]; [encoder setBytes:&gqa length:sizeof(gqa) atIndex:13]; [encoder setThreadgroupMemoryLength:8192 atIndex:0]; - [encoder dispatchThreadgroups:MTLSizeMake( (ne11+31)/32, (ne01+63) / 64, ne12) threadsPerThreadgroup:MTLSizeMake(128, 1, 1)]; + [encoder dispatchThreadgroups:MTLSizeMake( (ne11 + 31)/32, (ne01 + 63)/64, ne12) threadsPerThreadgroup:MTLSizeMake(128, 1, 1)]; } else { int nth0 = 32; int nth1 = 1; int nrows = 1; + //printf("vector: ne00 = %6d, ne01 = %6d, ne02 = %6d, ne11 = %6d, ne12 = %6d\n", ne00, ne01, ne02, ne11, ne12); // use custom matrix x vector kernel switch (src0t) { case GGML_TYPE_F32: { - [encoder setComputePipelineState:ctx->pipeline_mul_mat_f32_f32]; + [encoder setComputePipelineState:ctx->pipeline_mul_mv_f32_f32]; nrows = 4; } break; case GGML_TYPE_F16: @@ -1047,12 +1091,12 @@ void ggml_metal_graph_compute( nth0 = 32; nth1 = 1; if (ne11 * ne12 < 4) { - [encoder setComputePipelineState:ctx->pipeline_mul_mat_f16_f32_1row]; + [encoder setComputePipelineState:ctx->pipeline_mul_mv_f16_f32_1row]; } else if (ne00 >= 128 && ne01 >= 8 && ne00%4 == 0) { - [encoder setComputePipelineState:ctx->pipeline_mul_mat_f16_f32_l4]; + [encoder setComputePipelineState:ctx->pipeline_mul_mv_f16_f32_l4]; nrows = ne11; } else { - [encoder setComputePipelineState:ctx->pipeline_mul_mat_f16_f32]; + [encoder setComputePipelineState:ctx->pipeline_mul_mv_f16_f32]; nrows = 4; } } break; @@ -1063,7 +1107,7 @@ void ggml_metal_graph_compute( nth0 = 8; nth1 = 8; - [encoder setComputePipelineState:ctx->pipeline_mul_mat_q4_0_f32]; + [encoder setComputePipelineState:ctx->pipeline_mul_mv_q4_0_f32]; } break; case GGML_TYPE_Q4_1: { @@ -1072,7 +1116,7 @@ void ggml_metal_graph_compute( nth0 = 8; nth1 = 8; - [encoder setComputePipelineState:ctx->pipeline_mul_mat_q4_1_f32]; + [encoder setComputePipelineState:ctx->pipeline_mul_mv_q4_1_f32]; } break; case GGML_TYPE_Q8_0: { @@ -1081,7 +1125,7 @@ void ggml_metal_graph_compute( nth0 = 8; nth1 = 8; - [encoder setComputePipelineState:ctx->pipeline_mul_mat_q8_0_f32]; + [encoder setComputePipelineState:ctx->pipeline_mul_mv_q8_0_f32]; } break; case GGML_TYPE_Q2_K: { @@ -1090,7 +1134,7 @@ void ggml_metal_graph_compute( nth0 = 2; nth1 = 32; - [encoder setComputePipelineState:ctx->pipeline_mul_mat_q2_K_f32]; + [encoder setComputePipelineState:ctx->pipeline_mul_mv_q2_K_f32]; } break; case GGML_TYPE_Q3_K: { @@ -1099,7 +1143,7 @@ void ggml_metal_graph_compute( nth0 = 2; nth1 = 32; - [encoder setComputePipelineState:ctx->pipeline_mul_mat_q3_K_f32]; + [encoder setComputePipelineState:ctx->pipeline_mul_mv_q3_K_f32]; } break; case GGML_TYPE_Q4_K: { @@ -1108,7 +1152,7 @@ void ggml_metal_graph_compute( nth0 = 4; //1; nth1 = 8; //32; - [encoder setComputePipelineState:ctx->pipeline_mul_mat_q4_K_f32]; + [encoder setComputePipelineState:ctx->pipeline_mul_mv_q4_K_f32]; } break; case GGML_TYPE_Q5_K: { @@ -1117,7 +1161,7 @@ void ggml_metal_graph_compute( nth0 = 2; nth1 = 32; - [encoder setComputePipelineState:ctx->pipeline_mul_mat_q5_K_f32]; + [encoder setComputePipelineState:ctx->pipeline_mul_mv_q5_K_f32]; } break; case GGML_TYPE_Q6_K: { @@ -1126,7 +1170,7 @@ void ggml_metal_graph_compute( nth0 = 2; nth1 = 32; - [encoder setComputePipelineState:ctx->pipeline_mul_mat_q6_K_f32]; + [encoder setComputePipelineState:ctx->pipeline_mul_mv_q6_K_f32]; } break; default: { @@ -1155,7 +1199,7 @@ void ggml_metal_graph_compute( [encoder setBytes:&gqa length:sizeof(gqa) atIndex:17]; if (src0t == GGML_TYPE_Q4_0 || src0t == GGML_TYPE_Q4_1 || src0t == GGML_TYPE_Q8_0 || - src0t == GGML_TYPE_Q2_K) {// || src0t == GGML_TYPE_Q4_K) { + src0t == GGML_TYPE_Q2_K) { // || src0t == GGML_TYPE_Q4_K) { [encoder dispatchThreadgroups:MTLSizeMake((ne01 + 7)/8, ne11, ne12) threadsPerThreadgroup:MTLSizeMake(nth0, nth1, 1)]; } else if (src0t == GGML_TYPE_Q4_K) { diff --git a/ggml-metal.metal b/ggml-metal.metal index 9bd94e82b..b6288db28 100644 --- a/ggml-metal.metal +++ b/ggml-metal.metal @@ -13,8 +13,8 @@ typedef struct { #define QK4_1 32 typedef struct { - half d; // delta - half m; // min + half d; // delta + half m; // min uint8_t qs[QK4_1 / 2]; // nibbles / quants } block_q4_1; @@ -423,8 +423,8 @@ inline float block_q_n_dot_y(device const block_q4_1 * qb_curr, float sumy, thre } // putting them in the kernel cause a significant performance penalty -#define N_DST 4 // each SIMD group works on 4 rows -#define N_SIMDGROUP 2 // number of SIMD groups in a thread group +#define N_DST 4 // each SIMD group works on 4 rows +#define N_SIMDGROUP 2 // number of SIMD groups in a thread group #define N_SIMDWIDTH 32 // assuming SIMD group size is 32 //Note: This is a template, but strictly speaking it only applies to // quantizations where the block size is 32. It also does not @@ -435,18 +435,23 @@ void mul_vec_q_n_f32(device const void * src0, device const float * src1, device int64_t ne00, int64_t ne01, int64_t ne02, int64_t ne10, int64_t ne12, int64_t ne0, int64_t ne1, uint gqa, uint3 tgpig, uint tiisg, uint sgitg) { const int nb = ne00/QK4_0; + const int r0 = tgpig.x; const int r1 = tgpig.y; const int im = tgpig.z; + const int first_row = (r0 * nsg + sgitg) * nr; + const uint offset0 = first_row * nb + im/gqa*(nb*ne0); + device const block_q_type * x = (device const block_q_type *) src0 + offset0; device const float * y = (device const float *) src1 + r1*ne10 + im*ne00*ne1; - float yl[16]; // src1 vector cache - float sumf[nr]={0.f}; - const int ix = tiisg/2; - const int il = 8*(tiisg%2); + float yl[16]; // src1 vector cache + float sumf[nr] = {0.f}; + + const int ix = (tiisg/2); + const int il = (tiisg%2)*8; device const float * yb = y + ix * QK4_0 + il; @@ -457,6 +462,7 @@ void mul_vec_q_n_f32(device const void * src0, device const float * src1, device sumy += yb[i] + yb[i+1]; yl[i+0] = yb[i+ 0]; yl[i+1] = yb[i+ 1]/256.f; + sumy += yb[i+16] + yb[i+17]; yl[i+8] = yb[i+16]/16.f; yl[i+9] = yb[i+17]/4096.f; @@ -472,12 +478,12 @@ void mul_vec_q_n_f32(device const void * src0, device const float * src1, device for (int row = 0; row < nr; ++row) { const float tot = simd_sum(sumf[row]); if (tiisg == 0 && first_row + row < ne01) { - dst[r1*ne0 + im*ne0*ne1 + first_row + row] = tot; + dst[im*ne0*ne1 + r1*ne0 + first_row + row] = tot; } } } -kernel void kernel_mul_mat_q4_0_f32( +kernel void kernel_mul_mv_q4_0_f32( device const void * src0, device const float * src1, device float * dst, @@ -490,12 +496,12 @@ kernel void kernel_mul_mat_q4_0_f32( constant int64_t & ne1[[buffer(16)]], constant uint & gqa[[buffer(17)]], uint3 tgpig[[threadgroup_position_in_grid]], - uint tiisg[[thread_index_in_simdgroup]], - uint sgitg[[simdgroup_index_in_threadgroup]]) { + uint tiisg[[thread_index_in_simdgroup]], + uint sgitg[[simdgroup_index_in_threadgroup]]) { mul_vec_q_n_f32(src0,src1,dst,ne00,ne01,ne02,ne10,ne12,ne0,ne1,gqa,tgpig,tiisg,sgitg); } -kernel void kernel_mul_mat_q4_1_f32( +kernel void kernel_mul_mv_q4_1_f32( device const void * src0, device const float * src1, device float * dst, @@ -515,7 +521,7 @@ kernel void kernel_mul_mat_q4_1_f32( #define NB_Q8_0 8 -kernel void kernel_mul_mat_q8_0_f32( +kernel void kernel_mul_mv_q8_0_f32( device const void * src0, device const float * src1, device float * dst, @@ -579,7 +585,7 @@ kernel void kernel_mul_mat_q8_0_f32( #define N_F32_F32 4 -kernel void kernel_mul_mat_f32_f32( +kernel void kernel_mul_mv_f32_f32( device const char * src0, device const char * src1, device float * dst, @@ -650,7 +656,7 @@ kernel void kernel_mul_mat_f32_f32( } } -kernel void kernel_mul_mat_f16_f32_1row( +kernel void kernel_mul_mv_f16_f32_1row( device const char * src0, device const char * src1, device float * dst, @@ -669,7 +675,7 @@ kernel void kernel_mul_mat_f16_f32_1row( constant int64_t & ne0, constant int64_t & ne1, uint3 tgpig[[threadgroup_position_in_grid]], - uint tiisg[[thread_index_in_simdgroup]]) { + uint tiisg[[thread_index_in_simdgroup]]) { const int64_t r0 = tgpig.x; const int64_t r1 = tgpig.y; @@ -704,7 +710,7 @@ kernel void kernel_mul_mat_f16_f32_1row( #define N_F16_F32 4 -kernel void kernel_mul_mat_f16_f32( +kernel void kernel_mul_mv_f16_f32( device const char * src0, device const char * src1, device float * dst, @@ -776,7 +782,7 @@ kernel void kernel_mul_mat_f16_f32( } // Assumes row size (ne00) is a multiple of 4 -kernel void kernel_mul_mat_f16_f32_l4( +kernel void kernel_mul_mv_f16_f32_l4( device const char * src0, device const char * src1, device float * dst, @@ -1253,7 +1259,7 @@ static inline uchar4 get_scale_min_k4(int j, device const uint8_t * q) { //====================================== dot products ========================= -kernel void kernel_mul_mat_q2_K_f32( +kernel void kernel_mul_mv_q2_K_f32( device const void * src0, device const float * src1, device float * dst, @@ -1397,7 +1403,7 @@ kernel void kernel_mul_mat_q2_K_f32( } #if QK_K == 256 -kernel void kernel_mul_mat_q3_K_f32( +kernel void kernel_mul_mv_q3_K_f32( device const void * src0, device const float * src1, device float * dst, @@ -1549,7 +1555,7 @@ kernel void kernel_mul_mat_q3_K_f32( } } #else -kernel void kernel_mul_mat_q3_K_f32( +kernel void kernel_mul_mv_q3_K_f32( device const void * src0, device const float * src1, device float * dst, @@ -1620,7 +1626,7 @@ kernel void kernel_mul_mat_q3_K_f32( #endif #if QK_K == 256 -kernel void kernel_mul_mat_q4_K_f32( +kernel void kernel_mul_mv_q4_K_f32( device const void * src0, device const float * src1, device float * dst, @@ -1726,7 +1732,7 @@ kernel void kernel_mul_mat_q4_K_f32( } } #else -kernel void kernel_mul_mat_q4_K_f32( +kernel void kernel_mul_mv_q4_K_f32( device const void * src0, device const float * src1, device float * dst, @@ -1815,7 +1821,7 @@ kernel void kernel_mul_mat_q4_K_f32( } #endif -kernel void kernel_mul_mat_q5_K_f32( +kernel void kernel_mul_mv_q5_K_f32( device const void * src0, device const float * src1, device float * dst, @@ -1988,7 +1994,7 @@ kernel void kernel_mul_mat_q5_K_f32( } -kernel void kernel_mul_mat_q6_K_f32( +kernel void kernel_mul_mv_q6_K_f32( device const void * src0, device const float * src1, device float * dst, @@ -2326,7 +2332,7 @@ kernel void kernel_get_rows( } #define BLOCK_SIZE_M 64 // 8 simdgroup matrices from matrix A -#define BLOCK_SIZE_N 32 // 4 simdgroup matrices from matrix A +#define BLOCK_SIZE_N 32 // 4 simdgroup matrices from matrix B #define BLOCK_SIZE_K 32 #define THREAD_MAT_M 4 // each thread take 4 simdgroup matrices from matrix A #define THREAD_MAT_N 2 // each thread take 2 simdgroup matrices from matrix B @@ -2363,9 +2369,11 @@ kernel void kernel_mul_mm(device const uchar * src0, const uint r0 = tgpig.y; const uint r1 = tgpig.x; const uint im = tgpig.z; + // if this block is of 64x32 shape or smaller short n_rows = (ne0 - r0 * BLOCK_SIZE_M < BLOCK_SIZE_M) ? (ne0 - r0 * BLOCK_SIZE_M) : BLOCK_SIZE_M; short n_cols = (ne1 - r1 * BLOCK_SIZE_N < BLOCK_SIZE_N) ? (ne1 - r1 * BLOCK_SIZE_N) : BLOCK_SIZE_N; + // a thread shouldn't load data outside of the matrix short thread_row = ((short)tiitg/THREAD_PER_ROW) < n_rows ? ((short)tiitg/THREAD_PER_ROW) : n_rows - 1; short thread_col = ((short)tiitg/THREAD_PER_COL) < n_cols ? ((short)tiitg/THREAD_PER_COL) : n_cols - 1; @@ -2389,26 +2397,30 @@ kernel void kernel_mul_mm(device const uchar * src0, + nb10 * (BLOCK_SIZE_K / THREAD_PER_COL * (tiitg % THREAD_PER_COL))); for (int loop_k = 0; loop_k < ne00; loop_k += BLOCK_SIZE_K) { - //load data and store to threadgroup memory + // load data and store to threadgroup memory half4x4 temp_a; dequantize_func(x, il, temp_a); threadgroup_barrier(mem_flags::mem_threadgroup); + #pragma unroll(16) for (int i = 0; i < 16; i++) { *(sa + SG_MAT_SIZE * ((tiitg / THREAD_PER_ROW / 8) \ - + 16 * (tiitg % THREAD_PER_ROW) + 8 * (i / 8)) \ - + (tiitg / THREAD_PER_ROW) % 8 + (i & 7) * 8) = temp_a[i/4][i%4]; + + (tiitg % THREAD_PER_ROW) * 16 + (i / 8) * 8) \ + + (tiitg / THREAD_PER_ROW) % 8 + (i & 7) * 8) = temp_a[i/4][i%4]; } - *(threadgroup float2x4 *)(sb + (tiitg % THREAD_PER_COL) * 8 * 32 + 8 * (tiitg / THREAD_PER_COL)) \ - = *((device float2x4 *)y); + + *(threadgroup float2x4 *)(sb + (tiitg % THREAD_PER_COL) * 8 * 32 + 8 * (tiitg / THREAD_PER_COL)) = *((device float2x4 *)y); + il = (il + 2 < nl) ? il + 2 : il % 2; x = (il < 2) ? x + (2+nl-1)/nl : x; y += BLOCK_SIZE_K; threadgroup_barrier(mem_flags::mem_threadgroup); - //load matrices from threadgroup memory and conduct outer products + + // load matrices from threadgroup memory and conduct outer products threadgroup half * lsma = (sa + THREAD_MAT_M * SG_MAT_SIZE * (sgitg % 2)); threadgroup float * lsmb = (sb + THREAD_MAT_N * SG_MAT_SIZE * (sgitg / 2)); + #pragma unroll(4) for (int ik = 0; ik < BLOCK_SIZE_K / 8; ik++) { #pragma unroll(4) @@ -2423,6 +2435,7 @@ kernel void kernel_mul_mm(device const uchar * src0, lsma += BLOCK_SIZE_M / SG_MAT_ROW * SG_MAT_SIZE; lsmb += BLOCK_SIZE_N / SG_MAT_ROW * SG_MAT_SIZE; + #pragma unroll(8) for (int i = 0; i < 8; i++){ simdgroup_multiply_accumulate(c_res[i], mb[i/4], ma[i%4], c_res[i]); @@ -2431,25 +2444,26 @@ kernel void kernel_mul_mm(device const uchar * src0, } if ((r0 + 1) * BLOCK_SIZE_M <= ne0 && (r1 + 1) * BLOCK_SIZE_N <= ne1) { - device float *C = dst + BLOCK_SIZE_M * r0 + 32 * (sgitg&1) \ - + (BLOCK_SIZE_N * r1 + 16 * (sgitg>>1)) * ne0 + im*ne1*ne0; + device float * C = dst + (BLOCK_SIZE_M * r0 + 32 * (sgitg & 1)) \ + + (BLOCK_SIZE_N * r1 + 16 * (sgitg >> 1)) * ne0 + im*ne1*ne0; for (int i = 0; i < 8; i++) { simdgroup_store(c_res[i], C + 8 * (i%4) + 8 * ne0 * (i/4), ne0); } } else { // block is smaller than 64x32, we should avoid writing data outside of the matrix threadgroup_barrier(mem_flags::mem_threadgroup); - threadgroup float *temp_str = ((threadgroup float *)shared_memory) \ + threadgroup float * temp_str = ((threadgroup float *)shared_memory) \ + 32 * (sgitg&1) + (16 * (sgitg>>1)) * BLOCK_SIZE_M; for (int i = 0; i < 8; i++) { simdgroup_store(c_res[i], temp_str + 8 * (i%4) + 8 * BLOCK_SIZE_M * (i/4), BLOCK_SIZE_M); } threadgroup_barrier(mem_flags::mem_threadgroup); - device float *C = dst + BLOCK_SIZE_M * r0 + (BLOCK_SIZE_N * r1) * ne0 + im*ne1*ne0; - if (sgitg==0) { + + device float * C = dst + (BLOCK_SIZE_M * r0) + (BLOCK_SIZE_N * r1) * ne0 + im*ne1*ne0; + if (sgitg == 0) { for (int i = 0; i < n_rows; i++) { - for (int j = tiitg; j< n_cols; j += BLOCK_SIZE_N) { + for (int j = tiitg; j < n_cols; j += BLOCK_SIZE_N) { *(C + i + j * ne0) = *(temp_str + i + j * BLOCK_SIZE_M); } } From 7d8b24932fe788a4cda76459a0c5df3e0073cb98 Mon Sep 17 00:00:00 2001 From: Luo Tian Date: Sun, 8 Oct 2023 16:24:01 +0800 Subject: [PATCH 65/73] zig : fix build by introducing train.cpp (#3539) --- build.zig | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.zig b/build.zig index 3a8978bc3..b95491e03 100644 --- a/build.zig +++ b/build.zig @@ -111,12 +111,14 @@ pub fn build(b: *std.build.Builder) !void { const common = make.obj("common", "common/common.cpp"); const console = make.obj("common", "common/console.cpp"); const grammar_parser = make.obj("grammar-parser", "common/grammar-parser.cpp"); + const train = make.obj("train", "common/train.cpp"); _ = make.exe("main", "examples/main/main.cpp", &.{ ggml, ggml_alloc, llama, common, console, grammar_parser }); _ = make.exe("quantize", "examples/quantize/quantize.cpp", &.{ ggml, ggml_alloc, llama, common }); _ = make.exe("perplexity", "examples/perplexity/perplexity.cpp", &.{ ggml, ggml_alloc, llama, common }); _ = make.exe("embedding", "examples/embedding/embedding.cpp", &.{ ggml, ggml_alloc, llama, common }); - _ = make.exe("train-text-from-scratch", "examples/train-text-from-scratch/train-text-from-scratch.cpp", &.{ ggml, ggml_alloc, llama, common }); + _ = make.exe("finetune", "examples/finetune/finetune.cpp", &.{ ggml, ggml_alloc, llama, common, train }); + _ = make.exe("train-text-from-scratch", "examples/train-text-from-scratch/train-text-from-scratch.cpp", &.{ ggml, ggml_alloc, llama, common, train }); const server = make.exe("server", "examples/server/server.cpp", &.{ ggml, ggml_alloc, llama, common, grammar_parser }); if (server.target.isWindows()) { From 94e502dfb79430870b42b8e8ee132b4aaa93e4a8 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Sun, 8 Oct 2023 11:24:50 +0300 Subject: [PATCH 66/73] ci : enable on obj-c changes + fix metal build (#3540) --- .github/workflows/build.yml | 4 ++-- ggml-metal.m | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c1e36ee28..e41be76db 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,10 +10,10 @@ on: push: branches: - master - paths: ['.github/workflows/**', '**/CMakeLists.txt', '**/Makefile', '**/*.h', '**/*.hpp', '**/*.c', '**/*.cpp', '**/*.cu', '**/*.swift'] + paths: ['.github/workflows/**', '**/CMakeLists.txt', '**/Makefile', '**/*.h', '**/*.hpp', '**/*.c', '**/*.cpp', '**/*.cu', '**/*.swift', '**/*.m'] pull_request: types: [opened, synchronize, reopened] - paths: ['**/CMakeLists.txt', '**/Makefile', '**/*.h', '**/*.hpp', '**/*.c', '**/*.cpp', '**/*.cu', '**/*.swift'] + paths: ['**/CMakeLists.txt', '**/Makefile', '**/*.h', '**/*.hpp', '**/*.c', '**/*.cpp', '**/*.cu', '**/*.swift', '**/*.m'] env: BRANCH_NAME: ${{ github.head_ref || github.ref_name }} diff --git a/ggml-metal.m b/ggml-metal.m index 57c238dda..92956ed97 100644 --- a/ggml-metal.m +++ b/ggml-metal.m @@ -301,12 +301,11 @@ struct ggml_metal_context * ggml_metal_init(int n_cb) { #if TARGET_OS_OSX // print MTL GPU family: GGML_METAL_LOG_INFO("%s: GPU name: %s\n", __func__, [[ctx->device name] UTF8String]); - GGML_METAL_LOG_INFO("%s: GPU arch: %s\n", __func__, [[ctx->device architecture].name UTF8String]); // determine max supported GPU family // https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf // https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf - for (int i = MTLGPUFamilyApple9 + 10; i >= MTLGPUFamilyApple1; --i) { + for (int i = MTLGPUFamilyApple1 + 20; i >= MTLGPUFamilyApple1; --i) { if ([ctx->device supportsFamily:i]) { GGML_METAL_LOG_INFO("%s: GPU family: MTLGPUFamilyApple%d (%d)\n", __func__, i - MTLGPUFamilyApple1 + 1, i); break; From a1202a31ed8c35705bd09fe91c3e7410c619bd70 Mon Sep 17 00:00:00 2001 From: Johannes Rudolph Date: Sun, 8 Oct 2023 12:21:19 +0200 Subject: [PATCH 67/73] k-quants : fix comments about block sizing (#3499) --- k_quants.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/k_quants.h b/k_quants.h index adc6a3913..9de089e7a 100644 --- a/k_quants.h +++ b/k_quants.h @@ -29,7 +29,7 @@ // 2-bit quantization // weight is represented as x = a * q + b -// 16 blocks of 16 elemenets each +// 16 blocks of 16 elements each // Effectively 2.5625 bits per weight typedef struct { uint8_t scales[QK_K/16]; // scales and mins, quantized with 4 bits @@ -41,7 +41,7 @@ static_assert(sizeof(block_q2_K) == 2*sizeof(ggml_fp16_t) + QK_K/16 + QK_K/4, "w // 3-bit quantization // weight is represented as x = a * q -// 16 blocks of 16 elemenets each +// 16 blocks of 16 elements each // Effectively 3.4375 bits per weight #ifdef GGML_QKK_64 typedef struct { @@ -62,7 +62,7 @@ static_assert(sizeof(block_q3_K) == sizeof(ggml_fp16_t) + QK_K / 4 + QK_K / 8 + #endif // 4-bit quantization -// 16 blocks of 32 elements each +// 8 blocks of 32 elements each // weight is represented as x = a * q + b // Effectively 4.5 bits per weight #ifdef GGML_QKK_64 @@ -83,7 +83,7 @@ static_assert(sizeof(block_q4_K) == 2*sizeof(ggml_fp16_t) + K_SCALE_SIZE + QK_K/ #endif // 5-bit quantization -// 16 blocks of 32 elements each +// 8 blocks of 32 elements each // weight is represented as x = a * q + b // Effectively 5.5 bits per weight #ifdef GGML_QKK_64 @@ -107,7 +107,7 @@ static_assert(sizeof(block_q5_K) == 2*sizeof(ggml_fp16_t) + K_SCALE_SIZE + QK_K/ // 6-bit quantization // weight is represented as x = a * q -// 16 blocks of 16 elemenets each +// 16 blocks of 16 elements each // Effectively 6.5625 bits per weight typedef struct { uint8_t ql[QK_K/2]; // quants, lower 4 bits From 9c38d181d40b9d27f8f42152c18e7c70bfffcf37 Mon Sep 17 00:00:00 2001 From: arcrank Date: Sun, 8 Oct 2023 06:52:57 -0400 Subject: [PATCH 68/73] api_like_OAI.py : simplify function (#2796) Simplify function --- examples/server/api_like_OAI.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/examples/server/api_like_OAI.py b/examples/server/api_like_OAI.py index ed19237b0..1b0bf5757 100755 --- a/examples/server/api_like_OAI.py +++ b/examples/server/api_like_OAI.py @@ -23,13 +23,7 @@ parser.add_argument("--port", type=int, help="Set the port to listen.(default: 8 args = parser.parse_args() def is_present(json, key): - try: - buf = json[key] - except KeyError: - return False - return True - - + return key in json #convert chat to prompt def convert_chat(messages): From 8e6716a102e390e930594d51302730184dac83cc Mon Sep 17 00:00:00 2001 From: Ryder Wishart Date: Sun, 8 Oct 2023 03:55:58 -0700 Subject: [PATCH 69/73] api_like_OAI.py : compat with Microsoft Guidance (#2746) Check for None in addition to empty string check in all request params Co-authored-by: Georgi Gerganov --- examples/server/api_like_OAI.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/server/api_like_OAI.py b/examples/server/api_like_OAI.py index 1b0bf5757..14d2dcf65 100755 --- a/examples/server/api_like_OAI.py +++ b/examples/server/api_like_OAI.py @@ -23,7 +23,13 @@ parser.add_argument("--port", type=int, help="Set the port to listen.(default: 8 args = parser.parse_args() def is_present(json, key): - return key in json + try: + buf = json[key] + except KeyError: + return False + if json[key] == None: + return False + return True #convert chat to prompt def convert_chat(messages): From eee42c670e6fa6df9cf17e7ffc319f74cbd81354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matheus=20C=2E=20Fran=C3=A7a?= Date: Sun, 8 Oct 2023 10:59:20 -0300 Subject: [PATCH 70/73] ci : add Zig CI/CD and fix build (#2996) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * zig CI/CD and fix build Signed-off-by: Matheus Catarino França * fix build_compiler * ci : remove trailing whitespace --------- Signed-off-by: Matheus Catarino França Co-authored-by: Georgi Gerganov --- .github/workflows/zig-build.yml | 25 +++++++++++++++++++++++++ build.zig | 31 ++++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/zig-build.yml diff --git a/.github/workflows/zig-build.yml b/.github/workflows/zig-build.yml new file mode 100644 index 000000000..68a698ab9 --- /dev/null +++ b/.github/workflows/zig-build.yml @@ -0,0 +1,25 @@ +name: Zig CI + +on: + pull_request: + push: + branches: + - master + +jobs: + build: + strategy: + fail-fast: false + matrix: + runs-on: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.runs-on }} + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + fetch-depth: 0 + - uses: goto-bus-stop/setup-zig@v2 + with: + version: 0.11.0 + - name: Build Summary + run: zig build --summary all -freference-trace diff --git a/build.zig b/build.zig index b95491e03..c86e4c667 100644 --- a/build.zig +++ b/build.zig @@ -36,14 +36,17 @@ const Maker = struct { } fn init(builder: *std.build.Builder) !Maker { - // const commit_hash = @embedFile(".git/refs/heads/master"); const target = builder.standardTargetOptions(.{}); + const zig_version = @import("builtin").zig_version_string; + const commit_hash = try std.ChildProcess.exec( + .{ .allocator = builder.allocator, .argv = &.{ "git", "rev-parse", "HEAD" } }, + ); const config_header = builder.addConfigHeader( .{ .style = .blank, .include_path = "build-info.h" }, .{ .BUILD_NUMBER = 0, - .BUILD_COMMIT = "12345", // omit newline - .BUILD_COMPILER = "Zig 0.11.0", + .BUILD_COMMIT = commit_hash.stdout[0 .. commit_hash.stdout.len - 1], // omit newline + .BUILD_COMPILER = builder.fmt("Zig {s}", .{zig_version}), .BUILD_TARGET = try target.allocDescription(builder.allocator), }, ); @@ -67,12 +70,20 @@ const Maker = struct { fn obj(m: *const Maker, name: []const u8, src: []const u8) *Compile { const o = m.builder.addObject(.{ .name = name, .target = m.target, .optimize = m.optimize }); + if (o.target.getAbi() != .msvc) + o.defineCMacro("_GNU_SOURCE", null); + o.addConfigHeader(m.config_header); if (std.mem.endsWith(u8, src, ".c")) { o.addCSourceFiles(&.{src}, m.cflags.items); o.linkLibC(); } else { o.addCSourceFiles(&.{src}, m.cxxflags.items); - o.linkLibCpp(); + if (o.target.getAbi() == .msvc) { + o.linkLibC(); // need winsdk + crt + } else { + // linkLibCpp already add (libc++ + libunwind + libc) + o.linkLibCpp(); + } } o.addConfigHeader(m.config_header); for (m.include_dirs.items) |i| o.addIncludePath(.{ .path = i }); @@ -86,8 +97,14 @@ const Maker = struct { for (deps) |d| e.addObject(d); for (m.objs.items) |o| e.addObject(o); for (m.include_dirs.items) |i| e.addIncludePath(.{ .path = i }); - e.linkLibC(); - e.linkLibCpp(); + + // https://github.com/ziglang/zig/issues/15448 + if (e.target.getAbi() == .msvc) { + e.linkLibC(); // need winsdk + crt + } else { + // linkLibCpp already add (libc++ + libunwind + libc) + e.linkLibCpp(); + } e.addConfigHeader(m.config_header); m.builder.installArtifact(e); e.want_lto = m.enable_lto; @@ -109,7 +126,7 @@ pub fn build(b: *std.build.Builder) !void { const ggml_alloc = make.obj("ggml-alloc", "ggml-alloc.c"); const llama = make.obj("llama", "llama.cpp"); const common = make.obj("common", "common/common.cpp"); - const console = make.obj("common", "common/console.cpp"); + const console = make.obj("console", "common/console.cpp"); const grammar_parser = make.obj("grammar-parser", "common/grammar-parser.cpp"); const train = make.obj("train", "common/train.cpp"); From db3abcc114d5d1790ba814aa1a80ac673d4ccc3e Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Sun, 8 Oct 2023 20:19:14 +0300 Subject: [PATCH 71/73] sync : ggml (ggml-backend) (#3548) * sync : ggml (ggml-backend) ggml-ci * zig : add ggml-backend to the build --- CMakeLists.txt | 2 + Makefile | 7 +- build.zig | 15 +- ggml-alloc.c | 169 +++++--------- ggml-alloc.h | 16 +- ggml-backend.c | 385 +++++++++++++++++++++++++++++++ ggml-backend.h | 143 ++++++++++++ ggml-cuda.cu | 535 ++++++++++++++++++++++++++++++++++++------- ggml-cuda.h | 4 + ggml-metal.h | 19 +- ggml-metal.m | 137 +++++++++++ ggml.c | 37 +-- ggml.h | 16 +- llama.cpp | 44 ++-- scripts/sync-ggml.sh | 24 +- 15 files changed, 1285 insertions(+), 268 deletions(-) create mode 100644 ggml-backend.c create mode 100644 ggml-backend.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c79ec486..9184eda8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -663,6 +663,8 @@ add_library(ggml OBJECT ggml.h ggml-alloc.c ggml-alloc.h + ggml-backend.c + ggml-backend.h ${GGML_SOURCES_CUDA} ${GGML_HEADERS_CUDA} ${GGML_SOURCES_OPENCL} ${GGML_HEADERS_OPENCL} ${GGML_SOURCES_METAL} ${GGML_HEADERS_METAL} diff --git a/Makefile b/Makefile index b8b0d4b56..40187c4a2 100644 --- a/Makefile +++ b/Makefile @@ -512,9 +512,12 @@ ggml.o: ggml.c ggml.h ggml-cuda.h ggml-alloc.o: ggml-alloc.c ggml.h ggml-alloc.h $(CC) $(CFLAGS) -c $< -o $@ -OBJS += ggml-alloc.o +ggml-backend.o: ggml-backend.c ggml.h ggml-backend.h + $(CC) $(CFLAGS) -c $< -o $@ -llama.o: llama.cpp ggml.h ggml-alloc.h ggml-cuda.h ggml-metal.h llama.h +OBJS += ggml-alloc.o ggml-backend.o + +llama.o: llama.cpp ggml.h ggml-alloc.h ggml-backend.h ggml-cuda.h ggml-metal.h llama.h $(CXX) $(CXXFLAGS) -c $< -o $@ common.o: common/common.cpp common/common.h build-info.h common/log.h diff --git a/build.zig b/build.zig index c86e4c667..fdc5bc084 100644 --- a/build.zig +++ b/build.zig @@ -124,20 +124,21 @@ pub fn build(b: *std.build.Builder) !void { const ggml = make.obj("ggml", "ggml.c"); const ggml_alloc = make.obj("ggml-alloc", "ggml-alloc.c"); + const ggml_backend = make.obj("ggml-backend", "ggml-backend.c"); const llama = make.obj("llama", "llama.cpp"); const common = make.obj("common", "common/common.cpp"); const console = make.obj("console", "common/console.cpp"); const grammar_parser = make.obj("grammar-parser", "common/grammar-parser.cpp"); const train = make.obj("train", "common/train.cpp"); - _ = make.exe("main", "examples/main/main.cpp", &.{ ggml, ggml_alloc, llama, common, console, grammar_parser }); - _ = make.exe("quantize", "examples/quantize/quantize.cpp", &.{ ggml, ggml_alloc, llama, common }); - _ = make.exe("perplexity", "examples/perplexity/perplexity.cpp", &.{ ggml, ggml_alloc, llama, common }); - _ = make.exe("embedding", "examples/embedding/embedding.cpp", &.{ ggml, ggml_alloc, llama, common }); - _ = make.exe("finetune", "examples/finetune/finetune.cpp", &.{ ggml, ggml_alloc, llama, common, train }); - _ = make.exe("train-text-from-scratch", "examples/train-text-from-scratch/train-text-from-scratch.cpp", &.{ ggml, ggml_alloc, llama, common, train }); + _ = make.exe("main", "examples/main/main.cpp", &.{ ggml, ggml_alloc, ggml_backend, llama, common, console, grammar_parser }); + _ = make.exe("quantize", "examples/quantize/quantize.cpp", &.{ ggml, ggml_alloc, ggml_backend, llama, common }); + _ = make.exe("perplexity", "examples/perplexity/perplexity.cpp", &.{ ggml, ggml_alloc, ggml_backend, llama, common }); + _ = make.exe("embedding", "examples/embedding/embedding.cpp", &.{ ggml, ggml_alloc, ggml_backend, llama, common }); + _ = make.exe("finetune", "examples/finetune/finetune.cpp", &.{ ggml, ggml_alloc, ggml_backend, llama, common, train }); + _ = make.exe("train-text-from-scratch", "examples/train-text-from-scratch/train-text-from-scratch.cpp", &.{ ggml, ggml_alloc, ggml_backend, llama, common, train }); - const server = make.exe("server", "examples/server/server.cpp", &.{ ggml, ggml_alloc, llama, common, grammar_parser }); + const server = make.exe("server", "examples/server/server.cpp", &.{ ggml, ggml_alloc, ggml_backend, llama, common, grammar_parser }); if (server.target.isWindows()) { server.linkSystemLibrary("ws2_32"); } diff --git a/ggml-alloc.c b/ggml-alloc.c index 805759db7..3321f05e2 100644 --- a/ggml-alloc.c +++ b/ggml-alloc.c @@ -1,4 +1,5 @@ #include "ggml-alloc.h" +#include "ggml-backend.h" #include "ggml.h" #include #include @@ -6,25 +7,6 @@ #include #include -#ifdef __has_include - #if __has_include() - #include - #if defined(_POSIX_MAPPED_FILES) - #include - #include - #endif - #endif -#endif - -#if defined(_WIN32) - #define WIN32_LEAN_AND_MEAN - #ifndef NOMINMAX - #define NOMINMAX - #endif - #include - #include -#endif - #define UNUSED(x) (void)(x) #define MAX(a, b) ((a) > (b) ? (a) : (b)) @@ -80,8 +62,9 @@ struct free_block { #define MAX_FREE_BLOCKS 256 struct ggml_allocr { + struct ggml_backend_buffer * buffer; + bool buffer_owned; void * data; - size_t size; size_t alignment; int n_free_blocks; struct free_block free_blocks[MAX_FREE_BLOCKS]; @@ -119,16 +102,9 @@ static void remove_allocated_tensor(struct ggml_allocr * alloc, struct ggml_tens } #endif -static size_t ggml_allocr_get_alloc_size(struct ggml_allocr * alloc, struct ggml_tensor * tensor) { - return ggml_nbytes(tensor); - - UNUSED(alloc); -} - // check if a tensor is allocated by this buffer static bool ggml_allocr_is_own(struct ggml_allocr * alloc, const struct ggml_tensor * tensor) { - void * ptr = tensor->data; - return ptr >= alloc->data && (char *)ptr < (char *)alloc->data + alloc->max_size; + return tensor->buffer == alloc->buffer; } static bool ggml_is_view(struct ggml_tensor * t) { @@ -136,11 +112,10 @@ static bool ggml_is_view(struct ggml_tensor * t) { } void ggml_allocr_alloc(struct ggml_allocr * alloc, struct ggml_tensor * tensor) { -#ifdef GGML_ALLOCATOR_DEBUG GGML_ASSERT(!ggml_is_view(tensor)); // views generally get data pointer from one of their sources GGML_ASSERT(tensor->data == NULL); // avoid allocating tensor which already has memory allocated -#endif - size_t size = ggml_allocr_get_alloc_size(alloc, tensor); + + size_t size = ggml_backend_buffer_get_alloc_size(alloc->buffer, tensor); size = aligned_offset(NULL, size, alloc->alignment); AT_PRINTF("%s: allocating %s (%zu bytes) - ", __func__, tensor->name, size); @@ -188,6 +163,8 @@ void ggml_allocr_alloc(struct ggml_allocr * alloc, struct ggml_tensor * tensor) tensor->data = addr; AT_PRINTF("%s: allocated data at %p\n", __func__, tensor->data); + tensor->buffer = alloc->buffer; + ggml_backend_buffer_init_tensor(alloc->buffer, tensor); #ifdef GGML_ALLOCATOR_DEBUG add_allocated_tensor(alloc, tensor); @@ -208,19 +185,21 @@ void ggml_allocr_alloc(struct ggml_allocr * alloc, struct ggml_tensor * tensor) // this is a very naive implementation, but for our case the number of free blocks should be very small static void ggml_allocr_free_tensor(struct ggml_allocr * alloc, struct ggml_tensor * tensor) { - void * ptr = tensor->data; - if (ggml_allocr_is_own(alloc, tensor) == false) { // the tensor was not allocated in this buffer // this can happen because the graph allocator will try to free weights and other tensors from different buffers // the easiest way to deal with this is just to ignore it + AT_PRINTF("ignoring %s (their buffer: %p, our buffer: %p)\n", tensor->name, (void *)tensor->buffer, (void *)alloc->buffer); return; } - size_t size = ggml_allocr_get_alloc_size(alloc, tensor); + void * ptr = tensor->data; + + size_t size = ggml_backend_buffer_get_alloc_size(alloc->buffer, tensor); size = aligned_offset(NULL, size, alloc->alignment); AT_PRINTF("%s: freeing %s at %p (%zu bytes) - n_free_blocks = %d\n", __func__, tensor->name, ptr, size, alloc->n_free_blocks); - AT_PRINTF("%s: alloc->data = %p alloc->data+alloc->size = %p alloc->data+alloc->max_size = %p\n", __func__, alloc->data, (char*)alloc->data + alloc->size, (char*)alloc->data + alloc->max_size); + + ggml_backend_buffer_free_tensor(alloc->buffer, tensor); #ifdef GGML_ALLOCATOR_DEBUG remove_allocated_tensor(alloc, tensor); @@ -285,15 +264,18 @@ void ggml_allocr_reset(struct ggml_allocr * alloc) { alloc->n_free_blocks = 1; size_t align_offset = aligned_offset(alloc->data, 0, alloc->alignment); alloc->free_blocks[0].addr = (char *)alloc->data + align_offset; - alloc->free_blocks[0].size = alloc->size - align_offset; + alloc->free_blocks[0].size = ggml_backend_buffer_get_size(alloc->buffer) - align_offset; } struct ggml_allocr * ggml_allocr_new(void * data, size_t size, size_t alignment) { - struct ggml_allocr * alloc = (struct ggml_allocr *)malloc(sizeof(struct ggml_allocr) /* + n_free_blocks * sizeof(struct free_block) */); + struct ggml_backend_buffer * buffer = ggml_backend_cpu_buffer_from_ptr(NULL, data, size); + + struct ggml_allocr * alloc = (struct ggml_allocr *)malloc(sizeof(struct ggml_allocr)); *alloc = (struct ggml_allocr){ - /*.data = */ data, - /*.size = */ size, + /*.buffer = */ buffer, + /*.buffer_owned = */ true, + /*.base = */ ggml_backend_buffer_get_base(buffer), /*.alignment = */ alignment, /*.n_free_blocks = */ 0, /*.free_blocks = */ {{0}}, @@ -312,74 +294,26 @@ struct ggml_allocr * ggml_allocr_new(void * data, size_t size, size_t alignment) return alloc; } -// OS specific functions to allocate and free uncommitted virtual memory -static void * alloc_vmem(size_t size) { -#if defined(_WIN32) - return VirtualAlloc(NULL, size, MEM_RESERVE, PAGE_NOACCESS); -#elif defined(_POSIX_MAPPED_FILES) - void * ptr = mmap(NULL, size, PROT_NONE, MAP_PRIVATE | MAP_ANON, -1, 0); - if (ptr == MAP_FAILED) { - return NULL; - } - return ptr; -#else - // use a fixed address for other platforms - uintptr_t base_addr = (uintptr_t)-size - 0x100; - return (void *)base_addr; -#endif -} - -static void free_vmem(void * base_addr, size_t size) { -#if defined(_WIN32) - VirtualFree(base_addr, 0, MEM_RELEASE); - UNUSED(size); -#elif defined(_POSIX_MAPPED_FILES) - munmap(base_addr, size); -#else - // nothing to do - UNUSED(base_addr); - UNUSED(size); -#endif -} - -// allocate uncommitted virtual memory to measure the size of the graph -static void alloc_measure_vmem(void ** base_addr, size_t * size) { - // 128GB for 64-bit, 1GB for 32-bit - *size = sizeof(void *) == 4 ? 1ULL<<30 : 1ULL<<37; - do { - *base_addr = alloc_vmem(*size); - if (*base_addr != NULL) { - AT_PRINTF("allocated %.2f GB of virtual memory for measure buffer at %p\n", *size / 1024.0 / 1024.0 / 1024.0, *base_addr); - return; - } - // try again with half the size - *size /= 2; - } while (*size > 0); - - GGML_ASSERT(!"failed to allocate virtual memory for measure buffer"); -} - -static void free_measure_vmem(void * base_addr, size_t size) { - free_vmem(base_addr, size); -} - struct ggml_allocr * ggml_allocr_new_measure(size_t alignment) { - struct ggml_allocr * alloc = (struct ggml_allocr *)malloc(sizeof(struct ggml_allocr) /* + n_free_blocks * sizeof(struct free_block) */); + struct ggml_allocr * alloc = ggml_allocr_new((void *)0x1000, (size_t)-0x1001, alignment); + alloc->measure = true; - void * base_addr; - size_t size; + return alloc; +} - alloc_measure_vmem(&base_addr, &size); +struct ggml_allocr * ggml_allocr_new_from_buffer(struct ggml_backend_buffer * buffer) { + struct ggml_allocr * alloc = (struct ggml_allocr *)malloc(sizeof(struct ggml_allocr)); *alloc = (struct ggml_allocr){ - /*.data = */ base_addr, - /*.size = */ size, - /*.alignment = */ alignment, + /*.buffer = */ buffer, + /*.buffer_owned = */ false, + /*.base = */ ggml_backend_buffer_get_base(buffer), + /*.alignment = */ ggml_backend_buffer_get_alignment(buffer), /*.n_free_blocks = */ 0, /*.free_blocks = */ {{0}}, /*.hash_table = */ {{0}}, /*.max_size = */ 0, - /*.measure = */ true, + /*.measure = */ false, /*.parse_seq = */ {0}, /*.parse_seq_len = */ 0, #ifdef GGML_ALLOCATOR_DEBUG @@ -393,8 +327,8 @@ struct ggml_allocr * ggml_allocr_new_measure(size_t alignment) { } void ggml_allocr_free(struct ggml_allocr * alloc) { - if (alloc->measure) { - free_measure_vmem(alloc->data, alloc->size); + if (alloc->buffer_owned) { + ggml_backend_buffer_free(alloc->buffer); } free(alloc); } @@ -437,7 +371,6 @@ static bool ggml_op_can_inplace(enum ggml_op op) { case GGML_OP_ROPE: case GGML_OP_RMS_NORM: case GGML_OP_SOFT_MAX: - case GGML_OP_CONT: return true; default: @@ -445,12 +378,23 @@ static bool ggml_op_can_inplace(enum ggml_op op) { } } +static void init_view(struct ggml_allocr * alloc, struct ggml_tensor * view) { + assert(view->view_src != NULL && view->view_src->data != NULL); + view->backend = view->view_src->backend; + view->buffer = view->view_src->buffer; + view->data = (char *)view->view_src->data + view->view_offs; + + // FIXME: the view should be initialized by the owning buffer, but currently this breaks the CUDA backend + // due to the ggml_tensor_extra_gpu ring buffer overwriting the KV cache extras + assert(ggml_allocr_is_measure(alloc) || view->buffer->backend == alloc->buffer->backend); + ggml_backend_buffer_init_tensor(alloc->buffer, view); +} + static void allocate_node(struct ggml_allocr * alloc, struct ggml_tensor * node) { struct hash_node * ht = alloc->hash_table; if (node->data == NULL) { if (ggml_is_view(node)) { - assert(node->view_src->data != NULL); - node->data = (char *)node->view_src->data + node->view_offs; + init_view(alloc, node); } else { // see if we can reuse a parent's buffer (inplace) if (ggml_op_can_inplace(node->op)) { @@ -478,13 +422,17 @@ static void allocate_node(struct ggml_allocr * alloc, struct ggml_tensor * node) // adding a view_src pointer to the tensor would solve this and simplify the code dealing with views // for now, we only reuse the parent's data if the offset is zero (view_src->data == parent->data) AT_PRINTF("reusing view parent %s (%s) for %s\n", parent->name, view_src->name, node->name); - node->data = parent->data; + node->view_src = view_src; + view_src_hn->n_views += 1; + init_view(alloc, node); return; } } else { AT_PRINTF("reusing parent %s for %s\n", parent->name, node->name); - node->data = parent->data; + node->view_src = parent; + p_hn->n_views += 1; + init_view(alloc, node); return; } } @@ -495,7 +443,7 @@ static void allocate_node(struct ggml_allocr * alloc, struct ggml_tensor * node) } } -static size_t ggml_allocr_alloc_graph_tensors_n( +size_t ggml_allocr_alloc_graph_n( struct ggml_allocr * alloc, struct ggml_cgraph ** graphs, int n_graphs, struct ggml_tensor *** inputs, struct ggml_tensor *** outputs) { @@ -513,6 +461,10 @@ static size_t ggml_allocr_alloc_graph_tensors_n( if (ggml_is_view(node)) { struct ggml_tensor * view_src = node->view_src; hash_get(ht, view_src)->n_views += 1; + if (node->buffer == NULL && node->data != NULL) { + // view of a pre-allocated tensor, didn't call init_view() yet + init_view(alloc, node); + } } for (int j = 0; j < GGML_MAX_SRC; j++) { @@ -521,6 +473,9 @@ static size_t ggml_allocr_alloc_graph_tensors_n( break; } hash_get(ht, parent)->n_children += 1; + if (ggml_is_view(parent) && parent->buffer == NULL && parent->data != NULL) { + init_view(alloc, parent); + } } } } @@ -631,7 +586,7 @@ static size_t ggml_allocr_alloc_graph_tensors_n( } size_t ggml_allocr_alloc_graph(struct ggml_allocr * alloc, struct ggml_cgraph * graph) { - return ggml_allocr_alloc_graph_tensors_n(alloc, &graph, 1, NULL, NULL); + return ggml_allocr_alloc_graph_n(alloc, &graph, 1, NULL, NULL); } size_t ggml_allocr_max_size(struct ggml_allocr * alloc) { diff --git a/ggml-alloc.h b/ggml-alloc.h index 0c224f174..e38758878 100644 --- a/ggml-alloc.h +++ b/ggml-alloc.h @@ -6,21 +6,27 @@ extern "C" { #endif +struct ggml_backend_buffer; GGML_API struct ggml_allocr * ggml_allocr_new(void * data, size_t size, size_t alignment); GGML_API struct ggml_allocr * ggml_allocr_new_measure(size_t alignment); +GGML_API struct ggml_allocr * ggml_allocr_new_from_buffer(struct ggml_backend_buffer * buffer); // tell the allocator to parse nodes following the order described in the list // you should call this if your graph are optimized to execute out-of-order GGML_API void ggml_allocr_set_parse_seq(struct ggml_allocr * alloc, const int * list, int n); -GGML_API void ggml_allocr_free(struct ggml_allocr * alloc); -GGML_API bool ggml_allocr_is_measure(struct ggml_allocr * alloc); -GGML_API void ggml_allocr_reset(struct ggml_allocr * alloc); -GGML_API void ggml_allocr_alloc(struct ggml_allocr * alloc, struct ggml_tensor * tensor); +GGML_API void ggml_allocr_free (struct ggml_allocr * alloc); +GGML_API bool ggml_allocr_is_measure (struct ggml_allocr * alloc); +GGML_API void ggml_allocr_reset (struct ggml_allocr * alloc); +GGML_API void ggml_allocr_alloc (struct ggml_allocr * alloc, struct ggml_tensor * tensor); GGML_API size_t ggml_allocr_alloc_graph(struct ggml_allocr * alloc, struct ggml_cgraph * graph); -GGML_API size_t ggml_allocr_max_size(struct ggml_allocr * alloc); +GGML_API size_t ggml_allocr_max_size (struct ggml_allocr * alloc); +GGML_API size_t ggml_allocr_alloc_graph_n( + struct ggml_allocr * alloc, + struct ggml_cgraph ** graphs, int n_graphs, + struct ggml_tensor *** inputs, struct ggml_tensor *** outputs); #ifdef __cplusplus } diff --git a/ggml-backend.c b/ggml-backend.c new file mode 100644 index 000000000..ca8d83daf --- /dev/null +++ b/ggml-backend.c @@ -0,0 +1,385 @@ +#include "ggml-backend.h" +#include "ggml-alloc.h" + +#include +#include +#include +#include +#include + +#define UNUSED GGML_UNUSED + +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +// backend buffer + +ggml_backend_buffer_t ggml_backend_buffer_init( + struct ggml_backend * backend, + struct ggml_backend_buffer_i iface, + ggml_backend_buffer_context_t context, + size_t size) { + ggml_backend_buffer_t buffer = malloc(sizeof(struct ggml_backend_buffer)); + + GGML_ASSERT(iface.get_base != NULL); + + (*buffer) = (struct ggml_backend_buffer) { + /* .interface = */ iface, + /* .backend = */ backend, + /* .context = */ context, + /* .size = */ size, + }; + + return buffer; +} + +void ggml_backend_buffer_free(ggml_backend_buffer_t buffer) { + if (buffer->iface.free_buffer != NULL) { + buffer->iface.free_buffer(buffer); + } + free(buffer); +} + +size_t ggml_backend_buffer_get_alignment(ggml_backend_buffer_t buffer) { + return ggml_backend_get_alignment(buffer->backend); +} + +void * ggml_backend_buffer_get_base(ggml_backend_buffer_t buffer) { + return buffer->iface.get_base(buffer); +} + +size_t ggml_backend_buffer_get_size(ggml_backend_buffer_t buffer) { + return buffer->size; +} + +size_t ggml_backend_buffer_get_alloc_size(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor) { + if (buffer->iface.get_alloc_size) { + return buffer->iface.get_alloc_size(buffer, tensor); + } + return ggml_nbytes(tensor); +} + +void ggml_backend_buffer_init_tensor(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor) { + if (buffer->iface.init_tensor) { + buffer->iface.init_tensor(buffer, tensor); + } +} + +void ggml_backend_buffer_free_tensor(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor) { + if (buffer->iface.free_tensor) { + buffer->iface.free_tensor(buffer, tensor); + } +} + +// backend + +ggml_backend_t ggml_get_backend(const struct ggml_tensor * tensor) { + return tensor->buffer->backend; +} + +const char * ggml_backend_name(ggml_backend_t backend) { + return backend->iface.get_name(backend); +} + +void ggml_backend_free(ggml_backend_t backend) { + backend->iface.free(backend); +} + +ggml_backend_buffer_t ggml_backend_alloc_buffer(ggml_backend_t backend, size_t size) { + return backend->iface.alloc_buffer(backend, size); +} + +size_t ggml_backend_get_alignment(ggml_backend_t backend) { + return backend->iface.get_alignment(backend); +} + +void ggml_backend_tensor_set_async(struct ggml_tensor * tensor, const void * data, size_t offset, size_t size) { + ggml_get_backend(tensor)->iface.set_tensor_async(ggml_get_backend(tensor), tensor, data, offset, size); +} + +void ggml_backend_tensor_get_async(const struct ggml_tensor * tensor, void * data, size_t offset, size_t size) { + ggml_get_backend(tensor)->iface.get_tensor_async(ggml_get_backend(tensor), tensor, data, offset, size); +} + +void ggml_backend_tensor_set(struct ggml_tensor * tensor, const void * data, size_t offset, size_t size) { + ggml_get_backend(tensor)->iface.set_tensor_async(ggml_get_backend(tensor), tensor, data, offset, size); + ggml_get_backend(tensor)->iface.synchronize(ggml_get_backend(tensor)); +} + +void ggml_backend_tensor_get(const struct ggml_tensor * tensor, void * data, size_t offset, size_t size) { + ggml_get_backend(tensor)->iface.get_tensor_async(ggml_get_backend(tensor), tensor, data, offset, size); + ggml_get_backend(tensor)->iface.synchronize(ggml_get_backend(tensor)); +} + +void ggml_backend_synchronize(ggml_backend_t backend) { + backend->iface.synchronize(backend); +} + +ggml_backend_graph_plan_t ggml_backend_graph_plan_create(ggml_backend_t backend, struct ggml_cgraph * cgraph) { + return backend->iface.graph_plan_create(backend, cgraph); +} + +void ggml_backend_graph_plan_free(ggml_backend_t backend, ggml_backend_graph_plan_t plan) { + backend->iface.graph_plan_free(backend, plan); +} + +void ggml_backend_graph_plan_compute(ggml_backend_t backend, ggml_backend_graph_plan_t plan) { + backend->iface.graph_plan_compute(backend, plan); +} + +void ggml_backend_graph_compute(ggml_backend_t backend, struct ggml_cgraph * cgraph) { + backend->iface.graph_compute(backend, cgraph); +} + +bool ggml_backend_supports_op(ggml_backend_t backend, const struct ggml_tensor * op) { + return backend->iface.supports_op(backend, op); +} + +// backend copy + +static bool ggml_are_same_layout(const struct ggml_tensor * a, const struct ggml_tensor * b) { + if (a->type != b->type) { + return false; + } + for (int i = 0; i < GGML_MAX_DIMS; i++) { + if (a->ne[i] != b->ne[i]) { + return false; + } + if (a->nb[i] != b->nb[i]) { + return false; + } + } + return true; +} + +void ggml_backend_tensor_copy(struct ggml_tensor * src, struct ggml_tensor * dst) { + //printf("src: %s ne: [%d %d %d %d] nb: [%d %d %d %d]\n", src->name, (int)src->ne[0], (int)src->ne[1], (int)src->ne[2], (int)src->ne[3], (int)src->nb[0], (int)src->nb[1], (int)src->nb[2], (int)src->nb[3]); + //printf("dst: %s ne: [%d %d %d %d] nb: [%d %d %d %d]\n", dst->name, (int)dst->ne[0], (int)dst->ne[1], (int)dst->ne[2], (int)dst->ne[3], (int)dst->nb[0], (int)dst->nb[1], (int)dst->nb[2], (int)dst->nb[3]); + GGML_ASSERT(ggml_are_same_layout(src, dst) && "cannot copy tensors with different layouts"); + + // printf("cpy tensor %s from %s to %s (%lu bytes)\n", src->name, ggml_backend_name(src->backend), ggml_backend_name(dst->backend), ggml_nbytes(src)); + + if (src == dst) { + return; + } + + // TODO: allow backends to support copy to/from same backend + + if (ggml_get_backend(dst)->iface.cpy_tensor_from != NULL) { + ggml_get_backend(dst)->iface.cpy_tensor_from(ggml_get_backend(dst)->context, src, dst); + } else if (ggml_get_backend(src)->iface.cpy_tensor_to != NULL) { + ggml_get_backend(src)->iface.cpy_tensor_to(ggml_get_backend(src)->context, src, dst); + } else { + // shouldn't be hit when copying from/to CPU + #ifndef NDEBUG + fprintf(stderr, "ggml_backend_tensor_copy: neither cpy_tensor_from nor cpy_tensor_to are implemented for backends %s and %s, falling back to get/set\n", ggml_backend_name(src->buffer->backend), ggml_backend_name(dst->buffer->backend)); + #endif + size_t nbytes = ggml_nbytes(src); + void * data = malloc(nbytes); + ggml_backend_tensor_get(src, data, 0, nbytes); + ggml_backend_tensor_set(dst, data, 0, nbytes); + free(data); + } +} + +// backend CPU + +struct ggml_backend_cpu_context { + int n_threads; + void * work_data; + size_t work_size; +}; + +static const char * ggml_backend_cpu_name(ggml_backend_t backend) { + return "CPU"; + + UNUSED(backend); +} + +static void ggml_backend_cpu_free(ggml_backend_t backend) { + struct ggml_backend_cpu_context * cpu_ctx = (struct ggml_backend_cpu_context *)backend->context; + free(cpu_ctx->work_data); + free(cpu_ctx); + free(backend); +} + +static void * ggml_backend_cpu_buffer_get_base(ggml_backend_buffer_t buffer) { + return (void *)buffer->context; +} + +static void ggml_backend_cpu_buffer_free_buffer(ggml_backend_buffer_t buffer) { + free(buffer->context); + UNUSED(buffer); +} + +static struct ggml_backend_buffer_i cpu_backend_buffer_i = { + /* .free_buffer = */ ggml_backend_cpu_buffer_free_buffer, + /* .get_base = */ ggml_backend_cpu_buffer_get_base, + /* .get_alloc_size = */ NULL, // defaults to ggml_nbytes + /* .init_tensor = */ NULL, // no initialization required + /* .free_tensor = */ NULL, // no cleanup required +}; + +// for buffers from ptr, free is not called +static struct ggml_backend_buffer_i cpu_backend_buffer_i_from_ptr = { + /* .free_buffer = */ NULL, // ptr is not owned by the buffer, so it does not need to be freed + /* .get_base = */ ggml_backend_cpu_buffer_get_base, + /* .get_alloc_size = */ NULL, // defaults to ggml_nbytes + /* .init_tensor = */ NULL, + /* .free_tensor = */ NULL, +}; + +static const size_t TENSOR_ALIGNMENT = 64; // should be enough for AVX 512 + +static ggml_backend_buffer_t ggml_backend_cpu_alloc_buffer(ggml_backend_t backend, size_t size) { + size += TENSOR_ALIGNMENT; // malloc may return an address that is not aligned + void * data = malloc(size); // TODO: maybe use GGML_ALIGNED_MALLOC? + + return ggml_backend_buffer_init(backend, cpu_backend_buffer_i, data, size); +} + +static size_t ggml_backend_cpu_get_alignment(ggml_backend_t backend) { + return TENSOR_ALIGNMENT; + UNUSED(backend); +} + +static void ggml_backend_cpu_set_tensor_async(ggml_backend_t backend, struct ggml_tensor * tensor, const void * data, size_t offset, size_t size) { + GGML_ASSERT(offset + size <= ggml_nbytes(tensor) && "tensor write out of bounds"); + GGML_ASSERT(tensor->data != NULL && "tensor not allocated"); + + memcpy((char *)tensor->data + offset, data, size); + + UNUSED(backend); +} + +static void ggml_backend_cpu_get_tensor_async(ggml_backend_t backend, const struct ggml_tensor * tensor, void * data, size_t offset, size_t size) { + GGML_ASSERT(offset + size <= ggml_nbytes(tensor) && "tensor read out of bounds"); + GGML_ASSERT(tensor->data != NULL && "tensor not allocated"); + + memcpy(data, (const char *)tensor->data + offset, size); + + UNUSED(backend); +} + +static void ggml_backend_cpu_synchronize(ggml_backend_t backend) { + UNUSED(backend); +} + +static void ggml_backend_cpu_cpy_tensor_from(ggml_backend_t backend, struct ggml_tensor * src, struct ggml_tensor * dst) { + ggml_backend_tensor_get(src, dst->data, 0, ggml_nbytes(src)); + + UNUSED(backend); +} + +static void ggml_backend_cpu_cpy_tensor_to(ggml_backend_t backend, struct ggml_tensor * src, struct ggml_tensor * dst) { + // for a backend such as CUDA that can queue async calls, it is ok to do this asynchronously, but it may not be the case for other backends + ggml_backend_tensor_set_async(dst, src->data, 0, ggml_nbytes(src)); + + UNUSED(backend); +} + +struct ggml_backend_plan_cpu { + struct ggml_cplan cplan; + struct ggml_cgraph cgraph; +}; + +static ggml_backend_graph_plan_t ggml_backend_cpu_graph_plan_create(ggml_backend_t backend, struct ggml_cgraph * cgraph) { + struct ggml_backend_cpu_context * cpu_ctx = (struct ggml_backend_cpu_context *)backend->context; + + struct ggml_backend_plan_cpu * cpu_plan = malloc(sizeof(struct ggml_backend_plan_cpu)); + + cpu_plan->cplan = ggml_graph_plan(cgraph, cpu_ctx->n_threads); + cpu_plan->cgraph = *cgraph; + + if (cpu_plan->cplan.work_size > 0) { + cpu_plan->cplan.work_data = malloc(cpu_plan->cplan.work_size); + } + + return cpu_plan; +} + +static void ggml_backend_cpu_graph_plan_free(ggml_backend_t backend, ggml_backend_graph_plan_t plan) { + struct ggml_backend_plan_cpu * cpu_plan = (struct ggml_backend_plan_cpu *)plan; + + free(cpu_plan->cplan.work_data); + free(cpu_plan); + + UNUSED(backend); +} + +static void ggml_backend_cpu_graph_plan_compute(ggml_backend_t backend, ggml_backend_graph_plan_t plan) { + struct ggml_backend_plan_cpu * cpu_plan = (struct ggml_backend_plan_cpu *)plan; + + ggml_graph_compute(&cpu_plan->cgraph, &cpu_plan->cplan); + + UNUSED(backend); +} + +static void ggml_backend_cpu_graph_compute(ggml_backend_t backend, struct ggml_cgraph * cgraph) { + struct ggml_backend_cpu_context * cpu_ctx = (struct ggml_backend_cpu_context *)backend->context; + + struct ggml_cplan cplan = ggml_graph_plan(cgraph, cpu_ctx->n_threads); + + if (cpu_ctx->work_size < cplan.work_size) { + // TODO: may be faster to free and use malloc to avoid the copy + cpu_ctx->work_data = realloc(cpu_ctx->work_data, cplan.work_size); + cpu_ctx->work_size = cplan.work_size; + } + + cplan.work_data = cpu_ctx->work_data; + + ggml_graph_compute(cgraph, &cplan); +} + +static bool ggml_backend_cpu_supports_op(ggml_backend_t backend, const struct ggml_tensor * op) { + return true; + UNUSED(backend); + UNUSED(op); +} + +static struct ggml_backend_i cpu_backend_i = { + /* .get_name = */ ggml_backend_cpu_name, + /* .free = */ ggml_backend_cpu_free, + /* .alloc_buffer = */ ggml_backend_cpu_alloc_buffer, + /* .get_alignment = */ ggml_backend_cpu_get_alignment, + /* .set_tensor_async = */ ggml_backend_cpu_set_tensor_async, + /* .get_tensor_async = */ ggml_backend_cpu_get_tensor_async, + /* .synchronize = */ ggml_backend_cpu_synchronize, + /* .cpy_tensor_from = */ ggml_backend_cpu_cpy_tensor_from, + /* .cpy_tensor_to = */ ggml_backend_cpu_cpy_tensor_to, + /* .graph_plan_create = */ ggml_backend_cpu_graph_plan_create, + /* .graph_plan_free = */ ggml_backend_cpu_graph_plan_free, + /* .graph_plan_compute = */ ggml_backend_cpu_graph_plan_compute, + /* .graph_compute = */ ggml_backend_cpu_graph_compute, + /* .supports_op = */ ggml_backend_cpu_supports_op, +}; + +ggml_backend_t ggml_backend_cpu_init(void) { + struct ggml_backend_cpu_context * ctx = malloc(sizeof(struct ggml_backend_cpu_context)); + + ctx->n_threads = GGML_DEFAULT_N_THREADS; + ctx->work_data = NULL; + ctx->work_size = 0; + + ggml_backend_t cpu_backend = malloc(sizeof(struct ggml_backend)); + + *cpu_backend = (struct ggml_backend) { + /* .interface = */ cpu_backend_i, + /* .context = */ ctx + }; + return cpu_backend; +} + +bool ggml_backend_is_cpu(ggml_backend_t backend) { + return backend->iface.get_name == ggml_backend_cpu_name; +} + +void ggml_backend_cpu_set_n_threads(ggml_backend_t backend_cpu, int n_threads) { + GGML_ASSERT(ggml_backend_is_cpu(backend_cpu)); + + struct ggml_backend_cpu_context * ctx = (struct ggml_backend_cpu_context *)backend_cpu->context; + ctx->n_threads = n_threads; +} + +ggml_backend_buffer_t ggml_backend_cpu_buffer_from_ptr(ggml_backend_t backend_cpu, void * ptr, size_t size) { + return ggml_backend_buffer_init(backend_cpu, cpu_backend_buffer_i_from_ptr, ptr, size); +} diff --git a/ggml-backend.h b/ggml-backend.h new file mode 100644 index 000000000..da134b0db --- /dev/null +++ b/ggml-backend.h @@ -0,0 +1,143 @@ +#pragma once + +#include "ggml.h" + +#ifdef __cplusplus +extern "C" { +#endif + struct ggml_backend; + struct ggml_backend_buffer; + + // type-erased backend-specific types / wrappers + typedef void * ggml_backend_context_t; + typedef void * ggml_backend_graph_plan_t; + typedef void * ggml_backend_buffer_context_t; + + // avoid accessing internals of these types + typedef struct ggml_backend * ggml_backend_t; + typedef struct ggml_backend_buffer * ggml_backend_buffer_t; + + // + // backend buffer + // + + struct ggml_backend_buffer_i { + void (*free_buffer) (ggml_backend_buffer_t buffer); + void * (*get_base) (ggml_backend_buffer_t buffer); // get base pointer + size_t (*get_alloc_size)(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor); // pre-allocation callback + void (*init_tensor) (ggml_backend_buffer_t buffer, struct ggml_tensor * tensor); // post-allocation callback + void (*free_tensor) (ggml_backend_buffer_t buffer, struct ggml_tensor * tensor); // pre-free callback + }; + + // TODO: hide behind API + struct ggml_backend_buffer { + struct ggml_backend_buffer_i iface; + + ggml_backend_t backend; + ggml_backend_buffer_context_t context; + + size_t size; + }; + + // backend buffer functions + GGML_API ggml_backend_buffer_t ggml_backend_buffer_init( + struct ggml_backend * backend, + struct ggml_backend_buffer_i iface, + ggml_backend_buffer_context_t context, + size_t size); + + GGML_API void ggml_backend_buffer_free (ggml_backend_buffer_t buffer); + GGML_API size_t ggml_backend_buffer_get_alignment (ggml_backend_buffer_t buffer); + GGML_API void * ggml_backend_buffer_get_base (ggml_backend_buffer_t buffer); + GGML_API size_t ggml_backend_buffer_get_size (ggml_backend_buffer_t buffer); + GGML_API size_t ggml_backend_buffer_get_alloc_size(ggml_backend_buffer_t buffer, struct ggml_tensor * tensor); + GGML_API void ggml_backend_buffer_init_tensor (ggml_backend_buffer_t buffer, struct ggml_tensor * tensor); + GGML_API void ggml_backend_buffer_free_tensor (ggml_backend_buffer_t buffer, struct ggml_tensor * tensor); + + // + // backend + // + + struct ggml_backend_i { + const char * (*get_name)(ggml_backend_t backend); + + void (*free)(ggml_backend_t backend); + + // buffer allocation + ggml_backend_buffer_t (*alloc_buffer)(ggml_backend_t backend, size_t size); + + // get buffer alignment + size_t (*get_alignment)(ggml_backend_t backend); + + // tensor data access + // these functions can be asynchronous, helper functions are provided for synchronous access that automatically call synchronize + void (*set_tensor_async)(ggml_backend_t backend, struct ggml_tensor * tensor, const void * data, size_t offset, size_t size); + void (*get_tensor_async)(ggml_backend_t backend, const struct ggml_tensor * tensor, void * data, size_t offset, size_t size); + void (*synchronize) (ggml_backend_t backend); + + // (optional) copy tensor between different backends, allow for single-copy tranfers + void (*cpy_tensor_from)(ggml_backend_t backend, struct ggml_tensor * src, struct ggml_tensor * dst); + void (*cpy_tensor_to) (ggml_backend_t backend, struct ggml_tensor * src, struct ggml_tensor * dst); + + // compute graph with a plan + ggml_backend_graph_plan_t (*graph_plan_create) (ggml_backend_t backend, struct ggml_cgraph * cgraph); + void (*graph_plan_free) (ggml_backend_t backend, ggml_backend_graph_plan_t plan); + void (*graph_plan_compute)(ggml_backend_t backend, ggml_backend_graph_plan_t plan); + + // compute graph without a plan + void (*graph_compute)(ggml_backend_t backend, struct ggml_cgraph * cgraph); + + // check if the backend supports an operation + bool (*supports_op)(ggml_backend_t backend, const struct ggml_tensor * op); + }; + + // TODO: hide behind API + struct ggml_backend { + struct ggml_backend_i iface; + + ggml_backend_context_t context; + }; + + // backend helper functions + GGML_API ggml_backend_t ggml_get_backend(const struct ggml_tensor * tensor); + + GGML_API const char * ggml_backend_name(ggml_backend_t backend); + GGML_API void ggml_backend_free(ggml_backend_t backend); + + GGML_API ggml_backend_buffer_t ggml_backend_alloc_buffer(ggml_backend_t backend, size_t size); + + GGML_API size_t ggml_backend_get_alignment(ggml_backend_t backend); + + GGML_API void ggml_backend_tensor_set_async( struct ggml_tensor * tensor, const void * data, size_t offset, size_t size); + GGML_API void ggml_backend_tensor_get_async(const struct ggml_tensor * tensor, void * data, size_t offset, size_t size); + + GGML_API void ggml_backend_tensor_set( struct ggml_tensor * tensor, const void * data, size_t offset, size_t size); + GGML_API void ggml_backend_tensor_get(const struct ggml_tensor * tensor, void * data, size_t offset, size_t size); + + GGML_API void ggml_backend_synchronize(ggml_backend_t backend); + + GGML_API ggml_backend_graph_plan_t ggml_backend_graph_plan_create (ggml_backend_t backend, struct ggml_cgraph * cgraph); + + GGML_API void ggml_backend_graph_plan_free (ggml_backend_t backend, ggml_backend_graph_plan_t plan); + GGML_API void ggml_backend_graph_plan_compute(ggml_backend_t backend, ggml_backend_graph_plan_t plan); + GGML_API void ggml_backend_graph_compute (ggml_backend_t backend, struct ggml_cgraph * cgraph); + GGML_API bool ggml_backend_supports_op (ggml_backend_t backend, const struct ggml_tensor * op); + + // tensor copy between different backends + GGML_API void ggml_backend_tensor_copy(struct ggml_tensor * src, struct ggml_tensor * dst); + + // + // CPU backend + // + + GGML_API ggml_backend_t ggml_backend_cpu_init(void); + + GGML_API bool ggml_backend_is_cpu(ggml_backend_t backend); + + GGML_API void ggml_backend_cpu_set_n_threads(ggml_backend_t backend_cpu, int n_threads); + + GGML_API ggml_backend_buffer_t ggml_backend_cpu_buffer_from_ptr(ggml_backend_t backend_cpu, void * ptr, size_t size); + +#ifdef __cplusplus +} +#endif diff --git a/ggml-cuda.cu b/ggml-cuda.cu index 989c419cd..7e92c5197 100644 --- a/ggml-cuda.cu +++ b/ggml-cuda.cu @@ -62,6 +62,7 @@ #define cudaMemcpyHostToDevice hipMemcpyHostToDevice #define cudaMemcpyKind hipMemcpyKind #define cudaMemset hipMemset +#define cudaMemsetAsync hipMemsetAsync #define cudaOccupancyMaxPotentialBlockSize hipOccupancyMaxPotentialBlockSize #define cudaSetDevice hipSetDevice #define cudaStreamCreateWithFlags hipStreamCreateWithFlags @@ -419,6 +420,7 @@ static_assert(sizeof(block_q6_K) == sizeof(ggml_fp16_t) + 13*QK_K/16, "wrong q6_ #define CUDA_DIAG_MASK_INF_BLOCK_SIZE 32 #define CUDA_QUANTIZE_BLOCK_SIZE 256 #define CUDA_DEQUANTIZE_BLOCK_SIZE 256 +#define CUDA_GET_ROWS_BLOCK_SIZE 256 // dmmv = dequantize_mul_mat_vec #ifndef GGML_CUDA_DMMV_X @@ -1574,6 +1576,34 @@ static __global__ void quantize_q8_1(const float * __restrict__ x, void * __rest reinterpret_cast(y[ib].ds.y) = sum; } +template +static __global__ void k_get_rows(const void * x, const int32_t * y, dst_t * dst, const int ncols) { + const int col = (blockIdx.x*blockDim.x + threadIdx.x)*2; + const int row = blockDim.y*blockIdx.y + threadIdx.y; + + if (col >= ncols) { + return; + } + + const int r = y[row]; + + // copy x[r*ncols + col] to dst[row*ncols + col] + const int xi = r*ncols + col; + const int di = row*ncols + col; + + const int ib = xi/qk; // block index + const int iqs = (xi%qk)/qr; // quant index + const int iybs = di - di%qk; // y block start index + const int y_offset = qr == 1 ? 1 : qk/2; + + // dequantize + dfloat2 v; + dequantize_kernel(x, ib, iqs, v); + + dst[iybs + iqs + 0] = v.x; + dst[iybs + iqs + y_offset] = v.y; +} + template static __global__ void dequantize_block(const void * __restrict__ vx, dst_t * __restrict__ y, const int k) { const int i = blockDim.x*blockIdx.x + 2*threadIdx.x; @@ -4555,6 +4585,15 @@ static __global__ void scale_f32(const float * x, float * dst, const float scale dst[i] = scale * x[i]; } + +template +static void get_rows_cuda(const void * x, const int32_t * y, float * dst, const int nrows, const int ncols, cudaStream_t stream) { + const dim3 block_dims(CUDA_GET_ROWS_BLOCK_SIZE, 1, 1); + const int block_num_x = (ncols + 2*CUDA_GET_ROWS_BLOCK_SIZE - 1) / (2*CUDA_GET_ROWS_BLOCK_SIZE); + const dim3 block_nums(block_num_x, nrows, 1); + k_get_rows<<>>(x, y, dst, ncols); +} + static void add_f32_cuda(const float * x, const float * y, float * dst, const int kx, const int ky, cudaStream_t stream) { const int num_blocks = (kx + CUDA_ADD_BLOCK_SIZE - 1) / CUDA_ADD_BLOCK_SIZE; add_f32<<>>(x, y, dst, kx, ky); @@ -5703,7 +5742,7 @@ static cudaError_t ggml_cuda_cpy_tensor_2d( } else if (src->backend == GGML_BACKEND_GPU || src->backend == GGML_BACKEND_GPU_SPLIT) { GGML_ASSERT(src->backend != GGML_BACKEND_GPU_SPLIT || (i1_low == 0 && i1_high == src->ne[1])); kind = cudaMemcpyDeviceToDevice; - struct ggml_tensor_extra_gpu * extra = (ggml_tensor_extra_gpu *) src->extra; + ggml_tensor_extra_gpu * extra = (ggml_tensor_extra_gpu *) src->extra; int id; CUDA_CHECK(cudaGetDevice(&id)); src_ptr = (char *) extra->data_device[id]; @@ -5739,6 +5778,107 @@ static cudaError_t ggml_cuda_cpy_tensor_2d( } } +static void ggml_cuda_op_repeat( + const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, + const float * src0_d, const float * src1_d, float * dst_d, const cudaStream_t & stream) { + // guaranteed to be an integer due to the check in ggml_can_repeat + const int64_t ne0 = dst->ne[0]; + const int64_t ne1 = dst->ne[1]; + const int64_t ne2 = dst->ne[2]; + const int64_t ne3 = dst->ne[3]; + + const int64_t ne00 = src0->ne[0]; + const int64_t ne01 = src0->ne[1]; + const int64_t ne02 = src0->ne[2]; + const int64_t ne03 = src0->ne[3]; + + const size_t nb0 = dst->nb[0]; + const size_t nb1 = dst->nb[1]; + const size_t nb2 = dst->nb[2]; + const size_t nb3 = dst->nb[3]; + + const size_t nb00 = src0->nb[0]; + const size_t nb01 = src0->nb[1]; + const size_t nb02 = src0->nb[2]; + const size_t nb03 = src0->nb[3]; + + const int nr0 = (int)(ne0/ne00); + const int nr1 = (int)(ne1/ne01); + const int nr2 = (int)(ne2/ne02); + const int nr3 = (int)(ne3/ne03); + + // TODO: support for transposed / permuted tensors + GGML_ASSERT(nb0 == sizeof(float)); + GGML_ASSERT(nb00 == sizeof(float)); + + // TODO: very inefficient, implement in a kernel, or fewer cudaMemcpyAsync calls for contiguous tensors + for (int i3 = 0; i3 < nr3; i3++) { + for (int k3 = 0; k3 < ne03; k3++) { + for (int i2 = 0; i2 < nr2; i2++) { + for (int k2 = 0; k2 < ne02; k2++) { + for (int i1 = 0; i1 < nr1; i1++) { + for (int k1 = 0; k1 < ne01; k1++) { + for (int i0 = 0; i0 < nr0; i0++) { + CUDA_CHECK(cudaMemcpyAsync( + (char *) dst_d + (i3*ne03 + k3)*nb3 + (i2*ne02 + k2)*nb2 + (i1*ne01 + k1)*nb1 + (i0*ne00)*nb0, + (const char *) src0_d + ( k3)*nb03 + ( k2)*nb02 + ( k1)*nb01, + ne00*nb0, cudaMemcpyDeviceToDevice, stream)); + } + } + } + } + } + } + } + + (void) src1; + (void) src1_d; +} + +static void ggml_cuda_op_get_rows( + const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, + const float * src0_d, const float * src1_d, float * dst_d, const cudaStream_t & stream) { + + GGML_ASSERT(src1->type == GGML_TYPE_I32); + GGML_ASSERT(dst->type == GGML_TYPE_F32); + GGML_ASSERT(ggml_is_contiguous(src0)); + GGML_ASSERT(ggml_is_contiguous(src1)); + GGML_ASSERT(ggml_is_contiguous(dst)); + + const int ncols = src0->ne[0]; + const int nrows = ggml_nelements(src1); + + const int32_t * src1_i32 = (const int32_t *) src1_d; + + switch (src0->type) { + case GGML_TYPE_F16: + get_rows_cuda<1, 1, convert_f16>(src0_d, src1_i32, dst_d, nrows, ncols, stream); + break; + case GGML_TYPE_F32: + get_rows_cuda<1, 1, convert_f32>(src0_d, src1_i32, dst_d, nrows, ncols, stream); + break; + case GGML_TYPE_Q4_0: + get_rows_cuda(src0_d, src1_i32, dst_d, nrows, ncols, stream); + break; + case GGML_TYPE_Q4_1: + get_rows_cuda(src0_d, src1_i32, dst_d, nrows, ncols, stream); + break; + case GGML_TYPE_Q5_0: + get_rows_cuda(src0_d, src1_i32, dst_d, nrows, ncols, stream); + break; + case GGML_TYPE_Q5_1: + get_rows_cuda(src0_d, src1_i32, dst_d, nrows, ncols, stream); + break; + case GGML_TYPE_Q8_0: + get_rows_cuda(src0_d, src1_i32, dst_d, nrows, ncols, stream); + break; + default: + // TODO: k-quants + GGML_ASSERT(false); + break; + } +} + inline void ggml_cuda_op_add( const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, const float * src0_dd, const float * src1_dd, float * dst_dd, const cudaStream_t & main_stream) { @@ -6343,7 +6483,14 @@ inline void ggml_cuda_op_scale( GGML_ASSERT(src1->type == GGML_TYPE_F32); GGML_ASSERT( dst->type == GGML_TYPE_F32); - const float scale = ((float *) src1->data)[0]; + float scale; + // HACK: support for ggml backend interface + if (src1->backend == GGML_BACKEND_CPU) { + scale = ((float *) src1->data)[0]; + } else { + // TODO: pass pointer to kernel instead of copying to host + CUDA_CHECK(cudaMemcpy(&scale, src1->data, sizeof(float), cudaMemcpyDeviceToHost)); + } scale_f32_cuda(src0_dd, dst_dd, scale, ggml_nelements(src0), main_stream); CUDA_CHECK(cudaGetLastError()); @@ -6362,9 +6509,9 @@ static void ggml_cuda_op_flatten(const ggml_tensor * src0, const ggml_tensor * s GGML_ASSERT(!use_src1 || src1->backend != GGML_BACKEND_GPU_SPLIT); GGML_ASSERT( dst->backend != GGML_BACKEND_GPU_SPLIT); - struct ggml_tensor_extra_gpu * src0_extra = (ggml_tensor_extra_gpu *) src0->extra; - struct ggml_tensor_extra_gpu * src1_extra = use_src1 ? (ggml_tensor_extra_gpu *) src1->extra : nullptr; - struct ggml_tensor_extra_gpu * dst_extra = (ggml_tensor_extra_gpu *) dst->extra; + ggml_tensor_extra_gpu * src0_extra = (ggml_tensor_extra_gpu *) src0->extra; + ggml_tensor_extra_gpu * src1_extra = use_src1 ? (ggml_tensor_extra_gpu *) src1->extra : nullptr; + ggml_tensor_extra_gpu * dst_extra = (ggml_tensor_extra_gpu *) dst->extra; const bool src0_on_device = src0->backend == GGML_BACKEND_GPU || src0->backend == GGML_BACKEND_GPU_SPLIT; const bool src1_on_device = use_src1 && src1->backend == GGML_BACKEND_GPU; @@ -6505,9 +6652,9 @@ static void ggml_cuda_op_mul_mat( const size_t q8_1_ts = sizeof(block_q8_1); const size_t q8_1_bs = QK8_1; - struct ggml_tensor_extra_gpu * src0_extra = (ggml_tensor_extra_gpu *) src0->extra; - struct ggml_tensor_extra_gpu * src1_extra = (ggml_tensor_extra_gpu *) src1->extra; - struct ggml_tensor_extra_gpu * dst_extra = (ggml_tensor_extra_gpu *) dst->extra; + ggml_tensor_extra_gpu * src0_extra = (ggml_tensor_extra_gpu *) src0->extra; + ggml_tensor_extra_gpu * src1_extra = (ggml_tensor_extra_gpu *) src1->extra; + ggml_tensor_extra_gpu * dst_extra = (ggml_tensor_extra_gpu *) dst->extra; const bool src0_on_device = src0->backend == GGML_BACKEND_GPU || src0->backend == GGML_BACKEND_GPU_SPLIT; const bool src0_is_contiguous = ggml_is_contiguous(src0); @@ -6585,7 +6732,7 @@ static void ggml_cuda_op_mul_mat( if (convert_src1_to_q8_1) { src1_ddq[id] = (char *) ggml_cuda_pool_malloc(nrows1*src1_padded_col_size*q8_1_ts/q8_1_bs, &src1_asq[id]); - if (split && src1_on_device && src1_is_contiguous) { + if (src1_on_device && src1_is_contiguous) { quantize_row_q8_1_cuda(src1_ddf[id], src1_ddq[id], ne10, nrows1, src1_padded_col_size, stream); CUDA_CHECK(cudaGetLastError()); } @@ -6667,7 +6814,7 @@ static void ggml_cuda_op_mul_mat( GGML_ASSERT(false); } - if (convert_src1_to_q8_1 && src1->backend == GGML_BACKEND_CPU) { + if (convert_src1_to_q8_1 && (src1->backend == GGML_BACKEND_CPU || !src1_is_contiguous)) { quantize_row_q8_1_cuda(src1_ddf_i, src1_ddq_i, ne10, src1_ncols, src1_padded_col_size, stream); CUDA_CHECK(cudaGetLastError()); } @@ -6758,6 +6905,14 @@ static void ggml_cuda_op_mul_mat( } } +static void ggml_cuda_repeat(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + ggml_cuda_op_flatten(src0, src1, dst, ggml_cuda_op_repeat); +} + +static void ggml_cuda_get_rows(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { + ggml_cuda_op_flatten(src0, src1, dst, ggml_cuda_op_get_rows); +} + static void ggml_cuda_add(const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst) { ggml_cuda_op_flatten(src0, src1, dst, ggml_cuda_op_add); } @@ -6812,13 +6967,13 @@ static void ggml_cuda_mul_mat_vec_p021(const ggml_tensor * src0, const ggml_tens CUDA_CHECK(ggml_cuda_set_device(g_main_device)); cudaStream_t main_stream = g_cudaStreams[g_main_device][0]; - struct ggml_tensor_extra_gpu * src0_extra = (ggml_tensor_extra_gpu *) src0->extra; + ggml_tensor_extra_gpu * src0_extra = (ggml_tensor_extra_gpu *) src0->extra; void * src0_ddq = src0_extra->data_device[g_main_device]; - struct ggml_tensor_extra_gpu * src1_extra = (ggml_tensor_extra_gpu *) src1->extra; + ggml_tensor_extra_gpu * src1_extra = (ggml_tensor_extra_gpu *) src1->extra; float * src1_ddf = (float *) src1_extra->data_device[g_main_device]; - struct ggml_tensor_extra_gpu * dst_extra = (ggml_tensor_extra_gpu *) dst->extra; + ggml_tensor_extra_gpu * dst_extra = (ggml_tensor_extra_gpu *) dst->extra; float * dst_ddf = (float *) dst_extra->data_device[g_main_device]; ggml_mul_mat_p021_f16_f32_cuda(src0_ddq, src1_ddf, dst_ddf, ne00, ne01, ne02, ne12, main_stream); @@ -6843,13 +6998,13 @@ static void ggml_cuda_mul_mat_vec_nc(const ggml_tensor * src0, const ggml_tensor CUDA_CHECK(ggml_cuda_set_device(g_main_device)); cudaStream_t main_stream = g_cudaStreams[g_main_device][0]; - struct ggml_tensor_extra_gpu * src0_extra = (ggml_tensor_extra_gpu *) src0->extra; + ggml_tensor_extra_gpu * src0_extra = (ggml_tensor_extra_gpu *) src0->extra; void * src0_ddq = src0_extra->data_device[g_main_device]; - struct ggml_tensor_extra_gpu * src1_extra = (ggml_tensor_extra_gpu *) src1->extra; + ggml_tensor_extra_gpu * src1_extra = (ggml_tensor_extra_gpu *) src1->extra; float * src1_ddf = (float *) src1_extra->data_device[g_main_device]; - struct ggml_tensor_extra_gpu * dst_extra = (ggml_tensor_extra_gpu *) dst->extra; + ggml_tensor_extra_gpu * dst_extra = (ggml_tensor_extra_gpu *) dst->extra; float * dst_ddf = (float *) dst_extra->data_device[g_main_device]; const int64_t row_stride_x = nb01 / sizeof(half); @@ -6870,11 +7025,11 @@ static void ggml_cuda_mul_mat(const ggml_tensor * src0, const ggml_tensor * src1 } } - if (all_on_device && ggml_is_permuted(src0) && ggml_is_permuted(src1) && src1->ne[1] == 1) { + if (all_on_device && src0->type == GGML_TYPE_F16 && ggml_is_permuted(src0) && ggml_is_permuted(src1) && src1->ne[1] == 1) { ggml_cuda_mul_mat_vec_p021(src0, src1, dst); } else if (all_on_device && !ggml_is_contiguous(src0) && ggml_is_contiguous(src1) && src1->ne[1] == 1) { ggml_cuda_mul_mat_vec_nc(src0, src1, dst); - }else if (src0->type == GGML_TYPE_F32) { + } else if (src0->type == GGML_TYPE_F32) { ggml_cuda_op_mul_mat(src0, src1, dst, ggml_cuda_op_mul_mat_cublas, false); } else if (ggml_is_quantized(src0->type) || src0->type == GGML_TYPE_F16) { if (src1->ne[1] == 1 && src0->ne[0] % GGML_CUDA_DMMV_X == 0) { @@ -6935,8 +7090,8 @@ static void ggml_cuda_cpy(const ggml_tensor * src0, const ggml_tensor * src1, gg CUDA_CHECK(ggml_cuda_set_device(g_main_device)); cudaStream_t main_stream = g_cudaStreams[g_main_device][0]; - const struct ggml_tensor_extra_gpu * src0_extra = (ggml_tensor_extra_gpu *) src0->extra; - const struct ggml_tensor_extra_gpu * src1_extra = (ggml_tensor_extra_gpu *) src1->extra; + const ggml_tensor_extra_gpu * src0_extra = (ggml_tensor_extra_gpu *) src0->extra; + const ggml_tensor_extra_gpu * src1_extra = (ggml_tensor_extra_gpu *) src1->extra; char * src0_ddc = (char *) src0_extra->data_device[g_main_device]; char * src1_ddc = (char *) src1_extra->data_device[g_main_device]; @@ -6991,8 +7146,8 @@ void ggml_cuda_transform_tensor(void * data, struct ggml_tensor * tensor) { const size_t nb1 = tensor->nb[1]; - ggml_backend backend = tensor->backend; - struct ggml_tensor_extra_gpu * extra = new struct ggml_tensor_extra_gpu; + ggml_backend_type backend = tensor->backend; + ggml_tensor_extra_gpu * extra = new struct ggml_tensor_extra_gpu; memset(extra, 0, sizeof(*extra)); for (int64_t id = 0; id < g_device_count; ++id) { @@ -7046,7 +7201,6 @@ void ggml_cuda_transform_tensor(void * data, struct ggml_tensor * tensor) { CUDA_CHECK(cudaMemset(buf + original_size, 0, size - original_size)); } - CUDA_CHECK(cudaMemcpy(buf, buf_host, original_size, cudaMemcpyHostToDevice)); extra->data_device[id] = buf; @@ -7085,17 +7239,17 @@ void ggml_cuda_free_data(struct ggml_tensor * tensor) { delete extra; } -static struct ggml_tensor_extra_gpu * g_temp_tensor_extras = nullptr; +static ggml_tensor_extra_gpu * g_temp_tensor_extras = nullptr; static size_t g_temp_tensor_extra_index = 0; -static struct ggml_tensor_extra_gpu * ggml_cuda_alloc_temp_tensor_extra() { +static ggml_tensor_extra_gpu * ggml_cuda_alloc_temp_tensor_extra() { if (g_temp_tensor_extras == nullptr) { g_temp_tensor_extras = new ggml_tensor_extra_gpu[GGML_MAX_NODES]; } size_t alloc_index = g_temp_tensor_extra_index; g_temp_tensor_extra_index = (g_temp_tensor_extra_index + 1) % GGML_MAX_NODES; - struct ggml_tensor_extra_gpu * extra = &g_temp_tensor_extras[alloc_index]; + ggml_tensor_extra_gpu * extra = &g_temp_tensor_extras[alloc_index]; memset(extra, 0, sizeof(*extra)); return extra; @@ -7123,7 +7277,7 @@ static void ggml_cuda_assign_buffers_impl(struct ggml_tensor * tensor, bool scra return; } - struct ggml_tensor_extra_gpu * extra; + ggml_tensor_extra_gpu * extra; const bool inplace = (tensor->src[0] != nullptr && tensor->src[0]->data == tensor->data) || tensor->op == GGML_OP_VIEW || @@ -7132,7 +7286,7 @@ static void ggml_cuda_assign_buffers_impl(struct ggml_tensor * tensor, bool scra CUDA_CHECK(ggml_cuda_set_device(g_main_device)); if (inplace && (tensor->src[0]->backend == GGML_BACKEND_GPU || tensor->src[0]->backend == GGML_BACKEND_GPU_SPLIT)) { - struct ggml_tensor_extra_gpu * src0_extra = (ggml_tensor_extra_gpu * ) tensor->src[0]->extra; + ggml_tensor_extra_gpu * src0_extra = (ggml_tensor_extra_gpu * ) tensor->src[0]->extra; char * src0_ddc = (char *) src0_extra->data_device[g_main_device]; size_t offset = 0; if (tensor->op == GGML_OP_VIEW) { @@ -7141,7 +7295,7 @@ static void ggml_cuda_assign_buffers_impl(struct ggml_tensor * tensor, bool scra extra = ggml_cuda_alloc_temp_tensor_extra(); extra->data_device[g_main_device] = src0_ddc + offset; } else if (tensor->op == GGML_OP_CPY) { - struct ggml_tensor_extra_gpu * src1_extra = (ggml_tensor_extra_gpu * ) tensor->src[1]->extra; + ggml_tensor_extra_gpu * src1_extra = (ggml_tensor_extra_gpu * ) tensor->src[1]->extra; void * src1_ddv = src1_extra->data_device[g_main_device]; extra = ggml_cuda_alloc_temp_tensor_extra(); extra->data_device[g_main_device] = src1_ddv; @@ -7183,13 +7337,13 @@ void ggml_cuda_assign_scratch_offset(struct ggml_tensor * tensor, size_t offset) CUDA_CHECK(cudaMalloc(&g_scratch_buffer, g_scratch_size)); } - struct ggml_tensor_extra_gpu * extra = ggml_cuda_alloc_temp_tensor_extra(); + ggml_tensor_extra_gpu * extra = ggml_cuda_alloc_temp_tensor_extra(); const bool inplace = (tensor->src[0] != nullptr && tensor->src[0]->data == tensor->data) || tensor->op == GGML_OP_VIEW; if (inplace && (tensor->src[0]->backend == GGML_BACKEND_GPU || tensor->src[0]->backend == GGML_BACKEND_GPU_SPLIT)) { - struct ggml_tensor_extra_gpu * src0_extra = (ggml_tensor_extra_gpu * ) tensor->src[0]->extra; + ggml_tensor_extra_gpu * src0_extra = (ggml_tensor_extra_gpu * ) tensor->src[0]->extra; char * src0_ddc = (char *) src0_extra->data_device[g_main_device]; size_t view_offset = 0; if (tensor->op == GGML_OP_VIEW) { @@ -7207,7 +7361,7 @@ void ggml_cuda_copy_to_device(struct ggml_tensor * tensor) { GGML_ASSERT(tensor->backend == GGML_BACKEND_GPU); GGML_ASSERT(ggml_is_contiguous(tensor)); - struct ggml_tensor_extra_gpu * extra = (ggml_tensor_extra_gpu *) tensor->extra; + ggml_tensor_extra_gpu * extra = (ggml_tensor_extra_gpu *) tensor->extra; CUDA_CHECK(ggml_cuda_set_device(g_main_device)); CUDA_CHECK(cudaMemcpy(extra->data_device[g_main_device], tensor->data, ggml_nbytes(tensor), cudaMemcpyHostToDevice)); } @@ -7264,58 +7418,47 @@ void ggml_cuda_free_scratch() { g_scratch_buffer = nullptr; } -bool ggml_cuda_compute_forward(struct ggml_compute_params * params, struct ggml_tensor * tensor){ +bool ggml_cuda_compute_forward(struct ggml_compute_params * params, struct ggml_tensor * tensor) { ggml_cuda_func_t func; const bool any_on_device = tensor->backend == GGML_BACKEND_GPU || (tensor->src[0] != nullptr && (tensor->src[0]->backend == GGML_BACKEND_GPU || tensor->src[0]->backend == GGML_BACKEND_GPU_SPLIT)) || (tensor->src[1] != nullptr && tensor->src[1]->backend == GGML_BACKEND_GPU); + if (!any_on_device && tensor->op != GGML_OP_MUL_MAT) { + return false; + } + switch (tensor->op) { + case GGML_OP_REPEAT: + func = ggml_cuda_repeat; + break; + case GGML_OP_GET_ROWS: + func = ggml_cuda_get_rows; + break; case GGML_OP_DUP: - if (!any_on_device) { - return false; - } func = ggml_cuda_dup; break; case GGML_OP_ADD: - if (!any_on_device) { - return false; - } func = ggml_cuda_add; break; case GGML_OP_MUL: - if (!any_on_device) { - return false; - } func = ggml_cuda_mul; break; case GGML_OP_UNARY: switch (ggml_get_unary_op(tensor)) { case GGML_UNARY_OP_GELU: - if (!any_on_device) { - return false; - } func = ggml_cuda_gelu; break; case GGML_UNARY_OP_SILU: - if (!any_on_device) { - return false; - } func = ggml_cuda_silu; break; default: return false; } break; case GGML_OP_NORM: - if (!any_on_device) { - return false; - } func = ggml_cuda_norm; break; case GGML_OP_RMS_NORM: - if (!any_on_device) { - return false; - } func = ggml_cuda_rms_norm; break; case GGML_OP_MUL_MAT: @@ -7325,54 +7468,30 @@ bool ggml_cuda_compute_forward(struct ggml_compute_params * params, struct ggml_ func = ggml_cuda_mul_mat; break; case GGML_OP_SCALE: - if (!any_on_device) { - return false; - } func = ggml_cuda_scale; break; case GGML_OP_CPY: - if (!any_on_device) { - return false; - } func = ggml_cuda_cpy; break; case GGML_OP_CONT: - if (!any_on_device) { - return false; - } func = ggml_cuda_dup; break; case GGML_OP_RESHAPE: case GGML_OP_VIEW: case GGML_OP_PERMUTE: case GGML_OP_TRANSPOSE: - if (!any_on_device) { - return false; - } func = ggml_cuda_nop; break; case GGML_OP_DIAG_MASK_INF: - if (!any_on_device) { - return false; - } func = ggml_cuda_diag_mask_inf; break; case GGML_OP_SOFT_MAX: - if (!any_on_device) { - return false; - } func = ggml_cuda_soft_max; break; case GGML_OP_ROPE: - if (!any_on_device) { - return false; - } func = ggml_cuda_rope; break; case GGML_OP_ALIBI: - if (!any_on_device) { - return false; - } func = ggml_cuda_alibi; break; default: @@ -7400,3 +7519,263 @@ void ggml_cuda_get_device_description(int device, char * description, size_t des CUDA_CHECK(cudaGetDeviceProperties(&prop, device)); snprintf(description, description_size, "%s", prop.name); } + +//////////////////////////////////////////////////////////////////////////////// + +// backend interface + +#define UNUSED GGML_UNUSED + +struct ggml_backend_context_cuda { +}; + +static const char * ggml_backend_cuda_name(ggml_backend_t backend) { + return GGML_CUDA_NAME; + + UNUSED(backend); +} + +static void ggml_backend_cuda_free(ggml_backend_t backend) { + ggml_backend_context_cuda * cuda_ctx = (ggml_backend_context_cuda *)backend->context; + delete cuda_ctx; + delete backend; +} + +struct ggml_backend_buffer_context_cuda { + void * device; + + ggml_tensor_extra_gpu * temp_tensor_extras = nullptr; + size_t temp_tensor_extra_index = 0; + + ~ggml_backend_buffer_context_cuda() { + delete[] temp_tensor_extras; + } + + ggml_tensor_extra_gpu * ggml_cuda_alloc_temp_tensor_extra() { + if (temp_tensor_extras == nullptr) { + temp_tensor_extras = new ggml_tensor_extra_gpu[GGML_MAX_NODES]; + } + + size_t alloc_index = temp_tensor_extra_index; + temp_tensor_extra_index = (temp_tensor_extra_index + 1) % GGML_MAX_NODES; + ggml_tensor_extra_gpu * extra = &temp_tensor_extras[alloc_index]; + memset(extra, 0, sizeof(*extra)); + + return extra; + } +}; + +static void ggml_backend_cuda_buffer_free_buffer(ggml_backend_buffer_t buffer) { + ggml_backend_buffer_context_cuda * ctx = (ggml_backend_buffer_context_cuda *)buffer->context; + CUDA_CHECK(cudaFree(ctx->device)); + delete ctx; +} + +static void * ggml_backend_cuda_buffer_get_base(ggml_backend_buffer_t buffer) { + ggml_backend_buffer_context_cuda * ctx = (ggml_backend_buffer_context_cuda *)buffer->context; + return ctx->device; +} + +static size_t ggml_backend_cuda_buffer_get_alloc_size(ggml_backend_buffer_t buffer, ggml_tensor * tensor) { + int64_t row_low = 0; + int64_t row_high = ggml_nrows(tensor); + int64_t nrows_split = row_high - row_low; + + size_t size = ggml_nbytes_split(tensor, nrows_split); + + int64_t ne0 = tensor->ne[0]; + + if (ggml_is_quantized(tensor->type)) { + if (ne0 % MATRIX_ROW_PADDING != 0) { + size += (MATRIX_ROW_PADDING - ne0 % MATRIX_ROW_PADDING) + * ggml_type_size(tensor->type)/ggml_blck_size(tensor->type); + } + } + + return size; + + UNUSED(buffer); +} + +static void ggml_backend_cuda_buffer_init_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor) { + ggml_backend_buffer_context_cuda * ctx = (ggml_backend_buffer_context_cuda *)buffer->context; + + if (tensor->view_src != NULL && tensor->view_offs == 0) { + assert(tensor->view_src->buffer->backend == buffer->backend); + tensor->backend = tensor->view_src->backend; + tensor->extra = tensor->view_src->extra; + return; + } + + ggml_tensor_extra_gpu * extra = ctx->ggml_cuda_alloc_temp_tensor_extra(); + + extra->data_device[g_main_device] = tensor->data; + + tensor->backend = GGML_BACKEND_GPU; + tensor->extra = extra; + + if (ggml_is_quantized(tensor->type)) { + // initialize padding to 0 to avoid possible NaN values + int64_t row_low = 0; + int64_t row_high = ggml_nrows(tensor); + int64_t nrows_split = row_high - row_low; + + size_t original_size = ggml_nbytes_split(tensor, nrows_split); + size_t padded_size = ggml_backend_cuda_buffer_get_alloc_size(tensor->buffer, tensor); + + if (padded_size > original_size && tensor->view_src == nullptr) { + CUDA_CHECK(cudaMemsetAsync((char *)tensor->data + original_size, 0, padded_size - original_size, g_cudaStreams[g_main_device][0])); + } + } + + UNUSED(buffer); +} + +static struct ggml_backend_buffer_i cuda_backend_buffer_interface = { + /* .free_buffer = */ ggml_backend_cuda_buffer_free_buffer, + /* .get_base = */ ggml_backend_cuda_buffer_get_base, + /* .get_alloc_size = */ ggml_backend_cuda_buffer_get_alloc_size, + /* .init_tensor = */ ggml_backend_cuda_buffer_init_tensor, + /* .free_tensor = */ NULL, +}; + +static ggml_backend_buffer_t ggml_backend_cuda_alloc_buffer(ggml_backend_t backend, size_t size) { + ggml_cuda_set_device(g_main_device); + + ggml_backend_buffer_context_cuda * ctx = new ggml_backend_buffer_context_cuda; + CUDA_CHECK(cudaMalloc(&ctx->device, size)); + return ggml_backend_buffer_init(backend, cuda_backend_buffer_interface, ctx, size); +} + +static size_t ggml_backend_cuda_get_alignment(ggml_backend_t backend) { + return 128; + UNUSED(backend); +} + +static void ggml_backend_cuda_set_tensor_async(ggml_backend_t backend, ggml_tensor * tensor, const void * data, size_t offset, size_t size) { + GGML_ASSERT(offset + size <= ggml_nbytes(tensor) && "tensor write out of bounds"); + GGML_ASSERT(tensor->data != NULL && "tensor not allocated"); + GGML_ASSERT(tensor->backend == GGML_BACKEND_GPU); + + CUDA_CHECK(cudaMemcpyAsync((char *)tensor->data + offset, data, size, cudaMemcpyHostToDevice, g_cudaStreams[g_main_device][0])); + + UNUSED(backend); +} + +static void ggml_backend_cuda_get_tensor_async(ggml_backend_t backend, const ggml_tensor * tensor, void * data, size_t offset, size_t size) { + GGML_ASSERT(offset + size <= ggml_nbytes(tensor) && "tensor read out of bounds"); + GGML_ASSERT(tensor->data != NULL && "tensor not allocated"); + GGML_ASSERT(tensor->backend == GGML_BACKEND_GPU); + + CUDA_CHECK(cudaMemcpyAsync(data, (const char *)tensor->data + offset, size, cudaMemcpyDeviceToHost, g_cudaStreams[g_main_device][0])); + + UNUSED(backend); +} + +static void ggml_backend_cuda_synchronize(ggml_backend_t backend) { + CUDA_CHECK(cudaStreamSynchronize(g_cudaStreams[g_main_device][0])); + + UNUSED(backend); +} + +static ggml_backend_graph_plan_t ggml_backend_cuda_graph_plan_create(ggml_backend_t backend, ggml_cgraph * cgraph) { + GGML_ASSERT(!"not implemented"); + + return nullptr; + + UNUSED(backend); + UNUSED(cgraph); +} + +static void ggml_backend_cuda_graph_plan_free(ggml_backend_t backend, ggml_backend_graph_plan_t plan) { + GGML_ASSERT(!"not implemented"); + + UNUSED(backend); + UNUSED(plan); +} + +static void ggml_backend_cuda_graph_plan_compute(ggml_backend_t backend, ggml_backend_graph_plan_t plan) { + GGML_ASSERT(!"not implemented"); + + UNUSED(backend); + UNUSED(plan); +} + +static void ggml_backend_cuda_graph_compute(ggml_backend_t backend, ggml_cgraph * cgraph) { + ggml_cuda_set_device(g_main_device); + + ggml_compute_params params = {}; + params.type = GGML_TASK_COMPUTE; + params.ith = 0; + for (int i = 0; i < cgraph->n_nodes; i++) { + ggml_tensor * node = cgraph->nodes[i]; + + assert(node->backend == GGML_BACKEND_GPU); + for (int j = 0; j < GGML_MAX_SRC; j++) { + if (node->src[j] != nullptr) { + assert(node->src[j]->backend == GGML_BACKEND_GPU); + } + } + + bool ok = ggml_cuda_compute_forward(¶ms, node); + if (!ok) { + fprintf(stderr, "%s: error: op not supported %s (%s)\n", __func__, node->name, ggml_op_name(node->op)); + } + GGML_ASSERT(ok); + +#if 0 + if (node->type == GGML_TYPE_F32) { + cudaDeviceSynchronize(); + std::vector tmp(ggml_nelements(node), 0.0f); + cudaMemcpy(tmp.data(), node->data, ggml_nelements(node)*sizeof(float), cudaMemcpyDeviceToHost); + printf("\n%s (%s) (%s %s) (%s %s): ", node->name, ggml_op_name(node->op), + ggml_type_name(node->src[0]->type), + node->src[1] ? ggml_type_name(node->src[1]->type) : "none", + node->src[0]->name, + node->src[1] ? node->src[1]->name : "none"); + double sum = 0.0; + double sq_sum = 0.0; + for (int i = 0; i < ggml_nelements(node); i++) { + printf("%f ", tmp[i]); + sum += tmp[i]; + sq_sum += tmp[i]*tmp[i]; + } + printf("\n"); + printf("sum: %f, ", sum); + printf("sq_sum: %f\n", sq_sum); + } +#endif + } + + UNUSED(backend); +} + +static ggml_backend_i cuda_backend_i = { + /* .get_name = */ ggml_backend_cuda_name, + /* .free = */ ggml_backend_cuda_free, + /* .alloc_buffer = */ ggml_backend_cuda_alloc_buffer, + /* .get_alignment = */ ggml_backend_cuda_get_alignment, + /* .set_tensor_async = */ ggml_backend_cuda_set_tensor_async, + /* .get_tensor_async = */ ggml_backend_cuda_get_tensor_async, + /* .synchronize = */ ggml_backend_cuda_synchronize, + /* .cpy_tensor_from = */ nullptr, + /* .cpy_tensor_to = */ nullptr, + /* .graph_plan_create = */ ggml_backend_cuda_graph_plan_create, + /* .graph_plan_free = */ ggml_backend_cuda_graph_plan_free, + /* .graph_plan_compute = */ ggml_backend_cuda_graph_plan_compute, + /* .graph_compute = */ ggml_backend_cuda_graph_compute, + /* .supports_op = */ nullptr, +}; + +ggml_backend_t ggml_backend_cuda_init() { + ggml_init_cublas(); // TODO: remove from ggml.c + + ggml_backend_context_cuda * ctx = new ggml_backend_context_cuda; + + ggml_backend_t cuda_backend = new ggml_backend { + /* .interface = */ cuda_backend_i, + /* .context = */ ctx + }; + + return cuda_backend; +} diff --git a/ggml-cuda.h b/ggml-cuda.h index fda704b66..57adc9cf3 100644 --- a/ggml-cuda.h +++ b/ggml-cuda.h @@ -1,6 +1,7 @@ #pragma once #include "ggml.h" +#include "ggml-backend.h" #ifdef GGML_USE_HIPBLAS #define GGML_CUDA_NAME "ROCm" @@ -42,6 +43,9 @@ GGML_API bool ggml_cuda_compute_forward(struct ggml_compute_params * params, s GGML_API int ggml_cuda_get_device_count(void); GGML_API void ggml_cuda_get_device_description(int device, char * description, size_t description_size); +// backend API +GGML_API ggml_backend_t ggml_backend_cuda_init(void); // TODO: take a list of devices to use + #ifdef __cplusplus } #endif diff --git a/ggml-metal.h b/ggml-metal.h index 790cf0bf7..096b844e3 100644 --- a/ggml-metal.h +++ b/ggml-metal.h @@ -20,6 +20,7 @@ #pragma once #include "ggml.h" +#include "ggml-backend.h" #include #include @@ -35,10 +36,15 @@ struct ggml_cgraph; extern "C" { #endif -void ggml_metal_log_set_callback(ggml_log_callback log_callback, void * user_data); +// +// internal API +// temporary exposed to user-code +// struct ggml_metal_context; +void ggml_metal_log_set_callback(ggml_log_callback log_callback, void * user_data); + // number of command buffers to use struct ggml_metal_context * ggml_metal_init(int n_cb); void ggml_metal_free(struct ggml_metal_context * ctx); @@ -83,6 +89,17 @@ int * ggml_metal_get_concur_list(struct ggml_metal_context * ctx); // creates gf->n_threads command buffers in parallel void ggml_metal_graph_compute(struct ggml_metal_context * ctx, struct ggml_cgraph * gf); +// +// backend API +// user-code should use only these functions +// + +GGML_API ggml_backend_t ggml_backend_metal_init(void); + +GGML_API bool ggml_backend_is_metal(ggml_backend_t backend); + +GGML_API void ggml_backend_metal_set_n_cb(ggml_backend_t backend, int n_cb); + #ifdef __cplusplus } #endif diff --git a/ggml-metal.m b/ggml-metal.m index 92956ed97..29cb3c922 100644 --- a/ggml-metal.m +++ b/ggml-metal.m @@ -1456,3 +1456,140 @@ void ggml_metal_graph_compute( } } + +//////////////////////////////////////////////////////////////////////////////// + +// backend interface + +static const char * ggml_backend_metal_name(ggml_backend_t backend) { + return "Metal"; + + UNUSED(backend); +} + +static void ggml_backend_metal_free(ggml_backend_t backend) { + struct ggml_metal_context * ctx = (struct ggml_metal_context *)backend->context; + ggml_metal_free(ctx); + free(backend); +} + +static void * ggml_backend_metal_buffer_get_base(ggml_backend_buffer_t buffer) { + return (void *)buffer->context; +} + +static void ggml_backend_metal_buffer_free_buffer(ggml_backend_buffer_t buffer) { + free(buffer->context); + UNUSED(buffer); +} + +static struct ggml_backend_buffer_i metal_backend_buffer_i = { + /* .free_buffer = */ ggml_backend_metal_buffer_free_buffer, + /* .get_base = */ ggml_backend_metal_buffer_get_base, + /* .get_alloc_size = */ NULL, // defaults to ggml_nbytes + /* .init_tensor = */ NULL, // no initialization required + /* .free_tensor = */ NULL, // no cleanup required +}; + +static ggml_backend_buffer_t ggml_backend_metal_alloc_buffer(ggml_backend_t backend, size_t size) { + struct ggml_metal_context * ctx = (struct ggml_metal_context *)backend->context; + + void * data = ggml_metal_host_malloc(size); + + // TODO: set proper name of the buffers + ggml_metal_add_buffer(ctx, "backend", data, size, 0); + + return ggml_backend_buffer_init(backend, metal_backend_buffer_i, data, size); +} + +static size_t ggml_backend_metal_get_alignment(ggml_backend_t backend) { + return 32; + UNUSED(backend); +} + +static void ggml_backend_metal_set_tensor_async(ggml_backend_t backend, struct ggml_tensor * tensor, const void * data, size_t offset, size_t size) { + GGML_ASSERT(offset + size <= ggml_nbytes(tensor) && "tensor write out of bounds"); + GGML_ASSERT(tensor->data != NULL && "tensor not allocated"); + + memcpy((char *)tensor->data + offset, data, size); + + UNUSED(backend); +} + +static void ggml_backend_metal_get_tensor_async(ggml_backend_t backend, const struct ggml_tensor * tensor, void * data, size_t offset, size_t size) { + GGML_ASSERT(offset + size <= ggml_nbytes(tensor) && "tensor read out of bounds"); + GGML_ASSERT(tensor->data != NULL && "tensor not allocated"); + + memcpy(data, (const char *)tensor->data + offset, size); + + UNUSED(backend); +} + +static void ggml_backend_metal_synchronize(ggml_backend_t backend) { + UNUSED(backend); +} + +static void ggml_backend_metal_cpy_tensor_from(ggml_backend_t backend, struct ggml_tensor * src, struct ggml_tensor * dst) { + ggml_backend_tensor_get(src, dst->data, 0, ggml_nbytes(src)); + + UNUSED(backend); +} + +static void ggml_backend_metal_cpy_tensor_to(ggml_backend_t backend, struct ggml_tensor * src, struct ggml_tensor * dst) { + ggml_backend_tensor_set_async(dst, src->data, 0, ggml_nbytes(src)); + + UNUSED(backend); +} + +static void ggml_backend_metal_graph_compute(ggml_backend_t backend, struct ggml_cgraph * cgraph) { + struct ggml_metal_context * metal_ctx = (struct ggml_metal_context *)backend->context; + + ggml_metal_graph_compute(metal_ctx, cgraph); +} + +static bool ggml_backend_metal_supports_op(ggml_backend_t backend, const struct ggml_tensor * op) { + return true; + UNUSED(backend); + UNUSED(op); +} + +static struct ggml_backend_i metal_backend_i = { + /* .get_name = */ ggml_backend_metal_name, + /* .free = */ ggml_backend_metal_free, + /* .alloc_buffer = */ ggml_backend_metal_alloc_buffer, + /* .get_alignment = */ ggml_backend_metal_get_alignment, + /* .set_tensor_async = */ ggml_backend_metal_set_tensor_async, + /* .get_tensor_async = */ ggml_backend_metal_get_tensor_async, + /* .synchronize = */ ggml_backend_metal_synchronize, + /* .cpy_tensor_from = */ ggml_backend_metal_cpy_tensor_from, + /* .cpy_tensor_to = */ ggml_backend_metal_cpy_tensor_to, + /* .graph_plan_create = */ NULL, // the metal implementation does not require creating graph plans atm + /* .graph_plan_free = */ NULL, + /* .graph_plan_compute = */ NULL, + /* .graph_compute = */ ggml_backend_metal_graph_compute, + /* .supports_op = */ ggml_backend_metal_supports_op, +}; + +ggml_backend_t ggml_backend_metal_init(void) { + struct ggml_metal_context * ctx = malloc(sizeof(struct ggml_metal_context)); + + ctx = ggml_metal_init(GGML_DEFAULT_N_THREADS); + + ggml_backend_t metal_backend = malloc(sizeof(struct ggml_backend)); + + *metal_backend = (struct ggml_backend) { + /* .interface = */ metal_backend_i, + /* .context = */ ctx, + }; + + return metal_backend; +} + +bool ggml_backend_is_metal(ggml_backend_t backend) { + return backend->iface.get_name == ggml_backend_metal_name; +} + +void ggml_backend_metal_set_n_cb(ggml_backend_t backend, int n_cb) { + struct ggml_metal_context * ctx = (struct ggml_metal_context *)backend->context; + + ggml_metal_set_n_cb(ctx, n_cb); +} diff --git a/ggml.c b/ggml.c index 911a63988..6d1776ca4 100644 --- a/ggml.c +++ b/ggml.c @@ -162,40 +162,16 @@ typedef void * thread_ret_t; #define GGML_PRINT(...) printf(__VA_ARGS__) +// +// end of logging block +// + #ifdef GGML_USE_ACCELERATE // uncomment to use vDSP for soft max computation // note: not sure if it is actually faster //#define GGML_SOFT_MAX_ACCELERATE #endif -// -// logging -// - -#if (GGML_DEBUG >= 1) -#define GGML_PRINT_DEBUG(...) printf(__VA_ARGS__) -#else -#define GGML_PRINT_DEBUG(...) -#endif - -#if (GGML_DEBUG >= 5) -#define GGML_PRINT_DEBUG_5(...) printf(__VA_ARGS__) -#else -#define GGML_PRINT_DEBUG_5(...) -#endif - -#if (GGML_DEBUG >= 10) -#define GGML_PRINT_DEBUG_10(...) printf(__VA_ARGS__) -#else -#define GGML_PRINT_DEBUG_10(...) -#endif - -#define GGML_PRINT(...) printf(__VA_ARGS__) - -// -// end of logging block -// - #if defined(_MSC_VER) || defined(__MINGW32__) #define GGML_ALIGNED_MALLOC(size) _aligned_malloc(size, GGML_MEM_ALIGN) #define GGML_ALIGNED_FREE(ptr) _aligned_free(ptr) @@ -4951,6 +4927,7 @@ static struct ggml_tensor * ggml_new_tensor_impl( *result = (struct ggml_tensor) { /*.type =*/ type, /*.backend =*/ GGML_BACKEND_CPU, + /*.buffer =*/ NULL, /*.n_dims =*/ n_dims, /*.ne =*/ { 1, 1, 1, 1 }, /*.nb =*/ { 0, 0, 0, 0 }, @@ -20203,6 +20180,10 @@ static enum ggml_opt_result ggml_opt_lbfgs( ggml_vec_cpy_f32(nx, xp, x); ggml_vec_cpy_f32(nx, gp, g); + // TODO: instead of passing &cancel here, use the return code of the linesearch + // to determine if the optimization should be cancelled + // this is a simple change, but not doing this atm, since I don't have a nice + // way to test and don't want to break something with so many changes lined up ls = linesearch_backtracking(¶ms, nx, x, &fx, g, d, step, xp, f, gb, &cplan, np, ps, &cancel, callback, callback_data); if (cancel) { return GGML_OPT_CANCEL; diff --git a/ggml.h b/ggml.h index a9d4e33d9..3eddc44b9 100644 --- a/ggml.h +++ b/ggml.h @@ -326,7 +326,7 @@ extern "C" { GGML_TYPE_COUNT, }; - enum ggml_backend { + enum ggml_backend_type { GGML_BACKEND_CPU = 0, GGML_BACKEND_GPU = 10, GGML_BACKEND_GPU_SPLIT = 20, @@ -479,8 +479,10 @@ extern "C" { // n-dimensional tensor struct ggml_tensor { - enum ggml_type type; - enum ggml_backend backend; + enum ggml_type type; + enum ggml_backend_type backend; + + struct ggml_backend_buffer * buffer; int n_dims; int64_t ne[GGML_MAX_DIMS]; // number of elements @@ -514,7 +516,7 @@ extern "C" { void * extra; // extra things e.g. for ggml-cuda.cu - char padding[4]; + char padding[12]; }; static const size_t GGML_TENSOR_SIZE = sizeof(struct ggml_tensor); @@ -1358,7 +1360,7 @@ extern "C" { // alibi position embedding // in-place, returns view(a) - struct ggml_tensor * ggml_alibi( + GGML_API struct ggml_tensor * ggml_alibi( struct ggml_context * ctx, struct ggml_tensor * a, int n_past, @@ -1367,7 +1369,7 @@ extern "C" { // clamp // in-place, returns view(a) - struct ggml_tensor * ggml_clamp( + GGML_API struct ggml_tensor * ggml_clamp( struct ggml_context * ctx, struct ggml_tensor * a, float min, @@ -2102,7 +2104,7 @@ extern "C" { enum ggml_type vec_dot_type; } ggml_type_traits_t; - ggml_type_traits_t ggml_internal_get_type_traits(enum ggml_type type); + GGML_API ggml_type_traits_t ggml_internal_get_type_traits(enum ggml_type type); #ifdef __cplusplus } diff --git a/llama.cpp b/llama.cpp index a4312ab72..77f7fa7c1 100644 --- a/llama.cpp +++ b/llama.cpp @@ -1730,7 +1730,7 @@ struct llama_model_loader { } } - struct ggml_tensor * create_tensor_for(struct ggml_context * ctx, struct ggml_tensor * meta, ggml_backend backend) { + struct ggml_tensor * create_tensor_for(struct ggml_context * ctx, struct ggml_tensor * meta, ggml_backend_type backend) { if (backend != GGML_BACKEND_CPU) { ggml_set_no_alloc(ctx, true); } @@ -1748,7 +1748,7 @@ struct llama_model_loader { return tensor; } - struct ggml_tensor * create_tensor(struct ggml_context * ctx, const std::string & name, const std::vector & ne, ggml_backend backend) { + struct ggml_tensor * create_tensor(struct ggml_context * ctx, const std::string & name, const std::vector & ne, ggml_backend_type backend) { struct ggml_tensor * cur = ggml_get_tensor(ctx_meta, name.c_str()); if (cur == NULL) { @@ -2299,8 +2299,8 @@ static void llm_load_tensors( // output { - ggml_backend backend_norm; - ggml_backend backend_output; + ggml_backend_type backend_norm; + ggml_backend_type backend_output; if (n_gpu_layers > int(n_layer)) { // norm is not performance relevant on its own but keeping it in VRAM reduces data copying @@ -2335,8 +2335,8 @@ static void llm_load_tensors( model.layers.resize(n_layer); for (uint32_t i = 0; i < n_layer; ++i) { - const ggml_backend backend = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; // NOLINT - const ggml_backend backend_split = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD_SPLIT; // NOLINT + const ggml_backend_type backend = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; // NOLINT + const ggml_backend_type backend_split = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD_SPLIT; // NOLINT auto & layer = model.layers[i]; @@ -2365,8 +2365,8 @@ static void llm_load_tensors( { model.tok_embeddings = ml.create_tensor(ctx, tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, GGML_BACKEND_CPU); { - ggml_backend backend_norm; - ggml_backend backend_output; + ggml_backend_type backend_norm; + ggml_backend_type backend_output; if (n_gpu_layers > int(n_layer)) { // norm is not performance relevant on its own but keeping it in VRAM reduces data copying @@ -2401,8 +2401,8 @@ static void llm_load_tensors( model.layers.resize(n_layer); for (uint32_t i = 0; i < n_layer; ++i) { - const ggml_backend backend = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; // NOLINT - const ggml_backend backend_split = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD_SPLIT; // NOLINT + const ggml_backend_type backend = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; // NOLINT + const ggml_backend_type backend_split = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD_SPLIT; // NOLINT auto & layer = model.layers[i]; @@ -2435,8 +2435,8 @@ static void llm_load_tensors( // output { - ggml_backend backend_norm; - ggml_backend backend_output; + ggml_backend_type backend_norm; + ggml_backend_type backend_output; if (n_gpu_layers > int(n_layer)) { // norm is not performance relevant on its own but keeping it in VRAM reduces data copying @@ -2473,8 +2473,8 @@ static void llm_load_tensors( model.layers.resize(n_layer); for (uint32_t i = 0; i < n_layer; ++i) { - const ggml_backend backend = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; // NOLINT - const ggml_backend backend_split = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD_SPLIT; // NOLINT + const ggml_backend_type backend = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; // NOLINT + const ggml_backend_type backend_split = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD_SPLIT; // NOLINT auto & layer = model.layers[i]; @@ -2512,8 +2512,8 @@ static void llm_load_tensors( // output { - ggml_backend backend_norm; - ggml_backend backend_output; + ggml_backend_type backend_norm; + ggml_backend_type backend_output; if (n_gpu_layers > int(n_layer)) { // norm is not performance relevant on its own but keeping it in VRAM reduces data copying @@ -2550,8 +2550,8 @@ static void llm_load_tensors( model.layers.resize(n_layer); for (uint32_t i = 0; i < n_layer; ++i) { - const ggml_backend backend = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; // NOLINT - const ggml_backend backend_split = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD_SPLIT; // NOLINT + const ggml_backend_type backend = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; // NOLINT + const ggml_backend_type backend_split = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD_SPLIT; // NOLINT auto & layer = model.layers[i]; @@ -2589,8 +2589,8 @@ static void llm_load_tensors( model.tok_embeddings = ml.create_tensor(ctx, tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, GGML_BACKEND_CPU); { - ggml_backend backend_norm; - ggml_backend backend_output; + ggml_backend_type backend_norm; + ggml_backend_type backend_output; if (n_gpu_layers > int(n_layer)) { // norm is not performance relevant on its own but keeping it in VRAM reduces data copying @@ -2624,8 +2624,8 @@ static void llm_load_tensors( const int i_gpu_start = n_layer - n_gpu_layers; model.layers.resize(n_layer); for (uint32_t i = 0; i < n_layer; ++i) { - const ggml_backend backend = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; - const ggml_backend backend_split = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD_SPLIT; + const ggml_backend_type backend = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD; + const ggml_backend_type backend_split = int(i) < i_gpu_start ? GGML_BACKEND_CPU : LLAMA_BACKEND_OFFLOAD_SPLIT; auto & layer = model.layers[i]; layer.attn_norm = ml.create_tensor(ctx, tn(LLM_TENSOR_ATTN_NORM, "weight", i), {n_embd}, backend); layer.attn_norm_b = ml.create_tensor(ctx, tn(LLM_TENSOR_ATTN_NORM, "bias", i), {n_embd}, backend); diff --git a/scripts/sync-ggml.sh b/scripts/sync-ggml.sh index e44c3bd03..4311268bd 100755 --- a/scripts/sync-ggml.sh +++ b/scripts/sync-ggml.sh @@ -1,16 +1,18 @@ #!/bin/bash -cp -rpv ../ggml/src/ggml.c ./ggml.c -cp -rpv ../ggml/src/ggml-alloc.c ./ggml-alloc.c -cp -rpv ../ggml/src/ggml-cuda.h ./ggml-cuda.h -cp -rpv ../ggml/src/ggml-cuda.cu ./ggml-cuda.cu -cp -rpv ../ggml/src/ggml-opencl.h ./ggml-opencl.h -cp -rpv ../ggml/src/ggml-opencl.cpp ./ggml-opencl.cpp -cp -rpv ../ggml/src/ggml-metal.h ./ggml-metal.h -cp -rpv ../ggml/src/ggml-metal.m ./ggml-metal.m -cp -rpv ../ggml/src/ggml-metal.metal ./ggml-metal.metal -cp -rpv ../ggml/include/ggml/ggml.h ./ggml.h -cp -rpv ../ggml/include/ggml/ggml-alloc.h ./ggml-alloc.h +cp -rpv ../ggml/src/ggml.c ./ggml.c +cp -rpv ../ggml/src/ggml-alloc.c ./ggml-alloc.c +cp -rpv ../ggml/src/ggml-backend.c ./ggml-backend.c +cp -rpv ../ggml/src/ggml-cuda.h ./ggml-cuda.h +cp -rpv ../ggml/src/ggml-cuda.cu ./ggml-cuda.cu +cp -rpv ../ggml/src/ggml-opencl.h ./ggml-opencl.h +cp -rpv ../ggml/src/ggml-opencl.cpp ./ggml-opencl.cpp +cp -rpv ../ggml/src/ggml-metal.h ./ggml-metal.h +cp -rpv ../ggml/src/ggml-metal.m ./ggml-metal.m +cp -rpv ../ggml/src/ggml-metal.metal ./ggml-metal.metal +cp -rpv ../ggml/include/ggml/ggml.h ./ggml.h +cp -rpv ../ggml/include/ggml/ggml-alloc.h ./ggml-alloc.h +cp -rpv ../ggml/include/ggml/ggml-backend.h ./ggml-backend.h cp -rpv ../ggml/tests/test-opt.cpp ./tests/test-opt.cpp cp -rpv ../ggml/tests/test-grad0.cpp ./tests/test-grad0.cpp From dcc09d25961c5d0626bc148e558ee841141748f7 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Mon, 9 Oct 2023 14:28:27 +0300 Subject: [PATCH 72/73] metal : do not use mul_mm kernels when ne00 < 64 (#3542) --- ggml-metal.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ggml-metal.m b/ggml-metal.m index 29cb3c922..7d67db90f 100644 --- a/ggml-metal.m +++ b/ggml-metal.m @@ -1040,7 +1040,7 @@ void ggml_metal_graph_compute( !ggml_is_transposed(src0) && !ggml_is_transposed(src1) && src1t == GGML_TYPE_F32 && - ne00 % 32 == 0 && + ne00 % 32 == 0 && ne00 >= 64 && ne11 > ne11_mm_min) { //printf("matrix: ne00 = %6d, ne01 = %6d, ne02 = %6d, ne11 = %6d, ne12 = %6d\n", ne00, ne01, ne02, ne11, ne12); switch (src0->type) { From fcca0a700487999d52a525c96d6661e9f6a8703a Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Mon, 9 Oct 2023 14:32:17 +0300 Subject: [PATCH 73/73] refact : fix convert script + zero out KV cache to avoid nans (#3523) * refact : fix convert script + zero out KV cache to avoid nans * ggml : silu(-inf) should never happen * metal : assert various kernel requirements --- convert-refact-hf-to-gguf.py | 71 ++++------------------------------ examples/parallel/parallel.cpp | 2 +- ggml-metal.m | 20 ++++++---- ggml-metal.metal | 18 ++++++--- ggml.c | 27 +++++++------ llama.cpp | 4 ++ 6 files changed, 51 insertions(+), 91 deletions(-) diff --git a/convert-refact-hf-to-gguf.py b/convert-refact-hf-to-gguf.py index e0cd417db..bfeabc082 100755 --- a/convert-refact-hf-to-gguf.py +++ b/convert-refact-hf-to-gguf.py @@ -17,33 +17,6 @@ if "NO_LOCAL_GGUF" not in os.environ: sys.path.insert(1, str(Path(__file__).parent / "gguf-py" / "gguf")) import gguf - -def bytes_to_unicode(): - # ref: https://github.com/openai/gpt-2/blob/master/src/encoder.py - """ - Returns list of utf-8 byte and a corresponding list of unicode strings. - The reversible bpe codes work on unicode strings. - This means you need a large # of unicode characters in your vocab if you want to avoid UNKs. - When you're at something like a 10B token dataset you end up needing around 5K for decent coverage. - This is a significant percentage of your normal, say, 32K bpe vocab. - To avoid that, we want lookup tables between utf-8 bytes and unicode strings. - And avoids mapping to whitespace/control characters the bpe code barfs on. - """ - bs = ( - list(range(ord("!"), ord("~") + 1)) - + list(range(ord("¡"), ord("¬") + 1)) - + list(range(ord("®"), ord("ÿ") + 1)) - ) - cs = bs[:] - n = 0 - for b in range(2**8): - if b not in bs: - bs.append(b) - cs.append(2**8 + n) - n += 1 - return dict(zip(bs, (chr(n) for n in cs))) - - def count_model_parts(dir_model: Path) -> int: num_parts = 0 for filename in os.listdir(dir_model): @@ -153,53 +126,25 @@ tokens: list[bytearray] = [] scores: list[float] = [] toktypes: list[int] = [] -tokenizer_json_file = dir_model / "tokenizer.json" -if not tokenizer_json_file.is_file(): - print(f"Error: Missing {tokenizer_json_file}", file=sys.stderr) - sys.exit(1) - # gpt2 tokenizer gguf_writer.add_tokenizer_model("gpt2") -with open(tokenizer_json_file, "r", encoding="utf-8") as f: - tokenizer_json = json.load(f) - print("gguf: get gpt2 tokenizer vocab") +# ref: https://github.com/cmp-nct/ggllm.cpp/blob/master/falcon_convert.py +tokenizer = AutoTokenizer.from_pretrained(dir_model) + # The number of tokens in tokenizer.json can differ from the expected vocab size. # This causes downstream issues with mismatched tensor sizes when running the inference -vocab_size = ( - hparams["vocab_size"] - if "vocab_size" in hparams - else len(tokenizer_json["model"]["vocab"]) -) - -tokenizer = AutoTokenizer.from_pretrained(dir_model, trust_remote_code=True) +vocab_size = hparams.get("vocab_size", len(tokenizer.vocab)) +assert max(tokenizer.vocab.values()) < vocab_size reverse_vocab = {id: encoded_tok for encoded_tok, id in tokenizer.vocab.items()} -byte_encoder = bytes_to_unicode() -byte_decoder = {v: k for k, v in byte_encoder.items()} for i in range(vocab_size): - if i in reverse_vocab: - text = reverse_vocab[i] - try: - text = bytearray([byte_decoder[c] for c in reverse_vocab[i]]) - except KeyError: - text = bytearray() - for c in reverse_vocab[i]: - if ord(c) < 256: # single byte character - text.append(byte_decoder[ord(c)]) - else: # multibyte special token character - text.extend(c.encode("utf-8")) - else: - print(f"Key {i} not in tokenizer vocabulary. Padding with an arbitrary token.") - pad_token = f"[PAD{i}]".encode("utf8") - text = bytearray(pad_token) - - tokens.append(text) - scores.append(0.0) # dymmy - toktypes.append(gguf.TokenType.NORMAL) # dummy + tokens.append(reverse_vocab[i] if i in reverse_vocab else f"[PAD{i}]") + scores.append(0.0) # dummy + toktypes.append(gguf.TokenType.NORMAL) gguf_writer.add_token_list(tokens) gguf_writer.add_token_scores(scores) diff --git a/examples/parallel/parallel.cpp b/examples/parallel/parallel.cpp index 721888da7..04f1e45b9 100644 --- a/examples/parallel/parallel.cpp +++ b/examples/parallel/parallel.cpp @@ -167,7 +167,7 @@ int main(int argc, char ** argv) { // the max batch size is as large as the context to handle cases where we get very long input prompt from multiple // users. regardless of the size, the main loop will chunk the batch into a maximum of params.n_batch tokens at a time - llama_batch batch = llama_batch_init(params.n_ctx, 0); + llama_batch batch = llama_batch_init(n_ctx, 0); int32_t n_total_prompt = 0; int32_t n_total_gen = 0; diff --git a/ggml-metal.m b/ggml-metal.m index 7d67db90f..5a23144d0 100644 --- a/ggml-metal.m +++ b/ggml-metal.m @@ -779,8 +779,8 @@ void ggml_metal_graph_compute( } break; case GGML_OP_CONCAT: { + const int64_t nb = ne00; - int64_t nb = ne00; [encoder setComputePipelineState:ctx->pipeline_concat]; [encoder setBuffer:id_src0 offset:offs_src0 atIndex:0]; [encoder setBuffer:id_src1 offset:offs_src1 atIndex:1]; @@ -812,6 +812,7 @@ void ggml_metal_graph_compute( [encoder setBytes:&nb length:sizeof(nb) atIndex:27]; const int nth = MIN(1024, ne0); + [encoder dispatchThreadgroups:MTLSizeMake(ne1, ne2, ne3) threadsPerThreadgroup:MTLSizeMake(nth, 1, 1)]; } break; case GGML_OP_ADD: @@ -909,9 +910,10 @@ void ggml_metal_graph_compute( [encoder setBuffer:id_dst offset:offs_dst atIndex:1]; [encoder setBytes:&scale length:sizeof(scale) atIndex:2]; - const int64_t n = ggml_nelements(dst)/4; + const int64_t n = ggml_nelements(dst); + GGML_ASSERT(n % 4 == 0); - [encoder dispatchThreadgroups:MTLSizeMake(n, 1, 1) threadsPerThreadgroup:MTLSizeMake(1, 1, 1)]; + [encoder dispatchThreadgroups:MTLSizeMake(n/4, 1, 1) threadsPerThreadgroup:MTLSizeMake(1, 1, 1)]; } break; case GGML_OP_UNARY: switch (ggml_get_unary_op(gf->nodes[i])) { @@ -921,9 +923,10 @@ void ggml_metal_graph_compute( [encoder setBuffer:id_src0 offset:offs_src0 atIndex:0]; [encoder setBuffer:id_dst offset:offs_dst atIndex:1]; - const int64_t n = ggml_nelements(dst)/4; + const int64_t n = ggml_nelements(dst); + GGML_ASSERT(n % 4 == 0); - [encoder dispatchThreadgroups:MTLSizeMake(n, 1, 1) threadsPerThreadgroup:MTLSizeMake(1, 1, 1)]; + [encoder dispatchThreadgroups:MTLSizeMake(n/4, 1, 1) threadsPerThreadgroup:MTLSizeMake(1, 1, 1)]; } break; case GGML_UNARY_OP_RELU: { @@ -941,9 +944,10 @@ void ggml_metal_graph_compute( [encoder setBuffer:id_src0 offset:offs_src0 atIndex:0]; [encoder setBuffer:id_dst offset:offs_dst atIndex:1]; - const int64_t n = ggml_nelements(dst)/4; + const int64_t n = ggml_nelements(dst); + GGML_ASSERT(n % 4 == 0); - [encoder dispatchThreadgroups:MTLSizeMake(n, 1, 1) threadsPerThreadgroup:MTLSizeMake(1, 1, 1)]; + [encoder dispatchThreadgroups:MTLSizeMake(n/4, 1, 1) threadsPerThreadgroup:MTLSizeMake(1, 1, 1)]; } break; default: { @@ -1251,6 +1255,8 @@ void ggml_metal_graph_compute( } break; case GGML_OP_RMS_NORM: { + GGML_ASSERT(ne00 % 4 == 0); + float eps; memcpy(&eps, dst->op_params, sizeof(float)); diff --git a/ggml-metal.metal b/ggml-metal.metal index b6288db28..99b9fd7a7 100644 --- a/ggml-metal.metal +++ b/ggml-metal.metal @@ -345,10 +345,11 @@ kernel void kernel_rms_norm( uint sgitg[[simdgroup_index_in_threadgroup]], uint tiisg[[thread_index_in_simdgroup]], uint ntg[[threads_per_threadgroup]]) { - device const float4 * x = (device const float4 *) ((device const char *) src0 + tgpig*nb01); - device const float * x_scalar = (device const float *) x; - float4 sumf=0; - float all_sum=0; + device const float4 * x = (device const float4 *) ((device const char *) src0 + tgpig*nb01); + device const float * x_scalar = (device const float *) x; + + float4 sumf = 0; + float all_sum = 0; // parallel sum for (int i00 = tpitg; i00 < ne00/4; i00 += ntg) { @@ -361,6 +362,7 @@ kernel void kernel_rms_norm( } threadgroup_barrier(mem_flags::mem_threadgroup); + // broadcast, simd group number is ntg / 32 for (uint i = ntg / 32 / 2; i > 0; i /= 2) { if (tpitg < i) { @@ -368,7 +370,9 @@ kernel void kernel_rms_norm( } } if (tpitg == 0) { - for (int i = 4 * (ne00 / 4); i < ne00; i++) {sum[0] += x_scalar[i];} + for (int i = 4 * (ne00 / 4); i < ne00; i++) { + sum[0] += x_scalar[i]; + } sum[0] /= ne00; } @@ -383,7 +387,9 @@ kernel void kernel_rms_norm( y[i00] = x[i00] * scale; } if (tpitg == 0) { - for (int i00 = 4 * (ne00 / 4); i00 < ne00; i00++) {y_scalar[i00] = x_scalar[i00] * scale;} + for (int i00 = 4 * (ne00 / 4); i00 < ne00; i00++) { + y_scalar[i00] = x_scalar[i00] * scale; + } } } diff --git a/ggml.c b/ggml.c index 6d1776ca4..5bb1da31b 100644 --- a/ggml.c +++ b/ggml.c @@ -11233,7 +11233,7 @@ static void ggml_compute_forward_silu_f32( #ifndef NDEBUG for (int k = 0; k < nc; k++) { - const float x = ((float *) ((char *) dst->data + i1*( dst->nb[1])))[k]; + const float x = ((float *) ((char *) dst->data + i1*(dst->nb[1])))[k]; UNUSED(x); assert(!isnan(x)); assert(!isinf(x)); @@ -13066,17 +13066,17 @@ static void ggml_compute_forward_alibi_f32( assert(n_past >= 0); - const int ne0 = src0->ne[0]; // all_seq_len = n_past + ne1 - const int ne1 = src0->ne[1]; // seq_len_without_past - const int ne2 = src0->ne[2]; // n_head -> this is k - //const int ne3 = src0->ne[3]; // 1 -> bsz + const int64_t ne0 = src0->ne[0]; // all_seq_len = n_past + ne1 + const int64_t ne1 = src0->ne[1]; // seq_len_without_past + const int64_t ne2 = src0->ne[2]; // n_head -> this is k + //const int64_t ne3 = src0->ne[3]; // 1 -> bsz - const int n = ggml_nrows(src0); - const int ne2_ne3 = n/ne1; // ne2*ne3 + const int64_t n = ggml_nrows(src0); + const int64_t ne2_ne3 = n/ne1; // ne2*ne3 - const int nb0 = src0->nb[0]; - const int nb1 = src0->nb[1]; - const int nb2 = src0->nb[2]; + const size_t nb0 = src0->nb[0]; + const size_t nb1 = src0->nb[1]; + const size_t nb2 = src0->nb[2]; //const int nb3 = src0->nb[3]; GGML_ASSERT(nb0 == sizeof(float)); @@ -13088,9 +13088,9 @@ static void ggml_compute_forward_alibi_f32( const float m0 = powf(2.0f, -(max_bias) / n_heads_log2_floor); const float m1 = powf(2.0f, -(max_bias / 2.0f) / n_heads_log2_floor); - for (int i = 0; i < ne0; i++) { - for (int j = 0; j < ne1; j++) { - for (int k = 0; k < ne2_ne3; k++) { + for (int64_t i = 0; i < ne0; i++) { + for (int64_t j = 0; j < ne1; j++) { + for (int64_t k = 0; k < ne2_ne3; k++) { float * const src = (float *)((char *) src0->data + i*nb0 + j*nb1 + k*nb2); float * pdst = (float *)((char *) dst->data + i*nb0 + j*nb1 + k*nb2); @@ -13105,7 +13105,6 @@ static void ggml_compute_forward_alibi_f32( } pdst[0] = i * m_k + src[0]; - } } } diff --git a/llama.cpp b/llama.cpp index 77f7fa7c1..24f07daca 100644 --- a/llama.cpp +++ b/llama.cpp @@ -1325,7 +1325,11 @@ static bool llama_kv_cache_init( cache.cells.clear(); cache.cells.resize(n_ctx); + // TODO: this should be: + // cache.buf.resize(2u*n_elements*ggml_type_size(wtype) + 2u*ggml_tensor_overhead()); + // change it and test that it works cache.buf.resize(2u*n_elements*ggml_type_size(wtype) + 2u*MB); + memset(cache.buf.data, 0, cache.buf.size); struct ggml_init_params params; params.mem_size = cache.buf.size;

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

EqcOL45x^fN+7er% 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%0AmT z`HeXVJ>{uWdBm(bDQ{eo$Z7PSjf90NpwQ_Z)kY4AFAuBdHq`Gf^J8a`?k7h$_srS- zVWlBVRUxusHS%2J2~%QKX(OT#e1InByk1wuPu^+!`k@q5pFnNX>CL$?BKZ{OB<+dt zRg+$D=i%^!`VlA+6}-zIy$jUP=p*uy^TR31Yv6M1t-8ak@0F^K@Yr@f_=TRyp;J+~ zi>vxYtj0R;ZXJu61&eXsIYw#2A<7&OUXqZy&YOQF-AV_`5=zUvr8X=TxKQlsSk~coRSc8l;!m zsf{0Tn!HJT`7U>kQ%*Hiim{Sc4gQs=8j;V{ym?g1_06by9ezzE63Yd*pQI}4CwPT{V_^=9t(%3Z zh0X&k_3%y&PvNVE-QOX7N!>filrU8PEM(G3wW7;3rGBJ^K*V+Gf5RrGfGevov*XmU( zTogESZo?$JEq>xu76(5Veo#_QAp!hy>_Wa!yo%d3`fQhB6haDOn_E!lTSPkcc!KB6 z59Pf4|HymO9yzZo&lB?zW-yor=G9}5jj~)WTh?OP?sj)m6eY2=kVR5bSC^`c$jr#h z5HmBfav?>zJg}r1V7h^Fm0!)<6c;5aQq;asq$nU5{9g0>pL@>|l)DPujhT5d6ihlJ zpSaIm&OPh@oP*$!u^WPmQ11?I2W}u3*?dy^hLL8e)zku$q^~!ZR5(ZTa9-gWti~WJ z0s$4+f^$Etyv8V!k>&?$&|6J|j9UL}I6F*H9v_jKu*=I7mRd+ty!VfCfc<_JwG==^ zMC=xXODP3JYY+wG=spXz2$J>5jsEL!;{Rb70_)DK7 zyGxf!31Z9T>#l%WNJ7@yxvx>xe_l<@2VE<@2D z1GoTA2+Ha7)=FQAexi1V8qE+yiZ=hsUC=12t`--i0>ZU56;)@0>cp>5CloUj@O)&@~hxhJAc^ z4JOKm0#9XaKgt=9zbRleCX3M-(u8>2|Jq{`BW<9dPzJ2x?>qDm&{2L7XWn!ddCl-& znbi{q@h(9(TwBypfPAkIs%Vg^toz$!t!k0sYct$?8zHIO?s6;3l**5#qjXjmrhaLt zsFx8f=W4rqFRWCe!CR$AB|g%USkFv{Y7aLbyG=Z{QIf<0e-tT<4-<7V&yB&s)~uOm zOcHz6fg+{4d<KNG?^zbVb zgZNO9DbRiU)*3ser+6`FQ9?QpjEPRaj>Mqz7`l(i&~(mw!Tti}L+y)m>7KX->~7b! z#j`m4f}WHY3apWAwgQHm?(fl%y)?71FR@Ci25cNA?|~2=6hXNVuhwSJaj5&v%!{vG z!W~1{dyMRdIAH;;)C_I%~(p_{5|BF!Qq75vq2a&C6T06md~OJ-F^F zzW(X#dXf>&+fkZvSjGzbTb25JMzwWT5_^Da31b1~Px!m2EQhchxfW2#(o@ozl)J_ji`gF(? zmtvUjJON;^Joe0>EvPh zhbv{Jq%?xtMlUItgrlS}aoJ;423XNZG);Ae$zg3RN5?5u<1+V#(25(CH^)w5^jfp1h+NF8lE0bX> zTj>xW!wZhJ)d}Qj23}E)NrG5Y$w}Y4S8!YIm0DW3pgCQf-$i{T9WC6WdKT@ zRNW6%hGtZHS0HJ!5u4EknD7CrT*2SYWhm&rfh&@g`Sr!QIx1hp64R~vc8O|Jr$okN z!{p9cUnxUg`BDW=Th4g3P6@fdKUtTa!u8jNs@?#U2L2>Iyh;!W--uMIum8Gh?el~GzW;`Q z?(2Ssu!c*c0M!Oi=DGYfF*p4rzm2dNxiY|qWAJx)gyQ7T`VFx17@)D3d@7_k}SWzr%R5^^;xO65z4T_U)cJY^}GPQmIeh#0Rb3wP)?j0PW#;C zA%DY37AGB1UEeQE$C3hZV&j5}+AU{H#7qaV7-=o$!FWJIOWg;^V4iV*#d#1|r30oM z5lAm-5O2BKu{i|0Ai#w*&+|5Ph>)uZZ~;NA^R`+L`QY=@eYtK&Tcfx(%3@rAl38Yf zQWie;H@`akZ*d|PN3dfmmPM$!xO7slT^WP_X#ge8CSIsS+u5bm2&j*55x9jMWm9n3 zBe^C0-JA)U5}X+SRyujKo7ldRT9@+jD`o*xv7%=M_81Q=@R1h9l9l~=Zq+V#sFlc# zJJjUA86DzS80~(1%IV!GWwEGvY3j>{uX=wM+8=MmP*=z-`;|N zbo)->x&q`bl25b9={V3`EAAW{l^f{2SNIVfV%(C5jh+G~BiMZtlwcA~(2CAJ+ht8Z&{q z`wAsrf`_hCuFBU3+A1Q^B0;&xq^5)_10HSw661TI{QTTx4n^K*^VH-b@HOBvMMazi z-V(n8mRQvz5%{PsN*(wx=Z*t%BeUsrpFZSPy|3V+c|whj)1xkPQQ}y=0-Yva9Uk(z z66e|q*r?QLu;zId;MCAj3J*d!8QK6gTh?NoT~zJ9;LHdwVcy984Q<UVy| zmj{cqj;;z?#f`*=p<*fDcT~4Is^Loub*rE`CWA9WD#iT$GN2_Z>%)?_zl}(lVsZ{6 zU+nyVeBY24#w(o+#kO$`ph1L(T5qq_$=D5rz4exmU)-wJKnoQ)qlhYZD@8$Gu4KJi z)GIC?Gx;vwh8`PG2s%4V8)LLaTNG8#qWWf9_;OHl_oVnnR|{1eOkNde zm#c*64c~w#b-5R|4Mrw!S6L96F^mMv=sbHE8hJ9*ov^KQSvzAy{bov~(ek=*vPC^m z>0_D&)s4qds(r+Mw15M&iy7z4iISc{x$f+>_8W#c$TvTY+E!r5#=XS?$XSVZ@!|d7 zu|yIAq0hg+?Dso6BnfbNnh60cl{_}}Eh!!l{nU=Wz==>022d>)3L+JprQ0&>*MNH@rWD5G@f>!ek za&B#7oV&b>{E%Io^uz~s*G*q$SyBpOZ9FoT2{dZlsxvN6_L)mpCS zw<*X2mR!!cc#zAf&^(cnbb=jG`NMdEV1kqyS#!xJyYe6TDK%BQ(h5jbYD<;0EElO05xB5$^tNb#F_mIE?7qVWa&3iPhe zO5m_i+F0LOUQm`Y#~m+-k!XNsV1A@X$pKeS*$JxxZ|PS44Bz;8m|ympLg_#CUkPqC zDqmNIXItm|eSbzgo~}lzhN*t!cq3027S*EY;OG4%j}E_hIQV9l_$XX+aXb`Z-$NJx z_aJ6(1@Xj!Xh!(px6Sb9S6^2k{x*8ua#Bk7rc3|I4|CGWK`2CO~p(GyL%q!z(PKz*gw88OL2@n z6eP)9@))vCG=OF($`_A_B-*QsDr7sWU8KQySuE`U6c=o0R0YM&5$gjRC~g`9OE*Qy zRXE_CoOmSX`?utP-&@Z;-nHiJTWhJQXO3u5xug<(AYs?U73y4mL4D)YmUe%m#QGG3 z7g&YmevxlG+BCCp91|VD5>NN)Bb2Yn6~T(6=Ac$(Jx2xB(Ea506GtNV#8)OwxfbKz zp|AsFP(ojpY$n3FoQQU9x~NGQ#*DI=rplA*LLT!GV-P?Cr|aiVv;2hr=9`?uso})w z!VDlLCQF@`#wSYc4$jq_7s&d&*W)c0TW7OF$MlU0L$UG4bm^RyvbBOz6FIhjVy;kw z=Bld_v3H2|qTKnS?aMjiqr-`p<9mkyoK1%X>>6u?W>FvfM<87)p_YQ+=zkzy5#2g*-oqBOxQeuuYgpsuPE)mt2DK@hA^|dDNN!yJ{ER zz?a@@2l^8RWgc}A64a>%lehQ{GNCE^}DFZI%pK>=zb2xAk(=bPLb zW$0Ds#xtl*G%(3?=K*3k)7?o*T0dswW6c8VL2cM}yi>K5wQEQr@i@}hkkGs*iv6UWMfK9>0d4@zj+ z{NOb@FOnp&0It8r%`vzy{5Ry$Kg|F0Fz2rp-|#DgQ*$pcjMN0Hw^@u~SMK_e45=8gC$qZM;oE`uMQ-+?Ae^ zB}U{$kTahA!7u$)=rw>9;||Ct*b-nZa!UEWn6#oNy~wH7Bku@gQp(I}{mLYOXQpy& z`E;CuGMu<1pbz{=RV8Pdo#NyaH_H=9gj*lz}Az z&`rw^wF=Fj@UhQ?7^Lg~zcNCf3zO$RbNeWoGcL~D(Z)U+#jwBWWFav+iFYX6LDU?eumf1>yUc9VTxfpJ#t#yVM8>IvoUjJ4eeHbE)YN4ja?_87YBT=8_ye=I5~jv}UiV(03^I*TjVQKDgbSsXV20 za<1Y1Ui^cYOi;D?2cT9fxS@fleI!So6a;_EM-U3&rO1P==vqA(8k{i|E^Y(Wk%3bqEEHgwCMFytM4xjfEALYZY#id#Y>-8?3Y%$4B&@Gmf{W3bNkRp@*fZf7 z)#`<`sds$Obkkml1w-s+Kyi_JIsE*UEFaFtn(!D{(_c=$I?8P=I*EX7;wy1F_x?{3 zOeQIJzBl~ct1&i=4`T1x=?e>6B2s&PoUMB))A+`yNWX1#Rb1`WN%-pUXTD<0>ZwwC z%qf`P+MyVUp=G(0{wQJ=MMs-+a~?T?(mpB5kr$ARRsc!(rAq?b?mms+YfC+1Emrq6 zBG$@ho-F$)vZ?^~Ewc0OQn7zxN~Xhb(kO??bfgzTleSB7u_=s54ym$uxF{C1XzPig zbY09uCC}=?4~_K8hjfC~AecMxVUM}!oG$q~;4iO_P=B|OZho#5&8vaij+}yL7Sr3Z zCw0@`n_Z3<^t)rl1|v=?|E2oJnmS?&CYU7n1KrBz7xRjprX=~+cp*A#nhu!>=@XNu z)|?phcJT|w*!U;I8fMSl2WaKLm2w1-FXzY}LLtg~FF9w;+|h>%ReJVI0oo>3jDLv0 z#IS8O`6Bb3#EYabo1RMd_xP~8%&k>~e>gwbyf9rR`%(}>mnP3VJ)DZ0W$%#+Zs0O# zI|(Va9IvPkXl@1kG_n?o?uYTZwlg~CZ}{26!{hM=mSq7v%X2nS9=|dJp|M*PmM5r~ zXNKIEki!x$=9FiaatIbWc@r(rgT}2K1xLj8iF#n+5Gl5%8;AdH_@#3sGUZ@~Lr7bp zic%Xtqy;tp21DG9Hl?spLV#^k+^YN~-l^mHMr0Sq^6dg>K{yLy^Q}QVfg|&%OFhjL@y^K5 z5(ti4NZB_^vbZ!7dl_)SehGY=lr+v?LE>~Q!3B{ZJ&|F$3j0D22C5w zTobxYoCyTH(5#C(p$N`crjFMT)l`y>59MivC0c+iKSUUrp-HDIU)r{u3h{&(q6C%T zEIzN(*xa#w%1yZf%fQ&`qR!6~Rf8tsxm*qPS(|`%69bCXprho0FJHhbvp0P`srNbb zZ6A-KX)9~vF!kjSC2ylNV&1?JH>!yB(|h||$0*BiWvK2|4hHmlQN-tb3s6c@7b8SfCBTJW*JrcgFsaG4lJ>MK{-&?Na`%f_|f}PB6#`Dr*OWEJ*cvP-(8>Fr-Xh@<-sPalVa!fC|Yw; za9ifroJstsx#(}ls+=t+YDZV&{@ZaXJ?F)YW?OIuhNMVw3>qS3PS={umjM|On)L0R zAN-oKcRmxZmYb`?dBkXo$8-(bKu}69R;ZI$1Kb_uxnl|DJc%MJm6l9H?Jcq17+Ji- zeC*t&yduY7t)RVQ04c6C)t0Zv*h5_tqnbccxOy>mtKhY4B)Ns+g>tO;Qe0>Jo8fQr z%+#n9YQ_5(uQ!Ua7o+2v*DQY3s$E)og18buM8Ee!kM1w8yXc!AJUl#-v*1Z17qq|_ z3x6$QT8MTlC_`3!im&gAIBwUHVYC&INGU_&64z=e*i=Ydb*)Bgg_{|7)$PKu7_VN8 zJdlu|wg5ScP1U9eu5Z}tkQ~{JPEi`Y#+-n-@?d~>Ms@s_1ryQ!+$OZ*QZ-!KfX)*t z$%;nOI#j0LN@g$Gq-6I$B!O*Jg7*7g9`$%My((2{H4$_M@d0zOO=Q zPMNT~Z-!aA0pCUSVK4=4Wyj(nbV_-e@A`YD6`Is<1K+UpP~uhovCy2r_nSDYRh=5w1(!rtQ%{zrCS4tGAU*i z3b(pPe$Ss9o{g#Lg5#0Kc|0$~Ggi$=cCF@1Y49E+VAg0)peDHl~ z44KZYtrH4dM_bBAZj6CQr8g2squq{VcXlKqA#9?!c#_2Ob(+41jJyA)zj*w&LqTBD zDB>)HRl`@dbD~q?95G&#(sJxM*3t=+nh)!hyI}QG9HJL*5(`Nh#FI<0D(W@(r9tmw zkAQwB|2#^tj!E|a$;Kn+mou3cku`_tx5yXYmUpx!)gC-#5*~L%JD$1jnUthnzuEI8^3(sLrNi=u?wHhDKciRGH2*z`pGitKA&8_Y3J!kC`UAo#1#ozK1= z=8<4E#nI~{5SD!+n8CXg01*@cpOW^7PIdf!JF7NK0p8lhNK!ho%GI4z#i0BC1Z0S1 zA)Ev&5wrQ!cZNLwWKK=V*bz>7IjG~Y;gN^)kjDFh^cIls7Afy4Z-i*=O;q ze!DSCsqACfg)sqRBsve7gX*{VPPe<>xR|6HI3Noe=T{R$YyqDSK7}dmC1bsMcdNE50ff#_ z61R5YtPM?`e1Yn)YomZl?{DJeEJJf+@)T_!w5)3t{L%u71qV^q*!cyJvRvaPq5>=y zS2ia>ejn*%@kQAl0(&4HzH$=9<+?NVn*vZX6cHs=0p!>TCW~vF;>uv4Vmt+3aU{u3 z4UHJAb}F4%W5S1MW5d^>T7#2mg?Cx?a+Q=lWDjm;k|cfm&cwT{CX|LEWiEM*&<^_o zP59o5nGS`oSlKnLSnxShOZ~}{$OqhmPDj*GBuB+}MV8p3`I_Cy9zj#c$A3?nNZ|)! z;Btzf{d}Hm<5^xn9h?&XJ4?3$ER4MG7z@Mt<|v4=sBa=l+BtBI2!{CiJo1a-@jP*m z*0?0aTmAP>p$wE+%PY(2<^@u4&it)+=AZjgju7?Cwlw`(F9N0dhw>NqbnzrH5D9D9 zMFY&+eL?7ZT6JqX7#;y%(*DL?!d{tW-Z?|<=W|Q3UsGp zrop-Ifo>|?Q4-}7zKs&0(-W@Blt0&wemwjer=KMhw{qiEgh5K*<=GX#Y5Hj>Qbo23 zJ`DawK1eN(vT0|OsOw)-|D0(_y*4SNz5HO7{x3Tasi$+wLR{mmH#vFW_;Kc4*!?lJ zUtLX@tK49TuhJ#%J&Z&Gk!zcmRxP+|J#G_6y!DP0OKIRq8PYk~#u*A`qsUUwb!WT^ z>n))UW~#@;t3J#7wKc}Au#=Zs>6uH5W&fz0M3(^+F5fxMiePnGRAPeWRr@*>BygZl z#PgTHGt90f>r#rMYRv~7U&G^qz9d&h1ZrTP7xD?S;Sgfnpg^VQ`T-%2D{mcF_z;Cl zd#j3x1_sU5ZIHzYPfu6W{2vC#(asNIzSaTjYu_ZwA|ihCJ5E|MBom+^IA7v6sf0)} z-D5d5h~P4_r+kN&8SRDQ0Vy?N5FNu#sdN1>izGk+TW}2cj#*7x@;FT`@Ok4$IXj$< zyh*dnFO+0d$qy*VUZMAO1KGLzdO?kn46suQB_AhLIWA=%j}qcth!b)Dn}!il0c%Zx zCTcy0eJd478PRAZh0Kxy9p@)2d+TwfuAoLh>IBvWu#l6(SIw5ZFRfFTq1b$!^rsxk zMR|AZd0!D|y>of7j;IlA@yv7|mtJ?xzwyZM(*m(1*dd>B2ccpkCTo0Vc=}}0)uus4 z(GzlEClnfIWxEmkM;MQyXq8i9#t(IwfjY4a4C3a8Rk$Z=C;@eN*x#=>{C?ngVASg} z+g0M;X@Tuic4qu|h@v$A(E00;;kf^XvPDG2Ga@Q&%b42Vv7#Bx z_2#EW@O>@0%PKJBo#|5C6~-_)oH+ZZ`IxnC#9NmHvZ2J|>2^*;MMhz-tqPX1f@1Ab z*P%A~C}UIqWcV`|S~P=6_cV$v0OehvSUUv)$SMu-E=;Ts%ZIe69IZ0&N@RO!8$al0lqAgz7u_z2TuB<+voP2!M>0p01BG z(&)!vJc7?~D-j2&1{n!Uj>@~ecz*@><3rhfA4WQZib<~sl{#4{jo)tqm4s)P<4Ag) zXN9`d{^;`TdZ<_ircuOBV&9@6{QWV-x6GRNRcq_)==!u!2x_GvY&DsBJK_EBV>#=p440 zjNF*CF8K#A-f!fXSUhM2z8S;xe82H#om34HZ*Y^-J^M0WMp+}t1sH1HS5j^f#7h@^ zo()zz5kJ@(J0CeeY{c|BD{6{>jy z(9s#9Y2rj9wIB=6Fd8~Z0LM^b(v9|a!>@nin?dHx@bXi>7RLD64jE1AO59)>3O6{; zuNu9;#CRi8$j^2xFPLvo=KZxFKe7=ukejl61=LG4-{bosarAYN#6% zBUUNk0U7GEZ+_xgbv^TFe(+!V4;wB2ivzK(L<|Vr*xs2uK*2 z+4eFe+?usTPYqF(KMYLwb;%3h>Z#U_jJ7;|BUNU=7e3O;<^khSa$~1hi!IE68#uUJQ zJAuDE9P@)BoLCx4D&oZpbtj`H>9Q6HWY@nTlP8;GUq$heIb&r%nzSHWd3G_cq3S%1 z*OY;qG^OtJwXX>w$(7-6_lcj@*rr`NNDX>UqQRv{tFuxcy(qrTH50pxi zgxJ!5Qk4D=fJ*)_k3@d-(53ip2nQ)r7F_nDIWjC2ZT4y0W8-k&q9mqsTXR!@4IJg| z?{sqi^#gx~2Y&u_ZjRN(4f1{T(cx#lPVPI}deKQ_2kO|l&#}S|vlf6afiztmwwZCf z)IV@~LT;i|#J80vZea!*sN}7|ODHEzKII*92|mZpHF;*iTk(h6#keyoL^jLi**m_S z%XC!Ah0(Hn60J8>cX=bK2Cfo08E+ACT6~kplpq4D$Kw;f>U;l3WFRQoeb8%@U6oai zmFRjHj+$P-F-X7LjO8eyoT!RX?x)hef+rqSf2r`=(1)6b*&hK#%m>>LTc-3cbrFx5YXCc+Nyygec zoylZ#L#%3l{%Q7QY?%yf92wFjOTlU-3@W-6k7)-`IrL9vhU!adic2y2_N#6_=JXX3 z+s(2<){TpIna4&)-M}#sx#j9NZx`OXqV6<4CZA{M#cbit20Obx|Imr>c|71TW4V&> z%Nr&yK71E=wbfv|HM{M1W`01hC3t~4G?D-{37#yKKv`)$w}b!=ynrB%OIb2Qtx9l4 zpYUU2(#AW@Kc^jj5b%bB#Aq`p)uX6iNxd-FVf;$eONd3~-SsWf`20TaO^4Haa!C6w zoH#W+=j{D2hw&&Zs=Xn1M>3{)qULv!mY+kh$BI0=U}<1-_b9J1BPK!KYD}yo$UV3m zA*0l{(?EKrR>ZfuA7AqJGj;}@JSTxbrOhPmwBuH1$Z^mtLlYJ>tiUb2t%CeVhdiQz8wMr`jc!N zh!GZtS(-iqC0R=dP#WlyU@(?>-INm!8MU-$viZ(h>#9W5bz@N>fJBlia$_Wd5tHOQ zDTso`t2qFjg9%h0|JXo-h5$m7rdV34?GO@ywUnlHqh-n*OEw7T6x-e}hhnpzvxX1K z*>#H3wJ36JduKAd5jNUyhhG+xM1BcVK1Fv*Y%%*l^jV;-il>`$i` z@c;R6`oxRACs65f?c)0(NPcUI+4Qd7Kh2;1&Uc3Id?yCiT%dY625!WM=6unINbUHL zxPeRzmOP8SO+E&-@4@zWqLg*%7{aLKe?a19`b;0{?&MGNer%RFYrC8%N zwt>s5C&Rb^1b1Fl&z!R62WMdA&X-g|fkt}%OIr5Qx5*cE4=m!fn9{;6Hcr>BW4yiJ zu0>t>%8WM3n$mmo>*=wg4~%*1A=m0@kgvPDOu#CXT()i!%j5D+oR*B2C~Ajlo2U}FMSa!SSJ5%rpg9=)ppLyRKeGRX^!&1x#HP<)ff-Ob zeN<^&ZHnZ$wzTU78vk<@x~lT4Bk69_jZ%;X zEz{T#PQI)y(tHcDP`IwfFOuB53PN0uE2_&0c@P)&@l8W5Xyh&ep#J-BrrxB@;)WH+ zy?8EWi>WNGSUfwNjHPw1El*Ctd!rgCk(-L6-==4@e=!jp@OdQW@~a^J!ph^;G#1yj zizemr$0ak(VXgL1Brjb1zK6R2$8r^((M_=uGr7t_+cH_->b%6(W@VG|(wn^9Bl zD6zdvIOR18wDLYHM8exzq znn`+LwZq^e>}cZ>S+IxW`)H$-*=Lii>U1fZIx7DA*@BVsWyfch z#@wvCAuMY;RQE8-)Q`di#~M<#Ou|ynTc!7ywQi%y*T6Ew(sd2ZMk0?dKD1NPek^Kx zs{ds{XAv+6jW{N0dkj)Ql5N+WB!rNH63g=sCW5u+T^w%>L5xBGKJLsf+} zH(<)ke?dBTquFT3mokx4DcVg;TjA8*&0t1^xQBaxKaYkmyfQ;LW~qvhsyI;@Ba(Uv zIfO~Gk_;sxF?PMxwgS zm9{B0jR??E?j2jk?a)Vu#~%0p|Hu==&*KfLcve>vb^>89g%v)IC&iPx-5LY}>M$(= z_Kx(&ZiefM7q1a;At+jhbjd{~EflFlkp)RkyfVBP`>Jz@e0_M3RneqtP|QYNLij9| zS!Pj_&~mAA^W?1KY@~o5#`n5Sxrl$aBkQa+g%llip-Cm@#<#D*BH_VoOr45^tkF#I zf5^IkyURYvZ7|zaAJTFl#_Xo4h57xWTIud(r_(=DhDZ)Sd<3F_L>#u8)d4l;?8(ar zNNh}X7JsWsWb9L7Y8@I$>PLxfanUmA`N7}rljMS|C7$hHw@t<8VA%iiq2&un)I=5p za=tVk>2-09=$sB`J2Y4 z8P+?4n#^%1gc@)%Rm6z7cjU0CO7S7}ZQAWd2*roJ?g9ioyPCv8z*}|$HIZ}AcjpStRUhF?u38{EtSm)mc z>zS{l@0C*>;RY)T7qXi=FHGqTBi1oFC9?l^U~?<=8hnX4cMn zmHdL<=4bizFkXtccG1t~%u69iE2g(IT1fpZWz5C)FyBl#rXU&9PX^hB>%6qU>6)8n zBMpi!gYjw^5E74qHTZ(nLnS#uZ=zvVyFc;b_RTRFYcR z$9Lfbs9)j{A3*>Bc7m$J@Ni6h@I7Tqt@!sF?N(StHGSoH{tbU`9;Qtd{zLI4M#Vm@=}MONS%L8)3J^ z>SL3Y5-9{KEJ2;iQQmz&6x-X66T-%p8z0opJcG+PLFIAdDxuK}d8`(_z}sVVYY)P2 z?#lSEOX;JZ;<}VZadKfSc15AFoxZ}3`%W_RFR36CgIoMk@4btll&|i?xO**h)qRK( z5xw4aET<=&gC{Mw2k=KL$VNesd{Tb3#$vDf)~-z{c>-oS-Y4;|?FYugUP2%5GIe6r zG1pGTIsyrP;#u*6?pG1YIO}()PQJYr1ybYABc*T|zmV_9GaT?zji56PWtrmpJWS7z zs+4m`Kq8rx1tAGe!`KyyJoNM6!lsi-$+?^0wM3^S|DI1?M|^?yPCZnOhOI(xELBbK zZbPMp!IyOTDqU4uV^voH!cC{E;?yKf5U9>@A`#THeU|<(gTpKt*-;zJXr~TXC3_pk|b*!Y+fCMM#;zWUN z%|#;sVu)MG1M+#wbs@HiQ`?wlF;b2QQH5z$Vrrey8U5z_)j3ic6E(9KwyDsVgHpU5`ZDQA`x~Gv*zH7ny!2R&p!`9olJgpC}*Jt`$|-rMt%Asw5Kx!ywsW z`Pajr#s1osni#M^6#n2C+o}ifD@;i-udo?&-MjS1-Hul=lw1O)6UT>2CN+ZPo^vKPKltwO-5}kA>T!Lm9AuM9Q z&EsbDV$t%*ME3&6FjEg=Y`}^;7dVZ#AHqDW3pJvcYHlC4iW}) z3`1FsONknC^8kUPe#GRY%t;p}xusq2o{OJ@ya)(tvYd`y!w&N-qm*dFeQSK7vuTilX-Q#oU#1jDWoS?3m=r#sZsb zi`Av$nl={bBi=h0X4i9v%t|yDF>6QjE!8~F(?DcBd);nQd#AMTW`e+Ggm4a3CF3Ef+90KY2JbqY*{ zF8s*PYa)?Kqi#EmJn{GtQMV^3_LOhF_XpVlm2*Ttl*{FIIX>F7EG&fR{d3HE<>X^?KCtpc#my5-m z)fX!eR!}05FsQP4mHN+Gl#$H5T!zN5#Qy1CQLRkS^ z^i!p-QeqP2S+N`Vc*2*nFa2Us`iXWVY6_TYUzd;;f{n#0?)8Os zDy+QtmFal8h$=y0sW`3xVLR53fzx8ktd4{NbCot)_!i5()n+Ns30O4QW0P&a zvJ)hl!0%2yDuCiUEFDzEsfw*i6~15O7E!rCHu2&Ki(TVZg}7!PBps6DfNO5FWfrr) z>`~aN6O}~yPy$fWqe~Wi7f;$-WEC#ki$PMnu)!l~^p)J=d+IidOqR5tOKAZ*{G zio@cM#cc_5?bzaJlc}t3O=GEH|v62?C-_`NwD8! zb!%7|uliKvsesm!o1P)!0B3QN^skB~auw4Rc5TfP3zcoa4ydhU$wx5{DOV;==*|&3 zr)d@3c}1vA1L{}HCnF;kSAU$TDCP$D&DgYDWFPsCD*!c$mPo+=hf}3N#5#D3T5eC$ zS%43sKDT0qN(MGR0=9I#G5iw|^p9UP?}<@X_g2<*iOdBq6h|d!&EKFF{Q! z?Olj-HRm7rw=tn$=3q8M?SKrwQP2ppc3vu5lNA7Ea6Gx)r)euI8%*Diz4Iz&Uoy_AT zx$&5ja=)_xkQKL)nAHWb5M>g|i;V0n`hVxopudtvUl51i@ogl~|Mw)V#y<4LT7En1 zfb8>pQpRF&+~Xu$fVAILG*Ie$+rUF-XutgK@X&8!Iry@gUW~EmLla{Aawynr4x_Os z(gougl&qnYJF|(}aoCR0yg6PWoRdKeaM$=Gwh0b|zf<8Hs)G3@skuFrKHba@fW8l_ zlj;xpSpE(5Rmw^YzE^U&GZO;!dBOzScWAYeQAAvFl>N%fNzGDHR`$63`BuBIlkKM@ zP9xH~A$VgF%i}nhx6vl|BIG{WUt2e;*SQ!rz(yR6)MrC8!ZzbW?v!+s#n_b`zc`2u zh2v{b*#S)TjLcA4+qBCXGer1urFOX}*SWJS?qaPKawyb^-QV^nvJyVCaE9^Y^En-rUs^nXuD(ln# zr7P4Alo+rdhhO>PtT^U2O=nn~e_dXnrPx5)&bE$N^mp?^d1(04S98nR@a^r4>8To$ zz=gG#FD`GwN0)O@l@*Z&fY&uXJR}`faW9y4);ns2IJ!&Swk!5n3aBwsX>tqnuCOBg zL~F!Uz#QVfxG;*@AP!a_+>#)sx&SlD<*^V@4kdPaWDlPxEm3^GXz@0RQoJt=$6j!* zE*QfQTpc@u>RhGF;r!qgaOtt_e?A;LdL|dwC_~L^RaY3Lzqn!82PYjVhH^Y&7#f|W zy=v{`L|X>L5myKT(xs!4gve62DRLiu;!h42NF_|ZD0_4d&{%##D`tdYseECA*|cU# z{K+SED{q@@RE1^=Yyum`(tz)jLJ_JBp~@jQTW&PXY<-9S?eK$#{&moaq`85+zn;~8 zQh3GE_rbOZV9TSkpjuqg&*cjCRZ(YqFXwa(}<`7eZ+^-sO9xTx4M$=G?9dkvk^`hpJZLmzoI@^rs52w=hjS=h zZ=)(=YQ}`gxE%7EXU^G?qrTVQ2fNSR-c&8pRzEyIv08641#(`Ua!-vP`?KO*@O z;w{>JToY!knP+eBh;9eK#9iZz59t!r@A&fte0V3e zN*RK}fy+;aqF#0QMstoYgOR*rys+RI`AkheZkq=<%}Bq&jQYti|2W^p-7)AkesPAP zu20PET1ytuS$z^;Kg6Uf*1J;Gu$65`eE$i%2@P4GEq2q}{`YzSD{@5f-Upger5>r+OLXYiBTg?(jW<2Jt$hbLTYdG12X=$b7N1E z#2KqXQ#1brZi-Kn2-W4jRMPC{ulap#(}UE3XB4INoQgBV&Z!!F(aZ(oLjFms3pAH{ z2kc~}Mhk+mkDrQ#5^Pc33GQF1UOU=jO0>ux7sR*&u9@Od$!0vN$GRCaeis8zTpi{f#i^LqHOM0uuePHr(;|;F zuFM0;0w-Mx@^D}9na9}L4fa!fGZzn(|`o<;xbzU ztMEvt4)qC0R#BwlicBZZ|NHGm(M`lbQ*@^{J^|@Q5Q@GXYy5DaFehA zRZ9O|**FPxgjru4?!W0bO^~Xpb4&DY}o-c z(u=tn>`qjURi7s$=t{=Bgnch55^~reDXi2*(5wLsSt99QT4}Xn)a;iJ4I}K+XdFM3 z3E(nRho1TbaOT0p7V;ebX(-7Q-Q8dgQTC1k9JzNm&SMG?uI7%dsZj=CE; z!QtNjkr7>outls{k&hSSed1E&@f|8c%KNBx7>7x%t>#`LC&5pD@;VBbKcT`+E0*{P z<~NtLw=Rn^GZtj$_PjHeWJpDUn^WV!-%Qjbu7n)3k<23x73gnfSy0$y|D5;ba=Gvg zr%>-+Sj*V*i9%hUwCGT6JR!!YM0msR%G9XQB&tJd|G$~N_nqzu|H%V?h6jHBNxV(5 zc*KOMXt65I3w;o3my?>U1vy2OFQkufB$E=iY>wAns%g=l?9NiNq2eHwu3=FYfeYk$ zDc&3Hpd{hLMWY(s+_*VfaPqxnHTy}x9k4ok`Apnw5lIdc7wouEhd6;V02k#E^ zPviKh?IUIFP|CWqFN~rJlYa*CkLQIv(ev_8=jlzh)&hh5%E5C zx#;e!%-KOZRmBRS(`7ug=pP`)pcDiFys3v&+YkD?q;%4>5F%O>79e#spzU4^h2*xH zc&2OP?WQ(~F-2cI^?M)nLw^AqYJD``aMrUmtUK{p>QZeE@Z#`niknw3YB6|&8A&lx zbjoV^+I*bK?){#dx0z?FTpdJvl7NB>Y#4EnQZ&3|vun{Mk9A|p*Hc&68G9meoPeT1 zQV!HB(--#i@MQd6q+qx+O2@~C0zE6Y54}08qYSY{7wNzPr)GXY*h*V!TmWu$+sBayW)>om+fdD2+UI{9(g42BSp!Y5p8W)(Ei zeDOl4T2zmGj+lm(i_+2v_Bbsv2t>6u^&?vyUXP(noG=rm5H@mmYJPb*{*-SE9zH3J zDQ%bcsm_cV8Zj~>#_-P=Q&33+6!VYrM1|Mp%=Y(-<;uv?I`i)SkoC>99&cnlFu~Al9q#Z$quoUaCs3&YGo|F^Z z4hyqC3CYSkz)5C`qoWdj#mlHD9p92BieeAvoPU|P7Tf?FC2;8FN@XtExnAKUQ7CYn z4kW?4dVzVdCGx23@@DkGz!kQhQqPq6fw)kaPs5A>f{6u4Ed{p89-F%V?FGmws6ZU6 zO3;>+OjWh`pq2Jyz*z7VcredP*U1tZ#;{CK+742NEhx_biwuQvueabpPx8Vh1NApu zO9S0hMlFvFix@({V{=N1&0Qhhm9xS8QU6`>=Y)tF`o2>|a@^I4<&C*eUE;2cp72zr zk~S=&HVxZ6T1^3lz$x%zp)V#t(g{=m1BhL2ZnGY3u{akSRJo&^U#R9*=*JnmRF(B2 zqF-P}uuH$r&kx6s9((chF(-UN;h}3NqX>vN{om#OsvPYGxUDq9Wt@sz zaKC2{5{5bguRn#VbyFZECb~wxXI4go=Oyc!xY3Ft$cV$=GLLPQe zlr5z|IcBgwClF#u+qrQ)cqs%zdhT`a2r!GCDDZxFo-Jstv|h=mwR_7ZpDZ@J#N=zMbznM;u9)nW1}((yj84wHjeG))sG<&(<86^d1P}&>pBvy+!0K zI_P9~9(Z^nV!>wpw{u|ksCoPVzk!mvtf~cW4SPI zjoFKW`K4x+?-fVjYr}r3D3W`|@*}Yz&sYbK45RJ51J& z2$a}-X|i;3$Izq8<75Qql%59Hck!^Ki$j`HY=8`7lqKomUpR?bFgdYVrn>O89^X~{ zLhD!@V@R8^P$Xs0<3r8O_y{dDb3Ur6p*B#y_zlonf(S-6PG&nT{kUWI@!k>tR z&a-$K1TO#{1_1Y2)PIM=pxU|13ywm_e8HccOFXlP)WJa1pheuPJ}MrmRwy>s0Vfav zN(C3uSsxwV7yY797ZX-t(RZnUx2v+LKICnd@B0!31x}6G)Dn%3Eb{4| ziJa_OW7o}=vLKv1ppY#NL>t4r6fBZft^B`QJ!@sWy)nIjgWK0kM*pT?0tKv|JQCzg z8jhx8|M=ohL#)-GZA2ta4%1-b1v#RS^oCVbCBE&nk964IBG?&s9TGAf5^$wYcf1e4GUH%y8nQ zUodrFNFE~3z5$00=a=&NlTQs#7j`6JD5hi~3LJC!D?&`l{G+*$?l!-2W1aLLUj}h= zrdLutaN=Ss#2tqE?!A5gEkCeFA1kH1uW<0fLBg^>NrM~@&-N5$BlF=D1hH!bY_62I z!^hmWCN>cqO#@Lpd4uOk#o}x1*NgXo%$e@wNgb!j<`;ssh+ix-rR~7LxiAx-j58w_(jm7 zxl9}DDxquzzNVX?335duTDlI3-*kFrT}4FWb~Tj@c=Y_P-$UJAfFof?DAJWz#=o?UQ6eWeK=Czcxq*g`ogizX zmD2pM1cu~rQ+>@DW=Fim%oN7>q#0q0yyBu_UAngE8G~;${k}B2l_*$M2`t6v<76Hm zo{0H~`le9DW${w(+!Oq}B6xP5kR- zwTzbR46RvwrXx0&nx2oL!vAER2EnUiH+AAj30;-a>|{-N9bCb+!0Y;C1F21=>fDdf z8fs(qWfa6F5F;v9uutg=zuD%q*a#Qd8C8H-E8!{gH>6%9C4qpA!NOv)vck9QlnGhKH!ZT*C0zONLm4pE$lmYQWYcaY_EOxC=1!Gh?kL25&*K5* zA_zNdT^&ib2K~$1=kGg7{d{=*;UuXihnLRe6wo#dZS+n;pTOmlO}?9udQ+0c2i}@r z&dnFr2qqFkaV4ey5XLBhaoX257vHVoD3m_N4T1wQZLs8N9TBuqqL>;RW+yR@YDZ_~ zThuD)DBd6MmeK?jnYHhl*1i90DA_NfRZd07yppf+0>B&c+I>+dd@|D~aq-D-f5U%y z&svfLQ*nx7lj*2+SbjVl3ZB7YrJ`(#8TuFy|x0WVs)4W+IUD_g2@)G zhW8B1TpV#L7q-X^R?>gGw4bO1WI9)s!(q-Yq9^%eGx%kNW!!?YcAB$kt$we7u~-Qr z|5+|qdDCMgOG1!UdNBc__x>J>CpUX#O5fhCf-`(!M0LzkIpO@s5<4@52j*EfTq5t| zc#}LJ=-ZY@oDBA9YzE9G6yUsDXJA=*EhUE8?c3a2xw@4mh6DDZ6DX1Et?;k@;GyBq z{%xFZ=e=@3sa-2RgM7#GuvwzP$GIB;<`S`qj*RAV`b|%^-^CleOam@dTiN}$;(3sc zEoA{h$~$*_*V@)qK1W3i?LU2+@-ci5aOp`=!PP*D@XSVdM9|6sIh=Ry1c2Zdv1gjO z6>E^`AX!4uJ_z(mZadduvO+b$DkbR}l0h2b%;folC6HK!wx9Jc3178>_jm5U<#aV6 z$wqf8sb&w?HgKYtlOZ8Bn+L$)`3-~x{)Vuhm72D>9sAh{)tXJl{=0O=X-SP?MQnXS zY>zS`KKK3EUmMo_^l@`6RIWgHas=itjOkj8*N#OokW{GR0jv2Auk5Aasli4B?9KUS z{z8s#Blnvsq`ljxPlC)*N^a&)k5IQS7VDfw@69)|KH=s_Q4q1+Ho!VAUjG(M4oi|C z))W*#*;ZNKCD_yV3^(-bquebbQ+tIK`2^H(-B+Yi=>9G-&6b?@b?x!Jd;uInX&rv= z_oBexQ;PWavs*r;mbyjzu{1EZ#sJLG71m?1j_fBEq{X(1G|QvDSrYDdw=OQQ_{~xfS7WND=Mg#54|AvOkfkCkrS{ibRU(YD+0xw7u<8O`Cs}I z*6%4#d%X1;j@9xO_U{`hP!A zcd%W)68x=r^8-YPLC0#-F{khcL?HI}X;5Z^;V5X^-RAxHeal2ovXbNn&5&JJ-WxMk zs4|pyJBMMHg8;7NcSM0KyvYSQ)DcvBWm_)uCqP_RXN>LWU`{@?vFKA0Wuau(Ycqd=Vd$INDw{#;&A5JsbskdvJk0R z;4_GrP0WmOCZ&tWY;y0-uIbX}xjC zka8uo^jfre|xDEENmPm1~joO?t}?d?-gn|ceUiY(iH$L z!APs1n^zQn+GY_k8L>;^VXEZVWb`-CFM30~ky`q~;iKSY7iB65T%vlC%LigYg+-9h zzO>^!*VImoQNMTQASwoqkiT+wpmj&1o!5ka1GnINs#?y+PQ~t+^=uqK&J|jOzn!$T zi()O?Cm$wRTrvHgoBduXC