Запускаем Jupyter на арбіту LXD

Ці даводзілася вам эксперыментаваць з кодам або сістэмнымі ўтылітамі ў Linux так, каб не трэсціся за базавую сістэму і не знесці ўсё з вантробамі ў выпадку памылкі кода які павінен запусціцца з root-прывілеямі?

А як на рахунак таго, што дапушчальны, неабходна пратэставаць ці запусціць цэлы кластар разнастайных мікрасэрвісаў на адной машыне? Сотню ці нават тысячу?

З віртуальнымі машынамі кіраваныя гіпервізарам такія задачы вырашыць можа і атрымаецца, але якім коштам? Напрыклад, кантэйнер у LXD на базе дыстрыбутыва Alpine Linux мінімальна спажывае за ўсё 7.60MB АЗП, і дзе каранёвая частка пасля запуску займае 9.5MB! Як табе такое, Ілон Маск? Рэкамендую азнаёміцца ​​з базавымі магчымасцямі LXD - сістэмы кантэйнераў у Linux

Пасля таго, як у цэлым стала ясна, што такое кантэйнеры LXD, пойдзем далей і падумаем, а што, калі б была такая платформа-камбайн, дзе можна было б бяспечна запускаць код для хаста, генераваць графікі, дынамічна (інтэрактыўна) злучаць UI- фішкі з тваім кодам, дапаўняць код тэкстам з блэкджэкам… фарматаваннем? Нешта тыпу інтэрактыўнага блога? Вауу… Хачу! Жадаю! 🙂

Зазірай пад кат дзе мы запусцім у кантэйнеры лабараторыя Юпітэра - наступнай генерацыі карыстацкага інтэрфейсу замест састарэлага Jupyter Notebook, а таксама ўсталюем такія модулі Python як numpy, Панды, matplotlib, IPyWidgets якія дазволяць вытвараць усё пералічанае вышэй і захоўваць гэта ўсё ў адмысловым файле - IPython-наўтбуку.

Запускаем Jupyter на арбіту LXD

План узлёту на арбіту ^

Запускаем Jupyter на арбіту LXD

Накідаем кароткі план дзеянняў, каб нам было прасцей рэалізаваць схему вышэй:

  • Усталюем і запусцім кантэйнер на базе дыстрыбутыва Alpine Linux. Мы будзем выкарыстоўваць гэты дыстрыбутыў бо ён накіраваны на мінімалістычнасць і ўсталюем у яго толькі самы неабходны софт, нічога лішняга.
  • Дадамо дадатковы віртуальны дыск у кантэйнеры якому задамо імя hostfs і змантаваны да каранёвай ФС. Гэты дыск дасць магчымасць выкарыстоўваць файлы на хасце з зададзенага каталога ўнутры кантэйнера. Тым самым дадзеныя будуць у нас незалежныя ад кантэйнера. У выпадку выдалення кантэйнера, дадзеныя застануцца на хасце. Таксама, гэтая схема карысная для падзелу адных дадзеных паміж шматлікімі кантэйнерамі не выкарыстоўваючы штатныя сеткавыя механізмы дыстрыбутыва кантэйнера.
  • Усталюем Bash, sudo, неабходныя бібліятэкі, дадамо і наладзім сістэмнага карыстальніка
  • Усталюем Python, модулі і скампілюем для іх бінарныя залежнасці
  • Усталюем і запусцім лабараторыя Юпітэра, наладзім вонкавы выгляд, усталюем пашырэнні для яго.

У гэтым артыкуле мы з вамі пачнем з запуску кантэйнера, не будзем разглядаць усталёўку і наладу LXD, усё гэта вы можаце знайсці ў іншым артыкуле — Базавыя магчымасці LXD - сістэмы кантэйнераў у Linux.

Устаноўка і настройка базавай сістэмы ^

Ствараем кантэйнер камандай у якой паказваем вобраз - alpine3, ідэнтыфікатар для кантэйнера jupyterlab і пры неабходнасці профілі канфігурацыі:

