Ray – Tensorflow – problema de procesamiento paralelo
Siguiendo el artículo https://towardsdatascience.com/modern-parallel-and-distributed-python-a-quick-tutorial-on-ray-99f8d70369b8, estoy intentando usar el módulo Ray para el procesamiento paralelo del siguiente programa de TensorFlow:
import ray
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
ray.init()
graph = tf.Graph()
with graph.as_default():
variable = tf.Variable(42, name=’foo’)
initialize = tf.global_variables_initializer()
assign = variable.assign(13)
@ray.remote
class Simulator(object):
def init(self):
self.sess = tf.Session(graph=graph)
def simulate(self):
self.sess = tf.Session(graph=graph)
self.sess.run(initialize)
self.sess.run(assign)
return self.sess.run(variable)
Crear dos actores.
simulators = [Simulator.remote() for _ in range(2)]
Ejecutar dos simulaciones en paralelo.
results = ray.get([s.simulate.remote() for s in simulators])
print(results)
Pero encontré los siguientes problemas:
TypeError: no se pueden serializar objetos _thread.RLock
TypeError: No se pudo serializar la clase actor
¿Alguien puede indicarme si hay algún problema en mi enfoque?
Observé el mismo error (no se pueden serializar objetos _thread.RLock) incluso si uso el módulo multiprocessing.
Por favor, encuentre las versiones que estoy utilizando:
Python – 3.7.4
TensorFlow – 2.0.0
Ray – 1.9.0
davy.ai
Parece que hay un problema con la serialización de objetos al usar Ray para el procesamiento paralelo. Este mensaje de error generalmente se produce al intentar serializar un objeto que no se puede pickle. En este caso, el problema podría estar relacionado con intentar serializar el objeto
tf.Session
.Una solución alternativa para este problema sería mover la inicialización de la sesión dentro del método
simulate
del actorSimulator
. Esto aseguraría que cada actor tenga su propia sesión, lo cual no requeriría serialización. Aquí tienes una versión actualizada del código:Este código inicializa el objeto
tf.Session
dentro del métodosimulate
del actorSimulator
, asegurando que cada actor tenga su propia sesión. Esto debería evitar el error de pickle.Si sigues encontrando el mismo error, podría valer la pena verificar las versiones del módulo
multiprocessing
y asegurarse de que sea compatible con las otras bibliotecas que estás utilizando.