NCNN学习系列零:NCNN介绍及闲言碎语

开源摘星计划(WeOpen Star) 是由腾源会 2022 年推出的全新项目,旨在为开源人提供成长激励,为开源项目提供成长支持,助力开发者更好地了解开源,更快地跨越鸿沟,参与到开源的具体贡献与实践中。

不管你是开源萌新,还是希望更深度参与开源贡献的老兵,跟随“开源摘星计划”开启你的开源之旅,从一篇学习笔记、到一段代码的提交,不断挖掘自己的潜能,最终成长为开源社区的“闪亮之星”。

我们将同你一起,探索更多的可能性!

项目地址: WeOpen-Star

前言:

​ 虽然有志于提升深度学习方面的知识储备,但是毕竟才疏学浅,很多学习都是寻寻觅觅流于表面。今天写个PCA,明天又在PyTorch上跑个MINTS,又或者是抱着“西瓜书”挑灯夜读,自以为入坑机器学习,殊不知,早就把大号时光浪费在浅表的工作上,还洋洋得意自己似有进步。

​ 与师兄座谈,经师兄提点,才知道,与其临渊羡鱼,不如退而结网的道理。痛定思痛,寻求改变之法,脚踏实地,方能仰望天空。恰好工作上多接触NCNN,又趁着腾讯开源摘星计划的浪潮。一边求索,一边记录,扎扎实实走一趟NCNN的设计和实现道路,一来工作与深度学习深入结合,二来以馈读者,三来若能力尚且一观,能为NCNN 添砖加瓦,岂不美哉。

​ 编写这系列文章,沿着两条路线走,前n章节,自底向上,从内存结构聊到 operation 优化策略,后n+1章节,自顶向下,讨论新模型如何被forward 解构成基本操作单元集合;

​ 这系列文章除去理论介绍部分,尽量保持源代码与测试代码完备。项目主要使用Cmake 构建C++的测试程序,由于NCNN本身贴近硬件优化实现,所以整体语言属性偏重classic C,以确保所有代码在不同硬件平台上的普适性;使用gtest作为测试用框架,会慢一些,但是确保每部分的源代码和测试干净。

安装NCNN 及开发环境

  • 预设环境

    系统环境为VirualBox 装载的Ubuntu 18.04, 使用gcc 7.5.0 作为开发环境,另外安装Cmake + git+ vs-code 。完成以下操作(不会百度都有):

    1. 安装Cmake,修改bashrc 使得Cmake生效,传递文件进Ubuntu,可以参考VirualBox 如何设置共享文件夹;
    2. 安装git,配置git config, 配置git ssh key, 测试git ssh key 能够正确连接到Github (必选);
    3. 安装vs-code,vs-code插件安装C++相关编译插件,如果插件下载时间过长,可从插件市场直接下载对应插件,使用install from visx 来安装;
  • NCNN安装

    以下摘录自ncnn wiki:how-to-build

    # 先在github 上 fork ncnn 到你的仓库,假设你叫做user
    # 进入你准备放ncnn 的目录
    git clone git@github.com:user/ncnn.git
    sudo apt install build-essential git cmake libprotobuf-dev protobuf-compiler libopencv-dev  # 与ncnn wiki略有不同,本文不涉及未成熟vulkan
    cd ncnn && mkdir -p build
    cd build && cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=OFF -DNCNN_BUILD_EXAMPLES=ON ..
    make -j$(nproc) && make install
    

    ​ 以上安装正确,将会在build目录下生成install目录,包含bin/ include/ lib/ 。即可通过这些调用ncnn基础结构;CMakeLists.txt中加上:

    set(ncnn_DIR  /home/user/}		# 你自己的ncnn目录
    set(ncnn_DIRS  ${ncnn_DIR}/ncnn/build/install)
    set(ncnn_INCLUDE_DIRS ${ncnn_DIRS}/include)
    set(ncnn_LIBS ${ncnn_DIRS}/lib)
    ...
    
    include_directories(
        ${ncnn_INCLUDE_DIRS}
       	}
    add_library( libncnn STATIC IMPORTED )
    set_target_properties(
            libncnn
            PROPERTIES IMPORTED_LOCATION
            ${ncnn_DIRS}/lib/libncnn.a
    )
    target_link_libraries(${PROJECT_NAME} 
        libncnn 
        gtest
        gtest_main
        pthread
        OpenMP::OpenMP_CXX 
       )
    

    ​ 这样就可以以静态库的形式调用ncnn 了,前期我们熟悉了解ncnn的基础结构,和测试operation就可以以此为基础;

  • Gtest测试框架使用

    ​ Googletest是针对C++程序的测试框架,本系列文章中主要用来对容器进行验证,当然你也可以选择其他测试框架;

    ​ 使用Googletest是非常简单的,只需要在代码中增加以下代码:

    # 使用vckpg
    # set(GTest_DIR "E:/src/vcpkg/installed/x86-windows/share/GTest")
    # find_package(GTest CONFIG REQUIRED)
    
    include(FetchContent)
    FetchContent_Declare(
       googletest
       URL https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip
    )
    # # For Windows: Prevent overriding the parent project's compiler/linker settings
    set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
    FetchContent_MakeAvailable(googletest)
    

    如果Cmake过程中下载速度较慢,可以单独下载URL所属的压缩包,放在同一目录下,也可以使用apt-install 的方法安装gtest;

对于后文中需要测试SSE加速,ARM NEON加速,指令集强相关于对应的环境,到时候我们会重新构建针对环境下的NCNN。

posted @   MoonJou  阅读(1034)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示