/ Модель

Характеристики

Параметры
124 млн
Лицензия
Apache 2.0
Архитектура
t5 · dense
Опубликована
20 июл 2022

rankgen-t5-base-all

ЭмбеддингиТекст → embedding3 профессии

Англоязычный энкодер RankGen на базе T5 для векторного представления, ранжирования продолжений языковых моделей и литературного поиска.

75скачиваний за 30 дней1лайквеса обновлены8 ноя 2022

Бенчмарки

Как модель справилась с задачами пользователей ailist и что о ней публикуют открытые лидерборды

Тесты пользователейпока нет

Никто ещё не опубликовал тест этой модели. Соберите бенчмарк из своих задач — результат появится здесь.

  1. Добавьте модель в бенчмарк

    Вместе с другими моделями категории «Эмбеддинги» — сравнение идёт внутри одной категории.

  2. Опишите свои задачи

    Напишите запросы, при необходимости приложите файлы и эталонные ответы.

  3. Запустите и опубликуйте

    Модели ответят на каждую задачу, судья оценит ответы. Опубликованный результат появится на этой странице.

Публичные оценки

Из открытых лидербордов. Сравнивайте результаты одного теста при одинаковых условиях — отсутствие оценки не значит, что модель хуже.

В подключённых источниках результатов для этой модели пока нет.

Что умеет модель

Описание составлено по карточке модели и метаданным Hugging Face

kalpeshk2011/rankgen-t5-base-all — англоязычная модель-энкодер из семейства RankGen на архитектуре T5. Она преобразует текстовые префиксы и варианты продолжения, созданные языковой моделью, в векторы общего пространства. В этой версии 123,8 млн параметров; модель распространяется в формате PyTorch по лицензии Apache-2.0.

Модель предназначена для ранжирования нескольких сгенерированных продолжений, оценки текста при поиске по лучу и плотного поиска по литературным текстам. В карточке RankGen заявлено улучшение качества генерации при переранжировании и высокие результаты на литературном поиске. Для корректной токенизации и предварительной обработки README рекомендует обёртку RankGenEncoder.

Модель работает с английским текстом и выдаёт векторные представления для последующего сравнения и ранжирования. Она не является самостоятельной генеративной моделью: для переранжирования ей нужны кандидаты, подготовленные другой языковой моделью. Заявленные результаты относятся к оценкам в карточке RankGen; независимые гарантии качества для этой конкретной версии не приведены.

Сценарии применения

  • переранжирование нескольких вариантов продолжения текста
  • оценка продолжений при поиске по лучу
  • плотный поиск похожих фрагментов в литературных текстах

Ограничения

Для ранжирования генераций требуются варианты текста, созданные отдельной языковой моделью. Карточка не приводит независимых оценок качества именно этого чекпойнта.

Для каких профессий подходит3

Разделы каталога профессий, в задачах которых используется эта модель

Все профессии

Карточка модели

README от автора на Hugging Face, как он его опубликовал

Открыть на Hugging Face

Main repository

https://github.com/martiansideofthemoon/rankgen

What is RankGen?

RankGen is a suite of encoder models (100M-1.2B parameters) which map prefixes and generations from any pretrained English language model to a shared vector space. RankGen can be used to rerank multiple full-length samples from an LM, and it can also be incorporated as a scoring function into beam search to significantly improve generation quality (0.85 vs 0.77 MAUVE, 75% preference according to humans annotators who are English writers). RankGen can also be used like a dense retriever, and achieves state-of-the-art performance on literary retrieval.

Setup

Requirements (pip will install these dependencies for you)

Python 3.7+, torch (CUDA recommended), transformers

Installation

python3.7 -m virtualenv rankgen-venv
source rankgen-venv/bin/activate
pip install rankgen

Get the data here and place folder in root directory. Alternatively, use gdown as shown below,

gdown --folder https://drive.google.com/drive/folders/1DRG2ess7fK3apfB-6KoHb_azMuHbsIv4

Run the test script to make sure the RankGen checkpoint has loaded correctly,

python -m rankgen.test_rankgen_encoder --model_path kalpeshk2011/rankgen-t5-base-all

### Expected output
0.0009239262409127233
0.0011521980725477804

Using RankGen

Loading RankGen is simple using the HuggingFace APIs (see Method-2 below), but we suggest using RankGenEncoder, which is a small wrapper around the HuggingFace APIs for correctly preprocessing data and doing tokenization automatically. You can either download our repository and install the API, or copy the implementation from below.

