О ч ё м этот ноу т бу к А на ко нд а , ma mb a , fi s h , tmu x ... ·...
TRANSCRIPT
Анаконда, mamba, fish, tmux, cookiecutter
О чём этот ноутбук
Аналитика с каждым годом всё больше переезжает в облако (https://hostingtribunal.com/blog/cloud-computing-statistics/). Ресурсов стационарного компьютера не хватает для большинства серьёзных задачв науке и индустрии. На помощь приходят облачные сервисы, предоставляющие необходимыевычислительные мощности. Будь то университетский / рабочий кластер или Amazon AWS, на что-тобольшее, чем консольный интерфейс, рассчитывать обычно не приходится.
Цель этого ноутбука — дать вам представление о том, как настроить удобное окружение дляработы в терминале Linux . В настоящее время 90% облачных сервисов работают под Линуксом, втом числе продукты Microsoft (https://www.wired.com/2015/09/microsoft-using-linux-run-cloud/), вампридётся его освоить). В ноутбуке пойдёт речь о fish и tmux — инструментах, освоив которыевы полюбите терминал, а также об основах reproducible research — о conda , jupyter и gitкак способах фиксировать состояние проекта и гарантировать, что другой человек сможетзапустить ваш код.
Эти практики де-факто являются стандартом в предметной области и помогут вам не растеряться, когдавы начнёте разрабатывать свои большие проекты или вносить правки в чужие. Материал можно условноподелить на две части: основную, которая призвана облегчить вам жизнь при выполнении заданий понашим курсам, и продвинутую, где рассказываются вещи, которые понадобятся вам в работе или висследованиях.
Anaconda
Anaconda (https://www.anaconda.com)наиболее известна как дистрибутив Python со встроенным внего пакетным менеджером conda . Она позволяет изолировать окружение проекта от системнойверсии Python , который критически необходим для работы системы. Использование sudo pipсчитается плохой практикой (https://askubuntu.com/questions/802544/is-sudo-pip-install-still-a-broken-practice). Также conda позволяетбез проблем переносить окружение с одной машины на другую. Крометого, если вы что-то сломаете, то с Anaconda вы всегда сможете откатиться на более старую версиюокружения. Конечно, если вы позаботитесь о регулярных бэкапах. С системной версией Python этогораздо сложнее и может потребовать переустановки системы.
Въедливый читатель скажет, что вместо Anaconda можно использовать virtualenv(https://virtualenv.pypa.io/en/latest/) или docker (https://www.docker.com). Тем не менее, docker эточаще всего overkill для простых проектов (его сложно настраивать, он работае относительномедленно и требует sudo -прав). Связка pip + virtualenv хорошо работает для Python -onlyпроектов, но на наших курсах вам придётся также работать с R . Кроме того, conda во многоманалогична пакетному менеджеру внутри операционной системы и позволяет локально (без sudo -прав,которых в облаке у вас почти никогда нет) установить gcc , бразуер, альтернативный shell и многоедругое для 100+ языков. С более подробным сравнением Anaconda с альтернативнымиинструментами вы можете ознакомиться по ссылке (https://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/).
Мы установим Anaconda и настроим с её помощью комфортное окружение для работы над курсом.
Замечание: Anaconda можно поставить и под Windows , на официальном сайте есть инструкция.Тем не менее, мы не берёмся гарантировать, что всё заработает. Портирование кода под Windows это долго и дорого, потому большая часть библиотек по анализу данных и машинному
обучению доступны только под Linux .
Установка AnacondaСкачайте последнюю версию Anaconda под свою ОС с официального сайта(https://www.anaconda.com/distribution/). Запустите установочный файл и следуйте инструкциям (не меняйте дефолтные параметры безуважительной причины). После установки перезагрузите терминал (например, с помощью команды exec bash ).
Если всё прошло успешно, то ячейка ниже должна отработать без ошибок:
In [1]:
Если что-то пошло не так, то напишите об этом на почту курса или задайте вопрос в чате, мы поможем и
conda 4.7.11
!conda --version1
внесём правки.
Создание conda environmentЗаводить отдельный environment для каждого проекта — правило хорошего тона.Устанавливать всё в корневой envirnonment — прямой путь в отдельный круг ада, на который выобрекаете себя в будущем. Кроме того, что это противоречит философии conda , — возможностисосуществования несовместимых дистрибутивов Python в пределах одной системы, — это такжеприводит к неконтролируемому росту числа установленных пакетов. Для разрешения зависимостей conda использует приближённый SAT-solver (https://www.anaconda.com/understanding-and-
improving-condas-performance/), а задача SAT NP -полна, потому упорное использование только одного environment -а вскоре приведёт к тому, что вы будете часами ждать установки пакетов.
Не надо так.
Выполнив в терминале код из ячейки ниже, вы создадите environment для нашего курса в директории~ :
conda create -n mipt-stats python=3.7 r=3.6 --yes
Эта команда создаст environment , в котором уже будут установлены Python и R , что сэкономитвам время в будущем. Активируйте окружение, запустив в терминале ячейку ниже:
conda activate mipt-stats
Если вы захотите вернуться в базовое окружение, введите
conda deactivate
Если вы хотите создать окружение в другой папке, то замените флаг -n на -o
conda create -o path/to/env python=3.7 r=3.6 --yes
Обратите внимание, что при этом вам придётся указывать полный путь при использовании команды conda activate :
conda activate /path/to/env
Установка mamba и основных пакетов
Выше упоминалось, что для разрешения зависимостей conda приближённо решает задачу SAT . Ксожалению и стыду разработчиков из Continuum , SAT-solver в conda написан на pure Python , из-за чего он работает возмутительно медленно. Эту проблему решает mamba(https://medium.com/@wolfv/making-conda-fast-again-4da4debfb3b7) — SAT-solver для conda ,написанный на C++ компанией QuantStack (https://quantstack.net/the-team.html).
conda install -c conda-forge mamba --yes
Далее везде используйте mamba install вместо conda install .
Аргумент -c позволяет указать репозиторий, в котором будет осуществляться поиск. Настоятельнорекомендуется использовать репозиторий conda-forge (https://conda-forge.org), т.к. там почтивсегда можно найти актуальные версии пакетов (чего не скажешь об основном репозитории Anaconda ). Причина в том, что conda-forge управляется сообществом пользователей conda , в то
время как право добавлять пакеты в основной репозиторий имеют только разработчики из Continuum .Устанавливать пакеты из других репозиториев стоит только при необходимости, т.к. это можетпривести к переустановке уже установленных пакетов с их заменой на те версии из репозитория, изкоторого вы хотите что-то установить.
Теперь установим те пакеты, которые вам почти наверное понадобятся при выполнении домашнихзаданий.
mamba install -c conda-forge tmux fish htop curl pip git \
nb_conda jupyter_contrib_nbextensions ipykernel r-irkernel rpy2 \
numpy scipy statsmodels sympy pandas tqdm \
matplotlib seaborn bokeh r-ggplot2 \
joblib dask \
scikit-learn scikit-image scikit-plot \
texlive-core \
--yes
Важное замечание: никогда не смешивайте pip и conda !
Подробное обсуждение этого вопроса можно прочитать на stackoverflow(https://stackoverflow.com/questions/56134588/is-that-a-bad-idea-to-use-conda-and-pip-install-on-the-same-environment). conda и pip были созданы для принципиально разных задач и "не знают" друг о друге:пакеты, которые вы установили через pip , будут видны изнутри conda , так как они ставятсянапрямую в системный Python , но никакой инкапсуляции при этом не получится. Они не будутучитываться conda при разрешении зависимостей, а также могут быть параллельно установленычерез conda в другой версии, что приведёт к странным ошибкам и неизбежному моральному падению.
Более того, даже если вы установите pip через conda , это всё ещё будет не то же самое, чтоустановка пакетов через conda обычным образом. Гарантировать корректное разрешениезависимостей при этом будет нельзя.
fish : make Linux terminal great again!
fish — friendly interactive shell — по праву заслуживает звания " bash двадцать первого века". Он"из коробки" поддерживает подсветку синтаксиса и автодополнение команд. Забудьте те мучительныедни, когда вам приходилось вручную печатать команды! Грамотное использование fish сэкономит вамуйму времени. К тому же, fish , в отличие от конкурентов в духе zsh , прост в использовании итребует минимальных усилий при установке. Кроме того, его можно настраивать через web-интерфейс!Больше можно узнать на официальном сайте (https://fishshell.com) и в блоге на Medium(https://medium.com/better-programming/why-i-use-fish-shell-over-bash-and-zsh-407d23293839). Если вампонравится, на странице репозитория (https://github.com/fish-shell/fish-shell) написано, как заменить bash на fish глобально, на уровне операционной системы.
Мы уже установили fish в прошлом разделе. Он доступен изнутри нашего conda environment . Теперь установите расширение oh-my-fish (https://github.com/oh-my-fish/oh-my-fish) и запустите fish при помощи команды
curl -L https://get.oh-my.fish | fish
Это нужно сделать один раз, чтобы обновить конфигурационный файл fish . При желании, вы можете тонко подстроить fish под свои нужды, но большинству хватает встроенныхвозможностей.
Бэкап conda env и восстанавление окружения из негоТеперь позаботимся о том, чтобы наши усилия не прошли даром — сделаем бэкап! conda позволяет сделать бэкап в форме .yaml -файла. В fish это делается командой
conda env export >(printf (date +"%Y-%m-%d %T mipt-stats.yaml"))
Теперь окружение можно восстановить из бэкапа при помощи команды
conda env create -f environment.yaml
При этом окружение будет загружено в ~/.conda/envs . Если вы хотите установить conda в другую директорию, то укажите её через команду -o :
conda env create -f environment.yaml -o path/to/env
где вместо environment.yaml нужно подставить имя только что созданного .yaml -файла. Хорошая практика — автоматизировать создание бэкапов с помощью системного планировщика (в духе cron ).
Тем не менее, это непросто (https://hackersandslackers.com/conda-environments-and-cron/). Если будетжелание, о тонкостях этого процесса можем рассказать отдельно.
Отлично! Теперь, когда все нужные пакеты установлены и сохранены, вернёмся к обустройству рабочегопространства.
tmux : один терминал — хорошо, сразу два — ещёлучше!
tmux — terminal multiplexer — консольный оконный менеджер и незаменимый инструментразработчика. Он позволяет открыть сразу несколько терминалов на одном экране. Его полезность выпоймёте не сразу, но в работе часто приходится делать несколько вещей одновременно (поднимать jupyter -сервер, следить за нагрузкой с помощью htop / nvidia-smi / tensorboard , писать
скрипты и простые команды в терминале). Без tmux такой режим работы превращается в ад спостоянным переключением вкладок, что вызывает сильную фрустрацию.
Кроме того, важным преимуществом tmux при работе на удалённой машине является тот факт, что онигнорирует сигнал SIGHUP . На практике это означает, что tmux -сессия не умирает, если ваше ssh -соединение обрывается. Вы сможете вернуться и продолжить работать с того же места.
tmux тоже был установлен нами заранее. Чтобы активировать его, напишите в терминале tmux . Поначалу навигация в tmux покажется вам странной но к ней можно привыкнуть (или даже подстроитьпод себя (https://www.hamvocke.com/blog/a-guide-to-customizing-your-tmux-conf/)). С полным списком команд можно ознакомиться здесь (https://tmuxcheatsheet.com). Ниже приведенытолько основные из них.
Ctrl + b + Shift + % — разбить текущее окно на две половины по вертикали.Ctrl + b + Shift + ' — разбить текущее окно на две половины по горизонтали.Ctrl + b + стрелки — переход к соседним окнам. Будьте внимательны: если вы нажмёте на
стрелку слишком быстро, то вы таким образом подвинете окошко в соответствующем направлении.Для того, чтобы перейти, подождите секунду-другую после нажатия Ctrl + b .Ctrl + b + [ — переход в режим с возможностью пролистывать историю терминала. Чтобы
вернуться в режим ввода нажмите q .Для того, чтобы развернуть окно на полный экран, нажмите z . Это самый простой и удобныйспособ копировать и вставлять текст в tmux с помощью привычных Ctrl + Shift + c , Ctrl + Shift + v (попробуйте сделать это без разворачивания окна, поймёте).
Этого достаточно для решения большинства повседневных задач в tmux .
cookiecutter : создаём проекты по ГОСТу
Понимание того, что структура проекта имеет значение, приходит не сразу. Обычно осознание настигаетчерез несколько месяцев работы, когда файлов настолько много, что вы с трудом можете вспомнить, чтогде лежит, но уже поздно что-то менять. Особенно если вы разрабатываете проект не в одиночку.
В рамках нашего курса вам не придётся поддерживать код, но правильные привычки нужновырабатывать сразу. Таким образом, вы точно не растеряетесь на рабочем месте.
cookiecutter — консольная утилита, созданная в рамках инициативы по стандартизации структурыdata-science проектов. С того момента проект разросся, но нас интересует изначальный репозиторий — cookiecutter for datascience (https://github.com/drivendata/cookiecutter-data-science).
Обратите внимание на структуру папок:
Мы настоятельно рекомендуем вам привыкать к ней и стараться оформлять свои практикумысоответственно. Установка cookiecutter тоже происходит через conda :
mamba install -c conda-forge cookiecutter --yes
Создать проект в таком формате можно с помощью команды
cookiecutter https://github.com/drivendata/cookiecutter-data-science
Поначалу вам будут пригождаться только папки notebooks , data , reports , но помните, это ненавсегда.
Что дальше?Мы настроили комфортное окружение для работы в терминале. Тем не менее, этого мало, ведьдомашние задания вы будете делать в jupyter-notebook -ах, которыми тоже надо уметьпользоваться с умом. Именно об этом будет наше следующий документ, где мы:
разберёмся с т.н. jupyter magics и овладеем настоящей магией jupyter ;поставим полезные плагины через jupyter_contrib_nbextensions ;научимся присылать себе уведомления о том, что наша ячейка с кодом досчиталась, в браузер;поймём, как выполнять ячейки с кодом асинхронно;разберёмся, как красиво отображать питоновские объекты;научимся подставлять вычисленные на лету значения переменных в markdown -клетки с текстом;и многое-многое другое!
Stay tuned, будет интересно!
P.S.Если вас заинтересовали темы этого ноутбука, советую приобщиться к курсу "Управлениевычислениями" на Stepik (https://stepik.org/course/1612/promo). Темы курса охватывают как наш материал, так и более продвинутые вещи в духе snakemake(https://snakemake.readthedocs.io/en/stable/) — аналога cmake для автоматизации пайплайнов с ихавтоматическим распараллеливанием. По этой теме ещё очень советую посмотреть лекцию создателяsnakemake (https://www.youtube.com/watch?v=hPrXcUUp70Y).
Статистика, прикладной поток 2019
https://mipt-stats.gitlab.io/ (https://mipt-stats.gitlab.io/)