text paste
# lab02_calculator.py —— H3与Qwen3.8 128B 显存及方案性价比计算器

def calc_model_size(param_billion, bits):
    """计算模型权重体积 (GB)"""
    return (param_billion * 1e9 * bits) / 8 / (1024**3)

def calc_kv_cache(context_len, batch_size=1):
    """粗略估算KV Cache占用 (GB),按经验值折算"""
    # 假设 32K 上下文单请求约 1GB,按比例和并发数放大
    base_32k_gb = 1.0
    return (context_len / 32768) * base_32k_gb * batch_size

def calc_value(price_wan, speed_tok_s):
    """计算性价比 (tok/s/万元)"""
    return speed_tok_s / price_wan

if __name__ == '__main__':
    print("=== 1. 模型体积与显存需求推导 ===")
    params = 128 # 128B
    size_int4 = calc_model_size(params, 4)
    size_int8 = calc_model_size(params, 8)
    size_fp16 = calc_model_size(params, 16)
    
    print(f"128B 模型体积:")
    print(f"  INT4: {size_int4:.1f} GB")
    print(f"  INT8: {size_int8:.1f} GB")
    print(f"  FP16: {size_fp16:.1f} GB")
    
    kv_cache = calc_kv_cache(context_len=32768, batch_size=4)
    h3_size = 12.0
    print(f"\nKV Cache (32K上下文, 4并发): 约 {kv_cache:.1f} GB")
    print(f"MiniMax H3 (pruned INT8): {h3_size:.1f} GB")
    
    print("\n=== 2. 三方案性价比对比 ===")
    # 方案数据: (名称, 显存+内存, 出词速度, H3耗时, 总价, 性价比)
    plans = [
        {"name": "主推: 5090 32G + 128G DDR5", "speed": 20, "price": 8.54},
        {"name": "对照A: 128G 统一内存", "speed": 10, "price": 2.50},
        {"name": "对照B: 双卡 64G 工作站", "speed": 48, "price": 14.00}
    ]
    
    for p in plans:
        cpb = calc_value(p["price"], p["speed"])
        print(f"{p['name']}:")
        print(f"  价格: {p['price']} 万元 | 出词: {p['speed']} tok/s")
        print(f"  性价比: {cpb:.2f} tok/s/万元\n")

    print("=== 3. 预算分配核对 ===")
    total_budget = 8.54
    gpu_price = 5.24
    mem_price = 2.20
    print(f"总预算: {total_budget} 万")
    print(f"GPU占比: {(gpu_price/total_budget)*100:.1f}% (目标55-60%)")
    print(f"内存占比: {(mem_price/total_budget)*100:.1f}% (目标10%,因近期内存暴涨偏高)")