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.

La forma más eficiente de ejecutar el lematizador de Spacy con Dataflow.

Intento procesar datos provenientes de BigQuery.

Creé un pipeline con Apache Beam de la siguiente manera:

nlp = fr_core_news_lg.load()

class CleanText(beam.DoFn):
  def process(self, row):
    row['descriptioncleaned'] = ' '.join(unidecode.unidecode(str(row['description'])).lower().translate(str.maketrans(string.punctuation, ' '*len(string.punctuation))).split())
    yield row

class LemmaText(beam.DoFn):
  def process(self, row):
    doc = nlp(row['descriptioncleaned'], disable=["tagger", "parser", "attribute_ruler", "ner", "textcat"])
    row['descriptionlemmatized'] = ' '.join(list(set([token.lemma_ for token in doc])))
    yield row

with beam.Pipeline(runner="direct", options=options) as pipeline:
  soft = pipeline \
  | "GetRows" >> beam.io.ReadFromBigQuery(table=table_spec, gcs_location="gs://mygs") \
  | "CleanText" >> beam.ParDo(CleanText()) \
  | "LemmaText" >> beam.ParDo(LemmaText()) \
  | 'WriteToBigQuery' >> beam.io.WriteToBigQuery('mybq', custom_gcs_temp_location="gs://mygs", create_disposition="CREATE_IF_NEEDED", write_disposition="WRITE_TRUNCATE")

Básicamente, carga datos de mi tabla de BigQuery, limpia una de las columnas (de tipo string) y lematiza utilizando el lematizador de Spacy. Tengo aproximadamente 8 millones de líneas y cada cadena es bastante grande, aproximadamente 300 palabras.

Al final, todo suma y tarda más de 15 horas en completarse. Y tenemos que ejecutarlo todos los días.

No entiendo realmente por qué tarda tanto en ejecutarse en DataFlow, que supuestamente funciona de manera paralela.

Ya he utilizado pipe de Spacy pero no puedo hacerlo funcionar correctamente con Apache Beam.

¿Hay alguna forma de acelerar el procesamiento de Spacy utilizando DataFlow o de paralelizarlo mejor?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Dado que el conjunto de datos es grande y el procesamiento de texto es intensivo en poder computacional, el tiempo de procesamiento del pipeline se puede mejorar ajustando finamente el pipeline de Apache Beam. Aquí hay algunas sugerencias para acelerar el procesamiento de Spacy utilizando DataFlow o paralelizarlo de manera más efectiva:

    1. Utilizar instancias más grandes para los trabajadores de DataFlow: Por defecto, DataFlow utiliza instancias n1-standard-1 que tienen solo 1 vCPU y 3.75 GB de memoria. Intenta utilizar instancias más grandes con más núcleos y memoria. Esto permitirá que el pipeline paralelice el procesamiento de texto de manera más eficiente.
    2. Minimizar la redistribución de datos: La redistribución de datos puede ser un cuello de botella en los pipelines de procesamiento de datos. En el pipeline dado, la salida de la función CleanText se redistribuye y se envía a la función LemmaText. Esto se puede minimizar utilizando una sola función que realiza tanto la limpieza como la lematización en un solo paso para evitar la redistribución de datos.

    3. Utilizar modelos Spacy apropiados: Spacy tiene diferentes modelos optimizados para diferentes casos de uso. El pipeline actual está utilizando el modelo fr_core_news_lg, que es un modelo grande y puede que no sea la mejor opción para todos los casos de uso. Intenta experimentar con diferentes modelos y observa si hay alguna mejora en el tiempo de procesamiento.

    4. Utilizar streaming en lugar de modo por lotes: Si los datos están llegando a una tabla de BigQuery en un flujo continuo, considera utilizar DataFlow en modo de streaming para procesar los datos en tiempo real. Esto permitirá que el pipeline procese solo los datos que llegan, en lugar de volver a procesar todo el conjunto de datos cada día.

    Al implementar estas optimizaciones, es posible mejorar el tiempo de procesamiento del pipeline de Apache Beam.

Comments are closed.