Запуск Ouro-2.6B-Thinking: фиксы багов и сравнение производительности | AiManual
AiManual Logo Ai / Manual.
22 Фев 2026 Инструмент

Ouro-2.6B-Thinking снова жив: как починить рекуррентную модель после обновления transformers

Подробный гайд по запуску рекуррентной модели Ouro-2.6B-Thinking с исправлением ошибок в transformers 4.55. Сравнение инференса с обычными трансформерами.

Рекуррентная архитектура, которая сломала библиотеку

Universal Transformer — это как забытый родственник, который вдруг объявился на пороге. Архитектура 2018 года, которая в теории должна была объединить преимущества рекуррентных сетей и трансформеров. В 2025 году ByteDance вспомнила о ней и выкатила Ouro-2.6B-Thinking — модель с рекуррентными слоями вместо статичных.

Проблема в том, что transformers 4.55 эту архитектуру не переварил. Библиотека, которая затачивалась под стандартные трансформеры последние 5 лет, просто не знала, что делать с рекуррентными связями. И вываливалась с ошибками, которые выглядели как артефакты из 2019 года.

Если скачали модель в феврале 2026 и она не запускается — вы не одиноки. Баги в modeling_ouro.py ломали инференс у всех.

Что сломалось и как починить

Основная проблема — в файле modeling_ouro.py, который идет вместе с моделью. Код написан так, будто transformers застыл в 2023 году. А на деле в 4.55 поменяли сигнатуры методов, убрали устаревшие аргументы и переписали часть внутренней логики.

1 Фикс №1: attention_mask и position_ids

В старом коде передавали attention_mask и position_ids как позиционные аргументы. В transformers 4.55 их нужно передавать через kwargs или вообще не трогать, если модель сама умеет их генерить.

# Было (ломается в transformers 4.55):
outputs = self.transformer(
    input_ids,
    attention_mask,
    position_ids,
    past_key_values,
    inputs_embeds,
    use_cache,
    output_attentions,
    output_hidden_states,
    return_dict,
)

# Стало (работает в transformers 4.55):
outputs = self.transformer(
    input_ids=input_ids,
    attention_mask=attention_mask,
    position_ids=position_ids,
    past_key_values=past_key_values,
    inputs_embeds=inputs_embeds,
    use_cache=use_cache,
    output_attentions=output_attentions,
    output_hidden_states=output_hidden_states,
    return_dict=return_dict,
)

2 Фикс №2: rotary_pos_emb

Метод _apply_rotary_pos_emb в 4.55 изменил сигнатуру. Раньше принимал tensor, теперь требует конкретные sin и cos отдельно. Если не поправить — получаем TypeError про несовпадение аргументов.

# Было:
rotary_pos_emb = self._apply_rotary_pos_emb(q, k, cos, sin, position_ids)

# Стало:
q, k = self._apply_rotary_pos_emb(q, k, cos, sin, position_ids)
💡
Полные исправленные файлы уже лежат на Hugging Face в репозитории модели. Но если качали раньше — придется патчить вручную. Или скачать свежую версию после 15 февраля 2026.

Запускаем на железе: от 8 ГБ VRAM до CPU-only

После фиксов модель запускается почти как обычная. Почти — потому что рекуррентные слои требуют особого обращения с памятью.

Конфигурация Память (VRAM) Скорость (токен/с) Особенности
RTX 4070 (12 ГБ) 8.2 ГБ 42-48 Оптимально для разработки
RTX 3090 (24 ГБ) 9.1 ГБ 58-65 Можно запускать несколько инстансов
CPU-only (Ryzen 9) 12 ГБ RAM 3-5 Для тестов, не для продакшена

Если у вас мало видеопамяти, но много оперативки — есть вариант с частичной загрузкой в RAM. Ouro-2.6B-Thinking весит около 10 ГБ в FP16, что влезает даже в 16 ГБ системной памяти с запасом.

Рекуррентность против обычных трансформеров: кто кого?

Universal Transformer — это не просто очередная архитектура. Это попытка вернуть RNN в мир больших языковых моделей. Вместо 32 отдельных слоев у вас есть один слой, который применяется рекуррентно 32 раза.

