GPU における線形モデルの当てはめの高速化
この例では、グラフィックス処理装置 (GPU) で関数を実行することで回帰モデルの当てはめを高速化する方法を示します。この例では、中央処理装置 (CPU) でのモデルの当てはめに必要な時間と GPU での同じモデルの当てはめに必要な時間を比較します。GPU の使用には、Parallel Computing Toolbox™ およびサポートされている GPU デバイスが必要です。サポートされているデバイスの詳細については、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。
関数readtable
を使用してファイル airlinesmall.csv
から飛行機の標本データの table を作成します。欠航便に対応する table 行を削除し、関数categorical
を使用して UniqueCarrier
をカテゴリカル変数に変換します。
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'}
⋮
table A
には 12,1171 便のフライトのデータが含まれています。table 変数 Year
、Month
、および DayofMonth
には、各フライトが出発した年、月、日のデータがそれぞれ含まれています。ArrDelay
には、各フライトの到着予定時刻と実際の到着時刻間の遅延 (分単位) が含まれています。UniqueCarrier
には、各フライトを運航した航空会社のデータが含まれています。
CPU での線形モデルの当てはめにかかる時間の測定
CPU で線形回帰モデルを予測子変数 Year
、Month
、DayofMonth
、および UniqueCarrier
と応答変数 ArrDelay
に当てはめるために必要な時間を測定します。この例では、Intel(R) Xeon(R) CPU E5-2623 v4 (2.60 GHz) を使用します。
table A
の変数 Year
、Month
、DayofMonth
、UniqueCarrier
、および ArrDelay
から 2 番目の table を作成します。
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
⋮
関数fitlm
を使用して線形回帰モデルを tblCPU
内の変数に当てはめる無名関数を作成します。関数timeit
を使用して、無名関数の実行に必要な時間を測定します。
cpufit = @() fitlm(tblCPU,CategoricalVars=4); tcpu = timeit(cpufit)
tcpu = 0.3605
tcpu
には、CPU での線形回帰モデルの当てはめに必要な時間が含まれます。
GPU での線形モデルの当てはめにかかる時間の測定
関数gpuDevice
(Parallel Computing Toolbox)を使用して、GPU デバイスが使用可能であることを確認します。
gpuDevice
ans = CUDADevice with properties: Name: 'NVIDIA GeForce RTX 2080 SUPER' Index: 1 ComputeCapability: '7.5' SupportsDouble: 1 GraphicsDriverVersion: '512.15' DriverModel: 'WDDM' ToolkitVersion: 11.2000 MaxThreadsPerBlock: 1024 MaxShmemPerBlock: 49152 (49.15 KB) MaxThreadBlockSize: [1024 1024 64] MaxGridSize: [2.1475e+09 65535 65535] SIMDWidth: 32 TotalMemory: 8589606912 (8.59 GB) AvailableMemory: 6979084692 (6.98 GB) CachePolicy: 'balanced' MultiprocessorCount: 48 ClockRateKHz: 1815000 ComputeMode: 'Default' GPUOverlapsTransfers: 1 KernelExecutionTimeout: 1 CanMapHostMemory: 1 DeviceSupported: 1 DeviceAvailable: 1 DeviceSelected: 1
出力から、この例で NVIDIA GeForce RTX 2080 SUPER
GPU が使用されることがわかります。
table tblCPU
の変数から 3 番目の table を作成します。関数gpuArray
(Parallel Computing Toolbox)を使用して、table の数値変数と logical 変数を GPU メモリにコピーします。
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
⋮
tblGPU
table には gpuArray
オブジェクトが含まれ、それぞれが GPU メモリに格納される配列を表します。
gpuArray
入力を関数fitlm
に渡すと、この関数は GPU で自動的に実行されます。関数gputimeit
(Parallel Computing Toolbox)を使用して、GPU での回帰モデルの当てはめに必要な時間を測定します。この関数では、必ず GPU でのすべての演算が完了してから時間が記録されるため、timeit
ではなくこの関数を使用することをお勧めします。また、この関数は GPU での作業のオーバーヘッドを補正します。
gpufit = @() fitlm(tblGPU,CategoricalVars=4); tgpu = gputimeit(gpufit)
tgpu = 0.1167
tgpu
には、GPU での線形回帰モデルの当てはめに必要な時間が含まれます。CPU の場合よりも 3 倍以上高速です。
統計的有意性の判定
線形回帰モデル項の統計的有意性を調べるには、GPU で回帰モデルを当てはめます。
mdl = fitlm(tblGPU,CategoricalVars=4)
mdl = Linear regression model: ArrDelay ~ 1 + Year + Month + DayofMonth + UniqueCarrier Estimated Coefficients: Estimate SE tStat pValue _________ ________ ________ __________ (Intercept) -178.29 33.358 -5.3447 9.0739e-08 Year 0.091448 0.0166 5.5089 3.6173e-08 Month -0.076407 0.02558 -2.987 0.0028176 DayofMonth 0.037318 0.010005 3.7301 0.00019147 UniqueCarrier_AA 2.4741 1.3894 1.7807 0.074968 UniqueCarrier_AQ -4.0286 2.8177 -1.4297 0.1528 UniqueCarrier_AS 3.4784 1.4799 2.3505 0.018749 UniqueCarrier_B6 6.6857 1.7369 3.8493 0.00011853 UniqueCarrier_CO 2.623 1.4094 1.861 0.062748 UniqueCarrier_DH 2.5145 1.7972 1.3991 0.16177 UniqueCarrier_DL 3.0716 1.3883 2.2125 0.026932 UniqueCarrier_EA 4.6196 1.7333 2.6652 0.0076942 UniqueCarrier_EV 4.8318 1.5507 3.1159 0.0018342 UniqueCarrier_F9 3.1991 2.1563 1.4836 0.13792 UniqueCarrier_FL 4.2868 1.6087 2.6647 0.0077066 UniqueCarrier_HA -6.7512 2.2984 -2.9374 0.0033104 UniqueCarrier_HP 3.2339 1.4606 2.2141 0.026822 UniqueCarrier_ML (1) -3.7757 3.9288 -0.96105 0.33653 UniqueCarrier_MQ 3.7391 1.4448 2.5881 0.009653 UniqueCarrier_NW 0.93463 1.3994 0.66788 0.50421 UniqueCarrier_OH 2.5523 1.5813 1.6141 0.10651 UniqueCarrier_OO 0.65096 1.4665 0.44388 0.65713 UniqueCarrier_PA (1) 1.6532 2.2161 0.74601 0.45566 UniqueCarrier_PI 7.6092 1.7396 4.3741 1.2206e-05 UniqueCarrier_PS 1.854 3.6504 0.50789 0.61153 UniqueCarrier_TW 3.2357 1.4622 2.213 0.026902 UniqueCarrier_TZ -3.1902 2.4863 -1.2831 0.19946 UniqueCarrier_UA 3.9331 1.3927 2.8241 0.0047426 UniqueCarrier_US 2.4076 1.3928 1.7285 0.083898 UniqueCarrier_WN 0.73928 1.3833 0.53442 0.59305 UniqueCarrier_XE 3.6054 1.4992 2.405 0.016176 UniqueCarrier_YV 7.0361 1.7228 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
には、線形回帰モデルの式と、推定モデル係数に関する統計量が含まれています。table 出力には、連続するそれぞれの項についての行と UniqueCarrier
の各値についての行が含まれます。"p" 値を有意水準 0.05 と比較することで、項または値が到着遅延に対して統計的に有意な影響を与えるかどうかを判定できます。
UniqueCarrier
に、到着遅延に対して統計的に有意な影響を与える値が含まれているかどうかを判定するには、関数anova
を使用して 95% の信頼水準で ANOVA を実行します。gpuArray
入力を関数 anova
に渡すと、この関数は 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
には ANOVA の結果が含まれます。UniqueCarrier
に対応する行の "p" 値が有意水準 0.05 より小さいことから、UniqueCarrier
の少なくとも 1 つの値が到着遅延に対して統計的に有意な影響を与えることがわかります。
参考
gpuDevice
(Parallel Computing Toolbox) | gputimeit
(Parallel Computing Toolbox) | timeit
| fitlm
| anova
関連するトピック
- GPU でのデータの解析とモデル化
- GPU パフォーマンスの測定と向上 (Parallel Computing Toolbox)
- GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)