char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
f3a184b15
char/aliceai-t5-moe
1llama_add_compile_flags () 2 3function ( llama_build source ) 4set ( TEST_SOURCES ${ source } ${ ARGN }) 5 6if ( DEFINED LLAMA_TEST_NAME) 7set ( TEST_TARGET ${ LLAMA_TEST_NAME }) 8else () 9get_filename_component ( TEST_TARGET ${ source } NAME_WE ) 10endif () 11 12add_executable ( $ { TEST_TARGET } ${ TEST_SOURCES }) 13target_link_libraries ( $ { TEST_TARGET } PRIVATE llama llama-common ) # TODO: [TAG_TESTS_LLAMA_LINK] 14if ( LLAMA_TESTS_INSTALL) 15install ( TARGETS ${ TEST_TARGET } RUNTIME ) 16endif () 17endfunction () 18 19function ( llama_test target ) 20include ( CMakeParseArguments ) 21set ( options ) 22set ( oneValueArgs NAME LABEL WORKING_DIRECTORY ) 23set ( multiValueArgs ARGS ) 24cmake_parse_arguments ( LLAMA_TEST " ${ options } " " ${ oneValueArgs } " " ${ multiValueArgs } " ${ ARGN }) 25 26if ( NOT DEFINED LLAMA_TEST_LABEL) 27set ( LLAMA_TEST_LABEL "main" ) 28endif () 29if ( NOT DEFINED LLAMA_TEST_WORKING_DIRECTORY) 30set ( LLAMA_TEST_WORKING_DIRECTORY . ) 31endif () 32if ( DEFINED LLAMA_TEST_NAME) 33set ( TEST_NAME ${ LLAMA_TEST_NAME }) 34else () 35set ( TEST_NAME ${ target }) 36endif () 37 38set ( TEST_TARGET ${ target }) 39 40add_test ( 41NAME ${ TEST_NAME } 42WORKING_DIRECTORY ${ LLAMA_TEST_WORKING_DIRECTORY } 43COMMAND $ <TARGET_FILE: ${ TEST_TARGET } > 44${ LLAMA_TEST_ARGS }) 45 46set_property ( TEST ${ TEST_NAME } PROPERTY LABELS ${ LLAMA_TEST_LABEL }) 47endfunction () 48 49function ( llama_test_cmd target ) 50include ( CMakeParseArguments ) 51set ( options ) 52set ( oneValueArgs NAME LABEL WORKING_DIRECTORY ) 53set ( multiValueArgs ARGS ) 54cmake_parse_arguments ( LLAMA_TEST " ${ options } " " ${ oneValueArgs } " " ${ multiValueArgs } " ${ ARGN }) 55 56if ( NOT DEFINED LLAMA_TEST_LABEL) 57set ( LLAMA_TEST_LABEL "main" ) 58endif () 59if ( NOT DEFINED LLAMA_TEST_WORKING_DIRECTORY) 60set ( LLAMA_TEST_WORKING_DIRECTORY . ) 61endif () 62if ( DEFINED LLAMA_TEST_NAME) 63set ( TEST_NAME ${ LLAMA_TEST_NAME }) 64else () 65set ( TEST_NAME ${ target }) 66endif () 67 68add_test ( 69NAME ${ TEST_NAME } 70WORKING_DIRECTORY ${ LLAMA_TEST_WORKING_DIRECTORY } 71COMMAND ${ target } 72${ LLAMA_TEST_ARGS }) 73 74set_property ( TEST ${ TEST_NAME } PROPERTY LABELS ${ LLAMA_TEST_LABEL }) 75endfunction () 76 77# Builds and runs a test source file. 78# Optional args: 79# - NAME: name of the executable & test target (defaults to the source file name without extension) 80# - LABEL: label for the test (defaults to main) 81# - ARGS: arguments to pass to the test executable 82# - WORKING_DIRECTORY 83function ( llama_build_and_test source ) 84include ( CMakeParseArguments ) 85set ( options ) 86set ( oneValueArgs NAME LABEL WORKING_DIRECTORY ) 87set ( multiValueArgs ARGS ) 88cmake_parse_arguments ( LLAMA_TEST " ${ options } " " ${ oneValueArgs } " " ${ multiValueArgs } " ${ ARGN }) 89 90set ( TEST_SOURCES ${ source } ${ LLAMA_TEST_UNPARSED_ARGUMENTS }) 91 92if ( NOT DEFINED LLAMA_TEST_LABEL) 93set ( LLAMA_TEST_LABEL "main" ) 94endif () 95if ( NOT DEFINED LLAMA_TEST_WORKING_DIRECTORY) 96set ( LLAMA_TEST_WORKING_DIRECTORY . ) 97endif () 98if ( DEFINED LLAMA_TEST_NAME) 99set ( TEST_TARGET ${ LLAMA_TEST_NAME }) 100else () 101get_filename_component ( TEST_TARGET ${ source } NAME_WE ) 102endif () 103 104add_executable ( $ { TEST_TARGET } ${ TEST_SOURCES }) 105if ( LLAMA_TESTS_INSTALL) 106install ( TARGETS ${ TEST_TARGET } RUNTIME ) 107endif () 108target_link_libraries ( $ { TEST_TARGET } PRIVATE llama-common ) 109 110add_test ( 111NAME ${ TEST_TARGET } 112WORKING_DIRECTORY ${ LLAMA_TEST_WORKING_DIRECTORY } 113COMMAND $ <TARGET_FILE: ${ TEST_TARGET } > 114${ LLAMA_TEST_ARGS }) 115 116set_property ( TEST ${ TEST_TARGET } PROPERTY LABELS ${ LLAMA_TEST_LABEL }) 117endfunction () 118 119# build test-tokenizer-0 target once and add many tests 120llama_build ( test-tokenizer-0.cpp ) 121 122llama_test ( test-tokenizer-0 NAME test-tokenizer-0-bert-bge ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-bert-bge.gguf ) 123llama_test ( test-tokenizer-0 NAME test-tokenizer-0-command-r ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-command-r.gguf ) 124llama_test ( test-tokenizer-0 NAME test-tokenizer-0-deepseek-coder ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-deepseek-coder.gguf ) 125llama_test ( test-tokenizer-0 NAME test-tokenizer-0-deepseek-llm ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-deepseek-llm.gguf ) 126llama_test ( test-tokenizer-0 NAME test-tokenizer-0-falcon ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-falcon.gguf ) 127llama_test ( test-tokenizer-0 NAME test-tokenizer-0-gemma-4 ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-gemma-4.gguf ) 128llama_test ( test-tokenizer-0 NAME test-tokenizer-0-gpt-2 ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-gpt-2.gguf ) 129llama_test ( test-tokenizer-0 NAME test-tokenizer-0-llama-bpe ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-llama-bpe.gguf ) 130llama_test ( test-tokenizer-0 NAME test-tokenizer-0-llama-spm ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-llama-spm.gguf ) 131llama_test ( test-tokenizer-0 NAME test-tokenizer-0-mpt ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-mpt.gguf ) 132llama_test ( test-tokenizer-0 NAME test-tokenizer-0-phi-3 ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-phi-3.gguf ) 133llama_test ( test-tokenizer-0 NAME test-tokenizer-0-qwen2 ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-qwen2.gguf ) 134llama_test ( test-tokenizer-0 NAME test-tokenizer-0-qwen35 ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-qwen35.gguf ) 135llama_test ( test-tokenizer-0 NAME test-tokenizer-0-refact ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-refact.gguf ) 136llama_test ( test-tokenizer-0 NAME test-tokenizer-0-starcoder ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-starcoder.gguf ) 137 138if ( NOT WIN32) 139llama_test_cmd ( 140${ CMAKE_CURRENT_SOURCE_DIR } /test-tokenizers-repo.sh 141NAME test-tokenizers-ggml-vocabs 142WORKING_DIRECTORY ${ CMAKE_RUNTIME_OUTPUT_DIRECTORY } 143ARGS https://huggingface.co/ggml-org/vocabs ${ PROJECT_SOURCE_DIR } /models/ggml-vocabs 144) 145endif () 146 147if ( LLAMA_LLGUIDANCE) 148llama_build_and_test ( test-grammar-llguidance.cpp ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-llama-bpe.gguf ) 149endif () 150 151llama_build ( test-recurrent-state-rollback.cpp ) 152llama_build ( test-save-load-state.cpp ) 153 154if ( NOT WIN32OR NOT BUILD_SHARED_LIBS) 155# these tests are disabled on Windows because they use internal functions not exported with LLAMA_API (when building with shared libraries) 156llama_build_and_test ( test-unicode.cpp ) 157llama_build_and_test ( test-sampling.cpp ) 158llama_build_and_test ( test-reasoning-budget.cpp ) 159llama_build_and_test ( test-grammar-parser.cpp ) 160llama_build_and_test ( test-grammar-integration.cpp ) 161llama_build_and_test ( test-llama-grammar.cpp ) 162llama_build_and_test ( test-batch-alloc.cpp ) 163llama_build_and_test ( test-chat.cpp WORKING_DIRECTORY ${ PROJECT_SOURCE_DIR }) 164target_include_directories ( test-chat PRIVATE ${ PROJECT_SOURCE_DIR } /tools/server ) 165target_link_libraries ( test-chat PRIVATE server-context ) 166llama_build_and_test ( test-json-schema-to-grammar.cpp ) 167 168if ( NOT GGML_BACKEND_DL) 169llama_build ( test-quantize-stats.cpp ) 170endif () 171 172llama_build ( test-gbnf-validator.cpp ) 173 174# build test-tokenizer-1-bpe target once and add many tests 175llama_build ( test-tokenizer-1-bpe.cpp ) 176 177# TODO: disabled due to slowness 178#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-aquila ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-aquila.gguf) 179#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-falcon ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-falcon.gguf) 180#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-gpt-2 ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-gpt-2.gguf) 181#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-gpt-neox ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-gpt-neox.gguf) 182#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-llama-bpe ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-llama-bpe.gguf --ignore-merges) 183#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-mpt ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-mpt.gguf) 184#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-refact ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-refact.gguf) 185#llama_test(test-tokenizer-1-bpe NAME test-tokenizer-1-starcoder ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-starcoder.gguf) 186 187# build test-tokenizer-1-spm target once and add many tests 188llama_build ( test-tokenizer-1-spm.cpp ) 189 190llama_test ( test-tokenizer-1-spm NAME test-tokenizer-1-llama-spm ARGS ${ PROJECT_SOURCE_DIR } /models/ggml-vocab-llama-spm.gguf ) 191#llama_test(test-tokenizer-1-spm NAME test-tokenizer-1-baichuan ARGS ${PROJECT_SOURCE_DIR}/models/ggml-vocab-baichuan.gguf) 192 193# llama_build_and_test(test-double-float.cpp) # SLOW 194 195llama_build ( test-llama-archs.cpp ) 196 197set ( MODEL_DIR " ${ CMAKE_CURRENT_BINARY_DIR } /test-models/" ) 198file ( MAKE_DIRECTORY " ${ MODEL_DIR } " ) 199 200llama_test ( 201test-llama-archs 202NAME test-generate-models 203LABEL main 204ARGS -o " ${ MODEL_DIR } " 205) 206set_tests_properties ( test-generate-models PROPERTIES 207FIXTURES_SETUP generate-models 208) 209 210llama_test ( 211test-recurrent-state-rollback 212LABEL main 213ARGS -m " ${ MODEL_DIR } /qwen35-dense.gguf" 214) 215set_tests_properties ( test-recurrent-state-rollback PROPERTIES 216FIXTURES_REQUIRED generate-models 217) 218 219llama_test ( 220test-recurrent-state-rollback 221NAME test-recurrent-state-rollback-nemotron-h 222LABEL main 223ARGS -m " ${ MODEL_DIR } /nemotron_h-dense.gguf" 224) 225set_tests_properties ( test-recurrent-state-rollback-nemotron-h PROPERTIES 226FIXTURES_REQUIRED generate-models 227) 228llama_test ( 229test-recurrent-state-rollback 230NAME test-recurrent-state-rollback-dsv4 231LABEL main 232ARGS -m " ${ MODEL_DIR } /deepseek4-moe.gguf" 233) 234set_tests_properties ( test-recurrent-state-rollback-dsv4 PROPERTIES 235FIXTURES_REQUIRED generate-models 236) 237llama_test ( 238test-recurrent-state-rollback 239NAME test-recurrent-state-rollback-kimi-k3 240LABEL main 241ARGS -m " ${ MODEL_DIR } /kimi-k3-moe.gguf" 242) 243set_tests_properties ( test-recurrent-state-rollback-kimi-k3 PROPERTIES 244FIXTURES_REQUIRED generate-models 245) 246 247# Test state save/load functionality across all architectures, using the generated dummy models 248llama_test ( 249test-save-load-state 250LABEL main 251ARGS --models " ${ MODEL_DIR } " 252) 253set_tests_properties ( test-save-load-state PROPERTIES FIXTURES_REQUIRED generate-models ) 254 255llama_build ( test-fusion.cpp ) 256endif () 257 258llama_build_and_test ( test-chat-peg-parser.cpp peg-parser/simple-tokenize.cpp ) 259llama_build_and_test ( test-jinja.cpp ) 260llama_test ( test-jinja NAME test-jinja-py ARGS -py LABEL python ) 261llama_build_and_test ( test-json-schema.cpp ) 262llama_build_and_test ( test-chat-auto-parser.cpp WORKING_DIRECTORY ${ PROJECT_SOURCE_DIR }) 263llama_build_and_test ( test-chat-template.cpp ) 264# debug tool for chat template differential analysis (not registered as a test, run it manually) 265llama_build ( test-chat-analysis.cpp ) 266llama_build_and_test ( test-log.cpp ) 267llama_build_and_test ( 268test-peg-parser.cpp 269peg-parser/simple-tokenize.cpp 270peg-parser/test-basic.cpp 271peg-parser/test-gbnf-generation.cpp 272peg-parser/test-json-parser.cpp 273peg-parser/test-json-serialization.cpp 274peg-parser/test-python-dict-parser.cpp 275peg-parser/test-unicode.cpp 276peg-parser/tests.h 277) 278 279if ( NOT ${ CMAKE_SYSTEM_PROCESSOR } MATCHES "s390x" ) 280set ( MODEL_NAME "tinyllamas/stories15M-q4_0.gguf" ) 281set ( MODEL_HASH "SHA256=66967fbece6dbe97886593fdbb73589584927e29119ec31f08090732d1861739" ) 282else () 283set ( MODEL_NAME "tinyllamas/stories15M-be.Q4_0.gguf" ) 284set ( MODEL_HASH "SHA256=9aec857937849d976f30397e97eb1cabb53eb9dcb1ce4611ba8247fb5f44c65d" ) 285endif () 286set ( MODEL_DEST " ${ CMAKE_BINARY_DIR } / ${ MODEL_NAME } " ) 287 288add_test ( NAME test-download-model COMMAND ${ CMAKE_COMMAND } 289-DDEST= ${ MODEL_DEST } 290-DNAME= ${ MODEL_NAME } 291-DHASH= ${ MODEL_HASH } 292-P ${ CMAKE_SOURCE_DIR } /cmake/download-models.cmake 293) 294set_tests_properties ( test-download-model PROPERTIES FIXTURES_SETUP test-download-model ) 295 296llama_build_and_test ( test-thread-safety.cpp ARGS -m " ${ MODEL_DEST } " -ngl 99 -p "The meaning of life is" -n 128 -c 256 -ub 32 -np 4 -t 2 ) 297set_tests_properties ( test-thread-safety PROPERTIES FIXTURES_REQUIRED test-download-model ) 298 299llama_build_and_test ( test-arg-parser.cpp ) 300llama_build_and_test ( test-model-resolution.cpp ) 301# the test serves its repos from an httplib server, and the library links it privately 302target_link_libraries ( test-model-resolution PRIVATE cpp-httplib ) 303 304if ( NOT LLAMA_SANITIZE_ADDRESSAND NOT GGML_SCHED_NO_REALLOC) 305# TODO: repair known memory leaks 306llama_build_and_test ( test-opt.cpp ) 307endif () 308 309# TODO: make this test (and others) not link `libllama` as it is not needed [TAG_TESTS_LLAMA_LINK] 310llama_build ( test-backend-ops.cpp ) 311 312llama_build_and_test ( test-model-load-cancel.cpp LABEL "model" ) 313llama_build_and_test ( test-autorelease.cpp LABEL "model" ) 314llama_build_and_test ( test-backend-sampler.cpp LABEL "model" ) 315 316# Test for state restore with fragmented KV cache 317# Requires a model, uses same args pattern as test-thread-safety 318llama_build_and_test ( test-state-restore-fragmented.cpp LABEL "model" ARGS -m " ${ MODEL_DEST } " ) 319set_tests_properties ( test-state-restore-fragmented PROPERTIES FIXTURES_REQUIRED test-download-model ) 320 321if ( APPLE) 322llama_build ( test-rset-release.cpp ) 323endif () 324 325if ( NOT GGML_BACKEND_DL) 326# these tests use the backends directly and cannot be built with dynamic loading 327llama_build_and_test ( test-barrier.cpp ) 328llama_build_and_test ( test-quantize-fns.cpp ) 329llama_build_and_test ( test-quantize-perf.cpp ) 330llama_build_and_test ( test-rope.cpp ) 331llama_build_and_test ( test-col2im-1d.cpp ) 332endif () 333 334# libmtmd 335set ( LLAMA_TEST_NAME test-mtmd-c-api ) 336llama_build_and_test ( test-mtmd-c-api.c ) 337target_link_libraries ( $ { LLAMA_TEST_NAME } PRIVATE mtmd ) 338unset ( LLAMA_TEST_NAME ) 339 340llama_build_and_test ( test-mtmd-impl.cpp ) 341target_link_libraries ( test-mtmd-impl PRIVATE mtmd ) 342 343# GGUF model data fetcher library for tests that need real model metadata 344# Only compile when cpp-httplib has SSL support (CPPHTTPLIB_OPENSSL_SUPPORT) 345if ( TARGET cpp-httplib) 346get_target_property ( _cpp_httplib_defs cpp-httplib INTERFACE_COMPILE_DEFINITIONS ) 347if ( _cpp_httplib_defsMATCHES "CPPHTTPLIB_OPENSSL_SUPPORT" ) 348add_library ( gguf-model-data STATIC gguf-model-data.cpp ) 349target_link_libraries ( gguf-model-data PRIVATE llama-common cpp-httplib ) 350target_include_directories ( gguf-model-data PUBLIC ${ CMAKE_CURRENT_SOURCE_DIR }) 351 352add_executable ( test-gguf-model-data test-gguf-model-data.cpp ) 353target_link_libraries ( test-gguf-model-data PRIVATE gguf-model-data llama-common ) 354llama_test ( test-gguf-model-data LABEL "model" ) 355 356# test-quant-type-selection requires gguf-model-data for remote model metadata 357llama_build_and_test ( test-quant-type-selection.cpp LABEL "model" ) 358target_link_libraries ( test-quant-type-selection PRIVATE gguf-model-data ) 359target_compile_definitions ( test-quant-type-selection PRIVATE 360SNAPSHOT_DIR= " ${ CMAKE_CURRENT_SOURCE_DIR } /snapshots" ) 361endif () 362endif () 363 364# dummy executable - not installed 365get_filename_component ( TEST_TARGET test-c.c NAME_WE ) 366add_executable ( $ { TEST_TARGET } test-c.c ) 367target_link_libraries ( $ { TEST_TARGET } PRIVATE llama ) 368 369if ( NOT LLAMA_USE_SYSTEM_GGML) 370# Needs non-public ggml-impl.h 371llama_build_and_test ( test-gguf.cpp ) 372 373# Needs non-public ggml{,-backend}-impl.h 374llama_build_and_test ( test-alloc.cpp ) 375endif () 376 377llama_build ( test-export-graph-ops.cpp ) 378if ( TARGET gguf-model-data) 379target_link_libraries ( test-export-graph-ops PRIVATE gguf-model-data ) 380target_compile_definitions ( test-export-graph-ops PRIVATE LLAMA_HF_FETCH ) 381endif ()