为什么没有 SageMaker 应该自动创建的特定目录?
Why is there no specific directory that SageMaker was supposed to create automatically?
我正在尝试在 AWS SageMaker 上部署我的模型(容器)。我已将容器推送到 AWS ECR。
然后,我通过 boto3
SageMaker 客户端使用基本上 运行s create_training_job()
的 AWS Lambda。它 运行 以 train 模式运行容器,并将生成的工件放入 S3。像那样:
sm = boto3.client('sagemaker')
sm.create_training_job(
TrainingJobName=full_job_name,
HyperParameters={
'general': json.dumps(
{
'environment': ENVIRONMENT,
'region': REGION,
'version': date_suffix,
'hyperparameter_tuning': training_params.get('hyperparameter_tuning', False),
'basket_analysis': training_params.get('basket_analysis', True),
'init_inventory_cache': training_params.get('init_inventory_cache', True),
}
),
'aws_profile': '***-dev',
'db_config': json.dumps(database_mapping),
'model_server_params': json.dumps(training_params.get('model_server_params', {}))
},
AlgorithmSpecification={
'TrainingImage': training_image,
'TrainingInputMode': 'File',
},
RoleArn=ROLE_ARN,
OutputDataConfig={
'S3OutputPath': S3_OUTPUT_PATH
},
ResourceConfig={
'InstanceType': INSTANCE_TYPE,
'InstanceCount': 1,
'VolumeSizeInGB': 20,
},
# VpcConfig={
# 'SecurityGroupIds': SECURITY_GROUPS.split(','),
# 'Subnets': SUBNETS.split(',')
# },
StoppingCondition={
'MaxRuntimeInSeconds': int(MAX_RUNTIME_SEC),
# 'MaxWaitTimeInSeconds': 1800
},
Tags=[ ],
EnableNetworkIsolation=False,
EnableInterContainerTrafficEncryption=False,
EnableManagedSpotTraining=False,
)
我在容器内有一个记录器,显示 opt/ml/input/config/hyperparameters.json
现在存在。它已由 SageMaker 添加。很好。
但是,当我尝试在 serve
模式下 运行 相同的容器时(基本上是部署它),我遇到 opt/ml/input/config/hyperparameters.json
不再存在。我是这样部署的:
sm.create_model(
ModelName=model_name,
PrimaryContainer={
'Image': training_image,
'ModelDataUrl': model_artifact,
'Environment': {
'version': version
}
},
ExecutionRoleArn=role_arn,
Tags=[ ],
# VpcConfig = {
# 'SecurityGroupIds': os.environ['security_groups'].split(','),
# 'Subnets': os.environ['subnets'].split(',')
# }
)
sm.create_endpoint_config(
EndpointConfigName=config_name,
ProductionVariants=[
{
'VariantName': variant_name,
'ModelName': model_name,
'InitialInstanceCount': instance_count,
'InstanceType': instance_type,
'InitialVariantWeight': 1
},
],
Tags=[ ],
)
existing_endpoints = sm.list_endpoints(NameContains=endpoint_name)
scaling_resource_id = f'endpoint/{endpoint_name}/variant/{variant_name}'
if not existing_endpoints['Endpoints']:
sm.create_endpoint(
EndpointName=endpoint_name,
EndpointConfigName=config_name
)
else:
if aas.describe_scalable_targets(
ServiceNamespace='sagemaker',
ResourceIds=[scaling_resource_id],
ScalableDimension='sagemaker:variant:DesiredInstanceCount')['ScalableTargets']:
aas.deregister_scalable_target(
ServiceNamespace='sagemaker',
ResourceId=scaling_resource_id,
ScalableDimension='sagemaker:variant:DesiredInstanceCount'
)
sm.update_endpoint(
EndpointName=endpoint_name,
EndpointConfigName=config_name
)
这很重要,因为它似乎是一种从外部(如管理控制台)在容器内传递一些参数的便捷方式。
我以为这个file/directory在火车之后还会存在。有什么想法吗?
tl;dr:两个选项:
- 将
hyperparameters.json
文件复制到训练逻辑中的 /opt/ml/model
,它将与模型工件一起打包;
- 通过
PrimaryContainer
参数的 Environment
属性. 传递任何你想要的参数
长版:
该文件 opt/ml/input/config/hyperparameters.json
(实际上是整个 /opt/ml/input
文件夹)在创建时安装在 training 容器中。它由 SageMaker 根据您提供的信息提供,仅 用于培训目的。 SageMaker 不会以任何方式更改您的容器,并且在训练完成后它不会保留此文件或它传递给训练作业的任何配置文件。如果你想将参数传递给推理端点,那不是办法。
您可以将hyperparameters.json
文件复制到/opt/ml/model
文件夹,它会与model.tar.gz
中的模型一起打包压缩包。然后您的推理代码可以使用它 - 但这不是将参数传递到端点的规定方式,它会导致您的框架出现问题。
向 SageMaker 端点传递参数的一般规定方法是通过 环境。如果您检查 boto3 docs for create_model,您会看到 PrimaryContainer
参数中有一个 Environment
键(每个 Containers
参数也是如此)。事实上,您上面的代码已经使用它来传递 version
参数。您应该使用它来将任何参数传递给您的模型,并从那里传递到基于它的端点。
我正在尝试在 AWS SageMaker 上部署我的模型(容器)。我已将容器推送到 AWS ECR。
然后,我通过 boto3
SageMaker 客户端使用基本上 运行s create_training_job()
的 AWS Lambda。它 运行 以 train 模式运行容器,并将生成的工件放入 S3。像那样:
sm = boto3.client('sagemaker')
sm.create_training_job(
TrainingJobName=full_job_name,
HyperParameters={
'general': json.dumps(
{
'environment': ENVIRONMENT,
'region': REGION,
'version': date_suffix,
'hyperparameter_tuning': training_params.get('hyperparameter_tuning', False),
'basket_analysis': training_params.get('basket_analysis', True),
'init_inventory_cache': training_params.get('init_inventory_cache', True),
}
),
'aws_profile': '***-dev',
'db_config': json.dumps(database_mapping),
'model_server_params': json.dumps(training_params.get('model_server_params', {}))
},
AlgorithmSpecification={
'TrainingImage': training_image,
'TrainingInputMode': 'File',
},
RoleArn=ROLE_ARN,
OutputDataConfig={
'S3OutputPath': S3_OUTPUT_PATH
},
ResourceConfig={
'InstanceType': INSTANCE_TYPE,
'InstanceCount': 1,
'VolumeSizeInGB': 20,
},
# VpcConfig={
# 'SecurityGroupIds': SECURITY_GROUPS.split(','),
# 'Subnets': SUBNETS.split(',')
# },
StoppingCondition={
'MaxRuntimeInSeconds': int(MAX_RUNTIME_SEC),
# 'MaxWaitTimeInSeconds': 1800
},
Tags=[ ],
EnableNetworkIsolation=False,
EnableInterContainerTrafficEncryption=False,
EnableManagedSpotTraining=False,
)
我在容器内有一个记录器,显示 opt/ml/input/config/hyperparameters.json
现在存在。它已由 SageMaker 添加。很好。
但是,当我尝试在 serve
模式下 运行 相同的容器时(基本上是部署它),我遇到 opt/ml/input/config/hyperparameters.json
不再存在。我是这样部署的:
sm.create_model(
ModelName=model_name,
PrimaryContainer={
'Image': training_image,
'ModelDataUrl': model_artifact,
'Environment': {
'version': version
}
},
ExecutionRoleArn=role_arn,
Tags=[ ],
# VpcConfig = {
# 'SecurityGroupIds': os.environ['security_groups'].split(','),
# 'Subnets': os.environ['subnets'].split(',')
# }
)
sm.create_endpoint_config(
EndpointConfigName=config_name,
ProductionVariants=[
{
'VariantName': variant_name,
'ModelName': model_name,
'InitialInstanceCount': instance_count,
'InstanceType': instance_type,
'InitialVariantWeight': 1
},
],
Tags=[ ],
)
existing_endpoints = sm.list_endpoints(NameContains=endpoint_name)
scaling_resource_id = f'endpoint/{endpoint_name}/variant/{variant_name}'
if not existing_endpoints['Endpoints']:
sm.create_endpoint(
EndpointName=endpoint_name,
EndpointConfigName=config_name
)
else:
if aas.describe_scalable_targets(
ServiceNamespace='sagemaker',
ResourceIds=[scaling_resource_id],
ScalableDimension='sagemaker:variant:DesiredInstanceCount')['ScalableTargets']:
aas.deregister_scalable_target(
ServiceNamespace='sagemaker',
ResourceId=scaling_resource_id,
ScalableDimension='sagemaker:variant:DesiredInstanceCount'
)
sm.update_endpoint(
EndpointName=endpoint_name,
EndpointConfigName=config_name
)
这很重要,因为它似乎是一种从外部(如管理控制台)在容器内传递一些参数的便捷方式。
我以为这个file/directory在火车之后还会存在。有什么想法吗?
tl;dr:两个选项:
- 将
hyperparameters.json
文件复制到训练逻辑中的/opt/ml/model
,它将与模型工件一起打包; - 通过
PrimaryContainer
参数的Environment
属性. 传递任何你想要的参数
长版:
该文件 opt/ml/input/config/hyperparameters.json
(实际上是整个 /opt/ml/input
文件夹)在创建时安装在 training 容器中。它由 SageMaker 根据您提供的信息提供,仅 用于培训目的。 SageMaker 不会以任何方式更改您的容器,并且在训练完成后它不会保留此文件或它传递给训练作业的任何配置文件。如果你想将参数传递给推理端点,那不是办法。
您可以将hyperparameters.json
文件复制到/opt/ml/model
文件夹,它会与model.tar.gz
中的模型一起打包压缩包。然后您的推理代码可以使用它 - 但这不是将参数传递到端点的规定方式,它会导致您的框架出现问题。
向 SageMaker 端点传递参数的一般规定方法是通过 环境。如果您检查 boto3 docs for create_model,您会看到 PrimaryContainer
参数中有一个 Environment
键(每个 Containers
参数也是如此)。事实上,您上面的代码已经使用它来传递 version
参数。您应该使用它来将任何参数传递给您的模型,并从那里传递到基于它的端点。