如何限制Spacy占用的CPU核心数量?
如何限制spaCy的CPU占用率
嘿,在共享机器上跑spaCy遇到CPU占满的情况太常见了!我来给你梳理几个靠谱的解决办法,分版本说更清楚:
如果你用的是spaCy v3.x及以上版本
首先要注意:旧版本里的n_threads参数在v3之后已经被弃用啦,现在得用n_process来控制进程数,另外还能从底层限制线程数:
1. 用n_process指定进程数
直接在nlp.pipe()里设置n_process为你想分配的进程数,比如只给1个进程,再配合调小batch_size(减少单次处理的句子量,降低资源消耗):
# 其他代码不变,只修改pipe这一行 for sentence in nlp.pipe(sentences, n_process=1, batch_size=32): for token in sentence : print( "\t".join( [ token.text, token.lemma_, token.tag_ ] ) )
2. 底层限制OpenMP线程数
spaCy依赖的计算库(比如OpenMP、MKL)有时候会偷偷开多线程,就算你设置了n_process=1也没用。这时候可以在代码最开头设置环境变量,把这些库的线程数锁死:
import os # 强制限制各类计算库只用1个线程 os.environ["OMP_NUM_THREADS"] = "1" os.environ["MKL_NUM_THREADS"] = "1" os.environ["OPENBLAS_NUM_THREADS"] = "1" # 之后再导入spaCy和NLTK from nltk import sent_tokenize import spacy # 剩下的代码正常写 file = './walden.txt' nlp = spacy.load('en') handle = open(file, 'r') text = handle.read() sentences = sent_tokenize(text) for sentence in nlp.pipe(sentences, n_process=1): for token in sentence : print( "\t".join( [ token.text, token.lemma_, token.tag_ ] ) )
如果你还在使用spaCy v2.x版本
你的代码里已经用了n_threads=1,这个在v2里是有效的,但如果还是CPU占用过高,同样可以加上上面的环境变量设置。另外也可以试试调小batch_size,让spaCy每次处理更少的句子,减轻CPU压力:
for sentence in nlp.pipe(sentences, n_threads=1, batch_size=32): # 你的处理逻辑
额外小技巧
- 如果你不需要spaCy的全部功能(比如只需要词性标注和命名实体识别),尽量用轻量级模型,比如
en_core_web_sm(其实你代码里的en就是它),别用重型的transformer模型(比如en_core_web_trf),后者CPU占用会高很多。 - 在共享机器上跑的时候,尽量避开大家都在用的高峰时段,或者和同事打个招呼,这样能减少资源冲突~
内容的提问来源于stack exchange,提问作者ericleasemorgan
相关产品推荐
相关产品推荐

