SageMaker运行Ray RLlib设num_workers=7报The actor died错误如何解决?
解决方案
核心原因说明
8核CPU环境下设置num_workers=7属于资源超配:Ray的主训练进程(Driver)本身需要占用至少1核,加上SageMaker环境自带的系统后台进程也会占用部分资源,所有CPU核心被占满后会出现调度阻塞,再叠加你配置的批次采样量较大,多worker并行时内存占用飙升,会触发系统OOM Killer主动杀掉worker进程,最终抛出actor意外死亡的报错。
具体修复步骤
- 调整worker数量配置
不要使用num_cpus - 1的极限配置,8核环境下建议将num_workers调整为46,预留23核给Driver进程和系统任务使用,避免资源占满。同时可以在config中新增num_cpus_per_worker: 1参数,显式限制每个worker的CPU配额,避免资源抢占。
"config": { # 原有配置保留 "num_workers": 5, "num_cpus_per_worker": 1, }
- 降低采样批次大小,避免内存溢出
你当前配置的train_batch_size=100000、sgd_minibatch_size=32768数值过大,多worker并行时每个worker都要缓存采样数据,长时间运行后内存占用会持续升高触发OOM。建议先下调参数测试:
"config": { # 原有配置保留 "train_batch_size": 30000, "sgd_minibatch_size": 8192, }
- 修复环境注册的序列化问题
你当前使用lambda匿名函数注册环境,多worker进程启动时需要序列化/反序列化环境创建逻辑,lambda的闭包特性很容易导致反序列化失败,worker启动失败直接崩溃。替换为显式的命名函数即可:
# 把lambda换成显式函数定义 def env_creator(env_config): return create_env(env_config) class MyLauncher(SageMakerRayLauncher): def register_env_creator(self): register_env( "RiveRL-v1", env_creator ) # 其余代码保留
- 新增容错配置
在rllib config中新增worker自动重建配置,避免单次worker崩溃直接终止训练:
"config": { # 原有配置保留 "ignore_worker_failures": True, "recreate_failed_workers": True, "max_failures": 3, }
- 升级Ray版本(可选)
你当前使用的Python3.6对应的Ray版本较低,旧版本Ray存在较多worker泄漏、异常崩溃的已知bug,如果上述配置调整后仍有报错,可以升级到兼容sagemaker_rl的最新稳定Ray版本。
如果以上调整都无法满足你的性能要求,建议更换更高配置的SageMaker CPU实例,比如16核的ml.c5.4xlarge,获得更多的CPU和内存资源支持更高的worker数。
内容的提问来源于stack exchange,提问作者Amir Reza SH
相关产品推荐
相关产品推荐

