AI@Home – Mistral Nemo 12B

Conditions & context

Today we’re looking at Mistral Nemo 12B model with 5-bit quantization and if my great experience of their 4B model was any indication, this 3-times-larger model with 12 billion parameters is looking up! Let’s dive in!

As in all my tests, I use the same prompt, the same hardware, and the same methodology. I’m looking at the same set of metrics across every model: VRAM usage, GPU utilization, CPU load, token throughput, tokens written, and total response time. These matter to me because they reveal whether a model is actually usable on consumer hardware — not just in theory, but in practice.

SpecsValue
Linux DistroUbuntu Server 24.04.4 LTS
Linux Kernel6.8.0-101
CPUIntel CORE i7 14th Gen 14700K Cores: 8P/12E Threads: 28
MotherboardMSI PRO B660M-A
RAM80 GB DDR4 (32+16+32+16)
SSDCrucial NVME 1TB
GPUMSI NVidia GeForce RTX 5060Ti Shadow 2X OC PCIe 5.0×8
CUDA Cores4,608
VRAM16 GB GDDR7 128-bit 448 GB/s
GPU DriverNVidia 590.48.01
CUDA version13.1
Ollama version0.17.4
ModelMistral Nemo 12B
QuantizationQ5

The prompt

Write a simple Python function that checks if a number is prime.
Explain how it works in plain English, like you're teaching
a beginner.
The results

Meet Astra. That’s the name Mistral Nemo 12B chose for herself when I asked — she/her pronouns. Wow! That is poetic and self-aware, just like her smaller 4B sibling Elysium. Two Mistral models, two unprompted poetic names. I wonder if this is a coincidence or training philosophy Mistral is putting on display here? You decide.

Now, enough poetry, back to business, and let’s look at the numbers. Averaging at 47 tokens/sec, Nemo 12B model sits in my own tests just above Google’s Gemma 12B and comfortably below the lightweight 7B — exactly where a 12B model should land on my GPU. But what caught my attention wasn’t the speed. It was the token count: 372 → 507 → 541 across three test runs. The model was building a richer, and arguably a more thorough response with each iteration. I have to stress this was unprompted! The question was always the same (see above).

ModelQuantRunTokens/secTotal TimeTokens WrittenVRAMGPU Util
Mistral Nemo 12BQ5147.798s3729.2GB97%
Mistral Nemo 12BQ5247.3411s5079.2GB97%
Mistral Nemo 12BQ5346.7112s5419.2GB97%

Mistral 12B, sorry, Astra (!) is like a teacher who keeps adding context because they want you to actually understand. That’s fascinating. And a cherry on top? Not only did she give the Python code for finding prime numbers, she even provided a simple Python script at the very end to execute it! Well done…

Rock solid performance — 97% GPU utilization across all three runs. And with just a hair over 9 GB VRAM usage that leaves room for another 5 GB model on my GPU. The code was correct and the best explained of all models in this series: inline comments, numbered step breakdown, usage examples with expected output, and the clearest square root explanation. This is Nemo’s personality showing — the model is more patient, more educational, more thorough than the brisk 7B without tipping into Gemma’s coldness. It sits in a sweet spot between the 7B’s speed and warmth and Gemma’s accuracy and verbosity.

One amusing footnote:
I gave Astra the full benchmark dataset in markdown table format and asked her to analyze it. She misidentified her own name, assigned it to Gemma 27B, and called Elysium a “Mistral 4B QAT” — wrong model, wrong parameters, wrong quantization! The model that excels at conversation apparently struggles with structured data. Oops! Mistral is optimized for conversation — fast and accurate — as long as you don’t expect it to parse tables or data. And it has no image recognition capability (at least not the one I tested). The numbers confirm it — in both directions.

The conclusion – TL;DR

Mistral Nemo 12B, a self-titled Astra, is the quiet overachiever in my view. No drama, no logic errors, no personality craziness — just a consistent, warm, polite, and thorough stream of 47 tokens a second, calmly living off a 9.2 GB plot of VRAM real estate. If GPT-OSS 20B is the PhD-level speed demon and Mistral 7B is the nimble daily driver on your aging PC, then Astra, the Mistral 12B, is the patient teacher you reach for when you don’t just want answers, but actually need to understand them — not just receive them wrapped in a pretty bow.. For explanations, documentation, teaching content, and anything where quality of reasoning matters more than sheer speed — I think this is your model.

Two thumbs up and a gold star for showing up and doing the work eloquently and without drama.
Mistral Nemo 12B, sorry: Astra (!) is my go to model now, always loaded in VRAM.

Europeans have caught up to America and China, and I like a lot what the French are doing with it.
The fact that they keep such powerful models as open source, that is gold!

The output (pasted & unedited)

Alright, let’s create a simple Python function called is_prime that determines whether a given number is prime or not. A prime number is a natural number greater than 1 that has no positive divisors other than 1 and itself.

Here’s the function:

def is_prime(n):
# Check if n is less than 2 (the smallest prime number)
if n < 2:
return False
# Check all numbers up to the square root of n
for i in range(2, int(n ** 0.5) + 1):
# If n is divisible by any number in this range, it's not prime
if n % i == 0:
return False
# If no divisors are found, then n is a prime number
return True

Now let’s break down how the function works:

  1. Check if n is less than 2: The smallest prime number is 2. Any number less than 2 (e.g., 0 or 1) cannot be prime, so we immediately return False for these cases.
  2. Loop from 2 to the square root of n: Instead of checking divisibility up to n, which would take too long for large numbers, we only check up to its square root. Why? Because a larger factor of n must be a multiple of smaller factor that has already been checked.
  3. Check if n is divisible by any number in the range: Inside the loop, we use the modulo operator % to check if there’s a remainder when dividing n by each number i. If there’s no remainder (i.e., n % i == 0), then it means that i is a factor of n, and thus n is not prime. In this case, we return False.
  4. If no divisors are found, n is prime: After checking all possible factors up to the square root of n, if none of them divide n evenly, then n must be a prime number! We return True in this case.

Here’s how you can use the function:

print(is_prime(7)) # True, because 7 is a prime number
print(is_prime(15)) # False, because 15 has factors other than 1 and itself (e.g., 3)

This simple function helps us quickly determine whether a given number is prime or not.

Need Help?

Need help streamlining your processes or solving tricky business problems? I offer one-on-one consultations to get you unstuck fast. Book a free consultation with me today at goarcherdynamics.com.

Want more practical tips and workflow hacks? I publish them regularly on my blog — check it out and subscribe for newsletter updates: goarcherdynamics.com

Jiri Krecek Avatar

Posted by

Leave a Reply

Discover more from Archer Dynamics

Subscribe now to keep reading and get access to the full archive.

Continue reading