126 lines
4.0 KiB
Markdown
126 lines
4.0 KiB
Markdown
---
|
||
license: apache-2.0
|
||
language:
|
||
- en
|
||
metrics:
|
||
- accuracy
|
||
- recall
|
||
- precision
|
||
- r_squared
|
||
- mse
|
||
- mae
|
||
base_model:
|
||
- Qwen/Qwen3-8B
|
||
tags:
|
||
- text-generation-inference
|
||
- materials-science
|
||
- qwen3
|
||
- classification
|
||
- regression
|
||
---
|
||
# Model Overview
|
||
|
||
This repository contains the weights for the **Qwen-3-8B-RHEA-property-predictor**, fine-tuned for refractory high entropy alloys property prediction and phase classification tasks.
|
||
|
||
## Training Details
|
||
|
||
### Prompt Template
|
||
Training prompts follow the template:
|
||
|
||
**property prediction task**
|
||
> “You are a materials science expert. Predict the {**property name**} for the following refractory high entropy alloy.”
|
||
|
||
property name includs density, hardness, compressive yield strength at room temperature, compressive strain at room temperature,
|
||
compressive yield strength at 1073K, and compressive yield strength at 1273K
|
||
|
||
**phase classification task**
|
||
> “You are a materials science expert. Determine whether the given refractory high entropy alloy has {**single solution phase/intermetallic phase**}.”
|
||
|
||
Each query was formatted as:
|
||
> “{**composition**} alloy prepared by {**process description text**}”
|
||
|
||
### Hyperparameters & Settings
|
||
* **Task:** Binary classification / Regression
|
||
* **GPU:** 4 × NVIDIA GeForce RTX 3090
|
||
* **Seed:** 42
|
||
* **Final Epoch:** 4
|
||
* **per-device batch size:** 2
|
||
* **gradient accumulation:** 8
|
||
* **Training Objective:** Full fine-tuning with CrossEntropyLoss
|
||
* **Sequence Length:** 1024 tokens
|
||
* **Dataset:**
|
||
* Train: `train_data-all.jsonl`
|
||
* Validation: `val_data-all.jsonl`
|
||
* **Dataset Source:** The datasets are available at (https://huggingface.co/datasets/tianchuang/RHEA-mechanical-property)
|
||
|
||
---
|
||
|
||
## Validation Metrics
|
||
|
||
Metrics are from model-calling evaluation.
|
||
|
||
**Property prediction (val)**
|
||
| Metric | YS task | Strain task | YS-1073 task | YS-1273 task | hardness task | density task |
|
||
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
||
| R2 | 0.533 | 0.185 | 0.565 | 0.671 | 0.561 | 0.886 |
|
||
| MAE | 237.4 | 7.73 | 192.1 | 117.1 | 76.3 | 0.46 |
|
||
| RMSE | 324.8 | 9.93 | 251.4 | 149.1 | 109.6 | 0.69 |
|
||
|
||
**Phase classification (val)**
|
||
| Metric | SS task | IM task |
|
||
| :--- | :--- | :--- |
|
||
| Precision | 0.833 | 0.849 |
|
||
| Recall | 0.847 | 0.865 |
|
||
| F1 score | 0.840 | 0.857 |
|
||
| Accuracy | 0.858 | 0.886 |
|
||
|
||
---
|
||
|
||
## How to Use
|
||
|
||
You can load and run inference with this model using the `transformers` library. The model uses the ChatML prompt format.
|
||
|
||
```python
|
||
import torch
|
||
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig
|
||
|
||
# 1. Load model and tokenizer
|
||
model_id = "tianchuang/Qwen-3-8B-RHEA-property-predictor"
|
||
tokenizer = AutoTokenizer.from_pretrained(model_id)
|
||
model = AutoModelForCausalLM.from_pretrained(
|
||
model_id,
|
||
torch_dtype=torch.bfloat16,
|
||
device_map="auto"
|
||
)
|
||
|
||
# 2. Prepare your input data
|
||
instruction = "Is the material BaTiO3 likely synthesizable? Answer with P (positive) or N (negative)."
|
||
input_text = "" # Leave empty if no additional context is needed
|
||
|
||
# 3. Format the input using the ChatML template
|
||
if input_text:
|
||
prompt = f"<|im_start|>system\nYou are a materials science expert.<|im_end|>\n<|im_start|>user\n{instruction}\n{input_text}<|im_end|>\n<|im_start|>assistant\n"
|
||
else:
|
||
prompt = f"<|im_start|>system\nYou are a materials science expert.<|im_end|>\n<|im_start|>user\n{instruction}<|im_end|>\n<|im_start|>assistant\n"
|
||
|
||
# 4. Tokenize and generate response
|
||
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
|
||
|
||
generation_config = GenerationConfig(
|
||
max_new_tokens=64,
|
||
do_sample=True,
|
||
temperature=0.6,
|
||
top_p=0.9,
|
||
top_k=50,
|
||
pad_token_id=tokenizer.eos_token_id,
|
||
eos_token_id=tokenizer.eos_token_id,
|
||
)
|
||
|
||
outputs = model.generate(**inputs, generation_config=generation_config)
|
||
|
||
# 5. Decode and parse the prediction
|
||
full_response = tokenizer.decode(outputs[0], skip_special_tokens=False)
|
||
assistant_response = full_response.split("<|im_start|>assistant")[-1]
|
||
clean_response = assistant_response.replace("<|im_end|>", "").strip()
|
||
|
||
print(f"Prediction: {clean_response}") |