char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
10bf611e5
char/aliceai-t5-moe
1#include "llama-adapter.h" 2 3#include "llama-impl.h" 4#include "llama-mmap.h" 5#include "llama-model.h" 6 7#include <map> 8#include <cassert> 9#include <sstream> 10#include <stdexcept> 11 12// vec 13 14ggml_tensor * llama_adapter_cvec::tensor_for (int il )const { 15if (il < 0 || il < layer_start || il > layer_end || (size_t )il >=tensors .size ()) { 16return nullptr ; 17 } 18 19return tensors [il ]; 20} 21 22ggml_tensor * llama_adapter_cvec::apply_to (ggml_context * ctx ,ggml_tensor * cur ,int il )const { 23ggml_tensor * layer_dir = tensor_for (il ); 24if (layer_dir != nullptr ) { 25cur = ggml_add (ctx ,cur ,layer_dir ); 26 } 27 28return cur ; 29} 30 31bool llama_adapter_cvec::init (const llama_model & model ) { 32const auto & hparams = model .hparams ; 33 34GGML_ASSERT (tensors .empty ()); 35GGML_ASSERT (ctxs .empty ()); 36GGML_ASSERT (bufs .empty ()); 37 38// create a context for each buffer type 39 std::map < ggml_backend_buffer_type_t ,ggml_context *> ctx_map ; 40auto ctx_for_buft = [& ](ggml_backend_buffer_type_t buft )-> ggml_context * { 41auto it = ctx_map .find (buft ); 42if (it == ctx_map .end ()) { 43ggml_init_params params = { 44/*.mem_size =*/ hparams .n_layer ()* ggml_tensor_overhead (), 45/*.mem_buffer =*/ NULL , 46/*.no_alloc =*/ true, 47 }; 48 49ggml_context * ctx = ggml_init (params ); 50if (!ctx ) { 51return nullptr ; 52 } 53 54ctx_map [buft ]= ctx ; 55ctxs .emplace_back (ctx ); 56 57return ctx ; 58 } 59 60return it -> second ; 61 }; 62 63// make tensors 64tensors .reserve (hparams .n_layer ()); 65tensors .push_back (nullptr );// there's never a tensor for layer 0 66for (size_t il = 1 ;il < hparams .n_layer ();il ++ ) { 67ggml_backend_buffer_type_t buft = model .select_buft (il ); 68ggml_context * ctx = ctx_for_buft (buft ); 69if (!ctx ) { 70LLAMA_LOG_ERROR ("%s: failed to allocate context for control vector\n" ,__func__ ); 71return false; 72 } 73ggml_tensor * tensor = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,hparams .n_embd ); 74tensors .push_back (tensor ); 75 } 76 77// allocate tensors / buffers and zero 78bufs .reserve (ctx_map .size ()); 79for (auto it :ctx_map ) { 80ggml_backend_buffer_type_t buft = it .first ; 81ggml_context * ctx = it .second ; 82ggml_backend_buffer_t buf = ggml_backend_alloc_ctx_tensors_from_buft (ctx ,buft ); 83if (!buf ) { 84LLAMA_LOG_ERROR ("%s: failed to allocate buffer for control vector\n" ,__func__ ); 85return false; 86 } 87ggml_backend_buffer_clear (buf ,0 ); 88bufs .emplace_back (buf ); 89 } 90 91return true; 92} 93 94bool llama_adapter_cvec::apply ( 95const llama_model & model , 96const float * data , 97size_t len , 98int32_t n_embd , 99int32_t il_start , 100int32_t il_end ) { 101const auto & hparams = model .hparams ; 102 103if (data == nullptr ) { 104// disable the current control vector (but leave allocated for later) 105layer_start = -1 ; 106layer_end = -1 ; 107return true; 108 } 109 110if (n_embd != (int )hparams .n_embd ) { 111LLAMA_LOG_ERROR ("%s: control vector n_embd does not match model\n" ,__func__ ); 112return false; 113 } 114 115if (tensors .empty ()) { 116if (!init (model )) { 117return false; 118 } 119 } 120 121layer_start = il_start ; 122layer_end = il_end ; 123 124for (size_t il = 1 ;il < hparams .n_layer ();il ++ ) { 125assert (tensors [il ]!= nullptr ); 126 127const size_t off = n_embd * (il - 1 );// buffer doesn't have data for layer 0, since it's never present 128if (off + n_embd <=len ) { 129ggml_backend_tensor_set (tensors [il ],data + off ,0 ,n_embd * ggml_element_size (tensors [il ])); 130 } 131 } 132 133return true; 134} 135 136// lora 137 138llama_adapter_lora_weight * llama_adapter_lora::get_weight (ggml_tensor * w ) { 139const std::string name (w -> name ); 140 141const auto pos = ab_map .find (name ); 142if (pos != ab_map .end ()) { 143return & pos -> second ; 144 } 145 146return nullptr ; 147} 148 149static void llama_adapter_lora_init_impl (llama_model & model ,const char * path_lora ,llama_adapter_lora & adapter ) { 150LLAMA_LOG_INFO ("%s: loading lora adapter from '%s' ...\n" ,__func__ ,path_lora ); 151 152ggml_context * ctx_init ; 153gguf_init_params meta_gguf_params = { 154/* .no_alloc = */ true, 155/* .ctx = */ & ctx_init , 156 }; 157 158gguf_context_ptr ctx_gguf {gguf_init_from_file (path_lora ,meta_gguf_params ) }; 159if (!ctx_gguf ) { 160throw std::runtime_error ("failed to load lora adapter file from " + std::string (path_lora )); 161 } 162 163ggml_context_ptr ctx {ctx_init }; 164 165// check metadata 166 { 167const gguf_context * gguf_ctx = ctx_gguf .get (); 168 169LLAMA_LOG_INFO ("%s: Dumping metadata keys/values.\n" ,__func__ ); 170 171// get metadata as string 172for (int i = 0 ;i < gguf_get_n_kv (gguf_ctx );i ++ ) { 173gguf_type type = gguf_get_kv_type (gguf_ctx ,i ); 174const std::string type_name = 175type == GGUF_TYPE_ARRAY 176 ?format ("%s[%s,%zu]" ,gguf_type_name (type ),gguf_type_name (gguf_get_arr_type (gguf_ctx ,i )),gguf_get_arr_n (gguf_ctx ,i )) 177 :gguf_type_name (type ); 178const char * name = gguf_get_key (gguf_ctx ,i ); 179const std::string value = gguf_kv_to_str (gguf_ctx ,i ); 180 181if (type != GGUF_TYPE_ARRAY ) { 182adapter .gguf_kv .emplace (name ,value ); 183 } 184 185const size_t MAX_VALUE_LEN = 40 ; 186 std::string print_value = value .size ()> MAX_VALUE_LEN ?format ("%s..." ,value .substr (0 ,MAX_VALUE_LEN - 3 ).c_str ()) :value ; 187replace_all (print_value ,"\n" ,"\\n" ); 188 189LLAMA_LOG_INFO ("%s: - kv %3d: %42s %-16s = %s\n" ,__func__ ,i ,name ,type_name .c_str (),print_value .c_str ()); 190 } 191 192auto get_kv_str = [& ](const std::string & key )-> std::string { 193int id = gguf_find_key (gguf_ctx ,key .c_str ()); 194return id < 0 ?"" : std::string (gguf_get_val_str (gguf_ctx ,id )); 195 }; 196auto get_kv_f32 = [& ](const std::string & key )-> float { 197int id = gguf_find_key (gguf_ctx ,key .c_str ()); 198return id < 0 ?0.0f :gguf_get_val_f32 (gguf_ctx ,id ); 199 }; 200LLM_KV llm_kv = LLM_KV (LLM_ARCH_UNKNOWN ); 201 202auto general_type = get_kv_str (llm_kv (LLM_KV_GENERAL_TYPE )); 203if (general_type != "adapter" ) { 204throw std::runtime_error ("expect general.type to be 'adapter', but got: " + general_type ); 205 } 206 207auto general_arch_str = get_kv_str (llm_kv (LLM_KV_GENERAL_ARCHITECTURE )); 208auto general_arch = llm_arch_from_string (general_arch_str ); 209if (general_arch != model .arch ) { 210throw std::runtime_error ("model arch and LoRA arch mismatch" ); 211 } 212 213auto adapter_type = get_kv_str (llm_kv (LLM_KV_ADAPTER_TYPE )); 214if (adapter_type != "lora" ) { 215throw std::runtime_error ("expect adapter.type to be 'lora', but got: " + adapter_type ); 216 } 217 218adapter .alpha = get_kv_f32 (llm_kv (LLM_KV_ADAPTER_LORA_ALPHA )); 219 220// parse alora invocation sequence vector 221const auto & key = llm_kv (LLM_KV_ADAPTER_ALORA_INVOCATION_TOKENS ); 222const int kid = gguf_find_key (ctx_gguf .get (),key .c_str ()); 223if (kid >=0 ) { 224if (gguf_get_kv_type (ctx_gguf .get (),kid )!= GGUF_TYPE_ARRAY ) { 225throw std::runtime_error ("invalid gguf type for " + key ); 226 } 227const auto arr_type = gguf_get_arr_type (ctx_gguf .get (),kid ); 228if (arr_type != GGUF_TYPE_UINT32 ) { 229throw std::runtime_error ("invalid gguf element type for " + key ); 230 } 231const size_t seq_len = gguf_get_arr_n (ctx_gguf .get (),kid ); 232const void * data = gguf_get_arr_data (ctx_gguf .get (),kid ); 233adapter .alora_invocation_tokens .resize (seq_len ); 234 std::copy ( 235 (const llama_token * )data , 236 (const llama_token * )data + seq_len , 237adapter .alora_invocation_tokens .begin ()); 238 } 239 } 240 241int n_tensors = gguf_get_n_tensors (ctx_gguf .get ()); 242 243// contexts for each buffer type 244 std::map < ggml_backend_buffer_type_t ,ggml_context *> ctx_map ; 245auto ctx_for_buft = [& ](ggml_backend_buffer_type_t buft )-> ggml_context * { 246auto it = ctx_map .find (buft ); 247if (it == ctx_map .end ()) { 248// add a new context 249ggml_init_params params = { 250/*.mem_size =*/ n_tensors * ggml_tensor_overhead (), 251/*.mem_buffer =*/ NULL , 252/*.no_alloc =*/ true, 253 }; 254ggml_context * buft_ctx = ggml_init (params ); 255if (!buft_ctx ) { 256return nullptr ; 257 } 258ctx_map [buft ]= buft_ctx ; 259adapter .ctxs .emplace_back (buft_ctx ); 260return buft_ctx ; 261 }; 262return it -> second ; 263 }; 264 265// bundle lora_a and lora_b into pairs 266 std::map < std::string ,llama_adapter_lora_weight > ab_map ; 267auto str_endswith = [](const std::string & str ,const std::string & suffix ) { 268return str .size () >=suffix .size ()&& str .compare (str .size ()- suffix .size (),suffix .size (),suffix )== 0 ; 269 }; 270 271for (ggml_tensor * cur = ggml_get_first_tensor (ctx .get ());cur ;cur = ggml_get_next_tensor (ctx .get (),cur )) { 272 std::string name (cur -> name ); 273if (str_endswith (name ,".lora_a" )) { 274replace_all (name ,".lora_a" ,"" ); 275if (ab_map .find (name )== ab_map .end ()) { 276ab_map [name ]= llama_adapter_lora_weight (cur ,nullptr ); 277 }else { 278ab_map [name ].a = cur ; 279 } 280 }else if (str_endswith (name ,".lora_b" )) { 281replace_all (name ,".lora_b" ,"" ); 282if (ab_map .find (name )== ab_map .end ()) { 283ab_map [name ]= llama_adapter_lora_weight (nullptr ,cur ); 284 }else { 285ab_map [name ].b = cur ; 286 } 287 }else if (str_endswith (name ,"_norm.weight" )) { 288// TODO: add support for norm vector 289// for now, we don't really care because most adapters still work fine without it 290continue ; 291 }else { 292throw std::runtime_error ("LoRA tensor '" + name + "' has unexpected suffix" ); 293 } 294 } 295 296// get extra buffer types of the CPU 297// TODO: a more general solution for non-CPU extra buft should be implemented in the future 298// ref: https://github.com/ggml-org/llama.cpp/pull/12593#pullrequestreview-2718659948 299 std::vector < ggml_backend_buffer_type_t > buft_extra ; 300 { 301auto * cpu_dev = ggml_backend_dev_by_type (GGML_BACKEND_DEVICE_TYPE_CPU ); 302if (!cpu_dev ) { 303throw std::runtime_error (format ("%s: no CPU backend found" ,__func__ )); 304 } 305auto * cpu_reg = ggml_backend_dev_backend_reg (cpu_dev ); 306 307auto ggml_backend_dev_get_extra_bufts_fn = (ggml_backend_dev_get_extra_bufts_t ) 308ggml_backend_reg_get_proc_address (cpu_reg ,"ggml_backend_dev_get_extra_bufts" ); 309 310if (ggml_backend_dev_get_extra_bufts_fn ) { 311ggml_backend_buffer_type_t * extra_bufts = ggml_backend_dev_get_extra_bufts_fn (cpu_dev ); 312while (extra_bufts && * extra_bufts ) { 313buft_extra .emplace_back (* extra_bufts ); 314++ extra_bufts ; 315 } 316 } 317 } 318 319// add tensors 320for (auto & it :ab_map ) { 321const std::string & name = it .first ; 322llama_adapter_lora_weight & w = it .second ; 323bool is_token_embd = str_endswith (name ,"token_embd.weight" ); 324 325if (!w .a || !w .b ) { 326throw std::runtime_error ("LoRA tensor pair for '" + name + "' is missing one component" ); 327 } 328 329// device buft and device ctx 330const auto * model_tensor = model .get_tensor (name .c_str ()); 331if (!model_tensor ) { 332throw std::runtime_error ("LoRA tensor '" + name + "' does not exist in base model (hint: maybe wrong base model?)" ); 333 } 334 335auto * buft = ggml_backend_buffer_get_type (model_tensor -> buffer ); 336 337// do not load loras to extra buffer types (i.e. bufts for repacking) -> use the CPU in that case 338for (auto & ex :buft_extra ) { 339if (ex == buft ) { 340LLAMA_LOG_WARN ("%s: lora for '%s' cannot use buft '%s', fallback to CPU\n" ,__func__ ,model_tensor -> name ,ggml_backend_buft_name (buft )); 341 342auto * cpu_dev = ggml_backend_dev_by_type (GGML_BACKEND_DEVICE_TYPE_CPU ); 343if (!cpu_dev ) { 344throw std::runtime_error (format ("%s: no CPU backend found" ,__func__ )); 345 } 346buft = ggml_backend_dev_buffer_type (cpu_dev ); 347 348break ; 349 } 350 } 351 352LLAMA_LOG_DEBUG ("%s: lora for '%s' -> '%s'\n" ,__func__ ,model_tensor -> name ,ggml_backend_buft_name (buft )); 353 354ggml_context * dev_ctx = ctx_for_buft (buft ); 355// validate tensor shape 356if (is_token_embd ) { 357// expect B to be non-transposed, A and B are flipped; see llm_build_inp_embd() 358if (model_tensor -> ne [0 ]!= w .b -> ne [1 ]|| model_tensor -> ne [1 ]!= w .a -> ne [1 ]) { 359throw std::runtime_error ("tensor '" + name + "' has incorrect shape (hint: maybe wrong base model?)" ); 360 } 361 }else { 362if (model_tensor -> ne [0 ]!= w .a -> ne [0 ]|| model_tensor -> ne [1 ]!= w .b -> ne [1 ]) { 363throw std::runtime_error ("tensor '" + name + "' has incorrect shape (hint: maybe wrong base model?)" ); 364 } 365if (w .a -> ne [1 ]!= w .b -> ne [0 ]) { 366throw std::runtime_error ("lora_a tensor is not transposed (hint: adapter from \"finetune\" example is no longer supported)" ); 367 } 368 } 369 370// save tensor to adapter 371ggml_tensor * tensor_a = ggml_dup_tensor (dev_ctx ,w .a ); 372ggml_tensor * tensor_b = ggml_dup_tensor (dev_ctx ,w .b ); 373ggml_set_name (tensor_a ,w .a -> name ); 374ggml_set_name (tensor_b ,w .b -> name ); 375adapter .ab_map [name ]= llama_adapter_lora_weight (tensor_a ,tensor_b ); 376 } 377 378// allocate tensors / buffers and zero 379 { 380adapter .ctxs .reserve (ctx_map .size ()); 381adapter .bufs .reserve (ctx_map .size ()); 382for (auto & it :ctx_map ) { 383ggml_backend_buffer_type_t buft = it .first ; 384ggml_context * ctx_dev = it .second ; 385ggml_backend_buffer_ptr buf {ggml_backend_alloc_ctx_tensors_from_buft (ctx_dev ,buft ) }; 386if (!buf ) { 387throw std::runtime_error ("failed to allocate buffer for lora adapter\n" ); 388 } 389LLAMA_LOG_INFO ("%s: %10s LoRA buffer size = %8.2f MiB\n" ,__func__ ,ggml_backend_buffer_name (buf .get ()),ggml_backend_buffer_get_size (buf .get ())/1024.0 /1024.0 ); 390adapter .bufs .emplace_back (std::move (buf )); 391 } 392 } 393 394// set tensor data 395 { 396llama_file gguf_file (path_lora ,"rb" ); 397 std::vector < uint8_t > read_buf ; 398auto set_tensor = [& ](ggml_tensor * orig ,ggml_tensor * dev ) { 399const size_t offs = gguf_get_data_offset (ctx_gguf .get ())+ gguf_get_tensor_offset (ctx_gguf .get (),gguf_find_tensor (ctx_gguf .get (),orig -> name )); 400const size_t size = ggml_nbytes (orig ); 401if (offs + size < offs || offs + size > gguf_file .size ()) { 402throw std::runtime_error (format ("LoRA tensor '%s' data is not within the file bounds, file is corrupted or incomplete" ,orig -> name )); 403 } 404read_buf .resize (size ); 405gguf_file .seek (offs ,SEEK_SET ); 406gguf_file .read_raw (read_buf .data (),size ); 407ggml_backend_tensor_set (dev ,read_buf .data (),0 ,size ); 408 }; 409for (auto & it :adapter .ab_map ) { 410auto orig = ab_map [it .first ]; 411auto dev = it .second ; 412set_tensor (orig .a ,dev .a ); 413set_tensor (orig .b ,dev .b ); 414 } 415 } 416 417// register adapter with model 418model .loras .insert (& adapter ); 419 420LLAMA_LOG_INFO ("%s: loaded %zu tensors from lora file\n" ,__func__ ,adapter .ab_map .size ()* 2 ); 421} 422 423llama_adapter_lora * llama_adapter_lora_init (llama_model * model ,const char * path_lora ) { 424llama_adapter_lora * adapter = new llama_adapter_lora (model ); 425 426try { 427llama_adapter_lora_init_impl (* model ,path_lora ,* adapter ); 428return adapter ; 429 }catch (const std::exception & err ) { 430LLAMA_LOG_ERROR ("%s: failed to apply lora adapter: %s\n" ,__func__ ,err .what ()); 431 432delete adapter ; 433 } 434 435return nullptr ; 436} 437 438int32_t llama_adapter_meta_val_str (const llama_adapter_lora * adapter ,const char * key ,char * buf ,size_t buf_size ) { 439const auto & it = adapter -> gguf_kv .find (key ); 440if (it == adapter -> gguf_kv .end ()) { 441if (buf_size > 0 ) { 442buf [0 ]= '\0' ; 443 } 444return -1 ; 445 } 446return snprintf (buf ,buf_size ,"%s" ,it -> second .c_str ()); 447} 448 449int32_t llama_adapter_meta_count (const llama_adapter_lora * adapter ) { 450return (int )adapter -> gguf_kv .size (); 451} 452 453int32_t llama_adapter_meta_key_by_index (const llama_adapter_lora * adapter ,int i ,char * buf ,size_t buf_size ) { 454if (i < 0 || i >= (int )adapter -> gguf_kv .size ()) { 455if (buf_size > 0 ) { 456buf [0 ]= '\0' ; 457 } 458return -1 ; 459 } 460auto it = adapter -> gguf_kv .begin (); 461 std::advance (it ,i ); 462return snprintf (buf ,buf_size ,"%s" ,it -> first .c_str ()); 463} 464 465int32_t llama_adapter_meta_val_str_by_index (const llama_adapter_lora * adapter ,int32_t i ,char * buf ,size_t buf_size ) { 466if (i < 0 || i >= (int )adapter -> gguf_kv .size ()) { 467if (buf_size > 0 ) { 468buf [0 ]= '\0' ; 469 } 470return -1 ; 471 } 472auto it = adapter -> gguf_kv .begin (); 473 std::advance (it ,i ); 474return snprintf (buf ,buf_size ,"%s" ,it -> second .c_str ()); 475} 476 477void llama_adapter_lora_free (llama_adapter_lora * adapter ) { 478if (adapter == nullptr ) { 479return ; 480 } 481 482if (adapter -> model != nullptr ) { 483adapter -> model -> loras .erase (adapter ); 484adapter -> model = nullptr ; 485 } 486 487delete adapter ; 488} 489 490uint64_t llama_adapter_get_alora_n_invocation_tokens (const struct llama_adapter_lora * adapter ) { 491if (!adapter ) { 492return 0 ; 493 } 494return adapter -> alora_invocation_tokens .size (); 495} 496 497const llama_token * llama_adapter_get_alora_invocation_tokens (const llama_adapter_lora * adapter ) { 498GGML_ASSERT (adapter ); 499return adapter -> alora_invocation_tokens .data (); 500}