python - 多处理;如何调试:_pickle.PicklingError: 由于需要深度递归,无法腌制对象
问题描述
我有一个可以使用 Python 代码运行的模拟,并希望使用SubProcVecEnv
from创建它的多个实例stable-baselines3
。这使用子处理在不同的内核上运行模拟,并且在我对我的代码进行了一些更改之前它正在工作。但是,现在我收到下面的错误并且不知道如何调试它,因为我不明白我的代码的哪一部分导致了它。有没有办法找出导致超出递归深度的对象/方法?我也不记得在我的代码中的任何地方写过递归方法。研究错误消息没有成功。
/home/philipp/anaconda3/envs/sumo_rl/lib/python3.8/site-packages/gym/logger.py:30: UserWarning: WARN: Box bound precision lowered by casting to float32
Traceback (most recent call last):
File "/home/philipp/anaconda3/envs/sumo_rl/lib/python3.8/site-packages/cloudpickle/cloudpickle_fast.py", line 563, in dump
return Pickler.dump(self, obj)
File "/home/philipp/anaconda3/envs/sumo_rl/lib/python3.8/site-packages/cloudpickle/cloudpickle_fast.py", line 639, in reducer_override
if sys.version_info[:2] < (3, 7) and _is_parametrized_type_hint(obj): # noqa # pragma: no branch
RecursionError: maximum recursion depth exceeded in comparison
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/philipp/Code/ba_pw/train.py", line 84, in <module>
venv = utils.make_venv(env_class, network, params, remote_ports, monitor_log_dir)
File "/home/philipp/Code/ba_pw/sumo_rl/utils/utils.py", line 170, in make_venv
return vec_env.SubprocVecEnv(env_fs)
File "/home/philipp/anaconda3/envs/sumo_rl/lib/python3.8/site-packages/stable_baselines3/common/vec_env/subproc_vec_env.py", line 106, in __init__
process.start()
File "/home/philipp/anaconda3/envs/sumo_rl/lib/python3.8/multiprocessing/process.py", line 121, in start
self._popen = self._Popen(self)
File "/home/philipp/anaconda3/envs/sumo_rl/lib/python3.8/multiprocessing/context.py", line 291, in _Popen
return Popen(process_obj)
File "/home/philipp/anaconda3/envs/sumo_rl/lib/python3.8/multiprocessing/popen_forkserver.py", line 35, in __init__
super().__init__(process_obj)
File "/home/philipp/anaconda3/envs/sumo_rl/lib/python3.8/multiprocessing/popen_fork.py", line 19, in __init__
self._launch(process_obj)
File "/home/philipp/anaconda3/envs/sumo_rl/lib/python3.8/multiprocessing/popen_forkserver.py", line 47, in _launch
reduction.dump(process_obj, buf)
File "/home/philipp/anaconda3/envs/sumo_rl/lib/python3.8/multiprocessing/reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
File "/home/philipp/anaconda3/envs/sumo_rl/lib/python3.8/site-packages/stable_baselines3/common/vec_env/base_vec_env.py", line 372, in __getstate__
return cloudpickle.dumps(self.var)
File "/home/philipp/anaconda3/envs/sumo_rl/lib/python3.8/site-packages/cloudpickle/cloudpickle_fast.py", line 73, in dumps
cp.dump(obj)
File "/home/philipp/anaconda3/envs/sumo_rl/lib/python3.8/site-packages/cloudpickle/cloudpickle_fast.py", line 570, in dump
raise pickle.PicklingError(msg) from e
_pickle.PicklingError: Could not pickle object as excessively deep recursion required.
解决方案
推荐阅读
- php - 为 Laravel 中的所有记录设置列 null
- python - 我需要 PYTHONPATH
- jquery - 输入芯片后,如何将 Materialise 芯片输入保持为有效?
- java - Jena OntModel SubModel(Model) API 可以传入 OntModel 吗?
- r - r 中带有日期的函数和绘图
- amazon-web-services - 停止并启动在 EC2 和 mysql RDS 上运行 php 的 AWS Elastic Beanstalk
- javascript - 自定义下拉选择组件的角色
- java - RegEx 用于匹配两个大写字母的两个单词
- php - PHP - 如何计算您回显文本但将其放在顶部的次数?
- r - 使用 Stienen 集和膨胀在组中隔离单例