データ分析
はじめに
機械学習に必要なマシンリソースをどのように管理されていますか?クラウド上の仮想マシンやサービスを利用するケース、ローカルPCでなんとか頑張るなど、各個人でリソースを確保しているというケースも多いのではないでしょうか。
ここでは、TDSEで活用しているJupyter Notebookの実行環境としての計算資源の共有についてご紹介します。
Jupyter Notebook
Jupyter Notebookとは、ブラウザベースでプログラムを実行し、実行結果を記録できるツールです。データの加工、数値シミュレーション、統計モデリング、データの可視化、機械学習などを行うときに広く一般的に使われるツールです。ローカルPCへのインストールは簡単で、Python環境がすでにある場合、以下のコマンドでインストールし実行することができます。
>pip install jupyter
>jupyter notebook
>jupyter notebook

ブラウザが立ち上がり、すぐに分析作業に取り掛かれます。
簡単な分析や機械学習であれば、このままで十分便利に利用できますが、大規模なデータの学習処理などでは、リソース不足になってしまいます。
このようなニーズのたびにPCのスペックを上げることも難しいことと思います。
そこで、実行環境を別のリソースで行うことを考えてみたいと思います。
計算資源の共有
インストールしたマシン上で実行するのではなく、別のリソースで行うには、Jupyter Enterprise Gatewayを構築することで解決します。Jupyter上のプログラムの実行環境のことをカーネルと呼びます。Jupyterが様々な言語をサポートしているのも、それぞれの言語環境のカーネルが提供されているからです。このカーネルをローカルPCではなく、リモートカーネルとして提供できるサーバがJupyter Enterprise Gatewayです。

Jupyter Enterprise GatewayはLOCALやYARN、Docker Swarmなどへデプロイすることができます。Jupyter Enterprise Gateway
は共通的な計算資源を分析者に提供します。ですので、TDSEでは様々なパブリッククラウド上に容易に構築でき、スケーラブルな運用をしてきたいため、Kubernetes上にデプロイし利用しています。
それでは、構築の手順をご紹介します。
以下はすでにKubernetesのクラスタが存在している状態(作成済みの状態) からの手順です。お使いのクラウドなどで事前にクラスタを構築しておいてください。
まずは、インストールターゲットのクラスタであるかを確認します。
>kubectl config current-context
YOUR_CLUSTER_NAME
YOUR_CLUSTER_NAME
ターゲットが確認出来たら、GitHubからJupyter Enterprise Gatewayのクローンを取得します。
> git clone https://github.com/jupyter/enterprise_gateway.git
Jupyter Enterprise Gatewayの利用するネットワークの設定を行います。
> cd enterprise_gateway/etc/kubernetes
> sudo vi enterprise-gateway.yaml
> sudo vi enterprise-gateway.yaml
Jupyter Enterprise Gateway のデフォルトのサービスはNodePortで設定されています。
apiVersion: v1
kind: Service
metadata:
labels:
app: enterprise-gateway
component: enterprise-gateway
name: enterprise-gateway
namespace: enterprise-gateway
spec:
ports:
– name: http
port: 8888
targetPort: 8888
selector:
gateway-selector: enterprise-gateway
sessionAffinity: ClientIP
type: NodePort
NodePortのままでも利用可能ですが、ノード単位でIPが割り振られる場合等、利用用途に合わせて各種Serviceを設定します。kind: Service
metadata:
labels:
app: enterprise-gateway
component: enterprise-gateway
name: enterprise-gateway
namespace: enterprise-gateway
spec:
ports:
– name: http
port: 8888
targetPort: 8888
selector:
gateway-selector: enterprise-gateway
sessionAffinity: ClientIP
type: NodePort
今回はLoad Balancerで設定したケースを紹介します。
以下設定例です。
apiVersion: v1
kind: Service
metadata:
labels:
app: enterprise-gateway
component: enterprise-gateway
name: enterprise-gateway
namespace: enterprise-gateway
spec:
type: LoadBalancer
loadBalancerIP: “外部IPアドレス”
loadBalancerSourceRanges:
– “接続元のIPアドレスのレンジ” ← 自社内のみ等制限したい場合設定
ports:
– name: http
port: 8888
selector:
gateway-selector: enterprise-gateway
sessionAffinity: ClientIP
Jupyter Enterprise Gatewayのウェブサイトkind: Service
metadata:
labels:
app: enterprise-gateway
component: enterprise-gateway
name: enterprise-gateway
namespace: enterprise-gateway
spec:
type: LoadBalancer
loadBalancerIP: “外部IPアドレス”
loadBalancerSourceRanges:
– “接続元のIPアドレスのレンジ” ← 自社内のみ等制限したい場合設定
ports:
– name: http
port: 8888
selector:
gateway-selector: enterprise-gateway
sessionAffinity: ClientIP
(
https://jupyter-enterprise-gateway.readthedocs.io/en/latest/kernel-kubernetes.html)を参照し、必要に応じて設定変更をします。
設定が完了したら、以下のコマンドでデプロイします。
>kubectl apply -f enterprise-gateway.yaml
成功したら、以下のコマンドで設定が反映されているか確認します。
>kubectl get services -n enterprise-gateway
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
enterprise-gateway LoadBalancerx.x.x.xy.y.y.y8888:31872/TCP 1m
それでは、ローカルPCのJupyter Notebookから接続してみます。enterprise-gateway LoadBalancerx.x.x.xy.y.y.y8888:31872/TCP 1m
デフォルトで設定されているゲストアカウントを利用します。
>Jupyter notebook –gateway-url=http://y.y.y.y:8888
–GatewayClient.http_user=guest –GatewayClient.http_pwd=guest-password
以下のようにNewからリモートカーネルが選択できるようになっていれば成功です。–GatewayClient.http_user=guest –GatewayClient.http_pwd=guest-password

このようにローカルのJupyter Notebookを利用しながらプログラムの実行は計算資源用のサーバで実行することができます。これにより、Jupyter
NotebookユーザーからCPU、メモリへの関心を分離できます。なおGPUを使うには、カーネルのイメージとクラスタの設定が必要となります。
ファイル共有、データ共有
Jupyter Enterprise Gateway上のカーネルはリモートであり、ローカルPCとは別のファイルシステムを利用しています。機械学習や分析の作業では、CSVファイル等のファイルを扱うことは一般的に行われることであり、これらのファイルをリモートカーネルで取り扱えるようにする必要があります。TDSEでは、SFTPのサーバを立てて、リモートカーネルからマウントできるように構築しています。

また、カーネルから社内のGitリポジトリにも接続することも実施しており、カーネル上に必要な資材をクローンすることが可能となっています。
Jupyter Hubとの連携
Jupyter Enterprise Gatewayの計算資源への接続は、Jupyter Hub上のNotebookからも行うことができます。Jupyter Hubは、マルチユーザ環境を実現する機能で、個別のPCにインストールすることなくJupyterを利用することができます。
以下のようにランチャーからリモートカーネルを選択できるようになります。

まとめ
案件ごとに分析を行う環境を構築するなど煩雑になっている場合、Jupyterのさまざまなソリューションを利用することにより、共通的に管理することができます。TDSEでは、このような環境の設計・構築をご支援することが可能です。お気軽にご相談ください。