thealper2 commited on
Commit
bc6c786
·
verified ·
1 Parent(s): 281db24

Add fine-tuned LFM2-700M NL->command model

Browse files
README.md ADDED
@@ -0,0 +1,231 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ base_model: LiquidAI/LFM2-700M
3
+ library_name: transformers
4
+ pipeline_tag: text-generation
5
+ license: other
6
+ license_name: lfm1.0
7
+ license_link: https://huggingface.co/LiquidAI/LFM2-700M/blob/main/LICENSE
8
+ language:
9
+ - en
10
+ tags:
11
+ - lfm2
12
+ - linux
13
+ - bash
14
+ - shell
15
+ - command-generation
16
+ - text-generation
17
+ datasets:
18
+ - jiacheng-ye/nl2bash
19
+ - mecha-org/linux-command-dataset
20
+ ---
21
+
22
+ # thealper2/lfm2-700m-linux-command
23
+
24
+ LiquidAI/LFM2-700M fine-tuned to map a natural-language Linux task to a single shell
25
+ command. The target output is the command only; no explanation is produced.
26
+
27
+ ## Model details
28
+
29
+ | Field | Value |
30
+ | --- | --- |
31
+ | Base model | LiquidAI/LFM2-700M |
32
+ | Architecture | `Lfm2ForCausalLM` — hybrid, 16 layers: full attention at `[2, 5, 8, 10, 12, 14]`, gated short convolution elsewhere |
33
+ | Parameters | 742,489,344 total (641,826,048 non-embedding) |
34
+ | Hidden size / heads / KV heads | 1536 / 24 / 8 |
35
+ | Vocabulary | 65,536 |
36
+ | Context length (base) | 128,000 |
37
+ | Training precision | bfloat16 |
38
+ | Fine-tuning method | full |
39
+ | Task | NL instruction → shell command |
40
+
41
+ ## Prompt format
42
+
43
+ The model uses the LFM2 ChatML-style chat template and was trained with no
44
+ system prompt. Apply the template rather than constructing the string manually.
45
+
46
+ ```
47
+ <|startoftext|><|im_start|>user
48
+ Find which process is using port 8080.<|im_end|>
49
+ <|im_start|>assistant
50
+ lsof -i :8080<|im_end|>
51
+ ```
52
+
53
+ Two LFM2 tokenizer details matter:
54
+
55
+ - The chat template emits `bos_token` itself and `add_bos_token` is `true` in
56
+ `tokenizer_config.json`. Tokenise templated text with
57
+ `add_special_tokens=False`, or the sequence gets a duplicated BOS.
58
+ - Decode with `clean_up_tokenization_spaces=False`; the BPE cleanup step strips
59
+ spaces around punctuation and can corrupt shell commands.
60
+
61
+ Special tokens: BOS `<|startoftext|>` (1), EOS `<|im_end|>` (7), PAD `<|pad|>` (0).
62
+
63
+ ## Usage
64
+
65
+ ```python
66
+ import torch
67
+ from transformers import AutoModelForCausalLM, AutoTokenizer
68
+
69
+ model_id = "thealper2/lfm2-700m-linux-command"
70
+ tokenizer = AutoTokenizer.from_pretrained(model_id, clean_up_tokenization_spaces=False)
71
+ model = AutoModelForCausalLM.from_pretrained(model_id, dtype=torch.bfloat16).to("cuda").eval()
72
+
73
+ messages = [{"role": "user", "content": "Find which process is using port 8080."}]
74
+ prompt = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
75
+ inputs = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).to(model.device)
76
+
77
+ output = model.generate(
78
+ **inputs,
79
+ max_new_tokens=128,
80
+ do_sample=False, # deterministic decoding
81
+ eos_token_id=tokenizer.eos_token_id,
82
+ pad_token_id=tokenizer.pad_token_id,
83
+ )
84
+ command = tokenizer.decode(output[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True).strip()
85
+ print(command) # lsof -i :8080
86
+ ```
87
+
88
+ Greedy decoding (`do_sample=False`) is the intended configuration: the task has a
89
+ single intended answer and sampling only adds variance.
90
+
91
+ ## Training data
92
+
93
+ | Source | Raw rows | Schema |
94
+ | --- | --- | --- |
95
+ | [`jiacheng-ye/nl2bash`](https://huggingface.co/datasets/jiacheng-ye/nl2bash) | 9,305 | `nl`, `bash` |
96
+ | [`mecha-org/linux-command-dataset`](https://huggingface.co/datasets/mecha-org/linux-command-dataset) | 8,669 | `input`, `output` |
97
+
98
+ Both were normalised to `{instruction, command, source}` and then:
99
+
100
+ 1. **Cleaned** — markdown fences and `$`/`#` prompt prefixes stripped, whitespace
101
+ runs collapsed outside quoted strings, records with unbalanced quotes, prose
102
+ instead of a command, or no parseable utility dropped. Commands themselves
103
+ were never rewritten.
104
+ 2. **Deduplicated** — exact `(instruction, command)` duplicates removed. Rows
105
+ sharing a command with a different instruction, or an instruction with a
106
+ different valid command, were kept deliberately.
107
+ 3. **Balanced** — `find` was 35.2% of the raw corpus. It was capped per-utility
108
+ using a diversity-aware ordering that retains every distinct flag signature
109
+ before retaining any repeat, lowering its share to ~19%.
110
+ 4. **Split** — 90/5/5, grouped by instruction *template* (filenames, paths,
111
+ numbers and quoted literals abstracted) so templated paraphrases cannot
112
+ straddle the train/test boundary.
113
+
114
+ Split sizes: 11756 train / 652 validation / 653 test.
115
+ Leakage checks report zero overlap across splits at the exact-pair,
116
+ instruction and instruction-template level.
117
+
118
+ ## Training configuration
119
+
120
+ | Hyper-parameter | Value |
121
+ | --- | --- |
122
+ | Method | full |
123
+ | Epochs | 3 |
124
+ | Learning rate | 3e-05 |
125
+ | Scheduler | cosine |
126
+ | Warmup ratio | 0.03 |
127
+ | Weight decay | 0.01 |
128
+ | Optimizer | adamw_torch_fused |
129
+ | Per-device batch size | 16 |
130
+ | Gradient accumulation | 2 |
131
+ | Max sequence length | 128 |
132
+ | Precision | bfloat16 |
133
+ | Seed | 42 |
134
+
135
+ Loss is computed on the assistant turn only; prompt tokens are masked with
136
+ `-100`.
137
+
138
+ `max_length` was chosen from the tokenised length distribution of the corpus
139
+ (mean 37.7, median 34, p90 57, p95 66, p99 87, max 403) — a 128-token budget
140
+ covers 99.94% of examples.
141
+
142
+ ### Run record
143
+
144
+ | Field | Value |
145
+ | --- | --- |
146
+ | Final training loss | 0.516 |
147
+ | Validation loss | 0.6445 |
148
+ | Training time | 425.0 s |
149
+ | Peak VRAM | 8.95 GB |
150
+ | GPU | NVIDIA GeForce RTX 5060 Ti |
151
+ | torch / transformers | 2.11.0+cu128 / 5.17.0 |
152
+
153
+ ## Evaluation
154
+
155
+ Measured on the held-out test set with greedy decoding.
156
+
157
+ | Metric | Base LFM2-700M | Fine-tuned | Delta |
158
+ | --- | --- | --- | --- |
159
+ | Exact match | 0.0061 | 0.2910 | +0.2849 |
160
+ | Normalised exact match | 0.0061 | 0.2910 | +0.2849 |
161
+ | Structural match | 0.0107 | 0.3032 | +0.2925 |
162
+ | Command validity | 0.4763 | 0.9939 | +0.5176 |
163
+ | Token F1 | 0.1195 | 0.6470 | +0.5275 |
164
+ | Primary-utility accuracy | 0.1807 | 0.8377 | +0.6570 |
165
+ | Prose-output rate | 0.3783 | 0.0000 | -0.3783 |
166
+
167
+ Metric definitions:
168
+
169
+ - **Exact match** — string equality after stripping surrounding whitespace.
170
+ - **Normalised exact match** — equality after collapsing whitespace runs outside
171
+ quotes and removing a trailing `;`.
172
+ - **Structural match** — utility, flag multiset (short-flag bundles expanded for
173
+ utilities that use them) and operand sequence compared per pipeline segment.
174
+ Recognises `ls -la` == `ls -al`.
175
+ - **Command validity** — the output parses under a bash grammar parser
176
+ (`bashlex`), not membership in a list of known utilities.
177
+ - **Token F1** — token-level overlap, as partial credit.
178
+ - **Primary-utility accuracy** — the first utility matches the reference.
179
+ - **Prose-output rate** — fraction of outputs that read as an explanation rather
180
+ than a command.
181
+
182
+ ## Limitations
183
+
184
+ - **Structural match is not a semantic oracle.** It compares command *shape*. It
185
+ cannot tell that `find . -name '*.py'` and a shell glob achieve the same
186
+ result, and it does not reason about flag semantics. It is an upper bound on
187
+ exact match, not semantic accuracy.
188
+ - **Exact match understates correctness.** Many Linux tasks have several valid
189
+ answers; the test set carries one reference each.
190
+ - **Source-distribution bias.** `nl2bash` is `find`-heavy and composition-heavy;
191
+ `mecha-org/linux-command-dataset` is templated and single-utility-heavy.
192
+ Per-source metrics differ and are reported separately in the project reports.
193
+ - **Distribution shift.** Commands reference paths, hosts and variables that
194
+ appear in the training corpora (`/path/to/...`, `$source`). Outputs may embed
195
+ those placeholders instead of the user's real paths.
196
+ - **Short outputs only.** Trained at a 128-token budget; long multi-stage scripts
197
+ are out of distribution.
198
+ - **No verification of correctness or safety at generation time.** The model can
199
+ produce syntactically valid but wrong — or destructive — commands.
200
+
201
+ ## Intended use and safety
202
+
203
+ Intended for generating candidate shell commands for review, and as the command
204
+ generator of a sandboxed terminal agent.
205
+
206
+ **Do not execute generated commands directly on a host.** The project this model
207
+ comes from executes commands only inside a disposable Docker container started
208
+ with `--network none`, `--read-only`, `--cap-drop ALL`,
209
+ `--security-opt no-new-privileges`, a non-root user, no host bind mounts,
210
+ bounded CPU/memory/PIDs and a wall-clock timeout, and screens commands against a
211
+ destructive-pattern list and a read-only allowlist before running them.
212
+
213
+ ## License
214
+
215
+ Inherits the LFM Open License v1.0 of the base model, LiquidAI/LFM2-700M. Dataset
216
+ licenses apply to the training data: `mecha-org/linux-command-dataset` is
217
+ Apache-2.0; `nl2bash` derives from the
218
+ [TellinaTool/nl2bash](https://github.com/TellinaTool/nl2bash) corpus.
219
+
220
+ ## Citation
221
+
222
+ The NL2Bash corpus:
223
+
224
+ ```bibtex
225
+ @inproceedings{LinWZE2018:NL2Bash,
226
+ author = {Xi Victoria Lin and Chenglong Wang and Luke Zettlemoyer and Michael D. Ernst},
227
+ title = {NL2Bash: A Corpus and Semantic Parser for Natural Language Interface to the Linux Operating System},
228
+ booktitle = {LREC 2018},
229
+ year = {2018}
230
+ }
231
+ ```
chat_template.jinja ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {{- bos_token -}}
2
+ {%- macro format_arg_value(arg_value) -%}
3
+ {%- if arg_value is string -%}
4
+ {{- "'" + (arg_value | replace("\\", "\\\\") | replace("'", "\\'") | replace("\n", "\\n") | replace("\r", "\\r")) + "'" -}}
5
+ {%- elif arg_value is mapping or arg_value is iterable -%}
6
+ {{- arg_value | tojson -}}
7
+ {%- else -%}
8
+ {{- arg_value | string -}}
9
+ {%- endif -%}
10
+ {%- endmacro -%}
11
+ {%- macro render_tool_calls(tool_calls) -%}
12
+ {%- set tool_calls_ns = namespace(tool_calls=[]) -%}
13
+ {%- for tool_call in tool_calls -%}
14
+ {%- set func = tool_call["function"] if "function" in tool_call else tool_call -%}
15
+ {%- set func_name = func["name"] -%}
16
+ {%- set func_args = func.get("arguments") -%}
17
+ {%- set args_ns = namespace(arg_strings=[]) -%}
18
+ {%- if func_args is mapping -%}
19
+ {%- for arg_name, arg_value in func_args.items() -%}
20
+ {%- set args_ns.arg_strings = args_ns.arg_strings + [arg_name + "=" + format_arg_value(arg_value)] -%}
21
+ {%- endfor -%}
22
+ {%- elif func_args is string and (func_args | trim) not in ["", "{}", "null"] -%}
23
+ {{- raise_exception("Tool call arguments must be a mapping, got a JSON-encoded string: parse arguments with json.loads() before applying the chat template") -}}
24
+ {%- endif -%}
25
+ {%- set tool_calls_ns.tool_calls = tool_calls_ns.tool_calls + [func_name + "(" + (args_ns.arg_strings | join(", ")) + ")"] -%}
26
+ {%- endfor -%}
27
+ {{- "<|tool_call_start|>[" + (tool_calls_ns.tool_calls | join(", ")) + "]<|tool_call_end|>" -}}
28
+ {%- endmacro -%}
29
+ {%- set system_prompt = "" -%}
30
+ {%- set ns = namespace(system_prompt="") -%}
31
+ {%- if messages[0]["role"] == "system" -%}
32
+ {%- set ns.system_prompt = messages[0]["content"] -%}
33
+ {%- set messages = messages[1:] -%}
34
+ {%- endif -%}
35
+ {%- if tools -%}
36
+ {%- set ns.system_prompt = ns.system_prompt + ("\n" if ns.system_prompt else "") + "List of tools: <|tool_list_start|>[" -%}
37
+ {%- for tool in tools -%}
38
+ {%- if tool is not string -%}
39
+ {%- set tool = tool | tojson -%}
40
+ {%- endif -%}
41
+ {%- set ns.system_prompt = ns.system_prompt + tool -%}
42
+ {%- if not loop.last -%}
43
+ {%- set ns.system_prompt = ns.system_prompt + ", " -%}
44
+ {%- endif -%}
45
+ {%- endfor -%}
46
+ {%- set ns.system_prompt = ns.system_prompt + "]<|tool_list_end|>" -%}
47
+ {%- endif -%}
48
+ {%- if ns.system_prompt -%}
49
+ {{- "<|im_start|>system\n" + ns.system_prompt + "<|im_end|>\n" -}}
50
+ {%- endif -%}
51
+ {%- for message in messages -%}
52
+ {{- "<|im_start|>" + message["role"] + "\n" -}}
53
+ {%- set content = message.get("content") -%}
54
+ {%- if content is not string -%}
55
+ {%- set content = content | tojson -%}
56
+ {%- endif -%}
57
+ {%- if message["role"] == "tool" -%}
58
+ {%- set content = "<|tool_response_start|>" + content + "<|tool_response_end|>" -%}
59
+ {%- endif -%}
60
+ {%- if message["role"] == "assistant" and message.get("tool_calls") -%}
61
+ {%- if content and content != "null" -%}
62
+ {{- content -}}
63
+ {%- endif -%}
64
+ {{- render_tool_calls(message["tool_calls"]) -}}
65
+ {{- "<|im_end|>\n" -}}
66
+ {%- else -%}
67
+ {{- content + "<|im_end|>\n" -}}
68
+ {%- endif -%}
69
+ {%- endfor -%}
70
+ {%- if add_generation_prompt -%}
71
+ {{- "<|im_start|>assistant\n" -}}
72
+ {%- endif -%}
config.json ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "Lfm2ForCausalLM"
4
+ ],
5
+ "block_auto_adjust_ff_dim": true,
6
+ "block_dim": 1536,
7
+ "block_ffn_dim_multiplier": 1.0,
8
+ "block_mlp_init_scale": 1.0,
9
+ "block_multiple_of": 256,
10
+ "block_norm_eps": 1e-05,
11
+ "block_out_init_scale": 1.0,
12
+ "block_use_swiglu": true,
13
+ "block_use_xavier_init": true,
14
+ "bos_token_id": 1,
15
+ "conv_L_cache": 3,
16
+ "conv_bias": false,
17
+ "conv_dim": 1536,
18
+ "conv_dim_out": 1536,
19
+ "conv_use_xavier_init": true,
20
+ "dtype": "bfloat16",
21
+ "eos_token_id": 7,
22
+ "full_attn_idxs": [
23
+ 2,
24
+ 5,
25
+ 8,
26
+ 10,
27
+ 12,
28
+ 14
29
+ ],
30
+ "hidden_size": 1536,
31
+ "initializer_range": 0.02,
32
+ "intermediate_size": 10240,
33
+ "layer_types": [
34
+ "conv",
35
+ "conv",
36
+ "full_attention",
37
+ "conv",
38
+ "conv",
39
+ "full_attention",
40
+ "conv",
41
+ "conv",
42
+ "full_attention",
43
+ "conv",
44
+ "full_attention",
45
+ "conv",
46
+ "full_attention",
47
+ "conv",
48
+ "full_attention",
49
+ "conv"
50
+ ],
51
+ "max_position_embeddings": 128000,
52
+ "model_type": "lfm2",
53
+ "norm_eps": 1e-05,
54
+ "num_attention_heads": 24,
55
+ "num_heads": 24,
56
+ "num_hidden_layers": 16,
57
+ "num_key_value_heads": 8,
58
+ "pad_token_id": 0,
59
+ "rope_parameters": {
60
+ "rope_theta": 1000000.0,
61
+ "rope_type": "default"
62
+ },
63
+ "tie_word_embeddings": true,
64
+ "transformers_version": "5.17.0",
65
+ "use_cache": false,
66
+ "use_pos_enc": true,
67
+ "vocab_size": 65536
68
+ }
evaluation_metrics.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "base": {
3
+ "num_examples": 653,
4
+ "exact_match": 0.0061,
5
+ "normalized_exact_match": 0.0061,
6
+ "structural_match": 0.0107,
7
+ "command_validity": 0.4763,
8
+ "token_f1": 0.1195,
9
+ "primary_command_accuracy": 0.1807,
10
+ "prose_output_rate": 0.3783,
11
+ "validity_backend": "bashlex"
12
+ },
13
+ "finetuned": {
14
+ "num_examples": 653,
15
+ "exact_match": 0.291,
16
+ "normalized_exact_match": 0.291,
17
+ "structural_match": 0.3032,
18
+ "command_validity": 0.9939,
19
+ "token_f1": 0.647,
20
+ "primary_command_accuracy": 0.8377,
21
+ "prose_output_rate": 0.0,
22
+ "validity_backend": "bashlex"
23
+ }
24
+ }
generation_config.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_from_model_config": true,
3
+ "bos_token_id": 1,
4
+ "eos_token_id": [
5
+ 7
6
+ ],
7
+ "pad_token_id": 0,
8
+ "transformers_version": "5.17.0"
9
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0b0a3a92e59361493a227618edad9bd8e400fbc16f83b7cf864d9bdc2bfbe29a
3
+ size 1484995328
resolved_config.json ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "paths": {
3
+ "data_dir": "data",
4
+ "raw_dir": "data/raw",
5
+ "processed_dir": "data/processed",
6
+ "train_dir": "data/train",
7
+ "validation_dir": "data/validation",
8
+ "test_dir": "data/test",
9
+ "reports_dir": "reports",
10
+ "outputs_dir": "outputs"
11
+ },
12
+ "data": {
13
+ "nl2bash_repo": "jiacheng-ye/nl2bash",
14
+ "linux_commands_repo": "mecha-org/linux-command-dataset",
15
+ "nl2bash_archive_url": "https://www.dropbox.com/s/wy7uahzbir7lrq1/nl2bash.zip?dl=1",
16
+ "min_instruction_chars": 5,
17
+ "min_command_chars": 2,
18
+ "max_instruction_chars": 600,
19
+ "max_command_chars": 600,
20
+ "head_command_cap": 2500,
21
+ "exact_command_cap": 40,
22
+ "near_duplicate_threshold": 0.9,
23
+ "drop_near_duplicates": false,
24
+ "split_grouping": "template",
25
+ "train_ratio": 0.9,
26
+ "validation_ratio": 0.05,
27
+ "test_ratio": 0.05,
28
+ "seed": 42
29
+ },
30
+ "model": {
31
+ "model_name": "LiquidAI/LFM2-700M",
32
+ "dtype": "bfloat16",
33
+ "attn_implementation": "sdpa",
34
+ "system_prompt": null,
35
+ "max_length": 128,
36
+ "trust_remote_code": false
37
+ },
38
+ "lora": {
39
+ "r": 32,
40
+ "alpha": 64,
41
+ "dropout": 0.05,
42
+ "target_modules": [
43
+ "q_proj",
44
+ "k_proj",
45
+ "v_proj",
46
+ "out_proj",
47
+ "w1",
48
+ "w2",
49
+ "w3",
50
+ "in_proj"
51
+ ],
52
+ "exclude_modules": [
53
+ "conv.conv"
54
+ ],
55
+ "modules_to_save": []
56
+ },
57
+ "training": {
58
+ "method": "full",
59
+ "output_dir": "outputs/lfm2-linux-command",
60
+ "run_name": "lfm2-700m-linux-command",
61
+ "num_train_epochs": 3,
62
+ "per_device_train_batch_size": 16,
63
+ "per_device_eval_batch_size": 32,
64
+ "gradient_accumulation_steps": 2,
65
+ "learning_rate": 3e-05,
66
+ "lr_scheduler_type": "cosine",
67
+ "warmup_ratio": 0.03,
68
+ "weight_decay": 0.01,
69
+ "max_grad_norm": 1.0,
70
+ "optim": "adamw_torch_fused",
71
+ "adam_beta1": 0.9,
72
+ "adam_beta2": 0.95,
73
+ "adam_epsilon": 1e-08,
74
+ "bf16": true,
75
+ "fp16": false,
76
+ "gradient_checkpointing": false,
77
+ "group_by_length": true,
78
+ "logging_steps": 20,
79
+ "eval_strategy": "epoch",
80
+ "save_strategy": "epoch",
81
+ "save_total_limit": 2,
82
+ "load_best_model_at_end": true,
83
+ "metric_for_best_model": "eval_loss",
84
+ "greater_is_better": false,
85
+ "early_stopping_patience": 2,
86
+ "dataloader_num_workers": 4,
87
+ "seed": 42,
88
+ "report_to": []
89
+ },
90
+ "generation": {
91
+ "max_new_tokens": 128,
92
+ "do_sample": false,
93
+ "temperature": 1.0,
94
+ "top_p": 1.0,
95
+ "num_beams": 1,
96
+ "repetition_penalty": 1.0,
97
+ "batch_size": 32
98
+ },
99
+ "evaluation": {
100
+ "limit": null,
101
+ "execute_in_sandbox": false,
102
+ "sandbox_image": "linux-cmd-sandbox:latest",
103
+ "sandbox_timeout_s": 10,
104
+ "sandbox_memory": "256m",
105
+ "sandbox_cpus": "1.0",
106
+ "sandbox_pids_limit": 128,
107
+ "sandbox_network": false,
108
+ "max_execution_examples": 200
109
+ }
110
+ }
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backend": "tokenizers",
3
+ "bos_token": "<|startoftext|>",
4
+ "clean_up_tokenization_spaces": false,
5
+ "eos_token": "<|im_end|>",
6
+ "is_local": false,
7
+ "legacy": false,
8
+ "local_files_only": false,
9
+ "model_input_names": [
10
+ "input_ids",
11
+ "attention_mask"
12
+ ],
13
+ "model_max_length": 1000000000000000019884624838656,
14
+ "pad_token": "<|pad|>",
15
+ "sp_model_kwargs": {},
16
+ "spaces_between_special_tokens": false,
17
+ "tokenizer_class": "TokenizersBackend",
18
+ "use_default_system_prompt": false,
19
+ "use_fast": true
20
+ }
train_record.json ADDED
@@ -0,0 +1,614 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "stage": "train",
3
+ "timestamp": "2026-09-21T11:15:01+00:00",
4
+ "model_name": "LiquidAI/LFM2-700M",
5
+ "seed": 42,
6
+ "config": {
7
+ "paths": {
8
+ "data_dir": "data",
9
+ "raw_dir": "data/raw",
10
+ "processed_dir": "data/processed",
11
+ "train_dir": "data/train",
12
+ "validation_dir": "data/validation",
13
+ "test_dir": "data/test",
14
+ "reports_dir": "reports",
15
+ "outputs_dir": "outputs"
16
+ },
17
+ "data": {
18
+ "nl2bash_repo": "jiacheng-ye/nl2bash",
19
+ "linux_commands_repo": "mecha-org/linux-command-dataset",
20
+ "nl2bash_archive_url": "https://www.dropbox.com/s/wy7uahzbir7lrq1/nl2bash.zip?dl=1",
21
+ "min_instruction_chars": 5,
22
+ "min_command_chars": 2,
23
+ "max_instruction_chars": 600,
24
+ "max_command_chars": 600,
25
+ "head_command_cap": 2500,
26
+ "exact_command_cap": 40,
27
+ "near_duplicate_threshold": 0.9,
28
+ "drop_near_duplicates": false,
29
+ "split_grouping": "template",
30
+ "train_ratio": 0.9,
31
+ "validation_ratio": 0.05,
32
+ "test_ratio": 0.05,
33
+ "seed": 42
34
+ },
35
+ "model": {
36
+ "model_name": "LiquidAI/LFM2-700M",
37
+ "dtype": "bfloat16",
38
+ "attn_implementation": "sdpa",
39
+ "system_prompt": null,
40
+ "max_length": 128,
41
+ "trust_remote_code": false
42
+ },
43
+ "lora": {
44
+ "r": 32,
45
+ "alpha": 64,
46
+ "dropout": 0.05,
47
+ "target_modules": [
48
+ "q_proj",
49
+ "k_proj",
50
+ "v_proj",
51
+ "out_proj",
52
+ "w1",
53
+ "w2",
54
+ "w3",
55
+ "in_proj"
56
+ ],
57
+ "exclude_modules": [
58
+ "conv.conv"
59
+ ],
60
+ "modules_to_save": []
61
+ },
62
+ "training": {
63
+ "method": "full",
64
+ "output_dir": "outputs/lfm2-linux-command",
65
+ "run_name": "lfm2-700m-linux-command",
66
+ "num_train_epochs": 3,
67
+ "per_device_train_batch_size": 16,
68
+ "per_device_eval_batch_size": 32,
69
+ "gradient_accumulation_steps": 2,
70
+ "learning_rate": 3e-05,
71
+ "lr_scheduler_type": "cosine",
72
+ "warmup_ratio": 0.03,
73
+ "weight_decay": 0.01,
74
+ "max_grad_norm": 1.0,
75
+ "optim": "adamw_torch_fused",
76
+ "adam_beta1": 0.9,
77
+ "adam_beta2": 0.95,
78
+ "adam_epsilon": 1e-08,
79
+ "bf16": true,
80
+ "fp16": false,
81
+ "gradient_checkpointing": false,
82
+ "group_by_length": true,
83
+ "logging_steps": 20,
84
+ "eval_strategy": "epoch",
85
+ "save_strategy": "epoch",
86
+ "save_total_limit": 2,
87
+ "load_best_model_at_end": true,
88
+ "metric_for_best_model": "eval_loss",
89
+ "greater_is_better": false,
90
+ "early_stopping_patience": 2,
91
+ "dataloader_num_workers": 4,
92
+ "seed": 42,
93
+ "report_to": []
94
+ },
95
+ "generation": {
96
+ "max_new_tokens": 128,
97
+ "do_sample": false,
98
+ "temperature": 1.0,
99
+ "top_p": 1.0,
100
+ "num_beams": 1,
101
+ "repetition_penalty": 1.0,
102
+ "batch_size": 32
103
+ },
104
+ "evaluation": {
105
+ "limit": null,
106
+ "execute_in_sandbox": false,
107
+ "sandbox_image": "linux-cmd-sandbox:latest",
108
+ "sandbox_timeout_s": 10,
109
+ "sandbox_memory": "256m",
110
+ "sandbox_cpus": "1.0",
111
+ "sandbox_pids_limit": 128,
112
+ "sandbox_network": false,
113
+ "max_execution_examples": 200
114
+ }
115
+ },
116
+ "environment": {
117
+ "python": "3.12.3",
118
+ "platform": "Linux-6.18.33.2-microsoft-standard-WSL2-x86_64-with-glibc2.39",
119
+ "torch": "2.11.0+cu128",
120
+ "transformers": "5.17.0",
121
+ "git_revision": null,
122
+ "datasets": "4.3.0",
123
+ "peft": "0.18.1",
124
+ "accelerate": "1.12.0",
125
+ "trl": "0.24.0",
126
+ "gpu": "NVIDIA GeForce RTX 5060 Ti",
127
+ "gpu_memory_gb": 15.9,
128
+ "cuda": "12.8"
129
+ },
130
+ "result": {
131
+ "method": "full",
132
+ "parameters": {
133
+ "total": 742489344,
134
+ "trainable": 742489344
135
+ },
136
+ "tokenization": {
137
+ "train": {
138
+ "encoded": 11756,
139
+ "skipped_too_long": 6,
140
+ "skipped_empty_target": 0
141
+ },
142
+ "validation": {
143
+ "encoded": 652,
144
+ "skipped_too_long": 2,
145
+ "skipped_empty_target": 0
146
+ }
147
+ },
148
+ "num_train_examples": 11756,
149
+ "num_validation_examples": 652,
150
+ "num_test_examples": 653,
151
+ "train_runtime_s": 425.0,
152
+ "train_metrics": {
153
+ "train_runtime": 416.811,
154
+ "train_samples_per_second": 84.614,
155
+ "train_steps_per_second": 2.649,
156
+ "total_flos": 5049728172804096.0,
157
+ "train_loss": 0.5160034051623897,
158
+ "epoch": 3.0
159
+ },
160
+ "eval_metrics": {
161
+ "eval_loss": 0.6445356011390686,
162
+ "eval_runtime": 2.2801,
163
+ "eval_samples_per_second": 285.956,
164
+ "eval_steps_per_second": 9.21,
165
+ "epoch": 3.0
166
+ },
167
+ "peak_vram_gb": 8.95,
168
+ "log_history": [
169
+ {
170
+ "loss": 2.2648730278015137,
171
+ "grad_norm": 26.875,
172
+ "learning_rate": 0.0,
173
+ "epoch": 0.0027210884353741495,
174
+ "step": 1
175
+ },
176
+ {
177
+ "loss": 2.3296870181435034,
178
+ "grad_norm": 20.5,
179
+ "learning_rate": 1.6764705882352943e-05,
180
+ "epoch": 0.05442176870748299,
181
+ "step": 20
182
+ },
183
+ {
184
+ "loss": 1.2557416915893556,
185
+ "grad_norm": 15.5625,
186
+ "learning_rate": 2.999838368626891e-05,
187
+ "epoch": 0.10884353741496598,
188
+ "step": 40
189
+ },
190
+ {
191
+ "loss": 1.2152017593383788,
192
+ "grad_norm": 10.625,
193
+ "learning_rate": 2.995960957056267e-05,
194
+ "epoch": 0.16326530612244897,
195
+ "step": 60
196
+ },
197
+ {
198
+ "loss": 1.0797980308532715,
199
+ "grad_norm": 10.6875,
200
+ "learning_rate": 2.986926658161179e-05,
201
+ "epoch": 0.21768707482993196,
202
+ "step": 80
203
+ },
204
+ {
205
+ "loss": 0.7814510822296142,
206
+ "grad_norm": 22.875,
207
+ "learning_rate": 2.9727666150414773e-05,
208
+ "epoch": 0.272108843537415,
209
+ "step": 100
210
+ },
211
+ {
212
+ "loss": 1.1167201042175292,
213
+ "grad_norm": 7.40625,
214
+ "learning_rate": 2.953529640299211e-05,
215
+ "epoch": 0.32653061224489793,
216
+ "step": 120
217
+ },
218
+ {
219
+ "loss": 0.7122071743011474,
220
+ "grad_norm": 12.1875,
221
+ "learning_rate": 2.929282047771477e-05,
222
+ "epoch": 0.38095238095238093,
223
+ "step": 140
224
+ },
225
+ {
226
+ "loss": 0.8981359481811524,
227
+ "grad_norm": 7.78125,
228
+ "learning_rate": 2.9001074239328856e-05,
229
+ "epoch": 0.43537414965986393,
230
+ "step": 160
231
+ },
232
+ {
233
+ "loss": 0.8201946258544922,
234
+ "grad_norm": 8.25,
235
+ "learning_rate": 2.8661063397556667e-05,
236
+ "epoch": 0.4897959183673469,
237
+ "step": 180
238
+ },
239
+ {
240
+ "loss": 0.6475086212158203,
241
+ "grad_norm": 13.125,
242
+ "learning_rate": 2.8273960040206944e-05,
243
+ "epoch": 0.54421768707483,
244
+ "step": 200
245
+ },
246
+ {
247
+ "loss": 0.9737781524658203,
248
+ "grad_norm": 8.3125,
249
+ "learning_rate": 2.7841098592745374e-05,
250
+ "epoch": 0.5986394557823129,
251
+ "step": 220
252
+ },
253
+ {
254
+ "loss": 0.6579679012298584,
255
+ "grad_norm": 12.125,
256
+ "learning_rate": 2.7363971218253575e-05,
257
+ "epoch": 0.6530612244897959,
258
+ "step": 240
259
+ },
260
+ {
261
+ "loss": 0.803803539276123,
262
+ "grad_norm": 7.0625,
263
+ "learning_rate": 2.684422267363384e-05,
264
+ "epoch": 0.7074829931972789,
265
+ "step": 260
266
+ },
267
+ {
268
+ "loss": 0.742891788482666,
269
+ "grad_norm": 9.8125,
270
+ "learning_rate": 2.628364463979135e-05,
271
+ "epoch": 0.7619047619047619,
272
+ "step": 280
273
+ },
274
+ {
275
+ "loss": 0.5735934257507325,
276
+ "grad_norm": 8.8125,
277
+ "learning_rate": 2.568416954533894e-05,
278
+ "epoch": 0.8163265306122449,
279
+ "step": 300
280
+ },
281
+ {
282
+ "loss": 0.8808271408081054,
283
+ "grad_norm": 7.03125,
284
+ "learning_rate": 2.5047863905115338e-05,
285
+ "epoch": 0.8707482993197279,
286
+ "step": 320
287
+ },
288
+ {
289
+ "loss": 0.5917014122009278,
290
+ "grad_norm": 9.0625,
291
+ "learning_rate": 2.4376921196480406e-05,
292
+ "epoch": 0.9251700680272109,
293
+ "step": 340
294
+ },
295
+ {
296
+ "loss": 0.629461145401001,
297
+ "grad_norm": 9.375,
298
+ "learning_rate": 2.3673654297944308e-05,
299
+ "epoch": 0.9795918367346939,
300
+ "step": 360
301
+ },
302
+ {
303
+ "eval_loss": 0.7183327674865723,
304
+ "eval_runtime": 1.8387,
305
+ "eval_samples_per_second": 354.607,
306
+ "eval_steps_per_second": 11.421,
307
+ "epoch": 1.0,
308
+ "step": 368
309
+ },
310
+ {
311
+ "loss": 0.5892221450805664,
312
+ "grad_norm": 6.40625,
313
+ "learning_rate": 2.29404875161961e-05,
314
+ "epoch": 1.0326530612244897,
315
+ "step": 380
316
+ },
317
+ {
318
+ "loss": 0.4322396755218506,
319
+ "grad_norm": 7.875,
320
+ "learning_rate": 2.2179948229016393e-05,
321
+ "epoch": 1.0870748299319728,
322
+ "step": 400
323
+ },
324
+ {
325
+ "loss": 0.2959575176239014,
326
+ "grad_norm": 7.21875,
327
+ "learning_rate": 2.139465817288254e-05,
328
+ "epoch": 1.1414965986394559,
329
+ "step": 420
330
+ },
331
+ {
332
+ "loss": 0.5574175834655761,
333
+ "grad_norm": 9.5625,
334
+ "learning_rate": 2.0587324405299893e-05,
335
+ "epoch": 1.1959183673469387,
336
+ "step": 440
337
+ },
338
+ {
339
+ "loss": 0.3074038982391357,
340
+ "grad_norm": 6.9375,
341
+ "learning_rate": 1.9760729973013758e-05,
342
+ "epoch": 1.2503401360544217,
343
+ "step": 460
344
+ },
345
+ {
346
+ "loss": 0.4826845169067383,
347
+ "grad_norm": 7.40625,
348
+ "learning_rate": 1.8917724318270762e-05,
349
+ "epoch": 1.3047619047619048,
350
+ "step": 480
351
+ },
352
+ {
353
+ "loss": 0.37243363857269285,
354
+ "grad_norm": 8.0625,
355
+ "learning_rate": 1.806121345620111e-05,
356
+ "epoch": 1.3591836734693876,
357
+ "step": 500
358
+ },
359
+ {
360
+ "loss": 0.29408578872680663,
361
+ "grad_norm": 6.65625,
362
+ "learning_rate": 1.7194149957182412e-05,
363
+ "epoch": 1.4136054421768707,
364
+ "step": 520
365
+ },
366
+ {
367
+ "loss": 0.523699426651001,
368
+ "grad_norm": 8.0,
369
+ "learning_rate": 1.6319522768717947e-05,
370
+ "epoch": 1.4680272108843537,
371
+ "step": 540
372
+ },
373
+ {
374
+ "loss": 0.27834906578063967,
375
+ "grad_norm": 7.0625,
376
+ "learning_rate": 1.544034691191541e-05,
377
+ "epoch": 1.5224489795918368,
378
+ "step": 560
379
+ },
380
+ {
381
+ "loss": 0.45731005668640134,
382
+ "grad_norm": 7.34375,
383
+ "learning_rate": 1.455965308808459e-05,
384
+ "epoch": 1.5768707482993198,
385
+ "step": 580
386
+ },
387
+ {
388
+ "loss": 0.36221044063568114,
389
+ "grad_norm": 7.4375,
390
+ "learning_rate": 1.3680477231282058e-05,
391
+ "epoch": 1.6312925170068027,
392
+ "step": 600
393
+ },
394
+ {
395
+ "loss": 0.28891568183898925,
396
+ "grad_norm": 7.8125,
397
+ "learning_rate": 1.280585004281759e-05,
398
+ "epoch": 1.6857142857142857,
399
+ "step": 620
400
+ },
401
+ {
402
+ "loss": 0.5141252517700196,
403
+ "grad_norm": 7.1875,
404
+ "learning_rate": 1.1938786543798891e-05,
405
+ "epoch": 1.7401360544217686,
406
+ "step": 640
407
+ },
408
+ {
409
+ "loss": 0.29115273952484133,
410
+ "grad_norm": 5.3125,
411
+ "learning_rate": 1.1082275681729237e-05,
412
+ "epoch": 1.7945578231292516,
413
+ "step": 660
414
+ },
415
+ {
416
+ "loss": 0.41370329856872556,
417
+ "grad_norm": 5.90625,
418
+ "learning_rate": 1.0239270026986243e-05,
419
+ "epoch": 1.8489795918367347,
420
+ "step": 680
421
+ },
422
+ {
423
+ "loss": 0.3591457366943359,
424
+ "grad_norm": 7.90625,
425
+ "learning_rate": 9.412675594700113e-06,
426
+ "epoch": 1.9034013605442177,
427
+ "step": 700
428
+ },
429
+ {
430
+ "loss": 0.27732415199279786,
431
+ "grad_norm": 6.96875,
432
+ "learning_rate": 8.605341827117464e-06,
433
+ "epoch": 1.9578231292517008,
434
+ "step": 720
435
+ },
436
+ {
437
+ "eval_loss": 0.6445356011390686,
438
+ "eval_runtime": 1.8506,
439
+ "eval_samples_per_second": 352.315,
440
+ "eval_steps_per_second": 11.348,
441
+ "epoch": 2.0,
442
+ "step": 736
443
+ },
444
+ {
445
+ "loss": 0.3676326751708984,
446
+ "grad_norm": 5.59375,
447
+ "learning_rate": 7.820051770983611e-06,
448
+ "epoch": 2.0108843537414964,
449
+ "step": 740
450
+ },
451
+ {
452
+ "loss": 0.3336158752441406,
453
+ "grad_norm": 5.375,
454
+ "learning_rate": 7.059512483803904e-06,
455
+ "epoch": 2.0653061224489795,
456
+ "step": 760
457
+ },
458
+ {
459
+ "loss": 0.16438820362091064,
460
+ "grad_norm": 5.78125,
461
+ "learning_rate": 6.326345702055698e-06,
462
+ "epoch": 2.1197278911564625,
463
+ "step": 780
464
+ },
465
+ {
466
+ "loss": 0.3438990592956543,
467
+ "grad_norm": 5.6875,
468
+ "learning_rate": 5.623078803519595e-06,
469
+ "epoch": 2.1741496598639456,
470
+ "step": 800
471
+ },
472
+ {
473
+ "loss": 0.21838486194610596,
474
+ "grad_norm": 4.8125,
475
+ "learning_rate": 4.952136094884666e-06,
476
+ "epoch": 2.2285714285714286,
477
+ "step": 820
478
+ },
479
+ {
480
+ "loss": 0.2150651216506958,
481
+ "grad_norm": 6.75,
482
+ "learning_rate": 4.315830454661059e-06,
483
+ "epoch": 2.2829931972789117,
484
+ "step": 840
485
+ },
486
+ {
487
+ "loss": 0.34454209804534913,
488
+ "grad_norm": 6.125,
489
+ "learning_rate": 3.7163553602086496e-06,
490
+ "epoch": 2.3374149659863948,
491
+ "step": 860
492
+ },
493
+ {
494
+ "loss": 0.14302738904953002,
495
+ "grad_norm": 4.8125,
496
+ "learning_rate": 3.1557773263661605e-06,
497
+ "epoch": 2.3918367346938774,
498
+ "step": 880
499
+ },
500
+ {
501
+ "loss": 0.32184672355651855,
502
+ "grad_norm": 6.03125,
503
+ "learning_rate": 2.6360287817464257e-06,
504
+ "epoch": 2.4462585034013604,
505
+ "step": 900
506
+ },
507
+ {
508
+ "loss": 0.1849319100379944,
509
+ "grad_norm": 6.15625,
510
+ "learning_rate": 2.1589014072546294e-06,
511
+ "epoch": 2.5006802721088435,
512
+ "step": 920
513
+ },
514
+ {
515
+ "loss": 0.20881271362304688,
516
+ "grad_norm": 6.71875,
517
+ "learning_rate": 1.7260399597930592e-06,
518
+ "epoch": 2.5551020408163265,
519
+ "step": 940
520
+ },
521
+ {
522
+ "loss": 0.31119983196258544,
523
+ "grad_norm": 7.0625,
524
+ "learning_rate": 1.3389366024433347e-06,
525
+ "epoch": 2.6095238095238096,
526
+ "step": 960
527
+ },
528
+ {
529
+ "loss": 0.1483125329017639,
530
+ "grad_norm": 4.1875,
531
+ "learning_rate": 9.989257606711437e-07,
532
+ "epoch": 2.6639455782312926,
533
+ "step": 980
534
+ },
535
+ {
536
+ "loss": 0.3087357997894287,
537
+ "grad_norm": 7.09375,
538
+ "learning_rate": 7.071795222852296e-07,
539
+ "epoch": 2.7183673469387752,
540
+ "step": 1000
541
+ },
542
+ {
543
+ "loss": 0.19563177824020386,
544
+ "grad_norm": 4.96875,
545
+ "learning_rate": 4.6470359700789e-07,
546
+ "epoch": 2.7727891156462583,
547
+ "step": 1020
548
+ },
549
+ {
550
+ "loss": 0.1930193543434143,
551
+ "grad_norm": 6.15625,
552
+ "learning_rate": 2.7233384958522675e-07,
553
+ "epoch": 2.8272108843537413,
554
+ "step": 1040
555
+ },
556
+ {
557
+ "loss": 0.29953775405883787,
558
+ "grad_norm": 6.59375,
559
+ "learning_rate": 1.3073341838821028e-07,
560
+ "epoch": 2.8816326530612244,
561
+ "step": 1060
562
+ },
563
+ {
564
+ "loss": 0.15995726585388184,
565
+ "grad_norm": 5.40625,
566
+ "learning_rate": 4.039042943733251e-08,
567
+ "epoch": 2.9360544217687075,
568
+ "step": 1080
569
+ },
570
+ {
571
+ "loss": 0.20271103382110595,
572
+ "grad_norm": 5.5,
573
+ "learning_rate": 1.616313731091501e-09,
574
+ "epoch": 2.9904761904761905,
575
+ "step": 1100
576
+ },
577
+ {
578
+ "eval_loss": 0.6698360443115234,
579
+ "eval_runtime": 2.3865,
580
+ "eval_samples_per_second": 273.207,
581
+ "eval_steps_per_second": 8.8,
582
+ "epoch": 3.0,
583
+ "step": 1104
584
+ },
585
+ {
586
+ "train_runtime": 416.811,
587
+ "train_samples_per_second": 84.614,
588
+ "train_steps_per_second": 2.649,
589
+ "total_flos": 5049728172804096.0,
590
+ "train_loss": 0.5160034051623897,
591
+ "epoch": 3.0,
592
+ "step": 1104
593
+ },
594
+ {
595
+ "eval_loss": 0.6445356011390686,
596
+ "eval_runtime": 2.2801,
597
+ "eval_samples_per_second": 285.956,
598
+ "eval_steps_per_second": 9.21,
599
+ "epoch": 3.0,
600
+ "step": 1104
601
+ }
602
+ ],
603
+ "runtime": {
604
+ "torch_version": "2.11.0+cu128",
605
+ "transformers_version": "5.17.0",
606
+ "cuda_available": true,
607
+ "dtype": "bfloat16",
608
+ "attn_implementation": "sdpa",
609
+ "gpu_name": "NVIDIA GeForce RTX 5060 Ti",
610
+ "gpu_total_memory_gb": 15.9,
611
+ "gpu_capability": "12.0"
612
+ }
613
+ }
614
+ }
training_args.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:50ec13a9e5145757467efe60aeac4b5b544d6f5608cee769b05c807768183338
3
+ size 5329