我正在尝试微调一个Huggingface模型,使用Tensorflow (在ColabPro上启用GPU )来分析tweets的情绪。我一步一步地在Huggingface网站上完成了指南,但我正在经历一段奇怪的训练时间。我尝试过的所有伯特模型都会发生这种情况。我有两个不同大小的数据集(10k和250万),由推文组成,我需要将其归类为有积极情绪或消极情绪。
通过这段代码,我对数据集执行标记化:
# 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数据集:
# 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,
)下载并编译模型:
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(),
)我终于训练了模特
# 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。
我现在的问题是:
steps_per_epoch实际上是做什么的?为什么它会加速训练时间呢?为什么性能会下降呢?发布于 2022-05-06 14:03:50
关于你的第一个问题,我以前没有使用过伯特模型,所以我不能说。
根据我的理解,对于你的第二个问题,每个阶段的步骤是在一个时期内用来拟合模型的样本批次的数量。
假设你的次数是2,而不是1,一旦模型安装了10批训练数据(在你的例子中,批次大小设置为64,即每一个时期640个样本),那么你将把每一个时期的步数设置为10,它将结束这个时代,并开始第二个纪元,在收到640个样本之后也会结束。最后,该模型只训练了1280个样本的数据。
虽然在您的例子中,您将每一个时期的步长设置为整个样本大小的长度,但奇怪的是,它减少了培训时间。我将尝试一些类似的东西来理解正在发生的事情。
https://stackoverflow.com/questions/72139450
复制相似问题