lxc init alpine3 jupyterlab --profile=default --profile=hddroot

Тут я выкарыстоўваю профіль канфігурацыі hddroot які паказвае стварыць кантэйнер з root-часткай у Басейн захоўвання размешчаным на фізічным HDD дыску:

lxc profile show hddroot

config: {}
description: ""
devices:
  root:
    path: /
    pool: hddpool
    type: disk
name: hddroot
used_by: []
lxc storage show hddpool

config:
  size: 10GB
  source: /dev/loop1
  volatile.initial_source: /dev/loop1
description: ""
name: hddpool
driver: btrfs
used_by:
- /1.0/images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
- /1.0/profiles/hddroot
status: Created
locations:
- none

Гэта дае мне магчымасць эксперыментаваць з кантэйнерамі на HDD дыску эканомячы рэсурсы SSD дыска які таксама маецца ў маёй сістэме 🙂 для якога ў мяне створаны асобны профіль канфігурацыі ssdroot.

Пасля стварэння кантэйнера ён знаходзіцца ў стане STOPPED, таму нам трэба яго стартануць запусціўшы ў ім init-сістэму:

lxc start jupyterlab

Вывядзем спіс кантэйнераў у LXD выкарыстоўваючы ключ -c які паказвае якія columns вывесці на экран:

lxc list -c ns4b
+------------+---------+-------------------+--------------+
|    NAME    |  STATE  |       IPV4        | STORAGE POOL |
+------------+---------+-------------------+--------------+
| jupyterlab | RUNNING | 10.0.5.198 (eth0) | hddpool      |
+------------+---------+-------------------+--------------+

Пры стварэнні кантэйнера IP адрас абраўся выпадковым чынам, бо мы выкарыстоўвалі профіль канфігурацыі. default які быў раней сканфігураваны ў артыкуле Базавыя магчымасці LXD - сістэмы кантэйнераў у Linux.

Мы памяняем гэты IP адрас на больш запамінальны, стварыўшы сеткавы інтэрфейс на ўзроўні кантэйнера, а не на ўзроўні профіля канфігурацыі як гэта цяпер у бягучай канфігурацыі. Гэта не абавязкова рабіць, вы можаце прапусціць гэта.

Ствараем сеткавы інтэрфейс eth0 які лінцуем з камутатарам (сеткавым мастом) lxdbr0 у якім мы ўключылі NAT па мінулым артыкуле і кантэйнеру зараз будзе доступ у Інтэрнэт, а таксама інтэрфейсу прызначаем статычны IP адрас 10.0.5.5:

lxc config device add jupyterlab eth0 nic name=eth0 nictype=bridged parent=lxdbr0 ipv4.address=10.0.5.5

Пасля дадання прылады, кантэйнер неабходна перазагрузіць:

lxc restart jupyterlab

Правяраем статут кантэйнера:

lxc list -c ns4b
+------------+---------+------------------+--------------+
|    NAME    |  STATE  |       IPV4       | STORAGE POOL |
+------------+---------+------------------+--------------+
| jupyterlab | RUNNING | 10.0.5.5 (eth0)  | hddpool      |
+------------+---------+------------------+--------------+

Ўстаноўка базавага софту і настройка сістэмы ^

Для адміністравання нашага кантэйнера неабходна ўсталяваць наступны софт:

пакет
Апісанне

біць
The GNU Bourne Again shell

bash-завяршэнне
Programmable completion for bash shell

Sudo
Give certain users ability to run some commands as root

цень
Password and account management tool suite with support for shadow files and PAM

тздата
Sources for time zone and daylight saving time data

нана
Pico editor clone with enhancements

Дадаткова, вы можаце ўсталяваць падтрымку ў сістэме man-pages, усталяваўшы наступныя пакеты. man man-pages mdocml-apropos less

lxc exec jupyterlab -- apk add bash bash-completion sudo shadow tzdata nano

