This is my first time submitting a technical report on GitHub.
I am not an expert on FreeToken internals. I tested this with the assistance of AI (ChatGPT), which helped me diagnose the errors and modify the configuration/source code. I am reporting the result because it may be useful for low-VRAM GPU support.
My goal was to see whether Qwen3.6-35B-A3B-NVFP4 could run practically on a GPU with only 4 GB VRAM.
Environment
- GPU: NVIDIA GeForce RTX 2050, 4 GB VRAM
- OS: Windows 11 + WSL2 / Ubuntu 24.04
- FreeToken: current main branch, version 0.1.2
- Model: nvidia/Qwen3.6-35B-A3B-NVFP4
- CPU MoE threads: 8
With the default CPU MoE configuration, FreeToken allocates a two-layer prefill buffer:
override("moe_cache_size", 2 * num_experts)
override("moe_prefill_overlap", True)
On my 4 GB GPU this eventually failed with CUDA device not ready errors during GPU allocations.
I changed only these two source lines in python/freetoken/engine/engine.py:
- override("moe_cache_size", 2 * num_experts)
- override("moe_prefill_overlap", True)
- override("moe_cache_size", num_experts)
- override("moe_prefill_overlap", False)
For this model, num_experts = 256, so this reduces the GPU MoE cache from 512 slots to 256 slots and disables prefill overlap.
I also used:
export FREETOKEN_PIN_BUDGET_GB=10
export FREETOKEN_MAMBA_SSM_DTYPE=float16
ft serve
--model-path nvidia/Qwen3.6-35B-A3B-NVFP4
--max-seq-len-override 1024
--num-tokens 512
--memory-ratio 0.98
--attention-backend triton
--moe-backend cpu
--expert-load serial
--moe-cpu-threads 8
--max-running-requests 1
--host 127.0.0.1
--port 1919
The server successfully initialized and accepted OpenAI-compatible /v1/chat/completions requests.
Example measured decode throughput:
Decode batch ... gen throughput (token/s): 20.70
Decode batch ... gen throughput (token/s): 21.33
So the steady-state decode throughput was approximately 21 tokens/sec on an RTX 2050 with only 4 GB VRAM.
For comparison, in my previous testing with a 12 GB GPU, the same general FreeToken/Qwen3.6-35B-A3B-NVFP4 setup was around 30 tokens/sec.
There are still limitations. The expert banks could not all be OS-locked and FreeToken reported that they were left pageable. The configuration is also deliberately using a very small 512-token KV cache. Therefore, I am not suggesting that this is an optimal general-purpose configuration.
However, I thought the result was interesting because reducing the CPU-MoE prefill GPU cache from two expert layers to one allowed this 35B-A3B NVFP4 model to run and generate successfully on a 4 GB GPU.
Perhaps a low-VRAM option to use a single-layer prefill buffer with prefill overlap disabled could be useful upstream.
Again, this report was prepared with AI assistance, so please let me know if I have misunderstood any FreeToken internals or if additional logs/tests would be useful.
This is my first time submitting a technical report on GitHub.
I am not an expert on FreeToken internals. I tested this with the assistance of AI (ChatGPT), which helped me diagnose the errors and modify the configuration/source code. I am reporting the result because it may be useful for low-VRAM GPU support.
My goal was to see whether Qwen3.6-35B-A3B-NVFP4 could run practically on a GPU with only 4 GB VRAM.
Environment
With the default CPU MoE configuration, FreeToken allocates a two-layer prefill buffer:
override("moe_cache_size", 2 * num_experts)
override("moe_prefill_overlap", True)
On my 4 GB GPU this eventually failed with CUDA device not ready errors during GPU allocations.
I changed only these two source lines in python/freetoken/engine/engine.py:
For this model, num_experts = 256, so this reduces the GPU MoE cache from 512 slots to 256 slots and disables prefill overlap.
I also used:
export FREETOKEN_PIN_BUDGET_GB=10
export FREETOKEN_MAMBA_SSM_DTYPE=float16
ft serve
--model-path nvidia/Qwen3.6-35B-A3B-NVFP4
--max-seq-len-override 1024
--num-tokens 512
--memory-ratio 0.98
--attention-backend triton
--moe-backend cpu
--expert-load serial
--moe-cpu-threads 8
--max-running-requests 1
--host 127.0.0.1
--port 1919
The server successfully initialized and accepted OpenAI-compatible /v1/chat/completions requests.
Example measured decode throughput:
Decode batch ... gen throughput (token/s): 20.70
Decode batch ... gen throughput (token/s): 21.33
So the steady-state decode throughput was approximately 21 tokens/sec on an RTX 2050 with only 4 GB VRAM.
For comparison, in my previous testing with a 12 GB GPU, the same general FreeToken/Qwen3.6-35B-A3B-NVFP4 setup was around 30 tokens/sec.
There are still limitations. The expert banks could not all be OS-locked and FreeToken reported that they were left pageable. The configuration is also deliberately using a very small 512-token KV cache. Therefore, I am not suggesting that this is an optimal general-purpose configuration.
However, I thought the result was interesting because reducing the CPU-MoE prefill GPU cache from two expert layers to one allowed this 35B-A3B NVFP4 model to run and generate successfully on a 4 GB GPU.
Perhaps a low-VRAM option to use a single-layer prefill buffer with prefill overlap disabled could be useful upstream.
Again, this report was prepared with AI assistance, so please let me know if I have misunderstood any FreeToken internals or if additional logs/tests would be useful.