为什么 Random Cut Forest 的 `record_set()` 数据 conversion/upload 方法不能与 "test" 通道一起使用?
Why can Random Cut Forest's `record_set()` method for data conversion/upload not be used with the "test" channel?
原问题
我想使用 RCF 的“测试”频道来获取模型的性能指标。
我以前使用过 record_set()
方法,但没有指定频道,训练效果很好。
但是,如果我使用 record_set()
上传我的特征矩阵和标签向量并像这样设置 channel='test'
:
from sagemaker import RandomCutForest
rcf = RandomCutForest(
role=execution_role,
instance_count=1,
instance_type='ml.m5.large',
data_location=f's3://{bucket}/{prefix}/',
output_path=f's3://{bucket}/{prefix}/output',
base_job_name=base_job_name,
eval_metrics=['accuracy', 'precision_recall_fscore']
)
test_set = rcf.record_set(
features,
labels=labels,
channel='test'
)
rcf.fit(test_set)
...我在训练期间遇到以下错误:
Failure reason
ClientError: Unable to initialize the algorithm. Failed to validate input data configuration. (caused by ValidationError) Caused by: 'ShardedByS3Key' is not one of ['FullyReplicated'] Failed validating 'enum' in schema['properties']['test']['properties']['S3DistributionType']: {'enum': ['FullyReplicated'], 'type': 'string'} On instance['test']['S3DistributionType']: 'ShardedByS3Key'
附录
使用“测试”通道上的数据的 HPO 作业也是如此:
from sagemaker.tuner import HyperparameterTuner, IntegerParameter
hpo = HyperparameterTuner(
estimator=rcf,
objective_metric_name='test:f1',
hyperparameter_ranges={
'num_samples_per_tree': IntegerParameter(32, 512),
'num_trees': IntegerParameter(50, 1000)
},
max_jobs=10,
max_parallel_jobs=2
)
train_set = rcf.record_set(
features,
channel='train'
)
test_set = rcf.record_set(
features,
labels=labels,
channel='test'
)
hpo.fit([train_set, test_set])
再次初始上传和“训练”通道工作正常,“测试”通道失败:
编辑 1
我尝试像这样实例化我自己的 RecordSet
对象(在数据已经以正确的格式上传到 S3 之后):
train_data = RecordSet(
s3_data='s3://path-to-train-data/.amazon.manifest',
feature_dim=features.shape[1],
num_records=features.shape[0],
s3_data_type='ManifestFile',
channel='train'
)
test_data = RecordSet(
s3_data='s3://path-to-test-data/.amazon.manifest',
feature_dim=features.shape[1],
num_records=features.shape[0],
s3_data_type='ManifestFile',
channel='test'
)
但是出现同样的错误。问题是,RecordSet
的构造函数不允许传递不同的 distribution
参数。它被硬编码为 ShardedByS3Key
,在源代码中可以看到 HERE.
我也打开了一个 issue on GitHub,因为这个错误仍然存在于最新版本的 SageMaker 中。
编辑 2
关于 Whosebug 上的类似问题还有另一个 post,其中使用了 Python API 的旧版本:.
在较新版本中进行一些重构后,用户不再需要创建 TrainingInput
对象。现在应该通过 record_set()
(returns class RecordSet
)来完成。结果,我们失去了对底层 TrainingInput
对象的 distribution
属性 的控制,无法再将其设置为 FullyReplicated
。
这基本上是破坏当前版本 SageMaker 中 RCF 的“测试”通道的原因,并且还阻止通过 HyperparameterTuner
进行超参数优化。
感谢您打开问题,我添加了 +1。
同时,您可以使用替代SDK来训练Random Cut Forest并将测试通道分布设置为FullyReplicated。
例如,那些 SDK 应该给你这样的控制权:
- AWS CLI create_training_job
- boto3 create_training_job
- SageMaker Python SDK Estimator 您将
image_uri
参数中的 RCF docker 图像传递给
原问题
我想使用 RCF 的“测试”频道来获取模型的性能指标。
我以前使用过 record_set()
方法,但没有指定频道,训练效果很好。
但是,如果我使用 record_set()
上传我的特征矩阵和标签向量并像这样设置 channel='test'
:
from sagemaker import RandomCutForest
rcf = RandomCutForest(
role=execution_role,
instance_count=1,
instance_type='ml.m5.large',
data_location=f's3://{bucket}/{prefix}/',
output_path=f's3://{bucket}/{prefix}/output',
base_job_name=base_job_name,
eval_metrics=['accuracy', 'precision_recall_fscore']
)
test_set = rcf.record_set(
features,
labels=labels,
channel='test'
)
rcf.fit(test_set)
...我在训练期间遇到以下错误:
Failure reason
ClientError: Unable to initialize the algorithm. Failed to validate input data configuration. (caused by ValidationError) Caused by: 'ShardedByS3Key' is not one of ['FullyReplicated'] Failed validating 'enum' in schema['properties']['test']['properties']['S3DistributionType']: {'enum': ['FullyReplicated'], 'type': 'string'} On instance['test']['S3DistributionType']: 'ShardedByS3Key'
附录
使用“测试”通道上的数据的 HPO 作业也是如此:
from sagemaker.tuner import HyperparameterTuner, IntegerParameter
hpo = HyperparameterTuner(
estimator=rcf,
objective_metric_name='test:f1',
hyperparameter_ranges={
'num_samples_per_tree': IntegerParameter(32, 512),
'num_trees': IntegerParameter(50, 1000)
},
max_jobs=10,
max_parallel_jobs=2
)
train_set = rcf.record_set(
features,
channel='train'
)
test_set = rcf.record_set(
features,
labels=labels,
channel='test'
)
hpo.fit([train_set, test_set])
再次初始上传和“训练”通道工作正常,“测试”通道失败:
编辑 1
我尝试像这样实例化我自己的 RecordSet
对象(在数据已经以正确的格式上传到 S3 之后):
train_data = RecordSet(
s3_data='s3://path-to-train-data/.amazon.manifest',
feature_dim=features.shape[1],
num_records=features.shape[0],
s3_data_type='ManifestFile',
channel='train'
)
test_data = RecordSet(
s3_data='s3://path-to-test-data/.amazon.manifest',
feature_dim=features.shape[1],
num_records=features.shape[0],
s3_data_type='ManifestFile',
channel='test'
)
但是出现同样的错误。问题是,RecordSet
的构造函数不允许传递不同的 distribution
参数。它被硬编码为 ShardedByS3Key
,在源代码中可以看到 HERE.
我也打开了一个 issue on GitHub,因为这个错误仍然存在于最新版本的 SageMaker 中。
编辑 2
关于 Whosebug 上的类似问题还有另一个 post,其中使用了 Python API 的旧版本:
在较新版本中进行一些重构后,用户不再需要创建 TrainingInput
对象。现在应该通过 record_set()
(returns class RecordSet
)来完成。结果,我们失去了对底层 TrainingInput
对象的 distribution
属性 的控制,无法再将其设置为 FullyReplicated
。
这基本上是破坏当前版本 SageMaker 中 RCF 的“测试”通道的原因,并且还阻止通过 HyperparameterTuner
进行超参数优化。
感谢您打开问题,我添加了 +1。 同时,您可以使用替代SDK来训练Random Cut Forest并将测试通道分布设置为FullyReplicated。
例如,那些 SDK 应该给你这样的控制权:
- AWS CLI create_training_job
- boto3 create_training_job
- SageMaker Python SDK Estimator 您将
image_uri
参数中的 RCF docker 图像传递给