Text Generation
PEFT
Safetensors
English
French
lora
qlora
function-calling
tool-calling
nemotron
llama-3.1
built-with-llama
multilingual
conversational
Eval Results (legacy)
abdelstark's picture
Add the bilingual en+fr adapter, tokenizer metadata, card, and run reports
624b71d verified
|
Raw
History Blame Contribute Delete
7.79 kB
---
language:
- en
- fr
license: other
license_name: nvidia-open-model-license
license_link: https://www.nvidia.com/en-us/agreements/enterprise-software/nvidia-open-model-license/
library_name: peft
pipeline_tag: text-generation
base_model: nvidia/Llama-3.1-Nemotron-Nano-8B-v1
base_model_relation: adapter
datasets:
- abdelstark/sommelier-xlam-single-call-splits
- abdelstark/sommelier-xlam-single-call-splits-fr
- Salesforce/xlam-function-calling-60k
tags:
- lora
- qlora
- peft
- function-calling
- tool-calling
- nemotron
- llama-3.1
- built-with-llama
- multilingual
model-index:
- name: llama-3.1-nemotron-nano-8b-xlam-tool-calling-fr-en-lora
results:
- task:
type: text-generation
name: Single JSON tool-call generation (English slice)
dataset:
type: abdelstark/sommelier-xlam-single-call-splits
name: sommelier-xlam-single-call-splits
split: test
metrics:
- type: valid_json_rate
name: Valid JSON rate
value: 0.997
- type: function_name_accuracy
name: Function name accuracy
value: 0.993
- type: argument_exact_match
name: Argument exact match
value: 0.873
- type: argument_f1
name: Argument F1 (micro, flattened keys)
value: 0.9211
- type: full_call_exact_match
name: Full-call exact match
value: 0.87
- task:
type: text-generation
name: Single JSON tool-call generation (French slice)
dataset:
type: abdelstark/sommelier-xlam-single-call-splits-fr
name: sommelier-xlam-single-call-splits-fr
split: test
metrics:
- type: valid_json_rate
name: Valid JSON rate
value: 0.9954
- type: function_name_accuracy
name: Function name accuracy
value: 0.9898
- type: argument_exact_match
name: Argument exact match
value: 0.8760
- type: argument_f1
name: Argument F1 (micro, flattened keys)
value: 0.9208
- type: full_call_exact_match
name: Full-call exact match
value: 0.8726
---
# Llama-3.1-Nemotron-Nano-8B — bilingual (en+fr) xlam tool-calling LoRA
**Built with Llama.**
A QLoRA adapter for
[nvidia/Llama-3.1-Nemotron-Nano-8B-v1](https://huggingface.co/nvidia/Llama-3.1-Nemotron-Nano-8B-v1)
that turns free-form user requests, in English or French, plus a set of
JSON tool schemas into **exactly one schema-valid JSON tool call** — no
prose, no markdown fences, no explanations.
This is the v2 of
[llama-3.1-nemotron-nano-8b-xlam-tool-calling-lora](https://huggingface.co/abdelstark/llama-3.1-nemotron-nano-8b-xlam-tool-calling-lora):
same base model, same hyperparameters, same pipeline, one changed
variable — the training data adds a French paired variant of every
selected row ([abdelstark/sommelier-xlam-single-call-splits-fr](https://huggingface.co/datasets/abdelstark/sommelier-xlam-single-call-splits-fr)),
where only the query is translated and tool schemas and gold answers stay
byte identical. Trained and evaluated end to end with
[sommelier](https://github.com/AbdelStark/sommelier); this repository
contains the adapter weights, tokenizer metadata, and the machine-readable
evaluation evidence for the exact run that produced them
(`nemotron-8b-fr-full-4`).
## Why this exists
Tool calling should work as well in French as in English, and that is a
claim worth measuring rather than assuming. Measured on this task family
(n=1000 en, n=879 fr, same prompts by digest, greedy decoding, conservative
parser):
- The base model loses 4.2 points of full-call exact match on French input
(0.663 vs 0.705).
- The English-only v1 adapter transfers surprisingly well, narrowing the
gap to 2.3 points (fr 0.851).
- This adapter closes the gap to measurement noise: **fr 0.873 vs en
0.870** (+0.3 points, French slightly ahead).
## Evaluation
Base model vs. this adapter, per language slice, on the held-out test
splits. Both evaluations used byte-identical prompts per slice, greedy
decoding (temperature 0.0, `max_new_tokens` 512), and the same conservative
parser (`sommelier.parser.v1`) that counts every parse failure as a metric
failure. The comparison is only written when config, test-split, per-slice
prompt-set, parser, and decoding digests all match.
### English slice (n=1000)
| Metric | Base | Adapter | Delta |
|--------|------|---------|-------|
| valid_json_rate | 0.9160 | **0.9970** | +0.0810 |
| function_name_accuracy | 0.9110 | **0.9930** | +0.0820 |
| argument_exact_match | 0.7070 | **0.8730** | +0.1660 |
| argument_f1 | 0.7569 | **0.9211** | +0.1642 |
| full_call_exact_match | 0.7050 | **0.8700** | +0.1650 |
### French slice (n=879)
| Metric | Base | Adapter | Delta |
|--------|------|---------|-------|
| valid_json_rate | 0.9044 | **0.9954** | +0.0910 |
| function_name_accuracy | 0.8976 | **0.9898** | +0.0922 |
| argument_exact_match | 0.6655 | **0.8760** | +0.2105 |
| argument_f1 | 0.7091 | **0.9208** | +0.2117 |
| full_call_exact_match | 0.6633 | **0.8726** | +0.2093 |
Relative to the v1 English-only adapter, the English slice sits 0.3 to 0.8
points lower (full-call 0.870 vs 0.874, argument F1 0.9211 vs 0.9291), within
one standard error at n=1000, while French gains 2.2 points of full-call
exact match. The full per-slice reports, the gated comparison with its
language-gaps section, and the runtime evidence (L40S, 5 h 42 m training,
peak 26,369 MiB, pinned package versions) are in [`reports/`](./reports).
## Training
QLoRA (NF4, bf16 compute), rank 16, alpha 32, dropout 0.05, all seven
projection modules, 2 epochs, effective batch 16, cosine schedule with
3 percent warmup, `max_sequence_length` 4096, completion-only loss with a
proven prompt boundary. Data: the 15,000-row English train split plus
13,113 French paired rows (the French set runs short where the gold
contract rejects translation; the drop accounting is in the dataset card).
The system prompt stays English for both languages: the query language is
the only moving variable.
## Usage
```python
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer
base = "nvidia/Llama-3.1-Nemotron-Nano-8B-v1"
adapter = "abdelstark/llama-3.1-nemotron-nano-8b-xlam-tool-calling-fr-en-lora"
tokenizer = AutoTokenizer.from_pretrained(base)
model = AutoModelForCausalLM.from_pretrained(base, dtype="auto", device_map="auto")
model = PeftModel.from_pretrained(model, adapter)
```
Prompt format: system message with the instruction and the canonical JSON
of the available tools, then the user request (English or French); the
model answers with the canonical JSON of one tool call. See the
[sommelier documentation](https://abdelstark.github.io/sommelier/) for the
exact template contract.
## Limitations
- Single tool call per request; multi-call plans are out of scope.
- One run, one seed. The French test slice is machine-translated (reviewed
on samples, not row by row) and excludes rows whose gold arguments embed
English text, so it is slightly biased toward language-neutral arguments.
- Exact canonical-JSON scoring penalizes semantically equivalent forms;
both models face the identical contract.
- Instruction-language effects are unmeasured: the system prompt is English
for both slices by design.
## License and attribution
Adapter weights: [NVIDIA Open Model License](https://www.nvidia.com/en-us/agreements/enterprise-software/nvidia-open-model-license/),
as a derivative of nvidia/Llama-3.1-Nemotron-Nano-8B-v1. **Built with
Llama**: the base model derives from Llama 3.1 and this repository follows
the [Llama 3.1 Community License](https://www.llama.com/llama3_1/license/)
naming and notice requirements. Training data derives from
[Salesforce/xlam-function-calling-60k](https://huggingface.co/datasets/Salesforce/xlam-function-calling-60k)
(CC BY 4.0).