Downloads · 30 days
23
4% of all-time downloads
Qrzysztof/functiongemma-270m-it-prepaid-cards-v2-mlx
functiongemma-270m-it-prepaid-cards-v2-mlx is a text generation model from Qrzysztof. Use it when you need the model to write or continue text. It is set up for mlx. The card lists the license as gemma.
MLX-optimized 8-bit conversion of Qrzysztof/functiongemma-270m-it-prepaid-cards-v2 (a google/functiongemma-270m-it fine-tune for prepaid-card tool calling in 107 languages with noisy/multi-turn input).
Downloads · 30 days
23
4% of all-time downloads
All-time downloads
594
Public
Parameters
268M
318 MB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors285 MB · 89%
How the weights are stored.
U32268M · 100%
From the Hugging Face model README
MLX-optimized 8-bit conversion of
Qrzysztof/functiongemma-270m-it-prepaid-cards-v2
(a google/functiongemma-270m-it fine-tune for prepaid-card tool calling in
107 languages with noisy/multi-turn input).
Runs natively and fast on Apple Silicon (M1/M2/M3/M4) with mlx-lm; 304 MB on disk, fits easily in 8 GB-RAM Macs.
| File | Description |
|---|---|
model.safetensors (+ .index.json) | MLX weights, 8-bit quantized (≈8.5 bits/weight) |
config.json | MLX config incl. quantization info |
tokenizer.json, tokenizer_config.json | same tokenizer as the parent model |
chat_template.jinja | FunctionGemma chat template |
pip install mlx-lm
python3 -c "
from mlx_lm import load, generate
from mlx_lm.sample_utils import make_sampler
model, tokenizer = load('Qrzysztof/functiongemma-270m-it-prepaid-cards-v2-mlx')
prompt = '<bos><start_of_turn>developer...' # tokenizer.apply_chat_template(messages, tools=tools, add_generation_prompt=True)
print(generate(model, tokenizer, prompt=prompt, max_tokens=96, sampler=make_sampler(temp=0.0)))
"
API note: mlx-lm ≥ 0.30 removed temperature= in favour of a sampler object
(make_sampler(temp=0.0)).
Same as the parent model (see the SafeTensors card): synthetic data, uneven language quality, no backend — plus 8-bit quantization caveats.
pip install mlx-lm
python3 -m mlx_lm convert --hf-path <hf_model_dir> -q --q-bits 8
# output lands in ./mlx_model/ (no --output-dir in mlx-lm 0.31)
Full-precision (bf16) MLX version: same command without -q.
Same prompts & greedy decoding as the other formats, over the held-out v2 test subset (N=40).
| Format | Success rate |
|---|---|
| SafeTensors (reference) | 40/40 = 100% |
| MLX 8-bit | 40/40 = 100% |
8-bit quantization showed no drop in tool-name selection on this subset; argument wording can differ marginally from bf16.
This model was fine-tuned with the tutorial below; you can use it as the starting point for a new tool set (or fine-tune google/functiongemma-270m-it directly).
A complete, minimal fine-tune of a FunctionGemma-class model on this data (follows the official FunctionGemma fine-tuning guide).
pip install torch transformers trl datasets accelerate
huggingface-cli login # accept the gemma license for google/functiongemma-270m-it
The Hub dataset stores messages/tools as JSON strings (Arrow cannot infer
the nested schema), and TRL's SFTTrainer needs a uniform struct schema, so
normalize first:
import json
from datasets import load_dataset
from transformers import AutoModelForCausalLM, AutoTokenizer
def normalize_messages(msgs):
out = []
for m in msgs:
n = {"role": m["role"], "content": m.get("content") or "", "name": None,
"tool_call_id": m.get("tool_call_id"), "tool_calls": None}
if m["role"] == "tool":
n["name"] = m["content"]["name"]
n["content"] = json.dumps(m["content"]["response"], ensure_ascii=False)
if m.get("tool_calls"):
n["tool_calls"] = [{"id": tc.get("id"), "type": tc.get("type", "function"),
"function": {"name": tc["function"]["name"],
"arguments": json.dumps(tc["function"]["arguments"], ensure_ascii=False)}}
for tc in m["tool_calls"]]
out.append(n)
return out
def rows_to_dataset(rows):
from datasets import Dataset
return Dataset.from_list([{
"messages": normalize_messages(r["messages"]),
"tools": json.dumps(r["tools"], ensure_ascii=False),
} for r in rows])
ds = load_dataset("Qrzysztof/ecommerce-chat-tool-calling", token=HF_TOKEN)["train"]
train_rows = [{"messages": json.loads(r["messages_json"]), "tools": json.loads(r["tools_json"])}
for r in ds if r["split"] == "train"]
train_ds = rows_to_dataset(train_rows)
import torch
from transformers import AutoModelForCausalLM
from trl import SFTConfig, SFTTrainer
model = AutoModelForCausalLM.from_pretrained("google/functiongemma-270m-it",
dtype=torch.bfloat16, attn_implementation="eager")
tokenizer = AutoTokenizer.from_pretrained("google/functiongemma-270m-it")
trainer = SFTTrainer(
model=model,
args=SFTConfig(
output_dir="functiongemma-ecommerce",
max_length=1024, # covers the longest sample + margin
packing=False, # keep tool calls intact (no cross-sample packing)
num_train_epochs=3,
per_device_train_batch_size=8,
learning_rate=5e-5,
lr_scheduler_type="constant",
warmup_steps=50,
bf16=True, # or fp16 on non-Ampere GPUs
eval_strategy="epoch",
report_to="none",
),
train_dataset=train_ds,
processing_class=tokenizer,
)
trainer.train()
TRL applies the FunctionGemma chat template with the per-sample tools
column; assistant_only_loss=True (default) masks everything but the model's
own turns, so it learns to emit tool calls — not to copy the schema.
ok = 0
for item in test_rows:
inputs = tokenizer.apply_chat_template(item["messages"][:-1], tools=item["tools"],
add_generation_prompt=True, return_tensors="pt")
out = model.generate(**inputs, max_new_tokens=256)
output = tokenizer.decode(out[0][len(inputs["input_ids"][0]):], skip_special_tokens=False)
expected = <expected tool name / args from expected_json>
ok += expected-tool-in-output and no-other-tool-in-output
trainer.push_to_hub("YOUR_USER/functiongemma-ecommerce")
Data
noise.py engine skips any token containing digits.template_id) and hold out
whole languages + (for the e-commerce set) whole schemas — that is the
only honest way to measure generalization.Training
packing=False for tool-calling data; packed sequences splice mid-call.max_length ≥ longest sample + a margin; ~1024 covers these datasets.Evaluation
Deployment
...-v2 (SafeTensors)...-tool-calling-v2