RapidMiner StandPy
RapidMiner StandPy是可选模块RapidMiner AI Hub它增加了对始终在线的Python解释器的支持,以减少延迟。当将Python代码嵌入到RapidMiner进程中时,该模块可以用作替代Python环境。
默认情况下,RapidMiner启动一个新的Python解释器每个Python操作符都嵌入到RapidMiner进程中。对于大多数用例,这种行为是可取的,因为它保证了完整的脚本隔离,初始化Python解释器的100-1000ms开销通常可以忽略不计。
但是有一个例外:当将轻量级流程部署为web服务时,这种开销很可能是不可接受的。正是针对这个特定的用例,StandPy被设计为提供一种运行Python脚本的替代模式。
安装文档由以下部分组成:
先决条件
RapidMiner StandPy要求RapidMiner AI Hub 9.9.2或更新版本。特别地,您不能将RapidMiner StandPy与RapidMiner Server的独立发行版或RapidMiner Studio一起使用。
RapidMiner StandPy还需要Python脚本扩展9.9.2或更新版本。扩展应该同时安装在RapidMiner Studio和RapidMiner AI Hub(尽管前面的先决条件可以自动确保这一点)。
体系结构概述
下面的RapidMiner AI Hub简化架构图展示了两个RapidMiner StandPy容器如何集成到现有的基础设施中。至少需要部署一个容器。请注意,所有添加的组件都是独立的内部网络的一部分:
脚本执行的所有传入请求都经过RapidMiner stand - py路由器组件:
- 一个路由器可以与多个容器一起使用。
- 路由器可以从其他RapidMiner AI Hub组件到达,但不能从RapidMiner AI Hub外部到达。
- 该组件可用于设置额外的身份验证(可选)。
- 路由器本身不运行任何Python代码。
实际的脚本执行发生在RapidMiner stand - py容器实例:
- 每个容器从编码环境存储中激活一个Python环境。
- 该组件管理一个或多个始终打开的Python解释器。
- 容器和Python解释器不能访问主RapidMiner AI Hub网络。
- 除了Python解释器的状态外,容器是无状态的,也就是说,容器不会持久化提交的Python脚本。
此设置旨在将脚本执行与平台的其他部分隔离开来。特别是,身份验证和与其他组件的通信是在与运行Python脚本的容器分开的容器中实现的。
但是,对于运行在同一容器上的多个脚本所引起的副作用,该设置只能提供有限的保护。容器确实在单独的名称空间中执行脚本,但全局设置的更改将影响后续的运行。如果担心副作用,可以考虑使用多个RapidMiner StandPy容器,例如,考虑为生产部署使用单独的容器。
RapidMiner AI Hub设置
本节假设您正在使用RapidMiner提供的模板,使用基于Docker Compose的RapidMiner AI Hub部署。如果您正在使用其他容器运行时,请联系我们的支持。
让我们假设要配置两个RapidMiner StandPy容器,如上图所示:一个用于测试,另一个用于生产部署。这两个容器使用相同的Python环境example-project-environment
。本节将引导您完成以下步骤:
- 检查Python环境依赖关系
- 配置内部网络
- 配置路由器
- 配置两个容器
RapidMiner StandPy要求环境的依赖关系包含以下模块的最新版本。如果您正在扩展一个预定义的环境,这些模块可能已经安装:
依赖项:—numpy—pandas—fs—flask—libiconv—uwsgi
我们现在可以编辑docker-compose.yml
文件用于RapidMiner AI Hub。要创建内部网络的末尾,我们必须添加一行网络
块。一旦添加,它看起来可能如下所示:
rm-platform-int-net: rm-idp-db-net: rm-server-db-net: rm-coding-environment-storage-net: jupyterhub-user-net: name: jupyterhub-user-net-${JUPYTER_STACK_NAME} rm-go-int-net: rm-go-proxy-net: # RapidMiner StandPy的独立网络rm-stand -net:
我们现在可以添加路由器到服务
布洛克:
rm-standpy-router-svc:形象:${注册}rapidminer-standpy-router: 1.0主机名:rm-standpy-router-svc重启:总是环境:#引擎列表格式ENGINE_ < ENGINENAME > _HOST: - ENGINE_EXAMPLE_TESTING_HOST = standpy-container-testing ENGINE_EXAMPLE_PRODUCTION_HOST = standpy-container-production #可选的安全令牌格式ENGINE_ < ENGINENAME > _TOKEN: - ENGINE_EXAMPLE_PRODUCTION_TOKEN = secrettoken #限制请求大小(默认没有限制):# REQUEST_SIZE_LIMIT = 1 m网络:Rm-platform-int-net:别名:—stand -router rm-stand -int-net:别名:—stand -router
上面的配置为两个容器设置了路由example_testing
而且example_production
并使用安全令牌保护后者。请注意,我们将服务添加到两个平台网络rm-platform-int-net
以及RapidMiner StandPy的独立网络rm-standpy-int-net
我们在上一步中创建的。这是因为路由器将充当两个网络之间的网关。
接下来,我们可以把这两个相加容器参考上图:
rm-stand -container-testing-svc: image: ${REGISTRY}rapidminer-stand -container:1.0 read_only: true tmpfs: - /tmp hostname: rm-stand -container-testing-svc restart: always environment: - CONDA_ENV=example-project-environment #可选worker进程数(默认1个):- WORKERS=1 #可选请求超时时间(默认30秒):- timeout =45 #在给定请求数后重启worker进程。如果未设置,#自动重启将被禁用。- MAX_REQUESTS = 100卷:rm-coding-shared-vol: / opt / coding-shared: ro网络:rm-standpy-int-net:别名:——standpy-container-testing rm-standpy-container-production-svc:形象:${注册}rapidminer-standpy-container: $ {RM_VERSION} read_only:真正的tmpfs: - / tmp主机名:rm-standpy-container-production-svc重启:总是环境:- CONDA_ENV = example-project-environment #可选的工作进程(默认为1):-工人= 4 #可选的请求超时秒30(默认):- TIMEOUT=5 #在给定数量的请求后重新启动工作。如果未设置,#自动重启将被禁用。#—MAX_REQUESTS=100 volumes:—rm-coding-shared-vol:/opt/coding-shared:ro networks: rm-standpy-int-net: aliases:—stand -container-production
这两个服务配置除了名称和环境变量外完全相同。
测试容器只使用一个worker,因为吞吐量很可能无关紧要。超时时间相对宽裕,可以用于测试缓慢的脚本。最后,我们强制单个worker在100个请求后重新启动,以释放任何未使用的资源,例如不再使用的模块导入。乐鱼体育安装
生产集装箱使用四名工人来提高吞吐量。让我们假设通过测试脚本,我们知道所有脚本都应该在一秒钟内完成,并且没有内存建立。因此,我们可以设置一个积极的超时来尽早中止错误的请求,并禁用工作线程的周期性重新启动,以防止延迟峰值。
连接RapidMiner进程
的Python脚本扩展使用连接框架来管理远程Python引擎(RapidMiner StandPy容器)。为了配置到上一节中的生产容器的连接,我们需要创建一个新的类型的连接远程Python引擎。和往常一样,你可以为连接本身选择一个任意的名称:

