Введение. Для кого и зачем.
Этот пост написан, прежде всего, для моих студентов 3го курса ФУПМ МФТИ с целью предоставить всем равные возможности для изучения курса по методам оптимизации в весеннем семестре, так как он предполагает интенсивную практическую работу с языком Python. В то же время, данный материал может быть полезен многим студентам младших курсов, желающих почувствовать себя властелинами вычислительной математики легко и играючи. Буду невероятно рад дополнениям, исправлениям, хинтам и замечаниям. Материал может быть полезен новичкам и практически бесполезен для тех, кто уже шарит во всех тулзах, перечисленных ниже в содержании.
Среди корыстных интересов я бы выделил желание систематизировать накопленный опыт и материалы, а так же интерес проверить срок годности данного поста, так как computer science развивается (и еще долго будет развиваться) такими темпами, что большинство практических советов и лайфхаков в этой области имеют весьма существенный шанс стать безбожно устарелыми уже через год (true story, покажите мне мануал по TensorFlow годовой (upd: полуторагодовой) давности - код из него с высокой вероятностью не скомпилируется). Это, кстати, весьма странная ситуация - вычислительные тулзы стали настолько удобными и приятными, что возникает огромное желание в них закопаться, в то время как очевидна необходимость изучать фундаментальные разделы этой науки - они с бОльшей вероятностью останутся актуальны к тому моменту, как студент получит образование. Ладно, я ушел в оффтоп, погнали! Как это обычно бывает, этот пост я начал писать зимой, а закончил летом, но лучше поздно. Некоторые комментарии я буду писать курсивом. Интересно, что часть информации, написанной зимой летом уже частично устарела :)
Как делать научные вычисления
Для начала необходимо установить среду, в которой Вы проведете самые лучшие и счастливые годы Вашей жизни. Конечно, мы говорим о Jupyter Notebook. Вообще говоря, Jupyter - это мощнейший инструмент кроссплатформенной разработки, поддерживающий более 40 языков программирования, в числе которых Python, R и даже Matlab! Тем не менее, языком, на котором фокусируется данное повествование, будет именно Python 3.
Jupyter
Нужно тыкнуть на страницу скачивания и выбрать третий Python.
Итак, Вы установили Python, Jupyter и еще много всякого. Как же запускать jupyter notebook без боли в произвольной папке?
Как быстро запускать jupyter notebook
Достаточно создать исполняемый скрипт, запускаемый двойным нажатием со следующим содержанием:
jupyter notebook --notebook-dir='C:\\Users\\bratishka\\Desired_folder'
В Windows это будет файл с расширением .bat
, в Linux .sh
, который можно редактировать с помощью любого текстового редактора (например, моего любимого sublime). Обратите внимание на то, что бэкслэши в примере двойные - это сделано, чтобы избежать проблем с кодировками (иногда, например, \U
в адресе папки может сильно подпортить Вам жизнь:) )
Запуск тетрадок онлайн
Прежде всего, существует (upd: уже не совсем. Теперь сразу происходит запуск контейнера на binder, см.ниже, но ссылка должна редиректить правильно) официальный сервис try.jupyter.org. Туда можно загрузить и скомпилировать несложный ноутбук. Следует быть аккуратным, ведь виртуальный сервер, который Вам выделяется при запуске кекается падает через 10 минут бездействия. Данная опция подходит прежде всего в том случае, когда Вам нужно быстро собрать что то на коленке (или даже в дороге!) или возникли неожиданные проблемы с компьютером.
Существуют так же более солидные сервисы для работы онлайн с ноутбуками, предоставляющие облачные сервера и возможность совместной работы над проектами.
- Colab От Google - этот инструмент хотелось бы особенно выделить. Дело в том, что зимой гугл запустил аттракцион невиданной щедрости, выдавая каждому пользователю в пользование GPU Tesla K80 бесплатно. Есть доступ к UNIX консоли, можно ставить либы с гитхаба, вобщем, все более менее вкусно. Здесь можно прочитать подробнее про то, как использовать локальные файлы (библиотеки, датасеты).
- notebooks.azure.com
- cocalc.com
Рендеринг готовых тетрадок и презентаций онлайн
Сервис nbviewer.jupyter.org умеет отображать ноутбуки загруженные в Ваш личный аккаунт на гитхабе. Пример тетрадки можно найти здесь. Так же, рендерятся презентации (пример), для их запуска нужно нажать значок подарка:
Расшарить свой проект с возможностью запуска кода
Вершиной повторяемых вычислений на сегодняшний день является возможность выложить весь свой проект в интернет и сделать его запускаемо-кликабельным с ядром, которое работает где то в облаке. Это гарантирует повторяемость полученных Вами результатов, снимая их зависимость от железа и установленных на Вашей вычислительной станции библиотек. Представьте, что Вам не нужно больше скачивать необходимое ПО и пакеты, Вам нужно нажать всего одну кнопку. Эта штука называется binder:
Binder гарантирует Вам 1Гб оперативной памяти (может быть и больше, но ограничение сверху - 4Гб), относительно небольшие вычислительные ресурсы, а так же запрет внешних сетевых подключений. Кроме того, сервер так же выключается после 10 минут бездействия (открытое окно в браузере считается не бездействием). На сайте хорошая документация (для того, чтобы выложить интерактивную запускаемую тетрадку - даже мануала читать не нужно. Выложить ее на гитхаб, указать ссылку и получить рабочую кнопку) .
Впрочем, если Вы занимаетесь вычислительно интенсивной работой (например, DEEP MACHINE LEARNING), binder Вам не подойдет, поскольку его вычислительных мощностей часто катастрофически не хватает для современных реальных задач (нас спасет docker - см. ниже). В то же время, никто не мешает оформить там проект по вычматам или лабы и выложить у себя на гитхабе. Вот, например, проект с анализом данных, полученных с детектора гравитационных волн LIGO.
Запуск ядра jupyter на стороннем сервере в один клик
Предположим, у Вас имеется лабораторный сервер, на котором Вам можно проводить вычисления и у Вас есть собственный юзер на нем. Во первых, мы предполагаем, что Вы с ним находитесь в одной локальной сети (иначе может быть нужно настроить ВПН). Во вторых, способ, который я сейчас напишу совсем несекьюрный :name_badge: и пользоваться им не надо. Однако, если Вам пофиг Вы уверены в том, что злоумышленников Вы не интересуете, вот он для винды: * На серваке поднимаете крутиться ядро jupyter так, чтобы оно не зависело от наличия подключения (чтобы, например, ночью ставить вычисления). Это можно делать с помощью эмуляторов терминала (tmux
или screen
) или с помощью docker
. Ниже опишу первый способ. Заходите в терминал Вашего сервачка и пишите:
tmux
Затем:
jupyter notebook --no-browser --port=8860
Поздравляю, этот сервер будет крутиться до посинения, пока Вы не зайдете обратно в эмулятор терминала (tmux a -t 0
) и не выключите его (это иногда стоит делать, потому что юпитер имеет свойство сжирать много памяти и не переживать об этом - коллеги спасибо не скажут).
- Создаете
.bat
файл со следующим содержанием на своем рабочем столе (к этому моменту у Вас уже установлена Putty, которая Вам точно нужна, если Вы любите Windows). Напишите там следующие 2 строчки и запускайте потом по двойному клику!
start "" "C:\Program Files\PuTTY\putty.exe" -ssh -N USERNAME@SERVERIP -pw PASSWORD -L 127.0.0.1:8860:SERVERIP:8860
start http://127.0.0.1:8860
- Вы прекрасны!
Python
Осваиваем python
Шикарнейший курс по Python для начинающих. Люди, знакомые с программированием еще со школы, но не знающие языка так же найдут этот курс полезным, хотя и пройдут его быстрее. Топ курс от яндекса, иллюстрирующий работу некоторыми конкретными библиотеками для научных вычислений. Мне кажется очень важным учить язык не с точки зрения “stackverflow-driven development”, а потратить сначала какое - то время на широкое его понимание в купе с упражнениями. Для тех, кто хочет вкурить ООП в python и чуть более полезные тонкости - многие рекомендуют этот курс.
Библиотеки python
Большая часть полезности языка программирования реализуется через крутые библиотеки, написанные для него. Здесь я бы хотел осветить некоторые наиболее полезные, на мой взгляд, библиотеки, которые могут пригодиться будущему ученому. По большому счету, каждой из них можно посвятить отдельный пост, поэтому я вкратце опишу их предназначение, ссылку на официальный мануал и, быть может, еще что нибудь.
numpy
Библиотека для эффективной работы с многомерными массивами. Преобразование Фурье, матричные преобразования, разложения - туда же. Значительная часть функций библиотеки реализована на C, засчет чего библиотека работает достаточно эффективно. Tutorial по ссылке, однако данная библиотека является стандартом де-факто на сегодняшний день и очень тяжело придумать проблему, которую в numpy нельзя решить путем не очень активного гугления.
matplotlib
Библиотека для построения графиков. Здесь алгоритм простой: заходите на сайт, тыкаете на пример, который больше всего похож на тот, что у Вас в голове, копипасите код и доводите до блеска. Приведу лишь парочку трюков:
# Если вставить вот такую строчку перед рисованием графиков,
# они будут отрисовываться в стиле комиксов
import matplotlib.pyplot as pltplt.xkcd()
# А если вставить такую строчку перед рисованием графиков,# они будут отрисовываться в другом стиле.
import seaborn
Вообще говоря, seaborn - это отдельная библиотека, которая работает в тесной связке с matplotlib, но имеет много своих фишечек.
Особенно хотелось бы выделить интерактивный режим работы с графиками в jupyter notebook. Если в начале ячейки прописать:
%matplotlib notebook
То будут доступны прикольные штуки, типа интерактивного зума в выделенное окно, изменение размера фигуры и прочее:
Из минусов: рендеринг очень медленный (особенно, если график “тяжелый”), иногда глючит (особенно, если менять бекенд для отрисовки графиков в работающем ядре - т.е. если сначала у вас было %matplotlib inline
, то после замены на %matplotlib notebook
может кекнуться - решается перезапуском Kernel). Для интерактивных графиков можно так же использовать библиотеки bokeh (демка, иллюстрирующая работу bokeh на IMDB) и plot.ly (если разобраться в документации, ее вполне себе можно использовать бесплатно, вот средненький пример)
pandas
Библиотека для работы с массивами данных. Позволяет легко расправляться с датасетами, представленных в виде таблиц (.csv
, .txt
и прочие). Идеально подходит, если у Вас есть табличка с данными (например, Excel табличка с лабы) и Вам нужно быстро понять, например, среднее значение по какому нибудь из столбцов или заменить все значения в таблице меньше 3 на нули. Десятиминутное введение есть на официальном сайте.
scikitlearn
Библиотека для машинного обучения. Каждый уважающий себя MACHINE_LEARNER проходил через эту библиотеку. Здесь есть очень много вкусностей - эффективная реализация огромного количества базовых алгоритмов, удобная загрузка классических датасетов, отличная документация и ссылки на статьи, на основе которых реализованы алгоритмы. Совместима с numpy, matplotlib, scipy.
sympy
Библиотека символьных вычислений. Эта штука умеет считать символьные производные, сравнивать формульные выражения и даже интегрировать. Опять же, небольшой туториал на сайте.
cython
Позволяет ускорять какие-то куски кода с помощью старого доброго C
. Не совсем библиотека, но
прочее
Не забывать:
import this
Быстрое и честное умножение матриц (в т.ч. векторов):
A @ B
Git
Представьте, что Вам нужно сделать проект, который в процессе его создания будет нужен кому-то, кроме Вас (например, Вы делаете диплом, а научный руководитель будет не против видеть ежедневный маленький прогресс, писать свои комментарии, а, быть может, и куски кода). В зависимости от сложности проекта, существует много решений: папка в облаке, сервис таск менеджмента типа trello
и т.д. Совершенно особое место в этой группе занимает система контроля версий git
- она не очень интуитивно понятна для человека, не занимавшегося разработкой ранее, но это та вещь, от которой не получится убежать в процессе своего развития. То есть, если Вы очень долго говорите что то в стиле “ну хз, гит не для меня, мне и папочки
хватает”, то рядом с Вами окажется туча людей, с которыми будет в тысячу раз удобнее работать (они-то знают гит), чем с Вами.
К тому же, когда есть такие туториалы, то всё это достаточно быстро имеет риск стать понятным и удобным для Вас без особых боев. Я бы рекомендовал следующую последовательность действий для того, чтобы увеличить свою ценность на рынке труда :zap: :
- Прочитайте внимательно вот это введение в систему гит, команды оттуда пока можно не исполнять, но прочитать можно несколько раз. Попробуйте прочувствовать что такое коммит, бранч, репозиторий. Посмотрите сюда.
-
Для начала можно скачать любой GUI, который упростит Вашу работу с несколькими репозиториями. Я рекомендую GitKraken - он бесплатный для некоммерческого использования, симпатичный, удобный, поддерживает разные удаленные репозитории типа github, bitbucket, gitlab.
- Зарегистрируйте аккаунт на каком-нибудь сервисе удаленных репозиториев - github (приватные репозитории только у про аккаунта), bitbucket(приватные репозитории есть у всех бесплатно), gitlab (тоже есть приватные репозитории + он няшный). На гитхабе студенческие аккаунты дают Вам приватные репозитории -> регистрируем на почту
@skoltech.ru
,@phystech.edu
- обе эти почты прекрасно идут за студенческие и просим Pro фичи. - И вот, у Вас уже есть аккаунт и настроенный гит на Вашем компе. Теперь имеет смысл поиграться здесь.
- После этого рекомендуется придумать проект, который Вы будете делать в гите. Это может быть бакалаврский или магистерский диплом, проект по методам оптимизации, по информатике, коллективный сборник мемов или что Вам угодно. И долбитесь с ним! 📀 P.S. вариантов реально много, например - этот сайт написан с помощью системы
git
, а хостится бесплатно на гитхабе.
Docker
Docker
- это относительно новый и достаточно модный инструмент, позволяющий Вам упаковать все зависимости и конкретные пакеты, которые нужны для Вашего проекта в один файл так, чтобы это можно было запустить на абсолютно любом железе с установленным docker
. Дальше много сайтов врут о том, что докер в тысячу раз быстрее виртуальных машин (хотя многие процессоры уже имеют инструкции для виртуализации, а хороший софт это уже давно использует - нельзя говорить о том, что это “гигантский скачок в скорости”), описывают их различия и т.д. Так как полноценное введение в docker
достойно отдельного большого поста, я здесь напишу кратко:
Материалы
- Мне понравилось вот это введение в дело на youtube.
- Немного интерактива и онлайн урок на stepik по docker.
- На хабре есть: материал о том, какая боль заставляет прийти к докеру, вот такой интерактив и вот такой набор ссылок.
Осторожно
- Почти на всех конференциях по
docker
обращают внимание на необходимость оценить масштаб проекта и целесообразность внедрения докера. Скажем, для моего маленького сайта это кажется бесполезным. - Если на общем вычислительном сервере Вашей научной группы много человек, которые пользуются
docker
- имейте ввиду, что каждый из них при ипользовании получаетroot
права в рамках своего контейнера. Однако, система неидеальна и человек с такими правами можеткекнуть сервакудалить все файлы на общем сервере (знаменитоеrm -rf *
при небольшой сноровке может сработать - не буду писать как, скажу лишь, что я был свидетелем такой ситуации на одном общем серваке).
Как оформлять научные вычисления
Markdown
Не секрет, что я - ярый фанат $ \LaTeX $, о чем свидетельствуют мои периодические лекции по нему. Однако, хочу подчеркнуть, что в этой секции поста я поставил выше именно markdown
. Это еще один подход к оформлению Ваших мыслей. Вообще, markdown
- это язык разметки текста, созданный программистами для быстрого и удобного базового форматирования текста. Ключевые фишки следующие:
- Базовое форматирование текста, типа жирного, курсива,
моноширинного
, mathJax формул $ e^{i \pi} + 1 = 0 $,зачеркнутогои т.п. Вот краткая шпаргалка. - Весь этот пост написан с помощью
markdown
. markdown
сильно легче с точки зрения освоения и установки- В то же время, потенциальное разнообразие текстов, которые Вы сможете набрать в простеньком маркдаун редакторе не идет ни в какое сравнение с тем, что может $\LaTeX$ (однако, в большинстве случаев Вам нужно набрать листочек со списками, пару формул и emoji 🤔)
- Благодаря простоте языка, он таки завоевал популярность, и теперь сама разметка используется повсеместно - telegram, описание readme на github, jupyter notebook другие IT продукты
Q: Как поставить **markdown**
и начать в нем писать?
A: Скачать typora и начать писать какую нибудь домашку или текст.
Q: Ну и че на выходе получается?
A: Файл .md
, который, в свою очередь, прекрасно сохраняется в .pdf
, .html
, .doc
, .tex
и почти во что угодно.
Q: А если я хочу другой шрифт и чтоб красненьким?
A: Не вопрос, поддерживаются .css
стили.
Q: В каких случаях ты предпочтешь **markdown**
латеху?
A: Когда
- нужно набросать черновик с какой то математической идеей
- нужно набросать семинар или лекцию, которую одинаково просто можно выкладывать в интернет и как файл
- нужно набросать какой то регулярный еженедельный отчет научруку
- сложность текста, который предстоит набрать не подразумевает сложных колонтитулов, сносок, работу с источниками
Q: А есть инструменты для совместной работы?
А: Их много, например вот.
$ \LaTeX $
Про $ \LaTeX $ сейчас материалов на русском и английском невероятно много. Просто неприлично сегодня учиться в хорошем институте и не уметь в этот язык. Самое лучшее введение, которое я сейчас знаю для спокойного освоения дома - видео моего хорошего друга Сергея Жесткова.
Введение, установка, создание Вашего первого документа и математика:
Структура документа и более сложные формулы:
Картинки и таблицы в латех, ссылки:
От себя добавлю следующие ресурсы:
- Detexify - Сервис, позволяющий вспомнить, как в латехе написать какой то специфичный символ, нарисовав его в окошке.
- Генератор Таблиц - вообще единственная штука, которую я использую для вставки таблиц в латехе. Рекомендую переключить с
Default table style
наBooktabs table style
. Выглядит няшно. - Хороший труд Воронцова, который можно использовать как шпаргалку.
nbconvert
Часто возникает ситуация сохранить то, что Вы написали в jupyter notebook
как самостоятельный файл, доступный без поднятия сервера jupyter
. Например, Вы написали семинар, в котором есть код, результаты его работы, немного формул и хотите его распространить. На помощь придет [nbconvert](https://github.com/jupyter/nbconvert)
. Если Вы скачали anaconda, этот пакет уже должен быть включен в Ваш набор. Ниже я приведу конкретные ситуации когда он может быть полезен:
Сконвертировать jupyter notebook в .html
:
jupyter nbconvert my_cool_notebook.ipynb
.html
является дефолтным форматом. Самым же простым способом сохранить Ваш jupyter notebook в .pdf
формат будет банальное сохранение полученного .html
файла в .pdf
(печать страницы) - это не потребует от Вас никаких телодвижений и сойдет в большинстве случаев.
Сконвертировать jupyter notebook в .pdf
красиво (.ipynb
→ .tex
→ .pdf
):
jupyter nbconvert --to pdf my_cool_notebook.ipynb
Конечно, не все так просто. Во первых, на компьютере должен быть установлен $ \TeX $. Если его (на каком-то основании) не имеется - см.выше или сюда. Во вторых, у Вас почти наверное будут проблемы с русским языком. Дело в том, что шаблоны, по которым nbconvert
конвертит это дело в .tex
файл ничего не знают о том, что Вам нужен русский, или о том, что Вам нужен другой шрифт, или еще о чем то (например, мне было нужно, чтобы input ячейки с кодом не выводились в .pdf
файл). Для решения этих проблем Вам нужно зайти в папку с библиотекой с шаблонами nbconvert
. У меня такая:
C:\Users\MYNENAVIDIMTEBYATRUMP\Anaconda3\Lib\site-packages\nbconvert\templates\latex
И заменить Ваш файл base.tplx
на мой:)
Что есть:
- Поддержка кириллицы и латиницы одинаковым шрифтом
- Скрыты все ячейки с кодом, оставлены только output. (чтобы включить input конкретной ячейки или выключить её output в
.pdf
необходимо в метаданных ячейки прописать следующее:
{
"tags": [
"jupyter:stay_input", # Оставить эту строчку, если хотите оставить input ячейки
"jupyter:hide_output" # Скрыть output ячейки
]
}
Для того, чтобы изменения вступили в силу при печати пдфки, ячейку надо запустить. * Картинки, которые выводятся matplotlibом вставляются в pdfку без проблем
Чего не хватает:
- Обычные локальные картинки вставляются не очень (потому что латех запускается не совсем локально в папке ядры юпитера, а немножко случайно)
- Замутить более простой способ кастомизировать вывод и не вывод ячеек в pdf. Вроде есть, но у меня через раз работает.
Презентации в jupyter - RISE
Презентации, сделанные прямо в jupyter - невероятно удобная и структурирующая штука. Здесь вся документация, установка, примеры и т.д. От себя, опять же, добавлю некоторые фишечки.
Jupyter презентация оффлайн
Для того, чтобы сохранить то, что Вы сделали, например, для показа позже без интернета надо проделать следующие манипуляции: 1. Скачать библиотеку reveal.js
для рендеринга слайдов. Сделать это можно с официального сайта, или с этого прекрасного сайта. После распаковки архива получится папочка reveal.js
с файлами. 2. Запустить nbconvert
явно указав, что библиотеку reveal.js
надо брать локально, а не в интернете ключом -reveal-prefix=PATHTOREVEAL.js
. У меня, например, папка reveal.js
находится на уровень выше папки с jupyter ноутбуком:
jupyter nbconvert --to slides MEGA_PRESENTATION.ipynb --reveal-prefix = ../reveal.js
PROFIT!!!11!Открываем получившийся файл в браузере без интернета (могут быть кеки со шрифтами, если их нет в системе - особенно актуально для кириллических шрифтов)
Некоторые hotkeys, shortcuts, комбинации клавиш
space
,n
- следующий слайдesc
- overview всей презентацииhome
- возврат к первому слайдуend
- последний слайдf
- полный экранb
,.
- заныкать презентацию?
- шпаргалка по этому разделу
Что то я не придумал чего бы еще сюда добавить 🤔 . Пишите мне в телегу, если Вас интересуют какие то вопросы по теме или Вы нашли опечатку.