恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Flashlight 实战指南:Facebook AI Research 出品的 C++ 机器学习库——从架构剖析、构建安装到上手编程
首页
资讯中心
/
Flashlight 实战指南:Facebook AI Research 出品的 C++ 机器学习库——从架构剖析、构建安装到上手编程
Flashlight 实战指南:Facebook AI Research 出品的 C++ 机器学习库——从架构剖析、构建安装到上手编程
发布时间:2026/10/12 2:13:48
人工智能机器学习深度学习【免费下载链接】flashlightA C standalone library for machine learning项目地址https://gitcode.com/gh_mirrors/fla/flashlight点击查看免费下载Flashlight 是 Facebook AI ResearchFAIR与 Torch、TensorFlow、Eigen、Deep Speech 等项目创造者共同开发的一款完全用 C 编写、追求极致灵活与性能的机器学习库。本文以仓库根目录 README.md 为骨架结合仓库源码带你完整掌握它的设计理念、fl / pkg / app三层架构、基于Sequential与Variable的快速编程方式以及 vcpkg / 源码两种构建安装路径最终能独立用它搭建自己的训练工程。一、项目定位与核心特性Flashlight 的定位是快速、灵活的机器学习库其核心特性在 README.md 中总结为四点完全内部可修改性Total internal modifiability连张量计算的内部 API都是开放可定制的研究者可以在库、编译器、硬件三个层面接入自己的计算栈小体积Small footprint核心部分控制在 10 MB 以下、约 2 万行 C 代码高性能默认High-performance defaults通过 ArrayFire 张量库实现基于现代 C 的即时内核编译JIT强调效率与规模Efficiency and scale面向大规模分布式训练场景设计。从根 CMakeLists.txt可以看到当前仓库版本为0.4.0要求C17 标准CMAKE_CXX_STANDARD 17CUDA 部分出于兼容老版本 nvcc 的考虑仍保持C14标准。项目采用 MIT 许可见 LICENSE。在单一仓库内Flashlight 为多个研究领域提供了开箱即用的应用App这一点充分体现了它少约束、快迭代的研究框架定位应用说明仓库位置自动语音识别ASR前身是 wav2letter与教程flashlight/app/asr图像分类Image classificationImageNet 级别的 ResNet / Transformer 示例flashlight/app/imgclass目标检测Object detection含 DETR、ResNet50 Backbone 等实现flashlight/app/objdet语言建模Language modeling含 Transformer 系列模型与训练器flashlight/app/lm二、仓库布局三层架构fl / pkg / appREADME 将 Flashlight 拆解为几大组成部分。需要说明的是README 中提到的flashlight/lib独立内核与音频处理工具在当前仓库中已被整合进其他组件当前仓库实际包含以下三大部分flashlight/fl核心张量接口与神经网络库默认基于 ArrayFire 张量库。它进一步细分为autograd自动微分与Variable、nn神经网络模块、optim优化器、dataset数据集抽象、distributed分布式、meter评估指标、tensor张量框架、runtime设备/流管理等子模块。统一头文件 flashlight.h 一次引入全部核心能力flashlight/pkg基于核心构建的领域包包括 speech语音、vision视觉、text文本、runtime训练通用工具等。从 pkg/CMakeLists.txt 可以看到每个包都由register_package()注册并可被 app 依赖flashlight/app核心库在多个机器学习领域的应用层即编译成可执行二进制的训练/推理程序。从 app/CMakeLists.txt 可看到 asr、imgclass、objdet、lm、benchmark 均由register_app()机制按需注册构建。这种核心 → 领域包 → 应用的分层让研究者既能直接用fl核心做底层实验也能复用pkg的领域能力还能直接运行或改造app的完整训练程序。2.1 可插拔的张量后端fl::Tensor框架README 强调的完全内部可修改性在 flashlight/fl/tensor/README.md 中有完整定义。fl::Tensor是一个不预设立场unopinionated的张量前端为在库、编译器、硬件层面集成自定义计算栈提供最小可行接口小 API 面只需实现几十个算子即可接入新后端用户自定义内部实现在标准高层 API 之下自由实现不强制指定 IR计算模型灵活JIT、即时求值eager等不同计算模型均可接入。接入一个新后端只需继承两个接口TensorAdapterBase定义张量成员操作见 TensorAdapter.h与TensorBackend定义全局张量操作见 TensorBackend.h。后端实现统一放在tensor/backend/[backend name]目录下——当前仓库内置了 afArrayFire、jit、onednn、stub 四种后端。后端开关在 tensor/CMakeLists.txt 中通过FL_USE_ARRAYFIRE、FL_USE_JIT、FL_USE_TENSOR_STUB、FL_USE_ONEDNN四个选项控制且至少必须启用一个后端否则构建会直接报错。三、快速上手用Sequential搭一个卷积网络README 的 Quickstart 部分展示了 Flashlight 最典型的编程范式用Sequential容器串联各个Module构建一个简单卷积网络代码可直接复制运行#include flashlight/fl/flashlight.h Sequential model; model.add(View(fl::Shape({IM_DIM, IM_DIM, 1, -1}))); model.add(Conv2D( 1 /* input channels */, 32 /* output channels */, 5 /* kernel width */, 5 /* kernel height */, 1 /* stride x */, 1 /* stride y */, PaddingMode::SAME; /* padding mode */, PaddingMode::SAME; /* padding mode */)); model.add(ReLU()); model.add(Pool2D( 2 /* kernel width */, 2 /* kernel height */, 2 /* stride x */, 2 /* stride y */)); model.add(Conv2D(32, 64, 5, 5, 1, 1, PaddingMode::SAME, PaddingMode::SAME)); model.add(ReLU()); model.add(Pool2D(2, 2, 2, 2)); model.add(View(fl::Shape({7 * 7 * 64, -1}))); model.add(Linear(7 * 7 * 64, 1024)); model.add(ReLU()); model.add(Dropout(0.5)); model.add(Linear(1024, 10)); model.add(LogSoftmax());这里用到的关键组件都来自 flashlight/fl/nnSequential在 Container.h 中定义为按顺序调用每个Module的forward并把结果喂给下一个模块的容器内部持有std::vectorModulePtr modules_可通过modules()、params()检查内部状态prettyString()生成结构字符串Conv2D/Linear/Dropout/ReLU/Pool2D/LogSoftmax标准神经网络模块其中Linear在 Linear.h 中封装了nIn_、nOut_、bias_参数View按给定Shape重塑张量-1表示自动推断该维度。前向与反向计算同样直白auto output model.forward(input); auto loss categoricalCrossEntropy(output, target); loss.backward();3.1 从源码看完整训练循环MNIST 示例README 指向的 MNIST 示例flashlight/fl/examples/Mnist.cpp给出了从数据加载到训练、验证、测试的完整闭环是理解 Flashlight 训练范式的绝佳模板数据准备用TensorDatasetBatchDataset包装训练/验证集BatchDataset负责按batch_size切批模型构建与上文 Quickstart 几乎一致的卷积网络View → Conv2D → ReLU → Pool2D交替最后Linear → LogSoftmax优化器SGDOptimizer opt(model.params(), learning_rate)训练超参为learning_rate 1e-2、epochs 10、batch_size 64训练循环每个 batch 依次执行loss.backward()→opt.step()→opt.zeroGrad()输入输出张量通过noGrad(...)包装避免梯度追踪评估AverageValueMeter记录损失FrameErrorMeter记录分类错误率测试时先model.eval()再model.train()切换模式。该示例最终输出接近Test Loss: 0.0373 Test Error (%): 1.1。此外示例构建细节可参考 flashlight/fl/examples/README.md安装后示例源码会被放置到prefix/share/flashlight/examples也可作为独立项目在源码外构建。四、自动微分Variable与 tape-based autogradFlashlight 的自动微分基于VariableVariable.h——一个tape记录带式的抽象包装底层 Flashlight 张量并支持标准的反向传播。README 给出的 Autograd 示例auto A Variable(fl::rand({1000, 1000}), true /* calcGrad */); auto B 2.0 * A; auto C 1.0 B; auto D log(C); D.backward(); // populates A.grad() along with gradients for B, C, and D.D.backward()会沿着计算图反向传播为A填充A.grad()同时计算出B、C、D各自的梯度。从源码注释可以明确其原理Variable包装底层张量当前默认是 ArrayFire 数组当对输入Variable施加运算函数时输出Variable会记录它的输入以及一个梯度函数GradFunc用于从输出向每个输入传播梯度Variable与运算函数共同构成一个DAG有向无环图计算图反向传播即按拓扑序从输出节点遍历这张图。几个关键实现细节见 Variable.hVariable内部以shared_ptr持有底层张量和梯度因此拷贝构造是浅拷贝共享同一份底层数据构造时第二个参数calcGrad决定是否需要对当前变量计算梯度梯度回传使用链式法则chain rule沿 DAG 遍历。对于卷积、池化、批归一化、RNN 等常见算子Flashlight 还通过AutogradExtension提供自动微分感知的实现其接口定义见 AutogradOps.h并可按后端通过FL_REGISTER_TENSOR_EXTENSION(...)宏注册扩展详见 tensor/README.md。五、构建与安装 FlashlightREADME 给出了完整的构建矩阵安装方式有 vcpkg 与源码两种使用方式分为作为已安装库链接到自己的项目和源码内开发in-source development两种。在动手前先确认环境满足要求。5.1 环境要求Requirements编译 Flashlight 至少需要一个对C17支持良好的编译器如 gcc/g 7CMake3.10 或更高版本以及make基于Linux的操作系统。如需从源码构建完整依赖清单见下文 5.4 节。Python 绑定的构建/安装说明另见 bindings/python/README.md注意Python 绑定组件已迁出到外部库详见第七节。5.2 方式一用 vcpkg 安装推荐Flashlight 可以最方便地通过 vcpkgC 包管理器构建安装CPU 与 CUDA 两种后端均受支持。无论哪种后端都需要先安装 Intel MKLCUDA 后端还需安装CUDA 9.2、cuDNN与NCCL。之后安装 vcpkg 并执行./vcpkg/vcpkg install flashlight-cuda # CUDA backend, OR ./vcpkg/vcpkg install flashlight-cpu # CPU backend若要安装 Flashlight 应用App用./vcpkg search flashlight-cuda或./vcpkg search flashlight-cpu查看可选特性feature。例如./vcpkg install flashlight-cuda[asr]会安装带 CUDA 后端的 ASR 应用。当前支持的 feature 清单如下flashlight-{cuda/cpu}[lib] # Flashlight libraries flashlight-{cuda/cpu}[nn] # Flashlight neural net library flashlight-{cuda/cpu}[asr] # Flashlight speech recognition app flashlight-{cuda/cpu}[lm] # Flashlight language modeling app flashlight-{cuda/cpu}[imgclass] # Flashlight image classification app所选 feature 对应的 app 二进制 也会被构建并安装到 vcpkg 安装树的tools目录。5.3 方式二从源码构建用 vcpkg 安装依赖后从源码构建先按后端用 vcpkg 安装依赖。CUDA 后端依赖按所需 feature 选择./vcpkg install \ cuda intel-mkl fftw3 cub kenlm \ # if building flashlight libraries arrayfire[cuda] cudnn nccl openmpi cereal stb \ # if building the flashlight neural net library gflags glog \ # if building any flashlight apps libsndfile \ # if building the flashlight asr app gtest # optional, if building testsCPU 后端依赖./vcpkg install \ intel-mkl fftw3 kenlm \ # for flashlight libraries arrayfire[cpu] gloo[mpi] openmpi onednn cereal stb \ # for the flashlight neural net library gflags glog \ # for the flashlight runtime pkg (any flashlight apps using it) libsndfile \ # for the flashlight speech pkg gtest # optional, for tests依赖就绪后克隆仓库并利用 vcpkg 的 CMake toolchain 构建git clone https://github.com/flashlight/flashlight.git cd flashlight mkdir -p build cd build cmake .. \ -DCMAKE_BUILD_TYPERelease \ -DFL_BUILD_ARRAYFIREON \ -DCMAKE_TOOLCHAIN_FILE[path to your vcpkg clone]/scripts/buildsystems/vcpkg.cmake make -j$(nproc) make install -j$(nproc) # only if you want to install Flashlight for external use直接安装系统依赖后从源码构建在依赖全部安装完毕后克隆并构建git clone https://github.com/flashlight/flashlight.git cd flashlight mkdir -p build cd build cmake .. -DCMAKE_BUILD_TYPERelease -DFL_BUILD_ARRAYFIREON [...build options] make -j$(nproc) make install部分依赖表中带*标记若在本机找不到会被自动下载并从源码构建这一行为由FL_BUILD_STANDALONE控制设为OFF可禁用。若 CMake 找不到 Intel MKL可设置环境变量export MKLROOT/opt/intel/oneapi/mkl/latest多数 Linux 发行版为/opt/intel/mkl辅助定位。其他实用参数自定义安装目录用 CMake 的CMAKE_INSTALL_PREFIX构建共享库用 CMake 的BUILD_SHARED_LIBS依赖定位Flashlight 使用现代 CMake 的IMPORTEDtargets若某依赖未被找到可传-Dpackage_DIR指向该依赖的Config.cmake所在目录。macOS 最小化构建在 macOS 上可用 Homebrew 安装 ArrayFire 后做最小化构建brew install arrayfire cmake .. \ -DFL_ARRAYFIRE_USE_OPENCLON \ -DFL_USE_ONEDNNOFF \ -DFL_BUILD_TESTSOFF \ -DFL_BUILD_EXAMPLESOFF \ -DFL_BUILD_SCRIPTSOFF \ -DFL_BUILD_DISTRIBUTEDOFF make -j$(nproc)5.4 依赖对照表下表完整列出各组件在不同后端下的依赖*未找到时自动下载构建由FL_BUILD_STANDALONE控制^仅在开启分布式训练FL_BUILD_DISTRIBUTED时需要所有 App 都需要分布式训练†可通过 vcpkg 安装组件后端依赖librariesCUDACUDA 9.2、CUB*†CUDA 11 时librariesCPU一个 BLAS 库Intel MKL 2018、OpenBLAS† 等core任意ArrayFire 3.7.3†、MPI 库^OpenMPI† 等、cereal*† 1.3.0、stb*†coreCUDACUDA 9.2、NCCL^、cuDNNcoreCPUoneDNN† 2.5.2、gloo带 MPI*^†app: all任意Google Glog†、Gflags†app: asr任意libsndfile*† 10.0.28、BLAS 库Intel MKL 2018、OpenBLAS† 等、flashlight/text*app: imgclass任意-app: lm任意flashlight/text*tests任意Google Testgtest含 gmock*† 1.10.05.5 构建选项Build OptionsCMake 构建可接受的完整选项如下命令行运行时用-D前缀例如-DFL_BUILD_TESTSOFF名称选项默认值说明FL_BUILD_ARRAYFIREON, OFFON使用 ArrayFire 后端构建 FlashlightFL_BUILD_STANDALONEON, OFFON找不到某些依赖时下载/构建它们FL_BUILD_LIBRARIESON, OFFON构建 Flashlight 库FL_BUILD_NNON, OFFON构建 Flashlight 神经网络库FL_BUILD_DISTRIBUTEDON, OFFON开启分布式训练支持所有 App 都需要FL_BUILD_CONTRIBON, OFFON构建可能发生破坏性变更的 contrib APIFL_BUILD_APPSON, OFFON构建应用程序见下FL_BUILD_APP_ASRON, OFFON构建自动语音识别应用FL_BUILD_APP_IMGCLASSON, OFFON构建图像分类应用FL_BUILD_APP_LMON, OFFON构建语言建模应用FL_BUILD_APP_ASR_TOOLSON, OFFON构建 ASR 应用工具app/asr/CMakeLists.txtFL_BUILD_TESTSON, OFFON构建测试FL_BUILD_EXAMPLESON, OFFON构建示例FL_BUILD_EXPERIMENTALON, OFFOFF构建实验性组件CMAKE_BUILD_TYPE见 CMake 文档Debug构建类型CMAKE_INSTALL_PREFIX[目录]见 CMake 文档安装前缀目录构建子集提示README 中FL_BUILD_APPS等选项的ON默认值对应完整构建实际仓库中 App 的注册是条件式的——app/CMakeLists.txt 通过fl_dependent_option生成FL_BUILD_APP_*选项其默认值由依赖条件推导如 objdet 默认关闭因此按需关闭不需要的 App 即可显著缩短构建时间。同理FL_BUILD_PKG_*runtime/vision/text/speech在 pkg/CMakeLists.txt 中注册FL_USE_*ARRAYFIRE/JIT/TENSOR_STUB/ONEDNN/CUDNN/NCCL/GLOO控制张量与计算后端见 tensor/CMakeLists.txt 与 distributed/CMakeLists.txt。六、用 Flashlight 构建你自己的项目Flashlight 最适合通过 CMake 链接。安装后会导出以下 CMake targetsflashlight::flashlight— 包含 Flashlight 库以及核心自动微分与神经网络库flashlight::fl_pkg_runtime— 核心 训练通用工具日志 / flags / 分布式工具实现在 pkg/runtime/Runtime.hflashlight::fl_pkg_vision— 核心 视觉管线通用工具flashlight::fl_pkg_text— 核心 文本数据处理通用工具flashlight::fl_pkg_speech— 核心 语音数据处理通用工具flashlight::fl_pkg_halide— 核心 与 Halide 交互的扩展。假设有一个简单的project.cpp#include iostream #include flashlight/fl/flashlight.h int main() { fl::init(); fl::Variable v(fl::full({1}, 1.), true); auto result v 10; std::cout Tensor value is result.tensor() std::endl; // 11.000 return 0; }对应的 CMake 配置如下cmake_minimum_required(VERSION 3.10) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_executable(myProject project.cpp) find_package(flashlight CONFIG REQUIRED) target_link_libraries(myProject PRIVATE flashlight::flashlight)注意project.cpp中先调用fl::init()再创建Variable这是 Flashlight 初始化运行时的标准入口Variable构造函数的第二个参数true表示需要梯度。6.1 基于 vcpkg 安装的集成如果 Flashlight 由 vcpkg 安装用 vcpkg 的 CMake toolchain 构建myProjectcd project mkdir build cd build cmake .. \ -DCMAKE_TOOLCHAIN_FILE[path to vcpkg clone]/scripts/buildsystems/vcpkg.cmake \ -DCMAKE_BUILD_TYPERelease make -j$(nproc)6.2 基于源码安装的集成如果是源码安装CMake 会自动找到 Flashlightcd project mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j$(nproc)若 Flashlight 安装在自定义前缀通过CMAKE_INSTALL_PREFIX需要传-Dflashlight_DIR[install prefix]/share/flashlight/cmake帮助 CMake 定位。6.3 使用 DockerFlashlight 及其依赖也可以用仓库提供的 Dockerfile 构建运行构建好的镜像对应 CUDA 与 CPU 后端均有发布具体用法可参考仓库.docker目录下的文档。七、Python 绑定说明如需在 Python 中使用 Flashlight 生态注意 bindings/python/README.md 的说明Python 绑定组件已从本仓库迁出到两个外部库Flashlight Text文本处理工具包括 beam search 解码器、词典抽象与分词器Flashlight Sequence序列损失函数的 CPU/GPU 实现包括 CTCConnectionist Temporal Classification与 ASGAuto Segmentation。本仓库不再包含其他 Python 绑定组件相关问题与贡献请到对应仓库提交。八、参与贡献、引用与许可证Flashlight 处于非常活跃的开发中贡献指南见 CONTRIBUTING.md。引用 Flashlight 时可使用其论文arXiv:2201.12465对应的 BibTeXmisc{kahn2022flashlight, title{Flashlight: Enabling Innovation in Tools for Machine Learning}, author{Jacob Kahn and Vineel Pratap and Tatiana Likhomanenko and Qiantong Xu and Awni Hannun and Jeff Cai and Paden Tomasello and Ann Lee and Edouard Grave and Gilad Avidov and Benoit Steiner and Vitaliy Liptchinsky and Gabriel Synnaeve and Ronan Collobert}, year{2022}, eprint{2201.12465}, archivePrefix{arXiv}, primaryClass{cs.LG} }项目部分代码派生自 arrayfire-ml并以 MIT 许可证开源见 LICENSE。结语从研究框架到你的第一个 Flashlight 工程本文沿着仓库 README.md 的主线完成了从为什么需要 Flashlight到如何用 Flashlight 干活的完整闭环先理解其fl / pkg / app三层架构与可插拔张量后端的设计哲学再通过Sequential与Variable掌握核心编程范式随后按 vcpkg 或源码两种路径完成构建安装最后用导出的 CMake targets 把 Flashlight 接入自己的项目。接下来你可以直接阅读 flashlight/fl/examples/Mnist.cpp 的完整训练循环或进入 flashlight/app/asr 的教程把这套框架真正跑起来。赞分享人工智能机器学习深度学习【免费下载链接】flashlightA C standalone library for machine learning项目地址https://gitcode.com/gh_mirrors/fla/flashlight点击查看免费下载相关推荐如何训练自定义Zero-1-to-3模型从零开始的完整教程如何训练自定义Zero 1 to 3模型从零开始的完整教程 想要从单张图片生成3D对象吗Zero 1 to 3模型让这成为可能这个强大的AI模型能够将任意mlpack 4 快速上手header-only C 机器学习库的安装、编译与实战指南mlpack 4 快速上手header only C 机器学习库的安装、编译与实战指南 mlpack 是一个以 C 为核心、以“快速、轻量、heade人工智能机器学习深度学习Flashlight机器学习库面向未来的C深度学习框架终极指南Flashlight机器学习库面向未来的C深度学习框架终极指南 Flashlight是一个完全用C编写的高速、灵活机器学习库由Facebook AI人工智能机器学习深度学习上一篇Figma 汉化插件完整指南3 分钟把 Figma 界面变成中文下一篇免Root按应用伪装位置用Xposed模块FakeLocation完成Android虚拟定位的完整实操创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考