Accelerate Linear Model Fitting on GPU
This example shows how you can accelerate regression model fitting by running functions on a graphical processing unit (GPU). The example compares the time required to fit a model on a central processing unit (CPU) with the time required to fit the same model on a GPU. Using a GPU requires Parallel Computing Toolbox™ and a supported GPU device. For information about supported devices, see GPU Computing Requirements (Parallel Computing Toolbox).
Create a table of airline sample data from the file airlinesmall.csv
by using the readtable
function. Remove table rows corresponding to canceled flights, and convert UniqueCarrier
to a categorical variable using the categorical
function.
A = readtable("airlinesmall.csv");
A = A(A.Cancelled~=1,:);
A.UniqueCarrier = categorical(A.UniqueCarrier)
A=121171×29 table
Year Month DayofMonth DayOfWeek DepTime CRSDepTime ArrTime CRSArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime CRSElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted CarrierDelay WeatherDelay NASDelay SecurityDelay LateAircraftDelay
____ _____ __________ _________ _______ __________ _______ __________ _____________ _________ _______ _________________ ______________ _______ ________ ________ _______ _______ ________ ______ _______ _________ ________________ ________ ____________ ____________ ________ _____________ _________________
1987 10 21 3 642 630 735 727 PS 1503 {'NA'} 53 57 {'NA'} 8 12 {'LAX'} {'SJC'} 308 {'NA'} {'NA'} 0 {'NA'} 0 {'NA'} {'NA'} {'NA'} {'NA'} {'NA'}
1987 10 26 1 1021 1020 1124 1116 PS 1550 {'NA'} 63 56 {'NA'} 8 1 {'SJC'} {'BUR'} 296 {'NA'} {'NA'} 0 {'NA'} 0 {'NA'} {'NA'} {'NA'} {'NA'} {'NA'}
1987 10 23 5 2055 2035 2218 2157 PS 1589 {'NA'} 83 82 {'NA'} 21 20 {'SAN'} {'SMF'} 480 {'NA'} {'NA'} 0 {'NA'} 0 {'NA'} {'NA'} {'NA'} {'NA'} {'NA'}
1987 10 23 5 1332 1320 1431 1418 PS 1655 {'NA'} 59 58 {'NA'} 13 12 {'BUR'} {'SJC'} 296 {'NA'} {'NA'} 0 {'NA'} 0 {'NA'} {'NA'} {'NA'} {'NA'} {'NA'}
1987 10 22 4 629 630 746 742 PS 1702 {'NA'} 77 72 {'NA'} 4 -1 {'SMF'} {'LAX'} 373 {'NA'} {'NA'} 0 {'NA'} 0 {'NA'} {'NA'} {'NA'} {'NA'} {'NA'}
1987 10 28 3 1446 1343 1547 1448 PS 1729 {'NA'} 61 65 {'NA'} 59 63 {'LAX'} {'SJC'} 308 {'NA'} {'NA'} 0 {'NA'} 0 {'NA'} {'NA'} {'NA'} {'NA'} {'NA'}
1987 10 8 4 928 930 1052 1049 PS 1763 {'NA'} 84 79 {'NA'} 3 -2 {'SAN'} {'SFO'} 447 {'NA'} {'NA'} 0 {'NA'} 0 {'NA'} {'NA'} {'NA'} {'NA'} {'NA'}
1987 10 10 6 859 900 1134 1123 PS 1800 {'NA'} 155 143 {'NA'} 11 -1 {'SEA'} {'LAX'} 954 {'NA'} {'NA'} 0 {'NA'} 0 {'NA'} {'NA'} {'NA'} {'NA'} {'NA'}
1987 10 20 2 1833 1830 1929 1926 PS 1831 {'NA'} 56 56 {'NA'} 3 3 {'LAX'} {'SJC'} 308 {'NA'} {'NA'} 0 {'NA'} 0 {'NA'} {'NA'} {'NA'} {'NA'} {'NA'}
1987 10 15 4 1041 1040 1157 1155 PS 1864 {'NA'} 76 75 {'NA'} 2 1 {'SFO'} {'LAS'} 414 {'NA'} {'NA'} 0 {'NA'} 0 {'NA'} {'NA'} {'NA'} {'NA'} {'NA'}
1987 10 15 4 1608 1553 1656 1640 PS 1907 {'NA'} 48 47 {'NA'} 16 15 {'LAX'} {'FAT'} 209 {'NA'} {'NA'} 0 {'NA'} 0 {'NA'} {'NA'} {'NA'} {'NA'} {'NA'}
1987 10 21 3 949 940 1055 1052 PS 1939 {'NA'} 66 72 {'NA'} 3 9 {'LGB'} {'SFO'} 354 {'NA'} {'NA'} 0 {'NA'} 0 {'NA'} {'NA'} {'NA'} {'NA'} {'NA'}
1987 10 22 4 1902 1847 2030 1951 PS 1973 {'NA'} 88 64 {'NA'} 39 15 {'LAX'} {'OAK'} 337 {'NA'} {'NA'} 0 {'NA'} 0 {'NA'} {'NA'} {'NA'} {'NA'} {'NA'}
1987 10 16 5 1910 1838 2052 1955 TW 19 {'NA'} 162 137 {'NA'} 57 32 {'STL'} {'DEN'} 770 {'NA'} {'NA'} 0 {'NA'} 0 {'NA'} {'NA'} {'NA'} {'NA'} {'NA'}
1987 10 2 5 1130 1133 1237 1237 TW 59 {'NA'} 187 184 {'NA'} 0 -3 {'STL'} {'PHX'} 1262 {'NA'} {'NA'} 0 {'NA'} 0 {'NA'} {'NA'} {'NA'} {'NA'} {'NA'}
1987 10 30 5 1400 1400 1920 1934 TW 102 {'NA'} 200 214 {'NA'} -14 0 {'SNA'} {'STL'} 1570 {'NA'} {'NA'} 0 {'NA'} 0 {'NA'} {'NA'} {'NA'} {'NA'} {'NA'}
⋮
The table A
contains data for 12,1171 flights. The table variables Year
, Month
, and DayofMonth
contain data for the year, month, and day that each flight departed, respectively. ArrDelay
contains the delay in minutes between each flight's scheduled and actual arrival time. UniqueCarrier
contains data for the airline that operated each flight.
Measure Time to Fit Linear Model on CPU
Measure the time required to fit a linear regression model on a CPU to the predictor variables Year
, Month
, DayofMonth
, and UniqueCarrier
, and the response variable ArrDelay
. This example uses an Intel® Xeon® W-2133 CPU @ 3.60 GHz.
Create a second table from the table A
variables Year
, Month
, DayofMonth
, UniqueCarrier
, and ArrDelay
.
tblCPU = table(A.Year,A.Month,A.DayofMonth,A.UniqueCarrier,A.ArrDelay, ... VariableNames=["Year" "Month" "DayofMonth" "UniqueCarrier" "ArrDelay"])
tblCPU=121171×5 table
Year Month DayofMonth UniqueCarrier ArrDelay
____ _____ __________ _____________ ________
1987 10 21 PS 8
1987 10 26 PS 8
1987 10 23 PS 21
1987 10 23 PS 13
1987 10 22 PS 4
1987 10 28 PS 59
1987 10 8 PS 3
1987 10 10 PS 11
1987 10 20 PS 3
1987 10 15 PS 2
1987 10 15 PS 16
1987 10 21 PS 3
1987 10 22 PS 39
1987 10 16 TW 57
1987 10 2 TW 0
1987 10 30 TW -14
⋮
Create an anonymous function that uses the fitlm
function to fit a linear regression model to the variables in tblCPU
. Measure the time required to run the anonymous function by using the timeit
function.
cpufit = @() fitlm(tblCPU,CategoricalVars=4); tcpu = timeit(cpufit)
tcpu = 0.3241
tcpu
contains the time required to fit the linear regression model on the CPU.
Measure Time to Fit Linear Model on GPU
Verify that a GPU device is available by using the gpuDevice
(Parallel Computing Toolbox) function.
gpuDevice
ans = CUDADevice with properties: Name: 'NVIDIA RTX A5000' Index: 1 (of 2) ComputeCapability: '8.6' DriverModel: 'TCC' TotalMemory: 25544294400 (25.54 GB) AvailableMemory: 25120866304 (25.12 GB) DeviceAvailable: true DeviceSelected: true Show all properties.
Create a third table from the table tblCPU
variables. Copy the table's numeric and logical variables to GPU memory by using the gpuArray
(Parallel Computing Toolbox) function.
tblGPU = tblCPU; for ii = 1:width(tblCPU) if isnumeric(tblCPU.(ii)) || islogical(tblCPU.(ii)) tblGPU.(ii) = gpuArray(tblCPU.(ii)); end end tblGPU
tblGPU=121171×5 table
Year Month DayofMonth UniqueCarrier ArrDelay
____ _____ __________ _____________ ________
1987 10 21 PS 8
1987 10 26 PS 8
1987 10 23 PS 21
1987 10 23 PS 13
1987 10 22 PS 4
1987 10 28 PS 59
1987 10 8 PS 3
1987 10 10 PS 11
1987 10 20 PS 3
1987 10 15 PS 2
1987 10 15 PS 16
1987 10 21 PS 3
1987 10 22 PS 39
1987 10 16 TW 57
1987 10 2 TW 0
1987 10 30 TW -14
⋮
The tblGPU
table contains gpuArray
objects, each representing an array stored in GPU memory.
When you pass gpuArray
inputs to the fitlm
function, it automatically runs on the GPU. Measure the time required to fit the regression model on the GPU by using the gputimeit
(Parallel Computing Toolbox) function. This function is preferable to timeit
, because it ensures that all operations on the GPU are complete before it records the time. The function also compensates for the overhead of working on a GPU.
gpufit = @() fitlm(tblGPU,CategoricalVars=4); tgpu = gputimeit(gpufit)
tgpu = 0.1006
tgpu
contains the time required to fit the linear regression model on the GPU, which is over three times faster than on the CPU.
Determine Statistical Significance
To investigate the statistical significance of the linear regression model terms, fit the regression model on the GPU.
mdl = fitlm(tblGPU,CategoricalVars=4)
mdl = Linear regression model: ArrDelay ~ 1 + Year + Month + DayofMonth + UniqueCarrier Estimated Coefficients: Estimate SE tStat pValue ___________ _________ ________ __________ (Intercept) -178.2904 33.3585 -5.3447 9.0739e-08 Year 0.09144843 0.0166 5.5089 3.6173e-08 Month -0.07640735 0.0255798 -2.987 0.0028176 DayofMonth 0.03731819 0.0100045 3.7301 0.00019147 UniqueCarrier_AA 2.474112 1.38942 1.7807 0.074968 UniqueCarrier_AQ -4.028572 2.81772 -1.4297 0.1528 UniqueCarrier_AS 3.478428 1.47986 2.3505 0.018749 UniqueCarrier_B6 6.685668 1.73686 3.8493 0.00011853 UniqueCarrier_CO 2.622961 1.40944 1.861 0.062748 UniqueCarrier_DH 2.514483 1.79715 1.3991 0.16177 UniqueCarrier_DL 3.071577 1.38827 2.2125 0.026932 UniqueCarrier_EA 4.619557 1.73326 2.6652 0.0076942 UniqueCarrier_EV 4.831761 1.55067 3.1159 0.0018342 UniqueCarrier_F9 3.199074 2.15633 1.4836 0.13792 UniqueCarrier_FL 4.286813 1.60874 2.6647 0.0077066 UniqueCarrier_HA -6.75125 2.29837 -2.9374 0.0033104 UniqueCarrier_HP 3.2339 1.46058 2.2141 0.026822 UniqueCarrier_ML (1) -3.77572 3.92876 -0.96105 0.33653 UniqueCarrier_MQ 3.739103 1.44475 2.5881 0.009653 UniqueCarrier_NW 0.9346265 1.3994 0.66788 0.50421 UniqueCarrier_OH 2.552324 1.58129 1.6141 0.10651 UniqueCarrier_OO 0.6509585 1.46651 0.44388 0.65713 UniqueCarrier_PA (1) 1.653223 2.21609 0.74601 0.45566 UniqueCarrier_PI 7.609183 1.73962 4.3741 1.2206e-05 UniqueCarrier_PS 1.854016 3.65042 0.50789 0.61153 UniqueCarrier_TW 3.235745 1.46218 2.213 0.026902 UniqueCarrier_TZ -3.190202 2.48632 -1.2831 0.19946 UniqueCarrier_UA 3.933074 1.3927 2.8241 0.0047426 UniqueCarrier_US 2.40755 1.39284 1.7285 0.083898 UniqueCarrier_WN 0.7392784 1.38333 0.53442 0.59305 UniqueCarrier_XE 3.605406 1.49916 2.405 0.016176 UniqueCarrier_YV 7.036055 1.72275 4.0842 4.426e-05 Number of observations: 120866, Error degrees of freedom: 120834 Root Mean Squared Error: 30.5 R-squared: 0.00259, Adjusted R-Squared: 0.00233 F-statistic vs. constant model: 10.1, p-value = 2.38e-48
mdl
contains the formula for the linear regression model and statistics about the estimated model coefficients. The table output contains a row for each continuous term and for each value in UniqueCarrier
. You can determine if a term or value has a statistically significant effect on the arrival delay by comparing its p-value to the significance level of 0.05.
To determine whether UniqueCarrier
contains a value that has a statistically significant effect on the arrival delay, perform an ANOVA with a 95% confidence level by using the function anova
. When you pass gpuArray
inputs to the anova
function, it automatically runs on the GPU.
aov = anova(mdl)
aov=5×5 table
SumSq DF MeanSq F pValue
__________ __________ ______ ______ __________
Year 28309 1 28309 30.348 3.6173e-08
Month 8322.7 1 8322.7 8.9223 0.0028176
DayofMonth 12979 1 12979 13.914 0.00019147
UniqueCarrier 2.4305e+05 28 8680.5 9.3059 1.6331e-39
Error 1.1271e+08 1.2083e+05 932.79
aov
contains the results of the ANOVA. The p-value in the row corresponding to UniqueCarrier
is smaller than the significance level of 0.05, indicating that at least one value in UniqueCarrier
has a statistically significant effect on the arrival delay.
See Also
gpuDevice
(Parallel Computing Toolbox) | gputimeit
(Parallel Computing Toolbox) | timeit
| fitlm
| anova
Related Topics
- Analyze and Model Data on GPU
- Measure and Improve GPU Performance (Parallel Computing Toolbox)
- Run MATLAB Functions on a GPU (Parallel Computing Toolbox)