File size: 3,207 Bytes
be99550 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | // π [κ±°λ ν
μ 2-Bit μμ μμΆ λ° μ΄κ³ μ GEMV μ€μΈ‘ λ¬λ] (src/bin/run_full_tensor_compression.rs)
#[path="../tensor_quantizer.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");
}
|