Argument `never_split` not working on `AutoTokenizer`
Author: udeepam
Pull request: no

## Environment info
<!-- You can run the command `transformers-cli env` and copy-and-paste its output below.
     Don't forget to fill out the missing fields in that output! -->

- `transformers` version: 4.6.1
- Platform: Linux-4.19.0-14-cloud-amd64-x86_64-with-debian-10.7
- Python version: 3.7.9
- PyTorch version (GPU?): 1.8.1+cu102 (True)
- Tensorflow version (GPU?): 2.5.0 (False)
- Using GPU in script?: No
- Using distributed or parallel set-up in script?: No

### Who can help

- tokenizers: @LysandreJik

<!-- Your issue will be replied to more quickly if you can figure out the right person to tag with @
 If you know how to use git blame, that is the easiest way, otherwise, here is a rough guide of **who to tag**.
 Please tag fewer than 3 people.

Models:

- albert, bert, xlm: @LysandreJik
- blenderbot, bart, marian, pegasus, encoderdecoder,  t5: @patrickvonplaten, @patil-suraj
- longformer, reformer, transfoxl, xlnet: @patrickvonplaten
- fsmt: @stas00
- funnel: @sgugger
- gpt2: @patrickvonplaten, @LysandreJik
- rag: @patrickvonplaten, @lhoestq
- tensorflow: @Rocketknight1

Library:

- benchmarks: @patrickvonplaten
- deepspeed: @stas00
- ray/raytune: @richardliaw, @amogkam
- text generation: @patrickvonplaten
- tokenizers: @LysandreJik
- trainer: @sgugger
- pipelines: @LysandreJik

Documentation: @sgugger

Model hub:

- for issues with a model report at https://discuss.huggingface.co/ and tag the model's creator.

HF projects:

- datasets: [different repo](https://github.com/huggingface/datasets)
- rust tokenizers: [different repo](https://github.com/huggingface/tokenizers)

Examples:

- maintained examples (not research project or legacy): @sgugger, @patil-suraj
- research_projects/bert-loses-patience: @JetRunner
- research_projects/distillation: @VictorSanh

 -->

## Information

Model I am using (Bert, XLNet ...): BERT

The problem arises when using:
* [ ] the official example scripts: (give details below)
* [x] my own modified scripts: (give details below)

The tasks I am working on is:
* [ ] an official GLUE/SQUaD task: (give the name)
* [x] my own task or dataset: (give details below)

## To reproduce

Steps to reproduce the behavior:

```python
from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained('bert-large-uncased', never_split={'lol'})
tokenizer.tokenize("lol That's funny")
"""
['lo', '##l', 'that', "'", 's', 'funny']
"""
```

<!-- If you have code snippets, error messages, stack traces please provide them here as well.
     Important! Use code tags to correctly format your code. See https://help.github.com/en/github/writing-on-github/creating-and-highlighting-code-blocks#syntax-highlighting
     Do not use screenshots, as they are hard to read and (more importantly) don't allow others to copy-and-paste your code.-->

## Expected behavior

The expected output should be
```python
['lol', 'that', "'", 's', 'funny']
```

I know by using the `BertTokenizer` the `never_split` argument works e.g.
```python
from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained('bert-large-uncased', never_split={'lol'})
tokenizer.tokenize("lol That's funny")
"""
['lol', 'that', "'", 's', 'funny']
"""
```
But I want to use the `AutoTokenizer` for another model,  `nghuyong/ernie-2.0-en`, and it doesn't work there either.


<!-- A clear and concise description of what you would expect to happen. -->


Comments:
Ah, I believe the fast tokenizers do not have the `never_split` option. In order to achieve this I would add the tokens to the vocabulary instead cc @n1t0 is there another way to handle this?

```py
>>> tokenizer.tokenize("lol that's funny")
['lo', '##l', 'that', "'", 's', 'funny']
>>> tokenizer.add_tokens(["lol"])
1
>>> tokenizer.tokenize("lol that's funny")
['lol', 'that', "'", 's', 'funny']
```

Thanks! The suggestion works for the token `lol`. However another token that I do not want to be split is `...` and the suggestion does not work for this as shown below.
```python
>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained('bert-large-uncased')
>>> tokenizer.tokenize("... that's funny")
['.', '.', '.', 'that', "'", 's', 'funny']
>>> tokenizer.add_tokens(["..."])
0
>>> tokenizer.tokenize("... that's funny")
['.', '.', '.', 'that', 
```

However, again it does work using the `BertTokenizer` and the `never_split` argument e.g.
```python
>>> from transformers import BertTokenizer
>>> tokenizer = BertTokenizer.from_pretrained('bert-large-uncased', never_split={'...'})
>>> tokenizer.tokenize("... That's funny")
['...', 'that', "'", 's', 'funny']
```

Is there another workaround?

Hi @udeepam, I'm not sure to understand the goal of doing this.

```python
>>> tokenizer = AutoTokenizer.from_pretrained('bert-large-uncased', use_fast=False, never_split={'lol'})
>>> tokenizer.tokenize("lol That's funny")
['lol', 'that', "'", 's', 'funny']
>>> tokens = tokenizer.encode("lol That's funny")
>>> tokens
[101, 100, 2008, 1005, 1055, 6057, 102]
>>> tokenizer.convert_ids_to_tokens(tokens)
['[CLS]', '[UNK]', 'that', "'", 's', 'funny', '[SEP]']
```

As you can see, the tokenizer doesn't split the `lol` token, but it doesn't know it. So it ends up being an `[UNK]` token. If it knew it, it wouldn't have split it in the first place. Is it the behavior you expect to get?

Unfortunately, I don't see any other workaround than what @LysandreJik proposed in the first place.

This issue has been automatically marked as stale because it has not had recent activity. If you think this still needs to be addressed please comment on this thread.

Please note that issues that do not follow the [contributing guidelines](https://github.com/huggingface/transformers/blob/master/CONTRIBUTING.md) are likely to be ignored.