初始化项目,由ModelHub XC社区提供模型
Model: arungovindneelan/foam-cfd-unified-7b Source: Original Platform
This commit is contained in:
220
README.md
Normal file
220
README.md
Normal file
@@ -0,0 +1,220 @@
|
||||
---
|
||||
language: en
|
||||
license: apache-2.0
|
||||
base_model: Qwen/Qwen2.5-Coder-7B-Instruct
|
||||
tags:
|
||||
- cfd
|
||||
- openfoam
|
||||
- gmsh
|
||||
- fluid-dynamics
|
||||
- fine-tuned
|
||||
- qwen2.5
|
||||
- qlora
|
||||
pipeline_tag: text-generation
|
||||
---
|
||||
|
||||
# foam-cfd-unified-7B
|
||||
|
||||
A single **Qwen2.5-Coder-7B-Instruct** model fine-tuned for end-to-end CFD workflows —
|
||||
covering Gmsh mesh generation, OpenFOAM boundary condition files, and BC JSON patch specs.
|
||||
|
||||
---
|
||||
|
||||
## What this model does
|
||||
|
||||
| Task | Input | Output |
|
||||
|---|---|---|
|
||||
| **Mesh generation** | Plain-English geometry description | Gmsh `.geo` script |
|
||||
| **OpenFOAM case files** | Flow prompt + mesh patches | `0/U`, `0/p`, `0/k`, `0/epsilon` BC files |
|
||||
| **BC patch spec** | Flow description + existing BC template | Compact JSON diff applied on top of template |
|
||||
|
||||
**Example prompts:**
|
||||
- `"Lid driven cavity, Re=1000, 0.1m x 0.1m"`
|
||||
- `"Flow over a cylinder, diameter=0.05m, Re=100"`
|
||||
- `"2D backward-facing step, step height 0.05m, Re=500"`
|
||||
- `"NACA 0012 airfoil, chord=1m, AoA=5deg, Re=1e6"`
|
||||
|
||||
---
|
||||
|
||||
## Model info
|
||||
|
||||
| Field | Value |
|
||||
|---|---|
|
||||
| Base model | Qwen2.5-Coder-7B-Instruct |
|
||||
| Fine-tuning method | QLoRA (LoRA r=64, alpha=16, 4-bit NF4) via Unsloth |
|
||||
| Training examples | 20,505 (mesh-gen + foam-gen + patch-gen + raft-patch-gen) |
|
||||
| Validation examples | 2,277 |
|
||||
| VRAM required | ~6 GB (4-bit inference) / ~16 GB (full precision) |
|
||||
| Sequence length | 4096 tokens |
|
||||
|
||||
---
|
||||
|
||||
## Quickstart — use with the foam-cfd-ai server
|
||||
|
||||
### 1. Clone the deployment repo
|
||||
|
||||
```bash
|
||||
git clone https://github.com/AGN000/foam-cfd-deploy
|
||||
cd foam-cfd-deploy
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### 2. Download this model
|
||||
|
||||
```bash
|
||||
pip install huggingface_hub
|
||||
python3 -c "
|
||||
from huggingface_hub import snapshot_download
|
||||
snapshot_download(
|
||||
'arungovindneelan/foam-cfd-unified-7b',
|
||||
local_dir='checkpoints/unified/merged'
|
||||
)
|
||||
"
|
||||
```
|
||||
|
||||
### 3. Build the RAG index
|
||||
|
||||
Requires OpenFOAM 11 tutorials (usually at `/opt/openfoam11/tutorials`):
|
||||
|
||||
```bash
|
||||
python3 -m rag.build_index
|
||||
```
|
||||
|
||||
### 4. Start the inference server
|
||||
|
||||
```bash
|
||||
python3 -m inference.server --model checkpoints/unified/merged --port 8000
|
||||
```
|
||||
|
||||
### 5. Run a simulation end-to-end
|
||||
|
||||
```bash
|
||||
# Quick demo
|
||||
python3 demo.py "Lid driven cavity, Re=1000"
|
||||
|
||||
# Or call the API directly
|
||||
curl -X POST http://localhost:8000/simulate \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"prompt": "flow over a cylinder, Re=100, diameter 0.1m"}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Direct Python usage (without the server)
|
||||
|
||||
```python
|
||||
from transformers import AutoTokenizer, AutoModelForCausalLM
|
||||
import torch
|
||||
|
||||
model_id = "arungovindneelan/foam-cfd-unified-7b"
|
||||
tokenizer = AutoTokenizer.from_pretrained(model_id)
|
||||
model = AutoModelForCausalLM.from_pretrained(
|
||||
model_id,
|
||||
torch_dtype=torch.float16,
|
||||
device_map="auto",
|
||||
)
|
||||
|
||||
# Generate a Gmsh mesh script
|
||||
messages = [
|
||||
{"role": "system", "content": "You are a CFD mesh generation expert. Generate valid Gmsh .geo scripts."},
|
||||
{"role": "user", "content": "Create a 2D lid-driven cavity mesh, 0.1m x 0.1m, structured 50x50 grid."},
|
||||
]
|
||||
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
|
||||
inputs = tokenizer(text, return_tensors="pt").to(model.device)
|
||||
|
||||
with torch.no_grad():
|
||||
outputs = model.generate(**inputs, max_new_tokens=1024, temperature=0.1, do_sample=True)
|
||||
|
||||
response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
|
||||
print(response)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## System requirements
|
||||
|
||||
- Linux (Ubuntu 20.04+)
|
||||
- Python 3.10+
|
||||
- NVIDIA GPU with >= 8 GB VRAM (tested on H100, A100, RTX 3090)
|
||||
- CUDA 12.x
|
||||
- OpenFOAM 11 (for simulation — not required for model inference alone)
|
||||
|
||||
---
|
||||
|
||||
## Repository structure
|
||||
|
||||
```
|
||||
foam-cfd-ai/
|
||||
checkpoints/unified/merged/ <- this model
|
||||
inference/
|
||||
server.py <- FastAPI server (POST /generate /mesh /simulate)
|
||||
mesh_pipeline.py <- Gmsh script generation + validation
|
||||
rag/
|
||||
build_index.py <- build vector store from OpenFOAM tutorials
|
||||
llm_case_generator.py <- LLM-driven BC file generation
|
||||
rag_case_builder.py <- RAG + LLM -> OpenFOAM case directory
|
||||
retriever.py <- vector search over tutorial chunks
|
||||
simulation/
|
||||
case_builder.py <- hardcoded fallback case builder
|
||||
foam_runner.py <- runs foamRun -solver incompressibleFluid
|
||||
training/
|
||||
train.py <- QLoRA fine-tuning (Unsloth + TRL)
|
||||
config_unified.yaml <- training config for this model
|
||||
demo.py <- end-to-end demo script
|
||||
requirements.txt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## API endpoints (when server is running)
|
||||
|
||||
| Endpoint | Method | Description |
|
||||
|---|---|---|
|
||||
| `/health` | GET | Server health check |
|
||||
| `/generate` | POST | Generate Gmsh `.geo` script from prompt |
|
||||
| `/mesh` | POST | Generate + validate mesh, return stats |
|
||||
| `/simulate` | POST | Full pipeline: mesh → OpenFOAM case → run → results |
|
||||
|
||||
### Example: `/simulate`
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8000/simulate \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"prompt": "NACA 0012 airfoil, chord 1m, AoA 5 degrees, Re 1e6",
|
||||
"n_iter": 500
|
||||
}'
|
||||
```
|
||||
|
||||
Response:
|
||||
```json
|
||||
{
|
||||
"status": "converged",
|
||||
"solver": "simpleFoam",
|
||||
"iterations": 487,
|
||||
"residuals": {
|
||||
"Ux": {"initial": 1.0, "final": 3.2e-5},
|
||||
"Uy": {"initial": 1.0, "final": 8.7e-5},
|
||||
"p": {"initial": 1.0, "final": 2.1e-4}
|
||||
},
|
||||
"case_dir": "/tmp/foam_cases/20260407_094950_airfoil"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Training data breakdown
|
||||
|
||||
| Task | Examples | Description |
|
||||
|---|---|---|
|
||||
| mesh-gen | ~5,000 | Gmsh `.geo` script generation |
|
||||
| foam-gen | ~5,000 | Full OpenFOAM BC file generation |
|
||||
| patch-gen | ~5,000 | JSON BC patch spec generation |
|
||||
| raft-patch-gen | ~5,505 | RAFT-style retrieval-augmented patch generation |
|
||||
| **Total** | **20,505** | Unified training set |
|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
Apache 2.0 — same as the Qwen2.5-Coder base model.
|
||||
Reference in New Issue
Block a user