Разбярэм каманды і ключы які мы выкарыстоўвалі:

  • lxc - Выклік кліента LXD
  • exec - Метад кліента LXD, які запускае каманду ў кантэйнеры
  • jupyterlab - Ідэнтыфікатар кантэйнера
  • -- - Спецыяльны ключ, які паказвае не інтэрпрэтаваць далей ключы як ключы для lxc і перадаць увесь астатні радок як ёсць у кантэйнер
  • apk - Пакетны менеджэр дыстрыбутыва Alpine Linux
  • add - Метад пакетнага мэнэджара які ўсталеўвае паказаныя пасля каманды пакеты

Далей, усталюем у сістэме тайм-зону Europe/Moscow:

lxc exec jupyterlab -- cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Пасля ўстаноўкі тайм-зоны, пакет tzdata у сістэме больш не патрэбен, ён будзе займаць месца, таму, выдалім яго:

lxc exec jupyterlab -- apk del tzdata

Правяраем тайм-зону:

lxc exec jupyterlab -- date

Wed Apr 15 10:49:56 MSK 2020

Каб не марнаваць шмат часу на наладу Bash для новых карыстачоў у кантэйнеры, наступнымі дзеяннямі, мы скапіюем у яго з хаставой сістэмы ўжо гатовыя skel-файлы. Гэта дазволіць перафарбаваць Bash у кантэйнеры ў інтрактыўным рэжыме. У мяне хаставая сістэма - Manjaro Linux і капіюемыя файлы /etc/skel/.bash_profile, /etc/skel/.bashrc, /etc/skel/.dir_colors у прынцыпе падыходзяць да Alpine Linux і крытычных праблем не выклікаюць, але ў вас гэта можа быць іншы дыстрыбутыў і вам трэба самастойна разабрацца ў выпадку памылкі запускае Bash ў кантэйнеры.

Капіяваны skel-файлы ў кантэйнер. Ключ --create-dirs створыць неабходныя дырэкторыі, калі яны не існуюць:

lxc file push /etc/skel/.bash_profile jupyterlab/etc/skel/.bash_profile --create-dirs
lxc file push /etc/skel/.bashrc jupyterlab/etc/skel/.bashrc
lxc file push /etc/skel/.dir_colors jupyterlab/etc/skel/.dir_colors

Для ўжо існага root-карыстача скапіюем у хатнюю дырэкторыю толькі што скапіяваныя ў кантэйнер skel-файлы:

lxc exec jupyterlab -- cp /etc/skel/.bash_profile /root/.bash_profile
lxc exec jupyterlab -- cp /etc/skel/.bashrc /root/.bashrc
lxc exec jupyterlab -- cp /etc/skel/.dir_colors /root/.dir_colors

У Alpine Linux для карыстачоў усталёўваецца сістэмная абалонка /bin/sh, мы заменім яе ў root карыстальніка на Bash:

lxc exec jupyterlab -- usermod --shell=/bin/bash root

Каб root карыстач не быў беспарольным, яму трэба ўсталяваць пароль. Наступная каманда згенеруе і ўсталюе яму новы выпадковы пароль які вы ўбачыце на экране кансолі пасля яе выканання:

lxc exec jupyterlab -- /bin/bash -c "PASSWD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12); echo "root:$PASSWD" | chpasswd && echo "New Password: $PASSWD""

New Password: sFiXEvBswuWA

Таксама, створым новага сістэмнага карыстальніка - jupyter для якога пазней настроім лабараторыя Юпітэра:

lxc exec jupyterlab -- useradd --create-home --shell=/bin/bash jupyter

Які згенеруецца і ўсталюем яму пароль:

lxc exec jupyterlab -- /bin/bash -c "PASSWD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12); echo "jupyter:$PASSWD" | chpasswd && echo "New Password: $PASSWD""

New Password: ZIcbzWrF8tki

Далей выканаем дзве каманды, першая створыць сістэмную групу sudo, а другая дадасць у яе карыстальніка jupyter:

lxc exec jupyterlab -- groupadd --system sudo
lxc exec jupyterlab -- groupmems --group sudo --add jupyter

Прагледзім, у якія групы ўваходзіць карыстач jupyter:

