主要内容

在GPU上分析和建模数据

这个例子展示了如何通过在图形处理单元(GPU)上执行来提高代码性能。在GPU上执行可以提高性能,如果:

  • 您的代码计算成本很高,其中计算时间大大超过了在GPU内存之间传输数据所花费的时间。

  • 您的工作流使用函数gpuArray(并行计算工具箱)金宝app支持和大数组输入。

在为GPU编写代码时,请从已经在CPU上运行良好的代码开始。矢量化通常是实现GPU高性能的关键。转换代码以使用支持GPU数组参数的函数,并将输入数据传输到GPU。金宝app有关带有GPU阵列输入的MATLAB函数的更多信息,请参见在图形处理器上运行MATLAB函数(并行计算工具箱)

当您使用GPU阵列输入数据时,统计和机器学习工具箱™中的许多函数会自动在GPU上执行。例如,您可以在GPU上创建一个概率分布对象,其中输出是一个GPU数组。

pd = fitdist(gpuArray(x),"Normal")

使用GPU需要并行计算工具箱™和受支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝appGPU计算要求(并行计算工具箱).有关接受GPU阵列的统计和机器学习工具箱™函数的完整列表,请参见功能然后,在左侧导航栏中,滚动到扩展能力部分,并选择GPU阵列。

检查GPU属性

可通过。命令查询和选择GPU设备gpuDevice函数。如果您有多个gpu,您可以使用gpuDeviceTable函数。然后,你可以选择一个特定的GPU单GPU执行通过使用它的索引(gpuDevice(索引)).

D = gpuDevice
D = CUDADevice with properties: Name: 'TITAN V' Index: 1 ComputeCapability: '7.0' 金宝appSupportsDouble: 1 DriverVersion: 11.2000 ToolkitVersion: 11.2000 MaxThreadsPerBlock: 1024 MaxShmemPerBlock: 49152 (49.15 KB) MaxThreadBlockSize: [1024 1024 64] MaxGridSize: [2.1475e+09 65535 65535] SIMDWidth: 32 TotalMemory: 12652838912 (12.65 GB) AvailableMemory: 12096045056 (12.10 GB) MultiprocessorCount: 80 ClockRateKHz: 1455000 ComputeMode: 'Default' GPUOverlapsTransfers: 1 KernelExecutionTimeout:0 CanMapHostMemory: 1 Device金宝appSupported: 1 DeviceAvailable: 1 DeviceSelected: 1

GPU执行功能

使用描述性统计来探索GPU上的数据分布。

在GPU上生成正态分布随机数的数据集。

Dist = randn(6e4,6e3,“gpuArray”);

确定是否经销是一个GPU阵列。

TF = isgpuarray(dist)
TF =逻辑1

执行带有GPU数组输入参数的函数。例如,计算中每一列的样本偏度经销.因为经销是一个GPU数组,偏态函数在GPU上执行,并将结果作为GPU数组返回。

歪斜=偏度(距离);

验证输出是一个GPU阵列。

TF = isgpuarray(skew)
TF =逻辑1

评估GPU执行速度

评估函数在GPU上的执行时间,并将性能与CPU上的执行进行比较。

比较在CPU和GPU上执行代码所花费的时间对于确定合适的执行环境是有用的。例如,如果您想从示例数据中计算描述性统计数据,那么考虑执行时间和数据传输时间对于评估整体性能很重要。如果一个函数有GPU阵列支持,随着观察数量的增加,GPU金宝app上的计算能力通常会比CPU上的更好。

方法测量函数运行时间(以秒为单位)gputimeit(并行计算工具箱)函数。gputimeit更可取时间对于使用GPU的函数,因为它可以确保操作完成并补偿开销。

Skew = @()偏度(dist);T = gputimeit(歪斜)
T = 0.2458

通过独立测量CPU执行时间来评估GPU和CPU的性能差异。在这种情况下,代码在GPU上的执行速度要比在CPU上快。

代码在GPU上的性能很大程度上依赖于所使用的GPU。有关测量和改进GPU性能的更多信息,请参见测量和改进GPU性能(并行计算工具箱)

