
O NEOML é uma estrutura de aprendizado de máquina de ponta a ponta que permite construir, treinar e implantar modelos ML. Essa estrutura é usada por engenheiros de Abbyy para visão computacional e tarefas de processamento de linguagem natural, incluindo pré -processamento de imagens, classificação, análise de layout de documentos, OCR e extração de dados de documentos estruturados e não estruturados.
Principais recursos:
A versão completa da biblioteca C ++ foi testada nas plataformas:
| Target OS | Compilador | Arquitetura |
|---|---|---|
| Windows 7+ (CPU e 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+ | Armebi-V7a, Arm64-V8a, x86, x86_64 |
As versões da biblioteca Java e Objective-C de inferência foram testadas nas plataformas:
| Target OS | Compilador | Arquitetura |
|---|---|---|
| iOS 11+ (CPU, GPU) | Apple Clang 12+ | ARM64-V8A, x86_64 |
| Android 5.0+ (CPU), Android 7.0+ (GPU) | Clang 7+ | Armebi-V7a, Arm64-V8a, x86, x86_64 |
A biblioteca é construída com CMake (versões recomendadas 3.18 e posterior).
Para o melhor desempenho da CPU no Windows, Linux e MacOS, usamos o Intel MKL.
Ao processar em uma GPU, você pode opcionalmente usar o CUDA (versão 11.2 UPD.1) no Windows ou Linux e Vulkan (versão 1.1.130 e posterior) no Windows, Linux ou Android.
Também usamos o teste do Google para testes e buffers do Google Protocol para trabalhar com o formato do modelo ONNX.
Utilizamos o gerador muito convinhoso do código JIT XBYAK para acelerar algumas convoluções nos processadores x86_64.
Veja aqui as instruções sobre como criar a versão da biblioteca C ++ para diferentes plataformas.
Veja aqui as instruções sobre como criar as versões Java e Objective-C que executariam apenas as redes neurais treinadas.
Vários tutoriais com código de amostra ajudarão você a começar a trabalhar com a biblioteca:
A biblioteca foi desenvolvida com esses princípios em mente:
A interface do usuário é completamente separada dos cálculos de baixo nível implementados por um mecanismo de matemática.
A única coisa que você precisa fazer é especificar no início do tipo de mecanismo de matemática que será usado para cálculos. Você também pode optar por selecionar o mecanismo de matemática automaticamente, com base na configuração do dispositivo detectada.
O restante do seu código de aprendizado de máquina será o mesmo, independentemente do mecanismo de matemática que você escolher.
Cada rede funciona com uma instância do mecanismo matemática e todas as suas camadas deveriam ter sido criadas com o mesmo mecanismo de matemática. Se você escolheu um mecanismo de matemática da GPU, ele executará todos os cálculos. Isso significa que você não pode optar por usar uma CPU para cálculos "leves", como adicionar vetores e uma GPU para cálculos "pesados", como multiplicar matrizes. Introduzimos essa restrição para evitar sincronizações desnecessárias e troca de dados entre dispositivos.
A interface do motor matemática é segura para roscas; A mesma instância pode ser usada em diferentes redes e threads diferentes.
Observe que isso pode implicar alguma sobrecarga de sincronização.
No entanto, a implementação da rede neural não é segura para threads; A rede pode ser executada apenas em um thread.
A biblioteca NEOML também trabalha com os modelos criados por outras estruturas, desde que suportem o formato ONNX. Veja a descrição da API de importação. No entanto, você não pode exportar um modelo NEOML para o formato ONNX.
A biblioteca usa seu próprio formato binário (implementado por CArchive , CArchiveFile ) para salvar e carregar os modelos treinados.
O processamento na GPU geralmente ajuda a melhorar significativamente o desempenho das operações matemáticas. A biblioteca NEOML usa a GPU para treinamento e execução dos modelos. Esta é uma configuração opcional e depende dos recursos de hardware e software do seu sistema.
Para trabalhar na GPU, a biblioteca exige:
A biblioteca NEOML se origina na infraestrutura interna de Abbyy. Por vários motivos, Abbyy usa uma estrutura de plataforma cruzada chamada FineObj. Por esse motivo, a versão aberta da biblioteca usa algumas dessas primitivas da estrutura. Veja a descrição das classes comuns.
O NEOML contém duas bibliotecas C ++:
A biblioteca fornece objetos C ++ que implementam vários algoritmos de alto nível. Consiste em várias partes:
O mecanismo de matemática usado para cálculos é um módulo separado que implementa as funções matemáticas de baixo nível usadas na biblioteca de algoritmos. O usuário também pode chamar essas funções, mas geralmente nunca precisa.
Este módulo possui implementações diferentes para diferentes plataformas. Em particular, há uma implementação que usa uma GPU para cálculos.
O mecanismo de matemática também é um conjunto de interfaces C ++ descritas aqui.
Consulte a extensa documentação do módulo Python no ReadThedocs.io.
Para trabalhar com a versão de inferência da biblioteca em Java e Kotlin, fornecemos uma interface Java.
Para trabalhar com a versão de inferência da biblioteca em Swift e Objective-C, fornecemos uma interface Objective-C.
Copyright © 2016-2020 Abbyy Production LLC. Licenciado sob a licença Apache, versão 2.0. Veja o arquivo de licença.