commit 5893f5402fa57d99aa9c867d37e996b6bf743253 Author: ModelHub XC Date: Wed Aug 5 22:57:17 2026 +0800 初始化项目,由ModelHub XC社区提供模型 Model: zannvznn/qwen3-0.6b-math-l45-qlora-merged-fp16-v2 Source: Original Platform diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..52373fe --- /dev/null +++ b/.gitattributes @@ -0,0 +1,36 @@ +*.7z filter=lfs diff=lfs merge=lfs -text +*.arrow filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.ftz filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text +*.joblib filter=lfs diff=lfs merge=lfs -text +*.lfs.* filter=lfs diff=lfs merge=lfs -text +*.mlmodel filter=lfs diff=lfs merge=lfs -text +*.model filter=lfs diff=lfs merge=lfs -text +*.msgpack filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.onnx filter=lfs diff=lfs merge=lfs -text +*.ot filter=lfs diff=lfs merge=lfs -text +*.parquet filter=lfs diff=lfs merge=lfs -text +*.pb filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +saved_model/**/* filter=lfs diff=lfs merge=lfs -text +*.tar.* filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.tflite filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text +*tfevents* filter=lfs diff=lfs merge=lfs -text +tokenizer.json filter=lfs diff=lfs merge=lfs -text diff --git a/README.md b/README.md new file mode 100644 index 0000000..2f17b2a --- /dev/null +++ b/README.md @@ -0,0 +1,75 @@ +--- +base_model: Qwen/Qwen3-0.6B-Base +library_name: transformers +pipeline_tag: text-generation +tags: +- qwen3 +- math +- sft +- qlora +- merged-lora +- fp16 +--- + +# qwen3-0.6b-math-l45-qlora-merged-fp16-v2 + +Merged fp16 model from `Qwen/Qwen3-0.6B-Base` plus a QLoRA SFT adapter trained for MATH level 4-5 problem solving. + +This is the corrected SFT v2 run using the train split for training. Final 500-question evaluation is intentionally separate. + +## Training Summary + +- Base model: `Qwen/Qwen3-0.6B-Base` +- Train file: `/kaggle/input/datasets/anurhalizah/math-he/math_level45_train.parquet` +- Test file: `/kaggle/input/datasets/anurhalizah/math-he/math_level45_test.parquet` +- Train rows used: `3994` +- Train subset size: `3994` +- Smoke loss eval rows: `200` +- Max sequence length: `2048` +- Epochs: `3` +- Learning rate: `0.0002` +- Precision: fp16 +- Merge method: `manual_lora_cpu` +- Merged LoRA matrices: `196` + +## Prompt Format + +```text +### System: +{system_prompt} + +### Problem: +{problem} + +### Solution: + +``` + +System prompt: + +```text +You are a precise mathematical problem solver. +Follow this exact output contract: +1. Solve the problem step by step with concise reasoning. +2. Use valid LaTeX math notation for mathematical expressions. +3. Preserve LaTeX commands such as \frac{...}{...}, \sqrt{...}, x^{...}, subscripts, equations, and inequalities. +4. Put the final answer on its own last line exactly in this form: Final Answer: \boxed{...} +5. Do not use Markdown code fences. +6. Do not switch to a different answer format. +``` + +## Usage + +```python +from transformers import AutoTokenizer, AutoModelForCausalLM +import torch + +repo_id = "zannvznn/qwen3-0.6b-math-l45-qlora-merged-fp16-v2" +tokenizer = AutoTokenizer.from_pretrained(repo_id, trust_remote_code=True) +model = AutoModelForCausalLM.from_pretrained( + repo_id, + torch_dtype=torch.float16, + device_map="auto", + trust_remote_code=True, +) +``` diff --git a/chat_template.jinja b/chat_template.jinja new file mode 100644 index 0000000..699ff8d --- /dev/null +++ b/chat_template.jinja @@ -0,0 +1,85 @@ +{%- if tools %} + {{- '<|im_start|>system\n' }} + {%- if messages[0].role == 'system' %} + {{- messages[0].content + '\n\n' }} + {%- endif %} + {{- "# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within XML tags:\n" }} + {%- for tool in tools %} + {{- "\n" }} + {{- tool | tojson }} + {%- endfor %} + {{- "\n\n\nFor each function call, return a json object with function name and arguments within XML tags:\n\n{\"name\": , \"arguments\": }\n<|im_end|>\n" }} +{%- else %} + {%- if messages[0].role == 'system' %} + {{- '<|im_start|>system\n' + messages[0].content + '<|im_end|>\n' }} + {%- endif %} +{%- endif %} +{%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %} +{%- for message in messages[::-1] %} + {%- set index = (messages|length - 1) - loop.index0 %} + {%- if ns.multi_step_tool and message.role == "user" and not(message.content.startswith('') and message.content.endswith('')) %} + {%- set ns.multi_step_tool = false %} + {%- set ns.last_query_index = index %} + {%- endif %} +{%- endfor %} +{%- for message in messages %} + {%- if (message.role == "user") or (message.role == "system" and not loop.first) %} + {{- '<|im_start|>' + message.role + '\n' + message.content + '<|im_end|>' + '\n' }} + {%- elif message.role == "assistant" %} + {%- set content = message.content %} + {%- set reasoning_content = '' %} + {%- if message.reasoning_content is defined and message.reasoning_content is not none %} + {%- set reasoning_content = message.reasoning_content %} + {%- else %} + {%- if '' in message.content %} + {%- set content = message.content.split('')[-1].lstrip('\n') %} + {%- set reasoning_content = message.content.split('')[0].rstrip('\n').split('')[-1].lstrip('\n') %} + {%- endif %} + {%- endif %} + {%- if loop.index0 > ns.last_query_index %} + {%- if loop.last or (not loop.last and reasoning_content) %} + {{- '<|im_start|>' + message.role + '\n\n' + reasoning_content.strip('\n') + '\n\n\n' + content.lstrip('\n') }} + {%- else %} + {{- '<|im_start|>' + message.role + '\n' + content }} + {%- endif %} + {%- else %} + {{- '<|im_start|>' + message.role + '\n' + content }} + {%- endif %} + {%- if message.tool_calls %} + {%- for tool_call in message.tool_calls %} + {%- if (loop.first and content) or (not loop.first) %} + {{- '\n' }} + {%- endif %} + {%- if tool_call.function %} + {%- set tool_call = tool_call.function %} + {%- endif %} + {{- '\n{"name": "' }} + {{- tool_call.name }} + {{- '", "arguments": ' }} + {%- if tool_call.arguments is string %} + {{- tool_call.arguments }} + {%- else %} + {{- tool_call.arguments | tojson }} + {%- endif %} + {{- '}\n' }} + {%- endfor %} + {%- endif %} + {{- '<|im_end|>\n' }} + {%- elif message.role == "tool" %} + {%- if loop.first or (messages[loop.index0 - 1].role != "tool") %} + {{- '<|im_start|>user' }} + {%- endif %} + {{- '\n\n' }} + {{- message.content }} + {{- '\n' }} + {%- if loop.last or (messages[loop.index0 + 1].role != "tool") %} + {{- '<|im_end|>\n' }} + {%- endif %} + {%- endif %} +{%- endfor %} +{%- if add_generation_prompt %} + {{- '<|im_start|>assistant\n' }} + {%- if enable_thinking is defined and enable_thinking is false %} + {{- '\n\n\n\n' }} + {%- endif %} +{%- endif %} \ No newline at end of file diff --git a/config.json b/config.json new file mode 100644 index 0000000..4a6ed98 --- /dev/null +++ b/config.json @@ -0,0 +1,63 @@ +{ + "architectures": [ + "Qwen3ForCausalLM" + ], + "attention_bias": false, + "attention_dropout": 0.0, + "bos_token_id": 151643, + "dtype": "float16", + "eos_token_id": 151643, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 1024, + "initializer_range": 0.02, + "intermediate_size": 3072, + "layer_types": [ + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention" + ], + "max_position_embeddings": 32768, + "max_window_layers": 28, + "model_type": "qwen3", + "num_attention_heads": 16, + "num_hidden_layers": 28, + "num_key_value_heads": 8, + "pad_token_id": null, + "rms_norm_eps": 1e-06, + "rope_parameters": { + "rope_theta": 1000000, + "rope_type": "default" + }, + "sliding_window": null, + "tie_word_embeddings": true, + "transformers_version": "5.8.1", + "use_cache": true, + "use_sliding_window": false, + "vocab_size": 151936 +} diff --git a/generation_config.json b/generation_config.json new file mode 100644 index 0000000..0f22f84 --- /dev/null +++ b/generation_config.json @@ -0,0 +1,7 @@ +{ + "bos_token_id": 151643, + "do_sample": false, + "eos_token_id": 151643, + "max_new_tokens": 2048, + "transformers_version": "5.8.1" +} diff --git a/merge_info.json b/merge_info.json new file mode 100644 index 0000000..3a8f35a --- /dev/null +++ b/merge_info.json @@ -0,0 +1,16 @@ +{ + "model_id": "Qwen/Qwen3-0.6B-Base", + "run_name": "qwen3-0.6b-math-l45-qlora-sft-v2", + "hf_repo_id": "zannvznn/qwen3-0.6b-math-l45-qlora-merged-fp16-v2", + "adapter_dir": "/kaggle/working/qwen3-0.6b-math-l45-qlora-sft-v2/adapter", + "merged_dir": "/kaggle/working/qwen3-0.6b-math-l45-qlora-sft-v2/merged-fp16", + "merge_method": "manual_lora_cpu", + "merged_matrix_count": 196, + "unique_target_module_count": 196, + "elapsed_seconds": 0.4837789409994002, + "source_adapter_dir": "/kaggle/working/qwen3-0.6b-math-l45-qlora-sft-v2/adapter", + "lora_alpha": 32.0, + "r": 16, + "use_rslora": false, + "fan_in_fan_out": false +} \ No newline at end of file diff --git a/model.safetensors b/model.safetensors new file mode 100644 index 0000000..8fe8456 --- /dev/null +++ b/model.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b33a1d7eeb033899a368acb8815db189243b159b56dac78e641e0f416545e756 +size 1192134784 diff --git a/prompt_config.json b/prompt_config.json new file mode 100644 index 0000000..a544643 --- /dev/null +++ b/prompt_config.json @@ -0,0 +1,8 @@ +{ + "model_id": "Qwen/Qwen3-0.6B-Base", + "prompt_template": "### System:\n{system_prompt}\n\n### Problem:\n{problem}\n\n### Solution:\n", + "system_prompt": "You are a precise mathematical problem solver.\nFollow this exact output contract:\n1. Solve the problem step by step with concise reasoning.\n2. Use valid LaTeX math notation for mathematical expressions.\n3. Preserve LaTeX commands such as \\frac{...}{...}, \\sqrt{...}, x^{...}, subscripts, equations, and inequalities.\n4. Put the final answer on its own last line exactly in this form: Final Answer: \\boxed{...}\n5. Do not use Markdown code fences.\n6. Do not switch to a different answer format.", + "eos_token": "<|endoftext|>", + "padding_side": "right", + "add_final_answer_line_from_last_boxed": true +} \ No newline at end of file diff --git a/run_config.json b/run_config.json new file mode 100644 index 0000000..ca2981c --- /dev/null +++ b/run_config.json @@ -0,0 +1,24 @@ +{ + "model_id": "Qwen/Qwen3-0.6B-Base", + "run_name": "qwen3-0.6b-math-l45-qlora-sft-v2", + "hf_repo_id": "zannvznn/qwen3-0.6b-math-l45-qlora-merged-fp16-v2", + "train_file": "/kaggle/input/datasets/anurhalizah/math-he/math_level45_train.parquet", + "test_file": "/kaggle/input/datasets/anurhalizah/math-he/math_level45_test.parquet", + "train_subset_size": 3994, + "train_rows_used": 3994, + "loss_eval_rows_used": 200, + "max_seq_length": 2048, + "num_train_epochs": 3, + "learning_rate": 0.0002, + "per_device_train_batch_size": 1, + "per_device_eval_batch_size": 1, + "gradient_accumulation_steps": 8, + "fp16": true, + "bf16": false, + "qlora": true, + "shuffle_train": true, + "world_size": 1, + "device_map": "balanced", + "max_memory": "{0: 13958643712, 1: 13958643712}", + "final_eval_note": "Final 500-question evaluation is intentionally separate." +} \ No newline at end of file diff --git a/tokenizer.json b/tokenizer.json new file mode 100644 index 0000000..c7afbed --- /dev/null +++ b/tokenizer.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be75606093db2094d7cd20f3c2f385c212750648bd6ea4fb2bf507a6a4c55506 +size 11422650 diff --git a/tokenizer_config.json b/tokenizer_config.json new file mode 100644 index 0000000..1127e12 --- /dev/null +++ b/tokenizer_config.json @@ -0,0 +1,30 @@ +{ + "add_prefix_space": false, + "backend": "tokenizers", + "bos_token": null, + "clean_up_tokenization_spaces": false, + "eos_token": "<|endoftext|>", + "errors": "replace", + "extra_special_tokens": [ + "<|im_start|>", + "<|im_end|>", + "<|object_ref_start|>", + "<|object_ref_end|>", + "<|box_start|>", + "<|box_end|>", + "<|quad_start|>", + "<|quad_end|>", + "<|vision_start|>", + "<|vision_end|>", + "<|vision_pad|>", + "<|image_pad|>", + "<|video_pad|>" + ], + "is_local": true, + "local_files_only": false, + "model_max_length": 131072, + "pad_token": "<|endoftext|>", + "split_special_tokens": false, + "tokenizer_class": "Qwen2Tokenizer", + "unk_token": null +}