首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Tensorflow处理Huggingface模型时的怪异行为

用Tensorflow处理Huggingface模型时的怪异行为
EN

Stack Overflow用户
提问于 2022-05-06 09:46:05
回答 1查看 264关注 0票数 0

我正在尝试微调一个Huggingface模型,使用Tensorflow (在ColabPro上启用GPU )来分析tweets的情绪。我一步一步地在Huggingface网站上完成了指南,但我正在经历一段奇怪的训练时间。我尝试过的所有伯特模型都会发生这种情况。我有两个不同大小的数据集(10k和250万),由推文组成,我需要将其归类为有积极情绪或消极情绪。

通过这段代码,我对数据集执行标记化:

代码语言:javascript
复制
# perform tokenization of the dataset
from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)

def tokenize_function(sentence):
    return tokenizer(sentence['Phrase'], padding=True, truncation=True, max_length=30)

train = train.map(tokenize_function, batched=True)
test = test.map(tokenize_function, batched=True)
val = val.map(tokenize_function, batched=True)

然后创建tensoflow数据集:

代码语言:javascript
复制
# go from 'Dataset' type to tensorflow so that our dataset can be used for training in keras
from transformers import DefaultDataCollator

data_collator = DefaultDataCollator(return_tensors="tf")

tf_train_dataset = train.to_tf_dataset(
    columns=["attention_mask", "input_ids", "token_type_ids"],
    label_cols=["Label"],
    shuffle=False,
    collate_fn=data_collator,
    batch_size=256,
)

tf_val_dataset = val.to_tf_dataset(
    columns=["attention_mask", "input_ids", "token_type_ids"],
    label_cols=["Label"],
    shuffle=False,
    collate_fn=data_collator,
    batch_size=256,
)

tf_test_dataset = test.to_tf_dataset(
    columns=["attention_mask", "input_ids", "token_type_ids"],
    shuffle=False,
    collate_fn=data_collator,
    batch_size=256,
)

下载并编译模型:

代码语言:javascript
复制
from transformers import TFAutoModelForSequenceClassification

# download pre-trained model
model = TFAutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=2)

model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=5e-5),
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics=tf.metrics.SparseCategoricalAccuracy(),
)

我终于训练了模特

代码语言:javascript
复制
# Compute some variables needed to speed up training
batch_size = 64
train_steps_per_epoch = int(len(tf_train_dataset) // batch_size)
dev_steps_per_epoch = int(len(tf_val_dataset) // batch_size)

# train model
model.fit(tf_train_dataset,
           validation_data=tf_val_dataset,
            epochs=1,
            verbose=2,
            # steps_per_epoch=train_steps_per_epoch,
            # validation_steps=dev_steps_per_epoch,
            )

我首先在10K数据集上训练了这个模型,一个时代大约需要20分钟。对我来说这是很多。训练集没有那么大,我正在使用一个相当强大的GPU。我试图在web上搜索一些技巧,以加快培训时间,而堆栈溢出的一个人建议设置steps_per_epoch参数,我将其设置为您可以在代码中看到的内容。现在训练时间呈指数增长,我可以在整个数据集(2.5M)上30分钟内训练3次,但实际性能下降了。我找到了steps_per_epoch的定义,对我来说,它就像batch_size。

我现在的问题是:

  1. 在10k推特的数据集上花费20分钟的时间是正常的吗?
  2. steps_per_epoch实际上是做什么的?为什么它会加速训练时间呢?为什么性能会下降呢?
EN

回答 1

Stack Overflow用户

发布于 2022-05-06 14:03:50

关于你的第一个问题,我以前没有使用过伯特模型,所以我不能说。

根据我的理解,对于你的第二个问题,每个阶段的步骤是在一个时期内用来拟合模型的样本批次的数量。

假设你的次数是2,而不是1,一旦模型安装了10批训练数据(在你的例子中,批次大小设置为64,即每一个时期640个样本),那么你将把每一个时期的步数设置为10,它将结束这个时代,并开始第二个纪元,在收到640个样本之后也会结束。最后,该模型只训练了1280个样本的数据。

虽然在您的例子中,您将每一个时期的步长设置为整个样本大小的长度,但奇怪的是,它减少了培训时间。我将尝试一些类似的东西来理解正在发生的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72139450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档