AgentGym
AgentGym copied to clipboard
WebShop Server内存耗尽导致Online-RL训练崩溃
WebShop Server内存耗尽导致Online-RL训练崩溃
环境信息
- 操作系统: Debian GNU/Linux 12 (bookworm)
- 硬件: 503GB RAM, 256 cores
- JRE版本: OpenJDK 11.0.29
- 训练时长: 约2.5小时后崩溃
问题描述
在进行WebShop Online-RL训练时,WebShop Server进程(JVM)因内存不足而崩溃,导致训练中断并报ConnectionError。
错误日志
JVM崩溃日志 (hs_err_pid1554723.log):
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 16384 bytes for committing reserved memory.
...
Threads class SMR info:
_java_thread_list=0x00007f933c1f3e80, length=1764, elements={
...
训练日志片段:
(WorkerDict pid=1601514) 404
(WorkerDict pid=1601514) {'env_idx': 36043776}
(WorkerDict pid=1601514) Error during closing env
根因分析
经排查发现以下问题:
1. 环境实例未被正确清理(代码Bug)
位置: agentenv-webshop/agentenv_webshop/environment.py:100
def __del__(self):
for idx in self.ls:
self.env[idx].close # 应该是缺少括号,方法未被调用
print(f"-------Env {idx} closed--------")
2. 资源泄漏
由于close()未被调用,导致:
- 环境实例从不释放
- 关联的Java线程累积(崩溃时达到1764个线程)
- Lucene搜索引擎相关资源无法回收
- JVM堆和本地内存持续增长
复现步骤
- 启动WebShop Server:
webshop --port 36001 - 运行Online-RL训练脚本(如verl的PPO训练)
- 训练配置:
train_batch_size=16,rollout_sample_num=4 - 等待约2-3小时,Server崩溃
建议修复
- 修复close()调用: 在
environment.py:100添加括号 - 添加主动清理机制: 在Server端添加
/close接口,让客户端主动释放环境 - 限制JVM内存上限: 启动时设置
-Xmx参数防止无限增长 - 改进环境池管理: 当达到
sz=8000上限时,拒绝创建新环境而非复用(第31-35行的复用逻辑可能导致状态混乱)
影响范围
该问题影响所有使用WebShop进行Online-RL训练的场景,特别是长时间训练任务。
感谢维护者的辛勤工作!如需更多日志或复现信息,请告知。
我加了()还是会卡住,请问你还改了啥吗?
我之前会遇到Java虚拟机内存不足的问题,不妨试试增加分配给Java虚拟机的内存:
export JAVA_OPTS="-Xmx4g -Xms2g" # 最大4GB,初始2GB
webshop --host 0.0.0.0 --port 36001