CoolFace
Modelpublic

cwenzi/neuroflow-cpp

sourceHugging Faceapache-2.0updated 2mo agoView on Hugging Face
1likes
test_model.cpp290 linesDownload Raw Back to tests
1/**2 * NeuroFlow Core Tests - Model Tests3 */4 5#include <iostream>6#include <cassert>7#include <cmath>8#include <chrono>9#include "../include/neuroflow/model.hpp"10#include "../include/neuroflow/memory.hpp"11 12using namespace neuroflow;13 14void test_model_creation() {15    std::cout << "Testing model creation..." << std::endl;16    17    NeuroFlowModel::Config cfg;18    cfg.input_dim = 512;19    cfg.hidden_dim = 256;20    cfg.output_dim = 10;21    22    NeuroFlowModel model(cfg);23    24    auto stats = model.get_stats();25    std::cout << "  Total params: " << stats.total_params << std::endl;26    std::cout << "  Memory (MB): " << stats.memory_bytes / 1024.0 / 1024.0 << std::endl;27    28    assert(stats.total_params > 0);29    30    std::cout << "  PASSED: model creation" << std::endl;31}32 33void test_forward_pass() {34    std::cout << "Testing forward pass..." << std::endl;35    36    NeuroFlowModel::Config cfg;37    cfg.input_dim = 128;38    cfg.hidden_dim = 64;39    cfg.output_dim = 5;40    cfg.memory_slots = 16;41    cfg.memory_dim = 32;42    cfg.num_layers = 1;43    cfg.num_associations = 4;44    45    NeuroFlowModel model(cfg);46    47    // 创建输入48    Tensor input({2, cfg.input_dim});49    float* data = input.as_fp32();50    for (size_t i = 0; i < input.numel(); ++i) {51        data[i] = static_cast<float>(std::rand()) / RAND_MAX;52    }53    54    // 前向传播55    auto output = model.forward(input, nullptr, false, false);56    57    assert(output.output.shape_[0] == 2);58    assert(output.output.shape_[1] == cfg.output_dim);59    assert(output.decision.shape_[1] == cfg.output_dim);60    assert(output.value.shape_[1] == 1);61    62    std::cout << "  Output shape: [" << output.output.shape_[0] << ", " << output.output.shape_[1] << "]" << std::endl;63    std::cout << "  PASSED: forward pass" << std::endl;64}65 66void test_forward_with_manifold() {67    std::cout << "Testing forward with manifold..." << std::endl;68    69    NeuroFlowModel::Config cfg;70    cfg.input_dim = 128;71    cfg.hidden_dim = 64;72    cfg.output_dim = 5;73    74    NeuroFlowModel model(cfg);75    76    Tensor input({1, cfg.input_dim});77    auto output = model.forward(input, nullptr, false, true);78    79    assert(output.manifold.shape_[0] == 1);80    assert(output.manifold.shape_[1] == 32);81    82    std::cout << "  Manifold shape: [" << output.manifold.shape_[0] << ", " << output.manifold.shape_[1] << "]" << std::endl;83    std::cout << "  PASSED: forward with manifold" << std::endl;84}85 86void test_manifold_trajectory() {87    std::cout << "Testing manifold trajectory..." << std::endl;88    89    NeuroFlowModel::Config cfg;90    cfg.input_dim = 128;91    cfg.hidden_dim = 64;92    cfg.output_dim = 5;93    94    NeuroFlowModel model(cfg);95    96    Tensor input({1, cfg.input_dim});97    auto trajectory = model.get_manifold_trajectory(input, 5);98    99    assert(trajectory.size() == 5);100    for (auto& t : trajectory) {101        assert(t.shape_[0] == 1);102        assert(t.shape_[1] == 32);103    }104    105    std::cout << "  Trajectory length: " << trajectory.size() << std::endl;106    std::cout << "  PASSED: manifold trajectory" << std::endl;107}108 109void test_memory_module() {110    std::cout << "Testing memory module..." << std::endl;111    112    MemoryConsolidationModule memory(64, 16, 32);113    114    // 编码115    Tensor input({2, 64});116    float* data = input.as_fp32();117    for (size_t i = 0; i < input.numel(); ++i) {118        data[i] = static_cast<float>(std::rand()) / RAND_MAX;119    }120    121    Tensor encoded = memory.encode(input);122    assert(encoded.shape_[1] == 32);123    124    // 检索125    auto result = memory.retrieve(input);126    assert(result.retrieved.shape_[1] == 64);127    assert(result.attention.shape_[1] == 16);128    129    std::cout << "  Memory slots: " << memory.memory_slots << std::endl;130    std::cout << "  PASSED: memory module" << std::endl;131}132 133void test_memory_consolidation() {134    std::cout << "Testing memory consolidation..." << std::endl;135    136    MemoryConsolidationModule memory(64, 16, 32, 0.1f);137    138    // 多次巩固139    for (int i = 0; i < 5; ++i) {140        Tensor input({1, 64});141        float* data = input.as_fp32();142        for (size_t j = 0; j < input.numel(); ++j) {143            data[j] = static_cast<float>(std::rand()) / RAND_MAX;144        }145        memory.consolidate(input);146    }147    148    std::cout << "  PASSED: memory consolidation" << std::endl;149}150 151void test_mla_cache() {152    std::cout << "Testing MLA (Latent KV Cache)..." << std::endl;153    154    LatentKVCache mla(64, 4, 16, 128);  // model_dim=64, heads=4, latent=16155    156    // 第一次前向157    Tensor input({1, 64});158    float* data = input.as_fp32();159    for (size_t i = 0; i < input.numel(); ++i) {160        data[i] = static_cast<float>(std::rand()) / RAND_MAX;161    }162    163    Tensor output1 = mla.forward(input, true);164    size_t cache1 = mla.cache_len;165    166    // 第二次前向 (cache应该增长)167    Tensor input2({1, 64});168    Tensor output2 = mla.forward(input2, true);169    size_t cache2 = mla.cache_len;170    171    assert(cache2 >= cache1);172    173    // 检查内存节省比例174    float saving = mla.memory_saving_ratio();175    std::cout << "  MLA memory saving: " << saving * 100 << "%" << std::endl;176    std::cout << "  Cache size: " << mla.cache_size_bytes() << " bytes" << std::endl;177    178    // MLA应该节省至少50%179    assert(saving > 0.5f);180    181    std::cout << "  PASSED: MLA cache" << std::endl;182}183 184void test_quantized_model() {185    std::cout << "Testing quantized model..." << std::endl;186    187    NeuroFlowModel::Config cfg;188    cfg.input_dim = 128;189    cfg.hidden_dim = 64;190    cfg.output_dim = 5;191    cfg.use_quantization = true;192    193    NeuroFlowModel model(cfg);194    195    auto stats = model.get_stats();196    std::cout << "  Quantization ratio: " << stats.quantization_ratio * 100 << "%" << std::endl;197    198    // 前向传播应该仍然工作199    Tensor input({2, cfg.input_dim});200    auto output = model.forward(input);201    202    assert(output.output.shape_[1] == cfg.output_dim);203    204    std::cout << "  PASSED: quantized model" << std::endl;205}206 207void test_performance_comparison() {208    std::cout << "Testing performance comparison..." << std::endl;209    210    NeuroFlowModel::Config orig_cfg;211    orig_cfg.input_dim = 512;212    orig_cfg.hidden_dim = 256;213    orig_cfg.output_dim = 10;214    215    NeuroFlowModel original(orig_cfg);216    217    NeuroFlowModel::Config lite_cfg;218    lite_cfg.input_dim = 512;219    lite_cfg.hidden_dim = 128;220    lite_cfg.output_dim = 10;221    lite_cfg.memory_dim = 64;222    lite_cfg.memory_slots = 32;223    lite_cfg.num_layers = 1;224    lite_cfg.num_associations = 4;225    lite_cfg.use_quantization = true;226    227    NeuroFlowModel lite(lite_cfg);228    229    auto orig_stats = original.get_stats();230    auto lite_stats = lite.get_stats();231    232    std::cout << "  Original params: " << orig_stats.total_params << std::endl;233    std::cout << "  Lite params: " << lite_stats.total_params << std::endl;234    std::cout << "  Size reduction: " << (1.0 - static_cast<double>(lite_stats.total_params) / orig_stats.total_params) * 100 << "%" << std::endl;235    236    // 性能测试237    Tensor input({32, 512});238    float* data = input.as_fp32();239    for (size_t i = 0; i < input.numel(); ++i) {240        data[i] = static_cast<float>(std::rand()) / RAND_MAX;241    }242    243    // 预热244    original.forward(input);245    lite.forward(input);246    247    // 原始模型248    auto start = std::chrono::high_resolution_clock::now();249    for (int i = 0; i < 10; ++i) {250        original.forward(input);251    }252    auto end = std::chrono::high_resolution_clock::now();253    auto orig_time = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / 1000.0 / 10;254    255    // Lite模型256    start = std::chrono::high_resolution_clock::now();257    for (int i = 0; i < 10; ++i) {258        lite.forward(input);259    }260    end = std::chrono::high_resolution_clock::now();261    auto lite_time = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / 1000.0 / 10;262    263    std::cout << "  Original time: " << orig_time << " ms" << std::endl;264    std::cout << "  Lite time: " << lite_time << " ms" << std::endl;265    std::cout << "  Speedup: " << orig_time / lite_time << "x" << std::endl;266    267    std::cout << "  PASSED: performance comparison" << std::endl;268}269 270int main(int argc, char** argv) {271    std::cout << "========================================" << std::endl;272    std::cout << "NeuroFlow Core - Model Tests" << std::endl;273    std::cout << "========================================" << std::endl;274    275    test_model_creation();276    test_forward_pass();277    test_forward_with_manifold();278    test_manifold_trajectory();279    test_memory_module();280    test_memory_consolidation();281    test_mla_cache();282    test_quantized_model();283    test_performance_comparison();284    285    std::cout << "========================================" << std::endl;286    std::cout << "All tests PASSED!" << std::endl;287    std::cout << "========================================" << std::endl;288    289    return 0;290}