継形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® Xeon® W-2133 CPU (3.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.3241
tcpu には、CPU での線形回帰モデルの当てはめに必要な時間が含まれます。
GPU での線形モデルの当てはめにかかる時間の測定
関数gpuDevice (Parallel Computing Toolbox)を使用して、GPU デバイスが使用可能であることを確認します。
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.
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.1006
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.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 には、線形回帰モデルの式と、推定モデル係数に関する統計量が含まれています。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)