char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
6fed9f6ff
char/aliceai-t5-moe
1#pragma once 2 3// shared internal utilities for the mtmd-helper-*.cpp translation units 4// (mtmd-helper.cpp, mtmd-helper-gen.cpp) 5// NOT part of the public mtmd-helper.h API 6 7#include "ggml.h" 8#include "llama.h" 9#include "mtmd.h" 10 11#include <cstdarg> 12#include <cstdio> 13#include <cstdlib> 14#include <vector> 15 16// 17// logging 18// 19 20struct mtmd_helper_logger { 21ggml_log_callback default_callback = [](ggml_log_level level ,const char * text ,void * user_data ) { 22 (void )level ; 23( void ) user_data ; 24fputs( text , stderr ); 25fflush( stderr ); 26}; 27 28ggml_log_callback log_callback = default_callback; 29void * log_callback_user_data; 30 31void log_v ( enum ggml_log_level level, const char * format, va_list args) { 32if (format == NULL ) { 33return ; 34} 35va_list args_copy; 36va_copy (args_copy, args); 37char buffer[ 128 ]; 38int len = vsnprintf (buffer, 128 , format, args); 39if (len < 128 ) { 40log_callback (level, buffer, log_callback_user_data); 41} else { 42char * buffer2 = ( char * ) calloc (len + 1 , sizeof ( char )); 43vsnprintf (buffer2, len + 1 , format, args_copy); 44buffer2[len] = 0 ; 45log_callback (level, buffer2, log_callback_user_data); 46free (buffer2); 47} 48va_end (args_copy); 49} 50 51void log ( enum ggml_log_level level, const char * format, ...) { 52va_list args; 53va_start (args, format); 54log_v (level, format, args); 55va_end (args); 56} 57}; 58 59// inline, so all TUs including this header share one instance 60inline mtmd_helper_logger g_logger; 61 62#define LOG_DBG (...) g_logger.log(GGML_LOG_LEVEL_DEBUG, __VA_ARGS__) 63#define LOG_INF (...) g_logger.log(GGML_LOG_LEVEL_INFO, __VA_ARGS__) 64#define LOG_WRN (...) g_logger.log(GGML_LOG_LEVEL_WARN, __VA_ARGS__) 65#define LOG_ERR (...) g_logger.log(GGML_LOG_LEVEL_ERROR, __VA_ARGS__) 66 67// 68// embd batch 69// 70 71// helper struct to make working with embd batch easier 72// note: this will be removed after llama_batch_ext refactoring 73struct decode_embd_batch { 74int n_pos_per_embd ; 75int n_mmproj_embd ; 76std :: vector < llama_pos > pos ; 77std :: vector < llama_pos > pos_view ; // used by mrope 78std :: vector < int32_t > n_seq_id ; 79std :: vector < llama_seq_id > seq_id_0 ; 80std :: vector < llama_seq_id *> seq_ids ; 81std :: vector < int8_t > logits ; 82llama_batch batch ; 83decode_embd_batch( float * embd , int32_t n_tokens , int n_pos_per_embd , int n_mmproj_embd) : n_pos_per_embd (n_pos_per_embd), n_mmproj_embd ( n_mmproj_embd ) { 84GGML_ASSERT ( n_tokens > 0 && n_pos_per_embd > 0 && n_mmproj_embd > 0 ); 85pos . resize (( size_t ) n_tokens * ( size_t ) n_pos_per_embd); 86n_seq_id . resize ( n_tokens ); 87seq_ids . resize ( n_tokens + 1 ); 88logits . resize ( n_tokens ); 89seq_id_0 . resize ( 1 ); 90seq_ids [ n_tokens ] = nullptr; 91batch = { 92/*n_tokens =*/ n_tokens, 93/*tokens =*/ nullptr, 94/*embd =*/ embd, 95/*pos =*/ pos.data(), 96/*n_seq_id =*/ n_seq_id.data(), 97/*seq_id =*/ seq_ids.data(), 98/*logits =*/ logits.data(), 99}; 100} 101 102void set_position_normal ( llama_pos pos_0 , llama_seq_id seq_id ) { 103seq_id_0 [ 0 ] = seq_id ; 104for ( int i = 0 ; i < batch .n_tokens; i ++ ) { 105batch .pos [ i ] = pos_0 + i ; 106batch .n_seq_id[ i ] = 1 ; 107batch .seq_id [ i ] = seq_id_0 . data (); 108batch .logits [ i ] = false; 109} 110} 111 112// M-RoPE for image 113void set_position_mrope_2d ( const std :: vector < mtmd_decoder_pos > & rel_pos , llama_seq_id seq_id ) { 114GGML_ASSERT ( n_pos_per_embd == 4 ); 115GGML_ASSERT (! rel_pos . empty () && ( int32_t ) rel_pos . size () == batch .n_tokens); 116seq_id_0 [ 0 ] = seq_id ; 117for ( int32_t i = 0 ; i < batch .n_tokens; i ++ ) { 118const size_t idx = ( size_t ) i ; 119const size_t n_tokens = ( size_t ) batch .n_tokens; 120pos [ idx ] = rel_pos [ i ].t; 121pos [ idx + n_tokens ] = rel_pos [ i ].y; 122pos [ idx + n_tokens * 2 ] = rel_pos [ i ].x; 123pos [ idx + n_tokens * 3 ] = rel_pos [ i ].z; 124} 125for ( int i = 0 ; i < batch .n_tokens; i ++ ) { 126batch .n_seq_id[ i ] = 1 ; 127batch .seq_id [ i ] = seq_id_0 . data (); 128batch .logits [ i ] = false; 129} 130} 131 132// M-RoPE for audio 133void set_position_mrope_1d ( llama_pos pos_0 , llama_seq_id seq_id ) { 134GGML_ASSERT ( n_pos_per_embd == 4 ); 135seq_id_0 [ 0 ] = seq_id ; 136for ( int i = 0 ; i < batch .n_tokens; i ++ ) { 137const size_t idx = ( size_t ) i ; 138const size_t n_tokens = ( size_t ) batch .n_tokens; 139pos [ idx ] = pos_0 + i ; 140pos [ idx + n_tokens ] = pos_0 + i ; 141pos [ idx + n_tokens * 2 ] = pos_0 + i ; 142pos [ idx + n_tokens * 3 ] = pos_0 + i ; 143} 144for ( int i = 0 ; i < batch .n_tokens; i ++ ) { 145batch .n_seq_id[ i ] = 1 ; 146batch .seq_id [ i ] = seq_id_0 . data (); 147batch .logits [ i ] = false; 148} 149} 150 151llama_batch get_view ( int offset , int n_tokens ) { 152GGML_ASSERT ( offset >= 0 && n_tokens > 0 && offset + n_tokens <= batch .n_tokens); 153llama_pos * pos_ptr ; 154pos_view . clear (); 155pos_view . reserve (( size_t ) n_tokens * ( size_t ) n_pos_per_embd ); 156if ( n_pos_per_embd > 1 ) { 157// mrope 158// for example, with layout of src: 1234...1234...1234...1234... 159// offset 2 will give us dst: 34...34...34...34... 160for ( int i = 0 ; i < n_pos_per_embd ; i ++ ) { 161// assume n_tokens is less than or equal to batch.n_tokens 162// batch.n_tokens is number of **total** tokens 163// n_tokens is number of viewed token 164size_t src_idx = ( size_t ) i * ( size_t ) batch .n_tokens + ( size_t ) offset ; 165pos_view . insert ( pos_view . end (), 166pos . data () + src_idx , 167pos . data () + src_idx + n_tokens ); 168} 169pos_ptr = pos_view . data (); 170} else { 171// normal 172pos_ptr = pos . data () + offset ; 173} 174return { 175/*n_tokens =*/ n_tokens , 176/*tokens =*/ nullptr , 177/*embd =*/ batch .embd + offset * n_mmproj_embd , 178/*pos =*/ pos_ptr , 179/*n_seq_id =*/ batch .n_seq_id + offset , 180/*seq_id =*/ batch .seq_id + offset , 181/*logits =*/ batch .logits + offset , 182 }; 183 } 184};