Я выбрал модель и хочу предоставить только API prediction, написанные на Flask. Однако, когда я пишу файл докеров для создания изображения без sklearn, я получаю сообщение об ошибке ModuleNotFoundError: No module named 'sklearn.xxxx', где xxx относится к классам алгоритмов машинного обучения sklearn, в момент, когда я загружаю модель. используя рассол, например classifier = pickle.load(f).

Когда я переписываю файл докеров, чтобы создать изображение, в котором тоже есть sklearn, я не получаю сообщение об ошибке, хотя в API я никогда не импортирую sklearn.
Моя концепция травления очень проста: она сериализует класс классификатора со всеми его данными. Поэтому, когда мы распаковываем его, поскольку класс классификатора уже имеет атрибут predict, мы можем просто вызвать его. Зачем мне нужно иметь sklearn в среде?

3
jar 22 Окт 2018 в 15:42

2 ответа

Лучший ответ

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

Он не ничего разделяет, кроме состояния экземпляра (__dict__ по умолчанию или пользовательской реализации). При распаковке он просто пытается создать экземпляр соответствующего класса (здесь идет ваша ошибка импорта) и установить состояние маринования.

Для этого есть причина: вы не знаете заранее, какие методы будут использоваться после load, поэтому вы не можете обработать реализацию. В дополнение к этому, во время рассола вы не можете создать некоторый AST, чтобы увидеть, какие методы / модули потребуются после десериализации, и основная причина этого - динамический характер python - ваша реализация может фактически варьироваться в зависимости от ввода.

В конце концов, даже если предположить, что теоретически у нас будет интеллектуальная автономная сериализация pickle, это будет фактическая модель + sklearn в одном файле, без надлежащего способа управления этим.

1
Slam 22 Окт 2018 в 12:55

Рассол - это просто представление данных внутри модели. Вам все еще нужен код для его использования, поэтому вам нужно иметь sklearn внутри контейнера.

0
Matthieu Brucher 22 Окт 2018 в 12:45
52929649