File size: 4,428 Bytes
38fd129
 
364a3fa
 
 
 
 
 
38fd129
364a3fa
 
 
ac6add8
364a3fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ed1acf0
364a3fa
 
 
 
 
 
 
 
 
 
 
 
3805c0c
365028b
 
 
 
 
 
 
 
3805c0c
 
 
 
 
 
 
 
 
 
 
 
 
 
364a3fa
 
0969053
364a3fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3805c0c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
---
license: openrail
language:
- ru
library_name: transformers
tags:
  - pytorch
  - causal-lm
---

## CharLLaMa-35M

Это крошечная языковая модель, имеющая [архитектуру LLaMa](https://arxiv.org/abs/2302.13971), с **посимвольной** токенизацией для всевозможных экспериментов, когда задача решается плохо из-за BPE токенизации на слова и их части:

1) генеративные спеллчекеры
2) классификация текста: замена ```TfidfVectorizer(analyzer='char')```, т.е. когда хорошо сработал бейзлайн на символьных n-граммах
3) транскрипция текста
4) детекция орфографических ошибок, опечаток

Размер модели - **35 913 600** параметров.

### Особенности предварительной тренировки

Я делал эту модель для экспериментов с русской поэзией в рамках проекта ["Литературная студия"](https://github.com/Koziev/verslibre).
Поэтому корпус претрейна содержал значительное количество текстов поэтического формата.
Это может повлиять на ваши downstream задачи.

Объем корпуса претрейна - около **80B** токенов, тексты только на русском языке.

Кривая обучения: ![pretrain_loss_val](pretrain_loss_val.png)


### Токенизатор

Для использования модели нужно установить специальный токенизатор:

```
pip install git+https://github.com/Koziev/character-tokenizer
```

Кроме символов кириллицы и пунктуации, этот токенизатор знает про специальные токены ```<s>```, ```</s>```, ```<pad>``` и ```<unk>```.

Так как это нестандартный для transformers токенизатор, его надо загружать не через ```transformers.AutoTokenizer.from_pretrained```, а примерно так:

```
import charactertokenizer

...
tokenizer = charactertokenizer.CharacterTokenizer.from_pretrained('inkoziev/charllama-35M')
```

Чтобы посмотреть на токенизацию, можно использовать такой фрагмент кода:

```
prompt = '<s>У Лукоморья дуб зеленый\n'
encoded_prompt = tokenizer.encode(prompt, return_tensors='pt')
print('Tokenized prompt:', ' | '.join(tokenizer.decode([t]) for t in encoded_prompt[0]))
```

Вы увидите список токенов, разделенных символом ```|```:

```
Tokenized prompt: <s> | У |   | Л | у | к | о | м | о | р | ь | я |   | д | у | б |   | з | е | л | е | н | ы | й | 
```

### Использование

С библиотекой transformerts модель можно использовать штатным способом как обычную GPT'шку (точнее, transformers.LlamaModel):

```
import os
import torch
import transformers
import charactertokenizer

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

model_name_or_path = 'inkoziev/charllama-35M'
model = transformers.AutoModelForCausalLM.from_pretrained(model_name_or_path)
model.to(device)
model.eval()

tokenizer = charactertokenizer.CharacterTokenizer.from_pretrained(model_path)

prompt = 'Меня зовут Ар'
encoded_prompt = tokenizer.encode(prompt, return_tensors='pt')

output_sequences = model.generate(
    input_ids=encoded_prompt.to(device),
    max_length=500,
    temperature=1.0,
    top_k=0,
    top_p=0.8,
    repetition_penalty=1.0,
    do_sample=True,
    num_return_sequences=5,
    pad_token_id=0,
)

for o in output_sequences:
    text = tokenizer.decode(o)
    if text.startswith('<s>'):
        text = text.replace('<s>', '')
    text = text[:text.index('</s>')].strip()
    print(text)
    print('-'*80)
```

Также, будут работать все прочие инструменты для GPT моделей, например transformers.AutoModelForSequenceClassification.