google / gin-config

Gin provides a lightweight configuration framework for Python
Apache License 2.0
2.04k stars 120 forks source link

Error when pickling objects configured with Gin #196

Open erenz14 opened 1 year ago

erenz14 commented 1 year ago

apologies in advance as I had to type this on my phone

I'm getting the following error when trying to pickle an instance of a class that is configured with gin:

Error:

TypeError: cannot pickle '_thread.lock' object

Code that triggers the error:

import io
import cloudpickle as cp
import gin

@gin.configurable
class Car:
     def __init__(self.horn_noise: str):
          self.horn_noise = horn_noise

     def honk(self):
          print

gin.parse_config_files_and_bindings(config_files=[], bindings=['Car.horn_noise = "beep beep!"'])

car = Car()
car_pkl_bytes = cp.dumps(car)
loaded_car = cp.load(io.BytesIO(car_pkl_bytes)

A workaround is referenced in this issue, but it involves installing dask (or pulling the SerializableLock class into my project) and for some reason even though this workaround allows me to pickle and unpickle a gin configured class, I have to run gin.parse_config_files_and_bindings again after unpickling so that the instance works properly: https://github.com/google/gin-config/issues/8

erenz14 commented 1 year ago

Forgot to include my versions:

python=3.8.0 cloudpickle=2.2.1 gin-config=0.5.0