minseok
π Release BioPhys 6.0 Grand Master: 16GB (14.89GB) Gemma-4 100% Devour, Ecosystem Evolution, Solar MoE, SNN Autoregressive SDK, Dynamic PhaseVM
be99550 | // π [κ±°λ ν μ 2-Bit μμ μμΆ λ° μ΄κ³ μ GEMV μ€μΈ‘ λ¬λ] (src/bin/run_full_tensor_compression.rs) | |
| mod tensor_quantizer; | |
| use std::time::Instant; | |
| use tensor_quantizer::QuantizedTensor2Bit; | |
| fn main() { | |
| println!("============================================================"); | |
| println!(" π¬ [BioPhys] νΈλμ€ν¬λ¨Έ κ±°λ ν μ 2-Bit μμ μμν & GEMV μ€μΈ‘"); | |
| println!("============================================================\n"); | |
| // 1. λκ·λͺ¨ κ°μ€μΉ ν μ μμ± (μ: Gemma 4 Layer MLP ν μ: 2048 x 4096 = 8,388,608κ° νλΌλ―Έν°) | |
| let rows = 2048; | |
| let cols = 4096; | |
| let num_elements = rows * cols; | |
| println!("π¦ [κ°μ€μΉ ν μ μ€ν]"); | |
| println!(" ββ νλ ¬ ν¬κΈ°: {} Γ {} (μ΄ {}κ° νλΌλ―Έν°)", rows, cols, num_elements); | |
| println!(" ββ μλ³Έ FP32 ν¬κΈ°: {:.2} MB\n", (num_elements * 4) as f32 / 1024.0 / 1024.0); | |
| // κ°μ κ°μ€μΉ λ° μ λ ₯ λ²‘ν° μμ± | |
| let mut raw_fp32 = Vec::with_capacity(num_elements); | |
| for i in 0..num_elements { | |
| let val = ((i % 100) as f32 - 50.0) / 50.0; | |
| raw_fp32.push(val); | |
| } | |
| let input_vector: Vec<f32> = (0..cols).map(|i| (i % 10) as f32 * 0.1).collect(); | |
| // 2. 2-Bit μμν λ° λΉνΈν¨νΉ μμΆ μ€ν | |
| println!("βοΈ [2-Bit μμν λ° λΉνΈν¨νΉ μμΆ μμ]..."); | |
| let t_quant = Instant::now(); | |
| let quantized_tensor = QuantizedTensor2Bit::quantize(&raw_fp32, rows, cols); | |
| let quant_dur = t_quant.elapsed().as_secs_f64() * 1000.0; | |
| println!("β [μμΆ μλ£ κ²°κ³Ό]"); | |
| println!(" ββ μλ³Έ μ©λ : {:.2} MB ({} λ°μ΄νΈ)", quantized_tensor.original_bytes as f32 / 1024.0 / 1024.0, quantized_tensor.original_bytes); | |
| println!(" ββ 2-Bit μ©λ : {:.2} MB ({} λ°μ΄νΈ)", quantized_tensor.compressed_bytes as f32 / 1024.0 / 1024.0, quantized_tensor.compressed_bytes); | |
| println!(" ββ μμΆ λΉμ¨ : π₯ {:.2}λ°° μμΆ (μ©λ 93.7% μ κ°!)", quantized_tensor.compression_ratio()); | |
| println!(" ββ μμΆ μμμκ°: {:.3} ms\n", quant_dur); | |
| // 3. 2-Bit λΉνΈ μ°μ° κΈ°λ° μ΄κ³ μ GEMV μΆλ‘ μ€ν | |
| println!("β‘ [2-Bit λΉνΈν¨νΉ GEMV νλ ¬ κ³±μ μΆλ‘ 100ν μ°μ μ€μΈ‘ μ€]..."); | |
| let iterations = 100; | |
| let t_gemv = Instant::now(); | |
| let mut last_output = Vec::new(); | |
| for _ in 0..iterations { | |
| last_output = quantized_tensor.matvec_mul(&input_vector); | |
| } | |
| let gemv_total_dur = t_gemv.elapsed().as_secs_f64() * 1000.0; | |
| let avg_gemv_ms = gemv_total_dur / iterations as f64; | |
| println!("β [GEMV μΆλ‘ μ€μΈ‘ κ²°κ³Ό]"); | |
| println!(" ββ 1ν μ°μ° μ§μ°μκ° : {:.3} ms", avg_gemv_ms); | |
| println!(" ββ μ΄λΉ ν μ μ°μ° νμ: {:.0} ν/μ΄", 1000.0 / avg_gemv_ms); | |
| println!(" ββ μΆλ ₯ λ²‘ν° μν[0..5]: {:?}", &last_output[0..5]); | |
| println!("\n============================================================"); | |
| println!(" π λκ·λͺ¨ κ°μ€μΉ 2-Bit μμ μμΆ λ° λ€μ΄ν°λΈ GEMV νμ΄νλΌμΈ κ²μ¦ μ±κ³΅!"); | |
| println!("============================================================\n"); | |
| } | |