【发布时间】:2021-10-20 06:07:41
【问题描述】:
我正在尝试同时运行多个 Bert 模型副本。
我有一个包含池的 python 对象:
self.tokenizer = BertTokenizer.from_pretrained(BERT_LARGE)
self.model = BertForQuestionAnswering.from_pretrained(BERT_LARGE)
self.pool = Pool(processes=max_processes,
initializer=pool_init,
initargs=(self.model, self.tokenizer))
池中的每个进程都通过 Bert 标记器和模型进行复制:
process_model = None
process_tokenizer = None
def pool_init(m: BertForQuestionAnswering, t: BertTokenizer):
global process_model, process_tokenizer
process_model, process_tokenizer = m, t
要使用池,然后我运行
while condition:
answers = self.pool.map(answer_func, questions)
condition = check_condition(answers)
这种设计是为了避免每次初始化池时将Bert模型重新加载到每个进程中的大开销(每个进程大约需要1.5-2秒)。
问题 1。这是最好的方法吗?
问题 2。如果是这样,我应该什么时候打电话给self.pool.close() 和self.pool.join()?我想在check_condition() 函数之前join(),但我真的不想close() 池(除非直到对象的__del__())但是在调用join() 之前调用close() 给了我错误,并且调用 close() 会使池在将来无法调用。池只是不适合这类工作,我应该管理一系列进程吗?帮助...?
谢谢!!
【问题讨论】:
标签: python dictionary join multiprocessing pool