Pretty good

#2
by flyingweasel - opened

Been using it with oh-my-pi and llama.cpp (pull/25165/head:laguna) on a V100 32GB for development of personal rust, python, c++ and typescript projects since a couple days.
With Q4 KV-Quant it uses ~24GB, with full precision ~30GB of VRAM.

llama.cpp/build/bin/llama-server \
    -hf poolside/Laguna-XS-2.1-GGUF:Q4_K_M \
    --host 0.0.0.0 \
    --parallel 1 \
    --batch-size 1024 \
    --ubatch-size 512 \
    --temp 0.6 \
    --top-p 0.95 \
    --top-k 20 \
    --min-p 0.05 \
    --metrics \
    -lv 4 \
    --flash-attn on \
    --jinja \
    --cont-batching
15.48.449.247 I slot   operator(): id  0 | task 29489 | cached n_tokens = 102829, memory_seq_rm [102829, end)
15.50.701.264 I slot print_timing: id  0 | task 29489 | prompt processing, n_tokens =  22528, progress = 0.98, t =  47.90 s / 470.32 tokens per second
15.50.701.267 I slot   operator(): id  0 | task 29489 | cached n_tokens = 103853, memory_seq_rm [103853, end)
15.52.965.633 I slot print_timing: id  0 | task 29489 | prompt processing, n_tokens =  23552, progress = 0.99, t =  50.16 s / 469.50 tokens per second
15.52.965.637 I slot   operator(): id  0 | task 29489 | cached n_tokens = 104877, memory_seq_rm [104877, end)
15.53.052.741 I slot print_timing: id  0 | task 29489 | prompt processing, n_tokens =  23601, progress = 1.00, t =  50.25 s / 469.66 tokens per second
15.53.052.746 I slot   operator(): id  0 | task 29489 | cached n_tokens = 104926, memory_seq_rm [104926, end)
15.53.052.904 I slot create_check: id  0 | task 29489 | erasing context checkpoint too close to an earlier one (pos_min = 80011, pos_max = 81034, n_tokens = 81035, size = 60.007 MiB)
15.53.053.366 I slot create_check: id  0 | task 29489 | erasing context checkpoint too close to an earlier one (pos_min = 80302, pos_max = 81325, n_tokens = 81326, size = 60.007 MiB)
15.53.143.004 I slot create_check: id  0 | task 29489 | created context checkpoint 3 of 32 (pos_min = 103902, pos_max = 104925, n_tokens = 104926, size = 60.007 MiB)
15.54.253.398 I slot print_timing: id  0 | task 29489 | prompt processing, n_tokens =  24099, progress = 1.00, t =  51.45 s / 468.38 tokens per second
15.54.253.402 I slot   operator(): id  0 | task 29489 | cached n_tokens = 105424, memory_seq_rm [105424, end)
15.54.285.387 I slot create_check: id  0 | task 29489 | created context checkpoint 4 of 32 (pos_min = 104400, pos_max = 105423, n_tokens = 105424, size = 60.007 MiB)
15.54.318.583 I slot print_timing: id  0 | task 29489 | prompt processing, n_tokens =  24113, progress = 1.00, t =  51.52 s / 468.06 tokens per second
15.54.318.586 I slot   operator(): id  0 | task 29489 | cached n_tokens = 105438, memory_seq_rm [105438, end)
15.54.330.225 I slot init_sampler: id  0 | task 29489 | init sampler, took 11.50 ms, tokens: text = 105442, total = 105442
15.54.368.023 I slot create_check: id  0 | task 29489 | created context checkpoint 5 of 32 (pos_min = 104414, pos_max = 105437, n_tokens = 105438, size = 60.007 MiB)
15.57.407.944 I slot print_timing: id  0 | task 29489 | n_decoded =    141, tg =  46.84 t/s, tg_3s =  46.84 t/s
16.00.415.901 I slot print_timing: id  0 | task 29489 | n_decoded =    281, tg =  46.69 t/s, tg_3s =  46.54 t/s
16.03.430.496 I slot print_timing: id  0 | task 29489 | n_decoded =    421, tg =  46.61 t/s, tg_3s =  46.44 t/s
16.06.445.043 I slot print_timing: id  0 | task 29489 | n_decoded =    561, tg =  46.57 t/s, tg_3s =  46.44 t/s
16.09.459.962 I slot print_timing: id  0 | task 29489 | n_decoded =    701, tg =  46.54 t/s, tg_3s =  46.44 t/s
16.09.761.423 I cmn  common_reaso: deactivated (natural end)

Speed is ~30-80 inference token per second, 400-700 prompt processing token per second.

