From 36d4c03e6b92e247f1e571e2031c6177957036b2 Mon Sep 17 00:00:00 2001 From: ModelHub XC Date: Mon, 31 Aug 2026 05:46:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=EF=BC=8C=E7=94=B1ModelHub=20XC=E7=A4=BE=E5=8C=BA=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Model: minnesotanlp/Finch-8B Source: Original Platform --- .gitattributes | 41 +++++++ README.md | 206 ++++++++++++++++++++++++++++++++++ assets/finch_icon.png | Bin 0 -> 31562 bytes assets/intro_teaser.png | 3 + assets/results_frontiercs.png | 3 + assets/results_kto_ttrl.png | 3 + assets/results_main.png | 3 + assets/results_ttrl.png | 3 + chat_template.jinja | 89 +++++++++++++++ config.json | 74 ++++++++++++ generation_config.json | 12 ++ model.safetensors | 3 + tokenizer.json | 3 + tokenizer_config.json | 30 +++++ 14 files changed, 473 insertions(+) create mode 100644 .gitattributes create mode 100644 README.md create mode 100644 assets/finch_icon.png create mode 100644 assets/intro_teaser.png create mode 100644 assets/results_frontiercs.png create mode 100644 assets/results_kto_ttrl.png create mode 100644 assets/results_main.png create mode 100644 assets/results_ttrl.png create mode 100644 chat_template.jinja create mode 100644 config.json create mode 100644 generation_config.json create mode 100644 model.safetensors create mode 100644 tokenizer.json create mode 100644 tokenizer_config.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..4406416 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,41 @@ +*.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 +assets/intro_teaser.png filter=lfs diff=lfs merge=lfs -text +assets/results_frontiercs.png filter=lfs diff=lfs merge=lfs -text +assets/results_kto_ttrl.png filter=lfs diff=lfs merge=lfs -text +assets/results_main.png filter=lfs diff=lfs merge=lfs -text +assets/results_ttrl.png filter=lfs diff=lfs merge=lfs -text diff --git a/README.md b/README.md new file mode 100644 index 0000000..6f547ff --- /dev/null +++ b/README.md @@ -0,0 +1,206 @@ +--- +license: apache-2.0 +language: +- en +library_name: transformers +pipeline_tag: text-generation +base_model: +- Qwen/Qwen3-8B +datasets: +- minnesotanlp/Finch-Collection +tags: +- evolution-fine-tuning +- evolutionary-search +- discovery +- code-optimization +- scientific-discovery +- mutation-operator +- mid-training +--- + +
+ +

+ Evolution Fine-Tuning: Learning to Discover Across 371 Optimization Tasks +

+

+ A mid-training "practice phase" that teaches small open-source LLMs how to evolve solutions. +

+ +

+ Website + + arXiv + + GitHub + Dataset + Finch-2B + Finch-4B + Finch-9B + Finch-4B-KTO + Finch-8B-KTO + Apache 2.0 +

