Skip to content

Conversation

0130w
Copy link

@0130w 0130w commented Aug 26, 2025

Previous implementation required benchncnn to be run from the directory containing the model files. This often caused failures and inconvenience when executed from an arbitrary working directory.​​

​This change embeds the model files directly into the executable by compiling them as C arrays. Consequently, benchncnn now becomes fully self-contained and can be run from any location without dependency on external model files.​

@github-actions github-actions bot added the cmake label Aug 26, 2025
Copy link

The binary size change of libncnn.so (bytes)

architecture base size pr size difference
x86_64 15046688 15046688 0 😘
armhf 6081956 6081956 0 😘
aarch64 9387400 9387400 0 😘

@tencent-adm
Copy link
Member

tencent-adm commented Aug 31, 2025

CLA assistant check
All committers have signed the CLA.

@0130w
Copy link
Author

0130w commented Aug 31, 2025

run

cd build
cmake -DCMAKE_BUILD_TYPE=Debug -DNCNN_VULKAN=ON -DNCNN_BUILD_EXAMPLES=ON -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
make -j$(nproc)
cd benchmark
./benchncnn 4 8 0 -1 1

result before

./benchncnn 4 8 0 -1 1
loop_count = 4
num_threads = 8
powersave = 0
gpu_device = -1
cooling_down = 1
fopen squeezenet.param failed
network graph not ready
          squeezenet  min =    0.00  max =    0.00  avg =    0.00
fopen squeezenet_int8.param failed
...

after

loop_count = 4
num_threads = 8
powersave = 0
gpu_device = -1
cooling_down = 1
          squeezenet  min =   12.68  max =   13.12  avg =   12.94
     squeezenet_int8  min =    8.39  max =    9.11  avg =    8.88
           mobilenet  min =   16.69  max =   17.01  avg =   16.83
      mobilenet_int8  min =   15.41  max =   16.59  avg =   15.86
        mobilenet_v2  min =   16.33  max =   17.03  avg =   16.67
        mobilenet_v3  min =   13.08  max =   15.00  avg =   14.34
          shufflenet  min =   10.04  max =   12.69  avg =   10.88
       shufflenet_v2  min =   10.14  max =   13.40  avg =   11.20
             mnasnet  min =   12.67  max =   16.30  avg =   14.48
     proxylessnasnet  min =   14.56  max =   16.55  avg =   15.68
     efficientnet_b0  min =   23.54  max =   25.99  avg =   24.56
   efficientnetv2_b0  min =   25.69  max =   28.93  avg =   27.90
...

@codecov-commenter
Copy link

codecov-commenter commented Sep 1, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 95.85%. Comparing base (aad2e0c) to head (41745c8).
⚠️ Report is 3 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #6286      +/-   ##
==========================================
+ Coverage   95.84%   95.85%   +0.01%     
==========================================
  Files         837      837              
  Lines      264899   264848      -51     
==========================================
- Hits       253889   253877      -12     
+ Misses      11010    10971      -39     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@nihui nihui requested a review from Copilot September 1, 2025 02:12
Copy link
Contributor

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR replaces file-based model loading with memory-based loading in the benchncnn tool by embedding model parameter files directly into the executable as C arrays. This eliminates the dependency on external .param files and allows the benchmark to run from any directory.

  • Introduces a CMake macro to convert .param files into C header files containing hex data arrays
  • Updates benchncnn.cpp to use load_param_mem() instead of load_param() with embedded data
  • Normalizes model names by replacing hyphens with underscores to ensure valid C identifiers

Reviewed Changes

Copilot reviewed 6 out of 9 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
cmake/ncnn_generate_model_data_header.cmake Adds CMake macro to convert .param files to C arrays with validation
benchmark/model_param_spv_data.h.in Template for including generated model parameter headers
benchmark/model_param_registry.h.in Template for model parameter registry data
benchmark/benchncnn.cpp Updates to use embedded model data with registry lookup function
benchmark/README.md Updates documentation to reflect new param usage without .param suffix
benchmark/CMakeLists.txt Integrates model data generation into build process

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment on lines 116 to 129
if (fixed_path)
{
char parampath[256];
sprintf(parampath, MODEL_DIR "%s.param", comment);
net.load_param(parampath);
model_param = find_model_param(comment);
}
else
{
net.load_param(comment);
// use load_param_mem
model_param = find_model_param(comment);
if (model_param == NULL)
{
fprintf(stderr, "can't find %s.param in model dir\n", comment);
return;
}
}
Copy link

Copilot AI Sep 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The logic in both branches of the if-else statement is identical. Consider removing the conditional check since both fixed_path true and false cases now perform the same operations.

Copilot uses AI. Check for mistakes.

model_param = find_model_param(comment);
if (model_param == NULL)
{
fprintf(stderr, "can't find %s.param in model dir\n", comment);
Copy link

Copilot AI Sep 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The error message references 'model dir' which is no longer accurate since models are now embedded in memory. Consider updating to 'can't find %s model in embedded data' or similar.

Suggested change
fprintf(stderr, "can't find %s.param in model dir\n", comment);
fprintf(stderr, "can't find %s.param in embedded data\n", comment);

Copilot uses AI. Check for mistakes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants