Как запустить слайд-шоу ноутбука Jupyter в облаке? - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть экземпляр на Google Compute Engine, который я настроил таким образом, чтобы я мог работать с ноутбуками Jupyter с помощью браузера на локальном компьютере. Я подключаюсь к виртуальной машине, набрав внешний ip с портом 8888, и я готов к работе.

Теперь я хочу превратить одну тетрадь Jupyter в слайд-шоу, к которым я хочу как-то получить доступ. Я пытался следовать документации nbconvert , и я использовал следующую команду в консоли виртуальной машины:

jupyter nbconvert your_talk.ipynb --to slides --post serve

Консоль моей виртуальной машины говорит, что:

[NbConvertApp] Converting notebook your_talk.ipynb to slides
[NbConvertApp] Writing 254651 bytes to your_talk.slides.html
[NbConvertApp] Redirecting reveal.js requests to https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.5.0
Serving your slides at http://127.0.0.1:8000/your_talk.slides.html
Use Control-C to stop this server
[NbConvertApp] WARNING | No web browser found: could not locate runnable browser.

Я понимаю, что он пытается запустить слайды в веб-браузере виртуальных машин. Однако дело в том, что для доступа к этому слайду извне ВМ. Таким образом, вопрос:

Вопрос. Как разместить слайды ноутбуков jupyter на моей виртуальной машине, чтобы я мог получить к ним удаленный доступ с помощью локального компьютера?

Ps. У меня есть файл your_talk.slides.html, к которому я могу получить доступ, но это просто статический HTML-файл.


Примечание для читателей: Если вы читаете этот вопрос и думаете, что мне следовало использовать разные теги, смело меняйте их.


Журнал для предложения Marcins

RequestException                          Traceback (most recent call last)
<ipython-input-3-08768ed6fc86> in <module>()
      1 import datalab.storage as gcs
      2 slides = get_ipython().getoutput('jupyter nbconvert your_talk.ipynb --to slides --stdout')
----> 3 gcs.Bucket('myownbucket').item('slides.html').write_to("".join(slides[1:]),'text/html')

~/anaconda3/lib/python3.6/site-packages/datalab/storage/_item.py in write_to(self, content, content_type)
    222       self._api.object_upload(self._bucket, self._key, content, content_type)
    223     except Exception as e:
--> 224       raise e
    225 
    226 

~/anaconda3/lib/python3.6/site-packages/datalab/storage/_item.py in write_to(self, content, content_type)
    220     """
    221     try:
--> 222       self._api.object_upload(self._bucket, self._key, content, content_type)
    223     except Exception as e:
    224       raise e

~/anaconda3/lib/python3.6/site-packages/datalab/storage/_api.py in object_upload(self, bucket, key, content, content_type)
    161     url = Api._UPLOAD_ENDPOINT + (Api._OBJECT_PATH % (bucket, ''))
    162     return datalab.utils.Http.request(url, args=args, data=content, headers=headers,
--> 163                                       credentials=self._credentials, raw_response=True)
    164 
    165   def objects_copy(self, source_bucket, source_key, target_bucket, target_key):

~/anaconda3/lib/python3.6/site-packages/datalab/utils/_http.py in request(url, args, data, headers, method, credentials, raw_response, stats)
    153           return json.loads(str(content, encoding='UTF-8'))
    154       else:
--> 155         raise RequestException(response.status, content)
    156     except ValueError:
    157       raise Exception('Failed to process HTTP response.')

RequestException: HTTP request failed: Insufficient Permission

Журналы ошибок после вызова $ datalab create --verbosity=debug datalab-instance-name:

DEBUG: Running [gcloud.compute.zones.list] with arguments: [--format: "value(name)", --quiet: "True", --verbosity: 
"debug"]
INFO: Display format: "        table(name,
              region.basename(),
              status():label=STATUS,
              maintenanceWindows.next_maintenance():label=NEXT_MAINTENANCE,
              deprecated.deleted:label=TURNDOWN_DATE
        ) value(name)"
DEBUG: (gcloud.compute.zones.list) Some requests did not succeed:
 - Insufficient Permission
Traceback (most recent call last):
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/calliope/cli.py", line 839, in Execute
    resources = calliope_command.Run(cli=self, args=args)
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/calliope/backend.py", line 772, in Run
    display_info=self.ai.display_info).Display()
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/calliope/display.py", line 477, in Display
    self._printer.Print(self._resources)
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/core/resource/resource_printer_base.py", line 256, in Print
    for resource in resources:
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/core/util/peek_iterable.py", line 206, in next
    return self.__next__()
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/core/util/peek_iterable.py", line 211, in __next__
    item = self._NextItem()
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/core/util/peek_iterable.py", line 183, in _NextItem
    return next(self._iterable)
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/api_lib/compute/lister.py", line 924, in __call__
    utils.RaiseException(errors, ListException)
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/api_lib/compute/utils.py", line 123, in RaiseException
    errors))
ListException: Some requests did not succeed:
 - Insufficient Permission
ERROR: (gcloud.compute.zones.list) Some requests did not succeed:
 - Insufficient Permission
A nested call to gcloud failed.
Command: ["gcloud","compute","--verbosity=debug","zones","--quiet","list","--format=value(name)"]
Return code: 1

1 Ответ

0 голосов
/ 07 сентября 2018

Знаете ли вы о Google Cloud DataLab? В основном это хостинг Jupyter на GCP. В любом случае следующий фрагмент кода (при запуске из записной книжки, Python = 3) возьмет вашу записную книжку, преобразует ее в слайды и загружает в облачное хранилище. Вы можете публично обслужить своих мух из облачного хранилища:

import datalab.storage as gcs
slides = !jupyter nbconvert <your_notebook>.ipynb --to slides --stdout
gcs.Bucket('<your_bucket_name>').item('slides.html').write_to("".join(slides[1:]),'text/html')

Чтобы сделать его общедоступным, добавьте в список разрешений «allUsers» члена с ролью «Просмотр объектов хранилища». Обратите внимание, что это сделает ваше ведро общедоступным в Интернете.

Если вы не используете DataLab, вам может потребоваться добавить datalab.storage в качестве зависимости от вашей среды Python.

Я думаю, что в вашем случае это намного проще и безопаснее, чем настройка брандмауэров на виртуальной машине и подвергание ее входящему трафику.

...