import argparse
import logging
# Get logging_level
arg_parser = argparse.ArgumentParser(description="Argument parser.")
arg_parser.add_argument("--logging_level", type=str, help="logging level")
args, unknown_args = arg_parser.parse_known_args()
print(args.logging_level)
# Initialize Python logger
logger = logging.getLogger(__name__)
logger.setLevel(args.logging_level.upper())
logger.info("Info log statement")
logger.debug("Debug log statement")
以下部分包含在开发和使用批处理终结点期间可能会遇到的常见问题及其解决方法。
没有名为“azureml”的模块
记录的消息:No module named 'azureml'
。
原因:Azure 机器学习批处理部署需要安装 azureml-core
包。
解决方法:将 azureml-core
添加到 conda 依赖项文件中。
输出已存在
原因:Azure 机器学习批处理部署无法覆盖输出生成的 predictions.csv
文件。
解决方法:如果指示了预测的输出位置,请确保路径指向一个不存在的文件。
入口脚本中的 run() 函数超时 [number] 次
记录的消息:No progress update in [number] seconds. No progress update in this check. Wait [number] seconds since last update.
原因:可能为批处理部署配置了一个 timeout
值,该值指示在处理单个批之前部署应等待多长时间。 如果批的执行时间超过此类值,则会中止任务。 已中止的任务可以重试最多次数,该次数也可以配置。 如果每次重试时发生 timeout
,则部署作业将会失败。 可为每个部署配置这些属性。
解决方法:通过更新部署来增大部署的 timemout
值。 在参数 retry_settings
中配置这些属性。 默认已配置 timeout=30
和 retries=3
。 在确定 timeout
的值时,请考虑每批中要处理的文件数,以及其中每个文件的大小。 还可以减少文件,以考虑使用数量更多但大小更小的微批,从而加快执行速度。
ScriptExecution.StreamAccess.Authentication
记录的消息:ScriptExecutionException 是由 StreamAccessException 引起的。 StreamAccessException 是由 AuthenticationException 引起的。
原因:运行部署的计算群集无法装载数据资产所在的存储。 计算的托管标识无权执行装载。
解决方法:确保与运行部署的计算群集关联的标识至少对存储帐户拥有存储 Blob 数据读取者访问权限。 只有存储帐户所有者可以通过 Azure 门户更改访问级别。
数据集初始化失败
记录的消息:数据集初始化失败: UserErrorException: 消息: 无法装载数据集(id='xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',名称=“无”,版本=无)。 数据集的源不可访问,或者不包含任何数据。
原因:运行部署的计算群集无法装载数据资产所在的存储。 计算的托管标识无权执行装载。
解决方法:确保与运行部署的计算群集关联的标识至少对存储帐户拥有存储 Blob 数据读取者访问权限。 只有存储帐户所有者可以通过 Azure 门户更改访问级别。
数据集节点 [code] 引用了没有指定值或默认值的参数 dataset_param
记录的消息:数据集节点 [code] 引用了没有指定值或默认值的参数 dataset_param。
原因:提供给批处理终结点的输入数据资产不受支持。
解决方法:确保批处理终结点支持提供的数据输入。
用户程序失败并出现异常:运行失败,请查看日志了解详细信息
记录的消息:用户程序失败并出现异常:运行失败,请查看日志了解详细信息。 可以查看 logs/readme.txt 来了解日志的布局。
原因:运行评分脚本的 init()
或 run()
函数时出错。
解决方法:转到“输出 + 日志”并打开位于 logs > user > error > 10.0.0.X > process000.txt
处的文件。 你会看到 init()
或 run()
方法生成的错误消息。
ValueError: 没有可连接的对象
记录的消息:ValueError: 没有可连接的对象。
原因:生成的微批中的所有文件都已损坏或者其文件类型不受支持。 请记住,MLflow 模型支持一部分文件类型,如部署到批处理推理时的注意事项中所述。
解决方案:转到文件 logs/usr/stdout/<process-number>/process000.stdout.txt
并查找类似 ERROR:azureml:Error processing input file
的条目。 如果文件类型不受支持,请查看受支持文件的列表。 可能需要更改输入数据的文件类型,或者通过提供评分脚本来自定义部署,如使用具有评分脚本的 MLflow 模型中所述。
run() 未返回成功的微批项
记录的消息:run() 未返回成功的微批项。 请查看 https://aka.ms/batch-inference-documentation 中的“响应:run()”。
原因:批处理终结点无法以预期格式向 run()
方法提供数据。 原因可能是读取的文件损坏,或输入数据与模型 (MLflow) 签名不兼容。
解决方法:若要了解发生了什么情况,请转到“输出 + 日志”并打开位于 logs > user > stdout > 10.0.0.X > process000.stdout.txt
处的文件。 查找类似于 Error processing input file
的错误条目。 在该文件中应该可以找到有关为何无法正确读取输入文件的详细信息。
不允许 JWT 中的受众
上下文:使用其 REST API 调用批处理端点时。
原因:用于调用端点/部署的 REST API 的访问令牌指示为不同受众/服务颁发的令牌。 Azure Active Directory 令牌是为特定操作颁发的。
解决方案:生成要与批处理端点 REST API 一起使用的身份验证令牌时,请确保将 resource
参数设置为 https://ml.azure.com
。 请注意,此资源与使用 REST API 管理端点所需指示的资源不同。 所有 Azure 资源(包括批处理端点)都使用资源 https://management.azure.com
来管理它们。 确保在每个案例中使用正确的资源 URI. 请注意,如果要同时使用管理 API 和作业调用 API,你需要两个令牌。 有关详细信息,请参阅:批处理终结点上的身份验证 (REST)。
限制以及不支持的方案
设计依赖于批处理终结点的机器学习解决方案时,某些配置和方案可能不受支持。
不支持以下工作区配置:
配置了已启用隔离功能的 Azure 容器注册表的工作区。
使用客户管理的密钥 (CMK) 的工作区。
不支持以下计算配置:
Azure ARC Kubernetes 群集。
Azure Kubernetes 群集的精细资源请求(内存、vCPU、GPU)。 只能针对实例计数提出请求。
不支持以下输入类型:
表格数据集 (V1)。
文件夹和文件数据集 (V1)。
MLtable (V2)。
创作用于批处理部署的评分脚本。
批处理终结点上的身份验证。
批处理终结点中的网络隔离。