标签: huggingface-tokenizers

AutoTokenizer.from_pretrained 无法加载本地保存的预训练分词器 (PyTorch)

我是 PyTorch 的新手,最近我一直在尝试使用 Transformers。我正在使用 HuggingFace 提供的预训练分词器。
我成功下载并运行它们。但如果我尝试保存它们并再次加载,则会发生一些错误。
如果我用来 AutoTokenizer.from_pretrained下载分词器,那么它就可以工作。

[1]:    tokenizer = AutoTokenizer.from_pretrained('distilroberta-base')
        text = "Hello there"
        enc = tokenizer.encode_plus(text)
        enc.keys()

Out[1]: dict_keys(['input_ids', 'attention_mask'])
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用保存它tokenizer.save_pretrained("distilroberta-tokenizer")并尝试在本地加载它,则会失败。

[2]:    tmp = AutoTokenizer.from_pretrained('distilroberta-tokenizer')


---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
/opt/conda/lib/python3.7/site-packages/transformers/configuration_utils.py in get_config_dict(cls, pretrained_model_name_or_path, **kwargs)
    238                 resume_download=resume_download,
--> 239                 local_files_only=local_files_only,
    240             )

/opt/conda/lib/python3.7/site-packages/transformers/file_utils.py in cached_path(url_or_filename, cache_dir, force_download, proxies, resume_download, user_agent, extract_compressed_file, force_extract, local_files_only)
    266         # File, but it doesn't exist.
--> 267         raise EnvironmentError("file {} not found".format(url_or_filename))
    268     else:

OSError: file …
Run Code Online (Sandbox Code Playgroud)

python deep-learning pytorch huggingface-transformers huggingface-tokenizers

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

使用数据集、标记器和火炬数据集和数据加载器进行动态标记化

我有一个关于“即时”标记化的问题。这个问题是通过阅读“如何使用 Transformers 和 Tokenizers 从头开始​​训练新的语言模型”引发。最后有这样一句话:“如果您的数据集非常大,您可以选择动态加载和标记示例,而不是作为预处理步骤”。我尝试提出一个将datasets和结合起来的解决方案tokenizers,但没有找到一个好的模式。

我想解决方案需要将数据集包装到 Pytorch 数据集中。

作为文档中的具体示例

import torch

class SquadDataset(torch.utils.data.Dataset):
    def __init__(self, encodings):
        # instead of doing this beforehand, I'd like to do tokenization on the fly
        self.encodings = encodings 

    def __getitem__(self, idx):
        return {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}

    def __len__(self):
        return len(self.encodings.input_ids)

train_dataset = SquadDataset(train_encodings)
Run Code Online (Sandbox Code Playgroud)

如何利用标记器的矢量化功能通过“即时”标记化来实现这一点?

huggingface-transformers huggingface-tokenizers gpt-2

7
推荐指数
1
解决办法
4085
查看次数

“正在使用bos_token,但尚未设置”是什么意思?

当我运行 demo.py 时

\n
from transformers import AutoTokenizer, AutoModel\n    \ntokenizer = AutoTokenizer.from_pretrained("distilbert-base-multilingual-cased")\nmodel = AutoModel.from_pretrained("distilbert-base-multilingual-cased", return_dict=True)\n# print(model)\ndef count_parameters(model):\n    return sum(p.numel() for p in model.parameters() if p.requires_grad)\nprint(count_parameters(model))\ninputs = tokenizer("\xe5\x8f\xb2\xe5\xaf\x86\xe6\x96\xaf\xe5\x85\x88\xe7\x94\x9f\xe4\xb8\x8d\xe5\x9c\xa8\xef\xbc\x8c\xe4\xbb\x96\xe5\x8e\xbb\xe7\x9c\x8b\xe7\x94\xb5\xe5\xbd\xb1\xe4\xba\x86\xe3\x80\x82Mr Smith is not in. He ________ ________to the cinema", return_tensors="pt")\nprint(inputs)\noutputs = model(**inputs)\nprint(outputs)\n
Run Code Online (Sandbox Code Playgroud)\n

代码显示

