# Обзор Open-Ended Learning 3: оценка агентов
Итак, у нас есть возможность динамически создавать разные игры. Как оценить, насколько хорошо играет агент? Как выбрать лучшего?
Мы хотим получить таких агентов, которые:
1. Проваливают как можно меньше заданий.
2. Хорошо выполняют как можно больше заданий.
3. Отдают предпочтение общим способностям, а не узкой компетентности.
Мы можем получить награду агента в каждом задании. Далее, если мы усредним награды агента на всех заданиях, то получим оценку его крутости в виде одного числа. Это обычный RL путь.
Здесь кроектся много проблем. Для разных заданий достижимы совершенно разные награды: на невозможных заданиях нельзя получить больше ноля очков, а на очень легких можно получить огромные награды. При усреднении наград задания с большими наградами полностью скроют влияние сложных заданий, а так же провалы агента. Некоторые задания просто встречаются редко и так же не будут представлены в оценке.
Можно оценивать агентов по минимальной полученной награде, ведь это нижняя планка для их качества. Но некоторые задания просто невозможны, поэтому больше ноля мы не получим, и оценка качества не будет говорить нам ничего. Минимум так же скроет прогресс агента там, где у него получается решать задачу.
Вывод: одного числа недостаточно. Нужно рассмотреть распределение наград агента. Авторы предлагают считать нормализованные перцентили наград. Алгоритм такой:
1. Запускаем популяцию (несколько разных агентов примерно одного уровня) играть в одни и те же несколько игр.
2. Для каждого агента получили его очки в каждой игре, а так же самый лучший результат в этой игре среди всей популяции.
3. Для каждой игры делим очки агента на самый лучший результат в этой игре. Вместо наград непонятного масштаба получили числа от 0 до 1 - нормализованные награды.
4. Для каждого агента считаем с 0 по 50 перцентили нормализованных наград.
Напомню, что перцентиль q это такое число, что q% чисел в последовательности меньше или равны этому числу, а (100-q)% больше этого числа. Например перцентиль 50% это медиана: половина чисел больше этого числа, половина меньше.
На выходе мы получили для каждого агента 50 чисел - перцентили его нормализованных наград. Их несложно интерпретировать. Перцентиль 0 показывает сколько очков агент получил в самой сложной игре: это наш минимум. Прцентиль 50 это медианная награда агента, его "типичное качество". А первое ненулевое число k среди перцентилей показывает, что агент получает хоть какую-то награду в (100-k)% игр. В итоге мы получили вектор, который описывает всё распределение наград агента.
Если надо сравнить двух агентов можно сделать так: агент А лучше агента Б тогда, когда агент А во всех перцентилях не хуже агента Б и хотя бы в одном лучше (на языке шарящих: агент А лучше агента Б если А Парето-доминирует Б).
Супер, теперь у нас есть метрика для оценки агентов. Значит обучив популяцию агентов мы можем выбрать лучшего и сделать из него следущее поколение агентов скопировав и слегка изменив его параметры.
Качество лучшего агента задает планку сложности при создании заданий для для следуюшего поколения, но об этом в следующем посте.
Итак, у нас есть возможность динамически создавать разные игры. Как оценить, насколько хорошо играет агент? Как выбрать лучшего?
Мы хотим получить таких агентов, которые:
1. Проваливают как можно меньше заданий.
2. Хорошо выполняют как можно больше заданий.
3. Отдают предпочтение общим способностям, а не узкой компетентности.
Мы можем получить награду агента в каждом задании. Далее, если мы усредним награды агента на всех заданиях, то получим оценку его крутости в виде одного числа. Это обычный RL путь.
Здесь кроектся много проблем. Для разных заданий достижимы совершенно разные награды: на невозможных заданиях нельзя получить больше ноля очков, а на очень легких можно получить огромные награды. При усреднении наград задания с большими наградами полностью скроют влияние сложных заданий, а так же провалы агента. Некоторые задания просто встречаются редко и так же не будут представлены в оценке.
Можно оценивать агентов по минимальной полученной награде, ведь это нижняя планка для их качества. Но некоторые задания просто невозможны, поэтому больше ноля мы не получим, и оценка качества не будет говорить нам ничего. Минимум так же скроет прогресс агента там, где у него получается решать задачу.
Вывод: одного числа недостаточно. Нужно рассмотреть распределение наград агента. Авторы предлагают считать нормализованные перцентили наград. Алгоритм такой:
1. Запускаем популяцию (несколько разных агентов примерно одного уровня) играть в одни и те же несколько игр.
2. Для каждого агента получили его очки в каждой игре, а так же самый лучший результат в этой игре среди всей популяции.
3. Для каждой игры делим очки агента на самый лучший результат в этой игре. Вместо наград непонятного масштаба получили числа от 0 до 1 - нормализованные награды.
4. Для каждого агента считаем с 0 по 50 перцентили нормализованных наград.
Напомню, что перцентиль q это такое число, что q% чисел в последовательности меньше или равны этому числу, а (100-q)% больше этого числа. Например перцентиль 50% это медиана: половина чисел больше этого числа, половина меньше.
На выходе мы получили для каждого агента 50 чисел - перцентили его нормализованных наград. Их несложно интерпретировать. Перцентиль 0 показывает сколько очков агент получил в самой сложной игре: это наш минимум. Прцентиль 50 это медианная награда агента, его "типичное качество". А первое ненулевое число k среди перцентилей показывает, что агент получает хоть какую-то награду в (100-k)% игр. В итоге мы получили вектор, который описывает всё распределение наград агента.
Если надо сравнить двух агентов можно сделать так: агент А лучше агента Б тогда, когда агент А во всех перцентилях не хуже агента Б и хотя бы в одном лучше (на языке шарящих: агент А лучше агента Б если А Парето-доминирует Б).
Супер, теперь у нас есть метрика для оценки агентов. Значит обучив популяцию агентов мы можем выбрать лучшего и сделать из него следущее поколение агентов скопировав и слегка изменив его параметры.
Качество лучшего агента задает планку сложности при создании заданий для для следуюшего поколения, но об этом в следующем посте.
Борис опять pinned «# Обзор: Open-Ended Learning Leads to Generally Capable Agents, Deepmind 2021 В этой статье пиксельные человечки бегают по процедурно генерируемым мирам, то играют в прятки, то пытаются решить, искать им лучше желтую пирамидку или красный шар. Что из этого…»
Если вы вдруг ищете удаленную работу, то на ACX сейчас тема с объявлениями и много вакансий. Тусовка ламповая и маленькая, поэтому без булщита. Именно так я когда-то и нашел свою предыдущую работу в Mindsdb, так что советую этот путь
https://astralcodexten.substack.com/p/classifieds-thread-82021
https://astralcodexten.substack.com/p/classifieds-thread-82021
Astral Codex Ten
Classifieds Thread 8/2021
Your chance to shill
# Обзор Open-Ended Learning 4/4: Population based training
Я уже упоминал, что в данной статье агенты тренируются поколениями. С помощью этой техники оптимизируются не только веса нейронной сети каждого агента, но и гиперпараметры, в том числе learning rate. Но самое интересное, что среди гиперпараметров находится и личное распределение заданий агента, которое меняется динамически. То есть у каждого агента свой личный набор миров и игр, в которые он играет. При обучении мы одновременно улучшаем агента и игры для его тренировки.
Весь пайплайн состоит аж из двух видов негладкой оптимизации: Reinforcement Learning и эволюционного алгоритма. Сначала агенты популяции независимо обучаются с помощью RL, затем происходит шаг эволюционного алгоритма. Если один агент лучше другого (по нормализованным перцентилям), то его веса и гиперпараметры лучшего агента копируются с небольшими мутациями. В статье описано какие конкретно мутации происходят, и если честно там ничего интересного: вручную подобранные бедными PhD студентами операции.
Тренировка поколениями имеет ряд дополнительных преимуществ. Например, агенты из прошлых поколений не выбрасываются, а используются для валидации агентов следующих поколений как соперники в играх. Так же можно менять цели для разных поколений, так авторы тренируют первые несколько поколений просто исследовать мир через self-reward play, и только затем включают настоящие игры.
Как же авторы динамически увеличивают сложность заданий для каждого поколения? К сожалению у меня нет ответа. Это единственный пробел данной статьи, хотя вполне возможно, что я просто не понял. Авторы упоминают, что пространство миров у них гладкое. Значит каждый мир можно записать как вектор, и распределение миров тоже. Если строго по тексту, то изменение этого распределения упоминается только в работе эволюционного алгоритма. Остается предположить, что миры агентов постепенно усложняются при мутации.
На этом разбор "Open-Ended Learning..." закончен. Я не покрыл ещё много клевых фишек из статьи (там короче нейроны Кохонена, которые визуализируют внутреннее состояние агента и выглядит это прямо как МРТ мозга!), но их там слишком много. Пока можно сказать, что RL это впечатляющий и поражающий воображение трехэтажный набор костылей.
Я уже упоминал, что в данной статье агенты тренируются поколениями. С помощью этой техники оптимизируются не только веса нейронной сети каждого агента, но и гиперпараметры, в том числе learning rate. Но самое интересное, что среди гиперпараметров находится и личное распределение заданий агента, которое меняется динамически. То есть у каждого агента свой личный набор миров и игр, в которые он играет. При обучении мы одновременно улучшаем агента и игры для его тренировки.
Весь пайплайн состоит аж из двух видов негладкой оптимизации: Reinforcement Learning и эволюционного алгоритма. Сначала агенты популяции независимо обучаются с помощью RL, затем происходит шаг эволюционного алгоритма. Если один агент лучше другого (по нормализованным перцентилям), то его веса и гиперпараметры лучшего агента копируются с небольшими мутациями. В статье описано какие конкретно мутации происходят, и если честно там ничего интересного: вручную подобранные бедными PhD студентами операции.
Тренировка поколениями имеет ряд дополнительных преимуществ. Например, агенты из прошлых поколений не выбрасываются, а используются для валидации агентов следующих поколений как соперники в играх. Так же можно менять цели для разных поколений, так авторы тренируют первые несколько поколений просто исследовать мир через self-reward play, и только затем включают настоящие игры.
Как же авторы динамически увеличивают сложность заданий для каждого поколения? К сожалению у меня нет ответа. Это единственный пробел данной статьи, хотя вполне возможно, что я просто не понял. Авторы упоминают, что пространство миров у них гладкое. Значит каждый мир можно записать как вектор, и распределение миров тоже. Если строго по тексту, то изменение этого распределения упоминается только в работе эволюционного алгоритма. Остается предположить, что миры агентов постепенно усложняются при мутации.
На этом разбор "Open-Ended Learning..." закончен. Я не покрыл ещё много клевых фишек из статьи (там короче нейроны Кохонена, которые визуализируют внутреннее состояние агента и выглядит это прямо как МРТ мозга!), но их там слишком много. Пока можно сказать, что RL это впечатляющий и поражающий воображение трехэтажный набор костылей.
Telegram
Борис опять
# Обзор: Open-Ended Learning Leads to Generally Capable Agents, Deepmind 2021
В этой статье пиксельные человечки бегают по процедурно генерируемым мирам, то играют в прятки, то пытаются решить, искать им лучше желтую пирамидку или красный шар. Что из этого…
В этой статье пиксельные человечки бегают по процедурно генерируемым мирам, то играют в прятки, то пытаются решить, искать им лучше желтую пирамидку или красный шар. Что из этого…
# Унижаем Deep Learning
Всё время слышим про чудеса машинлернинга, но сегодня всё по-другому. В эфире велосипеды от Бориса и сегодня мы будем ощущать своё превосходство.
Итак, задача бинарной классификации. Даны признаки X и ответы Y и нужно понять, какая связь между X и Y. Данные в таблице:
Ответ: если единиц нечетное количество y=1, иначе y=0.
Человек решает такую задачу моментально. Возможно ему потребуется один-два дополнительных примера, но потом ему можно дать такую же таблицу с четырьмя иксами и он правильно расставит все Y с первого раза.
Машинное обучение на такой подвиг неспособно.
При смене значения любого признака результат меняется на противоположный, то есть причинно-следственная связь очевидна. Однако корреляция между каждым X и Y нулевая, как и другие меры связи. Если вы построите регрессию, то все её коэффициенты будут нолями, как будто зависимости нет. Один из тех случаев, когда по факту явления связаны, но статистические тесты этого не показывают.
Если мы применим линейную модель, например логистическую регрессию, то она ожидаемо научится выдавать всегда 1, или всегда 0, и мы получим точность около 50%. Можно подумать, что ей нехватает данных, поэтому я пробовал сгенерить для неё большой датасет, но результат такой же.
Возможно дело в линейности. Возьмем KNN, нелинейнее некуда. Но он не умеет экстраполировать. Если ему подать на вход датасет с повторами, то он получит точность 100% на трейн сете и 0% на тестовом сете. Если же без повторов, то просто 0% на обоих. Аналогично ведет себя RandomForest.
Последним я мучал перцептрон. В теории глубокая нейронная сеть способна выучить любую функцию, и наверняка
Короче говоря я не нашел ни одной модели, которая могла бы хотя бы обучиться на первых трех строках из таблицы выше и потом правильно классицифировать следующую. И это уровень плинтуса. В действительности хочется получить модель, которая смогла бы экспраполировать зависимость при добавлении нового x. Для человека это не составляет ни малейшего труда, но для наших ML инструментов это тупик. Можно заключить, что текущие ML инструменты это машинки для поиска корреляций и только, они не способны к логике.
Приглашаю всех желающих потыкать примеры в коллабе:
https://colab.research.google.com/drive/1Lb7cuVcPTcDPSzBT5NBC6IuN-FSK9gXS?usp=sharing
Теперь вопрос к умным ребятам: не я первый это придумал, поэтому наверняка кто-то уже пытался научить нейросетку функции модуля. Может вы знаете статью, где кому-то удалось? Наверняка есть какой-то трюк, который решает проблему. Если же нет, то звучит как вызов: если научить нейросетку работать бинарными векторами, это будет почти способность к построению логических конструкций, а там и до ИИ недалеко.
Всё время слышим про чудеса машинлернинга, но сегодня всё по-другому. В эфире велосипеды от Бориса и сегодня мы будем ощущать своё превосходство.
Итак, задача бинарной классификации. Даны признаки X и ответы Y и нужно понять, какая связь между X и Y. Данные в таблице:
x0 | x1 | y
-----------
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
Ответ: если единиц нечетное количество y=1, иначе y=0.
Человек решает такую задачу моментально. Возможно ему потребуется один-два дополнительных примера, но потом ему можно дать такую же таблицу с четырьмя иксами и он правильно расставит все Y с первого раза.
Машинное обучение на такой подвиг неспособно.
При смене значения любого признака результат меняется на противоположный, то есть причинно-следственная связь очевидна. Однако корреляция между каждым X и Y нулевая, как и другие меры связи. Если вы построите регрессию, то все её коэффициенты будут нолями, как будто зависимости нет. Один из тех случаев, когда по факту явления связаны, но статистические тесты этого не показывают.
Если мы применим линейную модель, например логистическую регрессию, то она ожидаемо научится выдавать всегда 1, или всегда 0, и мы получим точность около 50%. Можно подумать, что ей нехватает данных, поэтому я пробовал сгенерить для неё большой датасет, но результат такой же.
Возможно дело в линейности. Возьмем KNN, нелинейнее некуда. Но он не умеет экстраполировать. Если ему подать на вход датасет с повторами, то он получит точность 100% на трейн сете и 0% на тестовом сете. Если же без повторов, то просто 0% на обоих. Аналогично ведет себя RandomForest.
Последним я мучал перцептрон. В теории глубокая нейронная сеть способна выучить любую функцию, и наверняка
sum(x) % 2 == 0 ей по силам. Однако на практике оказывается, что он моментально переобучается под трейн сет. То есть он выучивает какую-то зависимость, возможно просто запоминает весь трейн сет, но выдает полную чушь на тестовом сете. Я так и не придумал, как ему объяснить, что надо учить вот эту вот истиную зависимость, а не что-то там супер-сложное. Получается, что у DL проблема не такая как у остальных алгоритмов: перцептрон способен выучить нужную функцию, но он не способен понять, какой она должна быть.Короче говоря я не нашел ни одной модели, которая могла бы хотя бы обучиться на первых трех строках из таблицы выше и потом правильно классицифировать следующую. И это уровень плинтуса. В действительности хочется получить модель, которая смогла бы экспраполировать зависимость при добавлении нового x. Для человека это не составляет ни малейшего труда, но для наших ML инструментов это тупик. Можно заключить, что текущие ML инструменты это машинки для поиска корреляций и только, они не способны к логике.
Приглашаю всех желающих потыкать примеры в коллабе:
https://colab.research.google.com/drive/1Lb7cuVcPTcDPSzBT5NBC6IuN-FSK9gXS?usp=sharing
Теперь вопрос к умным ребятам: не я первый это придумал, поэтому наверняка кто-то уже пытался научить нейросетку функции модуля. Может вы знаете статью, где кому-то удалось? Наверняка есть какой-то трюк, который решает проблему. Если же нет, то звучит как вызов: если научить нейросетку работать бинарными векторами, это будет почти способность к построению логических конструкций, а там и до ИИ недалеко.
Google
dl_binary_vectors.ipynb
Colaboratory notebook
👍2😁1
Борис опять pinned «# Унижаем Deep Learning Всё время слышим про чудеса машинлернинга, но сегодня всё по-другому. В эфире велосипеды от Бориса и сегодня мы будем ощущать своё превосходство. Итак, задача бинарной классификации. Даны признаки X и ответы Y и нужно понять, какая…»
Выучить функцию модуло, кстати, возможно, если всё свести к регрессии:
https://github.com/HStrand/modulo/blob/master/modulo.ipynb
Однако это не тоже самое. Одно дело выучить прикидку функции по 8000 примерам. Другое дело "вот тебе три примера, зависимость на них очевидна второкласснику, что будет в следующем примере?". И вот для решения такой задачи у нас нет ни одного инструмента, а значит скайнет пока даже не в зародыше
https://github.com/HStrand/modulo/blob/master/modulo.ipynb
Однако это не тоже самое. Одно дело выучить прикидку функции по 8000 примерам. Другое дело "вот тебе три примера, зависимость на них очевидна второкласснику, что будет в следующем примере?". И вот для решения такой задачи у нас нет ни одного инструмента, а значит скайнет пока даже не в зародыше
GitHub
modulo/modulo.ipynb at master · HStrand/modulo
Can a neural network learn the modulo operation? Contribute to HStrand/modulo development by creating an account on GitHub.
👍1
Forwarded from 🏆 Data Feeling | AIeron (Алерон Миленькин)
pTZKz.png
29.8 KB
#Трюк №16
Вы же тоже часто смотрите на важность признаков в вашей модели? Иначе как понять, на что обращает внимание ваша модель?!
И вот вы смотрите на гистограмму важности признаков, и что дальше?) Что с этим делать?) Ничего?
Вот вам трюк🏂 - заранее генерируем случайный признак и далее смело выбрасываем все признаки, которые рандомный признак отсек. Взлет скора модели гарантирован✈️
Почему это работает? Если случайных признак оказался важнее имеющихся, то скорее всего в них нет никакой полезной информации - разумнек их убрать из модели.
Вы же тоже часто смотрите на важность признаков в вашей модели? Иначе как понять, на что обращает внимание ваша модель?!
И вот вы смотрите на гистограмму важности признаков, и что дальше?) Что с этим делать?) Ничего?
Вот вам трюк🏂 - заранее генерируем случайный признак и далее смело выбрасываем все признаки, которые рандомный признак отсек. Взлет скора модели гарантирован✈️
Почему это работает? Если случайных признак оказался важнее имеющихся, то скорее всего в них нет никакой полезной информации - разумнек их убрать из модели.
Внезапно лекцию про метрики ML моделей, которую я читал в Иннополисе, выложили в открытый доступ:
https://www.youtube.com/watch?v=R4hbxLDsEJo
https://www.youtube.com/watch?v=R4hbxLDsEJo
YouTube
Метрики оценки качества модели, переобучение и недообучение, тестирование и валидация моделей
# Я присоединился к команде Яндекс.Толоки в качестве ML исследователя.
Именно из-за этого я уже неделю собираюсь написать хотя бы один пост в канал. Пока я привыкаю к огромному количеству встреч и всячески акклиматизируюсь к корпоративной жизни постов будет поменьше. Мне очень хочется подробно описать поиск работы, но нехватает сил.
Скажу только, что ковидная статья неождианно быстро окупилась и действительно повлияла на получение трех офферов, один из которых я в итоге принял.
Until we meet again
Именно из-за этого я уже неделю собираюсь написать хотя бы один пост в канал. Пока я привыкаю к огромному количеству встреч и всячески акклиматизируюсь к корпоративной жизни постов будет поменьше. Мне очень хочется подробно описать поиск работы, но нехватает сил.
Скажу только, что ковидная статья неождианно быстро окупилась и действительно повлияла на получение трех офферов, один из которых я в итоге принял.
Until we meet again
Лайфхак: как не быть чертовой мразью.
Появилась отличная идея по работе? Хочется написать её коллеге, но близится конец рабочего дня? Напиши долбанное отложенное сообщение на следующее утро, мать твою.
Набираешь текст, зажимаешь кнопочку "отправить", в выпадающем меню выбираешь "отложенное сообщение" и выставляешь следующее утро. Вуаля, ты восхитителен: не продлил себе с коллегой рабочий день на два часа!
Появилась отличная идея по работе? Хочется написать её коллеге, но близится конец рабочего дня? Напиши долбанное отложенное сообщение на следующее утро, мать твою.
Набираешь текст, зажимаешь кнопочку "отправить", в выпадающем меню выбираешь "отложенное сообщение" и выставляешь следующее утро. Вуаля, ты восхитителен: не продлил себе с коллегой рабочий день на два часа!
👍1
Да, черт возьми, да. Бекендеры давно изобрели эту схему: пишешь код локально, исполняешь всегда в докере.
Forwarded from STACK MORE LAYERS (Alexander Mamaev)
🐍 Мысли в слух про Enviroment и Conda 📦
Я пользуюсь Anaconda достаточно долгое время, примерно с того дня, когда я заинтересовался Data Science как таковым.
Мне его представили как удобный инструмент, чтобы устанавливать библиотеки на рабочую машину.
Я пользовался windows и тогда мне это показалось безумно удобным инструментом, ведь многие пакеты не хотели просто так устанавливаться под виндой.
Шли годы, я оброс бородой и опытом, давно променял windows на более удобные платформы, но по прежнему продолжал пользоваться conda.
Я спрашивал себя - а что есть действительно наилучший способ организации рабочего окружения? Почему я должен отказаться от conda?
Внятного ответа в интернете я найти так и не смог, везде были свои за и против. Кто-то находится в лагере venv, кто-то в virtualenv.
Но недавно мне пришло осознание и я понял как сделать лучше, а самое главное - зачем.
Главная особенность conda заключается в том, что в отличие от pip оно так же поставляет собранные бинарники под любые задачи, то есть вы можете устновить ffmpeg, openblas, openfst и другие вещи прямо из конды, хотя сами эти пакеты могут быть совсем не связаны с питоном. В то же время pip и средства виртуализации venv и ему подобные позволяют вам "изолировать" именно ваше питоновское окружение, это означат, что проблемы с конфликтами бинарных пакетов все еще остаются.
Во многом виртуализация conda меня устраивала, но недавно произошло важное событие - я перешел на macbook m1, соответсвенно архитектура процессора полностью поменялась, больше никаких x86, только arm. И соответсвенно мои попытки скачать какие-то бинарные пакеты из conda не увенчались успехом. Их просто не существует, нет никаких вариантов поставить их от туда. Придется скачивать source code и собирать их самостоятельно с помощью cmake и gcc. Естественно делать это просто на тачке - глупо. Завтра я перееду на другой ноут - придется вспоминать все инструкции и процесс инсталяции, что не есть хорошо.
Решение вырисовывается само собой - давайте использовать докер по умолчанию для любого окружения проекта. То есть буквально, новый проект - создаете новый docker контейнер под него.
Какие плюсы из этого есть?
- Реальная изоляция окружения, то есть у вас по умолчанию проекты никогда не будут конфликтовать между собой, вы не забудете поменять env, ведь у каждого проекта он свой, а если и забудете, будет не проблематично откатить его назад.
- Фиксация всех изменений окружения. В dockerfile вы сами прописываете все инструкции того, куда что скачать, как что распаковать и это не забудется, и не придется писать отдельную инструкцию в confluence и любую другую систему вики.
- Легкая переносимость между устройствами - если вы меняете рабочую станцию или просто хотите создать аналогичное окружение на сервере, вы просто пуллите последнюю версию dockerfile и делаете билд
- Прозрачное понимание проблем сборки - если что-то не собралось под вашу платформу, вы не попадаете в патовую ситуацию, что раз уж нет бинарника - вы ничего не можете сделать, вы можете просто прописать свои "правильные" инструкции для сборки под эту платформу.
Я пользуюсь Anaconda достаточно долгое время, примерно с того дня, когда я заинтересовался Data Science как таковым.
Мне его представили как удобный инструмент, чтобы устанавливать библиотеки на рабочую машину.
Я пользовался windows и тогда мне это показалось безумно удобным инструментом, ведь многие пакеты не хотели просто так устанавливаться под виндой.
Шли годы, я оброс бородой и опытом, давно променял windows на более удобные платформы, но по прежнему продолжал пользоваться conda.
Я спрашивал себя - а что есть действительно наилучший способ организации рабочего окружения? Почему я должен отказаться от conda?
Внятного ответа в интернете я найти так и не смог, везде были свои за и против. Кто-то находится в лагере venv, кто-то в virtualenv.
Но недавно мне пришло осознание и я понял как сделать лучше, а самое главное - зачем.
Главная особенность conda заключается в том, что в отличие от pip оно так же поставляет собранные бинарники под любые задачи, то есть вы можете устновить ffmpeg, openblas, openfst и другие вещи прямо из конды, хотя сами эти пакеты могут быть совсем не связаны с питоном. В то же время pip и средства виртуализации venv и ему подобные позволяют вам "изолировать" именно ваше питоновское окружение, это означат, что проблемы с конфликтами бинарных пакетов все еще остаются.
Во многом виртуализация conda меня устраивала, но недавно произошло важное событие - я перешел на macbook m1, соответсвенно архитектура процессора полностью поменялась, больше никаких x86, только arm. И соответсвенно мои попытки скачать какие-то бинарные пакеты из conda не увенчались успехом. Их просто не существует, нет никаких вариантов поставить их от туда. Придется скачивать source code и собирать их самостоятельно с помощью cmake и gcc. Естественно делать это просто на тачке - глупо. Завтра я перееду на другой ноут - придется вспоминать все инструкции и процесс инсталяции, что не есть хорошо.
Решение вырисовывается само собой - давайте использовать докер по умолчанию для любого окружения проекта. То есть буквально, новый проект - создаете новый docker контейнер под него.
Какие плюсы из этого есть?
- Реальная изоляция окружения, то есть у вас по умолчанию проекты никогда не будут конфликтовать между собой, вы не забудете поменять env, ведь у каждого проекта он свой, а если и забудете, будет не проблематично откатить его назад.
- Фиксация всех изменений окружения. В dockerfile вы сами прописываете все инструкции того, куда что скачать, как что распаковать и это не забудется, и не придется писать отдельную инструкцию в confluence и любую другую систему вики.
- Легкая переносимость между устройствами - если вы меняете рабочую станцию или просто хотите создать аналогичное окружение на сервере, вы просто пуллите последнюю версию dockerfile и делаете билд
- Прозрачное понимание проблем сборки - если что-то не собралось под вашу платформу, вы не попадаете в патовую ситуацию, что раз уж нет бинарника - вы ничего не можете сделать, вы можете просто прописать свои "правильные" инструкции для сборки под эту платформу.
The bind is this. For the first 99% of human history the global economy (initially mostly food production) grew very slowly: under 0.1% a year. But since the industrial revolution around 1800, growth has exploded to over 2% a year.
To us in 2020 that sounds perfectly sensible and the natural order of things. But Holden points out that in fact it’s not only unprecedented, it also can’t continue for long.
The power of compounding increases means that to sustain 2% growth for just 10,000 years, 5% as long as humanity has already existed, would require us to turn every individual atom in the galaxy into an economy as large as the Earth’s today. Not super likely.
So what are the options? First, maybe growth will slow and then stop. In that case we today live in the single miniscule slice in the history of life during which the world rapidly changed due to constant technological advances, before intelligent civilization permanently stagnated or even collapsed. What a wild time to be alive!
Alternatively, maybe growth will continue for thousands of years. In that case we are at the very beginning of what would necessarily have to become a stable galaxy-spanning civilization, harnessing the energy of entire stars among other feats of engineering. We would then stand among the first tiny sliver of all the quadrillions of intelligent beings who ever exist. What a wild time to be alive!
https://80000hours.org/podcast/episodes/holden-karnofsky-most-important-century/
To us in 2020 that sounds perfectly sensible and the natural order of things. But Holden points out that in fact it’s not only unprecedented, it also can’t continue for long.
The power of compounding increases means that to sustain 2% growth for just 10,000 years, 5% as long as humanity has already existed, would require us to turn every individual atom in the galaxy into an economy as large as the Earth’s today. Not super likely.
So what are the options? First, maybe growth will slow and then stop. In that case we today live in the single miniscule slice in the history of life during which the world rapidly changed due to constant technological advances, before intelligent civilization permanently stagnated or even collapsed. What a wild time to be alive!
Alternatively, maybe growth will continue for thousands of years. In that case we are at the very beginning of what would necessarily have to become a stable galaxy-spanning civilization, harnessing the energy of entire stars among other feats of engineering. We would then stand among the first tiny sliver of all the quadrillions of intelligent beings who ever exist. What a wild time to be alive!
https://80000hours.org/podcast/episodes/holden-karnofsky-most-important-century/
80,000 Hours
Holden Karnofsky on the most important century
"...it doesn't look like things have been normal for a long time... we just live on this rocket ship that took off 5 seconds ago, and nobody knows where it's going."