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

scvi-tools中SCVI.train()线程占用过多的限制方法咨询

解决scvi.model.SCVI.train()线程占用过高的方法

针对你在CPU环境下使用scvi-tools时,SCVI.train()线程占用超出预期的问题,可尝试以下几种有效方案:

1. 提前设置底层数值计算库的线程数

PyTorch、scvi-tools依赖的NumPy、BLAS/MKL等底层库会独立管理线程,仅设置PyTorch或scvi的线程数可能无法生效。需在导入任何库之前设置环境变量,强制限制这些库的线程数:

import os

# 限制各类数值计算库的线程数为10
os.environ["OMP_NUM_THREADS"] = "10"
os.environ["OPENBLAS_NUM_THREADS"] = "10"
os.environ["MKL_NUM_THREADS"] = "10"
os.environ["VECLIB_MAXIMUM_THREADS"] = "10"
os.environ["NUMEXPR_NUM_THREADS"] = "10"

# 之后再导入其他库
import scvi
import torch
import anndata

# 设置scvi和PyTorch的线程数
scvi.settings.num_threads = 10
torch.set_num_threads(10)
torch.set_num_interop_threads(10)  # 额外设置跨操作线程数

2. 调整train()方法的num_workers参数

SCVI.train()中的num_workers参数控制数据加载的子进程/线程数,默认值可能根据CPU核心数自动设置,导致额外线程占用。可显式设置该参数,建议与总线程数匹配或设为0(主进程加载数据,无额外线程):

scvi.model.SCVI.setup_anndata(adata_scvi, layer="counts", batch_key=batch_key)
model_scvi = scvi.model.SCVI(adata_scvi)
# 设置num_workers为10,或根据需求调整为0/合适数值
model_scvi.train(num_workers=10)

3. 验证线程设置是否生效

可通过以下代码确认线程限制是否生效:

# 检查PyTorch线程设置
print(torch.get_num_threads())
print(torch.get_num_interop_threads())

# 检查scvi线程设置
print(scvi.settings.num_threads)

# 检查NumPy线程设置(需导入numpy后)
import numpy as np
print(np.__config__.show())

内容的提问来源于stack exchange,提问作者Hyeok An

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:23:18