Как получить размер Обнимающей лица натренированной модели?

#python #deep-learning #nlp #pytorch #huggingface-transformers

Вопрос:

Я продолжаю получать CUDA out of memory ошибку при попытке точной настройки Обнимающей лица, предварительно обученной XML-модели Роберты. Итак, первое, что я хочу выяснить, — это размер предварительно подготовленной модели.

 model = XLMRobertaForCausalLM.from_pretrained('xlm-roberta-base', config=config)
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

model.to(device)
 

Я попытался получить размер модели с

 sys.getsizeof(model)
 

и, что неудивительно, я получаю неверный результат. В результате я получаю 56, что соответствует размеру объекта python.

Но потом я попробовал model. element_size() , и я получаю ошибку

 ModuleAttributeError: 'XLMRobertaForCausalLM' object has no attribute 'element_size'
 

Я поискал в документации по Обнимающемуся лицу, но не нашел, как это сделать. Кто-нибудь здесь знает, как это сделать?

Комментарии:

1. Обычно, когда люди говорят о «размере» модели, они говорят о количестве изучаемых параметров. Что вы написали, вы ищете размер в байтах?

Ответ №1:

Если вы столкнулись CUDA out of memory с ошибками, проблема в основном не в модели, а в обучающих данных. Вы можете уменьшить batch_size (количество обучающих примеров, используемых параллельно), поэтому вашему графическому процессору нужно обрабатывать только несколько примеров на каждой итерации, а не тонну.

Однако на ваш вопрос:

Я бы рекомендовал вам изменить размер. Это библиотека, которая вычисляет «реальный» размер (также известный как «глубокий» размер). Таким образом, простым решением было бы:

 import objsize
objsize.get_deep_size(model)
 

Однако в документации говорится:

За исключением неисключительных объектов. То есть объекты, на которые также ссылаются откуда-то еще в программе. Это верно для вычисления глубокого размера объекта и для обхода его потомков.

Это не должно быть проблемой, но если она все еще слишком мала для вашей модели, вы можете использовать Pympler, другую библиотеку, которая вычисляет «глубокий» размер с помощью рекурсии.

Другим подходом было бы реализовать get_deep_size() функцию самостоятельно, например, из этой статьи:

 import sys

def get_size(obj, seen=None):
    """Recursively finds size of objects"""
    size = sys.getsizeof(obj)
    if seen is None:
        seen = set()
    obj_id = id(obj)
    if obj_id in seen:
        return 0
    # Important mark as seen *before* entering recursion to gracefully handle
    # self-referential objects
    seen.add(obj_id)
    if isinstance(obj, dict):
        size  = sum([get_size(v, seen) for v in obj.values()])
        size  = sum([get_size(k, seen) for k in obj.keys()])
    elif hasattr(obj, '__dict__'):
        size  = get_size(obj.__dict__, seen)
    elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)):
        size  = sum([get_size(i, seen) for i in obj])
    return size
 

Комментарии:

1. Самое первое, что я сделал, это как раз уменьшил размер пакета, и все равно я продолжал получать ошибку. Но потом я наконец понял, что у меня ошибка в коде.