char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
ffaafde16
char/aliceai-t5-moe
1#include "backend-dispatched.h" 2#include "backend-virgl-apir.h" 3#include "shared/api_remoting.h" 4#include "shared/apir_backend.h" 5#include "shared/apir_cs.h" 6 7#include <dlfcn.h> 8#include <ggml-backend.h> 9 10#include <iostream> 11 12#define APIR_LLAMA_CPP_GGML_LIBRARY_PATH_ENV "APIR_LLAMA_CPP_GGML_LIBRARY_PATH" 13#define APIR_LLAMA_CPP_GGML_LIBRARY_REG_ENV "APIR_LLAMA_CPP_GGML_LIBRARY_REG" 14#define APIR_LLAMA_CPP_LOG_TO_FILE_ENV "APIR_LLAMA_CPP_LOG_TO_FILE" 15 16#define GGML_DEFAULT_BACKEND_REG "ggml_backend_init" 17 18static void * backend_library_handle = NULL ; 19static FILE * apir_logfile = NULL ; 20 21static void log_to_file_callback (enum ggml_log_level level ,const char * text ,void * user_data ) { 22FILE * logfile = (FILE * )user_data ; 23fprintf (logfile ,"[%d] %s" ,level ,text ); 24fflush (logfile ); 25} 26 27extern "C" { 28void apir_backend_deinit (uint32_t virgl_ctx_id ) { 29GGML_UNUSED (virgl_ctx_id ); 30 31auto buffers = apir_get_track_backend_buffers (); 32for (const auto & buffer :buffers ) { 33apir_untrack_backend_buffer (buffer ); 34buffer -> iface .free_buffer (buffer ); 35 } 36 37if (backend_library_handle ) { 38GGML_LOG_INFO (GGML_VIRTGPU_BCK "The GGML backend library was loaded. Unloading it.\n" ); 39dlclose (backend_library_handle ); 40backend_library_handle = NULL ; 41 } 42 43if (apir_logfile ) { 44fclose (apir_logfile ); 45apir_logfile = NULL ; 46 } 47} 48 49#define APIR_GGML_LIBRARY_PATH_KEY "ggml.library.path" 50#define APIR_GGML_LIBRARY_REG_KEY "ggml.library.reg" 51 52ApirLoadLibraryReturnCode apir_backend_initialize (uint32_t virgl_ctx_id ,struct virgl_apir_callbacks * virgl_cbs ) { 53const char * dlsym_error ; 54 55const char * apir_log_to_file = getenv (APIR_LLAMA_CPP_LOG_TO_FILE_ENV ); 56if (apir_log_to_file ) { 57apir_logfile = fopen (apir_log_to_file ,"w" ); 58if (apir_logfile ) { 59ggml_log_set (log_to_file_callback ,apir_logfile ); 60 }else { 61GGML_LOG_INFO (GGML_VIRTGPU_BCK "Could not open the log file at '%s'\n" ,apir_log_to_file ); 62 } 63 } 64 65const char * library_name = virgl_cbs -> get_config (virgl_ctx_id ,APIR_GGML_LIBRARY_PATH_KEY ); 66const char * virgl_library_reg = virgl_cbs -> get_config (virgl_ctx_id ,APIR_GGML_LIBRARY_REG_KEY ); 67const char * library_reg = virgl_library_reg ?virgl_library_reg :GGML_DEFAULT_BACKEND_REG ; 68 69if (!library_name ) { 70GGML_LOG_ERROR (GGML_VIRTGPU_BCK "%s: cannot open the GGML library: env var '%s' not defined\n" ,__func__ , 71APIR_LLAMA_CPP_GGML_LIBRARY_PATH_ENV ); 72 73return APIR_LOAD_LIBRARY_ENV_VAR_MISSING ; 74 } 75 76backend_library_handle = dlopen (library_name ,RTLD_LAZY ); 77 78if (!backend_library_handle ) { 79GGML_LOG_ERROR (GGML_VIRTGPU_BCK "%s: cannot open the GGML library: %s\n" ,__func__ ,dlerror ()); 80 81return APIR_LOAD_LIBRARY_CANNOT_OPEN ; 82 } 83 84if (!library_reg ) { 85GGML_LOG_ERROR (GGML_VIRTGPU_BCK "%s: cannot register the GGML library: env var '%s' not defined\n" ,__func__ , 86APIR_LLAMA_CPP_GGML_LIBRARY_REG_ENV ); 87 88return APIR_LOAD_LIBRARY_ENV_VAR_MISSING ; 89 } 90 91void * ggml_backend_reg_fct = dlsym (backend_library_handle ,library_reg ); 92dlsym_error = dlerror (); 93if (dlsym_error ) { 94GGML_LOG_ERROR (GGML_VIRTGPU_BCK "%s: cannot find the GGML backend registration symbol '%s' (from %s): %s\n" , 95__func__ ,library_reg ,APIR_LLAMA_CPP_GGML_LIBRARY_REG_ENV ,dlsym_error ); 96 97return APIR_LOAD_LIBRARY_SYMBOL_MISSING ; 98 } 99 100uint32_t ret = backend_dispatch_initialize (ggml_backend_reg_fct ); 101 102return (ApirLoadLibraryReturnCode ) (APIR_LOAD_LIBRARY_INIT_BASE_INDEX + ret ); 103} 104 105uint32_t apir_backend_dispatcher (uint32_t virgl_ctx_id , 106virgl_apir_callbacks * virgl_cbs , 107uint32_t cmd_type , 108char * dec_cur , 109const char * dec_end , 110char * enc_cur , 111const char * enc_end , 112char ** enc_cur_after ) { 113apir_encoder enc = { 114 .cur = enc_cur , 115 .start = enc_cur , 116 .end = enc_end , 117 .fatal = false, 118 }; 119 120apir_decoder dec = { 121 .cur = dec_cur , 122 .end = dec_end , 123 .fatal = false, 124 }; 125 126virgl_apir_context ctx = { 127 .ctx_id = virgl_ctx_id , 128 .iface = virgl_cbs , 129 }; 130 131if (cmd_type >=APIR_BACKEND_DISPATCH_TABLE_COUNT ) { 132GGML_LOG_ERROR (GGML_VIRTGPU_BCK "%s: Received an invalid dispatch index (%d >= %d)\n" ,__func__ ,cmd_type , 133APIR_BACKEND_DISPATCH_TABLE_COUNT ); 134return APIR_BACKEND_FORWARD_INDEX_INVALID ; 135 } 136 137backend_dispatch_t forward_fct = apir_backend_dispatch_table [cmd_type ]; 138uint32_t ret = forward_fct (& enc ,& dec ,& ctx ); 139 140* enc_cur_after = enc .cur ; 141 142return ret ; 143} 144}