\n
{'input_ids': tensor([[  101,  2759,  3417,  4332,  2431,  5600,  2080,  3031, 10064,  2196,\n      2724,  5765,  5614,  3756,  2146,  1882, 12916, 11673, 10124, 10472,\n     10106,   119, 10357,   168,   168,   168,   168,   168,   168,   168,\n       168,   168,   168,   168,   168,   168, …
Run Code Online (Sandbox Code Playgroud)

multilingual distilbert huggingface-transformers huggingface-tokenizers

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

如何使用线程来拥抱面变压器

我正在尝试在线程上运行一个拥抱脸模型,模式完全是“cardiffnlp/twitter-roberta-base-sentiment”。但与此同时,我只想要它的一个实例,因为就时间而言,它真的很昂贵。

换句话说,我有多个 CSV 文件(几千个),每个文件都有大约 20k-30k 行,我希望所有这些文件中的每一行都由 Huggingface 模型执行,正如您可能已经想象到的那样我不想为每个线程实例化模型的原因(每个线程仅用于读取一行并将其写入数据库中)。我的方法的问题是,当我运行代码时,我会因为 Huggingface 模型而出现错误。

运行时错误:已借用

你们中的任何人都可以帮助我了解如何修复它吗?

抱脸型:

class EmotionDetection(object):
    def __init__(self, model_name="cardiffnlp/twitter-roberta-base-sentiment"):
        self.model_name = model_name
        tokenizer = AutoTokenizer.from_pretrained(model_name)
        model = AutoModelForSequenceClassification.from_pretrained(model_name)
        self.classifier = TextClassificationPipeline(model=model, tokenizer=tokenizer, return_all_scores=True,
                                                     task="sentiment-analysis", device=0)

    def get_emotion_by_label(self, label: str):
        if label == "LABEL_0":
            return "negative"
        elif label == "LABEL_1":
            return "neutral"
        elif label == "LABEL_2":
            return "positive"
        else:
            print("SOMETHING IS WRONG")
            return ""

    def get_emotion(self, phrase):
        results = self.classifier(phrase)
        res = dict()
        for result in results:
            for emotion in …
Run Code Online (Sandbox Code Playgroud)

python multithreading threadpool huggingface-transformers huggingface-tokenizers

7
推荐指数
0
解决办法
771
查看次数

为什么 Huggingface t5 分词器会忽略一些空格?

我正在使用 T5 模型和分词器来执行下游任务。我想向标记生成器添加某些空格,例如行结尾(\\t)和制表符(\\t)。添加这些标记可以工作,但不知何故标记器总是忽略第二个空格。因此,它将序列标记\xe2\x80\x9c\\n\\n\xe2\x80\x9d为单行结尾,并将序列"\\n\\n\\n\\n"标记为两个行结尾,依此类推。请参阅下文进行重现。

\n
from transformers import T5Tokenizer\ntokenizer = T5Tokenizer.from_pretrained("t5-large")\ntokenizer.add_tokens(["\\n"])\n\ntokenizer.encode("\\n") # returns [32100, 1] as expected\ntokenizer.encode("\\n\\n") # returns [32100, 1] but expected would be [32100, 32100, 1]\ntokenizer.encode("\\n\\n\\n\\n") # returns [32100, 32100, 1] but expected would be [32100, 32100, 32100, 32100, 1]\n
Run Code Online (Sandbox Code Playgroud)\n

这种行为背后的原因是什么?这是一个错误还是与分词器工作原理相关的东西?我注意到这只发生在添加的空格上,而不会发生在其他字符上。

\n

有没有办法防止分词器忽略重复的空格?

\n

huggingface-transformers huggingface-tokenizers sentencepiece

7
推荐指数
1
解决办法
2542
查看次数

在微调期间如何正确设置 pad token(不是 eos)以避免模型无法预测 EOS?

**太长了;我真正想知道的是设置 pad token 进行微调的官方方法是什么,它在原始训练期间没有设置,这样它就不会学习预测 EOS。**

colab:https://colab.research.google.com/drive/1poFdFYmkR_rDM5U5Z2WWjTepMQ8h ​​vzNc?usp=sharing


HF falcon 教程有以下行:

tokenizer.pad_token = tokenizer.eos_token
Run Code Online (Sandbox Code Playgroud)

我觉得很奇怪。pad 和 eos 是相同的,但为什么首先要在它们之间做出区分呢?

请注意,这样做 pad = eos. 这意味着在微调期间,模型永远不会被训练为输出 eos(最有可能),因为 eos 被视为填充令牌并且不会反向传播:

I just observed that when I set tokenizer.pad_token = tokenizer.eos_token during training, the model won't stop generating during inference, since it was trained to not output the eos token (per discussions above).
Run Code Online (Sandbox Code Playgroud)

我看到了这个(这里https://github.com/huggingface/transformers/issues/22794):

tokenizer.add_special_tokens({'pad_token': '[PAD]'})
Run Code Online (Sandbox Code Playgroud)

但这假设模型有 pad_token。我认为必须进行额外的检查,确保它确实具有 pad_token 的嵌入,以便不存在运行时错误(〜从嵌入“表”/矩阵提取矩阵中的类型错误)。

但如果这样做,可能需要注意初始化新令牌,以便它主导生成: https: //nlp.stanford.edu/~johnhew/vocab-expansion.html


代码:

tokenizer.pad_token = tokenizer.eos_token
Run Code Online (Sandbox Code Playgroud)

修改模型会出现问题

该死的,这仍然不起作用:

 UserWarning: You …
Run Code Online (Sandbox Code Playgroud)

machine-learning pytorch huggingface-transformers huggingface-tokenizers huggingface

7
推荐指数
1
解决办法
4274
查看次数

Huggingface BERT Tokenizer 添加新令牌

我正在使用 Huggingface BERT 来执行 NLP 任务。我的文本包含被分成子词的公司名称。

tokenizer = BertTokenizerFast.from_pretrained('bert-base-uncased')
tokenizer.encode_plus("Somespecialcompany")
output: {'input_ids': [101, 2070, 13102, 8586, 4818, 9006, 9739, 2100, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1]}
Run Code Online (Sandbox Code Playgroud)

现在,我想将这些名称添加到标记器 ID 中,这样它们就不会被分割。

tokenizer.add_tokens("Somespecialcompany")
output: 1
Run Code Online (Sandbox Code Playgroud)

这将分词器的长度从 30522 扩展到 30523。

因此,所需的输出将是新的 ID:

tokenizer.encode_plus("Somespecialcompany")
output: 30522
Run Code Online (Sandbox Code Playgroud)

但输出与之前相同:

output: {'input_ids': [101, 2070, 13102, 8586, 4818, 9006, 9739, 2100, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, …
Run Code Online (Sandbox Code Playgroud)

bert-language-model huggingface-transformers huggingface-tokenizers

6
推荐指数
1
解决办法
9102
查看次数

如何取消 BERT 代币的代币化?

我有一个句子,我需要返回特定单词左右两侧 N 个 BERT 标记对应的文本。

from transformers import BertTokenizer
tz = BertTokenizer.from_pretrained("bert-base-cased")
sentence = "The Natural Science Museum of Madrid shows the RECONSTRUCTION of a dinosaur"

tokens = tz.tokenize(sentence)
print(tokens)

>>['The', 'Natural', 'Science', 'Museum', 'of', 'Madrid', 'shows', 'the', 'R', '##EC', '##ON', '##ST', '##R', '##UC', '##TI', '##ON', 'of', 'a', 'dinosaur']
Run Code Online (Sandbox Code Playgroud)

我想要的是获取与令牌马德里左侧和右侧的4个令牌相对应的文本。所以我想要标记: ['Natural', 'Science', 'Museum', 'of', 'Madrid', 'shows', 'the', 'R', '##EC'] 然后将它们转换为原文。在本例中,它将是“马德里自然科学博物馆展示 REC”。

有没有办法做到这一点?

python tokenize bert-language-model huggingface-transformers huggingface-tokenizers

6
推荐指数
2
解决办法
8329
查看次数

变压器的 max_seq_length (Sentence-BERT)

我按以下方式使用 Huggingface 的句子 BERT:

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
model.max_seq_length = 512
model.encode(text)
Run Code Online (Sandbox Code Playgroud)

text很长且包含超过 512 个标记时,不会抛出异常。我假设它会自动将输入截断为 512 个标记。

当输入长度大于时如何使其抛出异常max_seq_length

此外, 的最大可能是max_seq_length多少all-MiniLM-L6-v2

nlp bert-language-model huggingface-transformers huggingface-tokenizers sentence-transformers

6
推荐指数
1
解决办法
6666
查看次数

加载检查点分片花费的时间太长

我对生成式人工智能非常陌生。我有 64GB RAM 和 20GB GPU。我使用了 Huggingface 的一些开源模型,并使用 Python 简单地用开箱即用的模型提示并显示结果。我使用将模型下载到本地save_pretrained,然后尝试从本地加载模型。有用。但每次运行 python 文件都需要 10 多分钟才能显示结果。

有一个步骤Loading checkpoint shards每次需要6-7分钟。我做错了什么吗?为什么它每次都必须加载一些东西,即使模型是从本地引用的。

我尝试使用local_files_only=True, cache_dir=cache_dir, low_cpu_mem_usage=True, max_shard_size="200MB",没有解决时间问题。

如何在用户可用的情况下直接提示已保存的模型而不需要太多延迟。任何帮助将不胜感激

h2o huggingface-transformers huggingface-tokenizers huggingface llama

6
推荐指数
1
解决办法
6231
查看次数