char-fork/llama.cpp

git clone https://git.t4t.associates/char-fork/llama.cpp

Daniel Beveniuscmake : remove precompiled headers (#28892)f3a184b15

char/aliceai-t5-moe
15.5 KiB381 linesraw
1llama_add_compile_flags()
2
3function(llama_build source)
4    set(TEST_SOURCES ${source} ${ARGN})
5
6    if (DEFINED LLAMA_TEST_NAME)
7        set(TEST_TARGET ${LLAMA_TEST_NAME})
8    else()
9        get_filename_component(TEST_TARGET ${source} NAME_WE)
10    endif()
11
12    add_executable(${TEST_TARGET} ${TEST_SOURCES})
13    target_link_libraries(${TEST_TARGET} PRIVATE llama llama-common) # TODO: [TAG_TESTS_LLAMA_LINK]
14    if (LLAMA_TESTS_INSTALL)
15        install(TARGETS ${TEST_TARGET} RUNTIME)
16    endif()
17endfunction()
18
19function(llama_test target)
20    include(CMakeParseArguments)
21    set(options)
22    set(oneValueArgs NAME LABEL WORKING_DIRECTORY)
23    set(multiValueArgs ARGS)
24    cmake_parse_arguments(LLAMA_TEST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
25
26    if (NOT DEFINED LLAMA_TEST_LABEL)
27        set(LLAMA_TEST_LABEL "main")
28    endif()
29    if (NOT DEFINED LLAMA_TEST_WORKING_DIRECTORY)
30        set(LLAMA_TEST_WORKING_DIRECTORY .)
31    endif()
32    if (DEFINED LLAMA_TEST_NAME)
33        set(TEST_NAME ${LLAMA_TEST_NAME})
34    else()
35        set(TEST_NAME ${target})
36    endif()
37
38    set(TEST_TARGET ${target})
39
40    add_test(
41        NAME ${TEST_NAME}
42        WORKING_DIRECTORY ${LLAMA_TEST_WORKING_DIRECTORY}
43        COMMAND $<TARGET_FILE:${TEST_TARGET}>
44        ${LLAMA_TEST_ARGS})
45
46    set_property(TEST ${TEST_NAME} PROPERTY LABELS ${LLAMA_TEST_LABEL})
47endfunction()
48
49function(llama_test_cmd target)
50    include(CMakeParseArguments)
51    set(options)
52    set(oneValueArgs NAME LABEL WORKING_DIRECTORY)
53    set(multiValueArgs ARGS)
54    cmake_parse_arguments(LLAMA_TEST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
55
56    if (NOT DEFINED LLAMA_TEST_LABEL)
57        set(LLAMA_TEST_LABEL "main")
58    endif()
59    if (NOT DEFINED LLAMA_TEST_WORKING_DIRECTORY)
60        set(LLAMA_TEST_WORKING_DIRECTORY .)
61    endif()
62    if (DEFINED LLAMA_TEST_NAME)
63        set(TEST_NAME ${LLAMA_TEST_NAME})
64    else()
65        set(TEST_NAME ${target})
66    endif()
67
68    add_test(
69        NAME ${TEST_NAME}
70        WORKING_DIRECTORY ${LLAMA_TEST_WORKING_DIRECTORY}
71        COMMAND ${target}
72        ${LLAMA_TEST_ARGS})
73
74    set_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)
84    include(CMakeParseArguments)
85    set(options)
86    set(oneValueArgs NAME LABEL WORKING_DIRECTORY)
87    set(multiValueArgs ARGS)
88    cmake_parse_arguments(LLAMA_TEST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
89
90    set(TEST_SOURCES ${source} ${LLAMA_TEST_UNPARSED_ARGUMENTS})
91
92    if (NOT DEFINED LLAMA_TEST_LABEL)
93        set(LLAMA_TEST_LABEL "main")
94    endif()
95    if (NOT DEFINED LLAMA_TEST_WORKING_DIRECTORY)
96        set(LLAMA_TEST_WORKING_DIRECTORY .)
97    endif()
98    if (DEFINED LLAMA_TEST_NAME)
99        set(TEST_TARGET ${LLAMA_TEST_NAME})
100    else()
101        get_filename_component(TEST_TARGET ${source} NAME_WE)
102    endif()
103
104    add_executable(${TEST_TARGET} ${TEST_SOURCES})
105    if (LLAMA_TESTS_INSTALL)
106        install(TARGETS ${TEST_TARGET} RUNTIME)
107    endif()
108    target_link_libraries(${TEST_TARGET} PRIVATE llama-common)
109
110    add_test(
111        NAME ${TEST_TARGET}
112        WORKING_DIRECTORY ${LLAMA_TEST_WORKING_DIRECTORY}
113        COMMAND $<TARGET_FILE:${TEST_TARGET}>
114        ${LLAMA_TEST_ARGS})
115
116    set_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)
139    llama_test_cmd(
140        ${CMAKE_CURRENT_SOURCE_DIR}/test-tokenizers-repo.sh
141        NAME test-tokenizers-ggml-vocabs
142        WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
143        ARGS https://huggingface.co/ggml-org/vocabs ${PROJECT_SOURCE_DIR}/models/ggml-vocabs
144    )
145endif()
146
147if (LLAMA_LLGUIDANCE)
148    llama_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 WIN32 OR 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)
156    llama_build_and_test(test-unicode.cpp)
157    llama_build_and_test(test-sampling.cpp)
158    llama_build_and_test(test-reasoning-budget.cpp)
159    llama_build_and_test(test-grammar-parser.cpp)
160    llama_build_and_test(test-grammar-integration.cpp)
161    llama_build_and_test(test-llama-grammar.cpp)
162    llama_build_and_test(test-batch-alloc.cpp)
163    llama_build_and_test(test-chat.cpp WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
164    target_include_directories(test-chat PRIVATE ${PROJECT_SOURCE_DIR}/tools/server)
165    target_link_libraries(test-chat PRIVATE server-context)
166    llama_build_and_test(test-json-schema-to-grammar.cpp)
167
168    if (NOT GGML_BACKEND_DL)
169        llama_build(test-quantize-stats.cpp)
170    endif()
171
172    llama_build(test-gbnf-validator.cpp)
173
174    # build test-tokenizer-1-bpe target once and add many tests
175    llama_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
188    llama_build(test-tokenizer-1-spm.cpp)
189
190    llama_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
195    llama_build(test-llama-archs.cpp)
196
197    set(MODEL_DIR "${CMAKE_CURRENT_BINARY_DIR}/test-models/")
198    file(MAKE_DIRECTORY "${MODEL_DIR}")
199
200    llama_test(
201        test-llama-archs
202        NAME test-generate-models
203        LABEL main
204        ARGS -o "${MODEL_DIR}"
205    )
206    set_tests_properties(test-generate-models PROPERTIES
207        FIXTURES_SETUP generate-models
208    )
209
210    llama_test(
211        test-recurrent-state-rollback
212        LABEL main
213        ARGS -m "${MODEL_DIR}/qwen35-dense.gguf"
214    )
215    set_tests_properties(test-recurrent-state-rollback PROPERTIES
216        FIXTURES_REQUIRED generate-models
217    )
218
219    llama_test(
220        test-recurrent-state-rollback
221        NAME test-recurrent-state-rollback-nemotron-h
222        LABEL main
223        ARGS -m "${MODEL_DIR}/nemotron_h-dense.gguf"
224    )
225    set_tests_properties(test-recurrent-state-rollback-nemotron-h PROPERTIES
226        FIXTURES_REQUIRED generate-models
227    )
228    llama_test(
229        test-recurrent-state-rollback
230        NAME test-recurrent-state-rollback-dsv4
231        LABEL main
232        ARGS -m "${MODEL_DIR}/deepseek4-moe.gguf"
233    )
234    set_tests_properties(test-recurrent-state-rollback-dsv4 PROPERTIES
235        FIXTURES_REQUIRED generate-models
236    )
237    llama_test(
238        test-recurrent-state-rollback
239        NAME test-recurrent-state-rollback-kimi-k3
240        LABEL main
241        ARGS -m "${MODEL_DIR}/kimi-k3-moe.gguf"
242    )
243    set_tests_properties(test-recurrent-state-rollback-kimi-k3 PROPERTIES
244        FIXTURES_REQUIRED generate-models
245    )
246
247    # Test state save/load functionality across all architectures, using the generated dummy models
248    llama_test(
249        test-save-load-state
250        LABEL main
251        ARGS --models "${MODEL_DIR}"
252    )
253    set_tests_properties(test-save-load-state PROPERTIES FIXTURES_REQUIRED generate-models)
254
255    llama_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(
268    test-peg-parser.cpp
269    peg-parser/simple-tokenize.cpp
270    peg-parser/test-basic.cpp
271    peg-parser/test-gbnf-generation.cpp
272    peg-parser/test-json-parser.cpp
273    peg-parser/test-json-serialization.cpp
274    peg-parser/test-python-dict-parser.cpp
275    peg-parser/test-unicode.cpp
276    peg-parser/tests.h
277)
278
279if (NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "s390x")
280    set(MODEL_NAME "tinyllamas/stories15M-q4_0.gguf")
281    set(MODEL_HASH "SHA256=66967fbece6dbe97886593fdbb73589584927e29119ec31f08090732d1861739")
282else()
283    set(MODEL_NAME "tinyllamas/stories15M-be.Q4_0.gguf")
284    set(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_ADDRESS AND NOT GGML_SCHED_NO_REALLOC)
305  # TODO: repair known memory leaks
306  llama_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)
322    llama_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
327    llama_build_and_test(test-barrier.cpp)
328    llama_build_and_test(test-quantize-fns.cpp)
329    llama_build_and_test(test-quantize-perf.cpp)
330    llama_build_and_test(test-rope.cpp)
331    llama_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)
346    get_target_property(_cpp_httplib_defs cpp-httplib INTERFACE_COMPILE_DEFINITIONS)
347    if (_cpp_httplib_defs MATCHES "CPPHTTPLIB_OPENSSL_SUPPORT")
348        add_library(gguf-model-data STATIC gguf-model-data.cpp)
349        target_link_libraries(gguf-model-data PRIVATE llama-common cpp-httplib)
350        target_include_directories(gguf-model-data PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
351
352        add_executable(test-gguf-model-data test-gguf-model-data.cpp)
353        target_link_libraries(test-gguf-model-data PRIVATE gguf-model-data llama-common)
354        llama_test(test-gguf-model-data LABEL "model")
355
356        # test-quant-type-selection requires gguf-model-data for remote model metadata
357        llama_build_and_test(test-quant-type-selection.cpp LABEL "model")
358        target_link_libraries(test-quant-type-selection PRIVATE gguf-model-data)
359        target_compile_definitions(test-quant-type-selection PRIVATE
360            SNAPSHOT_DIR="${CMAKE_CURRENT_SOURCE_DIR}/snapshots")
361    endif()
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
371    llama_build_and_test(test-gguf.cpp)
372
373    # Needs non-public ggml{,-backend}-impl.h
374    llama_build_and_test(test-alloc.cpp)
375endif()
376
377llama_build(test-export-graph-ops.cpp)
378if (TARGET gguf-model-data)
379    target_link_libraries(test-export-graph-ops PRIVATE gguf-model-data)
380    target_compile_definitions(test-export-graph-ops PRIVATE LLAMA_HF_FETCH)
381endif()