Tutorial: How to Run & Fine-tune Gemma 3
How to run Gemma 3 effectively with our GGUFs on llama.cpp, Ollama, Open WebUI and how to fine-tune with Unsloth!
Last updated
Was this helpful?
How to run Gemma 3 effectively with our GGUFs on llama.cpp, Ollama, Open WebUI and how to fine-tune with Unsloth!
Last updated
Was this helpful?
Google released Gemma 3 in 4 sizes - 1B, 4B, 12B and 27B models! The smallest 1B model is text only, whilst the rest are capable of vision and text input! We provide GGUFs, and a guide of how to run it effectively, and how to finetune & do reasoning finetuning with Gemma 3! View all versions of Gemma 3 on Hugging Face here.
Unsloth is the only framework which works in float16 machines for Gemma 3 inference and training. This means Colab Notebooks with free Tesla T4 GPUs also work!
Fine-tune Gemma 3 (4B) using our free Colab notebook
According to the Gemma team, the optimal config for inference is
temperature = 1.0, top_k = 64, top_p = 0.95, min_p = 0.0
Ollama has recently fixed their sampling issues, so for all inference frameworks including Ollama, llama.cpp etc., use temperature = 1.0
Unsloth Gemma 3 uploads with optimal configs:
We fixed an issue with our Gemma 3 GGUF uploads where previously they did not support vision. Now they do.
According to the Gemma team, the official recommended settings for inference is:
Temperature of 1.0
Top_K of 64
Min_P of 0.00 (optional, but 0.01 works well, llama.cpp default is 0.1)
Top_P of 0.95
Repetition Penalty of 1.0. (1.0 means disabled in llama.cpp and transformers)
Chat template:
Chat template with \n
newlines rendered (except for the last)
llama.cpp an other inference engines auto add a <bos> - DO NOT add TWO <bos> tokens! You should ignore the <bos> when prompting the model!
Install ollama
if you haven't already!
Run run the model! Note you can call ollama serve
in another terminal if it fails! We include all our fixes and suggested parameters (temperature etc) in params
in our Hugging Face upload!
Obtain the latest llama.cpp
on GitHub here. You can follow the build instructions below as well. Change -DGGML_CUDA=ON
to -DGGML_CUDA=OFF
if you don't have a GPU or just want CPU inference.
Download the model via (after installing pip install huggingface_hub hf_transfer
). You can choose Q4_K_M, or other quantized versions (like BF16 full precision). More versions at: https://huggingface.co/unsloth/gemma-3-27b-it-GGUF
Run Unsloth's Flappy Bird test
Edit --threads 32
for the number of CPU threads, --ctx-size 16384
for context length (Gemma 3 supports 128K context length!), --n-gpu-layers 99
for GPU offloading on how many layers. Try adjusting it if your GPU goes out of memory. Also remove it if you have CPU only inference.
The full input from our https://unsloth.ai/blog/deepseekr1-dynamic 1.58bit blog is:
Remember to remove <bos> since Gemma 3 auto adds a <bos>!
Our solution in Unsloth is 3 fold:
Keep all intermediate activations in bfloat16 format - can be float32, but this uses 2x more VRAM or RAM (via Unsloth's async gradient checkpointing)
Do all matrix multiplies in float16 with tensor cores, but manually upcasting / downcasting without the help of Pytorch's mixed precision autocast.
Upcast all other options that don't need matrix multiplies (layernorms) to float32.
Unsloth is the only framework which works in float16 machines for Gemma 3 inference and training. This means Colab Notebooks with free Tesla T4 GPUs also work!
Fine-tune Gemma 3 (4B) using our free Colab notebook
First, before we finetune or run Gemma 3, we found that when using float16 mixed precision, gradients and activations become infinity unfortunately. This happens in T4 GPUs, RTX 20x series and V100 GPUs where they only have float16 tensor cores.
For newer GPUs like RTX 30x or higher, A100s, H100s etc, these GPUs have bfloat16 tensor cores, so this problem does not happen! But why?
Float16 can only represent numbers up to 65504, whilst bfloat16 can represent huge numbers up to 10^38! But notice both number formats use only 16bits! This is because float16 allocates more bits so it can represent smaller decimals better, whilst bfloat16 cannot represent fractions well.
But why float16? Let's just use float32! But unfortunately float32 in GPUs is very slow for matrix multiplications - sometimes 4 to 10x slower! So we cannot do this.