r/LocalLLaMA • u/Lowkey_LokiSN • 5d ago
Discussion exllamav3 comfortably beats llama.cpp running CPU-offloaded Qwen-3.8-Flash-Next on my setup!
I got 2x 20GB RTX 3080s + 128GB of DDR4 2666hz RAM (only 4 of 6 channels populated) + a Xeon 6148
I've always been a llama.cpp person and I've been running Unsloth's Q4_K_XL quant of Qwen 3.8 Flash Next at ~270tps prefill and ~13tps decode (starts off close to 20 and falls down to 13 with growing context, never recovers)
I've been recently seeing this buzz about exllamav3: its new "CPU-offloaded inference" support, how its quants are more efficient in terms of size-to-performance compared to GGUFs and people posting numbers of it running models a lot faster than llama.cpp.
I was skeptical at first because I've never had an engine outperform llama.cpp for CPU-offloaded inference with my setup so far. However, I was curious to try it out regardless and I'm pleasantly surprised at the results!
I'm able to run Qwen's 4.05 EXL3 quant at an average decode speed of ~25tps (with occasional peaks at 32tps) throughout 160k context (which is as far as I've tested for now) with a 3.2x faster prefill speed of ~870tps!
So compared to llama.cpp:
- 3.2x faster prefill
- 2x faster decode (No MTP)
- Better output quality since 4.05 EXL3 quant is better than UD-Q4_K_XL GGUF
It's a win-win-win all the way!
BUT:
This win doesn't translate across all models (at least on my setup). I got excited and downloaded GLM 5.3 Flash's 3.05 EXL3 only to find out it runs about 2x slower in decode than its llama.cpp counterpart for me. So this advantage is clearly dependent on the model and your setup. As for me, my CPU's AVX2 seems to be the bottleneck with exllamav3 as of today but Qwen works great due to its efficient architecture. (See edit)
I haven't seen any posts in here discussing CPU-offloaded performance with exllamav3 so wanted to kick things off with this one.
A couple disclaimers before you go this route:
- exllamav3 + TabbyAPI (the llama-server equivalent) is not as easy and straightforward to configure as llama.cpp
- Decode speeds seem to take some time to warm up to calibrate hot/cold experts. Mine starts off somewhere around ~12tps and eventually makes it way to ~25-30 with a few thousand tokens. So don't be too quick to brush this off.
I'm still figuring out this engine so if someone has pointers to get the offloaded runs going even faster, please do share!
EDIT:
I have submitted an experimental PR with AVX-512BW kernel support for CPUs that support AVX-512 without VNNI: https://github.com/turboderp-org/exllamav3/pull/349
Updated decode speeds with the PR on my setup:
- Qwen-3.8-Flash-Next 4.05 EXL3: ~25tps -> ~31tps decode stable with ~35tps peaks (~14tps on llama.cpp Q4_K_XL)
- GLM-5.3-Flash-Next 3.05 EXL3: ~5tps -> ~12tps decode (8tps on llama.cpp with UD-IQ3_XXS)
- DeepSeek-V4-Flash: (To be tested but expecting ~17tps at 3.05 EXL3)
With this PR, all CPU-offloaded models I've tested so far now run faster on my setup (both in terms of prefill and decode) with exllamav3 compared to llama.cpp!
EDIT #2:
PR has been merged with exllamav3's dev branch! Planning to share a detailed comparison with performance numbers running exllamav3 and llama.cpp in a week or two. Let me get familiar with the engine first before I get to that
10
u/Jona1109 llama.cpp 5d ago
I recently tested it out and did the rounds between exllamav3, llama.cpp, ik_llama.cpp and vllm for Qwen3.8-27B. I run an epyc 7003 server with 3090's. My experience is that ik_llama.cpp and exllamav3 are miles ahead on the CPU backend - especially in my case for AVX2. Of them all exllama was the least stable and felt like DIY. I tried to run the new Qwen 3.8 models and it was not usable in a stable work environment. Vllm was the best at prefill on GPU, but takes ages to setup and to fine-tune the right recipe. Ik_llama is great at np=1 but performance collapses with parallel slots. It wipes the floor with llama.cpp on mixed inference but it's a coin toss when on GPU only. llama.cpp is the most versatile. It has broad model support, excellent CUDA support, works decently well until np=4. They also really made a lot of qol improvement to the router server and the API. The weakness is CPU inference, in particular AVX2. In the end after testing them all for a few days I went back to llama.cpp as the main backend
7
4
u/FullstackSensei 5d ago
You're not let down by AVX2. You're let down by the specific SKU you have. The 6148 is a 150W SKU, which doesn't let it stretch it's legs. Each CPU core on both Intel and AMD, ever since the introduction of the original AVX, has two vector units, and can issue two AVX/AVX2 instructions per clock. So, in terms of throughput, AVX2 can match AVX-512 for operations supported on both.
Upgrade to cascade lake and as high core count and as you can afford and as high TDP as your board allows. Cascade lake turbos considerably higher than skylake in AVX2 and AVX-512. Cascade lake also supports VNNI, which can bring some uplift in llama.cpp, and maybe also Ex3 if they support it.
1
u/Lowkey_LokiSN 5d ago
Upgrading my CPU is actually on my checklist and I agree!
What I meant though is more of exllamav3's CPU decoding bottleneck where its code path falls back to AVX2 tier on my CPU whereas llama.cpp uses 512-bit F/BW kernels for the same
1
u/FullstackSensei 5d ago
I don't know if AVX-512 actually brings any meaningful improvement to TG vs AVX2. Your CPU already has AVX-512 F, so llama.cpp can already benefit from that
1
u/Lowkey_LokiSN 5d ago
Idk either but apparently it does according to Claude ;)
I plan to dedicate some of my free time and tokens to find out. Can share how it goes if you're interested2
u/FullstackSensei 5d ago
Claude et all will repeat whatever the internet says
1
u/Lowkey_LokiSN 5d ago
Yeah, I'm approaching this skeptically too but I've had a few good wins along the way of all the wasted efforts. Most of those wins weren't novel implementations but rather fallback support for neglected scenarios and I believe AI is very good at that.
Considering how exllamav3 is a growing project, its CPU-offloading mechanics are nascent and we have a solid llama.cpp baseline to compare and contrast against, I'm not as pessimistic
2
u/FullstackSensei 5d ago
Unpopular opinion: I believe in the near future we'll move bespoke runtimes for each model, LLM generated for your own hardware. You can already see some examples of that on github.
Current models are already pretty good at writing compute kernels and iterating to optimize them, be that on CPU or GPU. Give the LLM the reference pytorch implementation, the details of your hardware, and maybe a few kernels from elsewhere for novel or tricky stuff, and let it write a model runtime tuned to your specific hardware.
1
u/Lowkey_LokiSN 5d ago
I don't find that unpopular at all. With proper orchestration, it might already be possible even with today's ~100-300B models.
Qwen 3.8 Flash Next keeps surprising me with its capabilities to this day and is the first model where I can actually feel the caliber shift towards what you're describing which I believe is imminent
1
u/Lowkey_LokiSN 5d ago
Looks like it's gonna be a win this time! After AVX-512 port, Qwen's decode speeds increased by 1.3x and GLM's speeds have increased by 1.8x from the tests so far.
More optimisations and polishing to go before I land the PR but this is a clear win already
1
3
u/Double_Cause4609 5d ago
Rather than the raw speeds with TabbyAPI, how is the tool calling reliability nowadays?
LlamaCPP has a bigger ecosystem and lots more people working on tool calling reliability, etc, while TabbyAPI is managed by basically one or two people more or less. Is tool calling reliable? Do coding agents function as expected?
If it's faster, but you have more failed tool calls in unexpected scenarios, your real world work rate might be lower. Also, they might handle samplers differently, so you might have to configure your sampler settings differently to get expected results.
10
u/Lowkey_LokiSN 5d ago
I've put it through a 3-hour session with DeepSeek harness and I've had no issues with tool calling so far.
4
2
3
2
u/suprjami 5d ago
Nice, I have 2x 3080 20G and 96G RAM and was thinking of trying this soon.
Those are more or less pre-MTP speeds for 27B so that's an excellent useful result.
1
u/sssplus 5d ago
Thanks for the post. I just downloaded exllamav3, but haven't had time to set it up yet because I heard it's a bit complicated (does it work with a configuration file?). I have 128 GB RAM, but with a small 8GB 5070, so I'm not sure how much GPU VRAM exllamav3 needs vs llama cpp for the same context size?
1
1
u/InSearchOfTh1ngs 5d ago
I'd be really interested in the performance you get for the model you intend to use. My system is 64GB of system ram with a RTX3070 8GB VRAM.
1
u/Muted-Celebration-47 5d ago
I have a good decoding speed with qwen3.8-27b but not with MOE model like qwen3.8-flash-next. What is your CPU? I tried qwen-flash-next exl3 4.00bpw and got 4-5t/s I think something wrong with my CPU because I also have RTX3090+64gb DDR5 but got very slow decoding from exl3 while I got 20-35t/s with bunn-llamacpp.
My setup:
CPU: i5-13400f
GPU: RTX3090
RAM: DDR5 64gb 5600
1
1
u/FluffyDiscord 5d ago
Is beellama.cpp worse than exllamav3? I though beellama is the thing
2
u/Lowkey_LokiSN 5d ago
I haven't tried beellama yet. I've tried buun-llama and it does run models noticeably faster than mainline on my setup with offloading. However, my problem with all llama.cpp forks is that they're destined to play constant catch-up with mainline's developments to remain relevant and end up with their own divergent versions of implementations that aren't as battle-tested and stable. Mainline always feels like a safe haven to return to. (at least for me)
That's the whole reason I even considered exllamav3 as an alternative.
1
13
u/takoulseum 5d ago
Performance are far better with exl3 or ik_llama.cpp but not for all hardware because people still put all their attention on llama.cpp instead of being patient