Поделиться через


Оценка модели в Windows

В настоящее время CNTK предоставляет библиотеки в C++, C#/.NET, Python и Java для загрузки и оценки моделей на Windows. Начиная с версии 2.1, CNTK также поддерживает универсальная платформа Windows (UWP).

Использование управляемого API C#/.NET

Библиотека CNTK предоставляет управляемую библиотеку (.NET) для оценки моделей CNTK на ЦП и GPU с помощью C# и других языков .NET. Пакет NuGet CNTK. CpuOnly предназначен для выполнения на ЦП и CNTK. GPU предназначен для выполнения на устройствах с GPU NVIDIA. Дополнительные сведения об установке пакетов NuGet библиотеки CNTK см. на странице пакета NuGet. Обратите внимание, что требуется Visual Studio 2017 г., а целевая платформа в свойстве проекта должна быть X64.

Управляемый API библиотеки CNTK позволяет загружать и оценивать предварительно обученные модели на указанных устройствах (ЦП или GPU). Он также предоставляет различные способы подготовки входных и выходных данных в плотном, горячем векторе или разреженном формате CSC. Входные данные могут быть одним примером, пакетом из нескольких выборок, последовательностью выборок или пакетом последовательностей с переменной длиной. Подробное описание формата пакета и последовательности можно найти на странице CNTK Концепции. После оценки API предоставляет удобные методы для получения результатов.

Руководство по программированию C#/.NET

Ниже приведены обычные шаги для оценки модели с помощью управляемого API библиотеки CNTK:

  1. Установите соответствующий пакет NuGet (ЦП или GPU в зависимости от использования). Подробные сведения описаны в пакете CNTK NuGet.
  2. Загрузите модель по Function.Load().. Возвращаемое значение — это Function экземпляр, ссылающийся на загруженную модель.
  3. При необходимости получите входные и выходные данные загруженной модели путем вызова свойств Argumentsили Outputs экземпляра функции, Output возвращаемого load(). Входные и выходные данные представлены в виде Variable. Дополнительные сведения о каждом отдельном входе или выходе, например Name , Shape можно найти путем вызова соответствующих свойств переменной.
  4. Для каждого входного параметра подготовьте входные данные для оценки. В зависимости от использования входные данные могут состоять из одного образца, пакета из нескольких выборок, последовательности выборок или пакета последовательностей с переменной длиной. Что касается хранилища, входные данные могут быть в плотном формате, однократном векторе или разреженном формате CSC. Объект Value используется для представления входных данных с различным содержимым и форматами. API CNTK предоставляет различные методы для легкого создания объекта Value на основе простых пользовательских данных.
    • CreateBatch() создает объект Value, содержащий пакет из одного или нескольких примеров.
    • CreateSequence() создает объект Value, содержащий последовательность с несколькими примерами. Можно указать, является ли эта последовательность новой или продолжением предыдущей последовательности с тем же индексом в списке последовательностей из предыдущего вызова этого метода.
    • CreateBatchOfSequences() создает объект Value, содержащий пакет последовательностей. Каждая последовательность имеет переменную длину выборок. Все приведенные выше методы поддерживают как плотный, один горячий вектор, так и разреженный формат CSC.
  5. Вызовите Evaluate() метод для выполнения оценки. Параметр arguments определяет входные переменные и связанные с ними значения и outputs определяет выходные переменные. Если объект Value выходной переменной имеет значениеnull, CNTK Библиотека выделяет фактическое хранилище для выходного значения. При возвращении Evaluate() сохраняет результаты оценки в объекты Value, связанные с выходными переменными.
  6. GetDenseData()/GetOneHotData() Вызовите метод выходного значения, чтобы получить результаты в формате обычных данных. Он копирует данные, хранящиеся в объекте Value, в буфер в виде списка последовательностей с выборками переменной длины либо в плотном формате, либо в формате с одним горячим вектором (поддержка разреженного формата будет добавлена в ближайшее время).

Управляемый API библиотеки CNTK описан на странице C# или .NET управляемого API библиотеки CNTK.

Параллельное вычисление нескольких запросов

CNTK поддерживает параллельное вычисление нескольких запросов. Так как выполнение оценки на одном экземпляре модели не является потокобезопасной, сначала необходимо создать несколько экземпляров модели путем вызова Clone(), ParameterCloningMethod.Shareа затем каждый поток использует отдельный экземпляр модели для оценки. В EvaluateMultipleImagesInParallelAsync() этом примере показано, как оценивать параллельные запросы с помощью управляемого API CNTK C# или .NET.

