Можно часто улучшать производительность кода с выполнением на графическом блоке обработки (GPU). Например, выполнение на графическом процессоре может улучшать производительность если:
Ваш код является в вычислительном отношении дорогим, где вычислительное время значительно превышает время, проведенное, передавая данные и из памяти графического процессора.
Ваш рабочий процесс использует функции с gpuArray
(Parallel Computing Toolbox) поддержка с входными параметрами большого массива.
Когда написание кода для графического процессора, лучше запускаться с кода, который уже выполняет хорошо на центральном процессоре. Векторизация обычно очень важна для достижения высокой производительности на графическом процессоре. Преобразуйте код, чтобы использовать функции, которые поддерживают аргументы Array графического процессора и передают входные данные графическому процессору. Для получения дополнительной информации о функциях MATLAB с входными параметрами графического процессора массивов, смотрите функции MATLAB Запуска на графическом процессоре (Parallel Computing Toolbox).
Много функций в Statistics and Machine Learning Toolbox™ автоматически выполняются на графическом процессоре, когда вы используете входные данные графического процессора массивов. Например, можно создать объект вероятностного распределения на графическом процессоре, где выход является массивом графического процессора.
pd = fitdist(gpuArray(x),"Normal")
Используя графический процессор требует Parallel Computing Toolbox™ и поддерживаемого устройства графического процессора. Для получения информации о поддерживаемых устройствах смотрите Поддержку графического процессора Релизом (Parallel Computing Toolbox). Для полного списка функций Statistics and Machine Learning Toolbox™, которые принимают массивы графического процессора, смотрите Функции.
Можно запросить и выбрать устройство графического процессора с помощью gpuDevice
функция. Если у вас есть несколько графических процессоров, можно исследовать свойства всех графических процессоров, обнаруженных в системе с gpuDeviceTable
функция. Затем можно выбрать определенный графический процессор для выполнения одно графического процессора при помощи его индекса (gpuDevice(index)
).
D = gpuDevice
D = CUDADevice with properties: Name: 'Tesla V100-PCIE-32GB' Index: 1 ComputeCapability: '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
Исследуйте распределение данных на графическом процессоре с помощью описательной статистики.
Сгенерируйте набор данных нормально распределенных случайных чисел на графическом процессоре.
dist = randn(1e5,1e4,"gpuArray");
Определите ли dist
графический процессор array.
TF = isgpuarray(dist)
TF = logical
1
Выполните функцию с входным параметром графического процессора массивов. Например, вычислите демонстрационную скошенность для каждого столбца в dist
. Начиная с dist
массив графического процессора, skewness
функция выполняется на графическом процессоре и возвращает результат как массив графического процессора.
skew = skewness(dist);
Проверьте что выход skew
массив графического процессора.
TF = isgpuarray(skew)
TF = logical
1
Оцените функциональное время выполнения на графическом процессоре и сравните эффективность с выполнением на центральном процессоре.
Сравнение времени, потраченного, чтобы выполнить код на центральном процессоре и графическом процессоре, может быть полезным, чтобы выбрать среду выполнения. Например, если вы хотите вычислить описательную статистику из выборочных данных, рассматривая время выполнения, и время передачи данных важно для оценки общей производительности. Если функция имеет поддержку gpuArray, когда количество увеличений наблюдений, расчет на графическом процессоре обычно становится более производительным по сравнению с центральным процессором.
Измерьте функциональное время выполнения в секундах при помощи gputimeit
(Parallel Computing Toolbox) функция. gputimeit
предпочтительно для timeit
для функций, которые используют графический процессор, потому что он гарантирует завершение операции и компенсирует издержки.
skew = @() skewness(dist); t = gputimeit(skew)
t = 0.6270
Оцените различие в производительности между графическим процессором и центральным процессором путем независимого измерения времени выполнения центрального процессора. Для этого графического процессора подписание этого кода быстрее, чем выполнение на центральном процессоре.
Эффективность кода по графическому процессору в большой степени зависит от используемого графического процессора. Для получения дополнительной информации об измерении и улучшании производительности графического процессора, смотрите Меру и Улучшайте Производительность графического процессора (Parallel Computing Toolbox).
Можно улучшать производительность кода путем выполнения вычислений в одинарной точности вместо двойной точности.
Определите время выполнения skewness
функция с входным параметром dist
набор данных в одинарной точности.
dist_single = single(dist); skew_single = @() skewness(dist_single); t_single = gputimeit(skew_single)
t_single = 0.2206
Для этого графического процессора подписание этого кода с данными об одинарной точности быстрее, чем выполнение с данными о двойной точности.
Повышение производительности зависит от номера карты графического процессора и общего количества ядер. Для получения дополнительной информации об использовании одинарной точности с помощью графического процессора смотрите Меру и Улучшайте Производительность графического процессора (Parallel Computing Toolbox).
Реализуйте сокращение размерности и рабочие процессы классификации на графическом процессоре.
Функционирует, такие как pca
и fitcensemble
может использоваться вместе, чтобы эффективно обучить модель машинного обучения.
Функция анализа главных компонентов (PCA) уменьшает размерность данных, заменяя несколько коррелированых переменных на новый набор переменных, которые являются линейными комбинациями исходных переменных.
fitcensemble
функционируйте соответствует многим ученикам классификации, чтобы сформировать модель ансамбля, которая может сделать лучшие предсказания, чем один ученик.
Обе функции в вычислительном отношении интенсивны и могут быть значительно ускорены с помощью графического процессора.
Для примера используйте humanactivity
набор данных. Набор данных содержит 24 075 наблюдений за пятью различной физической деятельностью человека: нахождение, положение, обход, выполнение и танец. Каждое наблюдение имеет 60 функций, извлеченных из ускоряющих данных, измеренных датчиками акселерометра смартфона. Набор данных содержит следующие переменные:
actid
— Вектор отклика, содержащий идентификаторы действия в целых числах: 1, 2, 3, 4, и 5 нахождений представления, положение, обход, выполнение и танец, соответственно
actnames
— Имена действия, соответствующие целочисленным идентификаторам действия
feat
— Матрица функции 60 функций 24 075 наблюдений
featlabels
— Метки 60 функций
load humanactivity
Используйте 90% наблюдений, чтобы обучить модель, которая классифицирует пять типов деятельности человека, и используйте 10% наблюдений, чтобы подтвердить обученную модель. Используйте cvpartition
задавать 10%-ю затяжку для набора тестов.
Partition = cvpartition(actid,"Holdout",0.10); trainingInds = training(Partition); % Indices for the training set testInds = test(Partition); % Indices for the test set
Передайте обучение и тестовые данные к графическому процессору.
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);
Соответствуйте ансамблю учеников для классификации.
template = templateTree("MaxNumSplits",20,"Reproducible",true); classificationEnsemble = fitcensemble(XTrainPCA,YTrain, ... "Method","AdaBoostM2", ... "NumLearningCycles",30, ... "Learners",template, ... "LearnRate",0.1, ... "ClassNames",[1; 2; 3; 4; 5]);
Чтобы использовать обученную модель для набора тестов, необходимо преобразовать набор тестовых данных при помощи PCA, полученного из обучающего набора данных.
XTestPCA = (XTest-mu)*coeff(:,1:idx);
Оцените точность обученного классификатора с тестовыми данными.
classificationError = loss(classificationEnsemble,XTestPCA,YTest);
Передайте данные или свойства модели от графического процессора до локальной рабочей области для использования с функцией, которая не поддерживает массивы графического процессора.
Передача массивов графического процессора может быть дорогостоящей и является обычно не необходимой, если вы не должны использовать свой результат с функциями, которые не поддерживают массивы графического процессора или в другой рабочей области, где графический процессор недоступен.
gather
(Parallel Computing Toolbox) функция передает данные из графического процессора в локальную рабочую область. Соберите dist
данные и подтверждают, что данные больше не являются массивом графического процессора.
dist = gather(dist); TF = isgpuarray(dist)
TF = logical
0
gather
функция передает имущество модели машинного обучения от графического процессора в локальную рабочую область. Соберите classificationEnsemble
модель и подтверждает, что свойства модели, которые были ранее массивом графического процессора, такой как X, больше не являются массивами графического процессора.
classificationEnsemble = gather(classificationEnsemble); TF = isgpuarray(classificationEnsemble.X)
TF = logical
0
gpuArray
(Parallel Computing Toolbox) | gputimeit
(Parallel Computing Toolbox) | gather
(Parallel Computing Toolbox)