본문 바로가기

끄적끄적

predict, call, batch_size

먼저 Keras API에서 의문점에 대해 탐구했다.

 

https://www.tensorflow.org/api_docs/python/tf/keras/Model#predict

 

tf.keras.Model  |  TensorFlow v2.11.0

Model groups layers into an object with training and inference features.

www.tensorflow.org

tf.keras.Model에서 predict에서 의문이 생겼다.

 

predict에서 batch_size는 도대체 무슨 용도로 사용하는 것인가?

 

정식 문서 설명에서도, 구체적으로 나오지는 않았기에 꽤나 많이 검색했던것 같다.

 

그래도 꽤나 만족스러운 답변을 몇개정도 얻을수 있었다.

 

https://anshulhep.medium.com/make-your-tensorflow-keras-predictions-faster-with-batch-size-8bbd780b9c08

 

Make your tensorflow / keras predictions faster with batch size

One big mistake many people do is to use model.predict(X) without any specification of batch size.

anshulhep.medium.com

에서는 batch_size를 크게 잡을수록 더 많은 RAM에 data를 저장하고, 속도가 빨라질 것이라고 했다.

 

따라서 나는 tensorflow.keras.applications.VGG19을 이용해서 테스트 해보고자 했다.

 

model을 load하고 predict를 할때, batch_size를 각각 1, 10, 32 (default), 10000.

 

실험결과는 딱히 엄청난 결과를 가져오지는 않았다. 모두 비슷한 수행시간을 가져왔다.

timeList = []
for data in datasets:
    start_time = time.process_time()
    model.predict(data, batch_size=1, verbose=0)
    end_time = time.process_time()
    timeList.append(end_time-start_time)

print('RLT:', sum(timeList)/len(timeList))

dataset은 caltec101 dataset을 사용했고, 단순 수행시간만을 비교하고자 하였기 때문에 결과에 대한 정확도는 비교하지 않았다. dataset중에 1000개정도를 따로 가져와서 평균 수행시간을 비교하엿다.

 

  1 10 32 (default) 10000
평균 수행시간 0.042390625 0.04640625 0.04696875 0.046171875

 

대충, 다음과 같이 작성하여 시간을 측정하였고, 모두 비슷한 수행시간을 가져왔다. (오히려 배치가 1개일때가 약간 더 좋았다.)

 

아마 성능이 이미 뛰어난 컴퓨터를 사용해서 그런가? 싶었다.

 

현재 본인이 사용하고있는 GPU는 RTX3070Ti를 쓰고있기에, GPU에 의한 차이가 있지 않을까 생각했지만, 현재 비교할만한 다른 컴퓨터를 가지고 있지 못하여 실험하지는 못했다.

 

실험하면서 발견한 재밌는 사실은, 1000개의 이미지 중 가장 첫번재 predict는 시간이 오래걸린다는 점이다. 해당 이유는 추후에 알아보기로 했다.

 

추가적으로, model.predict와 model.call의 차이도 실험해봤다.

 

# predict
for data in datasets:
    start_time = time.process_time()
    model.predict(data, verbose=0)
    end_time = time.process_time()
    timeList.append(end_time-start_time)
    
# call
for data in datasets:
    start_time = time.process_time()
    model(data)
    end_time = time.process_time()
    timeList.append(end_time-start_time)

 

동시에 수행하면 첫번째 이미지의 predict가 시간을 많이 잡아먹기에, 각각 주석처리하여 따로 측정하였다.

  predict call
1000 IMG 평균행시간 0.0461875 0.008578125

엄청나게 큰 차이를 보였다.

 

그러나 이는 call이 최종적으로 numpy로 변환하지 않기에, numpy로 변환하는것을 추가하여 시간을 측정해보았다.

# call
for data in datasets:
    start_time = time.process_time()
    rlt=model(data)
    rlt.numpy()
    end_time = time.process_time()
    timeList.append(end_time-start_time)
  predict call
1000 IMG 평균행시간 0.0461875 0.008828125

그래도 기가막힌 차이를 보여주었기 때문에, 결과가 다르지 않을까 걱정되어, 결과까지 비교해보았다.

 

for data in datasets:
    start_time = time.process_time()
    rlt=model(data)
    rlt=rlt.numpy()
    p_rlt.append(decode_predictions(rlt,top=3)[0])
    end_time = time.process_time()
    timeList.append(end_time-start_time)
print('RLT:', sum(timeList)/len(timeList))

print(p_rlt)

import pickle
with open('rltdata.pkl', 'wb') as f:
    pickle.dump(p_rlt, f)

call과 predict의 결과 모두 pickle로 저장하고, 따로 불러와서 비교해보았다.

 

import pickle

with open('rltdata.pkl', 'rb') as r:
    rlt1 = pickle.load(r)
with open('rltdata2.pkl', 'rb') as r:
    rlt2 = pickle.load(r)

count = 0
for r1, r2 in zip(rlt1, rlt2):
    if r1 != r2:
        count+=1

print('# of different rlt: ', count)

그러나 1000개 모두 다르다는 결과를 받았다.

이를 출력하여 비교해보니, 예상한 이미지는 동일하였지만, 확률이 달라 생긴 문제였다.

('n07248320', 'book_jacket', 0.38420463), ('n06794110', 'street_sign', 0.28003964), ('n02977058', 'cash_machine', 0.042716507)

또, 내가 top3를 결과로 가져왔기 때문에 생긴 문제이기도 하였다.

 

따라서 가장 높은 확률과 그것의 이름만 비교하도록 하였더니 1000장의 사진중 1장의 사진을 다르다고 판단했고,

나머지는 모두 동일하였다.

 

해당 이미지는

이 이미지였고, 안타깝게도 비행기로 인식한것이 아닌

  top1 top2 top3
call triceratops swing plow
predict swing triceratops plow

로 모두 잘못 인식하였다. 아마 학습 문제일것이라 추측된다.

 

각 확률은

  top1 top2 top3
call 0.18977499 0.18968959 0.08819509
predict 0.1903618 0.1893905 0.08839469

 

결론적으로는 추론단계에서 call과 predict의 큰 차이를 알아내지 못했다.

 

제대로 확인하지 못한 내 잘못이다.

https://rnltls.tistory.com/10

 

batch predict, 개별 predict, 개별 call, layer by layer

TensorFlow (이하 TF)에서 batch로 무언가 추론하고싶다면, 어떻게 해야할까? 방법을 알기에 앞서, 공식 문서를 확인해 보았다. TF Model 공식 문서 Args x Input samples. It could be: A Numpy array (or array-like), or a l

rnltls.tistory.com

다음 포스팅에서 조금 더 자세히 다뤄보았다.

 

'끄적끄적' 카테고리의 다른 글

Non-Sequential Model 묶기  (0) 2023.02.02
Yolo 개척기  (2) 2023.01.31
(TensorFlow) 첫번째 추론 시간, First inference time  (0) 2023.01.30
batch predict, 개별 predict, 개별 call, layer by layer  (0) 2023.01.27
MuZero 코드  (0) 2021.08.17