问题排查

如果在云端训练模型或获取预测结果时发生错误,找出错误的原因很不容易。本页介绍如何查找和调试在 AI Platform Prediction 中遇到的问题。如果您在使用机器学习框架时遇到问题,请参阅机器学习框架的文档

命令行工具

错误:(gcloud) 无效的选项:“ai-platform”。

此错误意味着您需要更新 gcloud。要更新 gcloud,请运行以下命令:

gcloud components update
错误:(gcloud) 无法识别的参数:--framework=SCIKIT_LEARN.

此错误意味着您需要更新 gcloud。要更新 gcloud,请运行以下命令:

gcloud components update
错误:(gcloud) 无法识别的参数:--framework=XGBOOST。

此错误意味着您需要更新 gcloud。要更新 gcloud,请运行以下命令:

gcloud components update
错误:(gcloud) 加载模型失败:无法加载模型:/tmp/model/0001/model.pkl。'\x03'。(错误代码:0)

此错误意味着使用了错误的库来导出模型。如需更正此问题,请使用正确的库重新导出模型。例如,使用 pickle 库导出 model.pkl 格式的模型,而使用 joblib 库导出 model.joblib 格式的模型。

错误:(gcloud.ai-platform.jobs.submit.prediction) 参数 --data-format:无效的选项:“json”。

此错误表示您在提交批量预测作业时,将 json 指定为 --data-format 标志的值。如需使用 JSON 数据格式,您必须提供 text 作为 --data-format 标志的值。

Python 版本

错误:检测到不正确的模型并出现错误消息:“加载模型失败:无法加载
模型:/tmp/model/0001/model.pkl。不受支持的 pickle 协议:3。请确保
该模型系使用 python 2 导出。否则,请在部署模型时指定
正确的‘python_version’参数。目前,
‘python_version’接受 2.7 和 3.5。(错误代码:0)”
此错误意味着使用 Python 3 导出的模型文件已部署到使用 Python 2.7 设置的 AI Platform Prediction 模型版本资源中。

如需解决此问题,请执行以下操作:

  • 创建一个新的模型版本资源,并将“python_version”设置为 3.5。
  • 将相同的模型文件部署到新的模型版本资源中。

找不到 virtualenv 命令

如果您在尝试激活 virtualenv 时遇到此错误,一种可行的解决方案是将包含 virtualenv 的目录添加到 $PATH 环境变量中。修改此变量可让您在使用 virtualenv 命令时无需键入其完整文件路径。

首先,通过运行以下命令来安装 virtualenv

pip install --user --upgrade virtualenv

安装程序会提示您修改 $PATH 环境变量,并提供 virtualenv 脚本的路径。在 macOS 上,这类似于 /Users/[YOUR-USERNAME]/Library/Python/[YOUR-PYTHON-VERSION]/bin

打开 shell 加载环境变量的文件。通常,在 macOS 中,相应的文件为 ~/.bashrc~/.bash_profile

添加以下行,并将 [VALUES-IN-BRACKETS] 替换为适当的值:

export PATH=$PATH:/Users/[YOUR-USERNAME]/Library/Python/[YOUR-PYTHON-VERSION]/bin

最后,运行以下命令加载更新的 .bashrc(或 .bash_profile)文件:

source ~/.bashrc

使用作业日志

如需进行问题排查,最好先查看 Cloud Logging 收集的作业日志。

不同类型操作的日志

您的日志记录因操作类型而异,如以下部分所示。

批量预测日志

系统会记录所有批量预测作业。

在线预测日志

默认情况下,您的在线预测请求不会生成日志。您可以在创建模型资源时启用 Cloud Logging:

gcloud

在运行 gcloud ai-platform models create 时添加 --enable-logging 标志。

Python

在用于调用 projects.models.createModel 资源中,将 onlinePredictionLogging 设置为 True

查找日志

