From f9f53564af227f8601127159057cffe9bf3ef22d Mon Sep 17 00:00:00 2001 From: ModelHub XC Date: Fri, 31 Jul 2026 13:04:24 +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: jiosephlee/assay-transfer-tool Source: Original Platform --- .gitattributes | 35 + README.md | 57 + chat_template.jinja | 120 + config.json | 68 + generation_config.json | 8 + merges.txt | 151388 +++++++++++++++++++++++++++ metric.json | 89 + model-00001-of-00004.safetensors | 3 + model-00002-of-00004.safetensors | 3 + model-00003-of-00004.safetensors | 3 + model-00004-of-00004.safetensors | 3 + model.safetensors.index.json | 407 + special_tokens_map.json | 29 + tokenization_interns1.py | 978 + tokenizer_FASTA.model | 3 + tokenizer_IUPAC.model | 3 + tokenizer_SMILES.model | 3 + tokenizer_config.json | 434 + vocab.json | 151645 ++++++++++++++++++++++++++++ 19 files changed, 305279 insertions(+) create mode 100644 .gitattributes create mode 100644 README.md create mode 100644 chat_template.jinja create mode 100644 config.json create mode 100644 generation_config.json create mode 100644 merges.txt create mode 100644 metric.json create mode 100644 model-00001-of-00004.safetensors create mode 100644 model-00002-of-00004.safetensors create mode 100644 model-00003-of-00004.safetensors create mode 100644 model-00004-of-00004.safetensors create mode 100644 model.safetensors.index.json create mode 100644 special_tokens_map.json create mode 100644 tokenization_interns1.py create mode 100644 tokenizer_FASTA.model create mode 100644 tokenizer_IUPAC.model create mode 100644 tokenizer_SMILES.model create mode 100644 tokenizer_config.json create mode 100644 vocab.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..a6344aa --- /dev/null +++ b/.gitattributes @@ -0,0 +1,35 @@ +*.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 diff --git a/README.md b/README.md new file mode 100644 index 0000000..251327d --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +--- +license: apache-2.0 +base_model: jiosephlee/Intern-S1-mini-lm +pipeline_tag: text-generation +tags: +- chemistry +- drug-discovery +- admet +- assay-transfer +- smiles +library_name: transformers +--- + +# assay-transfer-tool + +A full-parameter SFT of the `Qwen3ForCausalLM` Intern-S1-mini language backbone +(`jiosephlee/Intern-S1-mini-lm`) for **binary assay-transfer prediction** on +small molecules. Given a molecule (SMILES) and a paired-choice prompt, the model +answers with `(A)` or `(B)`. + +The model uses the Intern SMILES-aware tokenizer, so load with +`trust_remote_code=True`. + +## Training + +- **Base model:** `jiosephlee/Intern-S1-mini-lm` (Qwen3ForCausalLM, vocab 153216) +- **Dataset:** `jiosephlee/assay-transfer-intern` (158,429 train rows) +- **Regime:** full-parameter BF16, packing + padding-free, gradient checkpointing, + Liger fused linear cross-entropy, `paged_adamw_8bit` +- **Chat template:** enabled, thinking disabled; completions are `(A)` / `(B)` +- **LR:** 2e-5 base, with SMILES input-embedding rows trained at 1.5x +- **Max length:** 4096, 1 epoch + +This checkpoint is the best-validation snapshot (step 50), promoted by the +assay-transfer callback on binary macro-F1. + +## Validation metrics (source_value split, n=1703) + +| Metric | Value | +| --- | --- | +| Binary macro-F1 | 0.6612 | +| Binary accuracy | 0.7046 | +| Parse rate | 1.00 | +| assay_concept group-avg macro-F1 | 0.6321 | +| tanimoto_bucket group-avg macro-F1 | 0.6316 | + +Per-assay macro-F1: Fa 0.532, Fg 0.593, Fh 0.704, oral_bioavailability 0.600, +oral_exposure 0.732. Per-Tanimoto-bucket macro-F1: high 0.664, low 0.600. + +## Usage + +```python +from transformers import AutoModelForCausalLM, AutoTokenizer + +tok = AutoTokenizer.from_pretrained("jiosephlee/assay-transfer-tool", trust_remote_code=True) +model = AutoModelForCausalLM.from_pretrained("jiosephlee/assay-transfer-tool", torch_dtype="bfloat16") +``` diff --git a/chat_template.jinja b/chat_template.jinja new file mode 100644 index 0000000..73e9d7f --- /dev/null +++ b/chat_template.jinja @@ -0,0 +1,120 @@ +{% set default_thinking_sys %}You are an expert reasoner with extensive experience in all areas. You approach problems through systematic thinking and rigorous reasoning. Your response should reflect deep understanding and precise logical thinking, making your solution path and reasoning clear to others. Please put your thinking process within ... tags.{% endset %} +{%- set tool_instruction %}Your response should consist of a reasoning step (**thought**) followed immediately by a function call in valid JSON format. Wrap each function call using the `<|action_start|><|plugin|>` and `<|action_end|>` tags. + +**Format example:** + +``` +(Your thought goes here...) + +<|action_start|><|plugin|> +{ + "name": "tool_name", + "parameters": { + "parameter1": "value1", + "parameter2": "value2" + } +} +<|action_end|> +``` + +# External Tools +You have access to these tools: +{% if tools %}{{ tools | tojson(indent=2) }}{% else %}[]{% endif %}{% endset %} +{%- 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" %} + {%- set ns.multi_step_tool = false %} + {%- set ns.last_query_index = index %} + {%- endif %} +{%- endfor %} +{%- for message in messages %} + {%- set role = message.role if message.role != 'tool' else 'environment' %} + {%- set reasoning_content = '' %} + {%- set content = message.content %} + {%- set ns.tool_calls = '' %} + {%- if role == 'assistant' %} + {%- if message.reasoning_content is string %} + {%- set reasoning_content = message.reasoning_content %} + {%- elif '' in content %} + {%- set reasoning_content = content.split('')[0].strip().split('')[-1].strip() %} + {%- set content = content.split('')[-1].lstrip(' +') %} + {%- endif %} + {%- if message.tool_calls %} + {%- for tool_call in message.tool_calls %} + {%- if not loop.first %} + {%- set ns.tool_calls = ns.tool_calls + ' +' %} + {%- endif %} + {%- if tool_call.function %} + {%- set tool_call = tool_call.function %} + {%- endif %} + {%- set ns.tool_calls = ns.tool_calls + '<|action_start|><|plugin|> +{"name": "' + tool_call.name + '", "parameters": ' %} + {%- if tool_call.arguments is string %} + {%- set ns.tool_calls = ns.tool_calls + tool_call.arguments %} + {%- else %} + {%- set ns.tool_calls = ns.tool_calls + tool_call.arguments | tojson %} + {%- endif %} + {%- set ns.tool_calls = ns.tool_calls + '} +<|action_end|>' %} + {%- endfor %} + {%- endif %} + {%- set reasoning_content = ' +' + reasoning_content.strip(' +') + ' + +' %} + {%- endif %} + {%- if not content is string %} + {%- set ns.content = '' %} + {%- for _content in message.content %} + {%- if _content.type == 'image' %} + {%- set ns.content = ns.content ~ ' +' %} + {%- elif _content.type == 'video' %} + {%- set ns.content = ns.content ~ ' +