You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:53:54