Гайд · TNWS AI

Как проверить формы нейросети через jax.eval_shape без вычисления

4 мин—

Абстрактная проверка forward через ShapeDtypeStruct и eval_shape: ожидаемый batch output, dtype и раннее обнаружение несовместимых размерностей.

Задача и применимость

Актуальный запрос: «как проверить shape нейросети JAX eval_shape». Проверить выходные shape и dtype без выполнения численных операций на реальном batch. jax.eval_shape трассирует функцию на абстрактных входах и возвращает ShapeDtypeStruct-подобный результат. Это удобно для контрактных тестов, оценки промежуточных форм и раннего обнаружения несовместимого matrix multiplication.

Материал применим к JAX 0.11.2 и jaxlib 0.11.2. JAX предоставляет массивы, автоматическое дифференцирование и программные преобразования; он не является готовой библиотекой слоёв, датасетов или полного тренировочного цикла. Пример намеренно мал и выполняется локально на доступном backend без загрузки весов и внешних данных. Численный критерий доказывает поведение конкретного кода, но не качество рабочей нейросети.

Пошаговое решение

  1. Опишите параметры и forward с ожидаемыми размерами.
  2. Создайте ShapeDtypeStruct для batch (32,3).
  3. Вызовите eval_shape и проверьте output (32,2) float32.
  4. Передайте негативную форму (32,4) и подтвердите явную ошибку.

Готовый проверяемый шаблон

import jax
import jax.numpy as jnp

params={"W":jnp.ones((3,2),dtype=jnp.float32),"b":jnp.zeros((2,),dtype=jnp.float32)}
def forward(p,x): return jax.nn.relu(x@p["W"]+p["b"])
spec=jax.ShapeDtypeStruct((32,3),jnp.float32)
out=jax.eval_shape(forward,params,spec)
assert out.shape==(32,2) and out.dtype==jnp.float32
try:
    jax.eval_shape(forward,params,jax.ShapeDtypeStruct((32,4),jnp.float32))
    raise AssertionError("shape mismatch must fail")
except TypeError as exc:
    assert "dot_general" in str(exc) or "contracting dimensions" in str(exc)
print(out)

Вход и ожидаемый результат

Абстрактный batch из 32 строк и трёх признаков даёт спецификацию (32,2) float32. Негативный вход с четырьмя признаками не выполняет вычисление и завершается TypeError о contracting dimensions.

Как проверить результат

Проверяйте не только финальный output, но и договорённый dtype. Добавьте спецификации для одного и нескольких batch-размеров. eval_shape не проверяет значения, NaN или диапазон — для них нужен отдельный численный тест.

Перенос на настоящую нейросеть

Для рабочей модели сначала зафиксируйте контракт параметров и batch: pytree structure, формы, dtype, порядок признаков и семантику выходов. Генерацию случайностей оформите как явный поток keys. Разделите чистые функции forward, loss и update, чтобы их можно было независимо тестировать, дифференцировать и компилировать. Данные train, validation и test не должны смешиваться. Любое изменение формы, precision, backend или версии JAX проверяйте на сохранённом обезличенном regression-наборе до развёртывания.

Критерии приёмки

  1. Все формы и dtype совпадают с контрактом.
  2. Каждый PRNG subkey используется в одной логической случайной операции.
  3. Loss и gradients конечны на положительном тесте.
  4. Негативный вход вызывает ожидаемую ошибку, а не случайный output.
  5. Обычный и преобразованный через jit/vmap путь численно согласованы, когда это применимо.
  6. Устройство, версии JAX/jaxlib и численный допуск записаны в отчёте.

Регрессионный протокол

Храните несколько малых входов: стандартный batch, один объект, нули, граничные значения и заведомо невалидную форму. Сравнивайте outputs и loss с эталоном через allclose с явно выбранным допуском. После смены backend проверяйте допустимую численную погрешность, а не требуйте безусловной битовой идентичности. Производительность измеряйте после компиляционного прогрева и завершения асинхронной работы. Не выбирайте лучший единичный замер: сообщайте распределение задержки и условия машины.

Диагностика расхождений

Если результат изменился, локализуйте слой: данные и preprocessing, key-поток, shapes/dtype, forward, loss, gradients, update, затем jit и backend. Сначала выполните функцию без jit на минимальном входе, затем верните transformations по одной. Сравните tree structure и каждый leaf. Не увеличивайте допуск и не применяйте nan_to_num, пока не выяснено, не скрывает ли это неверную форму, переполнение или повтор ключа.

Контроль после внедрения

В эксплуатации ограничьте допустимые batch shapes и объём входа, чтобы запрос не исчерпал память и не создал бесконечный поток перекомпиляций. Собирайте агрегированные метрики latency, compile count, долю невалидных входов и численные ошибки без записи исходных чувствительных данных. Сохраняйте предыдущий проверенный артефакт и код параметров для отката. Автоматическая замена весов требует той же независимой проверки, что и обычный выпуск.

Границы применимости

Пример на CPU не доказывает свойства GPU или TPU, а маленький массив не предсказывает производительность большой модели. JIT может ускорить повторяющиеся вычисления, но стоимость компиляции, передача данных и новые формы способны ухудшить end-to-end время. Autodiff возвращает производную написанной функции, а не подтверждает правильность математической постановки. Для критичных решений нужны предметные метрики, мониторинг и человеческий контроль.

Типичные ошибки и чего не делать

  • Не считайте eval_shape тестом точности.
  • Не подменяйте feature-axis batch-осью.
  • Не ловите любое исключение без проверки причины.

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

FAQ

Выполняются ли реальные вычисления?

Нет, функция оценивается абстрактно по формам и dtype.

Что передавать вместо массива?

jax.ShapeDtypeStruct.

Проверяет ли это NaN?

Нет, только абстрактные свойства и совместимость операций.

Официальные источники

Частые вопросы

Выполняются ли реальные вычисления?

Нет, функция оценивается абстрактно по формам и dtype.

Что передавать вместо массива?

`jax.ShapeDtypeStruct`.

Проверяет ли это NaN?

Нет, только абстрактные свойства и совместимость операций.

Читайте также

Комментарии

Пока тихо. Скажите первое слово