你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Windows上的模型评估
目前,CNTK提供 C++、C#/.NET、Python 和 Java 中的库,用于加载和评估Windows上的模型。 从 v2.1 开始,CNTK还支持 通用 Windows 平台 (UWP) 。
使用 C#/.NET 托管 API
CNTK库提供托管 (.NET) 库,用于使用 C# 和其他 .NET 语言评估 CPU 和 GPU 上的CNTK模型。 NuGet包CNTK。CPUOnly 设计用于在 CPU 和CNTK上执行。GPU 设计用于在具有 NVIDIA GPU 的设备上执行。 请参阅NuGet包页,详细了解如何安装CNTK库NuGet包。 请注意,Visual Studio 2017 是必需的,项目属性中的目标平台应为 X64。
CNTK库托管 API 允许在 (CPU 或 GPU) 的指定设备上加载和评估预先训练的模型。 它还提供了不同的方法来帮助你以密集的单热向量或稀疏 CSC 格式准备输入和输出数据。 输入数据可以是单个样本、多批样本、样本序列或具有可变长度的一批序列。 有关批处理和序列格式的详细说明,请参阅概念CNTK页面。 评估后,API 提供了用于获取结果的便捷方法。
C#/.NET 编程指南
使用CNTK库托管 API 进行模型评估的常见步骤包括:
- 根据 CPU 或 GPU 的使用) ,安装适当的NuGet包 (CPU 或 GPU。 CNTK NuGet包中介绍了详细信息。
- 按 Function.Load () 加载模型。 返回的值是
Function
引用已加载模型的实例。 - 如果需要,请通过调用属性
Arguments
Output
或Outputs
Load () 返回的函数实例获取已加载模型的输入和输出。 输入和输出表示为Variable
。 有关每个输入或输出的详细信息,例如Name
,也可以Shape
通过调用变量的相应属性找到。 - 对于每个输入,准备用于评估的输入数据。 根据使用情况,输入数据可能包括一个样本、一批多个样本、一系列样本或一批长度可变的序列。 对于存储,输入数据可以采用密集格式、单热向量或稀疏 CSC 格式。 对象
Value
用于表示具有不同内容和格式的输入数据。 CNTK API 提供了不同的方法,以便从普通用户数据轻松创建 Value 对象。CreateBatch()
创建包含一批单个或多个样本的 Value 对象。CreateSequence()
创建包含多个样本序列的 Value 对象。 可以指定此序列是前一次调用此方法的序列列表中的同一个索引处的上一个序列的新序列还是延续。CreateBatchOfSequences()
创建包含一批序列的 Value 对象。 每个序列都有一个可变的样本长度。 上述所有方法都支持密集的单热向量或稀疏 CSC 格式。
Evaluate()
调用该方法以执行评估。 该参数arguments
定义输入变量及其关联的值,并outputs
定义输出变量。 如果输出变量的 Value 对象为null
,CNTK库为输出值分配实际存储。 返回时,Evaluate () 会将评估结果保存到与输出变量关联的 Value 对象中。GetDenseData()/GetOneHotData()
调用输出值的方法以纯数据格式获取结果。 它将存储在 Value 对象中的数据作为具有可变长度样本的序列列表复制到缓冲区中,无论采用密集格式还是单热向量格式, (稀疏格式的支持将很快添加到) 。
CNTK库 C#/.NET 托管 API 页中介绍了CNTK库托管 API。
并行评估多个请求
CNTK支持并行评估多个请求。 由于在同一模型实例上运行评估不是线程安全的,因此首先需要通过调用 Clone () 和 ParameterCloningMethod.Share
克隆 () 来创建多个模型实例,然后每个线程使用单独的模型实例进行评估。 演示如何EvaluateMultipleImagesInParallelAsync()
使用 CNTK C#/.NET 托管 API 评估并发请求。
异步运行评估
CNTK C# API 没有评估 () 的异步方法,因为评估是 CPU 绑定的操作, (请参阅 [本文] (https://blogs.msdn.microsoft.com/pfxteam/2012/03/24/should-i-expose-asynchronous-wrappers-for-synchronous-methods/) ,了解详细说明) 。 但是,在某些用例(例如卸载响应能力)中,需要异步运行评估,本示例 EvaluationSingleImageAsync()
展示了如何使用扩展方法 EvaluateAsync()
实现此目的。
评估中间层
CNTK C# API 能够评估模型图中的中间层。 为此,可按其名称找到所需的层,并且可以评估中间层。 C # 中的 EvaluateIntermediateLayer () 示例演示了如何在模型中评估中间层。
评估多个节点的输出
CNTK可以将输出合并到单个节点中来评估模型图中的多个节点。 C # 中的 EvaluateCombinedOutputs () 示例演示如何评估多个输出。
C# 示例
CNTKLibraryCSEvalExamples 演示如何使用 CNTK Library NuGet 包评估 C# 中的模型。 有关生成和运行示例,请参阅 Eval 示例 页。
如果不想使用NuGet包,可以添加Cntk.Core.Managed-<VERSION>.dll
为对项目的引用。 可以在Cntk.Core.Managed
CNTK发布页上的CNTK二进制发布包中找到 DLL 和所有依赖 DLL。 请确保 Cntk.Core.Managed
DLL 的路径及其 依赖项 (在此页末尾查看列表,) 包含在应用程序的 DLL 的搜索路径中。
使用 C++
CNTK库 C++ API 支持 C++ 应用程序中的模型评估。 支持标准桌面应用程序和通用 Windows 平台应用程序。 Visual Studio 2017 是必需的,项目属性中的目标平台应为 X64。
CNTK NuGet包CNTK。CPUOnly 和 CNTK。GPU 包含用于在桌面应用程序中使用CNTK的 C++ CNTK库。 若要在通用 Windows 平台上使用CNTK,请安装CNTK。UWP。CPUOnly。 通过使用NuGet包,自动将有关 include 和库目录的配置添加到项目属性。 支持调试和发布版本。 NuGet包页介绍了如何获取和安装CNTK NuGet包。
C++ 编程指南
以下步骤介绍如何使用 C++ CNTK库进行模型评估。
- 将
Cntk.Core-<VERSION>.lib
导入库链接到应用程序。 如果使用NuGet包,则可以省略此步骤。 对于 UWP 应用程序,库名称为Cnkt.Core_app-<Version>.lib
. - 包括评估头文件“CNTKLibrary.h”。
- 按
CNTK::Function::Load()
. 加载模型。 返回的 Function 对象表示模型的计算图。 - 为每个输入变量准备数据。 可以使用
CNTK::Value::CreateBatch()
、CNTK::Value::CreateSequence()
或CNTK::Value::CreateBatchOfSequences()
从输入数据创建 Value 对象,这些对象分别代表一批样本、一系列样本或一批样本。 - 调用
CNTK::Function::Evaluate()
评估。 预期Evaluate()
为输入变量和输入值的unordered_map,以及输出变量和输出值的unordered_map。 输出值对象可能null
意味着CNTK库为此输出值分配实际存储。 返回时,与输出变量关联的 Value 对象包含计算结果。 - 从评估结果中获取输出数据。 用于
CNTK::Value::CopyVariableValueTo()
将 Value 对象中存储的数据作为样本长度可变的序列列表复制到缓冲区中。
对于多个请求的并发评估, CNTK::Function::Clone()
应在 Evaluate () 之前调用。 演示如何ParallelEvaluationExample()
使用 CNTK C++ 库 API 并行评估多个请求。
有关用于评估的 C++ CNTK库 API 的详细信息,请参阅CNTK库 C++ 评估接口页。
C++ 示例
C++ 示例 CNTKLibraryCPPEvalCPUOnlyExamples
并 CNTKLibraryCPPEvalGPUExamples
演示上述使用模式。 UWPImageRecognition 包含使用 CNTK UWP 库进行模型评估的示例。 Eval 示例页提供了有关生成和运行示例的详细步骤。
或者,可以在不使用 NuGet 包的情况下使用 C++ CNTK库。 可以从CNTK发布页获取Cntk.Core-<VERSION>.lib
(或Cntk.Core_app-<Version>.lib
) 和所有依赖 DLL,也可以从CNTK源代码生成它们。 还需要配置包含和库路径以指向正确的目录,并确保CNTK库的“调试”或“发布”) 的生成 (配置与项目设置 (相同;否则,) 会出现意外异常。 CNTK发布包仅包含二进制文件的发布版本。
使用 Windows 应用程序传送CNTK库
CNTK库要求将 Visual Studio 2017 Visual C++ 可再发行程序包 包安装在要运行应用程序的系统上。 项目属性中的目标平台应为 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,除了包括以下 NVIDIA CUDA 相关 DLL 外,还需要:
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。 可以在 Nuget 包 CNTK.UWP.CPUOnly
中找到这些 DLL。
Cntk.Core_app-<VERSION>.dll
Cntk.Math_app-<VERSION>.dll
libopenblas.dll
使用 Python
可以使用 Python 评估预先训练的模型。 可 在此处找到示例。
使用 Java
CNTK还提供用于在 Java 应用程序中评估模型的 API。 请注意,CNTK Java API 仍处于试验性,并可能会发生更改。
Java 示例演示如何使用 Java API 评估 CNN 模型。
若要使用 CNTK Java 库,请将该文件添加到 cntk.jar
classpath
Java 项目。 如果使用 IDE,则应将其添加为非托管 jar。 可以在文件夹 cntk\cntk\cntk\java) 中的CNTK二进制版本包 (中找到 cntk.jar 文件。 还可以从CNTK源生成 cntk.jar。 另请设置为java.library.path
包含Cntk.Core.JavaBinding-<Version>.dll
的目录,并确保包含CNTK二进制 DLL 的目录位于系统的 DLL 搜索路径中,例如,将目录添加到 PATH 环境变量。 请注意,还需要为 Visual Studio 2017 安装Visual C++ 可再发行程序包包。 如果进入 UnsatisfiedLinkErrors
Java,这通常是因为目录不在 DLL 搜索路径 (或错误的顺序) 。
Java 库目前使用 64 位 Oracle JDK 8 生成和测试。