我使用Amazon SageMaker训练和部署了模型,我想通过调用已部署的终端节点进行实时预测。我发现R Shiny易于创建快速的交互式用户界面Web应用程序。我使用了网状R包与Python进行通信。首先,我保存了一个Python函数,该函数调用端点并获得传递给端点的功能输入的预测。然后在R中,在server.R中,我将Python函数作为源,并向其传递一个R对象以获得预测。我的Python函数如下所示:
def predict_end_point(df):
import numpy as np
import pandas as pd
import os
# Define IAM role
import boto3
import re
import sagemaker
boto_session = boto3.Session(profile_name='xxx',region_name='us-east-2',aws_access_key_id ='xxx', aws_secret_access_key ='xxx' )
sess = sagemaker.Session(boto_session=boto_session)
endpoint_name = 'xgboost-v1'
predictor = sagemaker.predictor.RealTimePredictor(endpoint=endpoint_name,sagemaker_session=sess)
from sagemaker.predictor import csv_serializer, json_deserializer
predictor.content_type = 'text/csv'
predictor.serializer = csv_serializer
predictor.deserializer = None
x = predictor.predict(df)
x = x.decode("utf-8")
return x
我的应用程序在本地计算机上运行良好,但我想将其部署到云中。我在AWS EC2中创建了一个闪亮的服务器,并安装了所有必需的软件包。但是,当我在浏览器中打开闪亮的应用程序时,出现错误消息ModuleNotFound错误:没有名为“ boto3”的模块。但是,当我在同一实例中打开R服务器并在R笔记本中调用相同的Python脚本时,它可以正常工作并给出预测。为什么闪亮的服务器无法获取boto3?正如您在代码的服务器部分看到的那样,我告诉它要使用哪个Python,并且我确认boto3已安装在该Python环境中。如果我在同一实例中从R服务器运行应用程序,则会收到“ NameError:未定义名称'ssl'”
server.R
library(shiny)
library(reticulate)
use_python("/home/ubuntu/anaconda3/bin/python", required=TRUE)
source_python("predict_end_point.py")
shinyServer(function(input, output) {
selected = reactive({
z = c(input$season,input$holiday, input$workingday, input$weather,
input$temp, input$atemp, input$humidity, input$windspeed,
input$year, input$month, input$day, input$dayofweek, input$hour)
as.numeric(z)
})
output$selected_values = renderTable({
input$go
isolate(selected())
})
output$text <- renderText({
input$go
isolate(predict_end_point(selected()))
})
})