您的作业日志包含您的操作引发的所有事件,包括使用分布式训练时集群中所有进程的事件。如果您正在运行分布式训练作业,则会报告主工作器进程的作业级日志。因此,如果发生错误,则对其进行问题排查的第一步通常是检查该进程的日志,以此来过滤掉集群中其他进程的已记录事件。本节中的示例显示了具体的过滤流程。

您可以通过命令行或 Google Cloud Console 的“Cloud Logging”部分过滤日志。无论采用何种方式,请根据需要在过滤条件中使用以下元数据值:

元数据项 过滤以显示符合以下条件的内容…
resource.type 等于“cloud_ml_job”。
resource.labels.job_id 等于作业名称。
resource.labels.task_name 等于“master-replica-0”,以便仅读取主工作器的日志条目。
严重程度 大于或等于 ERROR(错误),以便仅读取与错误情况对应的日志条目。

命令行

使用 gcloud beta logging read 构建满足需求的查询。以下是一些示例:

每个示例都依赖于以下环境变量:

PROJECT="my-project-name"
JOB="my_job_name"

如果您愿意,也可以在需要的地方直接输入字符串字面量。

如需将作业日志输出到屏幕,请运行以下命令:
gcloud ai-platform jobs stream-logs $JOB

查看 gcloud ai-platform jobs stream-logs 的所有选项。

如需将主工作器的日志输出到屏幕,请运行以下命令:
gcloud beta logging read --project=${PROJECT} "resource.type=\"ml_job\" and resource.labels.job_id=${JOB} and resource.labels.task_name=\"master-replica-0\""
如需仅将主工作器的错误日志输出到屏幕,请运行以下命令:
gcloud beta logging read --project=${PROJECT} "resource.type=\"ml_job\" and resource.labels.job_id=${JOB} and resource.labels.task_name=\"master-replica-0\" and severity>=ERROR"

上述示例代表了对 AI Platform Prediction 训练作业的日志进行过滤的最常见情况。Cloud Logging 提供了许多强大的过滤选项,供您在需要优化搜索时使用。高级过滤文档详细描述了这些选项。

控制台

  1. 打开 Google Cloud 控制台中的 AI Platform Prediction 作业页面。

    打开 Google Cloud 控制台中的作业

  2. 作业页面的列表中选择失败的作业,以查看其详情。

显示失败作业的 AI Platform Prediction 作业列表。

  1. 点击查看日志打开 Cloud Logging。

失败作业的作业详情页面。

您也可以直接进入 Cloud Logging,但是这样您还要执行以下操作才能查找自己的作业:

  1. 展开资源选择器。
  2. 在资源列表中展开 AI Platform Prediction 作业。
  3. 在 job_id 列表中找到作业名称(您可以在搜索框中输入作业名称的前几个字母以减少显示的作业数)。
  4. 展开作业条目,然后从任务列表中选择 master-replica-0

已全部展开的日志过滤条件选择器。

从日志中获取信息

找到作业的正确日志并将其过滤到 master-replica-0 后,您可以检查记录的事件以找到问题的根源。这涉及标准的 Python 调试过程,请谨记以下事项:

  • 事件具有多个严重性级别。您可以过滤事件,以仅查看特定级别的事件,例如错误,或错误和警告。
  • 导致训练程序退出且显示不可恢复的错误情况(返回代码 > 0)的问题会记录一次异常(显示在堆栈轨迹的前面):

未展开任何部分的日志条目

  • 如需获取更多信息,您可以展开已记录的 JSON 消息中的对象(由右向箭头和列为 {...} 的内容表示)。例如,您可以展开 jsonPayload 以查看堆栈轨迹,与查看主要错误说明的方式相比,这种方式更加直观:

已展开 JSON 载荷部分的日志条目

  • 某些错误显示了可重试错误的实例。这些实例通常不包含堆栈轨迹,并且可能更难诊断。

充分利用日志记录

AI Platform Prediction 训练服务自动记录以下事件:

  • 服务内部的状态信息。
  • 您的训练程序应用发送给 stderr 的消息。
  • 您的训练程序应用发送给 stdout 的输出文本。

