CoolFace
Modelpublic

cwenzi/neuroflow-cpp

sourceHugging Faceapache-2.0updated 2mo agoView on Hugging Face
1likes
test_memory_leak.cpp212 linesDownload Raw Back to tests
1/**2 * NeuroFlow 内存泄漏检测测试3 * 4 * 使用简单的方法检测内存泄漏:5 * 1. 运行大量迭代测试6 * 2. 检查内存使用变化7 * 3. 验证对象生命周期8 */9 10#include <iostream>11#include <chrono>12#include <vector>13#include "../include/neuroflow/model.hpp"14#include "../include/neuroflow/memory.hpp"15 16using namespace neuroflow;17 18// 内存统计19size_t get_current_memory_mb() {20    // 使用简单方法估算21    FILE* f = fopen("/proc/self/status", "r");22    if (!f) return 0;23    24    char line[256];25    size_t vmrss = 0;26    while (fgets(line, 256, f)) {27        if (strncmp(line, "VmRSS:", 6) == 0) {28            sscanf(line + 6, "%zu", &vmrss);29            break;30        }31    }32    fclose(f);33    return vmrss;  // KB34}35 36void test_tensor_memory_leak() {37    std::cout << "\n=== Tensor Memory Leak Test ===\n";38    39    size_t mem_before = get_current_memory_mb();40    41    // 创建和销毁大量Tensor42    for (int i = 0; i < 10000; ++i) {43        Tensor t({256, 512}, QuantType::FP32);44        Tensor t2 = t.clone();45        Tensor t3 = t.reshape({128, 1024});46    }47    48    size_t mem_after = get_current_memory_mb();49    50    ssize_t mem_change = static_cast<ssize_t>(mem_after) - static_cast<ssize_t>(mem_before);51    52    std::cout << "  Memory before: " << mem_before << " KB\n";53    std::cout << "  Memory after: " << mem_after << " KB\n";54    std::cout << "  Memory change: " << mem_change << " KB\n";55    56    // 内存变化应该很小(< 1MB),因为对象都被正确释放57    if (mem_after - mem_before < 1024) {58        std::cout << "  [PASS] No significant memory leak detected\n";59    } else {60        std::cout << "  [WARN] Possible memory leak\n";61    }62}63 64void test_model_memory_leak() {65    std::cout << "\n=== Model Memory Leak Test ===\n";66    67    size_t mem_before = get_current_memory_mb();68    69    // 创建和销毁大量模型70    for (int i = 0; i < 100; ++i) {71        NeuroFlowModel::Config cfg;72        cfg.input_dim = 128;73        cfg.hidden_dim = 64;74        cfg.output_dim = 5;75        76        NeuroFlowModel model(cfg);77        78        // 执行forward79        Tensor input({2, 128});80        auto output = model.forward(input);81        82        // 执行manifold trajectory83        auto trajectory = model.get_manifold_trajectory(input, 5);84    }85    86    size_t mem_after = get_current_memory_mb();87    88    ssize_t mem_change = static_cast<ssize_t>(mem_after) - static_cast<ssize_t>(mem_before);89    90    std::cout << "  Memory before: " << mem_before << " KB\n";91    std::cout << "  Memory after: " << mem_after << " KB\n";92    std::cout << "  Memory change: " << mem_change << " KB\n";93    94    if (mem_after - mem_before < 2048) {95        std::cout << "  [PASS] No significant memory leak detected\n";96    } else {97        std::cout << "  [WARN] Possible memory leak\n";98    }99}100 101void test_mla_cache_memory() {102    std::cout << "\n=== MLA Cache Memory Test ===\n";103    104    size_t mem_before = get_current_memory_mb();105    106    // 测试MLA cache107    LatentKVCache mla(64, 4, 16, 128);108    109    for (int i = 0; i < 1000; ++i) {110        Tensor input({1, 64});111        float* data = input.as_fp32();112        for (size_t j = 0; j < 64; ++j) data[j] = 0.1f * j;113        114        mla.forward(input, true);115        116        if (i % 100 == 0) {117            mla.clear_cache();118        }119    }120    121    size_t mem_after = get_current_memory_mb();122    123    ssize_t mem_change = static_cast<ssize_t>(mem_after) - static_cast<ssize_t>(mem_before);124    125    std::cout << "  Memory before: " << mem_before << " KB\n";126    std::cout << "  Memory after: " << mem_after << " KB\n";127    std::cout << "  Memory change: " << mem_change << " KB\n";128    129    if (mem_after - mem_before < 512) {130        std::cout << "  [PASS] MLA cache memory management OK\n";131    } else {132        std::cout << "  [WARN] MLA cache may have memory issues\n";133    }134}135 136void test_memory_consolidation() {137    std::cout << "\n=== Memory Consolidation Test ===\n";138    139    size_t mem_before = get_current_memory_mb();140    141    MemoryConsolidationModule memory(64, 16, 32);142    143    for (int i = 0; i < 1000; ++i) {144        Tensor input({1, 64});145        memory.consolidate(input);146        147        auto result = memory.retrieve(input);148    }149    150    size_t mem_after = get_current_memory_mb();151    152    ssize_t mem_change = static_cast<ssize_t>(mem_after) - static_cast<ssize_t>(mem_before);153    154    std::cout << "  Memory before: " << mem_before << " KB\n";155    std::cout << "  Memory after: " << mem_after << " KB\n";156    std::cout << "  Memory change: " << mem_change << " KB\n";157    158    if (mem_after - mem_before < 256) {159        std::cout << "  [PASS] Memory consolidation OK\n";160    } else {161        std::cout << "  [WARN] Memory consolidation may leak\n";162    }163}164 165void test_shared_ptr_cycle() {166    std::cout << "\n=== Shared Pointer Cycle Test ===\n";167    168    size_t mem_before = get_current_memory_mb();169    170    // 测试shared_ptr是否有循环引用171    for (int i = 0; i < 1000; ++i) {172        NeuroFlowModel::Config cfg;173        NeuroFlowModel model(cfg);174        175        // 内部的shared_ptr应该正确管理176        auto stats = model.get_stats();177    }178    179    size_t mem_after = get_current_memory_mb();180    181    ssize_t mem_change = static_cast<ssize_t>(mem_after) - static_cast<ssize_t>(mem_before);182    183    std::cout << "  Memory before: " << mem_before << " KB\n";184    std::cout << "  Memory after: " << mem_after << " KB\n";185    std::cout << "  Memory change: " << mem_change << " KB\n";186    187    if (std::abs(mem_change) < 512) {188        std::cout << "  [PASS] No shared_ptr cycle detected\n";189    } else if (mem_change > 0) {190        std::cout << "  [WARN] Possible shared_ptr cycle\n";191    } else {192        std::cout << "  [PASS] Memory properly released\n";193    }194}195 196int main() {197    std::cout << "========================================\n";198    std::cout << "NeuroFlow Memory Leak Detection Tests\n";199    std::cout << "========================================\n";200    201    test_tensor_memory_leak();202    test_model_memory_leak();203    test_mla_cache_memory();204    test_memory_consolidation();205    test_shared_ptr_cycle();206    207    std::cout << "\n========================================\n";208    std::cout << "Memory Leak Tests Complete!\n";209    std::cout << "========================================\n";210    211    return 0;212}