[SUGGESTED] Method-1: Loading the model with RankGenEncoder

from rankgen import RankGenEncoder, RankGenGenerator

rankgen_encoder = RankGenEncoder("kalpeshk2011/rankgen-t5-base-all")

# Encoding vectors
prefix_vectors = rankgen_encoder.encode(["This is a prefix sentence."], vectors_type="prefix")
suffix_vectors = rankgen_encoder.encode(["This is a suffix sentence."], vectors_type="suffix")

# Generating text
# use a HuggingFace compatible language model
generator = RankGenGenerator(rankgen_encoder=rankgen_encoder, language_model="gpt2-medium")

inputs = ["Whatever might be the nature of the tragedy it would be over with long before this, and those moving black spots away yonder to the west, that he had discerned from the bluff, were undoubtedly the departing raiders. There was nothing left for Keith to do except determine the fate of the unfortunates, and give their bodies decent burial. That any had escaped, or yet lived, was altogether unlikely, unless, perchance, women had been in the party, in which case they would have been borne away prisoners."]

# Baseline nucleus sampling
print(generator.generate_single(inputs, top_p=0.9)[0][0])
# Over-generate and re-rank
print(generator.overgenerate_rerank(inputs, top_p=0.9, num_samples=10)[0][0])
# Beam search
print(generator.beam_search(inputs, top_p=0.9, num_samples=10, beam_size=2)[0][0])

Method-2: Loading the model with HuggingFace APIs

from transformers import T5Tokenizer, AutoModel

tokenizer = T5Tokenizer.from_pretrained(f"google/t5-v1_1-base")
model = AutoModel.from_pretrained("kalpeshk2011/rankgen-t5-base-all", trust_remote_code=True)

RankGenEncoder Implementation

import tqdm
from transformers import T5Tokenizer, T5EncoderModel, AutoModel

class RankGenEncoder():
    def __init__(self, model_path, max_batch_size=32, model_size=None, cache_dir=None):
        assert model_path in ["kalpeshk2011/rankgen-t5-xl-all", "kalpeshk2011/rankgen-t5-xl-pg19", "kalpeshk2011/rankgen-t5-base-all", "kalpeshk2011/rankgen-t5-large-all"]
        self.max_batch_size = max_batch_size
        self.device = 'cuda' if torch.cuda.is_available() else 'cpu'
        if model_size is None:
            if "t5-large" in model_path or "t5_large" in model_path:
                self.model_size = "large"
            elif "t5-xl" in model_path or "t5_xl" in model_path:
                self.model_size = "xl"
            else:
                self.model_size = "base"
        else:
            self.model_size = model_size

        self.tokenizer = T5Tokenizer.from_pretrained(f"google/t5-v1_1-{self.model_size}", cache_dir=cache_dir)
        self.model = AutoModel.from_pretrained(model_path, trust_remote_code=True)
        self.model.to(self.device)
        self.model.eval()

    def encode(self, inputs, vectors_type="prefix", verbose=False, return_input_ids=False):
        tokenizer = self.tokenizer
        max_batch_size = self.max_batch_size
        if isinstance(inputs, str):
            inputs = [inputs]
        if vectors_type == 'prefix':
            inputs = ['pre ' + input for input in inputs]
            max_length = 512
        else:
            inputs = ['suffi ' + input for input in inputs]
            max_length = 128

        all_embeddings = []
        all_input_ids = []
        for i in tqdm.tqdm(range(0, len(inputs), max_batch_size), total=(len(inputs) // max_batch_size) + 1, disable=not verbose, desc=f"Encoding {vectors_type} inputs:"):
            tokenized_inputs = tokenizer(inputs[i:i + max_batch_size], return_tensors="pt", padding=True)
            for k, v in tokenized_inputs.items():
                tokenized_inputs[k] = v[:, :max_length]
            tokenized_inputs = tokenized_inputs.to(self.device)
            with torch.inference_mode():
                batch_embeddings = self.model(**tokenized_inputs)
            all_embeddings.append(batch_embeddings)
            if return_input_ids:
                all_input_ids.extend(tokenized_inputs.input_ids.cpu().tolist())
        return {
            "embeddings": torch.cat(all_embeddings, dim=0),
            "input_ids": all_input_ids
        }

Как запустить

На своей GPU в ailist. Цена — по текущим предложениям провайдеров

GPU в ailist

Универсальный рантайм

Можно запустить

Подбираем GPU…

Класс архитектуры
T5EncoderWithProjection
Ревизия весов
4ffc81f

0 моделей