Контейнер скорит те же строки иначе, чем ноутбук — как локализовать причину?
Модель загружается из одного и того же файла артефакта в ноутбуке и внутри сервинг-контейнера. На одной и той же входной строке предсказания различаются. Оба окружения собраны с одной ревизии репозитория, контрольная сумма артефакта совпадает с обеих сторон.
Ограничения: логирование добавлять можно, переобучать и менять артефакт нельзя.
row_id=88431
notebook : proba=0.8134 n_features=41 dtypes={float64:38, int64:3}
container: proba=0.2977 n_features=41 dtypes={float64:35, int64:3, object:3}
artifact : sha256 match lib(train)=1.4.2 lib(serve)=1.6.0
Назовите упорядоченные проверки, локализующие причину, и укажите, какая строка уже её сужает.
Сравнивайте не модель, а окружения. Залогируйте точный вектор признаков, который каждая сторона строит для одной строки, и сравните — порядок, dtype, заполнение пропусков и пропущенный препроцессинг видны там. Если векторы совпали, сравните версии библиотек.
- ✗Отлаживать артефакт модели, когда расхождение живёт в векторе признаков, который до неё доходит
- ✗Считать совпадающее число признаков доказательством идентичности двух векторов признаков
- ✗Списывать крупный воспроизводимый разрыв на недетерминированность вместо разницы dtype или версий
- →Как фиксация транзитивных зависимостей через lock-файл убирает этот класс ошибок?
- →Почему колонка, прочитанная как
objectбез типа, меняет решения о разбиении у дерева?
Строка с dtypes уже сужает поиск: в контейнере три колонки прочитаны как object, значит расходятся не веса, а вход. Порядок проверок — от входа к модели.
не отработал и категориальный кодировщик получил не то, что ждал.
- Залогировать точный вектор признаков с обеих сторон для одной строки и сравнить поэлементно.
- Сравнить имена и порядок колонок — модель на массиве не знает имён и берёт позиции.
- Сравнить dtype и заполнение пропусков:
objectвместоfloat64означает, что парсинг чисел - Только если векторы совпали — сравнить версии библиотек (
1.4.2против1.6.0).
feature[12] loan_amount notebook=float64 12500.0 container=object '12 500'
feature[27] region_code notebook=float64 3.0 container=object '3'
Причина здесь — разбор CSV в контейнере с другой локалью и разделителем, а не сама модель.