es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , ,

Answer

  1. Avatar for 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 actor Simulator. 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:

    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):        
            pass
    
    
        def simulate(self):
            with tf.Session(graph=graph) as sess:
                sess.run(initialize)
                sess.run(assign)        
                return 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)
    

    Este código inicializa el objeto tf.Session dentro del método simulate del actor Simulator, 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.

Comments are closed.