Асинхронное выполнение оценки

CNTK C# API не имеет асинхронного метода для Evaluate(), так как оценка является операцией с привязкой к ЦП (см. [эту статью] (https://blogs.msdn.microsoft.com/pfxteam/2012/03/24/should-i-expose-asynchronous-wrappers-for-synchronous-methods/) для подробного объяснения). Однако в некоторых случаях требуется выполнить оценку асинхронно, например разгрузку для скорости реагирования, мы покажем, EvaluationSingleImageAsync() как добиться этого с помощью метода EvaluateAsync()расширения.

Оценка промежуточных слоев

CNTK C# API может оценить промежуточный уровень в графе модели. Таким образом, требуемый слой можно найти по его имени, и промежуточный слой можно оценить. В примере EvaluateIntermediateLayer() в C# показано, как оценить промежуточный уровень в модели.

Оценка выходных данных из нескольких узлов

CNTK может оценивать несколько узлов в графе модели, объединяя выходные данные в один узел. В примере EvaluateCombinedOutputs() в C# показано, как оценить несколько выходных данных.

примеры C#

В CNTKLibraryCSEvalExamples показано, как оценить модель в C# с помощью пакетов NuGet библиотеки CNTK. См. страницу примеров Eval для создания и выполнения примеров.

Если вы не хотите использовать пакет NuGet, можно добавить Cntk.Core.Managed-<VERSION>.dll в качестве ссылки на проект. Библиотеки Cntk.Core.Managed DLL и все зависимые библиотеки DLL можно найти в пакете двоичного выпуска CNTK на странице выпусков CNTK. Убедитесь, что путь к Cntk.Core.Managed библиотеке DLL и его зависимостям (см. список в конце этой страницы) включены в путь поиска библиотек DLL для приложения.

Использование C++

API библиотеки CNTK C++ поддерживает оценку модели в приложениях C++. Поддерживаются как стандартные классические приложения, так и универсальная платформа Windows приложения. Visual Studio 2017 требуется, а целевая платформа в свойстве проекта должна быть X64.

Пакет CNTK NuGet CNTK. CpuOnly и CNTK. GPU содержит библиотеку CNTK C++ для использования CNTK в классических приложениях. Чтобы использовать CNTK в универсальная платформа Windows, установите CNTK. UWP. CpuOnly. При использовании пакетов NuGet конфигурация для каталогов включения и библиотек автоматически добавляется в свойство проекта. Поддерживаются сборка отладки и выпуска. На странице пакета NuGet объясняется, как получить и установить пакеты CNTK NuGet.

Руководство по программированию на C++

Ниже описано, как использовать библиотеку CNTK C++ для оценки модели.

  1. Свяжите библиотеку импорта Cntk.Core-<VERSION>.lib с приложением. Этот шаг можно опустить, если используется пакет NuGet. Для приложения UWP имя библиотеки — Cnkt.Core_app-<Version>.lib.
  2. Включите файл заголовка оценки "CNTKLibrary.h".
  3. Загрузка модели по CNTK::Function::Load(). Возвращаемый объект Function представляет граф вычислений модели.
  4. Подготовьте данные для каждой входной переменной. Можно использовать CNTK::Value::CreateBatch()или CNTK::Value::CreateSequence()CNTK::Value::CreateBatchOfSequences() создать объект Value из входных данных, представляющих пакет выборок, последовательность выборок или пакет последовательностей выборок соответственно.
  5. Вызов CNTK::Function::Evaluate() для оценки. Ожидается Evaluate() в качестве входных unordered_map для входных переменных и входных значений, а также unordered_map для выходных переменных и выходных значений. Объект выходного значения может быть null таким, что CNTK Библиотека выделяет фактическое хранилище для этого выходного значения. При возврате объекты Value, связанные с выходными переменными, содержат результаты оценки.
  6. Получение выходных данных из результатов оценки. Используется CNTK::Value::CopyVariableValueTo() для копирования данных, хранящихся в объекте Value, в буфер в виде списка последовательностей с переменной длиной выборок.

Для параллельной оценки нескольких запросов CNTK::Function::Clone() следует вызывать перед Evaluate(). В ParallelEvaluationExample() этом примере показано, как параллельно оценивать несколько запросов с помощью API библиотеки CNTK C++.

