在 SQL Server 中使用 sp_rxPredict 进行实时评分

适用于:SQL Server 2016 (13.x) 及更高版本

了解如何在 SQL Server 中使用 sp_rxPredict 系统存储过程执行实时评分,从而在预测工作负载时实现高性能的预测或评分。

sp_rxPredict 的实时评分与语言无关,执行时不依赖于机器学习服务中的 R 或 Python 运行时。 在 SQL Server 中使用通过 Microsoft 函数创建和定型的一个模型,将它序列化为二进制格式,则可以使用实时评分在没有安装 R 或 Python 加载项的 SQL Server 实例上生成新数据输入的预测结果。

实时评分的工作原理

支持对基于 R 中的 RevoScaleRMicrosoftML,或 Python 中的 revoscalepymicrosoftml 中的函数的特定模型类型进行实时评分。 它根据提供给存储为特殊二进制格式的机器学习模型的用户输入来使用本机 C++ 库生成评分。

因为无需调用 Microsoft 机器学习服务中的外部语言运行时即可将已训练的模型用于评分,所以减少了多个进程的开销。

实时评分是一个多步骤流程:

  1. 基于每个数据库启用执行评分的存储过程。
  2. 以二进制格式加载已预定型的模型。
  3. 提供要评分的新输入数据(表格或各行)作为模型的输入。
  4. 若要生成分数,请调用 sp_rxPredict 存储过程。

先决条件

  • 启用 SQL Server CLR 集成

  • 启用实时评分

  • 必须使用下面列出的某个受支持的 rx 算法预定型模型 。 有关详细信息,请参阅 sp_rxPredict支持的算法

  • 使用适用于 R 的 rxSerialize 或适用于 Python 的 rx_serialize_model 对模型进行序列化。 已对这些序列化函数进行了优化,以支持快速评分。

  • 将模型保存到要从中调用该模型的数据库引擎实例。 此实例不需要具有 R 或 Python 运行时扩展。

注意

实时评分目前已经过优化,可快速预测较小的数据集,从几行到数十万行的数据不等。 对于大数据集,使用 rxPredict 进行预测的速度可能会更快。

启用实时评分

对要用于评分的每个数据库启用此功能。 服务器管理员应运行包含在 RevoScaleR 包中的命令行实用工具 RegisterRExt.exe。

注意

若要进行实时评分,需要在实例中启用 SQL CLR 功能,并且需要将数据库标记为可信。 运行脚本时,系统将为你执行这些操作。 但是,在此之前,请仔细考虑其他的安全隐患!

  1. 打开提升的命令提示符,并导航到 RegisterRExt.exe 所在的文件夹。 在默认安装中可以使用以下路径:

    <SQLInstancePath>\R_SERVICES\library\RevoScaleR\rxLibs\x64\

  2. 运行以下命令,替换要从中启用扩展存储过程的实例和目标数据库的名称:

    RegisterRExt.exe /installRts [/instance:name] /database:databasename

    例如,若要将扩展存储过程添加到默认实例上的 CLRPredict 数据库中,请键入:

    RegisterRExt.exe /installRts /database:CLRPRedict

    如果数据库在默认实例上,实例名称则是可选的。 如果使用的是命名实例,请指定实例名称。

  3. RegisterRExt.exe 创建以下对象:

    • 受信任的程序集
    • 存储过程 sp_rxPredict
    • 新数据库角色 rxpredict_users。 数据库管理员可以使用此角色向使用实时评分功能的用户授予权限。
  4. 将需要运行 sp_rxPredict 的任何用户添加到新角色中。

备注

SQL Server 2017 及更高版本中提供了其他安全措施来防止出现 CLR 集成问题。 这些措施还对此存储过程的使用施加了其他限制。

禁用实时评分

若要禁用实时评分功能,请打开提升的命令提示符,并运行以下命令:RegisterRExt.exe /uninstallrts /database:<database_name> [/instance:name]

示例

本示例介绍准备和保存实时预测模型所需的步骤,并提供有关如何使用 R 从 T-SQL 调用函数的示例。

步骤 1。 准备并保存模型

sp_rxPredict 所需的二进制格式与使用 PREDICT 函数所需的格式相同。 因此,将对 rxSerializeModel 的一个调用包含在你的 R 代码中,并确保指定 realtimeScoringOnly = TRUE,如本示例所示:

model <- rxSerializeModel(model.name, realtimeScoringOnly = TRUE)

步骤 2. 调用 sp_rxPredict

像调用任何其他存储过程一样调用 sp_rxPredict。 在当前版本中,此存储过程仅采用两个参数:@model,用于二进制格式的模型;以及 @inputData,用于评分中要使用的数据,定义为有效的 SQL 查询。

由于二进制格式与 PREDICT 函数使用的格式相同,因此可以使用先前示例中的模型和数据表。

DECLARE @irismodel varbinary(max)
SELECT @irismodel = [native_model_object] from [ml_models]
WHERE model_name = 'iris.dtree' 
AND model_version = 'v1'

EXEC sp_rxPredict
@model = @irismodel,
@inputData = N'SELECT * FROM iris_rx_data'

备注

如果用于评分的输入数据不包含符合模型要求的列,对 sp_rxPredict 的调用则会失败。 目前仅支持以下 .NET 数据类型:double、float、short、ushort、long、ulong 和 string。

因此,你可能需要在输入数据中筛选掉不受支持的类型,然后再将它用于实时评分。

有关相应的 SQL 类型的信息,请参阅 SQL-CLR 类型映射映射 CLR 参数数据

后续步骤