Files
ghostnet-openclaw/scripts/benchmark-model-suite.sh

185 lines
4.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$PROJECT_DIR"
# Source report generator
source "$PROJECT_DIR/scripts/lib/report-generator.sh" 2>/dev/null || true
usage() {
cat <<'EOF'
Usage: ./scripts/benchmark-model-suite.sh [options]
Fuehrt den bestehenden Stack-Benchmark fuer die drei lokalen Coding-Profile aus
und schreibt Artefakte plus eine Vergleichszusammenfassung.
Optionen:
--lines <n> Erwartete Zeilenanzahl LINE_1..LINE_n (default: 140)
--timeout-sec <n> Timeout je Lauf in Sekunden (default: 600)
--runtime-root <p> Zielordner fuer temporaere Laufdaten (default: auto)
--results-root <p> Zielordner fuer kuratierte Resultate (default: auto)
--artifact-root <p> Legacy-Alias; nutzt denselben Pfad fuer Runtime und Resultate
--keep-runtime Runtime-Dateien der Einzelruns nicht loeschen
--session-prefix <s> Prefix fuer Session-Keys (default: suite:<timestamp>)
-h, --help Hilfe anzeigen
EOF
}
slugify_model() {
local model="$1"
local slug="${model#ollama/}"
slug="${slug//:/-}"
slug="${slug//./-}"
printf '%s' "$slug"
}
extract_value() {
local label="$1"
local file="$2"
local value
value="$(sed -n "s/^${label}: //p" "$file" | head -n 1)"
printf '%s' "${value:-n/a}"
}
extract_metric() {
local label="$1"
local file="$2"
local value
value="$(sed -n "s/^- ${label}: //p" "$file" | head -n 1)"
printf '%s' "${value:-n/a}"
}
EXPECTED_LINES=140
TIMEOUT_SEC=600
RUNTIME_ROOT=""
RESULTS_ROOT=""
LEGACY_ARTIFACT_ROOT=""
KEEP_RUNTIME=0
SESSION_PREFIX="suite:$(date +%Y%m%d-%H%M%S)"
while [ "$#" -gt 0 ]; do
case "$1" in
--lines)
EXPECTED_LINES="$2"
shift 2
;;
--timeout-sec)
TIMEOUT_SEC="$2"
shift 2
;;
--runtime-root)
RUNTIME_ROOT="$2"
shift 2
;;
--results-root)
RESULTS_ROOT="$2"
shift 2
;;
--artifact-root)
LEGACY_ARTIFACT_ROOT="$2"
shift 2
;;
--keep-runtime)
KEEP_RUNTIME=1
shift
;;
--session-prefix)
SESSION_PREFIX="$2"
shift 2
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unbekannte Option: $1" >&2
usage >&2
exit 1
;;
esac
done
RUN_ID="model-suite-$(date +%Y%m%d-%H%M%S)"
if [ -n "$LEGACY_ARTIFACT_ROOT" ]; then
RUNTIME_ROOT="$LEGACY_ARTIFACT_ROOT"
if [ -z "$RESULTS_ROOT" ]; then
RESULTS_ROOT="$LEGACY_ARTIFACT_ROOT"
KEEP_RUNTIME=1
fi
fi
if [ -z "$RUNTIME_ROOT" ]; then
RUNTIME_ROOT="$PROJECT_DIR/.cache/benchmarks/$RUN_ID"
fi
if [ -z "$RESULTS_ROOT" ]; then
RESULTS_ROOT="$PROJECT_DIR/docs/benchmarks/existing-suite/$RUN_ID"
fi
mkdir -p "$RUNTIME_ROOT" "$RESULTS_ROOT"
MODELS=(
"ollama/qwen3-coding:latest"
"ollama/qwen25-coding:latest"
"ollama/deepseek-coding:latest"
)
SUMMARY_TABLE="$RESULTS_ROOT/summary.tsv"
printf 'model\tbenchmark_rc\tvalidation\trequest_exit\twall_ms\tprovider_tps\tend_to_end_tps\tload_sec\tkv_tokens\n' > "$SUMMARY_TABLE"
for model in "${MODELS[@]}"; do
slug="$(slugify_model "$model")"
runtime_dir="$RUNTIME_ROOT/$slug"
results_dir="$RESULTS_ROOT/$slug"
session_key="$SESSION_PREFIX:$slug"
run_args=(
--model "$model"
--lines "$EXPECTED_LINES"
--timeout-sec "$TIMEOUT_SEC"
--session-key "$session_key"
--runtime-dir "$runtime_dir"
--results-dir "$results_dir"
--no-start
)
if [ "$KEEP_RUNTIME" -eq 1 ]; then
run_args+=(--keep-runtime)
fi
echo "=== Benchmark fuer $model ==="
if ./scripts/benchmark-stack.sh "${run_args[@]}"; then
benchmark_rc=0
else
benchmark_rc=$?
fi
summary_file="$results_dir/summary.txt"
validation="$(extract_value 'Validation' "$summary_file")"
request_exit="$(extract_value 'Request exit code' "$summary_file")"
wall_ms="$(extract_metric 'end_to_end_wall_ms' "$summary_file")"
provider_tps="$(extract_metric 'output_tokens_per_sec_provider' "$summary_file")"
end_to_end_tps="$(extract_metric 'output_tokens_per_sec_end_to_end' "$summary_file")"
load_sec="$(extract_metric 'model_load_time_sec' "$summary_file")"
kv_tokens="$(extract_metric 'kv_size_tokens' "$summary_file")"
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
"$model" "$benchmark_rc" "$validation" "$request_exit" "$wall_ms" "$provider_tps" "$end_to_end_tps" "$load_sec" "$kv_tokens" \
>> "$SUMMARY_TABLE"
done
echo
echo "Runtime-Wurzel: $RUNTIME_ROOT"
echo "Kuratierte Resultate: $RESULTS_ROOT"
column -ts $'\t' "$SUMMARY_TABLE"
# Generate suite comparison report
if [ -f "$SUMMARY_TABLE" ]; then
echo
echo "📊 Generating suite comparison report..."
generate_suite_comparison_report "$SUMMARY_TABLE" "$RESULTS_ROOT" 2>/dev/null || true
echo "✅ Reports generated in: $RESULTS_ROOT"
fi