使用AWS SageMaker Python SDK进行批量转换稀疏矩阵

时间:2019-10-16 09:56:46

标签: python amazon-web-services scikit-learn sparse-matrix amazon-sagemaker

我已经使用AWS SageMaker成功地训练了Scikit-Learn LSVC模型。
我想在一个相对较大的数据集上进行批量预测(也就是批量转换),该数据集是形状为252772 x 185128的稀疏稀疏矩阵。(特征数量很多,因为对词袋进行一次热编码和ngrams功能)。

我之所以挣扎是因为:

  • 数据大小

  • 数据格式

我做了几个实验来检查发生了什么:

1。根据样本稀疏矩阵数据进行本地预测

有效
在SageMaker笔记本上本地反序列化模型工件,并根据稀疏矩阵的样本进行预测。
只是为了检查模型是否可以预测此类数据。

2。在样本csv数据上进行批量转换

有效
在SageMaker上启动批处理转换作业,并请求转换密集csv格式的小样本:很明显,它可以工作但不能缩放。
代码是:

sklearn_model = SKLearnModel(
    model_data=model_artifact_location_on_s3,
    entry_point='my_script.py',
    role=role,
    sagemaker_session=sagemaker_session)

transformer = sklearn_model.transformer(
   instance_count=1, 
   instance_type='ml.m4.xlarge', 
   max_payload=100)

transformer.transform(
   data=batch_data, 
   content_type='text/csv',
   split_type=None)   

print('Waiting for transform job: ' + transformer.latest_transform_job.job_name)
transformer.wait()

其中:

  • 'my_script.py'实现了一个简单的model_fn以反序列化模型工件:
def model_fn(model_dir):
    clf = joblib.load(os.path.join(model_dir, "model.joblib"))
    return clf
  • batch_data是csv文件的s3路径。

3。样本密集的numpy数据集的批量转换。

有效
我准备了一个数据样本,并将其以Numpy .npy格式保存到s3。根据{{​​3}},SageMaker Scikit学习模型服务器可以反序列化NPY格式的数据(以及JSON和CSV数据)。
与先前实验(2)的唯一区别是content_type='application/x-npy'中的参数transformer.transform(...)

此解决方案无法扩展,我们希望传递一个Scipy稀疏矩阵:

4。大稀疏矩阵的批量转换。

这是问题所在
SageMaker Python SDK不支持稀疏矩阵格式。
遵循此:

我使用write_spmatrix_to_sparse_tensor在s3上将数据写入protobuf格式。我使用的功能是:

def write_protobuf(X_sparse, bucket, prefix, obj):
    """Write sparse matrix to protobuf format at location bucket/prefix/obj."""
    buf = io.BytesIO()
    write_spmatrix_to_sparse_tensor(file=buf, array=X_sparse, labels=None)
    buf.seek(0)
    key = '{}/{}'.format(prefix, obj)
    boto3.resource('s3').Bucket(bucket).Object(key).upload_fileobj(buf)
    return 's3://{}/{}'.format(bucket, key)

然后用于启动批处理转换作业的代码是:

sklearn_model = SKLearnModel(
    model_data=model_artifact_location_on_s3,
    entry_point='my_script.py',
    role=role,
    sagemaker_session=sagemaker_session)

transformer = sklearn_model.transformer(
   instance_count=1, 
   instance_type='ml.m4.xlarge', 
   max_payload=100)

transformer.transform(
   data=batch_data, 
   content_type='application/x-recordio-protobuf',
   split_type='RecordIO')   

print('Waiting for transform job: ' + transformer.latest_transform_job.job_name)
transformer.wait()

我收到以下错误:

sagemaker_containers._errors.ClientError: Content type application/x-recordio-protobuf is not supported by this framework.

问题:
(《变形金刚》的参考文档:Errors running Sagemaker Batch Transformation with LDA model

  • 如果不允许使用content_type='application/x-recordio-protobuf',我应该使用什么?
  • 在这种情况下split_type='RecordIO'是否正确?
  • 是否应该在脚本中提供input_fn函数以反序列化数据?
  • 有没有更好的方法来解决这个问题?

0 个答案:

没有答案