配置只包含两个参数:引擎的端点和可选的安全令牌。
端点始终是指向RapidMiner StandPy路由器的URL,使用路径指定要使用的容器。在上一节中定义路由器服务时,我们为它指定了别名standpy-router
在网络
部分。此外,我们还为这两个容器命名example_testing
而且example_production
。这样,我们就得到了端点http://standpy-router/example_testing
而且http://standpy-router/example_production
分别用于测试容器和生产容器。
安全令牌只是在路由器服务中指定的令牌(如果有的话)。
鉴于RapidMiner StandPy只能在RapidMiner AI Hub中使用,我们只能验证而不能测试RapidMiner Studio中的连接:

配置可与远程Python背景信息操作符。这个操作符是一个简单的嵌套操作符,它接受到RapidMiner StandPy容器的连接作为输入,并覆盖所有嵌入式Python操作符的环境配置:
该操作符有一个名为启用
它启用或禁用环境覆盖。这样,您就可以在Studio中测试流程,而不必更改流程结构。
您可以通过使用三个操作符调度一个最小进程来测试StandPy连接是否按预期工作。只需添加执行Python的远程Python背景信息如上所示。例如,下面的脚本打印Python环境的前缀:
import sys def rm_main(): print('StandPy testing:') print(sys.prefix)
前缀应该以为StandPy指定的Python环境的名称结束。在我们的例子中,它应该为/ opt / coding-shared / env / example-project-environment
在哪里example-project-environment
是我们在前一节中选择的名称。打印语句或连接失败时的错误消息将显示在流程日志中。
限制
虽然RapidMiner StandPy在很大程度上是其他Python环境的替代品,但其面向web服务的架构有一些局限性:它不适合长时间运行的脚本,并且脚本在处理文件时可能表现不同。
长时间运行的脚本是不合适的,因为无法手动中止在StandPy容器中启动的脚本。容器将等待脚本完成或到达指定的超时。在后一种情况下,容器将强制重新启动整个Python解释器。
理论上,您可以将超时设置为一个非常高的值。但是,您可能会冒着错误作业长时间阻塞StandPy容器的风险。但是,实际上不需要使用StandPy运行长时间运行的脚本,因为在这种情况下,默认脚本执行的开销应该可以忽略不计。
RapidMiner stand - py支持文件输入但是不允许访问本地文件系统。文件输入作为文件类型的类文件对象传入TextIO
。因此,大多数脚本的行为应该与在本地执行相同。
但是,有时需要重新打开输入文件BinaryIO
。为了支持这样的用例,输入被存储在内存中的临时文件系统中,该文件系统允许关闭和重新打开输入。此外,StandPy取代了内置开放
函数在脚本的名称空间中使用兼容的函数,该函数可以在内存文件系统上工作。例如,下面的脚本将在StandPy上按预期运行:
import joblib def rm_main(input): # StandPy使用随机字符串作为输入文件名:file_name = input.name # open()函数被替换为一个能识别StandPy的# in-memory文件系统的函数,因此以二进制形式打开文件将正常工作:
但是,将文件名传递给另一个模块中定义的函数可能会失败:
import joblib def rm_main(input): # StandPy使用随机字符串作为输入文件名:file_name = input.name #这个调用很可能会失败,因为joblib模块将尝试使用内置的open()函数打开#文件:
因此,强烈建议始终在顶层打开文件,并将文件句柄而不是文件名传递给脚本外部定义的函数。
故障排除
故障排除的一个很好的起点是嵌入Python代码的RapidMiner进程的进程日志。Python脚本扩展记录以下信息:
- 如果无法到达远程引擎,则连接错误。
Python回溯脚本执行失败。例如,一个缺失的导入将显示如下:
信息:已启动的操作符:Execute Python五月17日,2021年7:33:25 AM com.rapidminer.extension.pythonscripting.operator.scripting.python.RemoteScriptRunner handleErrors严重:无法解析Python脚本Traceback(最近一次调用最后一次):脚本,第3行,在<模块> ModuleNotFoundError:没有名为'missing'的模块
从用户脚本中打印语句,例如:
INFO: Started operator: Execute Python五月17日2021年7:40:02 AM com.rapidminer.extension.pythonscripting.operator.scripting.python.RemoteScriptRunner run INFO: Python脚本的打印语句。
请注意,只有在脚本执行没有遇到任何错误时,才会记录打印语句。
进一步调查将需要管理员访问RapidMiner AI Hub。以下资源可能有助于识别问题:乐鱼体育安装
每个StandPy容器都实现了一个
/信息
端点。在上面的例子中,查询http://standpy-router/example_prodcution/info
AI Hub网络内部的响应将如下:{"environment": "example-project-environment", "max_requests": null, "timeout": 5, "version": "1.0.0", "worker_uptime": 762, "workers": 4}
的日志
rm-standpy-router-svc
服务将列出经过它的所有请求。特别是,它将记录失败的请求,例如,如果无法到达容器或响应错误代码。RapidMiner AI Hub可以配置为将外部请求转发给StandPy。但是,请注意,这样的配置可能会暴露不安全的Python容器,因此在生产环境中不允许这样做。中搜索以下块以启用转发
.env
文件# STANDPY_BACKEND=http://rm-standpy-router-svc/ STANDPY_BACKEND=http://standpy-is-not-enabled-by-default STANDPY_URL_SUFFIX=/standpy
并按照评论中所示进行更改:
# STANDPY_BACKEND=http://rm-standpy-router-svc/ # STANDPY_BACKEND=http://standpy-is-not-enabled-by-default STANDPY_URL_SUFFIX=/standpy
您将需要重新启动
rm-proxy-svc
服务来应用更改。之后,您将能够连接RapidMiner Studio到http:// < aihub-host > / standpy / < standpy-container-name >
和查询http:// < aihub-host > / standpy / < standpy-container-name > /信息
从本地浏览器。