Перейти к содержимому
ПереводыAnthropic

circuit-tracer и Neuronpedia: путеводитель по графам атрибуции на открытых моделях

Как самому строить графы атрибуции из статей Anthropic на Gemma-2-2B, Llama-3.2-1B, Qwen3 и других открытых моделях: библиотека circuit-tracer (MIT) — командная строка, Python API, вмешательства — и открытая платформа Neuronpedia (Apache-2.0), где графы, признаки и steering работают прямо в браузере.

Методы из статей Circuit Tracing и On the Biology of a Large Language Model Anthropic применяла к закрытой модели Claude 3.5 Haiku. Чтобы их мог повторить любой, есть два открытых инструмента:

  • circuit-tracer — библиотека Python, которая строит графы атрибуции на открытых моделях с готовыми транскодерами, рисует их в том же интерфейсе, что в статьях, и позволяет делать вмешательства (менять признаки и смотреть на ответ). Лицензия MIT.
  • Neuronpedia — открытая веб-платформа интерпретируемости: браузер признаков SAE и транскодеров, steering, поиск, автоинтерпретация и графы атрибуции в браузере (их бэкенд построен на circuit-tracer). Код — Apache-2.0, сайт — neuronpedia.org.
  • Урок 9.3.2 «Суперпозиция и разреженные автоэнкодеры» уже содержит короткую практику с circuit-tracer (граф для «Даллас → Остин» на Gemma-2-2B). Эта страница — подробная карта: что ещё умеет библиотека, какие модели поддерживаются, как вмешиваться в признаки, что даёт Neuronpedia.
  • Выпускной проект (10.1.1): «разобрать схему одного поведения открытой модели» — хорошая тема проекта, и circuit-tracer — основной инструмент для неё.
  • Что нужно знать: что такое транскодер, граф атрибуции, супер-узел и вмешательство — по конспекту Circuit Tracing.
РесурсЧто этоКогда использоватьВажность
Neuronpedia: графыготовые и свои графы атрибуции для Gemma-2-2B в браузере, кнопка + New Graph, steering из подграфапервое знакомство, без установки★★★
demos/circuit_tracing_tutorial.ipynbглавный учебник: повторяет два результата из Biology (двухшаговое рассуждение и многоязычные схемы) на Gemma-2-2B, работает в бесплатном Colabпосле браузера — разобраться с API★★★
demos/attribute_demo.ipynbкак построить граф, сохранить, проредить и открыть в локальном интерфейсесвои промпты★★★
demos/intervention_demo.ipynbкак выключать и включать признаки и генерировать с вмешательствомпроверка гипотез★★★
demos/attribution_targets_demo.ipynbатрибуция от выбранных целей: конкретных логитов, разности логитов и т. п.«почему Austin, а не Dallas?»★★
demos/gemma_demo.ipynb, gemma_it_demo.ipynbразобранные и подписанные графы Gemma-2-2B (базовой и instruction-tuned) с проверочными вмешательствамиобразцы анализа★★
demos/llama_demo.ipynbто же для Llama-3.2-1B (не в Colab)на своей машине★
Командная строка circuit-tracer attributeполный цикл «граф → файлы → локальный сервер» одной командойбыстрые эксперименты★★
Интерфейс графов (Anthropic, MIT)тот самый фронтенд из статейвстроен в circuit-tracer—
Neuronpedia: кодисходники платформы: веб-приложение, сервер инференса, сервер графов, автоинтерпретацияразвернуть у себя★
  1. Откройте neuronpedia.org/gemma-2-2b/graph и в выпадающем списке выберите готовый граф — например, gemma-fact-dallas-austin («Fact: the capital of the state containing Dallas is»). README circuit-tracer даёт прямую ссылку на этот граф с уже собранными супер-узлами «Texas», «capital», «state».
  2. Найдите в графе путь «Dallas → Texas → say Austin» и «capital → say a capital». Кликните на узел — справа появятся примеры текстов, где признак активен, и токены, которые он продвигает.
  3. Закрепите узлы в подграфе (Ctrl/Cmd + клик) и объедините похожие в супер-узел (удерживая G, кликайте по узлам).
  4. Проверьте гипотезу: в подграфе нажмите Steer (нужен хотя бы один закреплённый узел) и выключите супер-узел «Texas». Изменился ли ответ?
  5. Постройте свой граф кнопкой + New Graph: например, «The opposite of “small” is ”» и его французскую версию.

