Итак, я распараллеливаю конвейер кода, где я в основном занимаюсь тематическим моделированием большого количества документов. Обучающая часть для вычисления 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.
"""