Python多进程处理CPU受限任务无法满负载运行问题排查
numpy多进程并行性能异常问题
我正在给一段重度依赖numpy的Python数值计算代码做并行化,代码需要在大量参数空间求解问题,理论上可通过多进程分配不同参数区域实现并行加速。
二维参数空间并行化伪代码
import numpy as np import itertools from multiprocessing import Pool import MyNumericalProblemSolver chunksize = 100 n_values_per_param = 50 n_processes = 8 p1_values = np.logspace(1,2,n_values_per_param) p2_values = np.logspace(3,5,n_values_per_param) param_iterator = itertools.product(p1_values,p2_values) solver = MyNumericalProblemSolver() def wrapper(params): p1,p2 = params solver.set_parameters(p1=p1,p2=p2) solver.solve() p = Pool(n_processes) p.map(wrapper,param_iterator,chunksize=chunksize)
CPU使用率异常表现
我的笔记本搭载Intel(R) Core(TM) i7-7700HQ CPU(8核),预期性能提升约8倍,但实际仅提升1.5倍,CPU使用率表现异常:
- 无多进程:单进程占100%CPU
- n_processes=1:单进程占100%CPU
- n_processes=2:2个进程各占100%CPU
- n_processes=4:4个进程各占50%CPU
- n_processes=8:8个进程各占25%CPU
总使用率最高仅200%。但在8个终端分别启动单进程版本时,每个进程均可占100%CPU。
已尝试的解决方案
- 修改chunksize,无效果
- 尝试用
os.system(f"taskset -p 0xff {os.getpid()}")重置CPU亲和性,os.sched_getaffinity(0)显示亲和性正常为{0,1,2,3,4,5,6,7},但问题依旧
numpy验证测试脚本
为验证是否为numpy本身的问题,编写了如下测试脚本:
from multiprocessing import Pool import numpy as np matrix_dim = 100 n_processes = 8 def test_function(x): for i in range(5000): matrix = np.random.rand(matrix_dim,matrix_dim) np.linalg.solve(matrix,np.ones(matrix_dim)) n_iter = 100 chunksize = 10 p = Pool(n_processes) p.map(test_function,range(n_iter),chunksize=chunksize)
原以为8个进程都会占100%CPU,但偶尔也会出现8个进程各占25%CPU的情况,且不同n_processes设置下性能无差异。
环境与补充信息
- 环境:conda虚拟环境,Python3.11,Ubuntu22.04
cat /proc/cpuinfo显示CPU型号为Intel(R) Core(TM) i7-7700HQ CPU @2.80GHzhwloc-ps -t显示所有8个进程均运行在Core:0上
内容的提问来源于stack exchange,提问作者Gianni Cataldi
相关产品推荐
相关产品推荐

