你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 CNTK 库托管 API 评估 Azure WebApi 中的模型

通过 Azure 机器学习命令行进行部署

在 Azure 上部署 CNTK 模型并能够通过 Web API 运行部署的模型的方法之一是通过命令行接口到 Azure 机器学习。 单击此处了解操作方法。

通过 ASP.NET 进行部署

我们将指导你完成在 Azure 上部署 CNTK 模型所需的步骤,并将 Web 请求发送到 Azure 终结点,以针对已部署的模型评估数据。 我们将以 WebApi 的形式构建此功能,但侧重于最基本的 Azure 功能。 请参阅更高级的 Azure 文档,了解所有高级功能,即参数传递等。

要求

由于我们当前正在使用 VS2017 生成 CNTK,因此我们专注于此版本的 Visual Studio。

Visual Studio 的 Web 开发功能

需要在 Visual Studio 中启用Web-Development功能。 可以看到此功能是否在 (启用,并在必要时启用) ,方法是再次 (Control Panel -> Program and Features -> Microsoft Visual Studio 201x执行 VS 安装程序,右键单击并选择 Change 以调用 VS 安装程序)

Azure SDK

需要在开发计算机上安装用于 .NET 的 Azure SDK。 此下载页为: Azure SDK 下载

Azure 帐户

由于我们要在 Azure 上托管 CNTK 模型,因此需要一个 Azure 帐户。 如果你有 MSDN 或 Visual Studio 订阅,该帐户将足以托管本教程的模型。 CNTK 需要一个 64 位虚拟机来托管,一个免费的 Azure 帐户不包括此功能,并且是不够的。

最初,我们将在本地开发 WebApi,然后将其上传到 Azure 实例。 因此,即使无法访问 Azure,你也能遵循大部分步骤。

让我们开始

我们已经创建了一个名为 CNTKAzureTutorial01 的项目蓝图。 此项目是 CNTK GitHub 存储库的一部分,可在文件夹中 Examples\Evaluation\CNTKAzureTutorial01找到。

请注意,示例项目使用的是 CNTK 库托管 API。 对于使用 EvalDll API 的用户,若要评估模型,请使用 CNTK EvalDLL API。 有关使用 EvalDll 的教程,请参阅 使用 EvalDll 在 Azure WebApi 中评估模型

建议从此解决方案开始,因为我们已添加所需的所有代码。 为了完成,此处是用于创建教程项目的操作列表:

  • 我们从 :CNTKAzureTutorial01 开始在 VisualStudio File->New->Project->Visual C#->Web->ASP.NET WebApplication中创建新的项目/解决方案。 我们选取了一个 Azure API 应用模板,添加了对“Web API”的引用,并确保它托管在本地 ( 托管在云中–但) 。

  • 然后,我们执行了以下代码更改来生成教程项目:

    • 在 ValueController.cs 中,我们添加了一些必需的 using 指令

    • 替换了代码 public async Task<IEnumerable<string>> Get() 以实际调用 CNTK 评估函数

    • 添加了函数 public async Task<string[]> EvaluateCustomDNN(string imageUrl)。 我们从 CNTK Eval 示例中采用此函数, (EvaluateImageClassificationModel 文件中 Examples\Evaluation\CSEvalClient\Program.cs CNTK 存储库)

    • 添加了文件 CNTKImageProcessing.cs 以添加位图大小调整功能。 这源自 CNTK 存储库的 Examples\Evaluation\ImageExtension\CNTKImageProcessing.cs 命名空间和类名称

    • 解决方案中创建的二进制文件的目录需要添加到 PATH 应用程序的环境。 这是必需的,因为我们的项目包含本机 DLL,并且只有在标准搜索路径中可以访问它们时才加载这些 DLL。 我们在方法中添加Application_Start()了以下代码:global.asax

         string pathValue = Environment.GetEnvironmentVariable("PATH");
         string domainBaseDir = AppDomain.CurrentDomain.BaseDirectory;
         string cntkPath = domainBaseDir + @"bin\";
         pathValue += ";" + cntkPath;
         Environment.SetEnvironmentVariable("PATH", pathValue);
      

在本地托管 WebApi

这些是到目前为止我们执行的更改。 我们仍然需要获取项目中包含的 CNTK Eval 功能,并需要一个模型进行评估。

将 CNTK Eval 功能添加到项目中。 这可用作 NuGet 包。 在 VS 选择 Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution...中,选择 nuget.org 为联机源,搜索 CNTK 并安装最新的包版本 (CNTK.GPUCNTK.CPUOnly) 到项目。

NuGet

现在我们需要一个模型来评估。 下载 ResNet20_CIFAR10_CNTK.model 并将其保存在项目文件夹下的目录中 CNTK\Models 。 还需要将模型文件包含在解决方案 (Project -> Add existing Item)

CNTK 需要 64 位运行时环境。 请确保在Configuration Manager为 x64 平台编译项目。 此外,我们正在创建的 WebApi 必须托管在 IIS 的 64 位实例中。 可以通过选择“对网站和项目使用 64 位版本的 IIS Express”来强制实施此目标Tools -> Options -> Project and Solutions -> WebProjects

Project

此时,你已执行了在计算机上本地执行模型所需的所有步骤。 在 Visual Studio 中按 F5 运行项目。 这将在默认网站上打开 Internet 浏览器并显示错误消息。 这是预期,因为我们创建了一个 WebApi 而不是网站。 通过将浏览器中的地址更改为:

http://localhost:<portnumber>/api/values

这将在ValuesController-Class中调用 Get() 该方法,这将反过来调用该方法 EvaluateCustomDNN() 并将结果返回到 Web 浏览器

当地

在 Azure 上托管 WebApi

有了这个,我们完成了任务的第一部分,现在我们需要在 Azure 中托管的此功能! 从项目的“生成”菜单中,选择 Publish 该命令。 选择 Microsoft Azure App Service 作为发布目标

Azure

在 AppService 对话框中,必须使用帐户登录并选择相应的订阅和资源组。 请务必选择支持 64 位虚拟机的资源组, (“免费”资源组不足以用于此) 。 在最终发布步骤中,必须在“设置”菜单中选择 x64 配置。 这还需要将 CNTK 的本机二进制组件发布到 Azure

AzureSettings

发布模型并在浏览器中调用已发布的 WebApi 后,将看到错误消息。 打开Azure 门户并确保 WebApi 在 64 位平台上运行, (更改并根据需要“保存”设置,这也会在 Azure) 中重启虚拟机实例。

Azure64Settings

执行这些更改后,你将能够在 WebApi 下调用 WebApi http://<yourwebapp>.azurewebsites.net/api/values

AzureSettings

此项目演示如何在 Azure WebApi 中使用 CNTK 库托管 API 集成 CNTK Eval 功能,并设置 Azure 以运行 CNTK eval 二进制文件。 在下一步中,现在可以添加新 API,以动态向 eval 函数提供数据或上传新模型版本。 这些是 WebApi/Azure 开发任务,应参考 Azure 文档了解这一点。