ONNX Runtime Web предоставляет мощные инструменты для работы с моделями машинного обучения в браузере и Node.js, требуя от разработчика внимательной подготовки входных данных. Для моделей обработки естественного языка (NLP) ключевым этапом является предобработка текста, включающая токенизацию, padding и формирование attention mask.
Токенизация — процесс разбиения текста на отдельные единицы, которые модель способна интерпретировать. В контексте ONNX Runtime Web чаще всего применяются токенизаторы, совместимые с трансформерами, такими как BERT, GPT или RoBERTa.
tokenizer.json, чтобы обеспечить
идентичность токенов и словаря модели.Пример в JavaScript с использованием библиотеки
@huggingface/tokenizers:
import { Tokenizer } from '@huggingface/tokenizers';
const tokenizer = await Tokenizer.fromFile('tokenizer.json');
const encoded = tokenizer.encode("Пример текста для токенизации");
console.log(encoded.ids); // массив числовых идентификаторов токенов
Ключевой момент: результат токенизации должен быть представлен в виде массива чисел фиксированной длины, пригодной для передачи в ONNX Runtime Web.
Модели трансформеров ожидают входы одинаковой длины. Для текстов
разной длины используется padding — добавление
специальных токенов (обычно [PAD]) до заданной максимальной
длины последовательности.
max_length),
либо длина самой длинной последовательности в батче.[PAD] добавляются либо в конец, либо в начало
последовательности в зависимости от модели. BERT, например, использует
пост-padding.Пример:
const maxLength = 16;
const paddedIds = [...encoded.ids];
while (paddedIds.length < maxLength) {
paddedIds.push(0); // 0 обычно обозначает [PAD]
}
Padding обеспечивает корректную работу модели и предотвращает ошибки при пакетной обработке нескольких текстов.
Attention mask указывает модели, какие токены являются значимыми, а
какие — заполнителями ([PAD]). Это необходимо для
корректного расчета внимания в трансформерах.
1 соответствует реальному токену, а 0 — токену
padding.Пример формирования attention mask:
const attentionMask = paddedIds.map(id => id === 0 ? 0 : 1);
Для батчей формируется двумерный массив размером
[batch_size, sequence_length].
ONNX Runtime Web принимает тензоры в формате
TypedArray. После токенизации, padding и создания attention
mask, данные преобразуются в тензоры типа Int32Array или
Float32Array.
import * as ort from 'onnxruntime-web';
const inputIdsTensor = new ort.Tensor('int32', Int32Array.from(paddedIds), [1, maxLength]);
const attentionMaskTensor = new ort.Tensor('int32', Int32Array.from(attentionMask), [1, maxLength]);
const session = await ort.InferenceSession.create('model.onnx');
const feeds = { input_ids: inputIdsTensor, attention_mask: attentionMaskTensor };
const results = await session.run(feeds);
Важно учитывать, что имена входных тензоров (input_ids,
attention_mask) должны соответствовать именам, ожидаемым
моделью ONNX.
Предобработка текста — критический этап, напрямую влияющий на точность и производительность модели в веб-среде. Правильная токенизация, padding и формирование attention mask обеспечивают корректное функционирование трансформеров на клиентской стороне.