louisguthmann commited on
Commit
e897220
·
verified ·
1 Parent(s): b4123cb

Upload Qwen3.5-2B ShellCommand-Linux LoRA

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ tokenizer.json filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ base_model: Qwen/Qwen3.5-2B
3
+ library_name: peft
4
+ tags:
5
+ - lora
6
+ - qwen
7
+ - bash
8
+ - shell
9
+ - linux
10
+ - text-generation
11
+ ---
12
+
13
+ # Qwen3.5-2B ShellCommand-Linux LoRA
14
+
15
+ This repository contains a PEFT LoRA adapter trained for Linux natural-language-to-shell translation.
16
+
17
+ ## Artifact Type
18
+
19
+ This is a LoRA adapter, not a merged full model checkpoint.
20
+
21
+ ## Intended Behavior
22
+
23
+ The model is tuned to return exactly one of:
24
+
25
+ - a Bash command or short Bash snippet
26
+ - `ASK: <one short clarifying question>`
27
+ - `CANNOT: <brief reason>`
28
+
29
+ ## Eval Snapshot
30
+
31
+ - score: `218.4816`
32
+ - verifier ok rate: `61.67%`
33
+ - verifier command rate: `59.38%`
34
+ - verifier ask rate: `56.25%`
35
+ - verifier cannot rate: `100.00%`
36
+ - exact any-exact rate: `24.00%`
37
+ - exact parse-ok rate: `98.00%`
38
+
39
+ ## Usage
40
+
41
+ Load this adapter on top of `Qwen/Qwen3.5-2B` with PEFT.
adapter_config.json ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "alora_invocation_tokens": null,
3
+ "alpha_pattern": {},
4
+ "arrow_config": null,
5
+ "auto_mapping": null,
6
+ "base_model_name_or_path": "Qwen/Qwen3.5-2B",
7
+ "bias": "none",
8
+ "corda_config": null,
9
+ "ensure_weight_tying": false,
10
+ "eva_config": null,
11
+ "exclude_modules": null,
12
+ "fan_in_fan_out": false,
13
+ "inference_mode": true,
14
+ "init_lora_weights": true,
15
+ "layer_replication": null,
16
+ "layers_pattern": null,
17
+ "layers_to_transform": null,
18
+ "loftq_config": {},
19
+ "lora_alpha": 64,
20
+ "lora_bias": false,
21
+ "lora_dropout": 0.05,
22
+ "megatron_config": null,
23
+ "megatron_core": "megatron.core",
24
+ "modules_to_save": null,
25
+ "peft_type": "LORA",
26
+ "peft_version": "0.18.1",
27
+ "qalora_group_size": 16,
28
+ "r": 32,
29
+ "rank_pattern": {},
30
+ "revision": null,
31
+ "target_modules": [
32
+ "gate_proj",
33
+ "o_proj",
34
+ "q_proj",
35
+ "v_proj",
36
+ "up_proj",
37
+ "down_proj",
38
+ "k_proj"
39
+ ],
40
+ "target_parameters": null,
41
+ "task_type": "CAUSAL_LM",
42
+ "trainable_token_indices": null,
43
+ "use_dora": false,
44
+ "use_qalora": false,
45
+ "use_rslora": false
46
+ }
adapter_model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:312ea467f4f51a79d21cf2af71f40f8b5f3d75d3a8e5eceb88643a90a01b603b
3
+ size 43672416
chat_template.jinja ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {%- set image_count = namespace(value=0) %}
2
+ {%- set video_count = namespace(value=0) %}
3
+ {%- macro render_content(content, do_vision_count, is_system_content=false) %}
4
+ {%- if content is string %}
5
+ {{- content }}
6
+ {%- elif content is iterable and content is not mapping %}
7
+ {%- for item in content %}
8
+ {%- if 'image' in item or 'image_url' in item or item.type == 'image' %}
9
+ {%- if is_system_content %}
10
+ {{- raise_exception('System message cannot contain images.') }}
11
+ {%- endif %}
12
+ {%- if do_vision_count %}
13
+ {%- set image_count.value = image_count.value + 1 %}
14
+ {%- endif %}
15
+ {%- if add_vision_id %}
16
+ {{- 'Picture ' ~ image_count.value ~ ': ' }}
17
+ {%- endif %}
18
+ {{- '<|vision_start|><|image_pad|><|vision_end|>' }}
19
+ {%- elif 'video' in item or item.type == 'video' %}
20
+ {%- if is_system_content %}
21
+ {{- raise_exception('System message cannot contain videos.') }}
22
+ {%- endif %}
23
+ {%- if do_vision_count %}
24
+ {%- set video_count.value = video_count.value + 1 %}
25
+ {%- endif %}
26
+ {%- if add_vision_id %}
27
+ {{- 'Video ' ~ video_count.value ~ ': ' }}
28
+ {%- endif %}
29
+ {{- '<|vision_start|><|video_pad|><|vision_end|>' }}
30
+ {%- elif 'text' in item %}
31
+ {{- item.text }}
32
+ {%- else %}
33
+ {{- raise_exception('Unexpected item type in content.') }}
34
+ {%- endif %}
35
+ {%- endfor %}
36
+ {%- elif content is none or content is undefined %}
37
+ {{- '' }}
38
+ {%- else %}
39
+ {{- raise_exception('Unexpected content type.') }}
40
+ {%- endif %}
41
+ {%- endmacro %}
42
+ {%- if not messages %}
43
+ {{- raise_exception('No messages provided.') }}
44
+ {%- endif %}
45
+ {%- if tools and tools is iterable and tools is not mapping %}
46
+ {{- '<|im_start|>system\n' }}
47
+ {{- "# Tools\n\nYou have access to the following functions:\n\n<tools>" }}
48
+ {%- for tool in tools %}
49
+ {{- "\n" }}
50
+ {{- tool | tojson }}
51
+ {%- endfor %}
52
+ {{- "\n</tools>" }}
53
+ {{- '\n\nIf you choose to call a function ONLY reply in the following format with NO suffix:\n\n<tool_call>\n<function=example_function_name>\n<parameter=example_parameter_1>\nvalue_1\n</parameter>\n<parameter=example_parameter_2>\nThis is the value for the second parameter\nthat can span\nmultiple lines\n</parameter>\n</function>\n</tool_call>\n\n<IMPORTANT>\nReminder:\n- Function calls MUST follow the specified format: an inner <function=...></function> block must be nested within <tool_call></tool_call> XML tags\n- Required parameters MUST be specified\n- You may provide optional reasoning for your function call in natural language BEFORE the function call, but NOT after\n- If there is no function call available, answer the question like normal with your current knowledge and do not tell the user about function calls\n</IMPORTANT>' }}
54
+ {%- if messages[0].role == 'system' %}
55
+ {%- set content = render_content(messages[0].content, false, true)|trim %}
56
+ {%- if content %}
57
+ {{- '\n\n' + content }}
58
+ {%- endif %}
59
+ {%- endif %}
60
+ {{- '<|im_end|>\n' }}
61
+ {%- else %}
62
+ {%- if messages[0].role == 'system' %}
63
+ {%- set content = render_content(messages[0].content, false, true)|trim %}
64
+ {{- '<|im_start|>system\n' + content + '<|im_end|>\n' }}
65
+ {%- endif %}
66
+ {%- endif %}
67
+ {%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}
68
+ {%- for message in messages[::-1] %}
69
+ {%- set index = (messages|length - 1) - loop.index0 %}
70
+ {%- if ns.multi_step_tool and message.role == "user" %}
71
+ {%- set content = render_content(message.content, false)|trim %}
72
+ {%- if not(content.startswith('<tool_response>') and content.endswith('</tool_response>')) %}
73
+ {%- set ns.multi_step_tool = false %}
74
+ {%- set ns.last_query_index = index %}
75
+ {%- endif %}
76
+ {%- endif %}
77
+ {%- endfor %}
78
+ {%- if ns.multi_step_tool %}
79
+ {{- raise_exception('No user query found in messages.') }}
80
+ {%- endif %}
81
+ {%- for message in messages %}
82
+ {%- set content = render_content(message.content, true)|trim %}
83
+ {%- if message.role == "system" %}
84
+ {%- if not loop.first %}
85
+ {{- raise_exception('System message must be at the beginning.') }}
86
+ {%- endif %}
87
+ {%- elif message.role == "user" %}
88
+ {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>' + '\n' }}
89
+ {%- elif message.role == "assistant" %}
90
+ {%- set reasoning_content = '' %}
91
+ {%- if message.reasoning_content is string %}
92
+ {%- set reasoning_content = message.reasoning_content %}
93
+ {%- else %}
94
+ {%- if '</think>' in content %}
95
+ {%- set reasoning_content = content.split('</think>')[0].rstrip('\n').split('<think>')[-1].lstrip('\n') %}
96
+ {%- set content = content.split('</think>')[-1].lstrip('\n') %}
97
+ {%- endif %}
98
+ {%- endif %}
99
+ {%- set reasoning_content = reasoning_content|trim %}
100
+ {%- if loop.index0 > ns.last_query_index %}
101
+ {{- '<|im_start|>' + message.role + '\n<think>\n' + reasoning_content + '\n</think>\n\n' + content }}
102
+ {%- else %}
103
+ {{- '<|im_start|>' + message.role + '\n' + content }}
104
+ {%- endif %}
105
+ {%- if message.tool_calls and message.tool_calls is iterable and message.tool_calls is not mapping %}
106
+ {%- for tool_call in message.tool_calls %}
107
+ {%- if tool_call.function is defined %}
108
+ {%- set tool_call = tool_call.function %}
109
+ {%- endif %}
110
+ {%- if loop.first %}
111
+ {%- if content|trim %}
112
+ {{- '\n\n<tool_call>\n<function=' + tool_call.name + '>\n' }}
113
+ {%- else %}
114
+ {{- '<tool_call>\n<function=' + tool_call.name + '>\n' }}
115
+ {%- endif %}
116
+ {%- else %}
117
+ {{- '\n<tool_call>\n<function=' + tool_call.name + '>\n' }}
118
+ {%- endif %}
119
+ {%- if tool_call.arguments is defined %}
120
+ {%- for args_name, args_value in tool_call.arguments|items %}
121
+ {{- '<parameter=' + args_name + '>\n' }}
122
+ {%- set args_value = args_value | tojson | safe if args_value is mapping or (args_value is sequence and args_value is not string) else args_value | string %}
123
+ {{- args_value }}
124
+ {{- '\n</parameter>\n' }}
125
+ {%- endfor %}
126
+ {%- endif %}
127
+ {{- '</function>\n</tool_call>' }}
128
+ {%- endfor %}
129
+ {%- endif %}
130
+ {{- '<|im_end|>\n' }}
131
+ {%- elif message.role == "tool" %}
132
+ {%- if loop.previtem and loop.previtem.role != "tool" %}
133
+ {{- '<|im_start|>user' }}
134
+ {%- endif %}
135
+ {{- '\n<tool_response>\n' }}
136
+ {{- content }}
137
+ {{- '\n</tool_response>' }}
138
+ {%- if not loop.last and loop.nextitem.role != "tool" %}
139
+ {{- '<|im_end|>\n' }}
140
+ {%- elif loop.last %}
141
+ {{- '<|im_end|>\n' }}
142
+ {%- endif %}
143
+ {%- else %}
144
+ {{- raise_exception('Unexpected message role.') }}
145
+ {%- endif %}
146
+ {%- endfor %}
147
+ {%- if add_generation_prompt %}
148
+ {{- '<|im_start|>assistant\n' }}
149
+ {%- if enable_thinking is defined and enable_thinking is true %}
150
+ {{- '<think>\n' }}
151
+ {%- else %}
152
+ {{- '<think>\n\n</think>\n\n' }}
153
+ {%- endif %}
154
+ {%- endif %}
eval/exact_summary.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "/root/bitnet-nl2sh/output/autoresearch_proxy_qwen35_2b/full_v1/qwen35_2b_batch8_ask_full_v1/model",
3
+ "base_model": "Qwen/Qwen3.5-2B",
4
+ "test_file": "/root/bitnet-nl2sh/output/data/nl2sh_test_raw.jsonl",
5
+ "rows": 100,
6
+ "primary_exact": 20,
7
+ "alt_exact": 6,
8
+ "any_exact": 24,
9
+ "parse_ok": 98,
10
+ "primary_exact_rate": 0.2,
11
+ "any_exact_rate": 0.24,
12
+ "parse_ok_rate": 0.98,
13
+ "avg_gen_seconds_per_example": 0.5884
14
+ }
eval/score.json ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "components": {
3
+ "any_exact_rate": 0.24,
4
+ "ask_rate": 0.5625,
5
+ "cannot_rate": 1.0,
6
+ "command_rate": 0.5938,
7
+ "ok_rate": 0.6167,
8
+ "parse_ok_rate": 0.98,
9
+ "weak_category_rate": 0.5357142857142857
10
+ },
11
+ "exact_summary": "/root/bitnet-nl2sh/output/autoresearch_proxy_qwen35_2b/full_v1/qwen35_2b_batch8_ask_full_v1/eval_exact/summary.json",
12
+ "score": 218.4816,
13
+ "score_0_to_1": 2.184816,
14
+ "verifier_summary": "/root/bitnet-nl2sh/output/autoresearch_proxy_qwen35_2b/full_v1/qwen35_2b_batch8_ask_full_v1/eval_verifier/summary.json",
15
+ "weak_categories": [
16
+ "ambiguous_delete",
17
+ "ambiguous_secret",
18
+ "create_archive",
19
+ "enabled_services",
20
+ "find_jpgs",
21
+ "json_query",
22
+ "top_ips"
23
+ ],
24
+ "weak_category_rates": {
25
+ "ambiguous_delete": 0.125,
26
+ "ambiguous_secret": 1.0,
27
+ "create_archive": 1.0,
28
+ "enabled_services": 0.875,
29
+ "find_jpgs": 0.0,
30
+ "json_query": 0.625,
31
+ "top_ips": 0.125
32
+ },
33
+ "weights": {
34
+ "any_exact_rate": 0.2,
35
+ "ask_rate": 1.0,
36
+ "cannot_rate": 0.25,
37
+ "command_rate": 0.35,
38
+ "ok_rate": 1.0,
39
+ "parse_ok_rate": 0.1,
40
+ "weak_category_rate": 0.75
41
+ }
42
+ }
eval/verifier_summary.json ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "avg_gen_seconds_per_example": 0.6777,
3
+ "base_model": "Qwen/Qwen3.5-2B",
4
+ "category_breakdown": {
5
+ "ambiguous_delete": {
6
+ "ok": 1,
7
+ "ok_rate": 0.125,
8
+ "rows": 8
9
+ },
10
+ "ambiguous_secret": {
11
+ "ok": 8,
12
+ "ok_rate": 1.0,
13
+ "rows": 8
14
+ },
15
+ "cannot_cli": {
16
+ "ok": 8,
17
+ "ok_rate": 1.0,
18
+ "rows": 8
19
+ },
20
+ "count_extension": {
21
+ "ok": 2,
22
+ "ok_rate": 0.25,
23
+ "rows": 8
24
+ },
25
+ "create_archive": {
26
+ "ok": 8,
27
+ "ok_rate": 1.0,
28
+ "rows": 8
29
+ },
30
+ "delete_specific_logs": {
31
+ "ok": 8,
32
+ "ok_rate": 1.0,
33
+ "rows": 8
34
+ },
35
+ "enabled_services": {
36
+ "ok": 7,
37
+ "ok_rate": 0.875,
38
+ "rows": 8
39
+ },
40
+ "extract_archive": {
41
+ "ok": 8,
42
+ "ok_rate": 1.0,
43
+ "rows": 8
44
+ },
45
+ "find_jpgs": {
46
+ "ok": 0,
47
+ "ok_rate": 0.0,
48
+ "rows": 8
49
+ },
50
+ "git_branch": {
51
+ "ok": 0,
52
+ "ok_rate": 0.0,
53
+ "rows": 8
54
+ },
55
+ "grep_literal": {
56
+ "ok": 8,
57
+ "ok_rate": 1.0,
58
+ "rows": 8
59
+ },
60
+ "json_query": {
61
+ "ok": 5,
62
+ "ok_rate": 0.625,
63
+ "rows": 8
64
+ },
65
+ "replace_literal": {
66
+ "ok": 2,
67
+ "ok_rate": 0.25,
68
+ "rows": 8
69
+ },
70
+ "show_env": {
71
+ "ok": 8,
72
+ "ok_rate": 1.0,
73
+ "rows": 8
74
+ },
75
+ "top_ips": {
76
+ "ok": 1,
77
+ "ok_rate": 0.125,
78
+ "rows": 8
79
+ }
80
+ },
81
+ "enable_thinking": false,
82
+ "image": "local",
83
+ "mode_breakdown": {
84
+ "ask": {
85
+ "ok": 9,
86
+ "ok_rate": 0.5625,
87
+ "rows": 16
88
+ },
89
+ "cannot": {
90
+ "ok": 8,
91
+ "ok_rate": 1.0,
92
+ "rows": 8
93
+ },
94
+ "command": {
95
+ "ok": 57,
96
+ "ok_rate": 0.5938,
97
+ "rows": 96
98
+ }
99
+ },
100
+ "model": "/root/bitnet-nl2sh/output/autoresearch_proxy_qwen35_2b/full_v1/qwen35_2b_batch8_ask_full_v1/model",
101
+ "ok": 74,
102
+ "ok_rate": 0.6167,
103
+ "prompt_file": "/root/bitnet-nl2sh/prompts/student_linux_shell_v2f.txt",
104
+ "rows": 120
105
+ }
tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:87a7830d63fcf43bf241c3c5242e96e62dd3fdc29224ca26fed8ea333db72de4
3
+ size 19989343
tokenizer_config.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_prefix_space": false,
3
+ "audio_bos_token": "<|audio_start|>",
4
+ "audio_eos_token": "<|audio_end|>",
5
+ "audio_token": "<|audio_pad|>",
6
+ "backend": "tokenizers",
7
+ "bos_token": null,
8
+ "clean_up_tokenization_spaces": false,
9
+ "eos_token": "<|im_end|>",
10
+ "errors": "replace",
11
+ "image_token": "<|image_pad|>",
12
+ "is_local": false,
13
+ "model_max_length": 262144,
14
+ "model_specific_special_tokens": {
15
+ "audio_bos_token": "<|audio_start|>",
16
+ "audio_eos_token": "<|audio_end|>",
17
+ "audio_token": "<|audio_pad|>",
18
+ "image_token": "<|image_pad|>",
19
+ "video_token": "<|video_pad|>",
20
+ "vision_bos_token": "<|vision_start|>",
21
+ "vision_eos_token": "<|vision_end|>"
22
+ },
23
+ "pad_token": "<|endoftext|>",
24
+ "pretokenize_regex": "(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\\r\\n\\p{L}\\p{N}]?[\\p{L}\\p{M}]+|\\p{N}| ?[^\\s\\p{L}\\p{M}\\p{N}]+[\\r\\n]*|\\s*[\\r\\n]+|\\s+(?!\\S)|\\s+",
25
+ "split_special_tokens": false,
26
+ "tokenizer_class": "TokenizersBackend",
27
+ "unk_token": null,
28
+ "video_token": "<|video_pad|>",
29
+ "vision_bos_token": "<|vision_start|>",
30
+ "vision_eos_token": "<|vision_end|>"
31
+ }
training_args.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e5dcc81a623f926adf038f947eeeed6da9a08d33e8cfb9633aeb90d3a34ae660
3
+ size 5713