标签: huggingface-transformers

如何从huggingface下载模型?

例如,我想在https://huggingface.co/modelsbert-base-uncased上下载,但找不到“下载”链接。或者说不能下载?

transformer-model huggingface-transformers

52
推荐指数
4
解决办法
13万
查看次数

禁止 HuggingFace 日志记录警告:“将 `pad_token_id` 设置为 `eos_token_id`:{eos_token_id} 以进行开放式生成。”

在 HuggingFace 中,每次调用pipeline()对象时,我都会收到警告:

`"Setting `pad_token_id` to `eos_token_id`:{eos_token_id} for open-end generation."
Run Code Online (Sandbox Code Playgroud)

如何在不抑制所有日志记录警告的情况下抑制此警告?我想要其他警告,但我不想要这个。

huggingface-transformers huggingface-tokenizers

34
推荐指数
2
解决办法
4万
查看次数

如何在 PyTorch 中释放 GPU 内存

我有一个句子列表,我正在尝试使用以下代码使用多个模型来计算其困惑度:

from transformers import AutoModelForMaskedLM, AutoTokenizer
import torch
import numpy as np
model_name = 'cointegrated/rubert-tiny'
model = AutoModelForMaskedLM.from_pretrained(model_name).cuda()
tokenizer = AutoTokenizer.from_pretrained(model_name)

def score(model, tokenizer, sentence):
    tensor_input = tokenizer.encode(sentence, return_tensors='pt')
    repeat_input = tensor_input.repeat(tensor_input.size(-1)-2, 1)
    mask = torch.ones(tensor_input.size(-1) - 1).diag(1)[:-2]
    masked_input = repeat_input.masked_fill(mask == 1, tokenizer.mask_token_id)
    labels = repeat_input.masked_fill( masked_input != tokenizer.mask_token_id, -100)
    with torch.inference_mode():
        loss = model(masked_input.cuda(), labels=labels.cuda()).loss
    return np.exp(loss.item())


print(score(sentence='London is the capital of Great Britain.', model=model, tokenizer=tokenizer)) 
# 4.541251105675365
Run Code Online (Sandbox Code Playgroud)

大多数模型都运行良好,但有些句子似乎会抛出错误:

RuntimeError: CUDA out of memory. Tried to allocate 10.34 …

python memory pytorch huggingface-transformers

27
推荐指数
2
解决办法
5万
查看次数

Bert Trainer 实例中的提前停止

我正在针对多类分类任务微调 BERT 模型。我的问题是我不知道如何向这些 Trainer 实例添加“提前停止”。有任何想法吗?

python neural-network deep-learning huggingface-transformers huggingface

26
推荐指数
1
解决办法
2万
查看次数

如何获得 Huggingface.transformers Trainer 每个时期或步骤的准确性?

我正在将 Huggingface Trainer 与BertForSequenceClassification.from_pretrained("bert-base-uncased")模型一起使用。

简化后,它看起来像这样:

model = BertForSequenceClassification.from_pretrained("bert-base-uncased")
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")

training_args = TrainingArguments(
        output_dir="bert_results",
        num_train_epochs=3,
        per_device_train_batch_size=8,
        per_device_eval_batch_size=32,
        warmup_steps=500,
        weight_decay=0.01,
        logging_dir="bert_results/logs",
        logging_steps=10
        )

trainer = Trainer(
        model=model,
        args=training_args,
        train_dataset=train_dataset,
        eval_dataset=val_dataset,
        compute_metrics=compute_metrics
        )
Run Code Online (Sandbox Code Playgroud)

日志包含每 10 步的损失,但我似乎无法找到训练的准确性。有谁知道如何获得准确性,例如通过更改记录器的详细程度?我似乎在网上找不到任何有关它的信息。

python logging tensorflow huggingface-transformers

25
推荐指数
2
解决办法
2万
查看次数

如何为给定域构建语义搜索

我们正在尝试解决一个问题,我们想对我们的数据集进行语义搜索,即我们有一个特定领域的数据(例如:关于汽车的句子)

我们的数据只是一堆句子,我们想要的是给出一个短语并取回以下句子:

  1. 类似于那句话
  2. 有与短语相似的句子的一部分
  3. 具有上下文相似含义的句子


让我试着给你举个例子,假设我搜索短语“购买体验”,我应该得到这样的句子:

  • 我从没想过买车可以花不到 30 分钟的时间来签名和购买。
  • 我找到了我喜欢的汽车,购买过程
    简单明了

  • 我非常讨厌去买车,但今天我很高兴我做到了


我想强调这样一个事实,即我们正在寻找上下文相似性,而不仅仅是一个蛮力的词搜索。

如果句子使用不同的词,那么它也应该能够找到它。

我们已经尝试过的事情:

  1. 开放语义搜索我们在这里面临的问题是从我们拥有的数据中生成本体,或者为此从我们感兴趣的不同领域搜索可用的本体。

  2. Elastic Search(BM25 + Vectors(tf-idf)),我们尝试了这个,它给出了几句话,但精度不是那么好。准确性也很差。我们尝试了一个人工策划的数据集,它只能得到大约 10% 的句子。

  3. 我们尝试了不同的嵌入,比如在句子转换器中提到过的嵌入,并且还通过示例并尝试根据我们的人工策划集进行评估,但准确性也非常低。

  4. 我们尝试了ELMO。这比我们预期的要好,但仍然比我们预期的准确度低,并且有一个认知负荷来决定我们不应该考虑低于这个值的余弦值。这甚至适用于第 3 点。

任何帮助将不胜感激。非常感谢您的帮助

python nlp elasticsearch sentence-similarity huggingface-transformers

24
推荐指数
1
解决办法
3054
查看次数

如何截断 Huggingface 管道中的输入?

我目前使用 Huggingface 管道进行情感分析,如下所示:

from transformers import pipeline
classifier = pipeline('sentiment-analysis', device=0)
Run Code Online (Sandbox Code Playgroud)

问题是,当我传递大于 512 个标记的文本时,它会崩溃并提示输入太长。有没有办法将 max_length 和 truncate 参数从分词器直接传递到管道?

我的工作是做:

从转换器导入 AutoTokenizer、AutoModelForSequenceClassification

model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
classifier = pipeline('sentiment-analysis', model=model, tokenizer=tokenizer, device=0)
Run Code Online (Sandbox Code Playgroud)

然后当我调用标记器时:

pt_batch = tokenizer(text, padding=True, truncation=True, max_length=512, return_tensors="pt")
Run Code Online (Sandbox Code Playgroud)

但如果能够像这样直接调用管道会更好:

classifier(text, padding=True, truncation=True, max_length=512)
Run Code Online (Sandbox Code Playgroud)

huggingface-transformers huggingface-tokenizers

21
推荐指数
2
解决办法
1万
查看次数

将微调后的模型保存在本地

我试图了解如何在本地保存微调后的模型,而不是将其推送到中心。

我已经完成了一些教程,并且在微调模型的最后一步正在运行trainer.train()。然后指令通常是:trainer.push_to_hub

但是如果我不想推送到中心怎么办?我想将模型保存在本地,然后能够将其从我自己的计算机加载到将来的任务中,这样我就可以进行推理而无需重新调整。

我怎样才能做到这一点?

例如:最初从拥抱的脸上加载模型:

model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=5)
Run Code Online (Sandbox Code Playgroud)
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=small_train_dataset,
    eval_dataset=small_eval_dataset,
    compute_metrics=compute_metrics,
)

trainer.train()

Run Code Online (Sandbox Code Playgroud)

以某种方式将新训练的模型保存在本地,以便下次我可以通过

model = 'some local directory where model and configs (?) got saved'
Run Code Online (Sandbox Code Playgroud)

huggingface-transformers

21
推荐指数
1
解决办法
3万
查看次数

如何使用来自 BERT 的嵌入来比较句子的相似性

我正在使用 HuggingFace Transformers 包来访问预训练模型。由于我的用例需要英语和阿拉伯语的功能,因此我使用了bert-base-multilingual- cased 预训练模型。我需要能够使用诸如余弦相似度之类的东西来比较句子的相似度。要使用它,我首先需要为每个句子获取一个嵌入向量,然后可以计算余弦相似度。

首先,从 BERT 模型中提取语义嵌入的最佳方法是什么?在输入句子后获取模型的最后一个隐藏状态就足够了吗?

import torch
from transformers import BertModel, BertTokenizer

model_class = BertModel
tokenizer_class = BertTokenizer
pretrained_weights = 'bert-base-multilingual-cased'

tokenizer = tokenizer_class.from_pretrained(pretrained_weights)
model = model_class.from_pretrained(pretrained_weights)

sentence = 'this is a test sentence'

input_ids = torch.tensor([tokenizer.encode(sentence, add_special_tokens=True)])
with torch.no_grad():
    output_tuple = model(input_ids)
    last_hidden_states = output_tuple[0]

print(last_hidden_states.size(), last_hidden_states)
Run Code Online (Sandbox Code Playgroud)

其次,如果这是从我的句子中获得嵌入的充分方法,我现在还有另一个问题,即嵌入向量的长度取决于原始句子的长度。形状输出是[1, n, vocab_size],其中n可以有任何值。

为了计算两个向量的余弦相似度,它们需要具有相同的长度。我怎么能在这里做到这一点?像第一次求和这样幼稚的事情axis=1还能奏效吗?我还有什么其他选择?

python nlp vector cosine-similarity huggingface-transformers

20
推荐指数
3
解决办法
9332
查看次数

AutoModelForSequenceClassification 与 AutoModel 之间有什么区别

我们可以从 AutoModel(TFAutoModel) 函数创建一个模型:

from transformers import AutoModel 
model = AutoModel.from_pretrained('distilbert-base-uncase')
Run Code Online (Sandbox Code Playgroud)

另一方面,模型是由 AutoModelForSequenceClassification(TFAutoModelForSequenceClassification) 创建的:

from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification('distilbert-base-uncase')
Run Code Online (Sandbox Code Playgroud)

据我所知,这两个模型都使用 distilbert-base-uncase 库来创建模型。从方法名称来看,第二个类(AutoModelForSequenceClassification)是为序列分类创建的。

但是两个类别的真正区别是什么?以及如何正确使用它们?

(我在huggingface上搜索过,但不清楚)

nlp text-classification huggingface-transformers

19
推荐指数
2
解决办法
1万
查看次数