NeoML是一个端到端的机器学习框架,允许你构建、训练和部署机器学习模型。ABBYY工程师使用该框架进行计算机视觉和自然语言处理任务,包括图像预处理、分类、文档布局分析、OCR以及从结构化和非结构化文档中提取数据。
主要特点:
- 支持100多种层类型的神经网络
- 传统机器学习:20多种算法(分类、回归、聚类等)
- CPU和GPU支持,快速推理
- ONNX支持
- 语言:Python、C++、Java、Objective-C
- 跨平台:同一代码可在Windows、Linux、macOS、iOS和Android上运行
目录
构建和安装
支持的平台
完整的C++库版本已在以下平台上进行了测试:
目标操作系统 | 编译器 | 架构 |
---|---|---|
Windows 7+(CPU和GPU) | MSVC 2019+ | x86, x86_64 |
Ubuntu 14+(CPU) | gcc 5.4+ | x86_64 |
MacOS 10.11+(CPU) | Apple clang 12+ | arm64, x86_64 |
iOS 11+(CPU, GPU) | Apple clang 12+ | arm64-v8a, x86_64 |
Android 5.0+(CPU), Android 7.0+(GPU) | clang 7+ | armeabi-v7a, arm64-v8a, x86, x86_64 |
Java和Objective-C的推理库版本已在以下平台上进行了测试:
目标操作系统 | 编译器 | 架构 |
---|---|---|
iOS 11+(CPU, GPU) | Apple clang 12+ | arm64-v8a, x86_64 |
Android 5.0+(CPU), Android 7.0+(GPU) | clang 7+ | armeabi-v7a, arm64-v8a, x86, x86_64 |
第三方依赖
该库使用CMake构建(推荐3.18及更高版本)。
为了在Windows、Linux和macOS上获得最佳CPU性能,我们使用Intel MKL。
在GPU上处理时,你可以选择在Windows或Linux上使用CUDA(版本11.2 upd.1),在Windows、Linux或Android上使用Vulkan(版本1.1.130及更高版本)。
我们还使用Google Test进行测试,以及Google Protocol Buffers处理ONNX模型格式。
我们使用非常方便的JIT代码生成器xbyak来加速x86_64处理器上的某些卷积操作。
构建完整功能的C++版本
有关在不同平台上构建C++库版本的说明,请参见此处。
为Java和Objective-C构建推理版本
有关构建仅用于运行训练好的神经网络的Java和Objective-C版本的说明,请参见此处。
入门
以下几个带有示例代码的教程将帮助你开始使用该库:
API描述
基本原则
该库在开发时遵循以下原则:
平台独立性
用户界面完全与由数学引擎实现的低级计算分离。
你唯一需要做的就是在开始时指定将用于计算的数学引擎类型。你也可以选择根据检测到的设备配置自动选择数学引擎。
无论你选择哪种数学引擎,你的机器学习代码的其余部分都将保持不变。
数学引擎独立性
每个网络都与一个数学引擎实例一起工作,其所有层都应使用同一数学引擎创建。如果你选择了GPU数学引擎,它将执行所有计算。这意味着你不能选择使用CPU进行"轻量级"计算(如向量加法),而使用GPU进行"重量级"计算(如矩阵乘法)。我们引入这个限制是为了避免设备之间不必要的同步和数据交换。
多线程支持
数学引擎接口是线程安全的;同一实例可以在不同的网络和不同的线程中使用。
请注意,这可能会导致一些同步开销。
然而,神经网络实现不是线程安全的;网络只能在一个线程中运行。
ONNX支持
NeoML库还可以处理由其他框架创建的模型,只要它们支持ONNX格式。请参阅导入API的描述。但是,你不能将NeoML训练的模型导出为ONNX格式。
序列化格式
该库使用自己的二进制格式(由CArchive
,CArchiveFile
实现)来保存和加载训练好的模型。
GPU支持
在GPU上处理通常可以显著提高数学运算的性能。NeoML库在训练和运行模型时都使用GPU。这是一个可选设置,取决于你系统的硬件和软件功能。
要在GPU上工作,该库需要:
- Windows:支持CUDA® 11.2 upd. 1的NVIDIA® GPU卡。
- iOS:Apple GPU A7+。
- Android:支持Vulkan 1.0的设备。
- Linux/macOS:目前尚不支持GPU处理。
FineObj
NeoML库源于ABBYY内部基础设施。出于各种原因,ABBYY使用名为FineObj的跨平台框架。因此,开放库版本使用了该框架的一些基本元素。请参阅通用类描述。
C++接口
NeoML包含两个C++库:
算法库NeoML
该库提供实现各种高级算法的C++对象。它由几个部分组成:
NeoMathEngine
用于计算的数学引擎是一个单独的模块,实现了算法库中使用的低级数学函数。用户也可以调用这些函数,但通常不需要。
该模块针对不同平台有不同的实现。特别是,有一个使用GPU进行计算的实现。
数学引擎也是一组C++接口,在这里有描述。
Python模块
请参阅readthedocs.io上的Python模块详细文档。
Java接口
为了在Java和Kotlin中使用库的推理版本,我们提供了一个Java接口。
Objective-C接口
为了在Swift和Objective-C中使用库的推理版本,我们提供了一个Objective-C接口。
许可证
版权所有 © 2016-2020 ABBYY Production LLC。根据Apache License 2.0许可。请参阅许可证文件。