我正在开发一个项目,使用 SBERT 预训练模型(特别是 MiniLM )进行 995 个分类的文本分类项目。我按照 此处列出的步骤 大部分情况进行操作,一切似乎都在运行。
我的问题是在实际训练模型时出现的。无论我在训练参数中设置什么值,训练似乎总是提前结束并且永远不会完成所有批次。例如,我设置
num_train_epochs=1
但它最多只能达到 0.49 epoch。如果
num_train_epochs=4
,它总是以 3.49 纪元结束。
这是我的代码:
from datasets import load_dataset
from sentence_transformers import (
SentenceTransformer,
SentenceTransformerTrainer,
SentenceTransformerTrainingArguments,
SentenceTransformerModelCardData,
)
from sentence_transformers.losses import BatchAllTripletLoss
from sentence_transformers.training_args import BatchSamplers
from sentence_transformers.evaluation import TripletEvaluator
model = SentenceTransformer(
"nreimers/MiniLM-L6-H384-uncased",
model_card_data=SentenceTransformerModelCardData(
language="en",
license="apache-2.0",
model_name="all-MiniLM-L6-v2",
)
)
loss = BatchAllTripletLoss(model)
# Loss overview: https://www.sbert.net/docs/sentence_transformer/loss_overview.html
# This particular loss method: https://www.sbert.net/docs/package_reference/sentence_transformer/losses.html#batchalltripletloss
# training args: https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.TrainingArguments
args = SentenceTransformerTrainingArguments(
# Required parameter:
output_dir="finetune/model20240924",
# Optional training parameters:
num_train_epochs=1,
max_steps = -1,
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
learning_rate=1e-5,
warmup_ratio=0.1,
fp16=True, # Set to False if you get an error that your GPU can't run on FP16
bf16=False, # Set to True if you have a GPU that supports BF16
batch_sampler=BatchSamplers.GROUP_BY_LABEL, #
# Optional tracking/debugging parameters:
eval_strategy="no",
eval_steps=100,
save_strategy="epoch",
# save_steps=100,
save_total_limit=2,
logging_steps=100,
run_name="miniLm-triplet", # Will be used in W&B if `wandb` is installed
)
trainer = SentenceTransformerTrainer(
model=model,
args=args,
train_dataset=trainDataset,
eval_dataset=devDataset,
loss=loss,
#evaluator=dev_evaluator,
)
trainer.train()
请注意,我没有使用评估器,因为我们正在创建模型并在事后使用专用的测试值集对其进行测试。我的数据集的结构如下:
Dataset({
features: ['Title', 'Body', 'label'],
num_rows: 23961
})
数据集具有相同的结构,只是行数较少。这给出了以下输出:
dev
尽管我调整了值,但我无法让它完成所有批次。任何建议将不胜感激!
[1473/2996 57:06 < 59:07, 0.43 it/s, Epoch 0/1]
Step Training Loss
100 1.265600
200 0.702700
300 0.633900
400 0.505200
500 0.481900
600 0.306800
700 0.535600
800 0.369800
900 0.265400
1000 0.345300
1100 0.516700
1200 0.372600
1300 0.392300
1400 0.421900
TrainOutput(global_step=1473, training_loss=0.5003972503496366, metrics={'train_runtime': 3427.9198, 'train_samples_per_second': 6.99, 'train_steps_per_second': 0.874, 'total_flos': 0.0, 'train_loss': 0.5003972503496366, 'epoch': 0.4916555407209613})
As much as I adjust the values I cannot get it to complete all of the batches. Any advice would be appreciated!
训练提前停止但没有出现错误消息,这表明底层代码中可能出现了问题,导致训练循环提前退出。以下是可能导致此问题的几个原因和要检查的事项:
-
数据集大小和批量大小: 请仔细检查训练数据集的大小和
per_device_train_batch_size
。如果数据集大小不能被批量大小整除,那么最后一个 epoch 可能只有部分批次,这会导致训练在达到指定的 epoch 数之前停止。-
要尝试的操作:
-
打印训练数据集的大小:
print(len(trainDataset))
-
确保数据集大小可被
per_device_train_batch_size
整除。如果不是,请考虑调整批量大小或数据集大小,使其可被整除。
-
打印训练数据集的大小:
-
要尝试的操作:
-
早期停止回调: 虽然没有明确指定,但请确保没有意外启用早期停止回调。早期停止是一种机制,当模型性能在验证集上不再提高时,它会停止训练过程,这可以解释训练为何提前停止。
-
要尝试的操作:
-
在
SentenceTransformerTrainingArguments
中,请仔细检查是否没有设置early_stopping_patience
或任何其他与早期停止相关的参数。
-
在
-
要尝试的操作:
-
GPU 内存不足: 如果使用的是 GPU,请确保没有遇到 GPU 内存不足错误。当模型或数据对于的 GPU 内存来说太大时,可能会发生这种情况,从而导致训练意外停止。
-
要尝试的操作:
-
降低批量大小 (
per_device_train_batch_size
) 以减少 GPU 内存消耗。 -
监视 GPU 内存使用情况(例如,使用
nvidia-smi
),以查看在训练过程中是否有任何峰值或内存耗尽。
-
降低批量大小 (
-
要尝试的操作:
-
错误或异常: 请仔细检查训练日志中是否有任何错误或异常。有时,底层代码可能会遇到错误,但不会明确引发异常,从而导致训练循环静默退出。
-
要尝试的操作:
-
将日志级别增加到
DEBUG
,以便获取更详细的输出,从而帮助识别任何潜在的错误或警告。可以在SentenceTransformerTrainingArguments
中将logging_level
设置为'debug'
。
-
将日志级别增加到
-
要尝试的操作:
-
SBERT 库或 Hugging Face Transformers 版本: 在某些情况下,库版本中的错误或不兼容可能会导致意外行为。
-
要尝试的操作:
-
尝试将 SBERT (
sentence-transformers
) 和 Hugging Face Transformers (transformers
) 更新到最新版本,以查看是否解决了问题。可以使用pip install --upgrade sentence-transformers transformers
来执行此操作。
-
尝试将 SBERT (
-
要尝试的操作:
如果能够提供有关数据集大小、批量大小和训练日志(包括任何警告或错误消息)的更多信息,那将非常有帮助。这将有助于进一步缩小问题范围并提供更具体的建议。
标签:python,machine-learning,pytorch,nlp,bert-language-model From: 79021064