Azure ML Pipeline运行GridSearchCV时出现TerminatedWorkerError如何解决
修复Azure ML Pipeline中GridSearchCV报TerminatedWorkerError(SIGKILL)的方案
报错根因:该错误是Pipeline运行环境的工作进程内存占用超过配额,被操作系统强制终止,本地运行无问题是因为本地设备的内存/资源分配远高于Azure ML默认给Pipeline子节点的配额,可按以下步骤排查修复:
- 首先调整GridSearchCV的并行参数,将
n_jobs参数调小,或直接设为1禁用并行先验证问题根因。GridSearchCV多进程运行时会为每个worker复制一份数据集和模型副本,Pipeline环境下节点内存配额不足时会直接触发OOM kill。 - 升级Azure ML Pipeline绑定的计算节点规格,在Pipeline定义的
compute_target参数中指定内存≥32G的计算集群SKU,同时确认集群的节点资源配额没有被其他任务占用。 - 增大Pipeline单步的资源配额限制,可在PythonScriptStep定义中添加额外参数指定资源阈值,参考配置如下:
from azureml.pipeline.core import PythonScriptStep grid_search_step = PythonScriptStep( name="grid_search_train", script_name="train.py", compute_target=compute_target, source_directory="./code", allow_reuse=False, arguments=["--max_memory", "32g"] )
- 关闭并行框架的冗余资源占用,在GridSearchCV初始化前添加如下环境变量配置:
import os # 限制OpenMP线程数避免和joblib并行抢占资源 os.environ['OMP_NUM_THREADS'] = '1' # 指定joblib临时文件目录避免内存缓存溢出 os.environ['JOBLIB_TEMP_FOLDER'] = '/tmp' # 禁用MKL的多余并行线程 os.environ['MKL_NUM_THREADS'] = '1'
- 增大运行容器的共享内存配额,若使用Estimator/Environment提交Pipeline任务,在环境配置中添加Docker参数:
docker_args=['--shm-size', '16g']。Azure ML默认容器共享内存仅为64M,无法满足多进程场景下GridSearchCV的IPC通信需求,极易触发进程崩溃。 - 调整数据加载逻辑,不要直接从Azure ML数据集挂载路径流式读取训练数据,先将数据集下载到计算节点的本地临时目录后再加载到内存,避免挂载链路的额外内存开销。
内容的提问来源于stack exchange,提问作者mark_r
相关产品推荐
相关产品推荐

