feat(report): update extrapolation parameters and scoring in README
- revise hardware prices and parameters in extrapolate.py - enhance scoring details in README for task 11 - clarify projected scoreboard values and sources - improve chart readability and scoring methodology in report.py - add new utility functions for formatting and reading hardware prices
This commit is contained in:
@@ -79,15 +79,29 @@ LAWS = {
|
||||
("csv", 7): "scan", ("json", 7): "scan", ("sqlite", 7): "scan", ("pg", 7): "scan_parallel", ("rdf", 7): "scan",
|
||||
}
|
||||
|
||||
HW_PRICES_DEFAULT = """# Hardware cost parameters for extrapolation (task 10) - June 2026 defaults.
|
||||
HW_PRICES_DEFAULT = """# Hardware cost parameters for extrapolation (task 10).
|
||||
# Street prices retrieved 2026-07-11 from the sources below (server DRAM is
|
||||
# in a documented 2025-2026 price surge - see market_context). The cost
|
||||
# model buys whole components: 64 GB RDIMM modules and 7.68 TB NVMe drives.
|
||||
# Operator-editable; re-run extrapolate.py after changes (code-config-yaml).
|
||||
ram_usd_per_gb: 14.0
|
||||
nvme_usd_per_tb: 250.0
|
||||
server_16_core_usd: 6000.0
|
||||
server_32_core_usd: 10000.0
|
||||
extra_node_usd: 6000.0
|
||||
as_of: "2026-07-11"
|
||||
ram_module_gb: 64
|
||||
ram_module_usd: 1887.0 # A-Tech 64GB (2x32GB) DDR5-5600 ECC RDIMM
|
||||
nvme_drive_tb: 7.68
|
||||
nvme_drive_usd: 3995.0 # Cloud Ninjas NEW 7.68TB NVMe U.2 1DWPD (Dell 14-16G)
|
||||
server_16_core_usd: 4618.0 # Supermicro AS-1015CS-TNR 1U (EPYC 9004/9005), Broadberry starting config
|
||||
server_32_core_usd: 6272.0 # Supermicro AS-1115CS-TNR 1U, Broadberry starting config
|
||||
extra_node_usd: 4618.0 # one additional entry 1U node (AS-1015CS-TNR chassis)
|
||||
sources:
|
||||
ram: https://atechmemory.com/collections/ddr5-memory-ram
|
||||
nvme: https://cloudninjas.com/products/new-7-68tb-nvme-u-2-1dwpd-sie-2-5-enterprise-solid-state-drive-for-14th-15th-16th-gen-dell
|
||||
servers: https://www.broadberry.com/amd-epyc-9004-supermicro-servers
|
||||
market_context: https://www.techpowerup.com/342331/server-dram-pricing-jumps-50-only-70-of-orders-getting-filled
|
||||
"""
|
||||
HW_PRICE_KEYS = ("ram_usd_per_gb", "nvme_usd_per_tb", "server_16_core_usd", "server_32_core_usd", "extra_node_usd")
|
||||
HW_PRICE_KEYS = (
|
||||
"as_of", "ram_module_gb", "ram_module_usd", "nvme_drive_tb", "nvme_drive_usd",
|
||||
"server_16_core_usd", "server_32_core_usd", "extra_node_usd", "sources",
|
||||
)
|
||||
|
||||
|
||||
def read_medians(path: Path) -> dict[tuple[str, int], float]:
|
||||
@@ -222,7 +236,8 @@ def main() -> int:
|
||||
|
||||
with open(bench_dir / "hardware_sizing.csv", "w", encoding="ascii", newline="") as fh:
|
||||
writer = csv.writer(fh)
|
||||
writer.writerow(["format", "scale_gb", "disk_tb", "ram_gb", "cores", "nodes", "est_cost_usd"])
|
||||
writer.writerow(["format", "scale_gb", "disk_tb", "ram_gb", "cores", "nodes",
|
||||
"est_cost_usd", "ram_modules", "nvme_drives", "base_usd", "ram_usd", "disk_usd", "extra_nodes_usd"])
|
||||
for scale_gb in SCALES_GB:
|
||||
r = scale_gb * 1e9 / csv_bytes
|
||||
for fmt in FORMATS:
|
||||
@@ -238,11 +253,17 @@ def main() -> int:
|
||||
ram_gb = max(MIN_RAM_GB, RDF_HOT_FRACTION * fmt_bytes / 1e9)
|
||||
cores = pick_pg_cores(medians, overhead, r, n0) if fmt == "pg" else CORE_OPTIONS[0]
|
||||
nodes = max(1, math.ceil(ram_gb / NODE_RAM_CEILING_GB))
|
||||
server_usd = prices["server_16_core_usd"] if cores == 16 else prices["server_32_core_usd"]
|
||||
cost = (server_usd + ram_gb * prices["ram_usd_per_gb"]
|
||||
+ disk_tb * prices["nvme_usd_per_tb"]
|
||||
+ (nodes - 1) * prices["extra_node_usd"])
|
||||
writer.writerow([fmt, scale_gb, round(disk_tb, 3), round(ram_gb, 1), cores, nodes, round(cost)])
|
||||
# bill of materials: whole RDIMM modules and whole NVMe drives
|
||||
ram_modules = math.ceil(ram_gb / prices["ram_module_gb"])
|
||||
nvme_drives = math.ceil(disk_tb / prices["nvme_drive_tb"])
|
||||
base_usd = prices["server_16_core_usd"] if cores == 16 else prices["server_32_core_usd"]
|
||||
ram_usd = ram_modules * prices["ram_module_usd"]
|
||||
disk_usd = nvme_drives * prices["nvme_drive_usd"]
|
||||
extra_nodes_usd = (nodes - 1) * prices["extra_node_usd"]
|
||||
cost = base_usd + ram_usd + disk_usd + extra_nodes_usd
|
||||
writer.writerow([fmt, scale_gb, round(disk_tb, 3), round(ram_gb, 1), cores, nodes,
|
||||
round(cost), ram_modules, nvme_drives,
|
||||
round(base_usd), round(ram_usd), round(disk_usd), round(extra_nodes_usd)])
|
||||
|
||||
entries = {
|
||||
"extrapolation_rows": len(SCALES_GB) * len(FORMATS) * len(QUERY_NUMBERS),
|
||||
@@ -252,6 +273,7 @@ def main() -> int:
|
||||
"flags_fail": flags["FAIL"],
|
||||
"pg_index_share": round(index_share, 3),
|
||||
"pg_index_mb": round(pg_index_bytes / 1048576, 1),
|
||||
"prices_as_of": prices["as_of"],
|
||||
"note_pandas": "pandas CSV variant not measured; its RAM is O(n) - infeasible above ~10 GB (spec 10)",
|
||||
}
|
||||
for fmt in FORMATS:
|
||||
|
||||
Reference in New Issue
Block a user