我正在使用sagemaker和批处理来运行本地转换器。但是,似乎转换未调用我的自定义代码。
以下是SKlearn初始化
$sql = INSERT INTO author ( firstname, lastname) VALUES ('Roal', 'Dahl'), ('Rasmus', 'Lerdorf'), ('Jane', 'Doe');
train.py是一个Python脚本,用于加载训练数据并将模型保存到S3
批处理转换为:
from sagemaker.sklearn.estimator import SKLearn
source_dir = 'train'
script_path = 'train.py'
sklearn = SKLearn(
entry_point=script_path,
train_instance_type="local_gpu",
source_dir=source_dir,
role=role,
sagemaker_session=sagemaker_session)
sklearn.fit({'train': "file://test.csv"})
transformer = sklearn.transformer(instance_count=1,
entry_point=source_dir+"/"+script_path,
instance_type='local_gpu',
strategy='MultiRecord',
assemble_with='Line'
)
transformer.transform("file://test_messages", content_type='text/csv', split_type='Line')
print('Waiting for transform job: ' + transformer.latest_transform_job.job_name)
transformer.wait()
包含一个csv,它是一个字符串列表
完整错误是
file://test_messages
似乎无法处理我的字符串。我在train.py中确实有使用TfidfVectorizer转换字符串的代码,但是该代码没有被调用
答案 0 :(得分:2)
我是AWS SageMaker的工程师。感谢您提供估算器/变压器设置的详细信息以及完整的错误日志。
看着特定的错误,看来default_input_fn
中的Scikit学习容器失败了。值得庆幸的是,SageMaker Scikit学习是开源的,因此我们可以直接访问源sagemaker_sklearn_container/serving.py#L56,以帮助了解其工作原理。
容器选择执行“默认”输入功能,以在发送到模型之前处理输入。显然,默认实现不适用于所需的输入格式。
类似于培训,您需要提供自定义Python代码来控制SageMaker Scikit学习如何在服务/推断模式下处理模型。如果要覆盖默认值,则需要在自定义Python代码中实现input_fn
。您可以选择将其添加到train.py
脚本中,或在Transformer中传递其他Python文件。
在撰写input_fn
:https://sagemaker.readthedocs.io/en/stable/using_sklearn.html#process-input
如果仍然有问题,可以分享自定义代码中的示例。