char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
58190cc84
char/aliceai-t5-moe
1#include "llama-impl.h" 2 3#include "gguf.h" 4#include "llama.h" 5 6#include <cinttypes> 7#include <climits> 8#include <cstdarg> 9#include <cstring> 10#include <vector> 11#include <sstream> 12 13struct llama_logger_state { 14ggml_log_callback log_callback = llama_log_callback_default ; 15void * log_callback_user_data = nullptr ; 16}; 17 18static llama_logger_state g_logger_state ; 19 20time_meas::time_meas (int64_t & t_acc ,bool disable ) :t_start_us (disable ?-1 :ggml_time_us ()),t_acc (t_acc ) {} 21 22time_meas::~time_meas () { 23if (t_start_us >=0 ) { 24t_acc += ggml_time_us ()- t_start_us ; 25 } 26} 27 28void llama_log_get (ggml_log_callback * log_callback ,void ** user_data ) { 29ggml_log_get (log_callback ,user_data ); 30} 31 32void llama_log_set (ggml_log_callback log_callback ,void * user_data ) { 33ggml_log_set (log_callback ,user_data ); 34g_logger_state .log_callback = log_callback ?log_callback :llama_log_callback_default ; 35g_logger_state .log_callback_user_data = user_data ; 36} 37 38static void llama_log_internal_v (ggml_log_level level ,const char * format ,va_list args ) { 39va_list args_copy ; 40va_copy (args_copy ,args ); 41char buffer [128 ]; 42int len = vsnprintf (buffer ,128 ,format ,args ); 43if (len < 128 ) { 44g_logger_state .log_callback (level ,buffer ,g_logger_state .log_callback_user_data ); 45 }else { 46char * buffer2 = new char [len + 1 ]; 47vsnprintf (buffer2 ,len + 1 ,format ,args_copy ); 48buffer2 [len ]= 0 ; 49g_logger_state .log_callback (level ,buffer2 ,g_logger_state .log_callback_user_data ); 50delete []buffer2 ; 51 } 52va_end (args_copy ); 53} 54 55void llama_log_internal (ggml_log_level level ,const char * format , ...) { 56va_list args ; 57va_start (args ,format ); 58llama_log_internal_v (level ,format ,args ); 59va_end (args ); 60} 61 62void llama_log_callback_default (ggml_log_level level ,const char * text ,void * user_data ) { 63 (void )level ; 64 (void )user_data ; 65fputs (text ,stderr ); 66fflush (stderr ); 67} 68 69void replace_all (std::string & s ,const std::string & search ,const std::string & replace ) { 70if (search .empty ()) { 71return ; 72 } 73 std::string builder ; 74builder .reserve (s .length ()); 75size_t pos = 0 ; 76size_t last_pos = 0 ; 77while ((pos = s .find (search ,last_pos ))!= std::string::npos ) { 78builder .append (s ,last_pos ,pos - last_pos ); 79builder .append (replace ); 80last_pos = pos + search .length (); 81 } 82builder .append (s ,last_pos , std::string::npos ); 83s = std::move (builder ); 84} 85 86std::string format (const char * fmt , ...) { 87va_list ap ; 88va_list ap2 ; 89va_start (ap ,fmt ); 90va_copy (ap2 ,ap ); 91int size = vsnprintf (NULL ,0 ,fmt ,ap ); 92GGML_ASSERT (size >=0 && size < INT_MAX );// NOLINT 93 std::vector < char > buf (size + 1 ); 94int size2 = vsnprintf (buf .data (),size + 1 ,fmt ,ap2 ); 95GGML_ASSERT (size2 == size ); 96va_end (ap2 ); 97va_end (ap ); 98return std::string (buf .data (),size ); 99} 100 101std::string llama_format_tensor_shape (const std::vector < int64_t > & ne ) { 102char buf [256 ]; 103snprintf (buf ,sizeof (buf ),"%6" PRId64 ,ne .at (0 )); 104for (size_t i = 1 ;i < ne .size ();i ++ ) { 105snprintf (buf + strlen (buf ),sizeof (buf )- strlen (buf ),", %6" PRId64 ,ne .at (i )); 106 } 107return buf ; 108} 109 110std::string llama_format_tensor_shape (const struct ggml_tensor * t ) { 111char buf [256 ]; 112snprintf (buf ,sizeof (buf ),"%6" PRId64 ,t -> ne [0 ]); 113for (int i = 1 ;i < GGML_MAX_DIMS ;i ++ ) { 114snprintf (buf + strlen (buf ),sizeof (buf )- strlen (buf ),", %6" PRId64 ,t -> ne [i ]); 115 } 116return buf ; 117} 118 119static std::string gguf_data_to_str (enum gguf_type type ,const void * data ,int i ) { 120switch (type ) { 121case GGUF_TYPE_UINT8 :return std::to_string (((const uint8_t * )data )[i ]); 122case GGUF_TYPE_INT8 :return std::to_string (((const int8_t * )data )[i ]); 123case GGUF_TYPE_UINT16 :return std::to_string (((const uint16_t * )data )[i ]); 124case GGUF_TYPE_INT16 :return std::to_string (((const int16_t * )data )[i ]); 125case GGUF_TYPE_UINT32 :return std::to_string (((const uint32_t * )data )[i ]); 126case GGUF_TYPE_INT32 :return std::to_string (((const int32_t * )data )[i ]); 127case GGUF_TYPE_UINT64 :return std::to_string (((const uint64_t * )data )[i ]); 128case GGUF_TYPE_INT64 :return std::to_string (((const int64_t * )data )[i ]); 129case GGUF_TYPE_FLOAT32 :return std::to_string (((const float * )data )[i ]); 130case GGUF_TYPE_FLOAT64 :return std::to_string (((const double * )data )[i ]); 131case GGUF_TYPE_BOOL :return ((const int8_t * )data )[i ]!= 0 ?"true" :"false" ; 132default :return format ("unknown type %d" ,type ); 133 } 134} 135 136std::string gguf_kv_to_str (const struct gguf_context * ctx_gguf ,int i ) { 137const enum gguf_type type = gguf_get_kv_type (ctx_gguf ,i ); 138 139switch (type ) { 140case GGUF_TYPE_STRING : 141return gguf_get_val_str (ctx_gguf ,i ); 142case GGUF_TYPE_ARRAY : 143 { 144const enum gguf_type arr_type = gguf_get_arr_type (ctx_gguf ,i ); 145int arr_n = gguf_get_arr_n (ctx_gguf ,i ); 146const void * data = arr_type == GGUF_TYPE_STRING ?nullptr :gguf_get_arr_data (ctx_gguf ,i ); 147 std::stringstream ss ; 148ss <<"[" ; 149for (int j = 0 ;j < arr_n ;j ++ ) { 150if (arr_type == GGUF_TYPE_STRING ) { 151 std::string val = gguf_get_arr_str (ctx_gguf ,i ,j ); 152// escape quotes 153replace_all (val ,"\\" ,"\\\\" ); 154replace_all (val ,"\"" ,"\\\"" ); 155ss <<'"' <<val <<'"' ; 156 }else if (arr_type == GGUF_TYPE_ARRAY ) { 157ss <<"???" ; 158 }else { 159ss <<gguf_data_to_str (arr_type ,data ,j ); 160 } 161if (j < arr_n - 1 ) { 162ss <<", " ; 163 } 164 } 165ss <<"]" ; 166return ss .str (); 167 } 168default : 169return gguf_data_to_str (type ,gguf_get_val_data (ctx_gguf ,i ),0 ); 170 } 171}