遵循良好的编程做法,您可以更轻松地对训练程序应用中的错误进行问题排查:

  • 将有意义的消息发送到 stderr(例如,使用日志记录)。
  • 当出现问题时,找出最合乎逻辑的描述性异常。
  • 向异常对象添加描述性字符串。

如需了解异常的更多信息,请参阅 Python 文档

排查预测问题

本部分收集了获取预测结果时遇到的一些常见问题。

处理在线预测的特定条件

本部分提供指导,帮助您了解一些已知会影响某些用户的在线预测错误情况。

完成预测所需的时间太长(30-180 秒)

在线预测太慢最常见的原因是从零开始调节处理节点数。如果您的模型会定期收到预测请求,则系统会准备好一个或多个节点以处理预测。如果您的模型长时间未处理任何预测,则该服务会将就绪节点数“下调”到零。此下调操作之后的下一个预测请求将比平时花费更多的时间来返回,因为服务必须预配节点才能处理请求。

HTTP 状态代码

如果在线预测请求发生错误,您通常会收到服务返回的 HTTP 状态代码。以下列出了一些常见的代码及其在在线预测上下文中的含义:

429 - 内存不足

运行模型时,处理节点内存不足。此时无法增加分配给预测节点的内存。但您可以尝试以下操作来运行模型:

  • 通过以下方式缩小模型大小:
    • 使用降低精确率的变量。
    • 量化连续数据。
    • 缩小其他输入特征的大小(例如,减少使用的词汇量)。
    • 使用较小批量的实例,再次发送请求。
429 - 待处理的请求太多

您的模型收到的请求数量超出其处理能力。如果您使用自动扩缩,则表明收到请求的速度快于系统扩缩的速度。此外,如果最小节点值为 0,则此配置可能会导致“冷启动”场景,即在第一个节点可用之前,观察到 100% 错误率。

通过自动扩缩,您可以尝试使用 指数退避算法。 使用指数退避算法重新发送请求可以给系统更多时间进行调整。

默认情况下,自动扩缩由 CPU 利用率超过 60% 触发,并且可以配置

429 - 配额

您的 Google Cloud Platform 项目每 100 秒只能处理 10000 个请求(大约每秒 100 个)。如果您在短暂峰值中收到此错误,则通常可以使用指数退避算法进行重试,及时处理所有请求。如果您一直收到此代码,则可以请求增加配额。如需了解详情,请参阅配额页面

503 - 我们的系统检测到您的计算机网络发出异常的流量

您的模型从单个 IP 收到请求的频率非常高,以致于系统怀疑遇到了拒绝服务攻击。停止发送请求一分钟,然后继续以较低的频率发送请求。

500 - 无法加载模型

系统无法加载您的模型。请尝试按照以下步骤操作:

预测请求中的格式化错误

以下消息都与您的预测输入有关。

“请求正文中出现空白或格式错误/无效的 JSON”
该服务无法解析请求中的 JSON,或者您的请求为空。请检查您的消息,确认是否有使 JSON 无效的错误或遗漏。
“请求正文中缺少‘实例’字段”
您的请求正文未遵循正确的格式。正常情况下,正文应该是一个包含名为 "instances" 的单键的 JSON 对象,而此键包含所有输入实例的列表。
创建请求时出现 JSON 编码错误

您的请求中包含 base64 编码数据,但数据的 JSON 格式不正确。正常情况下,每个 base64 编码的字符串必须由一个包含名为 "b64" 的单键的对象表示。例如:

  {"b64": "an_encoded_string"}

当您有非 base64 编码的二进制数据时,会发生另一个 base64 错误。此时,请对数据进行编码并将其格式化如下:

  {"b64": base64.b64encode(binary_data)}

如需了解详细信息,请参阅格式化和编码二进制数据

云端预测比桌面预测花费更长时间

在线预测设计为可扩缩服务,可以快速处理高速传入的预测请求。该服务针对处理所有服务请求的整合性能进行了优化。对可扩缩性的强调,导致其与在本地机器上生成少量预测有不同的性能特征。

后续步骤