char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
ad8d82199
char/aliceai-t5-moe
1// This file contains functionality related to "GGUF" files, the binary file format used by ggml. 2// GGUF files have the following structure: 3// 4// 1. File magic "GGUF" (4 bytes). 5// 2. File version (uint32_t). 6// 3. Number of ggml tensors in file (int64_t). 7// 4. Number of key-value-pairs in file (int64_t). 8// 5. For each KV pair: 9// 1. The key (string). 10// 2. The value type (gguf_type). 11// 3a. If the value type is GGUF_TYPE_ARRAY: 12// 1. The type of the array (gguf_type). 13// 2. The number of elements in the array (uint64_t). 14// 3. The binary representation of each element in the array. 15// 3b. Otherwise: 16// 1. The binary representation of the value. 17// 6. For each ggml tensor: 18// 1. The tensor name (string). 19// 2. The number of dimensions of the tensor (uint32_t). 20// 3. For each dimension: 21// 1. The size of the tensor in the dimension (int64_t). 22// 4. The tensor data type (ggml_type). 23// 5. The tensor data offset in the tensor data binary blob (uint64_t). 24// 7. The tensor data binary blob (optional, aligned). 25// 26// Strings are serialized as the string length (uint64_t) followed by the C string without the null terminator. 27// All enums are stored as int32_t. 28// All bool values are stored as int8_t. 29// If the special key "general.alignment" (uint32_t) is defined it is used for alignment, 30// otherwise GGUF_DEFAULT_ALIGNMENT is used. 31// 32// Module maintainer: Johannes Gäßler (@JohannesGaessler, johannesg@5d6.de) 33 34#pragma once 35 36#include "ggml.h" 37 38#include <stdbool.h> 39#include <stdint.h> 40 41#define GGUF_MAGIC "GGUF" 42#define GGUF_VERSION 3 43 44#define GGUF_KEY_GENERAL_ALIGNMENT "general.alignment" 45 46#define GGUF_DEFAULT_ALIGNMENT 32 47 48#ifdef __cplusplus 49extern "C" { 50#endif 51 52// types that can be stored as GGUF KV data 53enum gguf_type { 54GGUF_TYPE_UINT8 = 0 , 55GGUF_TYPE_INT8 = 1 , 56GGUF_TYPE_UINT16 = 2 , 57GGUF_TYPE_INT16 = 3 , 58GGUF_TYPE_UINT32 = 4 , 59GGUF_TYPE_INT32 = 5 , 60GGUF_TYPE_FLOAT32 = 6 , 61GGUF_TYPE_BOOL = 7 , 62GGUF_TYPE_STRING = 8 , 63GGUF_TYPE_ARRAY = 9 , 64GGUF_TYPE_UINT64 = 10 , 65GGUF_TYPE_INT64 = 11 , 66GGUF_TYPE_FLOAT64 = 12 , 67GGUF_TYPE_COUNT ,// marks the end of the enum 68 }; 69 70struct gguf_context ; 71 72struct gguf_init_params { 73bool no_alloc ; 74 75// if not NULL, create a ggml_context and allocate the tensor data in it 76struct ggml_context ** ctx ; 77 }; 78 79// callback to simulate or wrap a FILE pointer - read up to `len` bytes at `offset` into `output` and return the number of bytes read 80typedef size_t (* gguf_reader_callback_t )(void * userdata ,void * output ,uint64_t offset ,size_t len ); 81 82GGML_API struct gguf_context * gguf_init_empty (void ); 83GGML_API struct gguf_context * gguf_init_from_file_ptr (FILE * file ,struct gguf_init_params params ); 84GGML_API struct gguf_context * gguf_init_from_file (const char * fname ,struct gguf_init_params params ); 85GGML_API struct gguf_context * gguf_init_from_buffer (const void * data ,size_t size ,struct gguf_init_params params ); 86 87// max_chunk_read is the maximum number of bytes that the GGUF code will read at once from the callback, a value of 0 means no limit 88GGML_API struct gguf_context * gguf_init_from_callback (gguf_reader_callback_t callback ,void * userdata ,size_t max_chunk_read ,uint64_t max_expected_size ,struct gguf_init_params params ); 89 90GGML_API void gguf_free (struct gguf_context * ctx ); 91 92GGML_API const char * gguf_type_name (enum gguf_type type ); 93 94GGML_API uint32_t gguf_get_version (const struct gguf_context * ctx ); 95GGML_API size_t gguf_get_alignment (const struct gguf_context * ctx ); 96GGML_API size_t gguf_get_data_offset (const struct gguf_context * ctx );// padded to gguf_get_alignment if and only if the gguf_context contains at least one tensor 97 98GGML_API int64_t gguf_get_n_kv (const struct gguf_context * ctx ); 99GGML_API int64_t gguf_find_key (const struct gguf_context * ctx ,const char * key );// returns -1 if key is not found 100GGML_API const char * gguf_get_key (const struct gguf_context * ctx ,int64_t key_id ); 101 102GGML_API enum gguf_type gguf_get_kv_type (const struct gguf_context * ctx ,int64_t key_id ); 103GGML_API enum gguf_type gguf_get_arr_type (const struct gguf_context * ctx ,int64_t key_id ); 104 105// will abort if the wrong type is used for the key 106GGML_API uint8_t gguf_get_val_u8 (const struct gguf_context * ctx ,int64_t key_id ); 107GGML_API int8_t gguf_get_val_i8 (const struct gguf_context * ctx ,int64_t key_id ); 108GGML_API uint16_t gguf_get_val_u16 (const struct gguf_context * ctx ,int64_t key_id ); 109GGML_API int16_t gguf_get_val_i16 (const struct gguf_context * ctx ,int64_t key_id ); 110GGML_API uint32_t gguf_get_val_u32 (const struct gguf_context * ctx ,int64_t key_id ); 111GGML_API int32_t gguf_get_val_i32 (const struct gguf_context * ctx ,int64_t key_id ); 112GGML_API float gguf_get_val_f32 (const struct gguf_context * ctx ,int64_t key_id ); 113GGML_API uint64_t gguf_get_val_u64 (const struct gguf_context * ctx ,int64_t key_id ); 114GGML_API int64_t gguf_get_val_i64 (const struct gguf_context * ctx ,int64_t key_id ); 115GGML_API double gguf_get_val_f64 (const struct gguf_context * ctx ,int64_t key_id ); 116GGML_API bool gguf_get_val_bool (const struct gguf_context * ctx ,int64_t key_id ); 117GGML_API const char * gguf_get_val_str (const struct gguf_context * ctx ,int64_t key_id ); 118GGML_API const void * gguf_get_val_data (const struct gguf_context * ctx ,int64_t key_id ); 119GGML_API size_t gguf_get_arr_n (const struct gguf_context * ctx ,int64_t key_id ); 120 121// get raw pointer to the first element of the array with the given key_id 122// for bool arrays, note that they are always stored as int8 on all platforms (usually this makes no difference) 123GGML_API const void * gguf_get_arr_data (const struct gguf_context * ctx ,int64_t key_id ); 124 125// get ith C string from array with given key_id 126GGML_API const char * gguf_get_arr_str (const struct gguf_context * ctx ,int64_t key_id ,size_t i ); 127 128GGML_API int64_t gguf_get_n_tensors (const struct gguf_context * ctx ); 129GGML_API int64_t gguf_find_tensor (const struct gguf_context * ctx ,const char * name );// returns -1 if the tensor is not found 130GGML_API size_t gguf_get_tensor_offset (const struct gguf_context * ctx ,int64_t tensor_id ); 131GGML_API const char * gguf_get_tensor_name (const struct gguf_context * ctx ,int64_t tensor_id ); 132GGML_API const int64_t * gguf_get_tensor_ne (const struct gguf_context * ctx ,int64_t tensor_id );// returns ne, an array of GGML_MAX_DIMS elements; ne[dim] is 1 for dim >= n_dims 133GGML_API enum ggml_type gguf_get_tensor_type (const struct gguf_context * ctx ,int64_t tensor_id ); 134GGML_API size_t gguf_get_tensor_size (const struct gguf_context * ctx ,int64_t tensor_id ); 135 136// removes key if it exists, returns id that the key had prior to removal (-1 if it didn't exist) 137GGML_API int64_t gguf_remove_key (struct gguf_context * ctx ,const char * key ); 138 139// overrides an existing KV pair or adds a new one, the new KV pair is always at the back 140GGML_API void gguf_set_val_u8 (struct gguf_context * ctx ,const char * key ,uint8_t val ); 141GGML_API void gguf_set_val_i8 (struct gguf_context * ctx ,const char * key ,int8_t val ); 142GGML_API void gguf_set_val_u16 (struct gguf_context * ctx ,const char * key ,uint16_t val ); 143GGML_API void gguf_set_val_i16 (struct gguf_context * ctx ,const char * key ,int16_t val ); 144GGML_API void gguf_set_val_u32 (struct gguf_context * ctx ,const char * key ,uint32_t val ); 145GGML_API void gguf_set_val_i32 (struct gguf_context * ctx ,const char * key ,int32_t val ); 146GGML_API void gguf_set_val_f32 (struct gguf_context * ctx ,const char * key ,float val ); 147GGML_API void gguf_set_val_u64 (struct gguf_context * ctx ,const char * key ,uint64_t val ); 148GGML_API void gguf_set_val_i64 (struct gguf_context * ctx ,const char * key ,int64_t val ); 149GGML_API void gguf_set_val_f64 (struct gguf_context * ctx ,const char * key ,double val ); 150GGML_API void gguf_set_val_bool (struct gguf_context * ctx ,const char * key ,bool val ); 151GGML_API void gguf_set_val_str (struct gguf_context * ctx ,const char * key ,const char * val ); 152 153// creates a new array with n elements of the given type and copies the corresponding number of bytes from data 154GGML_API void gguf_set_arr_data (struct gguf_context * ctx ,const char * key ,enum gguf_type type ,const void * data ,size_t n ); 155 156// creates a new array with n strings and copies the corresponding strings from data 157GGML_API void gguf_set_arr_str (struct gguf_context * ctx ,const char * key ,const char ** data ,size_t n ); 158 159// set or add KV pairs from another context 160GGML_API void gguf_set_kv (struct gguf_context * ctx ,const struct gguf_context * src ); 161 162// add tensor to GGUF context, tensor name must be unique 163GGML_API void gguf_add_tensor (struct gguf_context * ctx ,const struct ggml_tensor * tensor ); 164 165// after changing a tensor's type, the offsets of all tensors with higher indices are immediately recalculated 166// in such a way that the tensor data remains as one contiguous block (except for padding) 167GGML_API void gguf_set_tensor_type (struct gguf_context * ctx ,const char * name ,enum ggml_type type ); 168 169// assumes that at least gguf_get_tensor_size bytes can be read from data 170GGML_API void gguf_set_tensor_data (struct gguf_context * ctx ,const char * name ,const void * data ); 171 172// writing gguf files can be done in 3 ways: 173// 174// - write the entire gguf_context to a binary file in a single pass: 175// 176// gguf_write_to_file(ctx, fname, /*only_meta =*/ false); 177// 178// - write only the meta data to a file, then re-open the file and append the tensor data: 179// 180// gguf_write_to_file(ctx, fname, /*only_meta =*/ true); 181// FILE * f = fopen(fname, "ab"); 182// fwrite(f, ...); // write tensor data 183// fclose(f); 184// 185// - first prepare a file with a placeholder for the meta data, write the tensor data, then write the meta data: 186// 187// FILE * f = fopen(fname, "wb"); 188// const size_t size_meta = gguf_get_meta_size(ctx); 189// fseek(f, size_meta, SEEK_SET); 190// fwrite(f, ...); // write tensor data 191// void * data = malloc(size_meta); 192// gguf_get_meta_data(ctx, data); 193// rewind(f); 194// fwrite(data, 1, data, f); 195// free(data); 196// fclose(f); 197// 198 199// write the entire context to a binary file 200GGML_API bool gguf_write_to_file_ptr (const struct gguf_context * ctx ,FILE * file ,bool only_meta ); 201GGML_API bool gguf_write_to_file (const struct gguf_context * ctx ,const char * fname ,bool only_meta ); 202 203// get the size in bytes of the meta data (header, kv pairs, tensor info) including padding 204GGML_API size_t gguf_get_meta_size (const struct gguf_context * ctx ); 205 206// writes the meta data to pointer "data" 207GGML_API void gguf_get_meta_data (const struct gguf_context * ctx ,void * data ); 208 209#ifdef __cplusplus 210} 211#endif