Python
GitLab
GPU
Docker
JupyterHub
aptpodDay 7

JupyterHubによる社内共用分析環境の構築(GPUも使えるよ)

aptpod Advent Calendar 2018 7日目は南波がお送りします。


tl; dr


  • 社内のマシンでJupyterHubを動かしてます


    • (社内で運用している)GitLabの情報で認証できるような設定にしているため、アカウント管理などが楽です

    • GPU使えるため、はやりのディープラーニングも動かせます

    • (社内用の設定では)自社製品のSDKを使用できるようDockerfileをカスタマイズしているため、Jupyter Notebook立ち上げるだけでIoTデータの分析ができます



GitHubにコード置いたので、何かの機会にご利用いただければ幸いです


背景

日常の業務では、お客様が集めたIoTデータの活用(e.g. 機械学習など)を促進するための活動を中心にお仕事しています

具体的には、弊社intdashというプラットフォームのなかの "Analytics Services" という製品(群)に含まれるPython用のSDKを用いて、収集済みのデータやリアルタイムに流れているデータの分析を行うコードを書き、「こんなこともできるんですよ!」とみなさんに伝えていくようなお仕事です


課題

分析の中にはGPUを使用したいようなネタもあるため、その際は社内のGPUを積んだサーバーに繋いでJupyter Notebookを立ち上げて作業をしていました

しかしながら、


  • あまり環境を汚したくない


    • 分析用途以外にも使用されているサーバーのため



  • 自社製品のPython用SDKが一般公開されてない(PyPIに登録されていない)ので、 pip install hogehoge だけでは使用できない(一手間必要)

  • 同じ環境を使用するメンバーが増えた際にごちゃごちゃしそう

あたりの怪しさがあり、どうにかしたいなと思っていました


解決方法と効果

Jupyter Notebookのユーザー管理ができるJupyterHubを導入しました

具体的には、jupyterhub/jupyterhub-deploy-dockerをベースにカスタマイズを加えたaptpod/jupyterhub-docker-gpu-gitlabを利用することで、


  • すべてDocker上で動作するようにしたことで、環境が汚れない

  • GitLabの情報で認証するようにしたことで、別途のアカウント管理が(基本的に)不要

  • ユーザー毎に立ち上がるJupyter Notebook用のDockerfileをカスタマイズしたことで、 import hogehoge だけで自社製品のPython用SDKを利用できる


    • (上記のリポジトリからはこの設定は削除していますが、 COPY HOGEHOGE /tmp/HOGEHOGE, RUN pip install -e /tmp/HOGEHOGE といったコマンドを追記することで、イメージビルド時にローカルに持っている任意のライブラリのインストールを含めることができるかと思います)



などの効果を得ることができました


副次的な効果

基本的には「GPU積んだサーバーで分析処理するメンバーが幸せになること」を対象にした環境構築でしたが、GitLabの情報で認証できるようになったことにより社内のだれでも「オールインワンの分析環境」をブラウザ一つで利用できるようになりました

これまでも「ディープラーニングを試したければColaboratory」「自社製品のPython用SDKを試したければこのコマンド(もしくはこのDockerfile)」と伝えることはできましたが、両方を備えた環境を用意できたことでより広いバックグラウンドのメンバーに「こんなこともできるんですよ!」と伝えやすくなったかなと思っています


まとめ

JupyterHubをカスタマイズして利用しているというお話でした

たいへん便利に使えてますので機会があればご利用ご検討ください(そしてもしそのコードを公開いただけたりすると僕のメンテコストが減って幸せになるのですごくすごくありがたいです)

(社内で運用しているコードに修正加えて公開しているので、もし動かないなどあればコメントやissueお願いします :bow:


注記

社内のプライベートネットワーク内だけでの利用を前提としているため、TLSまわりの設定をオフにしています

# c.JupyterHub.port = 443

# c.JupyterHub.ssl_key = os.environ['SSL_KEY']
# c.JupyterHub.ssl_cert = os.environ['SSL_CERT']

上記のコードをご利用になることあれば、十分にご注意ください :pray: