首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >访问附加到训练类的数据时的多cpu使用率

访问附加到训练类的数据时的多cpu使用率
EN

Stack Overflow用户
提问于 2013-06-08 03:32:41
回答 1查看 114关注 0票数 1

我有一个应用程序,它使用许多继承自HasTraits的类。其中一些类管理对数据的访问,另一些类提供分析数据的函数。这对于gui来说非常有效--我可以检查数据和分析代码是否做了它应该做的事情。但是,我注意到,当我使用这些类进行gui较少的计算时,系统上的所有cpus最终都会被使用。

下面是一个显示cpu使用率的小示例:

代码语言:javascript
运行
复制
from traits.api import HasTraits, List, Int, Enum, Instance
import numpy as np
import psutil
from itertools import combinations

"""
Small example of high CPU usage by traited classes
"""

class DataStorage(HasTraits):
    nsamples = Int(2000)
    samples  = List

    def _samples_default(self):
        return np.random.randn(self.nsamples,2000).tolist()

    def sample_samples(self,indices):
        """ return a 2D array of data at indices """
        return np.array(
                [self.samples[i] for i in indices])

class DataAccessor(HasTraits):
    """ Class that grabs data and computes something """
    measure = Enum("correlation","covariance")
    data_source = Instance(DataStorage,())

    def compute_measure(self,indices):
        """ example of some computation """
        samples = self.data_source.sample_samples(indices)
        percentage = psutil.cpu_percent(interval=0, percpu=True)
        if self.measure == "correlation":
            result = np.corrcoef(samples)
        elif self.measure == "covariance":
            result = np.cov(samples)
        return percentage

# Run a simulation to see cpu usage
analyzer = DataAccessor()
usage = []
n_iterations = 0
max_iterations = 500
for combo in combinations(np.arange(2000),500):
    # evaluate the measurement on a subset of the data
    usage.append(analyzer.compute_measure(combo))
    n_iterations += 1
    if n_iterations > max_iterations:
        break
    print n_iterations

use_percents = np.array(usage).T

当我在一台运行CentOS的8-cpu机器上运行它时,top报告python进程大约为600%。

代码语言:javascript
运行
复制
>>> use_percents.mean(1)

显示

代码语言:javascript
运行
复制
array([ 67.05548902,  67.06906188,  66.89041916,  67.28942116,
        66.69421158,  67.61437126,  99.8007984 ,  67.31996008])

问题:

我的计算是令人尴尬的并行,所以有其他cpus可用来划分工作将是很棒的。有人知道这里发生了什么吗?一个简单的python版本在单个cpu上使用100%。

有没有一种方法可以在不重写所有没有特征的类的情况下,将所有的东西都保存在单个cpu上?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-08 05:20:59

特征不会导致CPU使用率。在没有特征的情况下重写这段代码很容易,您将看到您得到了相同的CPU使用模式(至少,我是这样做的)。

相反,您可能看到的是您的numpy构建所链接的BLAS库的CPU使用率。numpy.corrcoeff()调用numpy.cov()numpy.cov()的大部分计算由numpy.dot()调用完成,该调用使用BLAS进行矩阵-矩阵乘法。如果它是一个优化的BLAS库,那么它通常会在内部使用非Python线程来在CPU之间拆分这些计算。您必须参考优化的BLAS库的文档,以了解如何更改这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16991658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档