ner-rubert-tiny-news, ONNX int8
Динамически квантованная в int8 сборка
r1char9/ner-rubert-tiny-news
для запуска через
onnxruntime без torch.
Веса не переобучались: это та же модель, только в другом формате. Всё, что
касается качества разметки, относится к исходной модели, а не к сборке.
32 МБ вместо 116 МБ, и запускается там, где нет torch: musl-сборки, свежие
версии Python, окружения без компилятора.
Зачем сделано
Сборка нужна библиотеке
rumask —
обезличиванию персональных данных в русском тексте. Там эта модель работает не
как искатель организаций, а как
щит для имён: слово, которое документ дважды
назвал организацией, снимается с людей во всём тексте разом.
Причина в том, что у названия фирмы нет признака в самом слове. На рабочей
переписке две трети ложных людей оказались компаниями — «Апит», «Технодор»,
BBS2, — и правилами это не лечится. Отдельно ценно, что модель видит
латиницу: имена клиентов вида BBS2 не находит ни один другой голос.
Как пользоваться
1from rumask import Masker
2
3masker = Masker(orgs="on")
Веса скачаются отсюда в кеш пользователя при первом запуске. В закрытом контуре
скачайте файлы руками и назовите каталог: Masker(orgs="/opt/rumask-orgs").
Или напрямую:
1import json
2import numpy as np
3import onnxruntime as ort
4from tokenizers import Tokenizer
5
6session = ort.InferenceSession("model_int8.onnx")
7tokenizer = Tokenizer.from_file("tokenizer.json")
8labels = json.load(open("config.json"))["id2label"]
9
10encoded = tokenizer.encode("Компания Апит поставила оборудование.")
11logits = session.run(None, {
12 "input_ids": np.array([encoded.ids], dtype=np.int64),
13 "attention_mask": np.array([encoded.attention_mask], dtype=np.int64),
14 "token_type_ids": np.zeros((1, len(encoded.ids)), dtype=np.int64),
15})[0]
Что важно знать про квантизацию
Не считайте батчем. Квантизация динамическая, и масштаб активаций берётся
по всему входному тензору: окна в одной пачке получат общий масштаб на всех, и
метки поедут вместе с логитами. Считайте окна по одному — их можно раскладывать
по потокам, выход от числа потоков не зависит побитово.
Служебные токены нужны каждому окну. [CLS] и [SEP] ставятся на каждое
окно отдельно, а не один раз на документ.
Ограничение длины зашито в tokenizer.json. Если режете документ на окна
сами, отключите усечение в токенизаторе — иначе модель молча не увидит текст
дальше первого окна.
Файлы
| файл | что это |
|---|
model_int8.onnx | веса, динамическая квантизация int8 |
tokenizer.json | токенизатор в формате tokenizers |
config.json | метки и параметры модели |
vocab.txt, tokenizer_config.json, special_tokens_map.json | из исходной модели, для совместимости |
Лицензия и авторство
MIT, как и у исходной модели.
- разметка и обучение — r1char9
- основа — cointegrated/rubert-tiny2
- сборка в ONNX int8 — rumask