你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
我们将指导你完成在 Azure 上部署CNTK模型所需的步骤,并将 Web 请求发送到 Azure 终结点,以针对已部署的模型评估数据。 我们将以 WebApi 的形式构建此功能,但侧重于最基本的 Azure 功能。 请参阅更高级的 Azure 文档,了解所有高级功能,即参数传递等。
要求
由于我们当前正在使用 VS2015 生成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,你也能遵循大部分步骤。
让我们开始
我们已经创建了一个名为 EvalDll_AzureTutorial的项目蓝图。 此项目是CNTK GitHub存储库的一部分,可在文件夹中Examples\Evaluation\LegacyEvalDll\EvalDll_AzureTutorial
找到。
请注意,示例项目正在使用 CNTK EvalDll API。 对于使用 Python 训练的模型的用户,请使用CNTK库 API。 有关使用 CNTK 库的教程,请参阅使用 CNTK 库托管 API 在 Azure WebApi 中评估模型
建议从此解决方案开始,因为我们已添加所需的所有代码。 为了完成,此处是用于创建教程项目的操作列表:
我们从 :EvalDll_AzureTutorial 开始在 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存储库Examples\Evaluation\LegacyEvalDll\CSEvalClient\Program.cs
的 CNTK Eval 示例 (方法EvaluateImageClassificationModel
中采用了此函数添加了文件
CNTKImageProcessing.cs
以添加位图大小调整功能。 这源自命名空间和类名称中的Examples\Evaluation\ImageExtension\CNTKImageProcessing.cs
CNTK存储库解决方案中创建的二进制文件的目录需要添加到
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
并安装最新的包版本 (Microsoft.Research.CNTK.*
) 。
现在我们需要一个模型来评估。 下载 ResNet_18.model 并将其保存在解决方案中的目录中 CNTK\Models
。 还需要将模型文件包含在解决方案 (Project -> Add existing Item
)
CNTK需要 64 位运行时环境。 请确保在Configuration Manager为 x64 平台编译项目。 此外,我们正在创建的 WebApi 必须托管在 IIS 的 64 位实例中。 可以通过选择“对网站和项目使用 64 位版本的 IIS Express”来强制实施此目标Tools -> Options -> Project and Solutions -> WebProjects
此时,你已执行了在计算机上本地执行模型所需的所有步骤。 在Visual Studio按F5
运行项目。 这将在默认网站上打开 Internet 浏览器并显示错误消息。 这是预期,因为我们创建了一个 WebApi 而不是网站。 通过将浏览器中的地址更改为:
http://localhost:<portnumber>/api/values
这将在ValuesController-Class中调用 Get()
该方法,这将反过来调用该方法 EvaluateCustomDNN()
并将结果返回到 Web 浏览器
在 Azure 上托管 WebApi
有了这个,我们完成了任务的第一部分,现在我们需要在 Azure 中托管的此功能!
从项目的“生成”菜单中,选择 Publish
该命令。 选择 Microsoft Azure App Service
作为发布目标
在 AppService 对话框中,必须使用帐户登录并选择相应的订阅和资源组。 请务必选择支持 64 位虚拟机的资源组, (“免费”资源组不足以用于此) 。 在最终发布步骤中,必须在“设置”菜单中选择 x64 配置。 这还需要将CNTK的本机二进制组件发布到 Azure
发布模型并在浏览器中调用已发布的 WebApi 后,将看到错误消息。 打开Azure 门户并确保 WebApi 在 64 位平台上运行, (更改并根据需要“保存”设置,这也会在 Azure) 中重启虚拟机实例。
执行这些更改后,你将能够在 WebApi 下调用 WebApi http://<yourwebapp>.azurewebsites.net/api/values
此项目演示了如何在 Azure WebApi 中使用 EvalDll 集成 CNTK EvalDll 功能,并设置 Azure 以运行CNTK eval 二进制文件。 在下一步中,现在可以添加新 API,以动态向 eval 函数提供数据或上传新模型版本。 这些是 WebApi/Azure 开发任务,应参考 Azure 文档了解这一点。