Zxilly
Try to be 1%
Zxilly's Blog
NLP 学习笔记——在 Kaggle Notebook 上使用多进程加速文本预处理

前情提要

在学习 NLP 的新手教程 Bag of Words Meets Bags of Popcorn 这个比赛的 Overview 的教程里有一个把每篇文本切分成按句划分的单词 list 的预处理过程,原文的代码是这样的:

sentences = []  # Initialize an empty list of sentences

print "Parsing sentences from training set"
for review in train["review"]:
    sentences += review_to_sentences(review, tokenizer)

print "Parsing sentences from unlabeled set"
for review in unlabeled_train["review"]:
    sentences += review_to_sentences(review, tokenizer)

运行之后会花费长达五分钟的时间完成对 75000 篇电影测评文段预处理的过程,非常难等·。.|||
而且整个过程中可以看到 kaggle kernel 提供的四颗 cpu 只有最高 120% 的占用,所以想到通过创建多个进程来提速,节省预处理环节的时间。借助 multiprocessing 这个自带的库,写出来是这样的:

import multiprocessing
def fillup(dataset):
    count = 0
    sentences1 = []
    for i in dataset["review"]:
        sentences1 += review_to_sentences(i,tokenizer) #review_to_sentences() 为预处理函数
        count += 1
        print(count)
    print("com")
    return sentences1

pool = multiprocessing.Pool(2)
sets = [train,unlabeled_train]
result = pool.map(fillup,sets)

在 pool 里创建的两个进程分别用来处理 train 和 unlabeled_train 这两个数据集

然后一运行我的 chrome 就直接卡死无响应了·。.|||

经过反复排查发现是循环内的 print(count) 的原因…… 推测是两个进程同时往 notebook 的输入框塞东西,造成了某些未知的性能问题,考虑到 Overview 里面也没提到可以多进程,只是让人在屏幕前傻等几分钟,可能 kernels 的前端开发也没想到这个问题。。。

去掉 fillup 里面的 print(count) 后上文代码就可以正常运行了。cpu 占用稳定在 200%,只花了三分钟左右。


之后我转换了一下思路,重写了 fillup 这里的代码,改成了读入一个文段输出一个句子组成的 list,然后直接 map 到数据集上,用 Pool 同时运行四个进程。

import multiprocessing

def element_fillup(data):
    sentence2 = review_to_sentences(data,tokenizer) #review_to_sentences() 为预处理函数
    return sentence2

pool = multiprocessing.Pool(4)

result_ele1 = []
result_ele2 = []

result_ele1 = pool.map(element_fillup,train['review'])
result_ele2 = pool.map(element_fillup,train['review'])

print("com")

这下子 cpu 占用直接起飞了:

只用了一分 23 秒就完成了 75000 个文段的预处理,对比原来要等五分钟,效率提升很明显
最后把得到的 list 合并然后重新 merge 一下就得到和 Overview 里的代码一样的结果了·。.

result_ele = result_ele1 + result_ele2
result = []
for i in result_ele:
    result += i #合并每个文段产生的句子 list
result[0]
'''
Output:['with',
 'all',
 'this',
 'stuff',
 'going',
 'down',
 'at',
 'the',
 'moment',
 'with',
 'mj',
 'i',
 've',
 'started',
 'listening',
 'to',
 'his',
 'music',
 'watching',
 'the',
 'odd',
 'documentary',
 'here',
 'and',
 'there',
 'watched',
 'the',
 'wiz',
 'and',
 'watched',
 'moonwalker',
 'again']
 '''

2020-09-10 23:03:56 星期四

参考了kaggle社区的一篇文章:https://www.kaggle.com/donkeys/preprocessing-with-python-multiprocessing#Preprocessing-with-Multiprocessing
没有标签
首页      代码      NLP 学习笔记——在 Kaggle Notebook 上使用多进程加速文本预处理

phantivia

文章作者

发表评论

textsms
account_circle
email

  • phantivia

    写得很好,学习了!

    2周前 回复

Zxilly's Blog

NLP 学习笔记——在 Kaggle Notebook 上使用多进程加速文本预处理
前情提要 在学习NLP的新手教程Bag of Words Meets Bags of Popcorn这个比赛的Overview的教程里有一个把每篇文本切分成按句划分的单词list的预处理过程,原文的代码是这样的: sentences =…
扫描二维码继续阅读
2020-09-10