Кроме графов, на Neuronpedia есть (по списку в README): API, steering, просмотр активаций, автоинтерпретация и её оценка, поиск признаков по тексту и по объяснениям, дашборды признаков, косинусная близость и UMAP, пробы, списки, экспорт и загрузка своих SAE. Признаки многих открытых словарей (например, Gemma Scope) уже загружены — это лучший способ «пощупать» признаки, о которых рассказывают Monosemanticity и урок 9.3.2.

Три задачи (по README):

  1. По модели с предобученными транскодерами строит граф атрибуции — прямые эффекты каждого ненулевого признака, узла ошибки и входного токена на другие признаки и выходные логиты.
  2. Визуализирует граф и позволяет подписывать признаки.
  3. Делает вмешательства: выставляет признакам любые значения и показывает, как меняется выход.
flowchart LR
P["Промпт"] --> A["attribute(): граф атрибуции (.pt)"]
A --> G["create_graph_files(): прореживание, JSON"]
G --> S["serve(): локальный интерфейс графа"]
S --> H["Гипотеза: супер-узлы"]
H --> I["feature_intervention(): проверка на модели"]
Рабочий цикл с circuit-tracer
Окно терминала
git clone https://github.com/safety-research/circuit-tracer
cd circuit-tracer
python -m venv .venv && source .venv/bin/activate # отдельное окружение: библиотека тянет свою версию TransformerLens
pip install .
export HF_TOKEN=hf_... # Gemma на Hugging Face выдают после принятия лицензии

Одна команда делает три шага: атрибуцию, создание файлов графа (с прореживанием) и запуск локального сервера:

Окно терминала
circuit-tracer attribute \
--prompt "The International Advanced Security Group (IAS" \
--transcoder_set gemma \
--slug gemma-demo \
--graph_file_dir ./graph_files \
--server

Команда напишет адрес сервера (порт по умолчанию — 8041). Если считаете на удалённой машине, пробросьте порт. Полезные параметры (значения по умолчанию — из README):

ПараметрПо умолчаниюСмысл
--transcoder_set, -t—набор транскодеров: gemma, llama, репозиторий Hugging Face или локальный путь
--max_n_logits10от скольких логитов (максимум) строить граф
--desired_logit_prob0,95брать столько верхних логитов, чтобы набрать эту вероятность
--max_feature_nodes7500ограничение числа узлов-признаков (меньше — быстрее, но граф беднее)
--batch_size256размер батча обратных проходов
--dtype—fp32, fp16, bf16
--offload—выгрузка частей в cpu или disk для экономии видеопамяти
--node_threshold0,8оставить минимум узлов с суммарным влиянием не меньше порога
--edge_threshold0,98то же для рёбер
--graph_output_path, -o—сохранить «сырой» граф в .pt для работы из Python

Нужно задать --slug и --graph_file_dir (для интерфейса), или --graph_output_path, или всё вместе — иначе команда ничего не сохранит.

Управление в интерфейсе: клик — выбрать узел; Ctrl/Cmd + клик — закрепить в подграфе; кнопка Edit — подписать узел; удерживая G, кликать по узлам — объединить в супер-узел; клик по подписи супер-узла — переименовать.

from pathlib import Path
import torch
from circuit_tracer import ReplacementModel, attribute
from circuit_tracer.utils import create_graph_files
from circuit_tracer.frontend.local_server import serve
# Модель + транскодеры. "gemma" — сокращение для транскодеров Gemma Scope
model = ReplacementModel.from_pretrained(
"google/gemma-2-2b", "gemma", dtype=torch.bfloat16, backend="transformerlens"
)
# 1. Граф атрибуции
graph = attribute(
prompt="The capital of state containing Dallas is",
model=model,
max_n_logits=10, # максимум логитов-целей
desired_logit_prob=0.95, # набрать 95 % вероятности
batch_size=256,
max_feature_nodes=8192, # меньше — быстрее, но граф беднее
offload="cpu", # в Colab в демо используют "disk"
)
Path("graphs").mkdir(exist_ok=True)
graph.to_pt("graphs/dallas.pt") # файл большой: в демо — около 167 МБ
# 2. Файлы для интерфейса (с прореживанием)
create_graph_files(
graph_or_path="graphs/dallas.pt", slug="dallas-austin", output_path="./graph_files",
node_threshold=0.8, edge_threshold=0.98,
)
# 3. Локальный интерфейс
server = serve(data_dir="./graph_files/", port=8046) # откройте http://localhost:8046/index.html
# server.stop()

