Многопроцессорная производительность для функций внутри конвейера кода - PullRequest
0 голосов
/ 18 января 2019

Итак, я распараллеливаю конвейер кода, где я в основном занимаюсь тематическим моделированием большого количества документов. Обучающая часть для вычисления tfidf и других вещей является отдельным самостоятельным процессом.

Для генерации выходных данных это кажется мне довольно параллельной проблемой. Каждый документ должен в основном проходить одни и те же шаги, поэтому, по моему мнению, все они могут работать на отдельных ядрах в отдельных процессах одновременно.

Я использую multiprocessing.Pool для создания пулов, а затем назначаю им отдельный документ. Когда я вижу время выполнения внутренних функций, таких как вычисление сходства в wordnet для разных токенов, pos-теги токенов и нахождение позиций заголовков в документах и ​​т. Д., Я вижу значительное увеличение времени выполнения всех этих функций. Такое увеличение времени выполнения этих функций в конечном итоге делает многопроцессорную работу бесполезной. Может кто-нибудь объяснить, пожалуйста, это нормальное поведение или я должен посмотреть на него.

PS: машина показывает 36 ядер. Поскольку я увеличиваю количество объединенных процессов, время в функциях также начинает увеличиваться. Я создаю экземпляр этого класса в моем скрипте «run.py» и вызываю основную функцию для выполнения. Вот мой код:

class TitleGenerator:
    def main(self):


        """Loading necessary objects in parent process"""

        # Start generating titles
        if self.options.generate_titles:
            self.parallel_titles()

    def parallel_titles(self):
    """ Generates titles for all documents and writes to output file
    """
        # Files for writing the outputs
        with open(output_file, "w") as out:
            csv_writer = csv.writer(out)
            csv_writer.writerow(column_names)

        # iterable target ids
        document_ids = list(document_ids) #around 200000 in number
        # document_ids is a list of lists where every inside list contains 200 entries i.e. we pass 200 documents to one worker in one go.        

        pool = mp.Pool(10)

        # mapping the job to pools
        pool.map(self.worker_func, document_ids)
        pool.close()
        pool.join()

    def worker_func(self, doc_id):
    """ Worker function used through the multiprocessing pool to generate titles and write to output file

    Args:
        document_id : target_id for which titles are to be returned.
    """

        import spacy
        _nlp_model = spacy.load("en_core_web_sm")
        for target_id in doc_id:

            with open(filepath.review_tags_output, 'a') as out:
                csv_writer_res = csv.writer(out)
                # function that produces titles
                titles = self.generate_titles(doc_id, w2vmodel,tfidfmodel, _nlp_model) 

                # function that uses regex stuff to find the positions of titles in text and writes it to a csv file
                find_titles(target_id, titles, _nlp_model, csv_writer_res) 
                del titles
            gc.collect()


    def self.generate_titles(doc_id, word2vecmodel, tfidfmodel, _nlp_model):
    """ Get titles from the documents
    """

    def find_titles(doc_id, titles, dataframe , nlp_model, csv_writer=None):
   """ Finds the position of titles in document and writes the output.
   """    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...