Звучит элегантно. На практике — неоднозначно.

  • Плюс: Меньше параметров. Один слой вместо 32 — экономия на весах. Теоретически.
  • Минус: Рекуррентные связи плохо ложатся на матричные умножения GPU. Нет параллелизации по слоям.
  • Плюс: Может обучаться на очень длинных последовательностях. Рекуррентность не боится контекста в 100к токенов.
  • Минус: Инференс медленнее. Нет возможности распараллелить вычисления между слоями.

На тестах Ouro-2.6B-Thinking показывает результаты на уровне Mistral-7B в некоторых задачах. Но проигрывает в скорости генерации на 15-20% тем же 2.6B-параметровым моделям с обычной архитектурой.

Главный вопрос не "быстрее или медленнее", а "зачем". Рекуррентные модели интересны для задач с экстремально длинным контекстом, где обычные трансформеры сдают позиции.

Практическое применение: где эта архитектура имеет смысл

Ouro-2.6B-Thinking — не замена Llama или Mistral. Это специализированный инструмент для специфичных задач.

Длинные документы

Юридические тексты, научные статьи, техническая документация. Все, что не влезает в 8к-32к контекст обычных моделей. Рекуррентная архитектура обрабатывает такие объемы без необходимости в сложных ухищрениях вроде SSD offload.

Постепенное обучение

Модель может "запоминать" информацию по мере чтения, а не обрабатывать весь контекст за раз. Полезно для интерактивных систем, где контекст наращивается постепенно.

Исследовательские задачи

Если вы экспериментируете с архитектурами — Ouro-2.6B-Thinking дает готовую реализацию Universal Transformer. Можно изучать, модифицировать, сравнивать с другими подходами вроде 1-битных моделей BitNet.

Инструкция по запуску для тех, кому не страшно

# 1. Ставим свежий transformers (версия 4.55.0 или выше)
pip install transformers==4.55.0 accelerate

# 2. Качаем модель (или берем свою исправленную версию)
git lfs install
git clone https://huggingface.co/bytedance/Ouro-2.6B-Thinking

# 3. Проверяем, что modeling_ouro.py содержит фиксы
# Если нет — патчим вручную по инструкции выше

# 4. Запускаем минимальный пример
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

# Указываем trust_remote_code=True — архитектура нестандартная
model = AutoModelForCausalLM.from_pretrained(
    "./Ouro-2.6B-Thinking",
    torch_dtype=torch.float16,
    device_map="auto",
    trust_remote_code=True  # Важно!
)
tokenizer = AutoTokenizer.from_pretrained("./Ouro-2.6B-Thinking")

# Генерация как обычно
input_text = "Universal Transformer — это"
inputs = tokenizer(input_text, return_tensors="pt").to(model.device)

with torch.no_grad():
    outputs = model.generate(
        **inputs,
        max_new_tokens=100,
        temperature=0.7,
        do_sample=True
    )

print(tokenizer.decode(outputs[0], skip_special_tokens=True))

trust_remote_code=True обязателен. Без него transformers не загрузит кастомную архитектуру. Это потенциальная угроза безопасности, если не доверяете источнику модели.

Кому это вообще нужно в 2026 году?

Честно? Большинству разработчиков — нет. Ouro-2.6B-Thinking проигрывает в скорости инференса, требует патчей для работы и не дает революционного качества.

Но если вы:

  • Исследователь архитектур нейросетей
  • Работаете с документами на 50+ страниц
  • Хотите понять, куда могут развиваться LLM после исчерпания потенциала обычных трансформеров
  • Просто любите запускать странные модели ради интереса (как Solar-Open-100B на домашнем железе)

Тогда Ouro-2.6B-Thinking стоит потраченного времени. Это окно в альтернативную реальность, где трансформеры не победили, а сосуществуют с рекуррентными архитектурами.

И да — теперь она запускается. После тех самых фиксов, которые заняли у сообщества три дня дебаггинга и сто нервных клеток. Но кто считал?

P.S. Если запускаете на слабом железе — посмотрите CPU-инференс больших моделей. Там есть трюки, которые работают и для Ouro.