+ +
+ +**Finch-8B** is the 8B member of the **Finch** family β€” open-source LLMs **evolution fine-tuned (EFT)** to act as a stronger **mutation operator** inside evolutionary search. Uniquely in the family it is built on **Qwen3-8B** (the others use the Qwen3.5 series) and trained on the [**Finch Collection**](https://huggingface.co/datasets/minnesotanlp/Finch-Collection). It learns *how to evolve a solution* and is the strongest variant to pair with **test-time RL**. + +## TL;DR + +State-of-the-art discovery systems put an LLM inside an evolutionary search *scaffold* β€” but the discovery know-how lives in the scaffold, and every new task starts from zero. **Evolution Fine-Tuning (EFT)** moves that behavior *into the model* by turning evolutionary search **trajectories** into supervision. Finch-8B is a strong drop-in mutation operator that also synergizes with test-time reinforcement learning. + +
+ EFT as mid-training +
+ +- (Left) EFT acts as mid-training, boosting Finch's discovery on the ErdΕ‘s minimum-overlap problem under both test-time search and test-time learning. +- (Right) On NP-hard competitive programming, Finch composes strategies learned across diverse domains, while the base model relies on a single repetitive strategy. + +## Finch family + +| Model | Base | Params | Training | πŸ€— Hugging Face | +|---|---|---:|---|:---:| +| `Finch-2B` | Qwen3.5-2B | 2B | EFT | [![Open on Hugging Face](https://img.shields.io/badge/-Open-FFD21E?logo=huggingface&logoColor=black)](https://huggingface.co/minnesotanlp/Finch-2B) | +| `Finch-4B` | Qwen3.5-4B | 4B | EFT | [![Open on Hugging Face](https://img.shields.io/badge/-Open-FFD21E?logo=huggingface&logoColor=black)](https://huggingface.co/minnesotanlp/Finch-4B) | +| **`Finch-8B`** ← *this model* | **Qwen3-8B** | **8B** | **EFT** | [![Open on Hugging Face](https://img.shields.io/badge/-Open-FFD21E?logo=huggingface&logoColor=black)](https://huggingface.co/minnesotanlp/Finch-8B) | +| `Finch-9B` | Qwen3.5-9B | 9B | EFT | [![Open on Hugging Face](https://img.shields.io/badge/-Open-FFD21E?logo=huggingface&logoColor=black)](https://huggingface.co/minnesotanlp/Finch-9B) | +| `Finch-4B-KTO` | Qwen3.5-4B | 4B | EFT + KTO | [![Open on Hugging Face](https://img.shields.io/badge/-Open-FFD21E?logo=huggingface&logoColor=black)](https://huggingface.co/minnesotanlp/Finch-4B-KTO) | +| `Finch-8B-KTO` | Qwen3-8B | 8B | EFT + KTO | [![Open on Hugging Face](https://img.shields.io/badge/-Open-FFD21E?logo=huggingface&logoColor=black)](https://huggingface.co/minnesotanlp/Finch-8B-KTO) | + +## How to Use Finch + +1. **Execute OpenEvolve scaffold with Finch (vLLM serving, recommended)** + +Finch is a **mutation operator for evolutionary search**, most effective driven by a scaffold such as **OpenEvolve** (`T = 100`, temperature `0.7`, top-`p` `0.95`, up to `30K` tokens). +You can also use other scaffolds in the [SkyDiscover](https://github.com/skydiscover-ai/skydiscover) framework, but we do not guarantee performance, as our model is trained on OpenEvolve's trajectories β€” one of this work's limitations. + +2. **Calling Finch directly** + +You can also call Finch directly: + +**System prompt** (task-level instruction from the OpenEvolve scaffold): +``` +You are an expert mathematician specializing in circle packing problems and computational geometry. +Your task is to improve a constructor function that directly produces a specific arrangement of +26 circles in a unit square, maximizing the sum of their radii. +The AlphaEvolve paper achieved a sum of 2.635 for n=26. + +Key geometric insights: +- Circle packings often follow hexagonal patterns in the densest regions +- Maximum density for infinite circle packing is pi/(2*sqrt(3)) β‰ˆ 0.9069 +- Edge effects make square container packing harder than infinite packing +- Similar radius circles often form regular patterns, while varied radii allow better space utilization +``` + +**User prompt** (evolutionary state β€” current program + evaluator feedback + evolutionary history): +``` +# Current Program Information +- Fitness: 0.3642 (sum_radii: 0.9598) +- Focus areas: Fitness unchanged at 0.3642. Consider simplifying β€” code length exceeds 500 characters. + +# Program Evolution History +## Previous Attempts + +### Attempt 1 +- Changes: Replace concentric ring placement with hexagonal lattice (5-6-5-6-5 row pattern) +- Metrics: sum_radii: 0.9598, validity: 1.0 β€” Improvement in all metrics + +# Current Program + +# EVOLVE-BLOCK-START +import numpy as np + +def construct_packing(): + n = 26 + centers = np.zeros((n, 2)) + centers[0] = [0.5, 0.5] # center circle + for i in range(8): # inner ring + angle = 2 * np.pi * i / 8 + centers[i+1] = [0.5 + 0.3*np.cos(angle), 0.5 + 0.3*np.sin(angle)] + for i in range(16): # outer ring + angle = 2 * np.pi * i / 16 + centers[i+9] = [0.5 + 0.7*np.cos(angle), 0.5 + 0.7*np.sin(angle)] + centers = np.clip(centers, 0.01, 0.99) + radii = compute_max_radii(centers) + return centers, radii, np.sum(radii) +# EVOLVE-BLOCK-END +``` + +```python +import torch +from transformers import AutoModelForCausalLM, AutoTokenizer + +model_id = "minnesotanlp/Finch-8B" +tokenizer = AutoTokenizer.from_pretrained(model_id) +model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype="auto", device_map="auto") + +# Given an evolutionary state β€” task instruction + parent program + evolutionary history +# + evaluator feedback β€” Finch proposes an improved candidate program. +messages = [ + {"role": "system", "content": SYSTEM_PROMPT}, # provided by your evolutionary scaffold + {"role": "user", "content": USER_PROMPT}, # parent program + feedback + history +] +inputs = tokenizer.apply_chat_template( + messages, add_generation_prompt=True, return_tensors="pt" +).to(model.device) + +out = model.generate(inputs, max_new_tokens=30000, do_sample=True, temperature=0.7, top_p=0.95) +print(tokenizer.decode(out[0][inputs.shape[-1]:], skip_special_tokens=True)) +``` + +## Training + +- **Data.** `improved` transitions from the [Finch Collection](https://huggingface.co/datasets/minnesotanlp/Finch-Collection) across **355 training tasks** (16 of 371 held out). One evolutionary run is kept per task β†’ **30,445** supervised examples; **900** uniformly-sampled examples for validation. +- **Teacher.** Trajectories generated by **Qwen3.5-397B-A17B** inside the **OpenEvolve** scaffold. +- **Recipe.** Full SFT with [LLaMA-Factory](https://github.com/hiyouga/LLaMA-Factory) β€” **1 epoch**, global batch size **128**, learning rate **1e-5**, on **8Γ— NVIDIA H200 140GB** GPUs. + +> Want a sharper self-judging variant? See **[`Finch-8B-KTO`](https://huggingface.co/minnesotanlp/Finch-8B-KTO)**, which adds a KTO preference-learning stage on top of this model. + +## Results + +- Finch outperforms its same-size base by up to **+10.24%** across 22 held-out tasks spanning 5 domains, with per-task gains reaching **+290%**. Gains scale with model size β€” Finch-4B already matches a model roughly twice its size on the ErdΕ‘s task. + +
+ main results +
+ +- On NP-hard competitive programming (FrontierCS), Finch-9B averages **46.01** vs base Qwen3.5-9B's **32.46**; on CALICO's P263 β€” UC Berkeley's official open-ended contest β€” it scores **86.10** vs **55.09**. + +
+ frontiercs results +
+ +- With preference learning (KTO), Finch-8B surpasses the best human score on both AC1 and AC2, lifting its competitive-programming average from **24.56 β†’ 37.30**. Paired with the *nanodiscover* learning scaffold, it also matches SOTA on two circle-packing tasks and improves ErdΕ‘s by **+3.2%**. + +
+ frontiercs results +
+ +## Limitations + +- Trajectories are collected and evaluated only with **OpenEvolve**; behavior under different scaffolds is not guaranteed. +- The synergy with **test-time RL** is demonstrated primarily on mathematical tasks. +- Finch-8B inherits the capabilities and biases of **Qwen3-8B**. + +## License + +The **Finch Collection** is released under the [**CC-BY 4.0 License**](https://creativecommons.org/licenses/by/4.0/) and is recommended for **non-commercial academic research**. The accompanying **code** and **Finch model weights** are released under the [**Apache 2.0 License**](https://www.apache.org/licenses/LICENSE-2.0). + +## Acknowledgements + +This research was supported by the "Advanced GPU Utilization Support Program" funded by the Government of the Republic of Korea (Ministry of Science and ICT). We are grateful to the SkyDiscover team for their valuable feedback on the dataset construction process, the use of the SkyDiscover framework, and the overall direction of this research β€” in particular, [Shu Liu](https://shulynnliu.com/), [Shubham Agarwal](https://skejriwal44.github.io/), and [Mert Cemri](https://people.eecs.berkeley.edu/~mert_cemri/) for their insightful comments and discussions. We also thank the OpenEvolve team, especially Ritik Vijayvergiya and [Asankhaya Sharma](https://asankhaya.github.io/), for their guidance on using the OpenEvolve framework and for their thoughtful comments on this work. We further thank the authors of ALE-Bench, especially [Yuki Imajuku](https://imajuku.tech/), and the AtCoder team for authorizing the public release of the evolutionary search trajectories derived from their CC BY-ND 4.0-licensed dataset. Finally, we thank [Byung-Kwan Lee](https://byungkwanlee.github.io/ByungKwanLee-CV/) for valuable feedback during the early stages of this project. + +## Citation + +```bibtex +@misc{lee2026evolutionfinetuninglearningdiscover, + title={Evolution Fine-Tuning: Learning to Discover Across 371 Optimization Tasks}, + author={Young-Jun Lee and Seungone Kim and Minki Kang and Alistair Cheong Liang Chuen and Zerui Chen and Seungho Han and Taehee Jung and Dongyeop Kang}, + year={2026}, + eprint={2606.29082}, + archivePrefix={arXiv}, + primaryClass={cs.CL}, + url={https://arxiv.org/abs/2606.29082}, +} +``` diff --git a/assets/finch_icon.png b/assets/finch_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..85a1f4e25abadcc91bd79c20bad133326de52063 GIT binary patch literal 31562 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 z6RG(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 message.content is string 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.content is string %} + {%- set content = message.content %} + {%- else %} + {%- set content = '' %} + {%- endif %} + {%- if (message.role == "user") or (message.role == "system" and not loop.first) %} + {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>' + '\n' }} + {%- elif message.role == "assistant" %} + {%- set reasoning_content = '' %} + {%- if message.reasoning_content is string %} + {%- set reasoning_content = message.reasoning_content %} + {%- else %} + {%- if '' in content %} + {%- set reasoning_content = content.split('')[0].rstrip('\n').split('')[-1].lstrip('\n') %} + {%- set content = content.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' }} + {{- 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..91e42ce --- /dev/null +++ b/config.json @@ -0,0 +1,74 @@ +{ + "architectures": [ + "Qwen3ForCausalLM" + ], + "attention_bias": false, + "attention_dropout": 0.0, + "bos_token_id": null, + "dtype": "bfloat16", + "eos_token_id": 151645, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 4096, + "initializer_range": 0.02, + "intermediate_size": 12288, + "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", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention" + ], + "max_position_embeddings": 131072, + "max_window_layers": 36, + "model_type": "qwen3", + "num_attention_heads": 32, + "num_hidden_layers": 36, + "num_key_value_heads": 8, + "pad_token_id": 151643, + "rms_norm_eps": 1e-06, + "rope_parameters": { + "attention_factor": 1.0, + "factor": 1.5, + "original_max_position_embeddings": 131072, + "rope_theta": 1000000, + "rope_type": "yarn" + }, + "sliding_window": null, + "tie_word_embeddings": false, + "transformers_version": "5.2.0", + "use_cache": false, + "use_sliding_window": false, + "vocab_size": 151936 +} diff --git a/generation_config.json b/generation_config.json new file mode 100644 index 0000000..1701c94 --- /dev/null +++ b/generation_config.json @@ -0,0 +1,12 @@ +{ + "do_sample": true, + "eos_token_id": [ + 151645, + 151643 + ], + "pad_token_id": 151643, + "temperature": 0.6, + "top_k": 20, + "top_p": 0.95, + "transformers_version": "5.2.0" +} diff --git a/model.safetensors b/model.safetensors new file mode 100644 index 0000000..abc2a9d --- /dev/null +++ b/model.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4fc9bb6d09fb1ff0ab91f6fbb5c8321dc8b0799d8d3bf3c0b182a4935862cdc1 +size 16381517208 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..271320b --- /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": "<|im_end|>", + "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, + "model_max_length": 131072, + "pad_token": "<|endoftext|>", + "padding_side": "right", + "split_special_tokens": false, + "tokenizer_class": "Qwen2Tokenizer", + "unk_token": null +}