二氧化碳排放与 🤗 Hub:引领潮流

发布于 2022 年 4 月 22 日
在 GitHub 上更新

什么是二氧化碳排放,为什么它们很重要?

气候变化是我们面临的最大挑战之一,减少二氧化碳(CO2)等温室气体的排放是解决这一问题的重要组成部分。

训练和部署机器学习模型会因所使用的计算基础设施(从 GPU 到存储)的能耗而排放二氧化碳:所有这些都需要能量才能运行并在过程中排放二氧化碳。

Image of recent Transformer models and their carbon footprints

图示:近期 Transformer 模型及其碳足迹

二氧化碳排放量取决于不同的因素,如运行时间、使用的硬件以及能源的碳强度。

使用下面描述的工具将帮助您跟踪和报告自己的排放量(这对于提高我们整个领域的透明度很重要!),并根据模型的碳足迹选择模型。

如何使用 Transformers 自动计算自己的二氧化碳排放量

在我们开始之前,如果您的系统上没有最新版本的 huggingface_hub 库,请运行以下命令

pip install huggingface_hub -U

如何使用 Hugging Face Hub 寻找低排放模型

模型现在已上传到 Hub,那么如何在 Hub 上搜索模型以实现环保呢?huggingface_hub 库有一个新的特殊参数来执行此搜索:emissions_threshold。您所需要做的就是指定一个最小或最大克数,然后所有符合该范围的模型都将显示出来。

例如,我们可以搜索所有制作成本最高为 100 克的模型

from huggingface_hub import HfApi

api = HfApi()
models = api.list_models(emissions_thresholds=(None, 100), cardData=True)
len(models)
>>> 191

有很多!这也有助于找到较小的模型,因为它们在训练过程中通常不会排放那么多碳。

我们可以仔细查看一个,看看它是否符合我们的阈值

model = models[0]
print(f'Model Name: {model.modelId}\nCO2 Emitted during training: {model.cardData["co2_eq_emissions"]}')

>>> Model Name: esiebomajeremiah/autonlp-email-classification-657119381
    CO2 Emitted during training: 3.516233232503715

同样,我们可以搜索最小值以找到在训练过程中排放大量二氧化碳的超大型模型

models = api.list_models(emissions_thresholds=(500, None), cardData=True)
len(models)
>>> 10

现在让我们看看其中一个模型究竟排放了多少二氧化碳

model = models[0]
print(f'Model Name: {model.modelId}\nCO2 Emitted during training: {model.cardData["co2_eq_emissions"]}')

>>> Model Name: Maltehb/aelaectra-danish-electra-small-cased
    CO2 Emitted during training: 4009.5

那可真是大量的二氧化碳!

正如您所看到的,只需几行代码,我们就可以快速审查我们可能想要使用的模型,以确保我们具有环保意识!

如何使用 transformers 报告您的碳排放量

如果您正在使用 transformers,借助 codecarbon 集成,您可以自动跟踪和报告碳排放量。如果您已在计算机上安装 codecarbon,则 Trainer 对象将在训练期间自动添加 CodeCarbonCallback,它将为您存储碳排放数据。

因此,如果您运行类似这样的代码...

from datasets import load_dataset
from transformers import AutoModelForSequenceClassification, AutoTokenizer, Trainer, TrainingArguments
​
ds = load_dataset("imdb")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=2)
tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
​
def tokenize_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)
​
​
small_train_dataset = ds["train"].shuffle(seed=42).select(range(1000)).map(tokenize_function, batched=True)
small_eval_dataset = ds["test"].shuffle(seed=42).select(range(1000)).map(tokenize_function, batched=True)
​
​
training_args = TrainingArguments(
    "codecarbon-text-classification",
    num_train_epochs=4,
    push_to_hub=True
)
​
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=small_train_dataset,
    eval_dataset=small_eval_dataset,
)
​
trainer.train()

...您将在 codecarbon-text-classification 目录中留下一个名为 emissions.csv 的文件。该文件将跟踪不同训练运行的碳排放量。然后,当您准备好时,您可以从用于训练最终模型的运行中获取排放量,并将其包含在模型的模型卡中。📝

此数据包含在模型卡顶部的示例如下所示

Visual of organizing the co2_eq_emissions in a Model Card file

有关 co2_eq_emissions 元数据格式的更多参考,请参阅Hub 文档

延伸阅读

社区

注册登录评论