본문 바로가기

끄적끄적

(TensorFlow) 첫번째 추론 시간, First inference time

문득 한번도 고민하지 않고 당연하게 여겼던 것에 의문이 들었다.

 

왜 첫번째 추론시간은 시간이 많이 걸리는가?

 

명확하게 알지는 못했지만, 아마 모델을 로드하는데 어느정도 시간이 걸렸을 것이라 예측했었다.

 

그러나 수행하기 이전에 나는 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