char-fork/llama.cpp

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

Bartowskitests : add unit test coverage for llama_tensor_get_type (#20112)7992aa7c8

char/aliceai-t5-moe
6.8 KiB154 linesraw
1#include "gguf-model-data.h"
2
3#include <cstdio>
4
5#define TEST_ASSERT(cond, msg) \
6    do { \
7        if (!(cond)) { \
8            fprintf(stderr, "FAIL: %s (line %d): %s\n", #cond, __LINE__, msg); \
9            return 1; \
10        } \
11    } while (0)
12
13int main() {
14    fprintf(stderr, "=== test-gguf-model-data ===\n");
15
16    // Fetch Qwen3-0.6B Q8_0 metadata
17    auto result = gguf_fetch_model_meta("ggml-org/Qwen3-0.6B-GGUF", "Q8_0");
18
19    if (!result.has_value()) {
20        fprintf(stderr, "SKIP: could not fetch model metadata (no network or HTTP disabled)\n");
21        return 0;
22    }
23
24    const auto & model = result.value();
25
26    fprintf(stderr, "Architecture:  %s\n", model.architecture.c_str());
27    fprintf(stderr, "n_embd:        %u\n", model.n_embd);
28    fprintf(stderr, "n_ff:          %u\n", model.n_ff);
29    fprintf(stderr, "n_vocab:       %u\n", model.n_vocab);
30    fprintf(stderr, "n_layer:       %u\n", model.n_layer);
31    fprintf(stderr, "n_head:        %u\n", model.n_head);
32    fprintf(stderr, "n_head_kv:     %u\n", model.n_head_kv);
33    fprintf(stderr, "n_expert:      %u\n", model.n_expert);
34    fprintf(stderr, "n_embd_head_k: %u\n", model.n_embd_head_k);
35    fprintf(stderr, "n_embd_head_v: %u\n", model.n_embd_head_v);
36    fprintf(stderr, "tensors:       %zu\n", model.tensors.size());
37
38    // Verify architecture
39    TEST_ASSERT(model.architecture == "qwen3", "expected architecture 'qwen3'");
40
41    // Verify key dimensions (Qwen3-0.6B)
42    TEST_ASSERT(model.n_layer == 28, "expected n_layer == 28");
43    TEST_ASSERT(model.n_embd == 1024, "expected n_embd == 1024");
44    TEST_ASSERT(model.n_head == 16, "expected n_head == 16");
45    TEST_ASSERT(model.n_head_kv == 8, "expected n_head_kv == 8");
46    TEST_ASSERT(model.n_expert == 0, "expected n_expert == 0 (not MoE)");
47    TEST_ASSERT(model.n_vocab == 151936, "expected n_vocab == 151936");
48
49    // Verify tensor count
50    TEST_ASSERT(model.tensors.size() == 311, "expected tensor count == 311");
51
52    // Verify known tensor names exist
53    bool found_attn_q = false;
54    bool found_token_embd = false;
55    bool found_output_norm = false;
56    for (const auto & t : model.tensors) {
57        if (t.name == "blk.0.attn_q.weight") {
58            found_attn_q = true;
59        }
60        if (t.name == "token_embd.weight") {
61            found_token_embd = true;
62        }
63        if (t.name == "output_norm.weight") {
64            found_output_norm = true;
65        }
66    }
67    TEST_ASSERT(found_attn_q, "expected tensor 'blk.0.attn_q.weight'");
68    TEST_ASSERT(found_token_embd, "expected tensor 'token_embd.weight'");
69    TEST_ASSERT(found_output_norm, "expected tensor 'output_norm.weight'");
70
71    // Verify token_embd.weight shape
72    for (const auto & t : model.tensors) {
73        if (t.name == "token_embd.weight") {
74            TEST_ASSERT(t.ne[0] == 1024, "expected token_embd.weight ne[0] == 1024");
75            TEST_ASSERT(t.n_dims == 2, "expected token_embd.weight to be 2D");
76            break;
77        }
78    }
79
80    // Test that second call uses cache (just call again, it should work)
81    auto result2 = gguf_fetch_model_meta("ggml-org/Qwen3-0.6B-GGUF", "Q8_0");
82    TEST_ASSERT(result2.has_value(), "cached fetch should succeed");
83    TEST_ASSERT(result2->tensors.size() == model.tensors.size(), "cached result should match");
84
85    // Test a split MoE model without specifying quant (should default to Q8_0)
86    auto result3 = gguf_fetch_model_meta("ggml-org/GLM-4.6V-GGUF");
87    if (!result3.has_value()) {
88        fprintf(stderr, "SKIP: could not fetch GLM-4.6V metadata (no network?)\n");
89        return 0;
90    }
91    const auto & model3 = result3.value();
92
93    fprintf(stderr, "Architecture:  %s\n", model3.architecture.c_str());
94    fprintf(stderr, "n_embd:        %u\n", model3.n_embd);
95    fprintf(stderr, "n_ff:          %u\n", model3.n_ff);
96    fprintf(stderr, "n_vocab:       %u\n", model3.n_vocab);
97    fprintf(stderr, "n_layer:       %u\n", model3.n_layer);
98    fprintf(stderr, "n_head:        %u\n", model3.n_head);
99    fprintf(stderr, "n_head_kv:     %u\n", model3.n_head_kv);
100    fprintf(stderr, "n_expert:      %u\n", model3.n_expert);
101    fprintf(stderr, "n_embd_head_k: %u\n", model3.n_embd_head_k);
102    fprintf(stderr, "n_embd_head_v: %u\n", model3.n_embd_head_v);
103    fprintf(stderr, "tensors:       %zu\n", model3.tensors.size());
104
105    // Verify architecture
106    TEST_ASSERT(model3.architecture == "glm4moe", "expected architecture 'glm4moe'");
107
108    // Verify key dimensions (GLM-4.6V)
109    TEST_ASSERT(model3.n_layer == 46, "expected n_layer == 46");
110    TEST_ASSERT(model3.n_embd == 4096, "expected n_embd == 4096");
111    TEST_ASSERT(model3.n_head == 96, "expected n_head == 96");
112    TEST_ASSERT(model3.n_head_kv == 8, "expected n_head_kv == 8");
113    TEST_ASSERT(model3.n_expert == 128, "expected n_expert == 128 (MoE)");
114    TEST_ASSERT(model3.n_vocab == 151552, "expected n_vocab == 151552");
115
116    // Verify tensor count
117    TEST_ASSERT(model3.tensors.size() == 780, "expected tensor count == 780");
118
119    // Test a hybrid-attention model with array-valued head counts
120    auto result4 = gguf_fetch_model_meta("ggml-org/Step-3.5-Flash-GGUF", "Q4_K");
121    if (!result4.has_value()) {
122        fprintf(stderr, "FAIL: could not fetch Step-3.5-Flash metadata\n");
123        return 1;
124    }
125    const auto & model4 = result4.value();
126
127    fprintf(stderr, "Architecture:  %s\n", model4.architecture.c_str());
128    fprintf(stderr, "n_embd:        %u\n", model4.n_embd);
129    fprintf(stderr, "n_ff:          %u\n", model4.n_ff);
130    fprintf(stderr, "n_vocab:       %u\n", model4.n_vocab);
131    fprintf(stderr, "n_layer:       %u\n", model4.n_layer);
132    fprintf(stderr, "n_head:        %u\n", model4.n_head);
133    fprintf(stderr, "n_head_kv:     %u\n", model4.n_head_kv);
134    fprintf(stderr, "n_expert:      %u\n", model4.n_expert);
135    fprintf(stderr, "n_embd_head_k: %u\n", model4.n_embd_head_k);
136    fprintf(stderr, "n_embd_head_v: %u\n", model4.n_embd_head_v);
137    fprintf(stderr, "tensors:       %zu\n", model4.tensors.size());
138
139    TEST_ASSERT(model4.architecture == "step35", "expected architecture 'step35'");
140
141    TEST_ASSERT(model4.n_layer == 45, "expected n_layer == 45");
142    TEST_ASSERT(model4.n_embd == 4096, "expected n_embd == 4096");
143    TEST_ASSERT(model4.n_ff == 11264, "expected n_ff == 11264");
144    TEST_ASSERT(model4.n_head == 64, "expected n_head == 64 (first element of per-layer array)");
145    TEST_ASSERT(model4.n_head_kv == 8, "expected n_head_kv == 8 (first element of per-layer array)");
146    TEST_ASSERT(model4.n_expert == 288, "expected n_expert == 288");
147    TEST_ASSERT(model4.n_embd_head_k == 128, "expected n_embd_head_k == 128");
148    TEST_ASSERT(model4.n_embd_head_v == 128, "expected n_embd_head_v == 128");
149    TEST_ASSERT(model4.n_vocab == 128896, "expected n_vocab == 128896");
150    TEST_ASSERT(model4.tensors.size() == 754, "expected tensor count == 754");
151
152    fprintf(stderr, "=== ALL TESTS PASSED ===\n");
153    return 0;
154}