/ Модель

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

Контекст
9 200 токенов
Параметры
152 млн
Лицензия
CC BY 4.0
Архитектура
gpt_neox · dense
Опубликована
14 фев 2024

pythia-160m-c2s

Генерация текстаТекст → текст3 профессии

Модель Pythia-160m, дообученная методом Cell2Sentence для генерации последовательностей генов и предсказания типов иммунных клеток по данным scRNA-seq.

395скачиваний за 30 дней7лайковвеса обновлены31 окт 2025

Бенчмарки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

vandijklab/pythia-160m-c2s — модель EleutherAI Pythia-160m, дообученная командой Cell2Sentence для работы с данными одноклеточного секвенирования РНК (scRNA-seq). Она использует архитектуру GPT-NeoX и генерирует продолжения последовательностей генов, упорядоченных по уровню экспрессии и представленных как «предложения клеток». Веса содержат около 151,9 млн параметров, контекст — до 9 200 токенов.

Модель обучена на наборе иммунных клеток и предназначена для условной и безусловной генерации клеток, а также предсказания типа клетки. Для условной генерации можно задавать тип клетки в промпте; модель также оценивали по классификации KNN и расстоянию Gromov–Wasserstein. Для генерации полных клеток авторы рекомендуют GPU A100 из-за требований к скорости и памяти. Веса распространяются по лицензии CC BY 4.0.

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

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

Ограничения

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

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

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

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

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

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

Открыть на Hugging Face

Overview

This is the the Pythia-160m model developed by EleutherAI fine-tuned using Cell2Sentence on full scRNA-seq cells. Cell2Sentence is a novel method for adapting large language models to single-cell transcriptomics. We transform single-cell RNA sequencing data into sequences of gene names ordered by expression level, termed "cell sentences". For more details, we refer to the paper linked below. This model was trained on the immune tissue dataset from Domínguez et al. using 8 A100 40GB GPUs for approximately 20 hours on the following tasks:

  1. conditional cell generation
  2. unconditional cell generation
  3. cell type prediction

Cell2Sentence Links:

GitHub: https://github.com/vandijklab/cell2sentence-ft (Note: Codebase has Apache 2.0 license, weights shared on HuggingFace are CC-by-4.0) Paper: https://www.biorxiv.org/content/10.1101/2023.09.11.557287v3

Pythia Links:

GitHub: https://github.com/EleutherAI/pythia
Paper: https://arxiv.org/abs/2304.01373
Hugging Face: https://huggingface.co/EleutherAI/pythia-160m

Evaluation

This model was evaluated on KNN classification and Gromov-Wasserstein (GW) distance. The label for a generated cell is the corresponding cell type used in its corresponding prompt for generation. Ground truth cells were sampled with replacement from a held out test dataset. The generated cells are converted to expression vectors using the method described in the paper. For complete details on the experiments, we refer to the paper.

Modelk=3 NN (↑)k=5 NN (↑)k=10 NN (↑)k=25 NN (↑)GW (↓)
scGEN0.23760.23300.23770.2335315.9505
scVI0.24360.24000.24250.2348302.1285
scDiffusion0.23350.22880.23680.230672.0208
scGPT0.18380.17880.18110.18822989.8066
C2S (Pythia-160m)0.25880.25650.27460.271554.3040

Sample Code

We provide an example of how to use the model to conditionally generate a cell equipped with a post-processing function to remove duplicate and invalid genes. In order to generate full cells, the max_length generation parameter should be changed to 9200. However, we recommend using an A100 GPU for inference speed and memory capacity if full cell generation is required. Unconditional cell generation and cell type prediction prompts are included as well, but we do not include an example cell sentence to format the prompt. We refer to the paper and GitHub repository for instructions on how to transform expression vectors into cell sentences.

import json
import re
from collections import Counter
from typing import List

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM


def post_process_generated_cell_sentences(
    cell_sentence: str, 
    gene_dictionary: List
):
    """
    Post-processing function for generated cell sentences. 
    Invalid genes are removed and ranks of duplicated genes are averaged.

    Arguments:
        cell_sentence:              generated cell sentence string
        gene_dictionary:            list of gene vocabulary (all uppercase)

    Returns:
        post_processed_sentence:    generated cell sentence after post processing steps
    """
    generated_gene_names = cell_sentence.split(" ")
    generated_gene_names = [generated_gene.upper() for generated_gene in generated_gene_names]

    #--- Remove nonsense genes ---#
    generated_gene_names = [gene_name for gene_name in generated_gene_names if gene_name in gene_dictionary]

    #--- Average ranks ---#
    gene_name_to_occurrences = Counter(generated_gene_names)  # get mapping of gene name --> number of occurrences
    post_processed_sentence = generated_gene_names.copy()  # copy of generated gene list

    for gene_name in gene_name_to_occurrences:
        if gene_name_to_occurrences[gene_name] > 1 and gene_name != replace_nonsense_string:
            # Find positions of all occurrences of duplicated generated gene in list
            # Note: using post_processed_sentence here; since duplicates are being removed, list will be
            #   getting shorter. Getting indices in original list will no longer be accurate positions
            occurrence_positions = [idx for idx, elem in enumerate(post_processed_sentence) if elem == gene_name]
            average_position = int(sum(occurrence_positions) / len(occurrence_positions))

            # Remove occurrences
            post_processed_sentence = [elem for elem in post_processed_sentence if elem != gene_name]

            # Reinsert gene_name at average position
            post_processed_sentence.insert(average_position, gene_name)
    
    return post_processed_sentence

genes_path = "pbmc_vocab.json"

with open(vocab_path, "r") as f:
    gene_dictionary = json.load(f)

model_name = "vandijklab/pythia-160m-c2s"

model = AutoModelForCausalLM.from_pretrained(
        model_name,
        torch_dtype=torch.float16, 
        attn_implementation="flash_attention_2"
        ).to(torch.device("cuda"))
tokenizer = AutoTokenizer.from_pretrained(model_name)

cell_type = "T Cell"
ccg = f"Enumerate the genes in a {cell_type} cell with nonzero expression, from highest to lowest."

# Prompts for other forms a generation.
# ucg = "Display a cell's genes by expression level, in descending order."
# cellsentence = "CELL_SENTENCE"
# ctp = "Identify the cell type most likely associated with these highly expressed genes listed in descending order. "
#  + cellsentence +
#  "Name the cell type connected to these genes, ranked from highest to lowest expression."

tokens = tokenizer(ccg, return_tensors='pt')
input_ids = tokens['input_ids'].to(torch.device("cuda"))
attention_mask = tokens['attention_mask'].to(torch.device("cuda"))

with torch.no_grad():
    outputs = model.generate(
        input_ids=input_ids,
        attention_mask=attention_mask,
        do_sample=True,
        max_length=1024,
        top_k=50,
        top_p=0.95,
    )

output_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
cell_sentence = "".join(re.split(r"\?|\.|:", output_text)[1:]).strip()
processed_genes = post_process_generated_cell_sentences(cell_sentence, gene_dictionary)

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

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

GPU в ailist

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

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

Подбираем GPU…

Класс архитектуры
GPTNeoXForCausalLM
Ревизия весов
9a85d18

0 моделей