charllama-35M / README.md
inkoziev's picture
Update README.md
fdba4cf
---
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)
### Токенизатор
Для использования модели нужно установить [специальный токенизатор](https://github.com/Koziev/character-tokenizer):
```
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.