在服务时在Keras模型中包括BEAM预处理图

问题描述 投票:5回答:2

简短问题:

由于Tensorflow正在向Keras迁移并远离Estimators,我们如何整合我们的预处理流水线,例如:使用tf.Transformbuild_serving_input_fn()(用于估算器),我们的tf.keras模型?


根据我的理解,合并此预处理图的唯一方法是首先使用Keras构建模型。训练它。然后使用tf.keras.estimator.model_to_estimator将其导出为估算器。然后创建一个serving_input_fn并将估算器导出为已保存的模型,以及在服务时使用的serving_input_fn

对我而言,这似乎很乏味,而不是正确的做事方式。相反,我想直接从Keras转到Saved Model。


问题

我希望能够在Keras保存的模型中包含APACHE BEAM预处理图。

我想服务训练有素的Keras模型,因此我使用SavedModel导出它。鉴于训练有素的模型,我想应用以下逻辑来预测结果。

raw_features = { 'feature_col_name': [100] } # features to transform
working_dir = 'gs://path_to_transform_fn' 

# transform features
transformed_features = tf_transform_output.transform_raw_features(raw_features)

model = load_model('model.h5')
model.predict(x=transformed_features)

当我定义模型时,我使用Functional API,模型具有以下输入:

for i in numerical_features:
    num_inputs.append(tf.keras.layers.Input(shape=(1,), name=i))

这是问题所在,因为张量不是直接从tf.Dataset输入到keras中,而是使用Input()层链接。

当我使用tf.contrib.saved_model.save_keras_model(model=model, saved_model_path=saved_model_path)导出模型时,如果我在单独的脚本中处理预处理,我可以很容易地提供预测。这个输出看起来像enter image description here

这是通常发生的事吗?例如,我会将这些功能预处理为某些外部脚本的一部分,然后将transformed_features发送到模型进行预测。

理想情况下,它将全部发生在Keras模型/单个图形的一部分中。目前似乎我正在使用一个图的输出作为另一个图的输入。相反,我希望能够使用单个图表。

如果使用Estimators,我们可以构建一个serving_input_fn(),它可以作为参数包含在估算器中,这允许我们将预处理逻辑合并到图中。

我还想在使用Cloud ML的服务模型上听到您的Keras + SavedModel +预处理想法

tensorflow keras apache-beam google-cloud-ml
2个回答
1
投票

有关将Apache Beam合并到tf.transform管道的输入函数中的问题,请参阅此TF教程,该教程解释了如何执行此操作:

https://www.tensorflow.org/tfx/transform/get_started#apache_beam_implementation

在使用TF 2.0 SavedModel和Keras时,这个笔记本教程演示了如何做到这一点:

https://www.tensorflow.org/beta/guide/keras/saving_and_serializing#export_to_savedmodel


-2
投票

Cloud ML是Google云计算机学习的一种方式。

Get Started非常简单,并使用他们的文档训练UI:

在本地开发和验证您的培训申请

在云中运行培训应用程序之前,请在本地运行它。本地环境提供高效的开发和验证工作流程,以便您可以快速迭代。在本地调试应用程序时,您也不会产生云资源费用。获取您的培训数据

相关数据文件adult.data和adult.test托管在公共云存储存储桶中。出于此示例的目的,请使用云存储上的版本,这些版本已经过一些简单的清理,而不是原始源数据。有关数据的更多信息,请参见下文。

您可以直接从Cloud Storage读取数据文件或将其复制到本地环境。出于此示例的目的,您将下载用于本地培训的样本,然后将其上载到您自己的云存储桶中以进行云培训。将数据下载到文件夹:

mkdir data
gsutil -m cp gs://cloud-samples-data/ml-engine/census/data/* data/

然后,只需将TRAIN_DATA和EVAL_DATA变量设置为本地文件路径。例如,以下命令将变量设置为本地路径。

TRAIN_DATA=$(pwd)/data/adult.data.csv
EVAL_DATA=$(pwd)/data/adult.test.csv

然后你有一个这样的TSV文件:

39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K
50, Self-emp-not-inc, 83311, Bachelors, 13, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 13, United-States, <=50K
38, Private, 215646, HS-grad, 9, Divorced, Handlers-cleaners, Not-in-family, White, Male, 0, 0, 40, United-States, <=50K
53, Private, 234721, 11th, 7, Married-civ-spouse, Handlers-cleaners, Husband, Black, Male, 0, 0, 40, United-States, <=50K

要运行它:

gcloud ml-engine local train \
    --module-name trainer.task \
    --package-path trainer/ \
    --job-dir $MODEL_DIR \
    -- \
    --train-files $TRAIN_DATA \
    --eval-files $EVAL_DATA \
    --train-steps 1000 \
    --eval-steps 100

对于moreTraining considerations,你的问题说:

开展培训工作

Cloud Machine Learning Engine将模型培训作为异步(批处理)服务提供。本页介绍如何通过从命令行运行gcloud ml-engine jobs提交培训或通过在projects.jobs.create中向API发送请求来配置和提交培训作业。在你开始之前

在提交培训作业之前,您必须打包应用程序并将其和任何异常依赖项上载到云存储桶。注意:如果使用gcloud命令行工具提交作业,则可以打包应用程序并在同一步骤中提交作业。配置作业

通过设置Job资源的成员(包括TrainingInput资源中的项目)将参数传递给培训服务。

如果您使用gcloud命令行工具提交培训工作,您可以:

Specify the most common training parameters as flags of the gcloud ml-engine jobs submit training command.
Pass the remaining parameters in a YAML configuration file, named config.yaml by convention. The configuration file mirrors the

Job资源的JSON表示的结构。您可以在gcloud ml-engine jobs submit training命令的--config标志中传递配置文件的路径。因此,如果配置文件的路径是config.yaml,则必须设置--config = config.yaml。

收集作业配置数据

以下属性用于定义作业。

作业名称(jobId)用于作业的名称(仅限大写字母,数字和下划线,以字母开头)。群集配置(scaleTier)一个缩放层,指定要在其上运行作业的处理群集的类型。这可以是CUSTOM比例级别,在这种情况下,您还要明确指定要使用的计算机的数量和类型。培训应用程序包(packageUris)在云存储位置暂存的打包培训应用程序。如果您使用的是gcloud命令行工具,则应用程序打包步骤基本上是自动化的。请参阅打印应用程序指南中的详细信息。模块名称(pythonModule)包中主模块的名称。主模块是您调用以启动应用程序的Python文件。如果使用gcloud命令提交作业,请在--module-name标志中指定主模块名称。请参阅打包应用程序的指南。区域(区域)您希望作业运行的计算引擎区域。您应该在与存储培训数据的云存储桶相同的区域中运行培训作业。查看Cloud ML Engine服务的可用区域。作业目录(jobDir)用于作业输出的云存储位置的路径。大多数培训应用程序在培训期间保存检查点,并在工作结束时将训练过的模型保存到文件中。您需要云存储位置才能将其保存到。您的Google Cloud Platform项目必须具有此存储桶的写入权限。培训服务会自动将您为作业目录设置的路径作为名为job_dir的命令行参数传递给培训应用程序。您可以将其与应用程序的其他参数一起解析,并在代码中使用它。使用作业目录的优点是培训服务在启动应用程序之前验证目录。运行时版本(runtimeVersion)

The Cloud ML Engine version to use for the job. If you don't specify a runtime version, the training service uses the default Cloud

ML Engine运行时版本1.0。 Python版本(pythonVersion)

The Python version to use for the job. Python 3.5 is available with Cloud ML Engine runtime version 1.4 or greater. If you don't

指定Python版本,培训服务使用Python 2.7。

格式化配置参数

如何指定配置详细信息取决于您开始培训作业的方式:将作业配置详细信息提供给gcloud ml-engine jobs submit training命令。您可以通过两种方式执行此操作:

