Estoy tratando de restaurar un archivo de configuración en escabeche de RLLib ( json no funcionó como se muestra en esta publicación ) y obtengo el siguiente error:
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: 5Versión de Python = 3.7.0
¿Cómo puedo abrir este archivo en 3.7?
En el caso de que no puedas cargar pickle5 por sus dependencias (principalmente Visual Building c++), otra solución podría ser que cambies el intérprete de Python que estás usando (al antiguo, antes de que ocurriera el error). Para mí, recibí este error después de ejecutar un programa en IDLE que había estado ejecutando en Spyder. Cuando lo ejecuté nuevamente dentro de Spyder, dejó caer este error.
Python Error: Unsupported Pickle Protocol 5Para resolver esto, en Spyder cambié mi intérprete de Python al Python que estaba usando con IDLE (Herramientas -> Preferencias). Una vez que reinicié Spyder, tuve que instalar las dependencias necesarias con el símbolo del sistema para que dentro de Spyder se pudiera usar la consola:
pip install spyder-kernelsNaturalmente, esto puede introducir algunas irregularidades dentro de Spyder (es decir, los paquetes con los que se supone que viene ya no están allí debido al intérprete diferente). Estos deben detectarse fácilmente durante la depuración y resolverse mediante instalaciones de pip estándar.
Una vez que recupere sus archivos (que cree que se han perdido), podría ser prudente pensar en volver al intérprete Python de Spyder y actualizar el código para manejar este problema con elegancia (me encantaría que alguien sugiriera en los comentarios cómo hacer esto que no ¡no requiere pickle5!)
Si este error se debe a la implementación de heroku , verifique su versión de python de la configuración local y la configuración de heroku. Si ambos son diferentes, es posible que te lleve a este error.
Solución:
Luego, dentro de su runtime.txt, mencione su versión local de python para que no haya conflictos.
python-3.9.2Para los usuarios de pandas que guardaron un marco de datos en un archivo pickle con el protocolo 5 en python 3.8 y necesitan cargarlo en python 3.6, que solo admite el protocolo 4 (lo estoy mirando, google colab ):
!pip3 install pickle5 import pickle5 as pickle with open(path_to_protocol5, "rb") as fh: data = pickle.load(fh)También podría guardarse en un pickle de protocolo 4 de python 3.6
data.to_pickle(path_to_protocol4)Actualización: si se enfrenta a esto al cargar un modelo desde 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)Probado el 2021-05-31 con env:
cloudpickle: 1.6.0 pickle5: 0.0.11 stable-baselines3: 1.0Referencia: https://brainsteam.co.uk/2021/01/14/pickle-5-madness-with-mlflow/