MatterGen / demo /run.sh
dadadaxi's picture
Upload folder using huggingface_hub
f15d29e verified
Raw
History Blame Contribute Delete
2.35 kB
#!/bin/bash
set -euo pipefail
DEMO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG=""
MODE="run"
while [[ $# -gt 0 ]]; do
case "$1" in
--config) CONFIG="$2"; shift 2 ;;
--config=*) CONFIG="${1#*=}"; shift ;;
--submit) MODE="submit"; shift ;;
-h|--help) echo "Usage: bash run.sh --config configs/<name>.yaml [--submit]"; exit 0 ;;
*) echo "Unknown argument: $1" >&2; exit 2 ;;
esac
done
[[ -n "$CONFIG" ]] || { echo "Please specify --config configs/<name>.yaml" >&2; exit 2; }
[[ "$CONFIG" = /* ]] || CONFIG="$DEMO_DIR/$CONFIG"
[[ -f "$CONFIG" ]] || { echo "Config not found: $CONFIG" >&2; exit 2; }
if [[ -z "${CONDA_PREFIX:-}" || -z "${ONESCIENCE_MODELS_DIR:-}" ]]; then
export MATCHEM_CONDA_NAME="${MATCHEM_CONDA_NAME:-onescience-mattergen-source}"
source "$DEMO_DIR/../../matchem_env.sh"
fi
CMD=$(python3 - "$CONFIG" "$DEMO_DIR/.." <<'PY'
import os, shlex, sys, yaml
import json
cfg = yaml.safe_load(open(sys.argv[1]))
root = os.path.abspath(sys.argv[2])
task = cfg.get("task", "train")
script = {"train": "train.py", "finetune": "finetune.py", "generate": "generate.py"}.get(task)
if not script: raise SystemExit(f"Unsupported task: {task}")
args = []
for key, value in cfg.get("args", {}).items():
if isinstance(value, bool):
if value: args.append(f"--{key.replace('_', '-')}")
elif value is not None:
value = json.dumps(value) if isinstance(value, (dict, list)) else str(value)
value = os.path.expandvars(value)
args.extend([f"--{key.replace('_', '-')}", value] if task == "generate" else [f"{key}={value}"])
print(" ".join(map(shlex.quote, [sys.executable, os.path.join(root, script), *args])))
PY
)
echo "Running MatterGen: $CMD"
if [[ "$MODE" == "submit" ]]; then
TASK=$(python3 - "$CONFIG" <<'PY'
import sys, yaml
print(yaml.safe_load(open(sys.argv[1])).get("task", "train"))
PY
)
[[ "$TASK" == "train" ]] || { echo "--submit currently supports train configs only" >&2; exit 2; }
DEVICES=$(python3 - "$CONFIG" <<'PY'
import sys, yaml
print(yaml.safe_load(open(sys.argv[1])).get("args", {}).get("trainer.devices", 8))
PY
)
sbatch \
--gres="dcu:$DEVICES" \
--export="ALL,CONFIG_PATH=$CONFIG,SCRIPT_DIR=$DEMO_DIR/.." \
"$DEMO_DIR/../submit_train.sh"
exit 0
fi
cd "$DEMO_DIR/.."
eval "$CMD"