您通常可以通过在图形处理单元(GPU)上执行来提高代码性能。例如,在GPU上执行可以提高性能,如果:
您的代码计算成本很高,其中计算时间大大超过了在GPU内存之间传输数据所花费的时间。
您的工作流使用函数gpuArray
(并行计算工具箱)万博1manbetx支持大数组输入。
在为GPU编写代码时,最好从已经在CPU上运行良好的代码开始。矢量化通常是实现GPU高性能的关键。转换代码以使用支持GPU数组参数的函数,并将输入数据传输到GPU。万博1manbetx有关带有GPU阵列输入的MATLAB函数的更多信息,请参见在图形处理器上运行MATLAB函数(并行计算工具箱).
当您使用GPU数组输入数据时,统计和机器学习工具箱™中的许多函数会自动在GPU上执行。例如,您可以在GPU上创建一个概率分布对象,其中输出是一个GPU数组。
pd = fitdist(gpuArray(x),"Normal")
使用GPU需要并行计算工具箱™和受支持的GPU设备。万博1manbetx有关支持的设备的信息,请参见万博1manbetxGPU支万博1manbetx持版本(并行计算工具箱).有关接受GPU阵列的统计和机器学习工具箱™函数的完整列表,请参见功能.
可通过。命令查询和选择GPU设备gpuDevice
函数。方法检查系统中检测到的所有gpu的属性gpuDeviceTable
函数。然后,你可以选择一个特定的GPU单GPU执行通过使用它的索引(gpuDevice(索引)
).
D = gpuDevice
D = CUDADevice with properties: Name: 'Tesla v100l - pcie - 32gb ' Index: 1 ComputeCapability: 万博1manbetx'7.0' SupportsDouble: 1 DriverVersion: 11.2000 ToolkitVersion: 11 MaxThreadsPerBlock: 1024 MaxShmemPerBlock: 49152 MaxThreadBlockSize: [1024 1024 64] MaxGridSize: [2.1475e+09 65535 65535] SIMDWidth: 32 TotalMemory: 3.4090e+10 AvailableMemory: 3.3374e+10 MultiprocessorCount: 80 ClockRateKHz: 1380000 ComputeMode: 'Default' GPUOverlapsTransfers: 1 KernelExecutionTimeout: 0 CanMapHostMemory: 1 DeviceSupported:1 DeviceAvailable: 1 DeviceSelected: 1
使用描述性统计来探索GPU上的数据分布。
在GPU上生成正态分布随机数的数据集。
Dist = randn(1e5,1e4,“gpuArray”);
确定是否经销
是一个GPU阵列.
TF = isgpuarray(dist)
TF =逻辑1
执行带有GPU数组输入参数的函数。例如,计算中每一列的样本偏度经销
.自经销
是一个GPU数组,偏态
函数在GPU上执行,并将结果作为GPU数组返回。
歪斜=偏度(距离);
验证输出斜
是一个GPU阵列。
TF = isgpuarray(skew)
TF =逻辑1
评估函数在GPU上的执行时间,并将性能与CPU上的执行进行比较。
比较在CPU和GPU上执行代码所花费的时间对于选择执行环境很有用。例如,如果您想从示例数据中计算描述性统计数据,那么考虑执行时间和数据传输时间对于评估整体性能很重要。如果一个函数有gpuArray支持,随着观察数量的增加万博1manbetx,GPU上的计算通常会比CPU上的性能更好。
方法测量函数运行时间(以秒为单位)gputimeit
(并行计算工具箱)函数。gputimeit
更可取时间
用于使用GPU的函数,因为它可以确保操作完成并补偿开销。
Skew = @()偏度(dist);T = gputimeit(歪斜)
T = 0.6270
通过独立测量CPU执行时间来评估GPU和CPU的性能差异。对于这个GPU,这段代码的执行比在CPU上的执行快。
代码在GPU上的性能很大程度上依赖于所使用的GPU。有关测量和改进GPU性能的更多信息,请参见测量和改进GPU性能(并行计算工具箱).
您可以通过单精度而不是双精度进行计算来提高代码的性能。
的执行时间偏态
函数的输入参数为经销
单精度数据集。
Dist_single = single(dist);Skew_single = @()偏度(dist_single);T_single = gputimeit(skew_single)
T_single = 0.2206
对于这个GPU,使用单精度数据执行这段代码比使用双精度数据执行更快。
性能的提升取决于GPU卡和总核数。有关在GPU上使用单精度的更多信息,请参见测量和改进GPU性能(并行计算工具箱).
在GPU上实现降维和分类工作流。
函数如主成分分析
而且fitcensemble
可以一起使用,有效地训练一个机器学习模型。
主成分分析(PCA)函数通过用一组新的变量替换几个相关变量来降低数据的维数,这些新变量是原始变量的线性组合。
的fitcensemble
函数拟合多个分类学习器,形成一个集成模型,可以比单个学习器做出更好的预测。
这两个功能都是计算密集型的,使用GPU可以显著加速。
例如,使用humanactivity
数据集。该数据集包含24075个对人类五种不同身体活动的观察:坐、站、走、跑和跳舞。每个观测数据都有60个特征,这些特征是从智能手机加速度计传感器测量的加速度数据中提取出来的。数据集包含以下变量:
actid
—包含整数形式的活动id的响应向量:1、2、3、4、5分别表示坐、站、走、跑、跳
actnames
—整数活动id对应的活动名称
的壮举
- 24,075个观测值的60个特征矩阵
featlabels
—60个特性的标签
负载humanactivity
使用90%的观测数据来训练一个模型,将五种类型的人类活动进行分类,并使用10%的观测数据来验证训练好的模型。使用cvpartition
为测试集指定10%的坚持时间。
分区= 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阵列的函数一起使用。万博1manbetx
传输GPU数组的成本很高,通常没有必要,除非您需要将结果用于不支持GPU数组的函数或GPU不可用的其他工作空间。万博1manbetx
的收集
(并行计算工具箱)函数将数据从GPU传输到本地工作区。收集经销
数据,并确认该数据不再是GPU阵列。
Dist = gather(Dist);TF = isgpuarray(dist)
TF =逻辑0
的收集
函数将机器学习模型的属性从GPU传输到本地工作空间。收集classificationEnsemble
模型,并确认模型属性以前是一个GPU数组,如X,不再是GPU数组。
classificationEnsemble = gather(classificationEnsemble);TF = isgpuarray(classificationEnsemble.X)
TF =逻辑0
gpuArray
(并行计算工具箱)|gputimeit
(并行计算工具箱)|收集
(并行计算工具箱)