|
|
--- |
|
|
language: |
|
|
- ko |
|
|
tags: |
|
|
- roberta |
|
|
- tokenizer only |
|
|
license: |
|
|
- mit |
|
|
--- |
|
|
|
|
|
## 라이브러리 버전 |
|
|
|
|
|
- transformers: 4.21.1 |
|
|
- datasets: 2.4.0 |
|
|
- tokenizers: 0.12.1 |
|
|
|
|
|
## 훈련 코드 |
|
|
|
|
|
```python |
|
|
from datasets import load_dataset |
|
|
from tokenizers import ByteLevelBPETokenizer |
|
|
|
|
|
tokenizer = ByteLevelBPETokenizer(unicode_normalizer="nfkc", trim_offsets=True) |
|
|
ds = load_dataset("Bingsu/my-korean-training-corpus", use_auth_token=True) |
|
|
# 공개된 데이터를 사용할 경우 |
|
|
# ds = load_dataset("cc100", lang="ko") # 50GB |
|
|
|
|
|
|
|
|
# 이 데이터는 35GB이고, 데이터가 너무 많으면 컴퓨터가 터져서 일부만 사용했습니다. |
|
|
ds_sample = ds["train"].train_test_split(0.35, seed=20220819)["test"] |
|
|
|
|
|
|
|
|
def gen_text(batch_size: int = 5000): |
|
|
for i in range(0, len(ds_sample), batch_size): |
|
|
yield ds_sample[i : i + batch_size]["text"] |
|
|
|
|
|
|
|
|
tokenizer.train_from_iterator( |
|
|
gen_text(), |
|
|
vocab_size=50265, # roberta-base와 같은 크기 |
|
|
min_frequency=2, |
|
|
special_tokens=[ |
|
|
"<s>", |
|
|
"<pad>", |
|
|
"</s>", |
|
|
"<unk>", |
|
|
"<mask>", |
|
|
], |
|
|
) |
|
|
tokenizer.save("my_tokenizer.json") |
|
|
``` |
|
|
|
|
|
약 7시간 소모 (i5-12600 non-k) |
|
|
 |
|
|
|
|
|
|
|
|
이후 토크나이저의 post-processor를 RobertaProcessing으로 교체합니다. |
|
|
|
|
|
```python |
|
|
from tokenizers import Tokenizer |
|
|
from tokenizers.processors import RobertaProcessing |
|
|
|
|
|
tokenizer = Tokenizer.from_file("my_tokenizer.json") |
|
|
tokenizer.post_processor = RobertaProcessing( |
|
|
("</s>", tokenizer.token_to_id("</s>")), |
|
|
("<s>", tokenizer.token_to_id("<s>")), |
|
|
add_prefix_space=False, |
|
|
) |
|
|
|
|
|
tokenizer.save("my_tokenizer2.json") |
|
|
``` |
|
|
`add_prefix_space=False`옵션은 [roberta-base](https://huggingface.co/roberta-base)를 그대로 따라하기 위한 것입니다. |
|
|
|
|
|
그리고 `model_max_length` 설정을 해주었습니다. |
|
|
|
|
|
```python |
|
|
from transformers import RobertaTokenizerFast |
|
|
|
|
|
rt = RobertaTokenizerFast(tokenizer_file="tokenizer.json") |
|
|
rt.save_pretrained("./my_roberta_tokenizer") |
|
|
``` |
|
|
저장된 폴더의 `tokenizer_config.json` 파일에 `"model_max_length": 512,`를 추가. |
|
|
|
|
|
|
|
|
## 사용법 |
|
|
|
|
|
#### 1. |
|
|
|
|
|
```python |
|
|
from transformers import AutoTokenizer |
|
|
|
|
|
tokenizer = AutoTokenizer.from_pretrained("Bingsu/BBPE_tokenizer_test") |
|
|
|
|
|
# tokenizer는 RobertaTokenizerFast 클래스가 됩니다. |
|
|
``` |
|
|
|
|
|
#### 2. |
|
|
|
|
|
`tokenizer.json`파일을 먼저 다운받습니다. |
|
|
|
|
|
```python |
|
|
from transformers import BartTokenizerFast, BertTokenizerFast |
|
|
|
|
|
bart_tokenizer = BartTokenizerFast(tokenizer_file="tokenizer.json") |
|
|
bert_tokenizer = BertTokenizerFast(tokenizer_file="tokenizer.json") |
|
|
``` |
|
|
|
|
|
roberta와 같이 BBPE를 사용한 bart는 물론이고 bert에도 불러올 수 있습니다. |
|
|
다만 이렇게 불러왔을 경우, model_max_len이 지정이 되어있지 않으니 지정해야 합니다. |
|
|
|