serialization.py 1010 B

12345678910111213141516171819202122232425262728293031323334
  1. import io
  2. import logging
  3. from typing import TYPE_CHECKING, Any
  4. if TYPE_CHECKING:
  5. pass
  6. import ray._private.utils
  7. import ray.cloudpickle as pickle
  8. import ray.exceptions
  9. from ray._private import ray_constants
  10. from ray.util import inspect_serializability
  11. logger = logging.getLogger(__name__)
  12. ALLOW_OUT_OF_BAND_OBJECT_REF_SERIALIZATION = ray_constants.env_bool(
  13. "RAY_allow_out_of_band_object_ref_serialization", True
  14. )
  15. def pickle_dumps(obj: Any, error_msg: str):
  16. """Wrap cloudpickle.dumps to provide better error message
  17. when the object is not serializable.
  18. """
  19. try:
  20. return pickle.dumps(obj)
  21. except (TypeError, ray.exceptions.OufOfBandObjectRefSerializationException) as e:
  22. sio = io.StringIO()
  23. inspect_serializability(obj, print_file=sio)
  24. msg = f"{error_msg}:\n{sio.getvalue()}"
  25. if isinstance(e, TypeError):
  26. raise TypeError(msg) from e
  27. else:
  28. raise ray.exceptions.OufOfBandObjectRefSerializationException(msg)