GIL's LAB

파이썬 인스턴스 (AI 모델 포함) 크기 측정 방법 본문

파이썬/파이썬 활용 팁

파이썬 인스턴스 (AI 모델 포함) 크기 측정 방법

GIL~ 2022. 1. 14. 12:17

 

 

파이썬 인스턴스 크기는 sys.getsizeof를 이용하여 측정할 수 있습니다.

크기가 100과 1000000인 난수 배열의 크기를 측정해보겠습니다.

먼저 난수 배열을 다음과 같이 생성합니다.

import numpy as np
small_arr = np.random.random(100)
large_arr = np.random.random(1000000)

다음으로 크기를 측정합니다.

print(sys.getsizeof(small_arr))
print(sys.getsizeof(large_arr))

[실행 결과]

896

8000096

 

크기가 잘 측정되는 것으로 보입니다.

그럼 머신러닝 모델의 인스턴스도 잘 측정되는지 보겠습니다. 

먼저 5개의 트리로 구성된 작은 랜덤포레스트 모델과 100개 트리로 구성된 큰 랜덤포레스트 모델을 학습합니다.

from sklearn.ensemble import RandomForestRegressor as RFR
X = np.random.random((100, 10))
Y = np.random.random(100)

small_model = RFR(5).fit(X, Y)
large_model = RFR(100).fit(X, Y)

아까와 같은 방법으로 크기를 측정해보겠습니다.

print(sys.getsizeof(small_model))
print(sys.getsizeof(large_model))

[실행 결과]

48

48

 

당연히 large_model이 더 커야하지만 그렇지 않게 나옵니다. 또, 앙상블 모델이 크기 100짜리 배열보다 가볍다는게 잘 이해가 가지 않습니다. 그 이유는 sys.getsizeof는 내장 자료형에 대해서만 잘 작동하기 때문입니다.

 

어느 상황에서도 쓰려면 아래 함수가 적절합니다.

import sys
from types import ModuleType, FunctionType
from gc import get_referents

def getsize(obj):
    BLACKLIST = type, ModuleType, FunctionType
    seen_ids = set()
    size = 0
    objects = [obj]
    while objects:
        need_referents = []
        for obj in objects:
            if not isinstance(obj, BLACKLIST) and id(obj) not in seen_ids:
                seen_ids.add(id(obj))
                size += sys.getsizeof(obj)
                need_referents.append(obj)
        objects = get_referents(*need_referents)
    return size

다시 모델의 크기를 측정해보겠습니다.

print(getsize(small_model))
print(getsize(large_model))

[실행 결과]

4934

45138

 

이번엔 잘 나온 것으로 보입니다. 

배열 크기도 측정해보겠습니다.

print(sys.getsizeof(small_arr))
print(sys.getsizeof(large_arr))

[실행 결과]

896

8000096

 

 

정리하자면, getsize 함수를 위와 같이 만들어서 사용하는 것이 좋습니다. 

Comments