【问题标题】:Is it possible to predict in sagemaker without using s3是否可以在不使用 s3 的情况下在 sagemaker 中进行预测
【发布时间】:2018-07-24 23:57:00
【问题描述】:

我有一个想要投入生产的 .pkl。我想每天查询我的 SQL 服务器并对大约 1000 行进行预测。 documentation 意味着我必须将每日数据加载到 s3 中。有没有解决的办法?它应该能够适应内存没有问题。

is there some kind of persistent local storage in aws sagemaker model training?”的答案是“笔记本实例附带一个本地 EBS (5GB),您可以使用它来将一些数据复制到其中并运行快速开发迭代,而无需每次都复制数据从 S3 开始的时间。" 5GB 可能就足够了,但我不确定你是否可以以这种方式从笔记本电脑上运行。如果我设置了 VPN,我可以使用 pyodbc 进行查询吗?

sagemaker 是否与 AWS Lambda 集成?结合 docker 容器将满足我的需求。

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda amazon-sagemaker


    【解决方案1】:

    您可以在 Sagemaker 上创建一个到 host your pickled model 的终端节点,并通过使用 AWS Lambda 调用终端节点来进行预测。 S3 存储桶不是进行实时预测所必需的。批量转换是非实时推理,需要 S3 存储桶。对于最多 1000 行的预测,您可以在 lambda 函数中使用实时推理。 lambda 代码大致是这样的

    import sys
    import logging
    import rds_config
    import pymysql
    import boto3
    import json
    
    #rds settings
    rds_host  = "rds-instance-endpoint"
    name = rds_config.db_username
    password = rds_config.db_password
    db_name = rds_config.db_name
    
    # sagemaker client
    sagemaker = boto3.client('sagemaker-runtime', region_name ='<your region>' )
    
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    
    try:
        conn = pymysql.connect(rds_host, user=name, passwd=password, db=db_name, connect_timeout=5)
    except:
        logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")
        sys.exit()
    
    logger.info("SUCCESS: Connection to RDS mysql instance succeeded")
    def handler(event, context):
        """
        This function fetches content from mysql RDS instance
        """
    
        item_count = 0
    
        with conn.cursor() as cur:
            cur.execute("select * from table_name")
            for row in cur:
                # format rows to match with prediction payload
                item_count += 1
                new_row = ','.join(row)
                response = sagemaker.invoke_endpoint(
                    EndpointName='ServiceEndpoint',
                    Body=new_row, 
                    ContentType='text/csv'
                )
                prediction = json.loads(response['Body'].read().decode())
                print(result)
                # store predictions somewhere if needed
    
        return "Made predictioncs on %d items from RDS MySQL table" %(item_count)
    

    【讨论】:

    • 这是一个有趣的解决方案。如果我要走那条路,我需要 API 端点始终处于开启状态。如果我只想每天跑 20 分钟的工作,这似乎很浪费。我希望能够启动只是为了做出预测
    • 您可以考虑通过另一个 Lambda 或 CloudFormation 安排端点配置,并在成功完成后运行预测并清理端点。
    【解决方案2】:

    S3 数据不需要

    这里是 SageMaker 文档页面的链接:https://docs.aws.amazon.com/sagemaker/latest/dg/API_ContainerDefinition.html#SageMaker-Type-ContainerDefinition-ModelDataUrl

    可以通过内嵌文本 blob 或数据文件(二进制、纯文本、csv、json 等)进行预测

    【讨论】:

      【解决方案3】:

      虽然您需要指定一个 s3“文件夹”作为输入,但该文件夹只能包含一个虚拟文件。 此外,如果您带上自己的 docker 容器进行培训,例如 this example,您可以在其中做很多事情。因此,您可以在 docker 容器中进行日常查询,因为它们可以访问互联网。

      在此容器中,您还可以访问所有其他 aws 服务。您的访问权限由您传递给培训工作的角色定义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-08
        • 2019-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多