Дополнительные сведения об API библиотеки CNTK C++ для оценки см. на странице интерфейса оценки библиотеки C++ CNTK.

Примеры C++

Примеры CNTKLibraryCPPEvalCPUOnlyExamples C++ и CNTKLibraryCPPEvalGPUExamples иллюстрируют приведенный выше шаблон использования. UWPImageRecognition содержит пример использования CNTK библиотеки UWP для оценки модели. На странице примеров Eval приведены подробные инструкции по созданию и выполнению примеров.

Кроме того, можно использовать библиотеку CNTK C++ без пакета NuGet. Вы можете получить Cntk.Core-<VERSION>.lib (илиCntk.Core_app-<Version>.lib) и все зависимые библиотеки DLL на странице выпусков CNTK или создать их из CNTK исходного кода. Кроме того, необходимо настроить путь включения и библиотеки, чтобы указать правильный каталог и убедиться, что конфигурация сборки (отладка или выпуск) библиотеки CNTK совпадает с конфигурацией проекта (в противном случае вы получите непредвиденные исключения). Пакет выпуска CNTK содержит только сборку двоичных файлов выпуска.

Доставка библиотеки CNTK с помощью приложения Windows

CNTK библиотеке требуется установить пакет Распространяемый компонент Visual C++ для Visual Studio 2017 в системе, в которой будет выполняться приложение. Целевая платформа в свойстве проекта должна быть X64.

На этой странице описывается, как именуются двоичные файлы CNTK.

Для классических приложений C++ следующие библиотеки DLL должны распространяться вместе с приложением.

  • Cntk.Core-<VERSION>.dll
  • Cntk.Math-<VERSION>.dll
  • libiomp5md.dll
  • mklml.dll

Если вы используете управляемую библиотеку C#/.NET, кроме перечисленных выше библиотек DLL, необходимо дополнительно включить следующие библиотеки DLL:

  • Cntk.Core.Managed-<VERSION>.dll
  • Cntk.Core.CSBinding-<VERSION>.dll

Для использования GPU необходимо добавить следующие библиотеки DLL, связанные с NVIDIA CUDA:

  • cublas64_90.dll
  • cudart64_90.dll
  • cudnn64_7.dll
  • curand64_90.dll
  • cusparse64_90.dll
  • nvml.dll

Примечание

Изменено в CNTK версии 2.1.

CNTK NuGet пакеты поставляемы с cuDNN 6 (cudnn64_6.dll).

Все эти библиотеки DLL можно найти в CNTK версии двоичного выпуска, см. на странице CNTK Выпуски.

Для приложений UWP необходимо распространять следующие библиотеки DLL вместе с приложением. Эти библиотеки DLL можно найти в пакете CNTK.UWP.CPUOnlyNuGet.

  • Cntk.Core_app-<VERSION>.dll
  • Cntk.Math_app-<VERSION>.dll
  • libopenblas.dll

Использование Python

Вы можете использовать Python для оценки предварительно обученной модели. Примеры можно найти здесь.

Использование Java

CNTK также предоставляет API-интерфейсы для оценки модели в приложении Java. Обратите внимание, что CNTK API Java по-прежнему экспериментальный и может быть изменен.

В примере Java показано, как оценить модель CNN с помощью API Java.

Чтобы использовать библиотеку Java CNTK, добавьте cntk.jar файл в classpath проект Java. Если вы работаете с интегрированной среде разработки, ее следует добавить в виде неуправляемого JAR-файла. Файл cntk.jar можно найти в пакете CNTK двоичного выпуска (в папке cntk\cntk\java). Кроме того, можно создать файл cntk.jar из CNTK источника. Также укажите java.library.path каталог, содержащийCntk.Core.JavaBinding-<Version>.dll, и убедитесь, что каталог, содержащий CNTK двоичные библиотеки DLL, находится в пути поиска dll системы, например путем добавления каталога в переменную среды PATH. Обратите внимание, что также необходимо установить пакет Распространяемый компонент Visual C++ для Visual Studio 2017 г. Если вы получаете UnsatisfiedLinkErrors в Java, это обычно связано с тем, что каталог не находится в пути поиска библиотеки DLL (или в неправильном порядке).

Библиотека Java в настоящее время создана и протестирована с помощью 64-разрядной версии Oracle JDK 8.