Вмешательства. Признак задаётся тройкой (слой, позиция, номер признака); вмешательство — четвёркой (слой, позиция, признак, новое значение):

# Пример из intervention_demo: выключаем «испанский» признак на последней позиции
intervention_tuples = [(20, -1, 341, 0.0)] # (layer, pos, feature_idx, new_value)
s = "Hecho: Michael Jordan juega al"
with torch.inference_mode():
original_logits, _ = model.feature_intervention(s, [])
new_logits, _ = model.feature_intervention(s, intervention_tuples)
# Значения «из распределения» удобно брать из активаций на другом промпте:
_, activations = model.get_activations(s, sparse=True)
# Для генерации с действующим вмешательством — model.feature_intervention_generate(...),
# а позицию можно задать открытым срезом slice(pos, None, None)

В демо авторы честно показывают, что выключение одного признака языка почти не меняет ответ — признаков языка много; нужно вмешиваться в весь супер-узел. А в учебнике подмена «Texas» на «California» даёт «Sacramento», подмена на «Китай» (из промпта с Шанхаем) — «Beijing», но подмена на «Британскую Колумбию» срабатывает плохо: не всякая гипотеза подтверждается.

По README (раздел Available Transcoders) с circuit-tracer работают:

МодельТранскодеры
Gemma-2 2Bпослойные (PLT, из Gemma Scope) и межслойные (CLT) на 426 тыс. и 2,5 млн признаков
Llama-3.2 1BPLT и CLT (524 тыс. признаков)
Qwen3 0.6B, 1.7B, 4B, 8B, 14BPLT
GPT-OSS 20BCLT (131 тыс. признаков)
Gemma-3 270M, 1B, 4B, 12B, 27B (PT и IT)PLT из Gemma Scope 2 — нужен бэкенд nnsight
Llama 3.1 8B InstructTopK PLT

Бэкенды: по умолчанию transformerlens (только модели, реализованные в TransformerLens); backend="nnsight" поддерживает большинство моделей Hugging Face, но экспериментальный — медленнее и прожорливее по памяти. Свои транскодеры можно загрузить по абсолютному пути (тогда для интерфейса нужен features_dir). Транскодеры большого размера можно кэшировать локально (save_transcoders_to_cache), чтобы пользоваться ленивой загрузкой кодировщика и декодера.

Neuronpedia — монорепозиторий из нескольких независимых сервисов (по README): веб-приложение (Next.js, порт 3000, плюс публичный API), база данных (Postgres 16+ с pgvector), сервер инференса (steering, проверка активаций, поиск; отдельный экземпляр на каждую модель), сервер автоинтерпретации (на основе Delphi от EleutherAI), сервер графов (на основе circuit-tracer или Language-Model-SAEs) и другие. Рекомендуется от 16 ГБ RAM; для инференса и графов нужен GPU с CUDA. Для сервера графов нужен HF_TOKEN с доступом к Gemma-2-2B. Разворачивать всё это ради учёбы не нужно — сайт бесплатен; но код полезно почитать, чтобы понять, как устроен публичный инструмент интерпретируемости.

  1. Повторить находки Biology на открытой модели: двухшаговое рассуждение (Даллас/Окленд/Шанхай), многоязычный антоним («small/petit» и тот же вопрос по-китайски), галлюцинация на выдуманном имени. Что повторяется, а что нет?
  2. Сравнить модели: один и тот же промпт на Gemma-2-2B и Qwen3-4B. Похожи ли супер-узлы?
  3. Атрибуция от разности логитов (attribution_targets_demo): «почему Austin, а не Dallas?» — граф часто становится чище.
  4. Проект ступени 10: выбрать одно поведение (рифма, перевод, простая арифметика), построить и подписать граф, проверить 3–5 гипотез вмешательствами, честно записать, где метод не помог (узлы ошибки, внимание).
  • Конспекты: Circuit Tracing (метод и ограничения) и Biology (что искать).
  • Урок 9.3.1: активационный патчинг и индукционные головы — то, что граф атрибуции не показывает (внимание).
  • Ноутбуки ARENA (глава 1) и TransformerLens — см. «Учимся у создателей».
ENRU
per-layer transcoder (PLT) / cross-layer transcoder (CLT)послойный / межслойный транскодер
attribution targetцель атрибуции
node / edge thresholdпорог узлов / рёбер (прореживание)
offloadвыгрузка (в CPU или на диск)
pin a node, supernodeзакрепить узел, супер-узел
steeringуправление (через признаки)
autointerpавтоинтерпретация
backendбэкенд (движок модели)