문득 한번도 고민하지 않고 당연하게 여겼던 것에 의문이 들었다.
왜 첫번째 추론시간은 시간이 많이 걸리는가?
명확하게 알지는 못했지만, 아마 모델을 로드하는데 어느정도 시간이 걸렸을 것이라 예측했었다.
그러나 수행하기 이전에 나는 tf.keras.models.load_model을 통해 이미 모델을 load완료 하였는데도 불구하고 항상 첫번째 추론이 오래걸렸다.
다음은 VGG19에서 내가 측정한 각 레이어의 수행시간을 나타낸다.
이미지 1장, 100장, 1000장일 경우의 수행시간이며, 동시에 측정하지 않고 독립적으로 측정했다.
Environment
GPU Type: NVIDIA RTX 3070Ti
CUDA Version: 11.6
Operating System + Version: Windows 10
Python Version: 3.9.13
TensorFlow Version: 2.10.0
layers | 1 | 100 | 1000 |
input_1 | 0.0 | 0.0 | 0.0 |
block1_conv1 | 1.15625 | 1.1875 | 1.828125 |
block1_conv2 | 0.0 | 0.046875 | 0.296875 |
block1_pool | 0.0 | 0.015625 | 0.015625 |
block2_conv1 | 0.0 | 0.046875 | 0.140625 |
block2_conv2 | 0.0 | 0.015625 | 0.25 |
block2_pool | 0.0 | 0.015625 | 0.015625 |
block3_conv1 | 0.015625 | 0.015625 | 0.203125 |
block3_conv2 | 0.0 | 0.015625 | 0.21875 |
block3_conv3 | 0.0 | 0.015625 | 0.140625 |
block3_conv4 | 0.0 | 0.046875 | 0.234375 |
block3_pool | 0.0 | 0.0 | 0.015625 |
block4_conv1 | 0.0 | 0.0 | 0.21875 |
block4_conv2 | 0.015625 | 0.015625 | 0.25 |
block4_conv3 | 0.0 | 0.0 | 0.25 |
block4_conv4 | 0.0 | 0.015625 | 0.28125 |
block4_pool | 0.0 | 0.0 | 0.03125 |
block5_conv1 | 0.0 | 0.046875 | 0.28125 |
block5_conv2 | 0.0 | 0.046875 | 0.234375 |
block5_conv3 | 0.0 | 0.03125 | 0.140625 |
block5_conv4 | 0.0 | 0.015625 | 0.25 |
block5_pool | 0.0 | 0.0 | 0.078125 |
flatten | 0.0 | 0.015625 | 0.03125 |
fc1 | 0.0 | 0.0 | 0.125 |
fc2 | 0.0 | 0.015625 | 0.125 |
predictions | 0.0 | 0.046875 | 0.09375 |
SUM | 1.25 | 1.671875 | 5.75 |
조금 이상함을 느낄 수 있다.
1장의 사진을 처리하는데 모델 load부터 inference를 완료할 때까지 1.25초가 걸렸는데,
100장의 사진을 처리하는데 모델 load부터 inference를 완료할 때까지 1.671875초가 걸렸다.
이는 다시 말하면, 첫 inference에서 어떤 일이 발생하여 시간이 오래 걸렸다는 뜻이고, 이대로 시간을 측정한다면 정확한 시간을 예측하기 어려워진다는것을 의미한다.
따라서 나는 100장을 inference할 때 수행시간에서 1장을 inference할 떄 수행시간을 빼서, 99장을 수행할 때 수행시간을 대략적으로 계산해 보았다. 1.671875-1.25
계산 결과, 99장의 사진을 inference하는데에는 0.421875초가 걸리는 것으로 계산하였다. 약 1장의 사진을 처리하는데는 0.0042613636363636...초가 걸린다는 것이다. 이를 이용하여 1장을 inference할 때 수행시간과 방금 계산으로 구한 1장의 사진을 inference하는데 걸리는 시간을 이용하여, 1000장을 inference할 때 수행시간을 계산해보았다.
1.25+(0.0042613636363636)*999 = 5.507102272727273로, 실제 측정한 5.75와 어느정도 근사한 값이 나왔다.
추가적으로 1번의 dummy input을 넣어 첫 inference를 측정하지 않고, 다음 inference부터 layer execution time을 측정해 보았다.
layers | 1000 Dummy Input O | 1000 Dummy Input X |
input_1 | 0.0 | 0.0 |
block1_conv1 | 0.6875 | 1.828125 |
block1_conv2 | 0.34375 | 0.296875 |
block1_pool | 0.03125 | 0.015625 |
block2_conv1 | 0.171875 | 0.140625 |
block2_conv2 | 0.375 | 0.25 |
block2_pool | 0.015625 | 0.015625 |
block3_conv1 | 0.265625 | 0.203125 |
block3_conv2 | 0.078125 | 0.21875 |
block3_conv3 | 0.265625 | 0.140625 |
block3_conv4 | 0.234375 | 0.234375 |
block3_pool | 0.15625 | 0.015625 |
block4_conv1 | 0.21875 | 0.21875 |
block4_conv2 | 0.28125 | 0.25 |
block4_conv3 | 0.21875 | 0.25 |
block4_conv4 | 0.265625 | 0.28125 |
block4_pool | 0.0 | 0.03125 |
block5_conv1 | 0.25 | 0.28125 |
block5_conv2 | 0.15625 | 0.234375 |
block5_conv3 | 0.125 | 0.140625 |
block5_conv4 | 0.171875 | 0.25 |
block5_pool | 0.015625 | 0.078125 |
flatten | 0.0625 | 0.03125 |
fc1 | 0.171875 | 0.125 |
fc2 | 0.140625 | 0.125 |
predictions | 0.078125 | 0.09375 |
SUM | 4.78125 | 5.75 |
Dummy Input을 넣어 첫 inference를 수행한 뒤 측정한 1000장의 inference 시간은 4.78125초였고, 이를 이용하여 한장의 inference 시간을 계산하였을 경우 0.00478125초로, 위에서 계산한 0.0042613636363636 초와 근사함을 알 수 있다.
그렇다면 왜 첫 inference는 시간이 오래 걸리는 것일까?
해당 이유에 대해서는 명확한 것을 찾지는 못하였다.
https://groups.google.com/a/tensorflow.org/g/discuss/c/PDIBnp1ftxk
하지만 그나마 가장 합리적인 해답을 여기서 해주고 있으니, 궁금하면 들어가서 읽어봐도 좋다.
'끄적끄적' 카테고리의 다른 글
Non-Sequential Model 묶기 (0) | 2023.02.02 |
---|---|
Yolo 개척기 (2) | 2023.01.31 |
batch predict, 개별 predict, 개별 call, layer by layer (0) | 2023.01.27 |
predict, call, batch_size (0) | 2023.01.26 |
MuZero 코드 (0) | 2021.08.17 |