如何获得 Hugging Face 预训练模型的大小?

Posted

技术标签:

【中文标题】如何获得 Hugging Face 预训练模型的大小?【英文标题】:How to get the size of a Hugging Face pretrained model? 【发布时间】:2021-09-06 05:55:46 【问题描述】:

在尝试微调 Hugging Face 预训练 XML Roberta 模型时,我不断收到 CUDA out of memory 错误。所以,我首先要了解的是预训练模型的大小。

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'

我已经在 Hugging Face 文档中进行了搜索,但我还没有找到如何去做。这里有人知道怎么做吗?

【问题讨论】:

通常当人们谈论模型的“大小”时,他们谈论的是可学习参数的数量。你写了什么,你在找字节大小吗? 【参考方案1】:

如果您遇到CUDA out of memory 错误,问题主要不是模型,而是训练数据。您可以减少batch_size(并行使用的训练示例数),因此您的 gpu 每次迭代只需要处理几个示例,而不需要处理大量示例。

但是,对于您的问题:

我会推荐你​​objsize。它是一个计算“真实”尺寸(也称为“深度”尺寸)的库。所以一个简单的解决方案是:

import objsize
objsize.get_deep_size(model)

但是,文档说:

排除非排他性对象。也就是说,也从程序中的其他地方引用的对象。这适用于计算对象的深度大小和遍历其后代。

这应该不是问题,但如果它对于您的模型来说仍然太小,您可以使用 Pympler,这是另一个通过递归计算“深度”大小的库。

另一种方法是自己实现get_deep_size() 函数,例如来自this article:

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

【讨论】:

我做的第一件事就是减少批量大小,但我仍然不断收到错误。但是,后来我终于发现我的代码中有一个错误。

以上是关于如何获得 Hugging Face 预训练模型的大小?的主要内容,如果未能解决你的问题,请参考以下文章

使用 LoRA 和 Hugging Face 高效训练大语言模型

翻译: Deep Learning深度学习平台Hugging Face 开源代码和技术构建训练和部署 ML 模型

翻译: Deep Learning深度学习平台Hugging Face 开源代码和技术构建训练和部署 ML 模型

翻译: Deep Learning深度学习平台Hugging Face 开源代码和技术构建训练和部署 ML 模型

查看 Hugging Face Sagemaker 模型的训练错误指标

BERT模型Hugging face的慢速训练