lxc exec jupyterlab -- id -Gn jupyter

jupyter sudo

Усё - ок, рухаемся далей.

Дазволім усім карыстальнікам якія ўваходзяць у групу sudo выкарыстоўваць каманду sudo. Для гэтага выканайце наступны скрыпт, дзе sed раскаментуе радок параметру ў канфігурацыйным файле /etc/sudoers:

lxc exec jupyterlab -- /bin/bash -c "sed --in-place -e '/^#[ t]*%sudo[ t]*ALL=(ALL)[ t]*ALL$/ s/^[# ]*//' /etc/sudoers"

Ўстаноўка і настройка JupyterLab ^

лабараторыя Юпітэра - гэта Python дадатак, таму мы павінны перш усталяваць гэты інтэрпрэтатар. Таксама, лабараторыя Юпітэра мы будзем усталёўваць з дапамогай пітонаўскага пакетнага мэнэджара pip, а не сістэмнага, таму што ў сістэмным рэпазітары ён можа быць састарэлым, і таму, мы павінны ўручную дазволіць залежнасці для яго усталяваўшы наступныя пакеты python3 python3-dev gcc libc-dev zeromq-dev:

lxc exec jupyterlab -- apk add python3 python3-dev gcc libc-dev zeromq-dev

Абновім python-модулі і пакетны менеджэр pip да актуальнай версіі:

lxc exec jupyterlab -- python3 -m pip install --upgrade pip setuptools wheel

Усталёўваны лабараторыя Юпітэра праз пакетны менеджэр pip:

lxc exec jupyterlab -- python3 -m pip install jupyterlab

Так як пашырэння ў лабараторыя Юпітэра з'яўляюцца эксперыментальнымі і афіцыйна яны не пастаўляюцца разам з jupyterlab пакет, таму мы павінны ўсталяваць і наладзіць гэта ўручную.

Усталюем NodeJS і менеджэр пакетаў для яго – NPM, бо лабараторыя Юпітэра выкарыстоўвае іх для сваіх пашырэнняў:

lxc exec jupyterlab -- apk add nodejs npm

Каб пашырэння для лабараторыя Юпітэра якія мы ўсталюем працавалі, іх трэба ўсталёўваць у карыстацкую дырэкторыю так як прыкладанне будзе запускацца ад карыстальніка jupyter. Праблема ў тым, што няма параметра ў камандзе запуску якой можна перадаць каталог, прыкладанне ўспрымае толькі зменную асяроддзі і таму мы яе павінны вызначыць. Для гэтага, мы прапішам каманду экспарту зменнай JUPYTERLAB_DIR у асяроддзі карыстальніка jupyter, у файл .bashrc, які выконваецца кожны раз пры ўваходзе карыстальніка ў сістэму:

lxc exec jupyterlab -- su -l jupyter -c "echo -e "nexport JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab" >> .bashrc"

Наступнай камандай усталюем спецыяльнае пашырэнне - менеджэр пашырэнняў у лабараторыя Юпітэра:

lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build @jupyter-widgets/jupyterlab-manager"

Цяпер ужо ўсё гатова для першага запуску лабараторыя Юпітэра, але мы можам яшчэ ўсталяваць некалькі карысных пашырэнняў:

  • toc — Table of Contents, генеруе спіс загалоўкаў у артыкуле/наўтбуку
  • jupyterlab-horizon-theme - Тэма афармлення UI
  • jupyterlab_neon_theme - Тэма афармлення UI
  • jupyterlab-ubu-theme - Яшчэ адна тэма афармлення ад аўтара гэтага артыкула 🙂 Але ў гэтым выпадку, будзе паказана ўстаноўка з рэпазітара GitHub

Такім чынам, выканайце паслядоўна наступныя каманды, каб усталяваць гэтыя пашырэнні:

lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build @jupyterlab/toc @mohirio/jupyterlab-horizon-theme @yeebc/jupyterlab_neon_theme"
lxc exec jupyterlab -- su -l jupyter -c "wget -c https://github.com/microcoder/jupyterlab-ubu-theme/archive/master.zip"
lxc exec jupyterlab -- su -l jupyter -c "unzip -q master.zip && rm master.zip"
lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build jupyterlab-ubu-theme-master"
lxc exec jupyterlab -- su -l jupyter -c "rm -r jupyterlab-ubu-theme-master"

Пасля ўсталёўкі пашырэнняў мы павінны іх скампіляваць, бо раней, пры ўсталёўцы паказвалі ключ --no-build для эканоміі часу. Цяпер мы значна паскорымся скампіляваўшы іх разам за адзін раз:

lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter lab build"

Цяпер выканайце наступныя дзве каманды для першага запуску лабараторыя Юпітэра. Можна было б яго запусціць адной камандай, але ў гэтым выпадку, каманда запуску, якую ў розуме праца трымаць, яна будзе запамінацца bash'ем у кантэйнеры, а не на хасце, дзе і так каманд хапае для запісу іх у гісторыю 🙂

Лагін у кантэйнеры як карыстальнік jupyter:

lxc exec jupyterlab -- su -l jupyter

Далей запусціце лабараторыя Юпітэра з ключамі і параметрамі як паказана:

[jupyter@jupyterlab ~]$ jupyter lab --ip=0.0.0.0 --no-browser

Перайдзіце ў web-браўзэры па адрасе http://10.0.5.5:8888 і на старонцы, якая адкрылася, увядзіце знак доступу які вы ўбачыце ў кансолі. Скапіюйце яго і ўстаўце на старонцы, затым націсніце Увайсці. Пасля ўваходу, перайдзіце злева ў меню пашырэнняў, як паказана на малюнку ніжэй, дзе вам прапануюць пры актывацыі мэнэджара пашырэнняў прыняць на сябе рызыкі па бяспецы усталёўваючы пашырэнні ад трэціх асоб за якія каманда JupyterLab development адказнасці не нясе:

Запускаем Jupyter на арбіту LXD

Аднак, мы якраз для гэтага ізалюем цалкам лабараторыя Юпітэра і змяшчаем яго ў кантэйнер, каб іншыя пашырэнні патрабавальныя і выкарыстоўвалыя NodeJS не змаглі прынамсі выкрасці дадзеныя на дыску акрамя тых, якія мы адкрыем усярэдзіне кантэйнера. Дабрацца да вашых прыватных дакументаў на хасце ў /home працэсам з кантэйнера наўрад атрымаецца, а калі і атрымаецца, то на гэта трэба мець прывілеі на файлы ў хаставой сістэме, бо мы запускаем кантэйнер у непрывілеяваным рэжыме. Зыходзячы з гэтай інфармацыі вы можаце ацаніць рызыку ўключэння пашырэнняў у лабараторыя Юпітэра.

Створаныя IPython-наўтбукі (старонкі ў лабараторыя Юпітэра) зараз будуць стварацца ў хатняй дырэкторыі карыстальніка — /home/jupyter, але ў нашых планах падзяліць дадзеныя (расшарыць) паміж хастом і кантэйнерам, таму, вярніцеся ў кансоль і спыніце лабараторыя Юпітэра выканаўшы hotkey - CTRL+C і адказаўшы y на запыт. Затым разарвіце інтэрактыўную сесію карыстальніка jupyter выканаўшы жадай CTRL+D.

Падзяляем дадзеныя з хастом ^

Каб падзяліць дадзеныя з хастом, трэба стварыць у кантэйнеры такую ​​прыладу, якое гэта дазваляе рабіць і для гэтага выканайце наступную каманду дзе мы паказваем наступныя ключы:

  • lxc config device add - Каманда дадае канфігурацыю прылады
  • jupyter - Ідэнтыфікатар кантэйнера ў які дадаецца канфігурацыя
  • hostfs - Ідэнтыфікатар прылады. Вы можаце задаць любое імя.
  • disk - Указваецца тып прылады
  • path - Указваецца шлях у кантэйнеры да якога LXD змантуе гэтую прыладу
  • source - Указваецца крыніца, шлях да каталога на хасце які вы жадаеце падзяліць з кантэйнерам. Пазначце шлях згодна з вашым перавагам