With command-line flags.
In a YAML file representing the Job resource. You can name this file whatever you want. By convention the name is config.yaml.

即使您使用YAML文件,也必须提供某些详细信息作为命令行标志。例如,您必须提供--module-name标志以及--package-path或--packages中的至少一个。如果使用--package-path,则还必须包含--job-dir或--staging-bucket。此外,您必须提供--region标志或为您的gcloud客户端设置默认区域。这些选项以及您作为命令行标志提供的任何其他选项将覆盖配置文件中这些选项的值。

示例1:在此示例中,您选择预配置的计算机集群,并在提交作业时提供所有必需的详细信息作为命令行标志。不需要配置文件。请参阅下一节中提交作业的指南。

示例2:以下示例显示具有自定义处理集群的作业的配置文件的内容。配置文件包括一些但不是所有配置详细信息,假设您在提交作业时提供其他所需的详细信息作为命令行标志。

trainingInput:scaleTier:CUSTOM masterType:complex_model_m workerType:complex_model_m parameterServerType:large_model workerCount:9 parameterServerCount:3 runtimeVersion:'1.13' python版本:'3.5'

上面的示例指定了Python 3.5版,当您使用Cloud ML Engine 1.4或更高版本时,它可用。

提交工作

提交培训作业时,指定两组标志:

Job configuration parameters. Cloud ML Engine needs these values to set up resources in the cloud and deploy your application on each

处理集群中的节点。用户参数或应用程序参数。 Cloud ML Engine将这些标志的值传递给您的应用程序。

使用gcloud ml-engine jobs submit training命令提交培训作业。

首先,定义一些包含配置详细信息的环境变量很有用。要创建作业名称,以下代码会将日期和时间附加到模型名称:

TRAINER_PACKAGE_PATH="/path/to/your/application/sources"
now=$(date +"%Y%m%d_%H%M%S")
JOB_NAME="your_name_$now"
MAIN_TRAINER_MODULE="trainer.task"
JOB_DIR="gs://your/chosen/job/output/path"
PACKAGE_STAGING_PATH="gs://your/chosen/staging/path"
REGION="us-east1"
RUNTIME_VERSION="1.13"

以下作业提交对应于上面的配置示例1,您可以在其中选择预配置的比例层(基本),并决定通过命令行标志提供所有配置详细信息。不需要config.yaml文件:

gcloud ml-engine jobs submit training $JOB_NAME \
        --scale-tier basic \
        --package-path $TRAINER_PACKAGE_PATH \
        --module-name $MAIN_TRAINER_MODULE \
        --job-dir $JOB_DIR \
        --region $REGION \
        -- \
        --user_first_arg=first_arg_value \
        --user_second_arg=second_arg_value

以下作业提交对应于上面的配置示例2,其中一些配置位于文件中,您通过命令行标志提供其他详细信息:

gcloud ml-engine jobs submit training $JOB_NAME \
        --package-path $TRAINER_PACKAGE_PATH \
        --module-name $MAIN_TRAINER_MODULE \
        --job-dir $JOB_DIR \
        --region $REGION \
        --config config.yaml \
        -- \
        --user_first_arg=first_arg_value \
        --user_second_arg=second_arg_value

笔记:

If you specify an option both in your configuration file (config.yaml) and as a command-line flag, the value on the command

line会覆盖配置文件中的值。 empty - 标志标志着gcloud特定标志的结束以及要传递给应用程序的USER_ARGS的开头。特定于Cloud ML Engine的标志(例如--module-name, - runtime-version和--job-dir)必须位于空标志之前。 Cloud ML Engine服务解释这些标志。如果指定了--job-dir标志,则必须在空标志之前,因为Cloud ML Engine使用--job-dir来验证路径。如果指定,您的应用程序也必须处理--job-dir标志。即使标志位于空 - 之前, - job-dir也会作为命令行标志传递给您的应用程序。您可以根据需要定义尽可能多的USER_ARGS。 Cloud ML Engine将--user_first_arg, - user_second_arg等传递给您的应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.