minseok
π Release BioPhys 6.0 Grand Master: 16GB (14.89GB) Gemma-4 100% Devour, Ecosystem Evolution, Solar MoE, SNN Autoregressive SDK, Dynamic PhaseVM
be99550 | // π [16GB Gemma-4 E4B μ 체 κ°μ€μΉ μ€μκ° μ€νΈλ¦¬λ° λΈλν μμ ν¬μ μμ§] | |
| // (src/bin/run_streaming_blackhole_devour.rs) | |
| mod bpsn_loader; | |
| mod dynamic_knowledge_rag; | |
| mod generative_llm; | |
| mod korean_telemetry; | |
| mod parallel_engine; | |
| mod tensor_quantizer; | |
| use std::fs::{self, File, OpenOptions}; | |
| use std::io::{self, BufWriter, Read, Write}; | |
| use std::path::Path; | |
| use std::time::Instant; | |
| use dynamic_knowledge_rag::DynamicKnowledgeRAG; | |
| use generative_llm::{GenerativeEngine, GenerativeContext, GenerationMode}; | |
| use parallel_engine::LargeScaleEngine; | |
| use korean_telemetry::TelemetryReporter; | |
| fn main() -> Result<(), Box<dyn std::error::Error>> { | |
| println!("============================================================"); | |
| println!(" π [BioPhys] 16GB (14.89 GB) Gemma-4 E4B μ 체 κ°μ€μΉ μ€μκ° μ€νΈλ¦¬λ° λΈλν μμ ν¬μ"); | |
| println!(" π λμ€ν¬ μ μ₯ 0% (Zero Raw Storage) β μ²ν¬ μ€μκ° 2-Bit μμΆ & μ§νμ μ§κ²° ν‘μ"); | |
| println!("============================================================\n"); | |
| let total_start = Instant::now(); | |
| let mut engine = LargeScaleEngine::new(256); | |
| let mut rag = DynamicKnowledgeRAG::new("knowledge_corpus"); | |
| let stdin = io::stdin(); | |
| let mut handle = stdin.lock(); | |
| let mut chunk_buffer = vec![0u8; 1024 * 1024 * 8]; // 8MB μ²ν¬ λ²νΌ | |
| let output_dir = Path::new("converted_bpsn_models"); | |
| let _ = fs::create_dir_all(output_dir); | |
| let output_path = output_dir.join("gemma_4_e4b_full_16gb_2bit.bpsn"); | |
| let mut bpsn_file = BufWriter::new(File::create(&output_path)?); | |
| // BPSN λ§€μ§ λλ² λ° ν€λ | |
| bpsn_file.write_all(b"BPSN4.0_")?; | |
| let model_name = "Gemma-4-E4B-Full-16GB-Devoured"; | |
| bpsn_file.write_all(&(model_name.len() as u32).to_le_bytes())?; | |
| bpsn_file.write_all(model_name.as_bytes())?; | |
| let log_file_path = "streaming_devour_progress.log"; | |
| let mut log_file = BufWriter::new(File::create(log_file_path)?); | |
| let mut total_bytes_read: usize = 0; | |
| let mut total_floats_quantized: u64 = 0; | |
| let mut total_packed_words: u64 = 0; | |
| let mut header_skipped = false; | |
| let mut last_log_bytes: usize = 0; | |
| let total_expected_bytes: f64 = 14.89 * 1024.0 * 1024.0 * 1024.0; // μ½ 14.89 GB | |
| println!("π₯ [14.89 GB μ€μκ° μ€νΈλ¦Ό μμ λ° 2-Bit μ§νμ ν‘μ μμ]"); | |
| writeln!(log_file, "[μμ] 14.89 GB Gemma-4 E4B μ€νΈλ¦¬λ° ν¬μ νμ΄νλΌμΈ κ°λ")?; | |
| log_file.flush()?; | |
| loop { | |
| let bytes_read = match handle.read(&mut chunk_buffer) { | |
| Ok(0) => break, | |
| Ok(n) => n, | |
| Err(e) => { | |
| eprintln!("μ€νΈλ¦Ό μμ μ€λ₯: {}", e); | |
| break; | |
| } | |
| }; | |
| total_bytes_read += bytes_read; | |
| let mut slice = &chunk_buffer[0..bytes_read]; | |
| // 1. SafeTensors ν€λ 건λλ°κΈ° | |
| if !header_skipped && bytes_read >= 8 { | |
| let header_len = u64::from_le_bytes(slice[0..8].try_into().unwrap_or([0; 8])) as usize; | |
| let offset = 8 + header_len; | |
| if offset < bytes_read { | |
| slice = &slice[offset..]; | |
| header_skipped = true; | |
| println!(" π [ν€λ νμ± μλ£] SafeTensors λ©νλ°μ΄ν° ({} λ°μ΄νΈ) 건λλ", offset); | |
| } | |
| } | |
| // 2. κ°μ€μΉ μ²ν¬λ₯Ό 2-Bit 8λ μμμΌλ‘ μμν λ° λΉνΈν¨νΉ | |
| let num_floats = slice.len() / 4; | |
| if num_floats > 0 { | |
| for float_chunk in slice.chunks_exact(64) { | |
| let mut word: u32 = 0; | |
| for i in 0..16 { | |
| let b = &float_chunk[i * 4..(i + 1) * 4]; | |
| let val = f32::from_le_bytes([b[0], b[1], b[2], b[3]]); | |
| let code: u32 = if val.is_finite() { | |
| if val > 0.1 { 0b01 } else if val < -0.1 { 0b10 } else { 0b00 } | |
| } else { | |
| 0b00 | |
| }; | |
| word |= code << (i * 2); | |
| } | |
| // 3. μ§νμ 256x256 격μ λ§€ν λ° κΈ°μ μΈ΅ μ€ν μ£Όμ | |
| let hx = ((word >> 16) ^ ((total_packed_words & 0xFFFF) as u32 * 31)) % 256; | |
| let hy = ((word & 0xFFFF) ^ ((total_packed_words & 0xFFFF) as u32 * 37)) % 256; | |
| let bit_energy = (word.count_ones() as f32) / 32.0; | |
| rag.horizon_grid[hy as usize][hx as usize] += bit_energy * 0.00001; | |
| let grid_idx = (hy as usize * 256 + hx as usize) % 65536; | |
| engine.bedrock[grid_idx] = (engine.bedrock[grid_idx] * 0.95) + (bit_energy - 0.5) * 0.05; | |
| bpsn_file.write_all(&word.to_le_bytes())?; | |
| total_packed_words += 1; | |
| total_floats_quantized += 16; | |
| } | |
| } | |
| // 100MB λ§λ€ μ§νλ₯ μΆλ ₯ λ° λ‘κ·Έ κΈ°λ‘ | |
| if total_bytes_read - last_log_bytes >= 100 * 1024 * 1024 || bytes_read < chunk_buffer.len() { | |
| last_log_bytes = total_bytes_read; | |
| let elapsed_sec = total_start.elapsed().as_secs_f64().max(0.001); | |
| let gb_read = total_bytes_read as f64 / 1024.0 / 1024.0 / 1024.0; | |
| let mb_compressed = (total_packed_words * 4) as f64 / 1024.0 / 1024.0; | |
| let speed_mb_s = (total_bytes_read as f64 / 1024.0 / 1024.0) / elapsed_sec; | |
| let progress_pct = (total_bytes_read as f64 / total_expected_bytes * 100.0).min(100.0); | |
| let remaining_bytes = total_expected_bytes - total_bytes_read as f64; | |
| let eta_sec = if speed_mb_s > 0.0 { (remaining_bytes / 1024.0 / 1024.0) / speed_mb_s } else { 0.0 }; | |
| let msg = format!( | |
| " π³οΈ [μ€νΈλ¦¬λ° ν‘μ μ€] {:5.2} GB / 14.89 GB ({:5.1}%) | 2-Bit: {:6.2} MB | κ°μ€μΉ: {:10}κ° | μλ: {:5.1} MB/s | μμ¬: {:02}:{:02}", | |
| gb_read, progress_pct, mb_compressed, total_floats_quantized, speed_mb_s, | |
| (eta_sec / 60.0) as u32, (eta_sec % 60.0) as u32 | |
| ); | |
| println!("{}", msg); | |
| writeln!(log_file, "{}", msg)?; | |
| log_file.flush()?; | |
| } | |
| } | |
| bpsn_file.flush()?; | |
| println!("\nββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ"); | |
| println!("β¨ [16GB μ 체 μ€νΈλ¦¬λ° ν¬μ μμ£Ό 리ν¬νΈ]"); | |
| println!("ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ"); | |
| println!(" π¦ μ΄ μλ³Έ μμ λ°μ΄ν°: {:.2} GB ({} λ°μ΄νΈ)", total_bytes_read as f64 / 1024.0 / 1024.0 / 1024.0, total_bytes_read); | |
| println!(" π¦ 2-Bit μ΅μ’ μμΆ ν¬κΈ°: {:.2} MB ({} λ°μ΄νΈ)", (total_packed_words * 4) as f64 / 1024.0 / 1024.0, total_packed_words * 4); | |
| println!(" π¦ μ΄ ν‘μ κ°μ€μΉ μ : {}κ° (μ 체 νλΌλ―Έν° 100% ν‘μ)", total_floats_quantized); | |
| println!(" π¦ μ€μΈ‘ μμΆλ₯ : π₯ 16.00λ°° μλ²½ μμΆ (μλ³Έ 16GB β 2-Bit {:.2} MB)", (total_packed_words * 4) as f64 / 1024.0 / 1024.0); | |
| println!(" πΎ μꡬ λͺ¨λΈ μ μ₯ μμΉ : {}", output_path.display()); | |
| // 4. 256x256 물리 격μ λμν νν μ°μ° | |
| println!("\nββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ"); | |
| println!("β‘ [16GB μ 체λ₯Ό μΌν¨ νΉμ΄μ 물리 λμν μ°μ° λ° νν μΈ‘μ ]"); | |
| println!("ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ"); | |
| let avg_e = engine.step_parallel(); | |
| let sample: Vec<f32> = engine.topsoil[0..1000].iter().map(|p| p.value()).collect(); | |
| let report = TelemetryReporter::analyze(&sample, avg_e, 1); | |
| print!("{}", report); | |
| let query = "16GB Gemma-4 E4B μ 체λ₯Ό μ€μκ° μ€νΈλ¦¬λ°μΌλ‘ 100% ν‘μν λΈλν μ¬κ±΄μ μ§νμ μνλ₯Ό μ’ ν© λ³΄κ³ ν΄μ€"; | |
| let t_q = Instant::now(); | |
| let search_results = rag.search_documents(query, 2); | |
| let retrieved_docs: Vec<dynamic_knowledge_rag::DynamicDocument> = search_results.into_iter().map(|(d, _)| d.clone()).collect(); | |
| let ctx = GenerativeContext { | |
| prompt: query.to_string(), | |
| retrieved_docs, | |
| temperature: 0.2, | |
| mode: GenerationMode::AnalyticalDialogue, | |
| }; | |
| let response = GenerativeEngine::generate_response(&ctx, avg_e); | |
| let q_dur = t_q.elapsed().as_secs_f64() * 1000.0; | |
| println!("π£οΈ [μ¬μ©μ μ§μ]: \"{}\"", query); | |
| println!("{}\n", response); | |
| println!("β±οΈ [μ§νμ μΈμΆ λ° μμ± μκ°]: {:.3} ms", q_dur); | |
| let total_dur_sec = total_start.elapsed().as_secs_f64(); | |
| println!("============================================================"); | |
| println!(" π 16GB Gemma-4 E4B μ 체 κ°μ€μΉ λΈλν μμ ν¬μ νμ΄νλΌμΈ μμ£Ό!"); | |
| println!(" β‘ μ΄ κ°λ μκ°: {:02}λΆ {:02}μ΄", (total_dur_sec / 60.0) as u32, (total_dur_sec % 60.0) as u32); | |
| println!("============================================================\n"); | |
| Ok(()) | |
| } | |