updated benchmarks

This commit is contained in:
Donato Capitella
2025-11-30 08:20:12 +00:00
parent 82c6e04253
commit 7b4006b1d4
4 changed files with 51 additions and 42 deletions
+11 -6
View File
@@ -4,7 +4,6 @@ from pathlib import Path
RESULT_SOURCES = [
("results", False), # regular single-node runs
("results-rpc", True), # distributed RPC runs across two servers
]
OUT_JSON = "../docs/results.json"
@@ -64,18 +63,19 @@ def canonicalize_env(env):
def parse_env_flags(basename):
"""
pattern: <model>__<env>[__fa1][__hblt0][__longctx32768][__rpc]
Returns (env, fa, context_tag, context_tokens, rpc_flag)
pattern: <model>__<env>[__fa1][__hblt0][__longctx32768][__rpc][__single][__dual]
Returns (env, fa, context_tag, context_tokens, rpc_flag, gpu_config)
"""
parts = basename.split("__")
if len(parts) < 2:
return None, False, "default", None, False
return None, False, "default", None, False, "single"
env = parts[1]
fa = False
context_tag = "default"
context_tokens = None
rpc_flag = False
gpu_config = "single" # default to single if not specified
for raw_suffix in parts[2:]:
suffix = raw_suffix.lower()
@@ -93,8 +93,12 @@ def parse_env_flags(basename):
context_tokens = None
elif suffix == "rpc":
rpc_flag = True
elif suffix == "single":
gpu_config = "single"
elif suffix == "dual":
gpu_config = "dual"
return env, fa, context_tag, context_tokens, rpc_flag
return env, fa, context_tag, context_tokens, rpc_flag, gpu_config
def env_base_and_variant(env):
# e.g. "rocm6_4_2-rocwmma" -> ("rocm6_4_2", "rocwmma")
@@ -178,7 +182,7 @@ for results_dir, is_rpc_source in RESULT_SOURCES:
continue
model_raw, _rest = base.split("__", 1)
env, fa_from_name, context_tag, context_tokens, rpc_flag = parse_env_flags(base)
env, fa_from_name, context_tag, context_tokens, rpc_flag, gpu_config = parse_env_flags(base)
env = canonicalize_env(env)
if env:
envs.add(env)
@@ -276,6 +280,7 @@ for results_dir, is_rpc_source in RESULT_SOURCES:
"quant": quant,
"log": path,
"rpc": bool(is_rpc_source or rpc_flag),
"gpu_config": gpu_config,
"build": {"hash": build_hash, "number": build_num} if build_hash else None,
}
runs.append(run)
+16 -8
View File
@@ -30,11 +30,10 @@ declare -A CMDS=(
[rocm6_4_4-rocwmma]="toolbox run -c llama-rocm-6.4.4-rocwmma -- /usr/local/bin/llama-bench"
[rocm7.1]="toolbox run -c llama-rocm-7.1 -- /usr/local/bin/llama-bench"
[rocm7.1-rocwmma]="toolbox run -c llama-rocm-7.1-rocwmma -- /usr/local/bin/llama-bench"
[rocm-7alpha-rocwmma-improved]="toolbox run -c llama-rocm-7alpha-rocwmma-improved -- /usr/local/bin/llama-bench"
[rocm-7alpha]="toolbox run -c llama-rocm-7alpha -- /usr/local/bin/llama-bench"
[rocm-7alpha-rocwmma]="toolbox run -c llama-rocm-7alpha-rocwmma -- /usr/local/bin/llama-bench"
[rocm7_rc]="toolbox run -c llama-rocm-7rc -- /usr/local/bin/llama-bench"
[rocm7_rc-rocwmma]="toolbox run -c llama-rocm-7rc-rocwmma -- /usr/local/bin/llama-bench"
[rocm-7-nightly]="toolbox run -c llama-rocm-7-nightly -- /usr/local/bin/llama-bench"
[rocm-7-nightly-rocwmma]="toolbox run -c llama-rocm-7-nightly-rocwmma -- /usr/local/bin/llama-bench"
[rocm-7.9]="toolbox run -c llama-rocm-7.9 -- /usr/local/bin/llama-bench"
[rocm-7.9-rocwmma]="toolbox run -c llama-rocm-7.9-rocwmma -- /usr/local/bin/llama-bench"
[vulkan_amdvlk]="toolbox run -c llama-vulkan-amdvlk -- /usr/sbin/llama-bench"
[vulkan_radv]="toolbox run -c llama-vulkan-radv -- /usr/sbin/llama-bench"
)
@@ -50,6 +49,15 @@ get_hblt_modes() {
for MODEL_PATH in "${MODEL_PATHS[@]}"; do
MODEL_NAME="$(basename "$MODEL_PATH" .gguf)"
MODEL_SIZE=$(stat -c%s "$MODEL_PATH")
# Threshold: 30 GiB = 32212254720 bytes. Using 32000000000 as a safe cutoff.
if (( MODEL_SIZE > 32000000000 )); then
GPU_DEVICES="0,1"
GPU_SUFFIX="__dual"
else
GPU_DEVICES="0"
GPU_SUFFIX="__single"
fi
for ENV in "${!CMDS[@]}"; do
CMD="${CMDS[$ENV]}"
@@ -62,9 +70,9 @@ for MODEL_PATH in "${MODEL_PATHS[@]}"; do
if [[ "$ENV" == rocm* ]]; then
if [[ "$MODE" == off ]]; then
BASE_SUFFIX="__hblt0"
CMD_EFFECTIVE="${CMD_EFFECTIVE/-- /-- env ROCBLAS_USE_HIPBLASLT=0 }"
CMD_EFFECTIVE="${CMD_EFFECTIVE/-- /-- env HIP_VISIBLE_DEVICES=$GPU_DEVICES env ROCBLAS_USE_HIPBLASLT=0 }"
else
CMD_EFFECTIVE="${CMD_EFFECTIVE/-- /-- env ROCBLAS_USE_HIPBLASLT=1 }"
CMD_EFFECTIVE="${CMD_EFFECTIVE/-- /-- env HIP_VISIBLE_DEVICES=$GPU_DEVICES env ROCBLAS_USE_HIPBLASLT=1 }"
fi
fi
@@ -90,7 +98,7 @@ for MODEL_PATH in "${MODEL_PATHS[@]}"; do
fi
fi
OUT="$RESULTDIR/${MODEL_NAME}__${ENV}${SUFFIX}${CTX_SUFFIX}.log"
OUT="$RESULTDIR/${MODEL_NAME}__${ENV}${SUFFIX}${CTX_SUFFIX}${GPU_SUFFIX}.log"
CTX_REPS=3
if [[ "$CTX" == longctx32768 ]]; then
CTX_REPS=1
+15 -15
View File
@@ -57,9 +57,9 @@ function cacheUI() {
hipblasModalOpen: document.getElementById("hipblas-modal-open"),
hipblasModal: document.getElementById("hipblas-modal"),
hipblasModalClose: document.getElementById("hipblas-modal-close"),
rpcModalOpen: document.getElementById("rpc-modal-open"),
rpcModal: document.getElementById("rpc-modal"),
rpcModalClose: document.getElementById("rpc-modal-close"),
dualModalOpen: document.getElementById("dual-modal-open"),
dualModal: document.getElementById("dual-modal"),
dualModalClose: document.getElementById("dual-modal-close"),
rocwmmaModalOpen: document.getElementById("rocwmma-modal-open"),
rocwmmaModal: document.getElementById("rocwmma-modal"),
rocwmmaModalClose: document.getElementById("rocwmma-modal-close"),
@@ -77,9 +77,9 @@ function setupModals() {
close: state.ui.hipblasModalClose,
},
{
open: state.ui.rpcModalOpen,
modal: state.ui.rpcModal,
close: state.ui.rpcModalClose,
open: state.ui.dualModalOpen,
modal: state.ui.dualModal,
close: state.ui.dualModalClose,
},
{
open: state.ui.rocwmmaModalOpen,
@@ -186,7 +186,7 @@ function ensureModel(testEntry, modelName, run) {
quant: (run.quant || "Unknown").toUpperCase(),
sizeB: run.name_params_b ?? run.params_b ?? null,
backends: {},
isRpc: Boolean(run.rpc),
isDual: run.gpu_config === "dual",
search_blob: [modelName, run.quant, run.env, run.test]
.filter(Boolean)
.map((s) => s.toString().toLowerCase())
@@ -202,10 +202,10 @@ function ensureModel(testEntry, modelName, run) {
state.sizeStats.min = Math.min(state.sizeStats.min, row.sizeB);
state.sizeStats.max = Math.max(state.sizeStats.max, row.sizeB);
}
if (run.rpc) {
row.isRpc = true;
if (!row.search_blob.includes("rpc")) {
row.search_blob = `${row.search_blob} rpc`;
if (run.gpu_config === "dual") {
row.isDual = true;
if (!row.search_blob.includes("dual")) {
row.search_blob = `${row.search_blob} dual`;
}
}
return row;
@@ -462,11 +462,11 @@ function buildSingleTable(models, backendList) {
nameSpan.className = "model-name";
nameSpan.textContent = model.model;
head.appendChild(nameSpan);
if (model.isRpc) {
if (model.isDual) {
const pill = document.createElement("span");
pill.className = "model-pill model-pill-rpc";
pill.title = "Run executed via llama.cpp RPC across two servers";
pill.textContent = "RPC · dual server";
pill.className = "model-pill model-pill-dual";
pill.title = "Run executed on Dual GPU (2x R9700)";
pill.textContent = "Dual GPU";
head.appendChild(pill);
}
tdModel.appendChild(head);
+9 -13
View File
@@ -21,8 +21,8 @@
<button id="hipblas-modal-open" type="button" class="chip small legend-pill legend-pill-default">
hipBLASLt vs hblt0
</button>
<button id="rpc-modal-open" type="button" class="chip small legend-pill legend-pill-rpc">
RPC · dual server
<button id="dual-modal-open" type="button" class="chip small legend-pill legend-pill-dual">
Dual GPU
</button>
<button id="rocwmma-modal-open" type="button" class="chip small legend-pill legend-pill-rocwmma">
rocWMMA
@@ -103,18 +103,14 @@
</div>
</div>
<div id="rpc-modal" class="modal hidden" role="dialog" aria-modal="true" aria-labelledby="rpc-title">
<div id="dual-modal" class="modal hidden" role="dialog" aria-modal="true" aria-labelledby="dual-title">
<div class="modal-content">
<button id="rpc-modal-close" class="modal-close" aria-label="Close dialog">×</button>
<h2 id="rpc-title">RPC · dual server</h2>
<p>These results were produced with two R9700 systems (each 32&nbsp;GB)
connected over 5&nbsp;Gbps Ethernet. One runs <code>rpc-server</code> from llama.cpp; the other runs
<code>llama-bench --rpc</code>.
</p>
<p>This setup allows distributed inference, splitting large GGUF models across both machines. The metric
shows what
you can expect when latency is limited by the network and the workload is balanced between two RPC
participants.</p>
<button id="dual-modal-close" class="modal-close" aria-label="Close dialog">×</button>
<h2 id="dual-title">Dual GPU (2x R9700)</h2>
<p>These results were produced using two AMD Radeon AI PRO R9700 GPUs (32GB each, 64GB total).</p>
<p>Models larger than ~30GB are automatically distributed across both GPUs using
<code>HIP_VISIBLE_DEVICES=0,1</code>. Smaller models run on a single GPU
(<code>HIP_VISIBLE_DEVICES=0</code>).</p>
</div>
</div>