char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
9a4843cf2
char/aliceai-t5-moe
1#include "llama-model-loader.h" 2 3#include "ggml-alloc.h" 4#include "ggml.h" 5#include "gguf.h" 6#include "llama-hparams.h" 7#include "llama.h" 8 9#include <algorithm> 10#include <array> 11#include <cinttypes> 12#include <cstdint> 13#include <cstring> 14#include <future> 15#include <regex> 16 17static const size_t kiB = 1024 ; 18static const size_t MiB = 1024 * kiB ; 19static const size_t GiB = 1024 * MiB ; 20 21const char * llama_file_version_name (llama_fver version ) { 22switch (version ) { 23case GGUF_FILE_VERSION_V1 :return "GGUF V1 (support until nov 2023)" ; 24case GGUF_FILE_VERSION_V2 :return "GGUF V2" ; 25case GGUF_FILE_VERSION_V3 :return "GGUF V3 (latest)" ; 26 } 27 28return "unknown" ; 29} 30 31#define LLAMA_FTYPE_PREFIX "(guessed) " 32 33const char * llama_ftype_name (llama_ftype ftype ) { 34static constexpr size_t guessed_prefix_len = sizeof (LLAMA_FTYPE_PREFIX )- 1 ; 35const char * name ; 36switch ((enum llama_ftype ) (ftype & ~LLAMA_FTYPE_GUESSED )) { 37case LLAMA_FTYPE_ALL_F32 :name = LLAMA_FTYPE_PREFIX "all F32" ;break ; 38case LLAMA_FTYPE_MOSTLY_F16 :name = LLAMA_FTYPE_PREFIX "F16" ;break ; 39case LLAMA_FTYPE_MOSTLY_BF16 :name = LLAMA_FTYPE_PREFIX "BF16" ;break ; 40case LLAMA_FTYPE_MOSTLY_Q1_0 :name = LLAMA_FTYPE_PREFIX "Q1_0" ;break ; 41case LLAMA_FTYPE_MOSTLY_Q2_0 :name = LLAMA_FTYPE_PREFIX "Q2_0" ;break ; 42case LLAMA_FTYPE_MOSTLY_Q4_0 :name = LLAMA_FTYPE_PREFIX "Q4_0" ;break ; 43case LLAMA_FTYPE_MOSTLY_Q4_1 :name = LLAMA_FTYPE_PREFIX "Q4_1" ;break ; 44case LLAMA_FTYPE_MOSTLY_Q5_0 :name = LLAMA_FTYPE_PREFIX "Q5_0" ;break ; 45case LLAMA_FTYPE_MOSTLY_Q5_1 :name = LLAMA_FTYPE_PREFIX "Q5_1" ;break ; 46case LLAMA_FTYPE_MOSTLY_Q8_0 :name = LLAMA_FTYPE_PREFIX "Q8_0" ;break ; 47case LLAMA_FTYPE_MOSTLY_MXFP4_MOE :name = LLAMA_FTYPE_PREFIX "MXFP4 MoE" ;break ; 48case LLAMA_FTYPE_MOSTLY_NVFP4 :name = LLAMA_FTYPE_PREFIX "NVFP4" ;break ; 49case LLAMA_FTYPE_MOSTLY_Q2_K :name = LLAMA_FTYPE_PREFIX "Q2_K - Medium" ;break ; 50case LLAMA_FTYPE_MOSTLY_Q2_K_S :name = LLAMA_FTYPE_PREFIX "Q2_K - Small" ;break ; 51case LLAMA_FTYPE_MOSTLY_Q3_K_S :name = LLAMA_FTYPE_PREFIX "Q3_K - Small" ;break ; 52case LLAMA_FTYPE_MOSTLY_Q3_K_M :name = LLAMA_FTYPE_PREFIX "Q3_K - Medium" ;break ; 53case LLAMA_FTYPE_MOSTLY_Q3_K_L :name = LLAMA_FTYPE_PREFIX "Q3_K - Large" ;break ; 54case LLAMA_FTYPE_MOSTLY_Q4_K_S :name = LLAMA_FTYPE_PREFIX "Q4_K - Small" ;break ; 55case LLAMA_FTYPE_MOSTLY_Q4_K_M :name = LLAMA_FTYPE_PREFIX "Q4_K - Medium" ;break ; 56case LLAMA_FTYPE_MOSTLY_Q5_K_S :name = LLAMA_FTYPE_PREFIX "Q5_K - Small" ;break ; 57case LLAMA_FTYPE_MOSTLY_Q5_K_M :name = LLAMA_FTYPE_PREFIX "Q5_K - Medium" ;break ; 58case LLAMA_FTYPE_MOSTLY_Q6_K :name = LLAMA_FTYPE_PREFIX "Q6_K" ;break ; 59case LLAMA_FTYPE_MOSTLY_TQ1_0 :name = LLAMA_FTYPE_PREFIX "TQ1_0 - 1.69 bpw ternary" ;break ; 60case LLAMA_FTYPE_MOSTLY_TQ2_0 :name = LLAMA_FTYPE_PREFIX "TQ2_0 - 2.06 bpw ternary" ;break ; 61case LLAMA_FTYPE_MOSTLY_IQ2_XXS :name = LLAMA_FTYPE_PREFIX "IQ2_XXS - 2.0625 bpw" ;break ; 62case LLAMA_FTYPE_MOSTLY_IQ2_XS :name = LLAMA_FTYPE_PREFIX "IQ2_XS - 2.3125 bpw" ;break ; 63case LLAMA_FTYPE_MOSTLY_IQ2_S :name = LLAMA_FTYPE_PREFIX "IQ2_S - 2.5 bpw" ;break ; 64case LLAMA_FTYPE_MOSTLY_IQ2_M :name = LLAMA_FTYPE_PREFIX "IQ2_M - 2.7 bpw" ;break ; 65case LLAMA_FTYPE_MOSTLY_IQ3_XS :name = LLAMA_FTYPE_PREFIX "IQ3_XS - 3.3 bpw" ;break ; 66case LLAMA_FTYPE_MOSTLY_IQ3_XXS :name = LLAMA_FTYPE_PREFIX "IQ3_XXS - 3.0625 bpw" ;break ; 67case LLAMA_FTYPE_MOSTLY_IQ1_S :name = LLAMA_FTYPE_PREFIX "IQ1_S - 1.5625 bpw" ;break ; 68case LLAMA_FTYPE_MOSTLY_IQ1_M :name = LLAMA_FTYPE_PREFIX "IQ1_M - 1.75 bpw" ;break ; 69case LLAMA_FTYPE_MOSTLY_IQ4_NL :name = LLAMA_FTYPE_PREFIX "IQ4_NL - 4.5 bpw" ;break ; 70case LLAMA_FTYPE_MOSTLY_IQ4_XS :name = LLAMA_FTYPE_PREFIX "IQ4_XS - 4.25 bpw" ;break ; 71case LLAMA_FTYPE_MOSTLY_IQ3_S :name = LLAMA_FTYPE_PREFIX "IQ3_S - 3.4375 bpw" ;break ; 72case LLAMA_FTYPE_MOSTLY_IQ3_M :name = LLAMA_FTYPE_PREFIX "IQ3_S mix - 3.66 bpw" ;break ; 73default :name = LLAMA_FTYPE_PREFIX "unknown, may not work" ;break ; 74 } 75return (ftype & LLAMA_FTYPE_GUESSED ) ?name :name + guessed_prefix_len ; 76} 77 78#undef LLAMA_FTYPE_PREFIX 79 80// return a list of splits for a given path 81// for example, given "<name>-00002-of-00004.gguf", returns list of all 4 splits 82static std::vector < std::string > llama_get_list_splits (const std::string & path ,const int idx ,const int n_split ) { 83 std::vector < std::string > paths ; 84 std::string split_prefix ; 85 std::vector < char > buf (llama_path_max (),0 ); 86 87 { 88int ret = llama_split_prefix (buf .data (),buf .size (),path .c_str (),idx ,n_split ); 89if (!ret ) { 90throw std::runtime_error (format ("invalid split file name: %s" ,path .c_str ())); 91 } 92split_prefix = std::string (buf .data (),ret ); 93 } 94 95if (split_prefix .empty ()) { 96throw std::runtime_error (format ("invalid split file: %s" ,path .c_str ())); 97 } 98 99for (int idx = 0 ;idx < n_split ;++ idx ) { 100int ret = llama_split_path (buf .data (),buf .size (),split_prefix .c_str (),idx ,n_split ); 101paths .push_back (std::string (buf .data (),ret )); 102 } 103 104return paths ; 105} 106 107namespace GGUFMeta { 108template < typename T ,gguf_type gt_ ,T (* gfun )(const gguf_context * ,const int64_t )> 109struct GKV_Base_Type { 110static constexpr gguf_type gt = gt_ ; 111 112static T getter (const gguf_context * ctx ,const int kid ) { 113return gfun (ctx ,kid ); 114 } 115 }; 116 117template < typename T > struct GKV_Base ; 118 119template <> struct GKV_Base < bool > :GKV_Base_Type < bool ,GGUF_TYPE_BOOL ,gguf_get_val_bool > {}; 120template <> struct GKV_Base < uint8_t > :GKV_Base_Type < uint8_t ,GGUF_TYPE_UINT8 ,gguf_get_val_u8 > {}; 121template <> struct GKV_Base < uint16_t > :GKV_Base_Type < uint16_t ,GGUF_TYPE_UINT16 ,gguf_get_val_u16 > {}; 122template <> struct GKV_Base < uint32_t > :GKV_Base_Type < uint32_t ,GGUF_TYPE_UINT32 ,gguf_get_val_u32 > {}; 123template <> struct GKV_Base < uint64_t > :GKV_Base_Type < uint64_t ,GGUF_TYPE_UINT64 ,gguf_get_val_u64 > {}; 124template <> struct GKV_Base < int8_t > :GKV_Base_Type < int8_t ,GGUF_TYPE_INT8 ,gguf_get_val_i8 > {}; 125template <> struct GKV_Base < int16_t > :GKV_Base_Type < int16_t ,GGUF_TYPE_INT16 ,gguf_get_val_i16 > {}; 126template <> struct GKV_Base < int32_t > :GKV_Base_Type < int32_t ,GGUF_TYPE_INT32 ,gguf_get_val_i32 > {}; 127template <> struct GKV_Base < int64_t > :GKV_Base_Type < int64_t ,GGUF_TYPE_INT64 ,gguf_get_val_i64 > {}; 128template <> struct GKV_Base < float > :GKV_Base_Type < float ,GGUF_TYPE_FLOAT32 ,gguf_get_val_f32 > {}; 129template <> struct GKV_Base < double > :GKV_Base_Type < double ,GGUF_TYPE_FLOAT64 ,gguf_get_val_f64 > {}; 130template <> struct GKV_Base < const char *> :GKV_Base_Type < const char * ,GGUF_TYPE_STRING ,gguf_get_val_str > {}; 131 132template <> struct GKV_Base < std::string > { 133static constexpr gguf_type gt = GGUF_TYPE_STRING ; 134 135static std::string getter (const gguf_context * ctx ,const int kid ) { 136return gguf_get_val_str (ctx ,kid ); 137 } 138 }; 139 140struct ArrayInfo { 141const gguf_type gt ; 142const size_t length ; 143const void * data ; 144 }; 145 146template <> struct GKV_Base < ArrayInfo > { 147public : 148static constexpr gguf_type gt = GGUF_TYPE_ARRAY ; 149static ArrayInfo getter (const gguf_context * ctx ,const int k ) { 150const enum gguf_type arr_type = gguf_get_arr_type (ctx ,k ); 151return ArrayInfo { 152arr_type , 153gguf_get_arr_n (ctx ,k ), 154arr_type == GGUF_TYPE_STRING ?nullptr :gguf_get_arr_data (ctx ,k ), 155 }; 156 } 157 }; 158 159template < typename T > 160class GKV :public GKV_Base < T > { 161GKV ()= delete ; 162 163public : 164static T get_kv (const gguf_context * ctx ,const int k ) { 165const enum gguf_type kt = gguf_get_kv_type (ctx ,k ); 166 167if (kt != GKV ::gt ) { 168throw std::runtime_error (format ("key %s has wrong type %s but expected type %s" , 169gguf_get_key (ctx ,k ),gguf_type_name (kt ),gguf_type_name (GKV ::gt ))); 170 } 171return GKV ::getter (ctx ,k ); 172 } 173 174static const char * override_type_to_str (const llama_model_kv_override_type ty ) { 175switch (ty ) { 176case LLAMA_KV_OVERRIDE_TYPE_BOOL :return "bool" ; 177case LLAMA_KV_OVERRIDE_TYPE_INT :return "int" ; 178case LLAMA_KV_OVERRIDE_TYPE_FLOAT :return "float" ; 179case LLAMA_KV_OVERRIDE_TYPE_STR :return "str" ; 180 } 181return "unknown" ; 182 } 183 184static bool validate_override (const llama_model_kv_override_type expected_type ,const struct llama_model_kv_override * ovrd ) { 185if (!ovrd ) {return false; } 186if (ovrd -> tag == expected_type ) { 187LLAMA_LOG_INFO ("%s: Using metadata override (%5s) '%s' = " , 188__func__ ,override_type_to_str (ovrd -> tag ),ovrd -> key ); 189switch (ovrd -> tag ) { 190case LLAMA_KV_OVERRIDE_TYPE_BOOL : { 191LLAMA_LOG_INFO ("%s\n" ,ovrd -> val_bool ?"true" :"false" ); 192 }break ; 193case LLAMA_KV_OVERRIDE_TYPE_INT : { 194LLAMA_LOG_INFO ("%" PRId64 "\n" ,ovrd -> val_i64 ); 195 }break ; 196case LLAMA_KV_OVERRIDE_TYPE_FLOAT : { 197LLAMA_LOG_INFO ("%.6f\n" ,ovrd -> val_f64 ); 198 }break ; 199case LLAMA_KV_OVERRIDE_TYPE_STR : { 200LLAMA_LOG_INFO ("%s\n" ,ovrd -> val_str ); 201 }break ; 202default : 203// Shouldn't be possible to end up here, but just in case... 204throw std::runtime_error ( 205format ("Unsupported attempt to override %s type for metadata key %s\n" , 206override_type_to_str (ovrd -> tag ),ovrd -> key )); 207 } 208return true; 209 } 210LLAMA_LOG_WARN ("%s: Warning: Bad metadata override type for key '%s', expected %s but got %s\n" , 211__func__ ,ovrd -> key ,override_type_to_str (expected_type ),override_type_to_str (ovrd -> tag )); 212return false; 213 } 214 215template < typename OT > 216static typename std::enable_if < std::is_same < OT ,bool > ::value ,bool > ::type 217try_override (OT & target ,const struct llama_model_kv_override * ovrd ) { 218if (validate_override (LLAMA_KV_OVERRIDE_TYPE_BOOL ,ovrd )) { 219target = ovrd -> val_bool ; 220return true; 221 } 222return false; 223 } 224 225template < typename OT > 226static typename std::enable_if < !std::is_same < OT ,bool > ::value && std::is_integral < OT > ::value ,bool > ::type 227try_override (OT & target ,const struct llama_model_kv_override * ovrd ) { 228if (validate_override (LLAMA_KV_OVERRIDE_TYPE_INT ,ovrd )) { 229target = ovrd -> val_i64 ; 230return true; 231 } 232return false; 233 } 234 235template < typename OT > 236static typename std::enable_if < std::is_floating_point < OT > ::value ,bool > ::type 237try_override (T & target ,const struct llama_model_kv_override * ovrd ) { 238if (validate_override (LLAMA_KV_OVERRIDE_TYPE_FLOAT ,ovrd )) { 239target = ovrd -> val_f64 ; 240return true; 241 } 242return false; 243 } 244 245template < typename OT > 246static typename std::enable_if < std::is_same < OT , std::string > ::value ,bool > ::type 247try_override (T & target ,const struct llama_model_kv_override * ovrd ) { 248if (validate_override (LLAMA_KV_OVERRIDE_TYPE_STR ,ovrd )) { 249target = ovrd -> val_str ; 250return true; 251 } 252return false; 253 } 254 255static bool set (const gguf_context * ctx ,const int k ,T & target ,const struct llama_model_kv_override * ovrd = nullptr ) { 256if (try_override < T > (target ,ovrd )) { 257return true; 258 } 259if (k < 0 ) {return false; } 260target = get_kv (ctx ,k ); 261return true; 262 } 263 264static bool set (const gguf_context * ctx ,const char * key ,T & target ,const struct llama_model_kv_override * ovrd = nullptr ) { 265return set (ctx ,gguf_find_key (ctx ,key ),target ,ovrd ); 266 } 267 268static bool set (const gguf_context * ctx ,const std::string & key ,T & target ,const struct llama_model_kv_override * ovrd = nullptr ) { 269return set (ctx ,key .c_str (),target ,ovrd ); 270 } 271 }; 272} 273 274template < typename T > 275typename std::enable_if < std::is_integral < T > ::value ,bool > ::type 276 llama_model_loader::get_arr_n (const std::string & key ,T & result ,bool required ) { 277const int kid = gguf_find_key (metadata ,key .c_str ()); 278 279if (kid < 0 ) { 280if (required ) { 281throw std::runtime_error (format ("key not found in model: %s" ,key .c_str ())); 282 } 283return false; 284 } 285 286struct GGUFMeta ::ArrayInfo arr_info = 287GGUFMeta ::GKV < GGUFMeta ::ArrayInfo > ::get_kv (metadata ,kid ); 288 289 290result = arr_info .length ; 291return true; 292 } 293 294template < typename T > 295typename std::enable_if < std::is_integral < T > ::value ,bool > ::type 296 llama_model_loader::get_arr_n (enum llm_kv kid ,T & result ,bool required ) { 297return get_arr_n (llm_kv (kid ),result ,required ); 298 } 299 300template bool llama_model_loader::get_arr_n (enum llm_kv kid ,uint32_t & result ,bool required ); 301template std::enable_if < std::is_integral < uint32_t > ::value ,bool > ::type 302 llama_model_loader::get_arr_n < uint32_t > (const std::string & key ,uint32_t & result ,bool required ); 303 304template < typename T > 305bool llama_model_loader::get_arr (const std::string & key , std::vector < T > & result ,bool required ) { 306const gguf_context * ctx = metadata ; 307const int kid = gguf_find_key (ctx ,key .c_str ()); 308 309if (kid < 0 || gguf_get_kv_type (ctx ,kid )!= GGUF_TYPE_ARRAY ) { 310if (required ) { 311throw std::runtime_error (format ("array key not found in model: %s" ,key .c_str ())); 312 } 313return false; 314 } 315 316struct GGUFMeta ::ArrayInfo arr_info = 317GGUFMeta ::GKV < GGUFMeta ::ArrayInfo > ::get_kv (ctx ,kid ); 318 319bool type_ok = false; 320switch (arr_info .gt ) { 321case GGUF_TYPE_UINT32 : 322case GGUF_TYPE_INT32 :type_ok = (std::is_same < T ,int32_t > ::value )|| 323 (std::is_same < T ,uint32_t > ::value );break ; 324case GGUF_TYPE_UINT64 :type_ok = (std::is_same < T ,uint64_t > ::value );break ; 325case GGUF_TYPE_FLOAT32 :type_ok = (std::is_same < T ,float > ::value );break ; 326case GGUF_TYPE_STRING :type_ok = (std::is_same < T , std::string > ::value );break ; 327default : 328throw std::runtime_error (format ("%s is not a string/float32/uint32/int32/uint64 array" ,key .c_str ())); 329 } 330if (!type_ok ) { 331throw std::runtime_error (format ("%s has wrong array element type %s" ,key .c_str (),gguf_type_name (arr_info .gt ))); 332 } 333 334if constexpr (std::is_same < T , std::string > ::value ) { 335const size_t n_items = gguf_get_arr_n (ctx ,kid ); 336result .clear (); 337 338for (size_t i = 0 ;i < n_items ;i ++ ) { 339const T value = gguf_get_arr_str (ctx ,kid ,i ); 340result .emplace_back (value ); 341 } 342 }else { 343result .resize (arr_info .length ); 344result .assign ((const T * )arr_info .data , (const T * )arr_info .data + arr_info .length ); 345 } 346 347return true; 348 } 349 350template < typename T ,size_t N_MAX > 351bool llama_model_loader::get_arr (const std::string & key , std::array < T ,N_MAX > & result ,bool required ) { 352const gguf_context * ctx = metadata ; 353const int kid = gguf_find_key (ctx ,key .c_str ()); 354 355if (kid < 0 || gguf_get_kv_type (ctx ,kid )!= GGUF_TYPE_ARRAY ) { 356if (required ) { 357throw std::runtime_error (format ("array key not found in model: %s" ,key .c_str ())); 358 } 359return false; 360 } 361 362struct GGUFMeta ::ArrayInfo arr_info = 363GGUFMeta ::GKV < GGUFMeta ::ArrayInfo > ::get_kv (ctx ,kid ); 364 365bool type_ok = false; 366switch (arr_info .gt ) { 367case GGUF_TYPE_BOOL : 368case GGUF_TYPE_UINT32 : 369case GGUF_TYPE_INT32 :type_ok = (std::is_same < T ,int32_t > ::value )|| 370 (std::is_same < T ,uint32_t > ::value );break ; 371case GGUF_TYPE_UINT64 :type_ok = (std::is_same < T ,uint64_t > ::value );break ; 372case GGUF_TYPE_FLOAT32 :type_ok = (std::is_same < T ,float > ::value );break ; 373case GGUF_TYPE_STRING :type_ok = (std::is_same < T , std::string > ::value );break ; 374default : 375throw std::runtime_error (format ("%s is not a string/float32/uint32/int32/uint64 array" ,key .c_str ())); 376 } 377if (!type_ok ) { 378throw std::runtime_error (format ("%s has wrong array element type %s" ,key .c_str (),gguf_type_name (arr_info .gt ))); 379 } 380 381if (arr_info .length > N_MAX ) { 382throw std::runtime_error (format ("array length %u for key %s exceeds max %u" , (uint32_t )arr_info .length ,key .c_str (), (uint32_t )N_MAX )); 383 } 384 385if constexpr (std::is_same < T , std::string > ::value ) { 386const size_t n_items = gguf_get_arr_n (ctx ,kid ); 387 388for (size_t i = 0 ;i < n_items ;i ++ ) { 389const T value = gguf_get_arr_str (ctx ,kid ,i ); 390result [i ]= value ; 391 } 392 }else { 393if (arr_info .gt == GGUF_TYPE_BOOL ) { 394const int8_t * values = (const int8_t * )arr_info .data ; 395 std::transform (values ,values + arr_info .length ,result .begin (), [](int8_t x ) { 396return static_cast < T > (x != 0 ); 397 }); 398 }else { 399 std::copy ((const T * )arr_info .data , (const T * )arr_info .data + arr_info .length ,result .begin ()); 400 } 401 } 402 403return true; 404 } 405 406template < typename T > 407bool llama_model_loader::get_arr (enum llm_kv kid ,T & result ,bool required ) { 408return get_arr (llm_kv (kid ),result ,required ); 409 } 410 411template bool llama_model_loader::get_arr < std::vector < std::string >> (enum llm_kv kid , std::vector < std::string > & result ,bool required ); 412template bool llama_model_loader::get_arr < std::array < int32_t ,512 >> (enum llm_kv kid , std::array < int32_t ,512 > & result ,bool required ); 413template bool llama_model_loader::get_arr < std::vector < int32_t >> (enum llm_kv kid , std::vector < int32_t > & result ,bool required ); 414template bool llama_model_loader::get_arr < std::array < uint32_t ,LLAMA_MAX_LAYERS >> (enum llm_kv kid , std::array < uint32_t ,LLAMA_MAX_LAYERS > & result ,bool required ); 415template bool llama_model_loader::get_arr < std::vector < uint32_t >> (enum llm_kv kid , std::vector < uint32_t > & result ,bool required ); 416template bool llama_model_loader::get_arr < std::array < uint64_t ,LLAMA_MAX_PLE_NGRAM >> (enum llm_kv kid , std::array < uint64_t ,LLAMA_MAX_PLE_NGRAM > & result ,bool required ); 417template bool llama_model_loader::get_arr < std::array < uint64_t ,LLAMA_MAX_PLE_HEADS >> (enum llm_kv kid , std::array < uint64_t ,LLAMA_MAX_PLE_HEADS > & result ,bool required ); 418 419template < typename T > 420bool llama_model_loader::get_key (const std::string & key ,T & result ,bool required ) { 421auto it = kv_overrides .find (key ); 422 423const struct llama_model_kv_override * override = 424it != kv_overrides .end () ?& it -> second :nullptr ; 425 426const bool found = GGUFMeta ::GKV < T > ::set (metadata ,key ,result ,override ); 427 428if (required && !found ) { 429throw std::runtime_error (format ("key not found in model: %s" ,key .c_str ())); 430 } 431 432return found ; 433 } 434 435template < typename T > 436bool llama_model_loader::get_key (enum llm_kv kid ,T & result ,bool required ) { 437return get_key (llm_kv (kid ),result ,required ); 438 } 439 440template bool llama_model_loader::get_key < bool > (enum llm_kv kid ,bool & result ,bool required ); 441template bool llama_model_loader::get_key < float > (enum llm_kv kid ,float & result ,bool required ); 442template bool llama_model_loader::get_key < uint32_t > (enum llm_kv kid ,uint32_t & result ,bool required ); 443template bool llama_model_loader::get_key < std::string > (enum llm_kv kid , std::string & result ,bool required ); 444 445template <> 446bool llama_model_loader::get_key (enum llm_kv kid ,enum llama_pooling_type & result ,bool required ) { 447uint32_t tmp ; 448const bool found = get_key (kid ,tmp ,required ); 449if (found ) { 450result = (enum llama_pooling_type )tmp ; 451 }else { 452result = LLAMA_POOLING_TYPE_UNSPECIFIED ; 453 } 454return found ; 455 } 456 457// get array of n <= N_MAX elements, or a single element repeated n times 458template < typename T ,size_t N_MAX > 459bool llama_model_loader::get_key_or_arr (const std::string & key , std::array < T ,N_MAX > & result ,uint32_t n ,bool required ) { 460const int kid = gguf_find_key (metadata ,key .c_str ()); 461 462if (kid < 0 ) { 463if (required ) { 464throw std::runtime_error (format ("key not found in model: %s" ,key .c_str ())); 465 } 466return false; 467 } 468 469if (n > N_MAX ) { 470throw std::runtime_error (format ("n > N_MAX: %u > %u for key %s" ,n , (uint32_t )N_MAX ,key .c_str ())); 471 } 472 473if (gguf_get_kv_type (metadata ,kid )== GGUF_TYPE_ARRAY ) { 474struct GGUFMeta ::ArrayInfo arr_info = 475GGUFMeta ::GKV < GGUFMeta ::ArrayInfo > ::get_kv (metadata ,kid ); 476 477if (n != arr_info .length ) { 478throw std::runtime_error (format ("key %s has wrong array length; expected %u, got %u" ,key .c_str (),n , (uint32_t )arr_info .length )); 479 } 480 481return get_arr (key ,result ,required ); 482 } 483 484T value ; 485 486bool ok = get_key (key ,value ,required ); 487if (!ok ) { 488return false; 489 } 490 491for (uint32_t i = 0 ;i < n ;i ++ ) { 492result [i ]= value ; 493 } 494 495return true; 496 } 497 498template < typename T > 499bool llama_model_loader::get_key_or_arr (enum llm_kv kid ,T & result ,uint32_t n ,bool required ) { 500return get_key_or_arr (llm_kv (kid ),result ,n ,required ); 501 } 502 503bool llama_model_loader::get_key_or_arr (enum llm_kv kid ,uint32_t & result ,bool required ) { 504const std::string key = llm_kv (kid ); 505 506const int id = gguf_find_key (metadata ,key .c_str ()); 507 508if (id < 0 ) { 509if (required ) { 510throw std::runtime_error (format ("key not found in model: %s" ,key .c_str ())); 511 } 512return false; 513 } 514 515// throw and error if type is an array 516if (gguf_get_kv_type (metadata ,id )== GGUF_TYPE_ARRAY ) { 517if (required ) { 518throw std::runtime_error (format ("expected scalar, found array for key: %s" ,key .c_str ())); 519 } 520return false; 521 } 522 523return get_key (key ,result ,required ); 524 } 525 526// TODO: this is not very clever - figure out something better 527template bool llama_model_loader::get_key_or_arr < std::array < int ,4 >> (enum llm_kv kid , std::array < int ,4 > & result ,uint32_t n ,bool required ); 528template bool llama_model_loader::get_key_or_arr < std::array < uint32_t ,512 >> (enum llm_kv kid , std::array < uint32_t ,512 > & result ,uint32_t n ,bool required ); 529template bool llama_model_loader::get_key_or_arr < std::array < float ,512 >> (enum llm_kv kid , std::array < float ,512 > & result ,uint32_t n ,bool required ); 530 531 532llama_model_loader::llama_model_loader ( 533struct gguf_context * meta , 534llama_model_set_tensor_data_t set_tensor_data , 535void * set_tensor_data_ud , 536const std::string & fname , 537 std::vector < std::string > & splits , 538FILE * file , 539llama_load_mode load_mode , 540bool check_tensors , 541bool no_alloc , 542bool load_mtp , 543const llama_model_kv_override * param_overrides_p , 544const llama_model_tensor_buft_override * param_tensor_buft_overrides_p ) 545 :metadata (meta ),set_tensor_data (set_tensor_data ),set_tensor_data_ud (set_tensor_data_ud ) { 546int trace = 0 ; 547if (getenv ("LLAMA_TRACE" )) { 548trace = atoi (getenv ("LLAMA_TRACE" )); 549 } 550 551if (param_overrides_p != nullptr ) { 552for (const struct llama_model_kv_override * p = param_overrides_p ;p -> key [0 ]!= 0 ;p ++ ) { 553kv_overrides .insert ({std::string (p -> key ),* p }); 554 } 555 } 556 557tensor_buft_overrides = param_tensor_buft_overrides_p ; 558 559this -> use_mmap = load_mode == LLAMA_LOAD_MODE_MMAP || load_mode == LLAMA_LOAD_MODE_MMAP_MLOCK || load_mode == LLAMA_LOAD_MODE_AUTO ; 560this -> use_direct_io = load_mode == LLAMA_LOAD_MODE_DIRECT_IO ; 561 562if (!fname .empty ()) { 563// Load the main GGUF 564struct ggml_context * ctx = NULL ; 565struct gguf_init_params params = { 566/*.no_alloc = */ true, 567/*.ctx = */ & ctx , 568 }; 569 570metadata_ptr .reset (gguf_init_from_file (fname .c_str (),params )); 571metadata = metadata_ptr .get (); 572if (metadata == nullptr ) { 573throw std::runtime_error (format ("%s: failed to load model from %s" ,__func__ ,fname .c_str ())); 574 } 575 576get_key (llm_kv (LLM_KV_GENERAL_ARCHITECTURE ),arch_name , false); 577llm_kv = LLM_KV (llm_arch_from_string (arch_name )); 578 579files .emplace_back (new llama_file (fname .c_str (),"rb" ,use_direct_io )); 580contexts .emplace_back (ctx ); 581 582// Save tensors data offset of the main file. 583// For subsidiary files, `meta` tensor data offset must not be used, 584// so we build a unified tensors index for weights. 585for (ggml_tensor * cur = ggml_get_first_tensor (ctx );cur ;cur = ggml_get_next_tensor (ctx ,cur )) { 586 std::string tensor_name = std::string (cur -> name ); 587// make sure there is no duplicated tensor names 588if (weights_map .find (tensor_name )!= weights_map .end ()) { 589throw std::runtime_error (format ("invalid model: tensor '%s' is duplicated" ,ggml_get_name (cur ))); 590 } 591n_elements += ggml_nelements (cur ); 592n_bytes += ggml_nbytes (cur ); 593weights_map .emplace (tensor_name ,llama_tensor_weight (files .back ().get (),0 ,metadata ,cur )); 594 } 595uint16_t n_split = 0 ; 596get_key (llm_kv (LLM_KV_SPLIT_COUNT ),n_split , false); 597 598// Load additional GGML contexts 599if (n_split > 1 ) { 600// make sure the main file is loaded first 601uint16_t idx = 0 ; 602const std::string kv_split_no = llm_kv (LLM_KV_SPLIT_NO ); 603get_key (kv_split_no ,idx ); 604if (idx != 0 ) { 605throw std::runtime_error (format ("illegal split file idx: %d (file: %s), model must be loaded with the first split" ,idx ,fname .c_str ())); 606 } 607 608// generate list of splits if needed 609if (splits .empty ()) { 610splits = llama_get_list_splits (fname ,idx ,n_split ); 611 } 612 613// in case user give a custom list of splits, check if it matches the expected number 614if (n_split != (uint16_t )splits .size ()) { 615throw std::runtime_error (format ("invalid split count, given: %zu splits, but expected %d" ,splits .size (),n_split )); 616 } 617 618if (trace > 0 ) { 619LLAMA_LOG_INFO ("%s: loading additional %d GGUFs\n" ,__func__ ,n_split ); 620 } 621 622// load other splits 623for (idx = 1 ;idx < n_split ;idx ++ ) { 624const char * fname_split = splits [idx ].c_str (); 625 626struct gguf_init_params split_params = { 627/*.no_alloc = */ true, 628/*.ctx = */ & ctx , 629 }; 630gguf_context_ptr ctx_gguf {gguf_init_from_file (fname_split ,split_params ) }; 631if (!ctx_gguf ) { 632throw std::runtime_error (format ("%s: failed to load GGUF split from %s" ,__func__ ,fname_split )); 633 } 634 635// check idx 636 { 637const int kid = gguf_find_key (ctx_gguf .get (),kv_split_no .c_str ()); 638if (kid < 0 ) { 639throw std::runtime_error (format ("missing key %s in GGUF split %s" ,kv_split_no .c_str (),fname_split )); 640 } 641int idx_gguf = gguf_get_val_u16 (ctx_gguf .get (),kid ); 642if (idx_gguf != idx ) { 643throw std::runtime_error (format ("invalid split file idx: %d (file: %s), expected %d" ,idx_gguf ,fname_split ,idx )); 644 } 645 } 646 647files .emplace_back (new llama_file (fname_split ,"rb" ,use_direct_io )); 648contexts .emplace_back (ctx ); 649 650// Save tensors data offset info of the shard. 651for (ggml_tensor * cur = ggml_get_first_tensor (ctx );cur ;cur = ggml_get_next_tensor (ctx ,cur )) { 652 std::string tensor_name = std::string (cur -> name ); 653// make sure there is no duplicated tensor names 654if (weights_map .find (tensor_name )!= weights_map .end ()) { 655throw std::runtime_error (format ("invalid model: tensor '%s' is duplicated" ,ggml_get_name (cur ))); 656 } 657n_elements += ggml_nelements (cur ); 658n_bytes += ggml_nbytes (cur ); 659weights_map .emplace (tensor_name ,llama_tensor_weight (files .back ().get (),idx ,ctx_gguf .get (),cur )); 660 } 661 } 662 663get_key (llm_kv (LLM_KV_SPLIT_TENSORS_COUNT ),n_tensors ); 664 665// sanity check 666 { 667const int n_tensors_loaded = (int )weights_map .size (); 668if (n_tensors != n_tensors_loaded ) { 669throw std::runtime_error (format ("corrupted model: %d tensors expected but %d found" ,n_tensors ,n_tensors_loaded )); 670 } 671 } 672 673LLAMA_LOG_INFO ("%s: additional %d GGUFs metadata loaded.\n" ,__func__ ,n_split - 1 ); 674 } 675 }else if (file != nullptr ) { 676struct ggml_context * ctx = NULL ; 677struct gguf_init_params params = { 678/*.no_alloc = */ true, 679/*.ctx = */ & ctx , 680 }; 681 682metadata_ptr .reset (gguf_init_from_file_ptr (file ,params )); 683metadata = metadata_ptr .get (); 684if (metadata == nullptr ) { 685throw std::runtime_error (format ("%s: failed to load model from file pointer" ,__func__ )); 686 } 687 688get_key (llm_kv (LLM_KV_GENERAL_ARCHITECTURE ),arch_name , false); 689llm_kv = LLM_KV (llm_arch_from_string (arch_name )); 690 691files .emplace_back (new llama_file (file )); 692contexts .emplace_back (ctx ); 693 694// Save tensors data offset info of the main file. 695for (ggml_tensor * cur = ggml_get_first_tensor (ctx );cur ;cur = ggml_get_next_tensor (ctx ,cur )) { 696 std::string tensor_name = std::string (cur -> name ); 697// make sure there is no duplicated tensor names 698if (weights_map .find (tensor_name )!= weights_map .end ()) { 699throw std::runtime_error (format ("invalid model: tensor '%s' is duplicated" ,ggml_get_name (cur ))); 700 } 701n_elements += ggml_nelements (cur ); 702n_bytes += ggml_nbytes (cur ); 703weights_map .emplace (tensor_name ,llama_tensor_weight (files .back ().get (),0 ,metadata ,cur )); 704 } 705 }else { 706get_key (llm_kv (LLM_KV_GENERAL_ARCHITECTURE ),arch_name , false); 707llm_kv = LLM_KV (llm_arch_from_string (arch_name )); 708 } 709 710n_kv = gguf_get_n_kv (metadata ); 711n_tensors = weights_map .size (); 712 713fver = (enum llama_fver )gguf_get_version (metadata ); 714 715LLAMA_LOG_INFO ("%s: loaded meta data with %d key-value pairs and %d tensors from %s (version %s)\n" , 716__func__ ,n_kv ,n_tensors ,fname .empty () ?"(file*)" :fname .c_str (),llama_file_version_name (fver )); 717 718// determine file type based on the number of tensors for each quantization and print meta data 719// TODO: make optional 720 { 721 std::map < enum ggml_type ,uint32_t > n_type ; 722 723uint32_t n_type_max = 0 ; 724enum ggml_type type_max = GGML_TYPE_F32 ; 725 726for (const auto & it :weights_map ) { 727const llama_tensor_weight & w = it .second ; 728const ggml_tensor * tensor = w .tensor ; 729 730enum ggml_type type = tensor -> type ; 731 732n_type [type ]++ ; 733 734if (n_type_max < n_type [type ]) { 735n_type_max = n_type [type ]; 736type_max = type ; 737 } 738 739if (trace > 0 ) { 740const uint16_t sid = w .idx ; 741LLAMA_LOG_INFO ("%s: - tensor split %2d: %32s %-8s [ %s ] %8.2f MiB\n" ,__func__ , 742sid ,ggml_get_name (tensor ),ggml_type_name (type ),llama_format_tensor_shape (tensor ).c_str (), 743ggml_nbytes (tensor )/1024.0f /1024.0f ); 744 } 745 } 746 747switch (type_max ) { 748case GGML_TYPE_F32 :ftype = LLAMA_FTYPE_ALL_F32 ;break ; 749case GGML_TYPE_F16 :ftype = LLAMA_FTYPE_MOSTLY_F16 ;break ; 750case GGML_TYPE_BF16 :ftype = LLAMA_FTYPE_MOSTLY_BF16 ;break ; 751case GGML_TYPE_Q4_0 :ftype = LLAMA_FTYPE_MOSTLY_Q4_0 ;break ; 752case GGML_TYPE_Q4_1 :ftype = LLAMA_FTYPE_MOSTLY_Q4_1 ;break ; 753case GGML_TYPE_Q5_0 :ftype = LLAMA_FTYPE_MOSTLY_Q5_0 ;break ; 754case GGML_TYPE_Q5_1 :ftype = LLAMA_FTYPE_MOSTLY_Q5_1 ;break ; 755case GGML_TYPE_Q8_0 :ftype = LLAMA_FTYPE_MOSTLY_Q8_0 ;break ; 756case GGML_TYPE_Q2_K :ftype = LLAMA_FTYPE_MOSTLY_Q2_K ;break ; 757case GGML_TYPE_Q3_K :ftype = LLAMA_FTYPE_MOSTLY_Q3_K_M ;break ; 758case GGML_TYPE_Q4_K :ftype = LLAMA_FTYPE_MOSTLY_Q4_K_M ;break ; 759case GGML_TYPE_Q5_K :ftype = LLAMA_FTYPE_MOSTLY_Q5_K_M ;break ; 760case GGML_TYPE_Q6_K :ftype = LLAMA_FTYPE_MOSTLY_Q6_K ;break ; 761case GGML_TYPE_TQ1_0 :ftype = LLAMA_FTYPE_MOSTLY_TQ1_0 ;break ; 762case GGML_TYPE_TQ2_0 :ftype = LLAMA_FTYPE_MOSTLY_TQ2_0 ;break ; 763case GGML_TYPE_IQ2_XXS :ftype = LLAMA_FTYPE_MOSTLY_IQ2_XXS ;break ; 764case GGML_TYPE_IQ2_XS :ftype = LLAMA_FTYPE_MOSTLY_IQ2_XS ;break ; 765case GGML_TYPE_IQ2_S :ftype = LLAMA_FTYPE_MOSTLY_IQ2_S ;break ; 766case GGML_TYPE_IQ3_XXS :ftype = LLAMA_FTYPE_MOSTLY_IQ3_XXS ;break ; 767case GGML_TYPE_IQ1_S :ftype = LLAMA_FTYPE_MOSTLY_IQ1_S ;break ; 768case GGML_TYPE_IQ1_M :ftype = LLAMA_FTYPE_MOSTLY_IQ1_M ;break ; 769case GGML_TYPE_IQ4_NL :ftype = LLAMA_FTYPE_MOSTLY_IQ4_NL ;break ; 770case GGML_TYPE_IQ4_XS :ftype = LLAMA_FTYPE_MOSTLY_IQ4_XS ;break ; 771case GGML_TYPE_IQ3_S :ftype = LLAMA_FTYPE_MOSTLY_IQ3_S ;break ; 772case GGML_TYPE_NVFP4 :ftype = LLAMA_FTYPE_MOSTLY_NVFP4 ;break ; 773case GGML_TYPE_Q1_0 :ftype = LLAMA_FTYPE_MOSTLY_Q1_0 ;break ; 774case GGML_TYPE_Q2_0 :ftype = LLAMA_FTYPE_MOSTLY_Q2_0 ;break ; 775default : 776 { 777LLAMA_LOG_WARN ("%s: unknown type %s\n" ,__func__ ,ggml_type_name (type_max )); 778ftype = LLAMA_FTYPE_ALL_F32 ; 779 }break ; 780 } 781 782// this is a way to mark that we have "guessed" the file type 783ftype = (llama_ftype ) (ftype |LLAMA_FTYPE_GUESSED ); 784 785 { 786uint32_t ftype_val = 0 ; 787if (get_key (LLM_KV_GENERAL_FILE_TYPE ,ftype_val , false)) { 788ftype = (llama_ftype )ftype_val ; 789 } 790 } 791 792LLAMA_LOG_INFO ("%s: Dumping metadata keys/values. Note: KV overrides do not apply in this output.\n" ,__func__ ); 793 794for (int i = 0 ;i < n_kv ;i ++ ) { 795const char * name = gguf_get_key (metadata ,i ); 796const enum gguf_type type = gguf_get_kv_type (metadata ,i ); 797const std::string type_name = 798type == GGUF_TYPE_ARRAY 799 ?format ("%s[%s,%zu]" ,gguf_type_name (type ),gguf_type_name (gguf_get_arr_type (metadata ,i )),gguf_get_arr_n (metadata ,i )) 800 :gguf_type_name (type ); 801 802 std::string value = gguf_kv_to_str (metadata ,i ); 803const size_t MAX_VALUE_LEN = 40 ; 804if (value .size ()> MAX_VALUE_LEN ) { 805value = format ("%s..." ,value .substr (0 ,MAX_VALUE_LEN - 3 ).c_str ()); 806 } 807replace_all (value ,"\n" ,"\\n" ); 808 809LLAMA_LOG_INFO ("%s: - kv %3d: %42s %-16s = %s\n" ,__func__ ,i ,name ,type_name .c_str (),value .c_str ()); 810 } 811 812// print type counts 813for (auto & kv :n_type ) { 814if (kv .second == 0 ) { 815continue ; 816 } 817 818LLAMA_LOG_INFO ("%s: - type %4s: %4d tensors\n" ,__func__ ,ggml_type_name (kv .first ),kv .second ); 819 } 820 } 821 822if (this -> use_mmap && !llama_mmap::SUPPORTED ) { 823LLAMA_LOG_WARN ("%s: mmap is not supported on this platform\n" ,__func__ ); 824this -> use_mmap = false; 825 } 826 827this -> check_tensors = check_tensors ; 828this -> no_alloc = no_alloc ; 829this -> load_mtp = load_mtp ; 830} 831 832std::string llama_model_loader::get_arch_name ()const { 833return arch_name ; 834} 835 836enum llm_arch llama_model_loader::get_arch ()const { 837return llm_kv .arch ; 838} 839 840const llama_model_loader::llama_tensor_weight * llama_model_loader::get_weight (const char * name )const { 841auto pos = weights_map .find (name ); 842if (pos != weights_map .end ()) { 843return & pos -> second ; 844 } 845 846return nullptr ; 847} 848 849const llama_model_loader::llama_tensor_weight & llama_model_loader::require_weight (const char * name )const { 850const llama_tensor_weight * weight = get_weight (name ); 851if (!weight ) { 852throw std::runtime_error (format ("%s: tensor '%s' not found" ,__func__ ,name )); 853 } 854return * weight ; 855} 856 857struct ggml_tensor * llama_model_loader::get_tensor_meta (const char * name )const { 858const auto * weight = get_weight (name ); 859if (!weight ) { 860return nullptr ; 861 } 862return weight -> tensor ; 863} 864 865struct ggml_tensor * llama_model_loader::require_tensor_meta (const std::string & name )const { 866struct ggml_tensor * tensor = get_tensor_meta (name .c_str ()); 867if (!tensor ) { 868throw std::runtime_error (format ("%s: tensor '%s' not found" ,__func__ ,name .c_str ())); 869 } 870return tensor ; 871} 872 873const struct ggml_tensor * llama_model_loader::check_tensor_dims ( 874const std::string & name , 875const std::vector < int64_t > & ne , 876bool required , 877bool allow_reshape )const { 878const struct ggml_tensor * cur = get_tensor_meta (name .c_str ()); 879 880if (cur == NULL ) { 881if (!required ) { 882return NULL ; 883 } 884throw std::runtime_error (format ("%s: tensor '%s' not found" ,__func__ ,name .c_str ())); 885 } 886 887bool is_ok = true; 888 889if (allow_reshape ) { 890// check total number of elements only 891const int64_t ncur = ggml_nelements (cur ); 892int64_t nexp = 1 ; 893for (size_t i = 0 ;i < ne .size ();++ i ) { 894nexp *=ne [i ]; 895 } 896if (ncur != nexp ) { 897is_ok = false; 898 } 899 }else { 900for (size_t i = 0 ;i < GGML_MAX_DIMS ;++ i ) { 901if ((i < ne .size ()&& ne [i ]!= cur -> ne [i ])|| (i >=ne .size ()&& cur -> ne [i ]!= 1 )) { 902is_ok = false; 903break ; 904 } 905 } 906 } 907 908if (!is_ok ) { 909throw std::runtime_error ( 910format ("%s: tensor '%s' has wrong shape; expected %s, got %s" , 911__func__ ,name .c_str (), 912llama_format_tensor_shape (ne ).c_str (), 913llama_format_tensor_shape (cur ).c_str ())); 914 } 915 916return cur ; 917} 918 919// checks if the weight tensor can be used with the specified buffer type and device 920static bool weight_buft_supported (const llama_hparams & hparams ,ggml_tensor * w ,ggml_op op ,ggml_backend_buffer_type_t buft ,ggml_backend_dev_t dev ) { 921GGML_ASSERT (w != nullptr ); 922 923if (op == GGML_OP_NONE ) { 924return true; 925 } 926 927ggml_init_params params = { 928/*.mem_size =*/ ggml_tensor_overhead ()* 8 , 929/*.mem_buffer =*/ NULL , 930/*.no_alloc =*/ true, 931 }; 932ggml_context_ptr ctx_ptr {ggml_init (params ) }; 933if (!ctx_ptr ) { 934throw std::runtime_error (format ("failed to create ggml context" )); 935 } 936ggml_context * ctx = ctx_ptr .get (); 937 938ggml_tensor * op_tensor = nullptr ; 939 940switch (op ) { 941case GGML_OP_GET_ROWS : 942 { 943ggml_tensor * b = ggml_new_tensor_1d (ctx ,GGML_TYPE_I32 ,512 ); 944op_tensor = ggml_get_rows (ctx ,w ,b ); 945 }break ; 946case GGML_OP_MUL_MAT : 947 { 948ggml_tensor * b = ggml_new_tensor_4d (ctx ,GGML_TYPE_F32 ,w -> ne [0 ],512 ,w -> ne [2 ],w -> ne [3 ]); 949op_tensor = ggml_mul_mat (ctx ,w ,b ); 950 }break ; 951case GGML_OP_MUL_MAT_ID : 952 { 953// Used for either MoE expert routing or embedded adapter routing 954const int n_ids_used = hparams .router_layer >=0 ?1 :hparams .n_expert_used_max (); 955GGML_ASSERT (n_ids_used > 0 ); 956ggml_tensor * b = ggml_new_tensor_3d (ctx ,GGML_TYPE_F32 ,w -> ne [0 ],n_ids_used ,512 ); 957ggml_tensor * ids = ggml_new_tensor_2d (ctx ,GGML_TYPE_I32 ,n_ids_used ,512 ); 958op_tensor = ggml_mul_mat_id (ctx ,w ,b ,ids ); 959 }break ; 960case GGML_OP_ADD : 961 { 962ggml_tensor * a = ggml_new_tensor_4d (ctx ,GGML_TYPE_F32 ,w -> ne [0 ],w -> ne [1 ],w -> ne [2 ],w -> ne [3 ]); 963op_tensor = ggml_add (ctx ,a ,w ); 964 }break ; 965case GGML_OP_ADD_ID : 966 { 967const int n_expert_used = hparams .n_expert_used_max (); 968GGML_ASSERT (n_expert_used > 0 ); 969ggml_tensor * a = ggml_new_tensor_3d (ctx ,GGML_TYPE_F32 ,w -> ne [0 ],n_expert_used ,512 ); 970ggml_tensor * c = ggml_new_tensor_2d (ctx ,GGML_TYPE_I32 ,n_expert_used ,512 ); 971op_tensor = ggml_add_id (ctx ,a ,w ,c ); 972 }break ; 973case GGML_OP_MUL : 974 { 975ggml_tensor * a = ggml_new_tensor_4d (ctx ,GGML_TYPE_F32 ,w -> ne [0 ],w -> ne [1 ],w -> ne [2 ],w -> ne [3 ]); 976op_tensor = ggml_mul (ctx ,a ,w ); 977 }break ; 978case GGML_OP_DIV : 979 { 980ggml_tensor * a = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,w -> ne [0 ]); 981op_tensor = ggml_div (ctx ,a ,w ); 982 }break ; 983case GGML_OP_ROPE : 984 { 985const int n_embd_head = hparams .n_embd_head_v (); 986const int n_head = hparams .n_head (); 987ggml_tensor * a = ggml_new_tensor_3d (ctx ,GGML_TYPE_F32 ,n_embd_head ,n_head ,512 ); 988ggml_tensor * b = ggml_new_tensor_1d (ctx ,GGML_TYPE_I32 ,512 ); 989op_tensor = ggml_rope_ext ( 990ctx ,a ,b ,w , 9910 ,0 ,0 ,0 ,0 , 9920 ,0 ,0 ,0 993 ); 994 995 }break ; 996case GGML_OP_SSM_CONV : 997 { 998const int64_t n_seq_tokens = 512 ; 999const int64_t n_seqs = 3 ; 1000ggml_tensor * conv_x = ggml_new_tensor_3d (ctx ,GGML_TYPE_F32 ,w -> ne [0 ]- 1 + n_seq_tokens ,w -> ne [1 ],n_seqs ); 1001op_tensor = ggml_ssm_conv (ctx ,conv_x ,w ); 1002 }break ; 1003case GGML_OP_SSM_SCAN : 1004 { 1005// w is ssm_a, which is used to distinguish Mamba-1 and Mamba-2 1006const int64_t d_state = w -> ne [0 ]== 1 ?hparams .ssm_d_state :w -> ne [0 ]; 1007const int64_t n_head = w -> ne [1 ]; 1008const int64_t head_dim = hparams .ssm_d_inner /n_head ; 1009const int64_t n_group = hparams .ssm_n_group ?hparams .ssm_n_group :1 ; 1010const int64_t n_seq_tokens = 512 ; 1011const int64_t n_seqs = 3 ; 1012ggml_tensor * s = ggml_new_tensor_4d (ctx ,GGML_TYPE_F32 ,d_state ,head_dim ,n_head ,n_seqs ); 1013ggml_tensor * x = ggml_new_tensor_4d (ctx ,GGML_TYPE_F32 ,head_dim ,n_head ,n_seq_tokens ,n_seqs ); 1014ggml_tensor * dt = ggml_new_tensor_3d (ctx ,GGML_TYPE_F32 ,n_head ,n_seq_tokens ,n_seqs ); 1015ggml_tensor * B = ggml_new_tensor_4d (ctx ,GGML_TYPE_F32 ,d_state ,n_group ,n_seq_tokens ,n_seqs ); 1016ggml_tensor * C = ggml_new_tensor_4d (ctx ,GGML_TYPE_F32 ,d_state ,n_group ,n_seq_tokens ,n_seqs ); 1017ggml_tensor * ids = ggml_new_tensor_1d (ctx ,GGML_TYPE_I32 ,n_seqs ); 1018op_tensor = ggml_ssm_scan (ctx ,s ,x ,dt ,w ,B ,C ,ids ,/*K=*/ 1 ); 1019 }break ; 1020case GGML_OP_RWKV_WKV6 : 1021 { 1022// FIXME 1023const int64_t S = 123 ; 1024const int64_t H = 123 ; 1025const int64_t n_tokens = 123 ; 1026const int64_t n_seqs = 123 ; 1027ggml_tensor * k = ggml_new_tensor_3d (ctx ,GGML_TYPE_F32 ,S ,H ,n_tokens ); 1028ggml_tensor * v = ggml_new_tensor_3d (ctx ,GGML_TYPE_F32 ,S ,H ,n_tokens ); 1029ggml_tensor * r = ggml_new_tensor_3d (ctx ,GGML_TYPE_F32 ,S ,H ,n_tokens ); 1030ggml_tensor * tf = w ; 1031ggml_tensor * td = ggml_new_tensor_3d (ctx ,GGML_TYPE_F32 ,S ,H ,n_tokens ); 1032ggml_tensor * state = ggml_new_tensor_4d (ctx ,GGML_TYPE_F32 ,S ,n_seqs ,S ,H ); 1033op_tensor = ggml_rwkv_wkv6 (ctx ,k ,v ,r ,tf ,td ,state ); 1034 }break ; 1035case GGML_OP_IM2COL : 1036 { 1037const int n_embd_inp = hparams .n_embd_inp (); 1038ggml_tensor * b = ggml_new_tensor_4d (ctx ,GGML_TYPE_F32 ,n_embd_inp ,w -> ne [1 ],1 ,1 ); 1039op_tensor = ggml_im2col (ctx ,w ,b ,1 ,0 ,0 ,0 ,1 ,0 , false,GGML_TYPE_F16 ); 1040 }break ; 1041case GGML_OP_SCALE : 1042 { 1043op_tensor = ggml_scale (ctx ,w ,1.0f ); 1044 }break ; 1045default : 1046GGML_ABORT ("%s: missing test for op %s for tensor %s" ,__func__ ,ggml_op_name (op ),w -> name ); 1047 } 1048 1049// create a temporary dummy buffer for the weight so that supports_op can check the buffer type 1050GGML_ASSERT (w -> buffer == nullptr ); 1051w -> buffer = ggml_backend_buft_alloc_buffer (buft ,0 ); 1052bool op_supported = ggml_backend_dev_supports_op (dev ,op_tensor ); 1053ggml_backend_buffer_free (w -> buffer ); 1054w -> buffer = nullptr ; 1055 1056return op_supported ; 1057} 1058 1059// find the first buffer type in the list that can use the tensor 1060static ggml_backend_buffer_type_t select_weight_buft (const llama_hparams & hparams ,ggml_tensor * tensor ,ggml_op op ,const buft_list_t * buft_list ) { 1061GGML_ASSERT (!buft_list -> empty ()); 1062for (const auto & cur :* buft_list ) { 1063ggml_backend_dev_t cur_dev = cur .first ; 1064ggml_backend_buffer_type_t cur_buft = cur .second ; 1065if (weight_buft_supported (hparams ,tensor ,op ,cur_buft ,cur_dev )) { 1066return cur_buft ; 1067 } 1068 } 1069 1070return nullptr ; 1071} 1072 1073ggml_backend_buffer_type_t llama_model_loader::lazy_read::buft () { 1074auto * cpu_dev = ggml_backend_dev_by_type (GGML_BACKEND_DEVICE_TYPE_CPU ); 1075if (!cpu_dev ) { 1076throw std::runtime_error ("no CPU backend found" ); 1077 } 1078return ggml_backend_dev_buffer_type (cpu_dev ); 1079} 1080 1081bool llama_model_loader::lazy_read::add (const std::string & name ,const ggml_tensor * t ,const llama_tensor_weight * w ) { 1082if (mode == LLAMA_LAZY_MODE_OFF ) { 1083return false; 1084 } 1085 1086// do not lazy-read small tensors, it has significant overhead and is not worth it 1087constexpr size_t auto_min_size = 4ull * 1024 * 1024 * 1024 ; 1088if (mode != LLAMA_LAZY_MODE_ON && ggml_nbytes (t ) <=auto_min_size ) { 1089return false; 1090 } 1091 1092if (!llama_mmap::SUPPORTED ) { 1093LLAMA_LOG_WARN ("%s: mmap is not available, so tensor %s (size = %zu MiB) is loaded into RAM in full\n" , 1094__func__ ,name .c_str (),ggml_nbytes (t )/1024 /1024 ); 1095return false; 1096 } 1097 1098if (w ) { 1099ranges [w -> idx ].emplace_back (w -> offs ,w -> offs + ggml_nbytes (t )); 1100tensors .insert (name ); 1101 1102LLAMA_LOG_INFO ("%s: tensor %s (size = %zu MiB) lazy read enabled\n" , 1103__func__ ,name .c_str (),ggml_nbytes (t )/1024 /1024 ); 1104 } 1105 1106return true; 1107} 1108 1109struct ggml_tensor * llama_model_loader::create_tensor ( 1110const llama_hparams & hparams ,const buft_list_t * buft_list_cpu ,const buft_list_t * buft_list_input ,const buft_list_t * buft_list_output , 1111const buft_list_t * buft_list_layer ,const LLM_TN_IMPL & tn ,const std::initializer_list < int64_t > & ne ,int flags ) { 1112// set below, before buft_for_tensor() runs 1113bool is_lazy = false; 1114 1115auto ctx_for_buft = [& ](ggml_backend_buffer_type_t buft )-> ggml_context * { 1116const ctx_key key {buft ,is_lazy }; 1117 1118auto it = ctx_map .find (key ); 1119if (it == ctx_map .end ()) { 1120// one ggml context per buffer type 1121int max_n_tensors = n_tensors ; 1122max_n_tensors += 1 ;// duplicated output tensor 1123max_n_tensors += hparams .n_layer ()* 2 ;// duplicated rope freq tensors 1124if (files .empty ()) { 1125max_n_tensors += hparams .n_layer ()* 256 ;// this should be well above what any model actually uses 1126 } 1127const size_t ctx_size = ggml_tensor_overhead ()* max_n_tensors ; 1128 1129ggml_init_params params = { 1130/*.mem_size =*/ ctx_size , 1131/*.mem_buffer =*/ NULL , 1132/*.no_alloc =*/ true, 1133 }; 1134 1135ggml_context * ctx = ggml_init (params ); 1136if (!ctx ) { 1137throw std::runtime_error (format ("failed to create ggml context" )); 1138 } 1139 1140ctx_map .emplace (key ,ctx ); 1141 1142return ctx ; 1143 } 1144return it -> second .get (); 1145 }; 1146 1147auto buft_for_tensor = [& ](ggml_tensor * t_meta )-> ggml_backend_buffer_type_t { 1148if (!t_meta ) { 1149if (flags & TENSOR_NOT_REQUIRED ) { 1150return nullptr ; 1151 } 1152throw std::runtime_error (format ("missing tensor '%s'" ,tn .str ().c_str ())); 1153 } 1154 1155// some models use the token embedding tensor as the output, but since these are used in different layers and with different ops 1156// the tensor is duplicated 1157// to handle this, we check if the tensor is duplicated, and if so, we assume that it is being loaded as the output tensor 1158llm_tensor tn_tensor = tn .tensor ; 1159if (tn .tensor == LLM_TENSOR_TOKEN_EMBD && (flags & TENSOR_DUPLICATED )) { 1160tn_tensor = LLM_TENSOR_OUTPUT ; 1161 } 1162 1163llm_tensor_info info ; 1164try { 1165info = llm_tensor_info_for (tn_tensor ); 1166 }catch (const std::out_of_range & e ) { 1167throw std::runtime_error (format ("missing tensor info mapping for %s" ,tn .str ().c_str ())); 1168 } 1169 1170// skip unused tensors 1171if (info .op == GGML_OP_NONE || (flags & TENSOR_SKIP )) { 1172const size_t nbytes = ggml_nbytes (t_meta ); 1173LLAMA_LOG_WARN ("model has unused tensor %s (size = %zu bytes) -- ignoring\n" ,tn .str ().c_str (),nbytes ); 1174 1175size_data -= nbytes ; 1176n_created ++ ; 1177 1178return nullptr ; 1179 } 1180 1181// tensors with "bias" suffix are always used with GGML_OP_ADD or GGML_OP_ADD_ID; 1182// embedded-adapter ".lora_a"/".lora_b" tensors are always used with GGML_OP_MUL_MAT_ID 1183ggml_op op ; 1184if (tn .suffix != nullptr && strcmp (tn .suffix ,"bias" )== 0 ) { 1185op = info .op == GGML_OP_MUL_MAT_ID ?GGML_OP_ADD_ID :GGML_OP_ADD ; 1186 }else if (hparams .router_layer >=0 && tn .suffix != nullptr && 1187 (strcmp (tn .suffix ,"lora_a" )== 0 || strcmp (tn .suffix ,"lora_b" )== 0 )) { 1188op = GGML_OP_MUL_MAT_ID ; 1189 }else { 1190op = info .op ; 1191 } 1192 1193// sanity checks 1194if (info .layer == LLM_TENSOR_LAYER_INPUT || info .layer == LLM_TENSOR_LAYER_OUTPUT ) { 1195if (tn .bid != -1 ) { 1196GGML_ABORT ("input/output layer tensor %s used with a layer number" ,tn .str ().c_str ()); 1197 } 1198 }else { 1199if (tn .bid == -1 ) { 1200GGML_ABORT ("repeating layer tensor %s used without a layer number" ,tn .str ().c_str ()); 1201 } 1202 } 1203 1204if (is_lazy ) { 1205return lazy_read::buft (); 1206 } 1207 1208// select the buffer type for this tensor 1209const buft_list_t * buft_list ; 1210switch (info .layer ) { 1211case LLM_TENSOR_LAYER_INPUT : 1212buft_list = buft_list_input ; 1213break ; 1214case LLM_TENSOR_LAYER_OUTPUT : 1215buft_list = buft_list_output ; 1216break ; 1217case LLM_TENSOR_LAYER_REPEATING : 1218GGML_ASSERT (buft_list_layer != nullptr ); 1219buft_list = buft_list_layer ; 1220break ; 1221default : 1222GGML_ABORT ("invalid layer %d for tensor %s" ,info .layer ,tn .str ().c_str ()); 1223 } 1224 1225ggml_backend_buffer_type_t buft = nullptr ; 1226 1227// check overrides 1228if (tensor_buft_overrides ) { 1229 std::string tensor_name = tn .str (); 1230for (const auto * overrides = tensor_buft_overrides ;overrides -> pattern != nullptr ;++ overrides ) { 1231 std::regex pattern (overrides -> pattern ); 1232if (std::regex_search (tensor_name ,pattern )) { 1233if (overrides -> buft == ggml_backend_cpu_buffer_type ()) { 1234// when overriding to a CPU buffer, consider the extra buffer types 1235buft = select_weight_buft (hparams ,t_meta ,op ,buft_list_cpu ); 1236if (use_mmap ) { 1237static std::once_flag once ; 1238 std::call_once (once , [] { 1239LLAMA_LOG_WARN ("llama_model_loader: tensor overrides to CPU are used with mmap enabled - consider using --load-mode none for better performance\n" ); 1240 }); 1241 } 1242 }else { 1243buft = overrides -> buft ; 1244 } 1245 1246LLAMA_LOG_DEBUG ("tensor %s (%zu MiB %s) buffer type overridden to %s\n" , 1247tensor_name .c_str (), 1248ggml_nbytes (t_meta ) /1024 /1024 ,ggml_type_name (t_meta -> type ), 1249ggml_backend_buft_name (buft )); 1250break ; 1251 } 1252 } 1253 } 1254 1255if (!buft ) { 1256buft = select_weight_buft (hparams ,t_meta ,op ,buft_list ); 1257if (!buft ) { 1258throw std::runtime_error (format ("failed to find a compatible buffer type for tensor %s" ,tn .str ().c_str ())); 1259 } 1260 } 1261 1262// avoid using a host buffer when using mmap 1263auto * buft_dev = ggml_backend_buft_get_device (buft ); 1264if (use_mmap && buft_dev && buft == ggml_backend_dev_host_buffer_type (buft_dev )) { 1265auto * cpu_dev = ggml_backend_dev_by_type (GGML_BACKEND_DEVICE_TYPE_CPU ); 1266if (!cpu_dev ) { 1267throw std::runtime_error ("no CPU backend found" ); 1268 } 1269buft = ggml_backend_dev_buffer_type (cpu_dev ); 1270 } 1271 1272if (buft != buft_list -> front ().second ) { 1273if (n_tensors_moved == 0 ) { 1274first_tensor_moved_name = t_meta -> name ; 1275first_tensor_moved_type_name = ggml_type_name (t_meta -> type ); 1276first_moved_from_buft = buft_list -> front ().second ; 1277first_moved_to_buft = buft ; 1278 } 1279n_tensors_moved ++ ; 1280 } 1281 1282return buft ; 1283 }; 1284 1285if (files .empty ()) { 1286if (flags & TENSOR_SKIP_IF_VIRTUAL ) { 1287return nullptr ; 1288 } 1289ggml_type type = GGML_TYPE_F32 ; 1290const int64_t tid = gguf_find_tensor (metadata ,tn .str ().c_str ()); 1291if (tid != -1 ) { 1292type = gguf_get_tensor_type (metadata ,tid ); 1293 } 1294 1295// for tensors that are not required some of the dimensions can be invalid: 1296if (flags & TENSOR_NOT_REQUIRED ) { 1297for (size_t dim = 0 ;dim < ne .size ();dim ++ ) { 1298if (ne .begin ()[dim ] <=0 ) { 1299return nullptr ; 1300 } 1301 } 1302 } 1303 1304ggml_tensor t_meta ; 1305memset (& t_meta ,0 ,sizeof (ggml_tensor )); 1306t_meta .type = type ; 1307for (size_t dim = 0 ;dim < GGML_MAX_DIMS ;dim ++ ) { 1308t_meta .ne [dim ]= dim < ne .size () ?ne .begin ()[dim ] :1 ; 1309GGML_ASSERT (t_meta .ne [dim ] >=1 ); 1310if (dim == 0 ) { 1311t_meta .nb [dim ]= ggml_type_size (type ); 1312 }else if (dim == 1 ) { 1313t_meta .nb [dim ]= ggml_row_size (type ,t_meta .ne [dim - 1 ]); 1314 }else { 1315t_meta .nb [dim ]= t_meta .nb [dim - 1 ]* t_meta .ne [dim - 1 ]; 1316 } 1317GGML_ASSERT (t_meta .nb [dim ] >=1 ); 1318 } 1319ggml_set_name (& t_meta ,tn .str ().c_str ()); 1320 1321ggml_backend_buffer_type_t buft = buft_for_tensor (& t_meta ); 1322GGML_ASSERT (buft != nullptr ); 1323ggml_context * ctx = ctx_for_buft (buft ); 1324ggml_tensor * ret = ggml_dup_tensor (ctx ,& t_meta ); 1325ggml_set_name (ret ,tn .str ().c_str ()); 1326return ret ; 1327 } 1328 1329LLAMA_LOG_DEBUG ("%s: loading tensor %s\n" ,__func__ ,tn .str ().c_str ()); 1330const struct ggml_tensor * cur = check_tensor_dims (tn .str (),ne , !(flags & TENSOR_NOT_REQUIRED ),flags & TENSOR_ALLOW_RESHAPE ); 1331if (cur == NULL ) { 1332return NULL ; 1333 } 1334 1335if (flags & TENSOR_READ_LAZY ) { 1336// the decision must not depend on the load mode, or the memory-fit pass (no_alloc, no mmap) 1337is_lazy = lazy .add (tn .str (),cur ,no_alloc ?nullptr :& require_weight (tn .str ().c_str ())); 1338 } 1339 1340ggml_tensor t_meta = * cur ; 1341if (flags & TENSOR_ALLOW_RESHAPE ) { 1342for (size_t dim = 0 ;dim < GGML_MAX_DIMS ;dim ++ ) { 1343t_meta .ne [dim ]= dim < ne .size () ?ne .begin ()[dim ] :1 ; 1344if (dim == 0 ) { 1345t_meta .nb [dim ]= ggml_type_size (t_meta .type ); 1346 }else if (dim == 1 ) { 1347t_meta .nb [dim ]= ggml_row_size (t_meta .type ,t_meta .ne [dim - 1 ]); 1348 }else { 1349t_meta .nb [dim ]= t_meta .ne [dim - 1 ]* t_meta .nb [dim - 1 ]; 1350 } 1351 } 1352 } 1353 1354GGML_ASSERT (ggml_nbytes (& t_meta )== ggml_nbytes (cur )); 1355 1356ggml_backend_buffer_type_t buft = buft_for_tensor (& t_meta ); 1357if (buft == nullptr ) { 1358return nullptr ; 1359 } 1360 1361ggml_context * ctx = ctx_for_buft (buft ); 1362 1363// if duplicated, check if the original tensor was allocated in the same buffer type context and avoid creating a new one 1364if (flags & TENSOR_DUPLICATED ) { 1365ggml_tensor * t = ggml_get_tensor (ctx ,tn .str ().c_str ()); 1366if (t ) { 1367return t ; 1368 } 1369 } 1370 1371const bool duplicated = flags & TENSOR_DUPLICATED ; 1372 1373struct ggml_tensor * tensor = ggml_dup_tensor (ctx ,& t_meta ); 1374ggml_set_name (tensor ,ggml_get_name (& t_meta )); 1375 1376if (duplicated ) { 1377size_data += ggml_nbytes (& t_meta ); 1378 }else { 1379n_created ++ ; 1380 } 1381 1382return tensor ; 1383} 1384 1385void llama_model_loader::done_getting_tensors (bool partial )const { 1386if (n_created > n_tensors ) { 1387throw std::runtime_error (format ("%s: too many tensors created; expected %d, got %d" ,__func__ ,n_tensors ,n_created )); 1388 } 1389if (n_created < n_tensors ) { 1390if (!partial ) { 1391throw std::runtime_error (format ("%s: wrong number of tensors; expected %d, got %d" ,__func__ ,n_tensors ,n_created )); 1392 } 1393LLAMA_LOG_INFO ("%s: partial load — used %d of %d tensors in the file (rest belong to a sibling model on the same .gguf)\n" , 1394__func__ ,n_created ,n_tensors ); 1395 } 1396if (n_tensors_moved > 0 ) { 1397LLAMA_LOG_DEBUG ("%s: tensor '%s' (%s) (and %zu others) cannot be used with preferred buffer type %s, using %s instead\n" , 1398__func__ ,first_tensor_moved_name .c_str (),first_tensor_moved_type_name .c_str (),n_tensors_moved - 1 , 1399ggml_backend_buft_name (first_moved_from_buft ),ggml_backend_buft_name (first_moved_to_buft )); 1400 } 1401} 1402 1403void llama_model_loader::init_mappings (bool prefetch ,llama_mlocks * mlock_mmaps ) { 1404// note: read_lazy also requires mmap; this condition make sure it's usable even when --load-mode is not set to mmap 1405if (use_mmap || lazy .any ()) { 1406mappings .reserve (files .size ()); 1407mmaps_used .reserve (files .size ()); 1408for (uint32_t idx = 0 ;idx < files .size ();idx ++ ) { 1409const auto & file = files [idx ]; 1410 1411bool is_numa = false; 1412 1413auto * dev = ggml_backend_dev_by_type (GGML_BACKEND_DEVICE_TYPE_CPU ); 1414if (dev ) { 1415auto * reg = ggml_backend_dev_backend_reg (dev ); 1416auto * is_numa_fn = (decltype(ggml_is_numa )* )ggml_backend_reg_get_proc_address (reg ,"ggml_backend_cpu_is_numa" ); 1417if (is_numa_fn ) { 1418is_numa = is_numa_fn (); 1419 } 1420 } 1421 1422const size_t prefetch_size = prefetch && use_mmap ?-1 :0 ; 1423 1424 std::unique_ptr < llama_mmap > mapping = std::make_unique < llama_mmap > (file .get (),prefetch_size ,is_numa , 1425lazy .for_file (idx )); 1426mmaps_used .emplace_back (mapping -> size (),0 ); 1427if (mlock_mmaps ) { 1428 std::unique_ptr < llama_mlock > mlock_mmap (new llama_mlock ()); 1429mlock_mmap -> init (mapping -> addr ()); 1430mlock_mmaps -> emplace_back (std::move (mlock_mmap )); 1431 } 1432mappings .emplace_back (std::move (mapping )); 1433 } 1434 } 1435 1436// compute the total size of all tensors for progress reporting 1437for (const auto & it :weights_map ) { 1438size_data += ggml_nbytes (it .second .tensor ); 1439 } 1440} 1441 1442void llama_model_loader::get_mapping_range (size_t * first ,size_t * last ,void ** addr ,int idx ,ggml_context * ctx )const { 1443GGML_ASSERT (!mappings .empty ()); 1444const auto & mapping = mappings .at (idx ); 1445 1446* first = mapping -> size (); 1447* last = 0 ; 1448* addr = mapping -> addr (); 1449for (ggml_tensor * tensor = ggml_get_first_tensor (ctx );tensor ;tensor = ggml_get_next_tensor (ctx ,tensor )) { 1450const auto * weight = get_weight (ggml_get_name (tensor )); 1451if (!weight || weight -> idx != idx ) { 1452continue ; 1453 } 1454* first = std::min (* first ,weight -> offs ); 1455* last = std::max (* last ,weight -> offs + ggml_nbytes (tensor )); 1456 } 1457} 1458 1459void llama_model_loader::unmap_weight (const llama_tensor_weight & w )const { 1460if (!use_mmap ) {return ; } 1461mappings .at (w .idx )-> unmap_fragment (w .offs ,w .offs + ggml_nbytes (w .tensor )); 1462} 1463 1464const void * llama_model_loader::load_data_range (const llama_tensor_weight & w ,size_t offs ,size_t size ,void * buf )const { 1465GGML_ASSERT (offs + size <=ggml_nbytes (w .tensor )); 1466 1467const void * data = buf ; 1468 1469if (use_mmap ) { 1470data = (const uint8_t * )mappings .at (w .idx )-> addr ()+ w .offs + offs ; 1471 }else { 1472GGML_ASSERT (buf != nullptr ); 1473GGML_ASSERT (w .idx < files .size ()); 1474const auto & file = files .at (w .idx ); 1475file -> seek (w .offs + offs ,SEEK_SET ); 1476file -> read_raw (buf ,size ); 1477 } 1478 1479if (check_tensors && !ggml_validate_row_data (w .tensor -> type ,data ,size )) { 1480throw std::runtime_error (format ("tensor '%s' has invalid data" ,ggml_get_name (w .tensor ))); 1481 } 1482 1483return data ; 1484} 1485 1486bool llama_model_loader::load_all_data ( 1487struct ggml_context * ctx , 1488llama_buf_map & bufs , 1489llama_mlocks * lmlocks , 1490llama_progress_callback progress_callback , 1491void * progress_callback_user_data ) { 1492if (files .empty ()) { 1493for (ggml_tensor * t = ggml_get_first_tensor (ctx );t != nullptr ;t = ggml_get_next_tensor (ctx ,t )) { 1494set_tensor_data (t ,set_tensor_data_ud ); 1495 } 1496return true; 1497 } 1498GGML_ASSERT (size_data != 0 && "call init_mappings() first" ); 1499 1500 std::vector < std::future < std::pair < ggml_tensor * ,bool >>> validation_result ; 1501 1502// 4 staging buffers for async uploads, each sized 1MB seems to be a good default for single NVMe drives. 1503// NVMe raid configurations might require more / larger buffers. 1504constexpr size_t n_buffers = 4 ; 1505 1506size_t alignment = 1 ; 1507for (const auto & file :files ) { 1508alignment = std::max (file -> read_alignment (),alignment ); 1509 } 1510 1511// Buffer size: balance between memory usage and I/O efficiency 1512// 64MB works well for NVMe drives 1513const size_t buffer_size = alignment != 1 ?64 * 1024 * 1024 + 2 * alignment :1 * 1024 * 1024 ; 1514 1515 std::vector < ggml_backend_buffer_t > host_buffers ; 1516 std::vector < ggml_backend_event_t > events ; 1517 std::vector < void *> host_ptrs ; 1518size_t buffer_idx = 0 ;// buffer to use for async loads 1519ggml_backend_t upload_backend = [& ](const char * func )-> ggml_backend_t { 1520if (use_mmap || check_tensors ) { 1521return nullptr ; 1522 } 1523// When not using mmaped io use async uploads from pinned memory to GPU memory. 1524// First determine if the backend supports the necessary features for async uploads. 1525auto * buf = bufs .count (0 ) ?bufs .at (0 ) :nullptr ; 1526if (!buf ) { 1527LLAMA_LOG_DEBUG ("%s: no buffer found for async uploads\n" ,func ); 1528return nullptr ; 1529 } 1530 1531auto * buft = ggml_backend_buffer_get_type (buf ); 1532auto * dev = ggml_backend_buft_get_device (buft ); 1533if (!dev ) { 1534LLAMA_LOG_DEBUG ("%s: no device found for buffer type %s for async uploads\n" ,func , 1535ggml_backend_buft_name (buft )); 1536return nullptr ; 1537 } 1538 1539if (buft != ggml_backend_dev_buffer_type (dev )) { 1540LLAMA_LOG_DEBUG ("%s: buffer type %s is not the default buffer type for device %s for async uploads\n" ,func , 1541ggml_backend_buft_name (buft ),ggml_backend_dev_name (dev )); 1542return nullptr ; 1543 } 1544 1545ggml_backend_dev_props props ; 1546ggml_backend_dev_get_props (dev ,& props ); 1547if (!props .caps .async || !props .caps .host_buffer || !props .caps .events ) { 1548LLAMA_LOG_DEBUG ("%s: device %s does not support async, host buffers or events\n" ,func , 1549ggml_backend_dev_name (dev )); 1550return nullptr ; 1551 } 1552 1553auto * host_buft = ggml_backend_dev_host_buffer_type (dev ); 1554if (!host_buft ) { 1555LLAMA_LOG_DEBUG ("%s: no host buffer type found for device %s\n" ,func , 1556ggml_backend_dev_name (dev )); 1557return nullptr ; 1558 } 1559 1560// If the backend is supported, create pinned memory buffers and events for synchronisation. 1561for (size_t idx = 0 ;idx < n_buffers ;++ idx ) { 1562auto * buf = ggml_backend_buft_alloc_buffer (host_buft ,buffer_size ); 1563 1564if (!buf ) { 1565LLAMA_LOG_DEBUG ("%s: failed to allocate host buffer for async uploads for device %s\n" ,func , 1566ggml_backend_dev_name (dev )); 1567return nullptr ; 1568 } 1569 1570host_buffers .emplace_back (buf ); 1571host_ptrs .emplace_back (ggml_backend_buffer_get_base (buf )); 1572 1573auto * event = ggml_backend_event_new (dev ); 1574if (!event ) { 1575LLAMA_LOG_DEBUG ("%s: failed to create event for async uploads for device %s\n" ,func , 1576ggml_backend_dev_name (dev )); 1577return nullptr ; 1578 } 1579 1580events .emplace_back (event ); 1581 } 1582 1583ggml_backend_t backend = ggml_backend_dev_init (dev ,nullptr ); 1584if (!backend ) { 1585LLAMA_LOG_DEBUG ("%s: failed to initialize backend for device %s for async uploads\n" ,func , 1586ggml_backend_dev_name (dev )); 1587return nullptr ; 1588 } 1589 1590return backend ; 1591 }(__func__ ); 1592 1593if (upload_backend ) { 1594LLAMA_LOG_DEBUG ("%s: using async uploads for device %s, buffer type %s, backend %s\n" ,__func__ , 1595ggml_backend_dev_name (ggml_backend_get_device (upload_backend )), 1596ggml_backend_buft_name (ggml_backend_buffer_get_type (bufs .at (0 ))), 1597ggml_backend_name (upload_backend )); 1598 } 1599 1600 std::vector < ggml_tensor *> tensors ; 1601for (struct ggml_tensor * cur = ggml_get_first_tensor (ctx );cur != NULL ;cur = ggml_get_next_tensor (ctx ,cur )) { 1602tensors .push_back (cur ); 1603 } 1604 1605// without mmap, tensors in non-host buffers are staged through a temporary buffer sized like the tensor 1606// load them biggest-first so the largest staging buffer is allocated while the fewest weights are resident 1607if (!use_mmap ) { 1608 std::stable_sort (tensors .begin (),tensors .end (), [](const ggml_tensor * a ,const ggml_tensor * b ) { 1609const bool staged_a = a -> buffer && !ggml_backend_buffer_is_host (a -> buffer ); 1610const bool staged_b = b -> buffer && !ggml_backend_buffer_is_host (b -> buffer ); 1611if (staged_a != staged_b ) { 1612return staged_a ; 1613 } 1614return staged_a && ggml_nbytes (a )> ggml_nbytes (b ); 1615 }); 1616 } 1617 1618for (struct ggml_tensor * cur :tensors ) { 1619const auto * weight = get_weight (ggml_get_name (cur )); 1620if (weight == nullptr ) { 1621// this can happen with split experts models 1622continue ; 1623 } 1624 1625if (progress_callback ) { 1626if (!progress_callback ((float )size_done /size_data ,progress_callback_user_data )) { 1627return false; 1628 } 1629 } 1630 1631size_t n_size = ggml_nbytes (cur ); 1632 1633const bool from_mapping = use_mmap || lazy .has (cur ); 1634 1635if (from_mapping ) { 1636const auto & mapping = mappings .at (weight -> idx ); 1637ggml_backend_buffer_t buf_mmap = nullptr ; 1638if (bufs .count (weight -> idx )) { 1639buf_mmap = bufs .at (weight -> idx ); 1640 } 1641uint8_t * data = (uint8_t * )mapping -> addr ()+ weight -> offs ; 1642 1643if (check_tensors ) { 1644validation_result .emplace_back (std::async (std::launch::async , [cur ,data ,n_size ] { 1645return std::make_pair (cur ,ggml_validate_row_data (cur -> type ,data ,n_size )); 1646 })); 1647 } 1648 1649GGML_ASSERT (buf_mmap || cur -> data );// either we have a buffer to allocate the tensor in, or it is already allocated 1650if (buf_mmap && cur -> data == nullptr ) { 1651ggml_backend_tensor_alloc (buf_mmap ,cur ,data ); 1652 1653// locking a lazy tensor would fault all of it in, which is what lazy avoids 1654if (lmlocks && !lazy .has (cur )) { 1655const auto & lmlock = lmlocks -> at (weight -> idx ); 1656lmlock -> grow_to (weight -> offs + n_size ); 1657 } 1658 1659auto & mmap_used = mmaps_used [weight -> idx ]; 1660mmap_used .first = std::min (mmap_used .first ,weight -> offs ); 1661mmap_used .second = std::max (mmap_used .second ,weight -> offs + n_size ); 1662 }else { 1663ggml_backend_tensor_set (cur ,data ,0 ,n_size ); 1664 } 1665 }else { 1666const auto & file = files .at (weight -> idx ); 1667 1668if (ggml_backend_buffer_is_host (cur -> buffer )) { 1669file -> seek (weight -> offs ,SEEK_SET ); 1670file -> read_raw (cur -> data ,n_size ); 1671if (check_tensors ) { 1672validation_result .emplace_back (std::async (std::launch::async , [cur ,n_size ] { 1673return std::make_pair (cur ,ggml_validate_row_data (cur -> type ,cur -> data ,n_size )); 1674 })); 1675 } 1676 }else { 1677// If upload_backend is valid load the tensor in chunks to pinned memory and upload the buffers asynchronously to the GPU. 1678if (upload_backend ) { 1679size_t offset = weight -> offs ; 1680alignment = file -> read_alignment (); 1681size_t aligned_offset = offset & ~(alignment - 1 ); 1682size_t offset_from_alignment = offset - aligned_offset ; 1683file -> seek (aligned_offset ,SEEK_SET ); 1684 1685// Calculate aligned read boundaries 1686size_t read_start = aligned_offset ; 1687size_t read_end = (offset + n_size + alignment - 1 )& ~(alignment - 1 ); 1688 1689size_t bytes_read = 0 ; 1690size_t data_read = 0 ;// Actual tensor data copied (excluding padding) 1691 1692while (bytes_read < read_end - read_start ) { 1693size_t read_size = std::min < size_t > (buffer_size ,read_end - read_start - bytes_read ); 1694 1695// Align the destination pointer within the pinned buffer 1696uintptr_t ptr_dest_aligned = (reinterpret_cast < uintptr_t > (host_ptrs [buffer_idx ])+ alignment - 1 )& ~(alignment - 1 ); 1697 1698// Wait for previous upload to complete before reusing buffer 1699ggml_backend_event_synchronize (events [buffer_idx ]); 1700 1701// Read aligned chunk from file 1702file -> read_raw_unsafe (reinterpret_cast < void *> (ptr_dest_aligned ),read_size ); 1703 1704// Calculate actual data portion (excluding alignment padding) 1705uintptr_t ptr_data = ptr_dest_aligned ; 1706size_t data_to_copy = read_size ; 1707 1708// Skip alignment padding at start of first chunk 1709if (bytes_read == 0 ) { 1710ptr_data += offset_from_alignment ; 1711data_to_copy -= offset_from_alignment ; 1712 } 1713 1714// Trim alignment padding at end of last chunk 1715if (aligned_offset + bytes_read + read_size > offset + n_size ) { 1716data_to_copy -= (read_end - (offset + n_size )); 1717 } 1718 1719// Async upload actual data to GPU 1720ggml_backend_tensor_set_async (upload_backend ,cur , 1721reinterpret_cast < void *> (ptr_data ),data_read ,data_to_copy ); 1722ggml_backend_event_record (events [buffer_idx ],upload_backend ); 1723 1724data_read += data_to_copy ; 1725bytes_read += read_size ; 1726 1727++ buffer_idx ; 1728buffer_idx %=n_buffers ; 1729 } 1730 }else { 1731// scoped to one tensor so only one staging buffer is alive at a time 1732 std::vector < no_init < uint8_t >> read_buf (n_size ); 1733file -> seek (weight -> offs ,SEEK_SET ); 1734file -> read_raw (read_buf .data (),n_size ); 1735ggml_backend_tensor_set (cur ,read_buf .data (),0 ,n_size ); 1736if (check_tensors && !ggml_validate_row_data (cur -> type ,read_buf .data (),n_size )) { 1737throw std::runtime_error (format ("tensor '%s' has invalid data" ,ggml_get_name (cur ))); 1738 } 1739 } 1740 } 1741 } 1742 1743size_done += n_size ; 1744 } 1745 1746// free temporary resources used for async uploads 1747for (auto * event :events ) { 1748ggml_backend_event_synchronize (event ); 1749ggml_backend_event_free (event ); 1750 } 1751for (auto * buf :host_buffers ) { 1752ggml_backend_buffer_free (buf ); 1753 } 1754ggml_backend_free (upload_backend ); 1755 1756// check validation results 1757bool validation_failed = false; 1758for (auto & future :validation_result ) { 1759auto result = future .get (); 1760if (!result .second ) { 1761LLAMA_LOG_ERROR ("%s: tensor '%s' has invalid data\n" ,__func__ ,ggml_get_name (result .first )); 1762validation_failed = true; 1763 } 1764 } 1765if (validation_failed ) { 1766throw std::runtime_error ("found tensors with invalid data" ); 1767 } 1768 1769// check if this is the last call and do final cleanup 1770if (size_done >=size_data ) { 1771// unmap offloaded tensors and metadata 1772if (use_mmap ) { 1773for (uint32_t idx = 0 ;idx < mappings .size ();idx ++ ) { 1774const auto & mmap_used = mmaps_used .at (idx ); 1775auto & mapping = mappings .at (idx ); 1776mapping -> unmap_fragment (0 ,mmap_used .first ); 1777if (mmap_used .second != 0 ) { 1778mapping -> unmap_fragment (mmap_used .second ,mapping -> size ()); 1779 } 1780 } 1781 } 1782if (progress_callback ) { 1783// Even though the model is done loading, we still honor 1784// cancellation since we need to free allocations. 1785return progress_callback (1.0f ,progress_callback_user_data ); 1786 } 1787 } 1788 1789return true; 1790} 1791 1792std::string llama_model_loader::ftype_name ()const { 1793return llama_ftype_name (ftype ); 1794} 1795 1796void llama_model_loader::print_info ()const { 1797LLAMA_LOG_INFO ("%s: file format = %s\n" ,__func__ ,llama_file_version_name (fver )); 1798LLAMA_LOG_INFO ("%s: file type = %s\n" ,__func__ ,llama_ftype_name (ftype )); 1799if (n_bytes < GiB ) { 1800LLAMA_LOG_INFO ("%s: file size = %.2f MiB (%.2f BPW) \n" ,__func__ ,n_bytes /1024.0 /1024.0 ,n_bytes * 8.0 /n_elements ); 1801 }else { 1802LLAMA_LOG_INFO ("%s: file size = %.2f GiB (%.2f BPW) \n" ,__func__ ,n_bytes /1024.0 /1024.0 /1024.0 ,n_bytes * 8.0 /n_elements ); 1803 } 1804}