Современные модели и конвейеры обработки естественного языка, основанные на Rust. Порт библиотеки Transformers Hugging Face с использованием привязок tch-rs или onnxruntime и предварительной обработки из токенизаторов ржавчины. Поддерживает многопоточную токенизацию и вывод графического процессора. В этом репозитории представлена базовая архитектура модели, главы для конкретных задач (см. ниже) и готовые к использованию конвейеры. Тесты доступны в конце этого документа.
Начните выполнять задачи, включая ответы на вопросы, распознавание именованных объектов, перевод, обобщение, генерацию текста, диалоговые агенты и многое другое, всего с помощью нескольких строк кода:
let qa_model = QuestionAnsweringModel :: new ( Default :: default ( ) ) ? ;
let question = String :: from ( "Where does Amy live ?" ) ;
let context = String :: from ( "Amy lives in Amsterdam" ) ;
let answers = qa_model . predict ( & [ QaInput { question , context } ] , 1 , 32 ) ;
Выход:
[Answer { score: 0.9976, start: 13, end: 21, answer: "Amsterdam" }]
В настоящее время поддерживаются следующие задачи:
Классификация последовательностей | Классификация токенов | Ответ на вопрос | Генерация текста | Подведение итогов | Перевод | Маскированный ЛМ | Встраивание предложений | |
---|---|---|---|---|---|---|---|---|
ДистилБЕРТ | ✅ | ✅ | ✅ | ✅ | ✅ | |||
МобильныйBERT | ✅ | ✅ | ✅ | ✅ | ||||
ДеБЕРТа | ✅ | ✅ | ✅ | ✅ | ||||
ДеБЕРТа (v2) | ✅ | ✅ | ✅ | ✅ | ||||
ФНет | ✅ | ✅ | ✅ | ✅ | ||||
БЕРТ | ✅ | ✅ | ✅ | ✅ | ✅ | |||
РОБЕРТа | ✅ | ✅ | ✅ | ✅ | ✅ | |||
GPT | ✅ | |||||||
GPT2 | ✅ | |||||||
GPT-Нео | ✅ | |||||||
ГПТ-J | ✅ | |||||||
БАРТ | ✅ | ✅ | ✅ | |||||
Мариан | ✅ | |||||||
МБарт | ✅ | ✅ | ||||||
М2М100 | ✅ | |||||||
НЛЛБ | ✅ | |||||||
Электра | ✅ | ✅ | ||||||
АЛЬБЕРТ | ✅ | ✅ | ✅ | ✅ | ✅ | |||
Т5 | ✅ | ✅ | ✅ | ✅ | ||||
ЛонгТ5 | ✅ | ✅ | ||||||
XLNet | ✅ | ✅ | ✅ | ✅ | ✅ | |||
Реформатор | ✅ | ✅ | ✅ | ✅ | ||||
ПрофетНет | ✅ | ✅ | ||||||
Лонгформер | ✅ | ✅ | ✅ | ✅ | ||||
Пегас | ✅ |
Эта библиотека использует крейт tch для привязки к API C++ Libtorch. Необходимая библиотека libtorch может быть загружена автоматически или вручную. Ниже приведены сведения о том, как настроить среду для использования этих привязок. Подробную информацию или поддержку можно найти в TCH.
Кроме того, эта библиотека использует папку кэша для загрузки предварительно обученных моделей. По умолчанию это местоположение кэша ~/.cache/.rustbert
, но его можно изменить, установив переменную среды RUSTBERT_CACHE
. Обратите внимание, что языковые модели, используемые этой библиотекой, имеют порядок сотен МБ в ГБ.
libtorch
с https://pytorch.org/get-started/locally/. Для этого пакета требуется v2.4
: если эта версия больше не доступна на странице «Начало работы», файл должен быть доступен путем изменения целевой ссылки, например https://download.pytorch.org/libtorch/cu124/libtorch-cxx11-abi-shared-with-deps-2.4.0%2Bcu124.zip
для версии Linux с CUDA12. ПРИМЕЧАНИЕ. При использовании rust-bert
в качестве зависимости от crates.io проверьте требуемый LIBTORCH
в опубликованном файле readme пакета, поскольку он может отличаться от версии, описанной здесь (применимо к текущей версии репозитория). export LIBTORCH=/path/to/libtorch
export LD_LIBRARY_PATH= ${LIBTORCH} /lib: $LD_LIBRARY_PATH
$ Env: LIBTORCH = " X:pathtolibtorch "
$ Env: Path += " ;X:pathtolibtorchlib "
brew install pytorch jq
export LIBTORCH= $( brew --cellar pytorch ) / $( brew info --json pytorch | jq -r ' .[0].installed[0].version ' )
export LD_LIBRARY_PATH= ${LIBTORCH} /lib: $LD_LIBRARY_PATH
Альтернативно, вы можете позволить сценарию build
автоматически загружать библиотеку libtorch
. Флаг функции download-libtorch
должен быть включен. Версия libtorch для процессора будет загружена по умолчанию. Чтобы загрузить версию CUDA, установите для переменной среды TORCH_CUDA_VERSION
значение cu124
. Обратите внимание, что библиотека libtorch имеет большой размер (порядка нескольких ГБ для версии с поддержкой CUDA), поэтому выполнение первой сборки может занять несколько минут.
Проверьте свою установку (и связь с libtorch), добавив зависимость rust-bert
в ваш Cargo.toml
или клонировав исходный код ржавчины-берта и запустив пример:
git clone [email protected]:guillaume-be/rust-bert.git
cd rust-bert
cargo run --example sentence_embeddings
Поддержку ONNX можно включить с помощью дополнительной функции onnx
. Затем этот крейт использует крейт ort с привязками к библиотеке C++ onnxruntime. Мы отсылаем пользователя к этому проекту страницы для получения дальнейших инструкций по установке/поддержки.
onnx
. Крейтrust rust-bert
не включает никаких дополнительных зависимостей для ort
, конечный пользователь должен выбрать набор функций, достаточных для использования необходимой библиотеки onnxruntime
C++.load-dynamic
груза для ort
.ORT_DYLIB_PATH
так, чтобы он указывал на расположение загруженной библиотеки onnxruntime ( onnxruntime.dll
/ libonnxruntime.so
/ libonnxruntime.dylib
в зависимости от операционной системы). Их можно загрузить со страницы выпуска проекта onnxruntime.Поддерживается большинство архитектур (включая кодеры, декодеры и кодеры-декодеры). Цель библиотеки — сохранить совместимость с моделями, экспортированными с использованием библиотеки Optimum. Подробное руководство по экспорту модели Transformer в ONNX с помощью Optimum доступно по адресу https://huggingface.co/docs/optimum/main/en/exporters/onnx/usage_guides/export_a_model. Ресурсы, используемые для создания моделей ONNX, аналогичны те, которые основаны на Pytorch, заменяя Pytorch моделью ONNX. Поскольку модели ONNX менее гибки, чем их аналоги Pytorch, в обработке необязательных аргументов, экспорт модели декодера или модели кодировщика-декодера в ONNX обычно приводит к созданию нескольких файлов. Ожидается, что эти файлы (но не все необходимые) будут использоваться в этой библиотеке согласно таблице ниже:
Архитектура | Файл кодировщика | Декодер без прошлого файла | Декодер с прошлым файлом |
---|---|---|---|
Кодировщик (например, BERT) | необходимый | не используется | не используется |
Декодер (например, GPT2) | не используется | необходимый | необязательный |
Кодер-декодер (например, BART) | необходимый | необходимый | необязательный |
Обратите внимание, что эффективность вычислений снизится, если decoder with past
файлом является необязательным, но не предусмотрен, поскольку модель не будет использовать кэшированные прошлые ключи и значения для механизма внимания, что приводит к большому количеству избыточных вычислений. Библиотека Optimum предлагает параметры экспорта, позволяющие создать такой decoder with past
модели. Архитектура базовой модели кодера и декодера доступна (и для удобства представлена) в модулях encoder
и decoder
соответственно.
Модели поколений (чистые архитектуры декодера или кодера/декодера) доступны в модуле models
. Конвейеры ost доступны для контрольных точек модели ONNX, включая классификацию последовательностей, нулевую классификацию, классификацию токенов (включая распознавание именованных объектов и маркировку частей речи), ответы на вопросы, генерацию текста, обобщение и перевод. Эти модели используют те же файлы конфигурации и токенизатора, что и их аналоги Pytorch, при использовании в конвейере. Примеры использования моделей ONNX приведены в каталоге ./examples
В составе этого набора доступны готовые к использованию сквозные конвейеры НЛП, основанные на конвейерах Hugging Face. На данный момент доступны следующие возможности:
Отказ от ответственности Участники этого репозитория не несут ответственности за любые последствия использования сторонними организациями предварительно обученных систем, предложенных здесь.
Извлечение ответа на вопрос из заданного вопроса и контекста. Модель DistilBERT, настроенная на SQuAD (Стэнфордский набор данных для ответов на вопросы)
let qa_model = QuestionAnsweringModel :: new ( Default :: default ( ) ) ? ;
let question = String :: from ( "Where does Amy live ?" ) ;
let context = String :: from ( "Amy lives in Amsterdam" ) ;
let answers = qa_model . predict ( & [ QaInput { question , context } ] , 1 , 32 ) ;
Выход:
[Answer { score: 0.9976, start: 13, end: 21, answer: "Amsterdam" }]
Конвейер перевода поддерживает широкий спектр исходных и целевых языков. Использует две основные архитектуры для задач перевода:
Предварительно обученные модели на основе Мариан для следующих языковых пар легко доступны в библиотеке, но пользователь может импортировать любую модель на основе Pytorch для прогнозирования.
Для языков, не поддерживаемых предлагаемыми предварительно обученными моделями Мариан, пользователь может использовать модель M2M100, поддерживающую прямой перевод между 100 языками (без промежуточного перевода на английский). Полный список поддерживаемых языков доступен в документации крейта.
use rust_bert :: pipelines :: translation :: { Language , TranslationModelBuilder } ;
fn main ( ) -> anyhow :: Result < ( ) > {
let model = TranslationModelBuilder :: new ( )
. with_source_languages ( vec ! [ Language :: English ] )
. with_target_languages ( vec ! [ Language :: Spanish , Language :: French , Language :: Italian ] )
. create_model ( ) ? ;
let input_text = "This is a sentence to be translated" ;
let output = model . translate ( & [ input_text ] , None , Language :: French ) ? ;
for sentence in output {
println ! ( "{}" , sentence ) ;
}
Ok ( ( ) )
}
Выход:
Il s'agit d'une phrase à traduire
Абстрактное обобщение с использованием предварительно обученной модели BART.
let summarization_model = SummarizationModel :: new ( Default :: default ( ) ) ? ;
let input = [ "In findings published Tuesday in Cornell University's arXiv by a team of scientists
from the University of Montreal and a separate report published Wednesday in Nature Astronomy by a team
from University College London (UCL), the presence of water vapour was confirmed in the atmosphere of K2-18b,
a planet circling a star in the constellation Leo. This is the first such discovery in a planet in its star's
habitable zone — not too hot and not too cold for liquid water to exist. The Montreal team, led by Björn Benneke,
used data from the NASA's Hubble telescope to assess changes in the light coming from K2-18b's star as the planet
passed between it and Earth. They found that certain wavelengths of light, which are usually absorbed by water,
weakened when the planet was in the way, indicating not only does K2-18b have an atmosphere, but the atmosphere
contains water in vapour form. The team from UCL then analyzed the Montreal team's data using their own software
and confirmed their conclusion. This was not the first time scientists have found signs of water on an exoplanet,
but previous discoveries were made on planets with high temperatures or other pronounced differences from Earth.
" This is the first potentially habitable planet where the temperature is right and where we now know there is water, "
said UCL astronomer Angelos Tsiaras. " It's the best candidate for habitability right now. " " It's a good sign " ,
said Ryan Cloutier of the Harvard–Smithsonian Center for Astrophysics, who was not one of either study's authors.
" Overall, " he continued, " the presence of water in its atmosphere certainly improves the prospect of K2-18b being
a potentially habitable planet, but further observations will be required to say for sure. "
K2-18b was first identified in 2015 by the Kepler space telescope. It is about 110 light-years from Earth and larger
but less dense. Its star, a red dwarf, is cooler than the Sun, but the planet's orbit is much closer, such that a year
on K2-18b lasts 33 Earth days. According to The Guardian, astronomers were optimistic that NASA's James Webb space
telescope — scheduled for launch in 2021 — and the European Space Agency's 2028 ARIEL program, could reveal more
about exoplanets like K2-18b." ] ;
let output = summarization_model . summarize ( & input ) ;
(пример из: WikiNews)
Выход:
"Scientists have found water vapour on K2-18b, a planet 110 light-years from Earth.
This is the first such discovery in a planet in its star's habitable zone.
The planet is not too hot and not too cold for liquid water to exist."
Модель разговора на основе DialoGPT от Microsoft. Этот конвейер позволяет генерировать одно- или многоходовые разговоры между человеком и моделью. На странице DialoGPT указано, что
Результаты оценки человека показывают, что ответ, генерируемый DialoGPT, сопоставим с качеством ответа человека при тесте Тьюринга с одним поворотом разговора. (репозиторий DialoGPT)
Модель использует ConversationManager
для отслеживания активных разговоров и генерации ответов на них.
use rust_bert :: pipelines :: conversation :: { ConversationModel , ConversationManager } ;
let conversation_model = ConversationModel :: new ( Default :: default ( ) ) ;
let mut conversation_manager = ConversationManager :: new ( ) ;
let conversation_id = conversation_manager . create ( "Going to the movies tonight - any suggestions?" ) ;
let output = conversation_model . generate_responses ( & mut conversation_manager ) ;
Пример вывода:
"The Big Lebowski."
Генерация языка на основе подсказки. GPT2 и GPT доступны в качестве базовых моделей. Включите такие методы, как поиск луча, выборку top-k и ядра, настройку температуры и штраф за повторение. Поддерживает пакетную генерацию предложений из нескольких подсказок. Последовательности будут дополнены слева токеном заполнения модели, если он присутствует, и неизвестным токеном в противном случае. Это может повлиять на результаты. Для достижения наилучших результатов рекомендуется отправлять запросы одинаковой длины.
let model = GPT2Generator :: new ( Default :: default ( ) ) ? ;
let input_context_1 = "The dog" ;
let input_context_2 = "The cat was" ;
let generate_options = GenerateOptions {
max_length : 30 ,
.. Default :: default ( )
} ;
let output = model . generate ( Some ( & [ input_context_1 , input_context_2 ] ) , generate_options ) ;
Пример вывода:
[
"The dog's owners, however, did not want to be named. According to the lawsuit, the animal's owner, a 29-year"
"The dog has always been part of the family. "He was always going to be my dog and he was always looking out for me"
"The dog has been able to stay in the home for more than three months now. "It's a very good dog. She's"
"The cat was discovered earlier this month in the home of a relative of the deceased. The cat's owner, who wished to remain anonymous,"
"The cat was pulled from the street by two-year-old Jazmine."I didn't know what to do," she said"
"The cat was attacked by two stray dogs and was taken to a hospital. Two other cats were also injured in the attack and are being treated."
]
Выполняет нулевую классификацию входных предложений с предоставленными метками, используя модель, настроенную для вывода на естественном языке.
let sequence_classification_model = ZeroShotClassificationModel :: new ( Default :: default ( ) ) ? ;
let input_sentence = "Who are you voting for in 2020?" ;
let input_sequence_2 = "The prime minister has announced a stimulus package which was widely criticized by the opposition." ;
let candidate_labels = & [ "politics" , "public health" , "economics" , "sports" ] ;
let output = sequence_classification_model . predict_multilabel (
& [ input_sentence , input_sequence_2 ] ,
candidate_labels ,
None ,
128 ,
) ;
Выход:
[
[ Label { "politics", score: 0.972 }, Label { "public health", score: 0.032 }, Label {"economics", score: 0.006 }, Label {"sports", score: 0.004 } ],
[ Label { "politics", score: 0.975 }, Label { "public health", score: 0.0818 }, Label {"economics", score: 0.852 }, Label {"sports", score: 0.001 } ],
]
Прогнозирует бинарную тональность предложения. Модель DistilBERT доработана на SST-2.
let sentiment_classifier = SentimentModel :: new ( Default :: default ( ) ) ? ;
let input = [
"Probably my all-time favorite movie, a story of selflessness, sacrifice and dedication to a noble cause, but it's not preachy or boring." ,
"This film tried to be too many things all at once: stinging political satire, Hollywood blockbuster, sappy romantic comedy, family values promo..." ,
"If you like original gut wrenching laughter you will like this movie. If you are young or old then you will love this movie, hell even my mom liked it." ,
] ;
let output = sentiment_classifier . predict ( & input ) ;
(Пример предоставлен IMDb)
Выход:
[
Sentiment { polarity: Positive, score: 0.9981985493795946 },
Sentiment { polarity: Negative, score: 0.9927982091903687 },
Sentiment { polarity: Positive, score: 0.9997248985164333 }
]
Извлекает объекты (Человек, Местоположение, Организация, Разное) из текста. Крупная модель в корпусе BERT, настроенная на CoNNL03, предоставленная командой цифровой библиотеки MDZ Баварской государственной библиотеки. В настоящее время доступны модели для английского, немецкого, испанского и голландского языков.
let ner_model = NERModel :: new ( default :: default ( ) ) ? ;
let input = [
"My name is Amy. I live in Paris." ,
"Paris is a city in France."
] ;
let output = ner_model . predict ( & input ) ;
Выход:
[
[
Entity { word: "Amy", score: 0.9986, label: "I-PER" }
Entity { word: "Paris", score: 0.9985, label: "I-LOC" }
],
[
Entity { word: "Paris", score: 0.9988, label: "I-LOC" }
Entity { word: "France", score: 0.9993, label: "I-LOC" }
]
]
Извлечение ключевых слов и ключевых фраз из входных документов
fn main ( ) -> anyhow :: Result < ( ) > {
let keyword_extraction_model = KeywordExtractionModel :: new ( Default :: default ( ) ) ? ;
let input = "Rust is a multi-paradigm, general-purpose programming language.
Rust emphasizes performance, type safety, and concurrency. Rust enforces memory safety—that is,
that all references point to valid memory—without requiring the use of a garbage collector or
reference counting present in other memory-safe languages. To simultaneously enforce
memory safety and prevent concurrent data races, Rust's borrow checker tracks the object lifetime
and variable scope of all references in a program during compilation. Rust is popular for
systems programming but also offers high-level features including functional programming constructs." ;
let output = keyword_extraction_model . predict ( & [ input ] ) ? ;
}
Выход:
"rust" - 0.50910604
"programming" - 0.35731024
"concurrency" - 0.33825397
"concurrent" - 0.31229728
"program" - 0.29115444
Извлекает теги части речи (существительное, глагол, прилагательное...) из текста.
let pos_model = POSModel :: new ( default :: default ( ) ) ? ;
let input = [ "My name is Bob" ] ;
let output = pos_model . predict ( & input ) ;
Выход:
[
Entity { word: "My", score: 0.1560, label: "PRP" }
Entity { word: "name", score: 0.6565, label: "NN" }
Entity { word: "is", score: 0.3697, label: "VBZ" }
Entity { word: "Bob", score: 0.7460, label: "NNP" }
]
Генерация вложений предложений (векторное представление). Их можно использовать для приложений, включая плотный поиск информации.
let model = SentenceEmbeddingsBuilder :: remote (
SentenceEmbeddingsModelType :: AllMiniLmL12V2
) . create_model ( ) ? ;
let sentences = [
"this is an example sentence" ,
"each sentence is converted"
] ;
let output = model . encode ( & sentences ) ? ;
Выход:
[
[-0.000202666, 0.08148022, 0.03136178, 0.002920636 ...],
[0.064757116, 0.048519745, -0.01786038, -0.0479775 ...]
]
Предскажите замаскированные слова во входных предложениях.
let model = MaskedLanguageModel :: new ( Default :: default ( ) ) ? ;
let sentences = [
"Hello I am a <mask> student" ,
"Paris is the <mask> of France. It is <mask> in Europe." ,
] ;
let output = model . predict ( & sentences ) ;
Выход:
[
[MaskedToken { text: "college", id: 2267, score: 8.091}],
[
MaskedToken { text: "capital", id: 3007, score: 16.7249},
MaskedToken { text: "located", id: 2284, score: 9.0452}
]
]
Ожидается, что для простых конвейеров (классификация последовательностей, классификация токенов, ответы на вопросы) производительность Python и Rust будет сопоставима. Это связано с тем, что самой дорогой частью этого конвейера является сама языковая модель, имеющая общую реализацию в бэкэнде Torch. Сквозные конвейеры NLP в Rust предоставляют раздел тестов, охватывающий все конвейеры.
Для задач генерации текста (обобщение, перевод, беседа, генерация произвольного текста) можно ожидать значительных преимуществ (ускорение обработки до 2–4 раз в зависимости от ввода и приложения). Статья «Ускорение генерации текста с помощью Rust» посвящена этим приложениям для генерации текста и содержит более подробную информацию о сравнении производительности с Python.
Базовая модель и головки для конкретных задач также доступны для пользователей, желающих представить свои собственные модели на основе трансформатора. Примеры подготовки даты с использованием встроенной библиотеки токенизаторов Rust доступны в ./examples
для BERT, DistilBERT, RoBERTa, GPT, GPT2 и BART. Обратите внимание, что при импорте моделей из Pytorch соглашение об именовании параметров должно быть согласовано со схемой Rust. Загрузка предварительно обученных весов не удастся, если какой-либо из весов параметров модели не будет найден в файлах весов. Если эту проверку качества нужно пропустить, из хранилища переменных можно вызвать альтернативный метод load_partial
.
Предварительно обученные модели доступны в концентраторе моделей Hugging Face и могут быть загружены с помощью RemoteResources
определенных в этой библиотеке.
Сценарий утилиты преобразования включен в ./utils
для преобразования весов Pytorch в набор весов, совместимый с этой библиотекой. Этот скрипт требует настройки Python и torch
.