Works pretty well and seems to be on par with Qwen3.6 27B MTP (was using that before).
It has issues with looping sometimes, but I've encountered this with all MoE LLM's (and even some dense ones). And that can usually be fixed with a "/compact" as well as "take a different approach" (or similar).
Also it seems to sometimes "keep" context (references information from a previous session without reading that file or recalling memories, but that seems to be in line with linuxid10t's comment (https://github.com/ggml-org/llama.cpp/pull/25165#issuecomment-4985453742)?).

It seems to be more useful than any of the Gemma 4 (26B A4B / 31B) or Ornith 35B for my work.
It also has less issues with tool calling (e.g. OMP's hashline editing, glab, git and other CLI tool usage than Qwen 3.6 27B. Gemma 4 Models were pretty much unusable for OMP and Ornith stopped properly working after a ~60k context.
It also seems like it does not dilly-dally around like Qwen3.6 does (I've found Qwen tends to over-think or think for way too long).

Of course it's not almighty, so nudging it sometimes is necessary.
Also I've noticed it does not like to fill big gaps like Qwen does, so I feel like I have to use other wording or be more specific for certain tasks.

Anyways, these are my two cents, thanks for the model.

Just noticed that I have been using the wrong / non-recommended parameters.
With

llama.cpp/build/bin/llama-server \
    -hf poolside/Laguna-XS-2.1-GGUF:Q4_K_M \
    --host 0.0.0.0 \
    --parallel 1 \
    --batch-size 1024 \
    --ubatch-size 512 \
    --temp 1.0 \
    --top-p 1.0 \
    --top-k 20 \
    --metrics \
    -lv 4 \
    --flash-attn on \
    --jinja \
    --cont-batching

it works really good, have not seen looping again (yet?).

I'm getting unknown architecture still in the upstream llama.cpp b10091. But i thought laguna support was merged as of b10087.

0.00.465.633 E llama_model_load: error loading model: unknown model architecture: 'laguna'
0.00.465.636 E llama_model_load_from_file_impl: failed to load model
$ llama-server --version
version: 10091 (b4d6c7d)
built with GNU 15.2.0 for Linux x86_64

What am i doing wrong?

I'm getting unknown architecture still in the upstream llama.cpp b10091. But i thought laguna support was merged as of b10087.

0.00.465.633 E llama_model_load: error loading model: unknown model architecture: 'laguna'
0.00.465.636 E llama_model_load_from_file_impl: failed to load model
$ llama-server --version
version: 10091 (b4d6c7d)
built with GNU 15.2.0 for Linux x86_64

What am i doing wrong?

Just updated my llama-cpp to the latest state, but I can not reproduce your issue.

$ ./host_laguna_xs_2_1.sh 
0.00.341.680 I cmn  common_param: common_params_print_info: build 10103 (c588c4f47) with GNU 14.2.0 for Linux x86_64
...
0.00.465.229 I srv    load_model: loading model 'poolside/Laguna-XS-2.1-GGUF:Q4_K_M'
0.00.465.231 I srv    load_model: local path '/home/flyingweasel/.cache/huggingface/hub/models--poolside--Laguna-XS-2.1-GGUF/snapshots/1a37c0a5fb8c7a18e6106decb6be6327d1b63fa6/Laguna-XS-2.1-Q4_K_M.gguf'
0.00.465.240 I cmn  common_init_: fitting params to device memory ...
0.00.465.241 I cmn  common_init_: (for bugs during this step try to reproduce them with -fit off, or provide --verbose logs if the bug only occurs with -fit on)
0.00.465.244 I common_params_fit_impl: getting device memory data for initial parameters:
0.00.665.225 I common_memory_breakdown_print: | memory breakdown [MiB]     | total    free     self   model   context   compute    unaccounted |
0.00.665.230 I common_memory_breakdown_print: |   - CUDA0 (V100-PCIE-32GB) | 32494 = 32184 + (29903 = 19221 +   10360 +     322) +      -29593 |
0.00.665.231 I common_memory_breakdown_print: |   - Host                   |                    375 =   110 +       0 +     265                |
0.00.680.866 I common_params_fit_impl: projected to use 29903 MiB of device memory vs. 32184 MiB of free device memory
0.00.680.872 I common_params_fit_impl: will leave 2280 >= 1024 MiB of free device memory, no changes needed
0.00.680.872 I common_fit_params: successfully fit params to free device memory
0.00.680.876 I common_fit_params: fitting params to free memory took 0.22 seconds
0.00.702.810 I llama_model_loader: loaded meta data with 56 key-value pairs and 678 tensors from /home/flyingweasel/.cache/huggingface/hub/models--poolside--Laguna-XS-2.1-GGUF/snapshots/1a37c0a5fb8c7a18e6106decb6be6327d1b63fa6/Laguna-XS-2.1-Q4_K_M.gguf (version GGUF V3 (latest))
...
0.22.959.117 I sched_reserve: reserve took 192.40 ms, sched copies = 1
0.22.959.159 I cmn  common_init_: warming up the model with an empty run - please wait ... (--no-warmup to disable)
0.23.063.623 I srv    load_model: initializing, n_slots = 1, n_ctx_slot = 262144, kv_unified = 'false'
0.23.063.639 I spec common_specu: no implementations specified for speculative decoding
0.23.063.640 I slot   load_model: id  0 | task -1 | new slot, n_ctx = 262144
0.23.063.705 I srv    load_model: prompt cache is enabled, size limit: 8192 MiB
0.23.063.706 I srv    load_model: use `--cache-ram 0` to disable the prompt cache
0.23.063.706 I srv    load_model: for more info see https://github.com/ggml-org/llama.cpp/pull/16391
0.23.063.706 I srv    load_model: context checkpoints enabled, max = 32, min spacing = 8192
0.23.063.733 I srv          init: idle slots will be saved to prompt cache upon starting a new task
0.23.075.813 I srv          init: init: chat template, example_format: '<system>You are a helpful assistant</system>
<user>Hello</user>
<assistant><think></think>Hi there</assistant>
<user>How are you?</user>
<assistant><think>'
0.23.085.450 I srv          init: init: chat template, thinking = 1
0.23.085.484 I srv  llama_server: model loaded
0.23.085.487 I srv  llama_server: listening on http://0.0.0.0:8080
0.23.085.492 I srv  update_slots: all slots are idle

found it. some stale linked libraries that didn't get removed by my pipeline cleanup because they were renamed in the repo. all good now.

Damn this thing is fast. haven't tested the accuracy. but seeing about 33t/s token generation on my little 780M vs about 18t/s with Ornith.

Will do some more benchmarks tonight.

Looks like tg falls off pretty badly as the context increases. Ornith at Q8 is slower, but a lot more consistent.

$ llama-bench -hf poolside/Laguna-XS-2.1-GGUF:Q4_K_M -ngl 999 -t 16 -mmp 0 -fa 1 -ctk q8_0 -ctv q8_0 -p 0 -n 128 -d 0,16384,65536
ggml_vulkan: Found 1 Vulkan devices:
ggml_vulkan: 0 = AMD Radeon 780M Graphics (RADV PHOENIX) (radv) | uma: 1 | fp16: dot2 | bf16: 0 | fp4: 0 | warp size: 64 | shared memory: 65536 | int dot: 1 | matrix cores: KHR_coopmat
| model                          |       size |     params | backend    | ngl | threads | type_k | type_v |  fa | mmap |            test |                  t/s |
| ------------------------------ | ---------: | ---------: | ---------- | --: | ------: | -----: | -----: | --: | ---: | --------------: | -------------------: |
| laguna 30B.A3B Q4_K - Medium   |  18.88 GiB |    33.44 B | Vulkan     | 999 |      16 |   q8_0 |   q8_0 |   1 |    0 |           tg128 |         36.16 Β± 0.03 |
| laguna 30B.A3B Q4_K - Medium   |  18.88 GiB |    33.44 B | Vulkan     | 999 |      16 |   q8_0 |   q8_0 |   1 |    0 |  tg128 @ d16384 |         28.18 Β± 0.08 |
| laguna 30B.A3B Q4_K - Medium   |  18.88 GiB |    33.44 B | Vulkan     | 999 |      16 |   q8_0 |   q8_0 |   1 |    0 |  tg128 @ d65536 |         17.11 Β± 0.01 |

build: 0278d83 (10098)

I asked Laguna 2.1 XS model to solve simple logical task - 4 travelers cross the bridge with 1 light source (a must), different walk times. Question is: what is minimal time?
Catch is capacity of the bridge is not set, so valid answer is 4 walk at once with slowest walker is the answer.
Also I used my custom prompt which switches Gemma 4 to explore all possibilities and than Gemma finds "4 at once".
Well, this model was thinking for long (in output chat, not in tag thinking), than lost between 2 answers, decided to check internet, found the typical standard question (without catch) with different timings, and used that timings to compute answer for me.
So what it did - it invented new task and solved it instead mine.
So I'm not really sure what for this model could be used...to follow super detailed instructions?

Anyone thinking it's anything like qwen 3.6 27B ask to replicate any tokenchaser prompt he used for qwen 3.6 27B. See for yourself that is no where close.

Sign up or log in to comment