Python 3.7 Error: Unsupported Pickle Protocol 5

Python 3.7 Error: Unsupported Pickle Protocol 5

我正在尝试从 RLLib (json didn't work as shown in this post) 恢复一个 pickled 配置文件,并收到以下错误:

config = pickle.load(open(f"{path}/params.pkl", "rb"))

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-28-c964561b863c> in <module>
----> 1 config = pickle.load(open(f"{path}/params.pkl", "rb"))

ValueError: unsupported pickle protocol: 5

Python版本=3.7.0

如何在 3.7 中打开此文件?

使用pickle5或者载入python3.8+,然后使用protocol参数序列化为低版本

对于 pandas 在 python 3.8 中使用协议 5 将数据帧保存到 pickle 文件并需要将其加载到仅支持协议 4 的 python 3.6 的用户(我'我看着你 google colab):

!pip3 install pickle5
import pickle5 as pickle
with open(path_to_protocol5, "rb") as fh:
  data = pickle.load(fh)

也可以从 python 3.6

保存到 protocol-4 pickle
data.to_pickle(path_to_protocol4)

更新:如果从 stable-baselines3 加载模型时遇到此问题:

!pip install --upgrade --quiet cloudpickle pickle5
from stable_baselines3 import PPO
# restart kernel if in jupyter notebook

# Might not need this dict in all cases
custom_objects = {
    "lr_schedule": lambda x: .003,
    "clip_range": lambda x: .02
}
model = PPO.load("path/to/model.zip", custom_objects=custom_objects)

2021-05-31 测试环境:

cloudpickle: 1.6.0
pickle5: 0.0.11 
stable-baselines3: 1.0

参考:https://brainsteam.co.uk/2021/01/14/pickle-5-madness-with-mlflow/

如果由于 pickle5 的依赖性(主要是 Visual Building c++)而无法加载 pickle5,另一种解决方案可能是您更改正在使用的 Python 解释器(更改为旧解释器,在发生了错误)。对我来说,在我 运行 一个我在 Spyder 中 运行 的 IDLE 程序之后,我得到了这个错误。当我在 Spyder 中再次 运行 它时,它丢弃了这个错误。

Python Error: Unsupported Pickle Protocol 5 

为了解决这个问题,我在 Spyder 中将我的 Python 解释器更改为我在 IDLE 中使用的 Python(工具 -> 首选项)。重新启动 Spyder 后,我必须使用命令提示符安装必要的依赖项,以便在 Spyder 中可以使用控制台:

pip install spyder-kernels

自然地,这可能会在 Spyder 中引入一些异常(即,由于不同的解释器,它应该附带的包不再存在)。这些应该在调试时很容易被弄清楚,并使用标准 pip 安装解决。

一旦你恢复了你的(被认为丢失的)文件,考虑恢复到 Spyder 的 Python 解释器并更新代码以优雅地处理这个问题可能是明智的(如果有人可以,我会很高兴在评论中建议如何做到这一点不需要 pickle5!)

如果此错误是由于 heroku 部署 引起的,请检查您的 python 版本的本地设置和 heroku 设置。 如果两者不同,则可能会导致您出现此错误。
解决方案:

  • 在应用程序的基目录中创建一个 runtime.txt 文件

然后在你的 runtime.txt 中提及你的本地 python 版本,这样就不会有冲突。

python-3.9.2