GPU上的单精度

您可以通过单精度计算而不是双精度计算来提高代码的性能。

的执行时间偏态函数的输入参数经销单精度数据集。

Dist_single = single(dist);Skew_single = @()偏度(dist_single);T_single = gputimeit(skew_single)
T_single = 0.0503

在这种情况下,使用单精度数据执行代码比使用双精度数据执行更快。

性能的提升取决于GPU卡和总核数。有关在GPU上使用单精度的详细信息,请参见测量和改进GPU性能(并行计算工具箱)

基于GPU的降维与模型拟合

在GPU上实现降维和分类工作流。

函数如主成分分析而且fitcensemble可以一起用来训练一个机器学习模型。

  • 主成分分析(主成分分析)函数通过将几个相关变量替换为一组新的变量来降低数据的维数,这些新变量是原始变量的线性组合。

  • fitcensemble函数拟合多个分类学习器,形成一个集成模型,可以比单个学习器做出更好的预测。

这两个功能都是计算密集型的,使用GPU可以显著加速。

例如,考虑humanactivity数据集。该数据集包含24075个对人类五种身体活动的观察:坐、站、走、跑和跳舞。每个观测数据都有60个特征,这些特征是从智能手机加速度计传感器测量的加速度数据中提取出来的。数据集包含以下变量:

  • actid—包含整数形式的活动id的响应向量:1、2、3、4、5分别表示坐、站、走、跑、跳

  • actnames—整数活动id对应的活动名称

  • 的壮举- 24,075个观测值的60个特征矩阵

  • featlabels—60个特性的标签

负载humanactivity

使用90%的观测数据来训练一个模型,将五种类型的人类活动进行分类,并使用10%的观测数据来验证训练好的模型。使用为测试集指定10%的坚持时间cvpartition

分区= cvpartition(actid,“坚持”, 0.10);trainingInds =训练(分区);%训练集的指数testInds = test(分区);%测试集的索引

将训练和测试数据传输到GPU。

XTrain = gpuArray(feat(trainingInds,:));YTrain = gpuArray(actid(trainingInds));XTest = gpuArray(feat(testInds,:));YTest = gpuArray(actid(testInds));

找出训练数据集的主成分XTrain

[coeff,score,~,~,explained,mu] = pca(XTrain);

找出至少99%的可变性所需要的组成部分的数量。

Idx = find(cumsum(explained)>99,1);

确定主成分分数表示X在主成分空间中。

XTrainPCA = score(:,1:idx);

拟合一组学习者进行分类。

模板=模板树(“MaxNumSplits”, 20岁,“复制”,真正的);classificationEnsemble = fitcensemble(XTrainPCA,YTrain,...“方法”“AdaBoostM2”...“NumLearningCycles”30岁的...“学习者”模板,...“LearnRate”, 0.1,...“类名”, (1;2;3;4;5);

为了将训练过的模型用于测试集,您需要使用从训练数据集中获得的主成分分析来转换测试数据集。

XTestPCA = (XTest-mu)*coeff(:,1:idx);

用测试数据评估训练分类器的准确性。

classificationError = loss(classificationEnsemble,XTestPCA,YTest);

转移到本地工作区

将数据或模型属性从GPU传输到本地工作区,以便与不支持GPU阵列的函数一起使用。金宝app

传输GPU数组的成本很高,通常没有必要,除非您需要将结果与不支持GPU数组的函数一起使用,或者在GPU不可用的另一个工作空间中使用结果。金宝app

收集(并行计算工具箱)函数将数据从GPU传输到本地工作区。收集经销数据,然后确认该数据不再是GPU阵列。

Dist = gather(Dist);TF = isgpuarray(dist)
TF =逻辑0

收集函数将机器学习模型的属性从GPU传输到本地工作区。收集classificationEnsemble模型,然后确认模型属性以前是GPU数组,如X,不再是GPU数组。

classificationEnsemble = gather(classificationEnsemble);TF = isgpuarray(classificationEnsemble.X)
TF =逻辑0

另请参阅

(并行计算工具箱)|(并行计算工具箱)|(并行计算工具箱)

相关的话题