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");
}