🔬

Введение. Для кого и зачем.

Этот пост написан, прежде всего, для моих студентов 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
  1. PROFIT!!!11! Открываем получившийся файл в браузере без интернета (могут быть кеки со шрифтами, если их нет в системе - особенно актуально для кириллических шрифтов)

Некоторые hotkeys, shortcuts, комбинации клавиш

  • space, n - следующий слайд
  • esc - overview всей презентации
  • home - возврат к первому слайду
  • end - последний слайд
  • f - полный экран
  • b, . - заныкать презентацию
  • ? - шпаргалка по этому разделу

Что то я не придумал чего бы еще сюда добавить 🤔 . Пишите мне в телегу, если Вас интересуют какие то вопросы по теме или Вы нашли опечатку.