简短问题:
由于Tensorflow朝着Keras 和的方向远离Estimators,我们如何合并预处理管道,例如使用tf.Transform
和build_serving_input_fn()
(用于估计量)进入我们的tf.keras
模型?
根据我的理解,合并此预处理图形的唯一方法是首先使用Keras构建模型。训练吧。然后使用tf.keras.estimator.model_to_estimator
将其导出为估计量。然后创建一个serving_input_fn
并将估算器导出为已保存的模型,并连同此serving_input_fn
一起在投放时使用。
在我看来,这似乎很乏味,而不是正确的处事方式。相反,我想直接从Keras转到Saved Model。
我希望能够在Keras保存的模型中包含APAHCE 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)
导出模型时,如果我在单独的脚本中处理预处理,则可以很容易地提供预测。这样的输出看起来像
这通常会发生什么吗?例如,我将这些功能作为某些外部脚本的一部分进行预处理,然后将transformed_features
发送到模型进行预测。
理想情况下,它们都将在Keras模型/单个图形的一部分内发生。目前看来,我正在使用一个图的输出作为另一图的输入。相反,我希望能够使用单个图形。
如果使用估算器,我们可以构建一个serving_input_fn()
并将其作为估算器的参数包括在内,这使我们可以将预处理逻辑合并到图形中。
我也想听听您的Keras + SavedModel +关于使用Cloud ML服务模型的预处理想法
答案 0 :(得分:1)
对于将Apache Beam集成到tf.transform管道的输入函数中的问题,请参阅此TF教程,其中介绍了如何执行此操作:
“ https://www.tensorflow.org/tfx/transform/get_started#apache_beam_implementation
在Keras上使用TF 2.0 SavedModel时,此笔记本教程演示了如何做到这一点:
https://www.tensorflow.org/beta/guide/keras/saving_and_serializing#export_to_savedmodel
答案 1 :(得分:-2)
Cloud ML是Google Clouds机器学习的一种方式。
Get Started并使用其文档来训练用户界面非常简单:
在本地开发和验证您的培训应用
在云中运行培训应用程序之前,请先运行它 本地。本地环境提供了有效的开发和 验证工作流程,以便您可以快速进行迭代。你也不会 调试应用程序时产生云资源费用 本地。获取培训数据
相关的数据文件Adult.data和Adult.test托管在 公共云存储桶。出于本示例的目的,请使用 进行了一些小规模清理的Cloud Storage版本, 而不是原始源数据。请参阅下面的详细信息 关于数据。
您可以直接从Cloud Storage中读取数据文件或将其复制 到您当地的环境。就本样本而言,您将 下载样本进行本地培训,然后将其上传到您的 自己的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
更多Training considerations,如您的问题所述:
运行培训工作
Cloud Machine Learning Engine提供模型训练 异步(批处理)服务。本页介绍如何配置和 通过运行gcloud ml-engine作业提交培训作业提交培训 从命令行或通过向API发送请求到 projects.jobs.create。开始之前
在您可以提交培训工作之前,您必须打包您的 应用程序并将其以及任何异常依赖项上传到云 储物桶。注意:如果您使用gcloud命令行工具来 提交工作,您可以打包申请并在以下位置提交工作 同一步骤。配置作业
您可以通过设置参数将参数传递给培训服务 Job资源的成员,其中包括 TrainingInput资源。
如果您使用gcloud命令行工具提交培训工作, 您可以:
Job资源的JSON表示形式的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
结构。你通过了 gcloud的--config标志中配置文件的路径 ml-engine作业提交培训命令。所以,如果通往 配置文件是config.yaml,必须设置--config = config.yaml。
收集作业配置数据
以下属性用于定义您的工作。
职位名称(jobId) 作业使用的名称(仅混合大小写的字母,数字和下划线,以字母开头)。集群配置 (scaleTier) 一个伸缩层,指定要在其上运行作业的处理集群的类型。这可以是CUSTOM标度层,在这种情况下,您也可以 明确指定要使用的计算机的数量和类型。训练 应用程序包(packageUris) 在Cloud Storage位置暂存的打包培训应用程序。如果您使用的是gcloud命令行工具, 应用程序打包步骤在很大程度上是自动化的。请参阅中的详细信息 包装应用程序的指南。模块名称(pythonModule) 软件包中主模块的名称。主要模块是您用来启动应用程序的Python文件。如果您使用 gcloud命令提交您的作业,在 --module-name标志。请参阅打包应用程序的指南。区域(区域) 您要在其中运行作业的Compute Engine区域。您应该在与Cloud Storage相同的区域中运行培训工作 存储您的训练数据的存储桶。查看可用区域 Cloud ML Engine服务。作业目录(jobDir) 用于作业输出的Cloud Storage位置的路径。大多数训练应用程序会在训练过程中保存检查点,并保存 经过训练的模型保存到工作结束时的文件中。你需要云 将它们保存到的存储位置。您的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作业提供作业配置详细信息 提交训练命令。您可以通过两种方式执行此操作:
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参数ServerType:large_model
workerCount:9 parameterServerCount:3 runtimeVersion:'1.13'
pythonVersion:'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作业提交培训作业提交培训 命令。
首先,定义一些包含以下内容的环境变量很有用 您的配置详细信息。要创建一个工作名称,下面的代码 将日期和时间附加到模型名称:
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覆盖配置文件中的值。 空-标志标记了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等传递到您的 应用。