lxc config device add jupyterlab hostfs disk path=/mnt/hostfs source=/home/dv/projects/ipython-notebooks

Для каталога /home/dv/projects/ipython-notebooks павінна быць усталявана дазвол кантэйнернаму карыстачу які зараз мае UID роўны SubUID + UID, глядзіце главу Бяспека. Прывілеі кантэйнераў у артыкуле Базавыя магчымасці LXD - сістэмы кантэйнераў у Linux.

Усталёўваны дазвол на хасце, дзе ўладальнікам будзе кантэйнерны карыстач jupyter, а зменная $USER пакажа вашага хоставага карыстальніка ў якасці групы:

sudo chown 1001000:$USER /home/dv/projects/ipython-notebooks

Прывітанне Сусвет! ^

Калі ў вас яшчэ адкрыта кансольная сесія ў кантэйнеры з лабараторыя Юпітэра, то перазапусціце яе з новым ключом --notebook-dir задаўшы значэнне /mnt/hostfs у якасці шляху да кораня наўтбукаў у кантэйнеры для прылады якое мы стварылі ў папярэднім кроку:

jupyter lab --ip=0.0.0.0 --no-browser --notebook-dir=/mnt/hostfs

Затым перайдзіце на старонку http://10.0.5.5:8888 і стварыце першы ваш наўтбук націснуўшы кнопку на старонцы як паказана на малюнку ніжэй:

Запускаем Jupyter на арбіту LXD

Затым у поле на старонцы увядзіце код на мове Python які выведзе класічны Hello World!. Па заканчэнні ўводу націсніце CTRL+ENTER або кнопку "play" на панэлі прылад зверху каб JupyterLab выканаў гэта:

Запускаем Jupyter на арбіту LXD

На гэтым амаль усё гатова да выкарыстання, але будзе нецікава, калі мы не ўсталюем дадатковыя Python-модулі (паўнавартасныя прыкладанні) якія дазваляюць значна пашырыць стандартныя магчымасці Python у лабараторыя Юпітэра, таму, рухаемся далей 🙂

PS Цікава тое, што старая рэалізацыя Юпітэр пад кодавым імем Jupyter наўтбукаў нікуды не падзелася і яна існуе паралельна з лабараторыя Юпітэра. Для пераходу да старой версіі перайдзіце па спасылцы дадаўшы ў адрасе суфікс/tree, а пераход да новай версіі ажыццяўляецца з суфіксам /lab, Але яго не абавязкова паказваць:

Пашыраем магчымасці Python ^

У гэтым раздзеле мы ўсталюем такія магутныя модулі мовы Python як numpy, Панды, matplotlib, IPyWidgets вынікі працы якіх інтэгруюцца ў наўтбукі лабараторыя Юпітэра.

Перш чым усталяваць пералічаныя модулі Python праз пакетны мэнэджар pip мы павінны спачатку дазволіць сістэмныя залежнасці ў Alpine Linux:

  • g++ - Патрэбны для кампіляцыі модуляў, бо некаторыя з іх рэалізаваны на мове C + + і падключаюцца да Python у рантайме як бінарныя модулі
  • freetype-dev - залежнасць для Python модуля matplotlib

Усталёўваны залежнасці:

lxc exec jupyterlab -- apk add g++ freetype-dev

Ёсць адна праблема, у бягучым стане дыстрыбутыва Alpine Linux скампіляваць новую версію NumPy не атрымаецца, вылеціць памылка кампіляцыі якую мне не атрымалася дазволіць:

ПАМЫЛКА: Не трэба пабудаваць wheels для numpy which use PEP 517 and cannot be installed directly

Таму, гэты модуль мы ўсталюем як сістэмны пакет які распаўсюджвае ўжо скампіляваную версію, але крыху старэй, чым даступная цяпер на сайце:

lxc exec jupyterlab -- apk add py3-numpy py3-numpy-dev

Далей усталёўваны Python-модулі праз пакетны мэнэджар pip. Набярыцеся цярпенні, бо некаторыя модулі будуць кампілявацца і гэта зойме некалькі хвілін. На маёй машыне кампіляцыя заняла ~15 хвілін:

lxc exec jupyterlab -- python3 -m pip install pandas ipywidgets matplotlib

Які чысціцца кэшы ўсталёвак:

lxc exec jupyterlab -- rm -rf /home/*/.cache/pip/*
lxc exec jupyterlab -- rm -rf /root/.cache/pip/*

Тэстуем модулі ў JupyterLab ^

Калі ў вас запушчаны лабараторыя Юпітэра, перазапусціце яго, каб новыя ўсталяваныя модулі актываваліся. Для гэтага ў кансольнай сесіі націсніце CTRL+C там дзе ён у вас запушчаны і ўвядзіце y на запыт прыпынку, а затым запусціце нанова лабараторыя Юпітэра націснуўшы стрэлачку на клавіятуры «уверх», каб не ўводзіць каманду нанова і потым Enter каб запусціць:

jupyter lab --ip=0.0.0.0 --no-browser --notebook-dir=/mnt/hostfs

Перайдзіце на старонку http://10.0.5.5:8888/lab або абновіце ў браўзэры старонку, а затым увядзіце наступны код у новым вочку наўтбука:

%matplotlib inline

from ipywidgets import interactive
import matplotlib.pyplot as plt
import numpy as np

def f(m, b):
    plt.figure(2)
    x = np.linspace(-10, 10, num=1000)
    plt.plot(x, m * x + b)
    plt.ylim(-5, 5)
    plt.show()

interactive_plot = interactive(f, m=(-2.0, 2.0), b=(-3, 3, 0.5))
output = interactive_plot.children[-1]
output.layout.height = '350px'
interactive_plot

У вас павінен атрымацца вынік як на малюнку ніжэй, дзе IPyWidgets генеруе UI-элемент на старонцы які інтэрактыўна ўзаемадзейнічае з зыходным кодам, а таксама matplotlib выводзіць вынік кода ў выглядзе карцінкі як графік функцыі:

Запускаем Jupyter на арбіту LXD

Многія прыклады IPyWidgets вы можаце знайсці ў тутарыял тут

Што яшчэ? ^

Вы малайцы, калі засталіся і дайшлі да самага канца артыкула. Я спецыяльна не стаў выкладваць гатовы скрыпт у канцы артыкула які б устанавіў лабараторыя Юпітэра у "адзін клік", каб заахвоціць працаўнікоў 🙂 Але вы можаце гэта зрабіць самастойна, бо ўжо ведаеце як, сабраўшы каманды ў адзіны Bash скрыпт 🙂

Таксама, вы можаце:

  • Задаць сеткавае імя для кантэйнера замест IP адрасу прапісаўшы яго ў простым /etc/hosts і ў браўзэры набіраць адрас http://jupyter.local:8888
  • Пагуляцца з абмежаваннем рэсурсаў для кантэйнера, для гэтага прачытайце раздзел у базавых магчымасцях LXD ці атрымаеце больш інфармацыі на сайце распрацоўніка LXD.
  • Памяняць тэму афармлення:

Запускаем Jupyter на арбіту LXD

І шмат чаго яшчэ вы можаце! На гэтым усё. Жадаю вам поспехаў!

UPDATE: 15.04.2020 18:30 - Выправіў памылкі ў главе «Hello, World!»
UPDATE: 16.04.2020 10:00 — Адкарэктаваў і дадаў тэкст у апісанні актывацыі мэнэджара пашырэнняў лабараторыя Юпітэра
UPDATE: 16.04.2020 10:40 — Выправіў знойдзеныя памылкі ў тэксце і крыху змяніў да лепшага кіраўніка «Усталяванне базавага софту і настройка сістэмы»

Крыніца: habr.com

Дадаць каментар