我们目前正在努力使 Azure 机器学习工作室试验可操作。
我们最近的迭代有一个 Web 作业,该作业接受队列消息,获取一些数据来训练模型,并使用 ML 试验 Web 服务将训练的模型放在 Blob 位置。
第二个 Web 作业接受队列消息,拉取要在预测实验中使用的数据,获取经过训练的 .ilearner 模型的位置路径,然后使用该 ML 实验 Web 服务。
用于进行预测的数据作为输入参数传入,存储帐户名称、密钥和 .ilearner 路径都作为全局参数传入,即根据数据科学家提供的内容定义的字典对象。
一切似乎都正常工作 - 除了在某些情况下,预测实验失败,并且错误消息清楚地表明使用了错误的.ilearner文件。
将不存在的 blob 路径传递到实验 Web 服务时,错误消息会反映没有此类 Blob,因此很明显,Web 服务至少验证了 .ilearner 的存在。
数据科学家可以在本地运行它,但是当他通过PowerShell在本地导出.ilearner文件时,必须更改该文件的名称。确保每个训练的模型都具有唯一的文件名并不能解决此问题。
当我在 Azure 存储资源管理器中查看所有文件时,它们似乎都根据上次修改日期按预期进行了更新。这几乎就像某处有一个 .ilearner 的缓存版本没有被正确覆盖。
在排除了传入错误文件的所有可能性后,我们的数据科学家仔细研究了实验本身。他发现它默认为他在开发中使用的一个硬编码的.ilearner路径。
在某个时间点,他创建了 Web 服务参数来覆盖此值(因此我在 Web 服务调用中定义了它们(,但是在实验的一次重新设计期间,任何人都注意到了它们,因为它们已被删除,因为 Web 服务显然会接受多余的参数。
Web 服务接受我的全局参数,显然甚至验证了它们。但是由于它们没有连接到实验中的任何内容,因此传递的.ilearner文件信息从未应用于任何内容- 无论如何都会应用硬编码的.ilearner。
我们都非常惊讶,没有关于将参数传递给实际未定义的 Web 服务的异常。如果发生这种情况,我们会更快地深入了解它。
tl/dr:实验未正确配置为接受 .ilearner 文件路径(或帐户名或帐户密钥(作为参数,并且 Web 服务很高兴地接受和忽略参数参数,而不会引发任何警报,因为它具有要运行的硬编码值。