あさのひとりごと

3日坊主にならないように、全力を尽くします。 記事は個人のひとりごとです。所属する組織の意見を代表するほど、仕事熱心じゃないです。

機械学習を勉強するときはIDEっぽいJupyterLabを使うと便利

いまお仕事の関係で、機械学習の教科書的な書籍を読んだりオンライン講座を受講したりしながらサンプルやチュートリアルを動かして勉強しています。

以前にこちらのエントリーで機械学習の『勉強環境』としてJupyterNotebook/Dockerを使っています、というチラシの裏紙っぽいエントリを書いたところ、「Dockerのスペルが違うじゃないか、いい加減にしろ」というフィードバックを頂きました。

dr-asa.hatenablog.com

が、最近「JupyterLab」なるものがあると知り、これがなかなか便利なのでいつも使っています。 ということで、機械学習の勉強環境を構築するためJupyterLabの動くDockerイメージを作ったので、簡単にご紹介です。

1.JupyterLabとは

JupyterLabはJupyter Notebookをベースに拡張したIDEで、ブラウザで動作します。

色々な機能がありますが、まずなによりもターミナルが同一画面で使えるのが便利です。Google Cloud ShellやAzure Cloud Shellにすっかり慣れてしまったゆとりなので、ありがたい。

f:id:dr_asa:20171006121313p:plain

また、タブで画面分割ができチュートリアルやお手本のサンプルコードと自分の書いたコードを見比べながらチェックできるので、勉強環境にはぴったりです。 f:id:dr_asa:20171006120431p:plain

JupyterLabの公式リポジトリはこちらです。

github.com

2. JupyterLabを使うには

このJupyterLabを使えるDockerイメージ「asashiho/ml-jupyterlab」をDockerHubで公開していますのでそれをもとに、次のコマンドで「ml-container」という名前のDockerコンテナを起動します。 Dockerのインストールは、こちらで簡単に紹介しています。

コマンドのpオプションは、コンテナで転送するポート番号を指定してます。 ここでは、JupyterLabが8888番ポートを使っています。

$ docker run -p 8888:8888 --name ml-container -it asashiho/ml-jupyterlab

コンテナは、[Ctrl]+[C]で停止できます。

また、バックグラウンドで動いている場合は、次のコマンドでコンテナを起動/停止できます。

$ docker container start ml-container
$ docker container stop ml-container

コンテナは、次のコマンドで削除できます。

$ docker container rm ml-container

なお、コンテナを削除するとデータも消えますので、データを消したくないときは docker runコマンドでコンテナを起動するときに、Dockerのホストマシン(お使いのPCやクラウドインスタンス)をディレクトリをvオプションでマウントしてください。

Dockerコンテナが起動できたら、ブラウザから以下のアドレスにアクセスしてJupyterNotebookを使います。 アクセス先のURLは、docker runコマンドを実行したときのコンソールに表示されますので、パスに/labを追加してください。

クラウドインスタンスの場合は、以下のアドレスでアクセスできます。

http://DockerホストのIPアドレス:8888/lab?token=<your token>

MacOSまたはWindowsPCのローカル環境の場合は、以下のアドレスでアクセスできます。

http://localhost:8888//lab?token=<your token>

こんな感じです。

f:id:dr_asa:20171006121953p:plain

3. 環境をカスタマイズしたくなったときは

Dockerイメージは「Dockerfile」という定義ベースのファイルで実行環境の構成を管理しています。

このファイルをカスタマイズし、Dockerfileをビルドすることで、任意のDockerイメージを作成できます。たとえば、Pythonのバージョンを変えたい、TensorFlowを最新にしたい、足りないライブラリがあった、など。

今回お試しで使ったDockerイメージのもとになるDockerfileをGithubで公開してますので、ご参考までに。

github.com

無理のない、よい機械学習の勉強ライフを。

「機械学習の書籍を読む」ために必要な数学やりなおしの書籍

「AIを使って我が社のビジネスを・・・」
がたいへん流行っているようです。

そんな中、技術の1つの分野として機械学習を勉強しておきたい!というプログラマの人もたくさんいるとおもいます。が、しかし、機械学習の良書や優れたWeb記事を読むためには、数式が理解できなければページをめくることができません。

数式なしでも分かる機械学、、、方面にいってしまうのも1つの手としてありますが、やはり肝心なところが理解できず、表面をかすっただけになってしまうのも残念です。

では、数学苦手な人は挫折するしかないのか、、、、というのも悲しい話で
特に「ビジネスドメインに関する高度な知識がある」という方は非常にもったいないので、数式を見ると頭痛がする人は頭痛薬を飲んで、人類の輝かしい未来のためにぜひ復習していただけるいいなと思っています。


機械学習を理解するために必要な数学は大きく分けて

があると思いますが、理系大学の学部(教養課程)で習うレベルまで理解できていれば、少なくとも「機械学習の書籍を読み進める」ことはできます。

そこで、「理系だけど昔過ぎて忘れてしまった」「そもそも文系なので大学で数学を履修していない」という方向けに読みやすく復習に向いている(と私が思う)数学の本をいくつか紹介します。

ふたたびの微分積分

そもそも微分とはなんぞや、積分とはなんぞや、からの解説が豊富にあります。具体的な例をつかって、変化率とは?傾きとは?数列とは?面積をともめる!みたいな、人間にとって想像しやすい切り口で解説されています。


www.amazon.co.jp


やさしく学べる線形代数

機械学習に限らず、線形代数が理解できていれば人生得することが多いので、ぜひとも線形代数だけは、、、という感じでもあります。中学のときに習う連立方程式みたいなのから始まり、丁寧な解説付きの練習問題を解くことができるので読みやすいかと思います。

www.amazon.co.jp


完全独習 統計学入門

度数分布・平均・標準偏差のあたりからものすごく丁寧に説明されています。中学程度の知識で読み進められます。独習方式なので詰むことも少ないのではないかと思います。

www.amazon.co.jp



ニューラルネットワーク自作入門

ニューラルネットワークで使われる数学をこれでもかといわんばかりに丁寧に説明した入門書です。行列計算なども具体的な数値を入れて、例を出して解説しています。前提知識は、高校程度の数学だとおもいます。
www.amazon.co.jp


これを読んで「理解できた!実装もできた!」という方は、技術評論社の「ITエンジニアのための機械学習理論入門」がおすすめです。


ここからは、ドメイン知識を前提にした数学の本の紹介です。ご紹介できるのが偏ってますが。。。

金融・証券のためのブラック・ショールズ微分方程式

証券の勉強するため良いよと銀行マンの友達におすすめしてもらった本です。

文系=数学苦手、、、というのは都市伝説だろ!!!!としか思えないほど、金融クラスタは数字に強い人が多いです。それは、彼ら彼女らが就職後に、大学で履修していなかったにもかかわらず、数学をこつこつ勉強した結果なのであって、素晴らしいなと!


ブラックショールズの微分方程式の導出と解き方を丁寧に解説されていて、分かりやすいうえに、面白いです(笑)ぜひ読んでみてください!

www.amazon.co.jp

証券アナリストのための数学再入門

証券の知識があまりなくても、読み進められます。資格試験の本らしく練習問題ありなので理解度チェックもできます!

www.amazon.co.jp




なお私自身が漫画や小説のような「文書が構造化されていない読み物」がほとんど理解できないため、、、、対話で分かる○○、とかイラストで学ぶ▲▲のような本はおすすめ対象外にしています。しかし数学が苦手な人の中には、もしかしたら小説のようなストーリ性のある本のほうが理解が進むという人もいるかもしれません。大きな本屋さんにいくと、たくさんの数学本が売られていますので、自分にあったものを1冊選んで読んでみると良いかなーと思います。

これからのプログラマには、プログラミング力に加えて、深いドメインナレッジやサイエンスの知識が求められるため「なんて生きづらい世界なんだ!!!」だとは思いますが、やってみるとわりと楽しいので、あまり苦手意識や先入観を持たずに、紙と鉛筆で解いてみると良いかもしれません。




10/22(日)に開催される技術書典3という同人誌のためのイベントに「技術者のためのやさしい数学 vol.2」という本を頒布します。本格的にガロア理論が勉強できます。数学好きな方ぜひぜひ会場で~♥

techbookfest.org


こちらは前回の技術書典2で頒布させていただいたものです。
www.dlmarket.jp

オイラーの公式は素敵ですねという話

数値流体力学で私が好きなものの1つに複素速度ポテンシャルがありますが、流体に限らず力学の世界では「オイラーの公式」をあたりまえのように使います。

このオイラーの公式は、ものすごくシンプルなのですが大変ロマンチックなので「美しい数式」としても有名です。

$$
e^{i x}=\cos x+i\sin x
$$



前提知識

オイラーの公式の素敵さを知るために必要な前提知識は、以下の通りです。

オイラーeとは

オイラー数とは、自然対数の底eのことです。その値は


e = 2.71828 18284 59045 23536 02874 71352 …
と続く超越数です。たくさんの偉い人が、オイラー数について詳しい説明をされているので、ググってそちらを読んでください。

虚数iとは

虚数とは、実数ではない複素数のことです。
たくさんの偉い人が、虚数*1について詳しい説明をされているので、ググってそちらを読んでください。

正弦余弦\sin x / \cos xとは

中学校の数学でおなじみの\sin x/\cos xです。たくさんの偉い人が、、、


これ以外にも、微分とは?も知っておく必要があります。
しかし、高校までの数学ですべて習っている範囲だとおもいます。

オイラーの公式を導出しよう!

オイラーの公式はいくつかの方法で導出できるようですが、ここは解析学で!

f\left( x\right)x=0を含む区間微分可能で、かつn\rightarrow \inftyのとき次の式が成り立ちます。


f\left( x\right) \fallingdotseq  f\left( 0\right) +f'\left( 0\right) x +\dfrac {f''\left( 0\right) } {2!}x^{2}+\dfrac {f'''\left( 0\right) } {3!}x^{3}\ldots+\dfrac {f^{n}\left( x\right) } {n!}x^{n}  \tag{1}

これはテイラー展開とよばれるもので、一般の関数 f(x)多項式で近似する方法です。流行りの機械学習でもよく登場します。



まず、オイラーの公式の左辺を考えます。

f\left( x\right) =e^{i x}を式(1)に代入すると


\begin{eqnarray}
e^{ix} &=& 1 + \frac{ix}{1!} + \frac{(ix)^2}{2!} + \frac{(ix)^3}{3!} + \frac{(ix)^4}{4!} + ... \tag{2}
\end{eqnarray}

がなりたちます。

ここで、 i^2 = -1なので、式(2)は

\begin{eqnarray}
e^{ix} &=& 1 + i\frac{x}{1!} - \frac{x^2}{2!} -i \frac{x^3}{3!} + \frac{x^4}{4!} + ... \tag{3}
\end{eqnarray}
となります。



次に、右辺を考えます。

f\left( x\right) =\cos xを式(1)に代入すると


\begin{eqnarray}
\cos x &=& 1 - \frac{x^2}{2!} + \frac{x^4}{4!} - \frac{x^6}{6!} + \frac{x^8}{8!} ... \tag{4}
\end{eqnarray}

f\left( x\right) =\sin xを式(1)に代入すると


\begin{eqnarray}
\sin x &=& x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \frac{x^9}{9!} ... \tag{5}
\end{eqnarray}
がなりたちます。



ここで、式(4)と式(5)をふまえて、式(3)をしっかり見つめます。

そして、整理します。

すると、、、、なんとなんと


\begin{eqnarray}

e^{i x} &=& 1 + i\frac{x}{1!} - \frac{x^2}{2!} -i \frac{x^3}{3!} + \frac{x^4}{4!} + ... \\\
&=& (1 - \frac{x^2}{2!} + \frac{x^4}{4!} - ...) + i(x - \frac{x^3}{3!} + \frac{x^5}{5!} - ...)  \\\

e^{i x} &=& \cos x+i\sin x
\end{eqnarray}


実数の世界では全く他人の指数関数と三角関数が、、、、、

実は虚数の世界を通じてつながっていたというロマンチックさ♡

f:id:dr_asa:20170908161854j:plain

*1:大事なのは、妄想癖

物理空間から計算空間への座標変換

日々生活していると、2次元での物理空間から計算空間への座標変換をしたくなるときがあります。

なので、備忘録として。


物理空間 (x,y,t)デカルト座標系の計算空間 (\xi, \eta ,\tau)写像する場合
計算空間での格子間隔を \Delta \xi = \Delta \eta =1 とすると、 f(x,y,t) \tauに関する微分は次の式になります。

 
\dfrac {\partial f} {\partial \tau } = \dfrac {\partial f} {\partial t }\dfrac {\partial t} {\partial \tau } + \dfrac {\partial f} {\partial x }\dfrac {\partial x} {\partial \tau } + \dfrac {\partial f} {\partial y }\dfrac {\partial y} {\partial \tau }

同様にして、 \eta
 
\dfrac {\partial f} {\partial \eta } = \dfrac {\partial f} {\partial t }\dfrac {\partial t} {\partial \eta } + \dfrac {\partial f} {\partial x }\dfrac {\partial x} {\partial \eta } + \dfrac {\partial f} {\partial y }\dfrac {\partial y} {\partial \eta }


同様にして、 \xi
 
\dfrac {\partial f} {\partial \xi } = \dfrac {\partial f} {\partial t }\dfrac {\partial t} {\partial \xi } + \dfrac {\partial f} {\partial x }\dfrac {\partial x} {\partial \xi } + \dfrac {\partial f} {\partial y }\dfrac {\partial y} {\partial \xi }


行列で表すと、こう。


  \left[
    \begin{array}{r}
      \dfrac {\partial f} {\partial \tau }  \\
      \dfrac {\partial f} {\partial \eta }  \\
      \dfrac {\partial f} {\partial \xi } 
    \end{array}
  \right] = 

  \left[
    \begin{array}{rrr}
      1 & x_{\tau} & y_{\tau} \\
      0 & x_{\eta} & y_{\eta} \\
      0 & x_{\xi} & y_{\xi}
    \end{array}
  \right]
  \left[
    \begin{array}{r}
      \dfrac {\partial f} {\partial t }  \\
      \dfrac {\partial f} {\partial x }  \\
      \dfrac {\partial f} {\partial y } 
    \end{array}
  \right]



逆の変換式は (x,y,t) (\eta,xi,\tau)を入れ替えるとよいので、次の式です。


  \left[
    \begin{array}{r}
      \dfrac {\partial f} {\partial t }  \\
      \dfrac {\partial f} {\partial x }  \\
      \dfrac {\partial f} {\partial y } 
    \end{array}
  \right] =

  \left[
    \begin{array}{rrr}
      1 & x_{\tau} & y_{\tau} \\
      0 & x_{\eta} & y_{\eta} \\
      0 & x_{\xi} & y_{\xi}
    \end{array}
  \right]
  \left[
    \begin{array}{r}
      \dfrac {\partial f} {\partial \tau }  \\
      \dfrac {\partial f} {\partial \eta }  \\
      \dfrac {\partial f} {\partial \xi } 
    \end{array}
  \right]

ここで、、、

座標 (x,y)と座標 (\eta,\xi)ヤコビアン Jとすると


J = x_{\eta}y_{\xi}-x_{\xi}y_{\eta}

で、


  \left[
    \begin{array}{r}
      \dfrac {\partial f} {\partial t }  \\
      \dfrac {\partial f} {\partial x }  \\
      \dfrac {\partial f} {\partial y } 
    \end{array}
  \right] =

 \dfrac {1} {J }
  \left[
    \begin{array}{rrr}
      J & (-x_{\tau}y_{eta}+y_{\tau}x_{\eta}) & (x_{\tau}y_{\xi}-y_{\tau}x_{\xi}) \\
      0 & y_{\eta} & -y_{\xi} \\
      0 & -x_{\eta} & x_{\xi}
    \end{array}
  \right]
  \left[
    \begin{array}{r}
      \dfrac {\partial f} {\partial \tau }  \\
      \dfrac {\partial f} {\partial \eta }  \\
      \dfrac {\partial f} {\partial \xi } 
    \end{array}
  \right]

です。


境界が変化しない場合を考えると、


f_x = \dfrac{1}{J}(y_{\xi}f_{\eta}-y_{\eta}f_{\xi}) \\
f_y = \dfrac{1}{J}(-x_{\xi}f_{\eta}-x_{\eta}f_{\xi}) \\

です。

クランクニコルソン法とフォンノイマンの安定性

計算の待ち時間の備忘録として。


空間における2階の微分を陽解法による差分と陰解法による差分の算術平均で表したものが、クランクニコルソン法です。



\dfrac {\partial u} {\partial t}=\alpha \dfrac {\partial ^{2}u} {\partial x^{2}}


これを陽解法と陰解法の差分の算術平均を表します。


\dfrac {u_{i}^{n+1} - u_{i}^{n}}{\Delta t} =\dfrac{\alpha}{2} \left( \dfrac {u_{i-1}^{n+1} -2u_{i}^{n+1}+u_{i+1}^{n+1}} {\left( \Delta x\right)  ^{2}} + \dfrac {u_{i-1}^{n} -2u_{i}^{n}+u_{i+1}^{n}} {\left( \Delta x\right)  ^{2}} \right)


クランクニコルソン法の陽解法と陰解法の算術平均を重み \thetaによる平均の例だとすると次の一般化が可能。


\dfrac {u_{i}^{n+1} - u_{i}^{n}}{\Delta t} =\alpha  \left( \dfrac {u_{i-1}^{n+1} -2u_{i}^{n+1}+u_{i+1}^{n+1}} {\left( \Delta x\right)  ^{2}} +( 1-\theta ) \dfrac {u_{i-1}^{n} -2u_{i}^{n}+u_{i+1}^{n}} {\left( \Delta x\right)  ^{2}} \right)

ここで \theta=0のとき陽解法、 \theta=1のとき陰解法、 \theta=\dfrac{1}{2}のときクランクニコルソン法になります。



で、フォンノイマンの安定性解析は、差分スキームの安定性を判断するために使われますが、、、、
近似解 u_{N}、厳密解 u_{E}、誤差 \epsilonとすると



u_{N} = u_{E} +  \epsilon

が成り立ちます。
で、次の1次元熱伝導方程式の陽解法の近似式の安定性をみてみます。

 
\dfrac{u_{j}^{n+1} - u_{j}^{n}}{\Delta t}= \alpha \dfrac{u_{j-1}^{n}-2u_{j}^{n} + u_{j+1}^{n}}{(\Delta x)^2}


ここで誤差 \epsilonについては、次の式が成り立ちます。

\dfrac{\epsilon_{j}^{n+1}-\epsilon_{j}^{n}}{\Delta t} = \alpha \dfrac{\epsilon _{j-1}^{n}-2\epsilon _{j}{n} + \epsilon _{j+1}^{n} }{(\Delta x)^2}

誤差 \epsilonは離散化された複素フーリエ級数をつかって次のように表すことができます。


\begin{eqnarray}
\epsilon _{j}^{n} = \sum _{m=-\infty }^{\infty } C_{m}^{n}e^{i\beta _{m} j \Delta x}, x=j\Delta x , t= n \Delta t , \beta_{m}=\dfrac{m \pi}{l}
\end{eqnarray}

誤差 \epsilonが時間ともに増幅しないためには、ある時刻における誤差が次の時間ステップで大きくならなければよいので、、、



G = \dfrac{\epsilon _{j}^{n+1}}{\epsilon _{j}^{n}} = \dfrac{C_{m}^{n+1}}{C_{m}^{n}}
としたとき、 \left| G\right| \leq 1なら安定、そうでなければ不安定です。


誤差の近似式を整理すると次の式になります。

C_{m}^{n+1} = \left\{  2\dfrac{\alpha \Delta t}{(\Delta x)^2} \left( \dfrac{e^{i \beta _{m}\Delta x} + e^{-i\beta _{m}\delta x}}{2} -1  \right)  \right\} C_{m}^{n}


ここで、

s = \dfrac{\alpha \Delta t}{(\Delta x)^2}

として、次のオイラーの公式と、、、、、

\dfrac{e^{i\beta _{m}\Delta x} + e ^{-i\beta _{m}\Delta x}}{2} = \cos (\beta _{m}\Delta x)

半角公式を利用すると、、、、、、

\dfrac{1-\cos(\beta _{m}\Delta x)}{2} =  \sin^2 \left( \dfrac{\beta_{m}\Delta x}{2} \right)


次の式が得られます。


G = -4 s \sin ^2 \left(  \dfrac{\beta _{m}\Delta x}{2}  \right) +1


安定のためには、次が成り立てばよさげ。


`-1 \leq -4 s \sin ^2 \left(  \dfrac{\beta _{m}\Delta x}{2}  \right) +1 \leq 1




みたいな計算をするために必要な数学の知識は

あたりで、、、、

必要な数値解析の知識は

  • 離散化
  • 陽解法/陰解法
  • 誤差/安定の概念

って感じっぽい。

暑い。
もう、暑くて暑くて暑くてどうしようもない。

機械学習を勉強するときはDockerを使うと便利

いまお仕事の関係で、機械学習の教科書的な書籍を読んだりオンライン講座を受講したりしながらサンプルやチュートリアルを動かして勉強しています。

機械学習を勉強するときは、Pythonの環境を構築し、JupyterNotebookを使って、実際に手と頭を動かしながら行うのが効率的です。が、アルゴリズムの理論そのものの理解がすでにしんどい上、過学習対策のための正則化、汎化性能の評価、クロスバリデーション、不均衡データや少ないデータはどうすればいいか、などなどいちいち難しいことを数多く勉強しなければなりません。

その上、、、、機械学習での学習は、1度やれば終わり!ではなく、パラメータチューニングしたり、データを増やしたり加工したりしながら、繰り返しなんども行う必要があります。一見ビジネス寄り&アカデミックな雰囲気を醸し出していますが、実際のところは、非常に泥臭い作業のオンパレードです。

が、、、、、

環境構築が、めんどくさい。

ライブラリのバージョンの違いで実装が・・・というのものも多々あります。

アルゴリズムや実装の確認などは手元のPCでゆっくり考えてデバッグしながらやるとして、、、 いざ、実際に大量の画像データなどを使ってモデルを生成しよう!となると、 クラウドの強いインスタンスを使うのが便利なので、手元のPCの環境が、そっくりそのままクラウド上で動いてくれると、わりと幸せです。

ということで、機械学習を勉強するためDockerを使っているので、簡単にご紹介です。

1. Dockerとは

Dockerはアプリの実行環境をまとめて「コンテナ」として管理できるツールです。Dockerをつかうとこんなことができます。

f:id:dr_asa:20170821105634p:plain

OSやバージョンも指定できますので、Docker上で作成した環境と同じものを、(基本的には)どこででも実行できます。

Dockerでは、「Dockerイメージ」と呼ばれるものに、実行環境に必要なディレクトリ/ファイルをDockerイメージにまとめます。このまとめたDockerイメージを「リポジトリ」を介してアップロード(push)/ダウンロード(pull)して環境を移植します。

Dockerの公式リポジトリは「DockerHub」と呼ばれ、アカウント登録さえすれば、無償でも利用可能です。

https://hub.docker.com/

2. Dockerのインストール

Dockerを使って環境を構築するには、使っているPCや学習させるためのマシンに、それぞれDockerをインストールします。

2.1 MacOSへのインストール

MacOS向けには「Docker for Mac」が提供されています。 以下の公式サイトからモジュールをダウンロードして、指示に従ってインストールします。

Docker For Mac | Docker

2.2 WindowsPCへのインストール

WindowsPC向けには、「Docker for Windows」が提供されています。このDoker for Windowsは以下の条件を満たすマシンが必要です。

Docker For Windows | Docker

なお、Hyper-Vは、Windows標準の仮想化環境です。こちらに環境の確認方法をまとめました。

いや、Windows7だし。という方は、「Docker Toolbox」というツールが提供されていますので、そちらを使って下さい。

Docker Toolbox | Docker

が、Windows7マイクロソフトが2009年に出したOSです。2009年に生まれた赤ちゃんは、もう小学校2年生です。この夏休みに、Scratchを使って自作ゲームを作っている子もいるかもしれません。IT業界に身を多く大人のみなさんは、Azure/GCP/AWSインスタンスを使うか、Windows10 Proに買い替えるのがおすすめです。

2.3 Linuxへのインストール

ディストリビューションによって、Dockerのインストール手順が違いますので、公式サイトのとおり導入してください。

Docker for CentOS Distribution | Docker

Docker for Debian | Docker

Docker For Ubuntu | Docker

あと、クラウドで利用するときはこちらです。

Docker for AWS | Docker

  • Azure

Docker for Azure | Docker

3.機械学習用Dockerコンテナの起動/停止

Dockerでは、DockerイメージをもとにしてDockerコンテナを起動します。

機械学習でよく使うライブラリ群をインストールしたDockerイメージを作成したので、まずはこれをお試しで起動してみます。

ライブラリ 説明
Python 3.6 Python3.6実行環境
TensorFlow 機械学習ライブラリ
scikit-learn 機械学習ライブラリ
keras TensorFlowやTheanoで実行できるニューラルネットワークライブラリ
jupyter 対話型Python実行環境
scipy 科学計算用ライブラリ
simpy 離散シミュレーションライブラリ
matplotlib グラフ描画ライブラリ
numpy 数値計算ライブラリ(ベクトル/行列計算など)
pandas データ解析ライブラリ
plotly オシャレなグラフ描画ライブラリ
sympy 符号数学ライブラリ
mecab-python3 形態素解析エンジン
librosa 音声信号処理ライブラリ
Pillow 画像処理ライブラリ
h5py HDF5 フォーマットファイル
google-api-python-client GCPを使うためのAPI

このDockerイメージ「asashiho/ml-jupyter-python3」は、DockerHubで公開していますのでそれをもとに、次のコマンドで「ml-container」という名前のDockerコンテナを起動します。 コマンドのpオプションは、コンテナで転送するポート番号を指定してます。 ここでは、JupyterNotebookが8888番ポートを使っています。

$ docker run -p 8888:8888 --name ml-container -it asashiho/ml-jupyter-python3

コンテナは、[Ctrl]+[C]で停止できます。

また、バックグラウンドで動いている場合は、次のコマンドでコンテナを起動/停止できます。

$ docker container start ml-container
$ docker container stop ml-container

コンテナは、次のコマンドで削除できます。

$ docker container rm ml-container

なお、コンテナを削除するとデータも消えますので、データを消したくないときは docker runコマンドでコンテナを起動するときに、Dockerのホストマシン(お使いのPCやクラウドインスタンス)をディレクトリをvオプションでマウントしてください。

4. JupyterNotebookを使う

Dockerコンテナが起動できたら、ブラウザから以下のアドレスにアクセスしてJupyterNotebookを使います。 アクセス先のURLは、docker runコマンドを実行したときのコンソールに表示されます。

クラウドインスタンスの場合は、以下のアドレスでアクセスできます。

http://DockerホストのIPアドレス:8888/?token=<your token>

MacOSまたはWindowsPCのローカル環境の場合は、以下のアドレスでアクセスできます。

http://localhost:8888/?token=<your token>

こんな感じです。

f:id:dr_asa:20170821132838p:plain

5. 環境をカスタマイズしたくなったときは

Dockerイメージは「Dockerfile」という定義ベースのファイルで実行環境の構成を管理しています。

このファイルをカスタマイズし、Dockerfileをビルドすることで、任意のDockerイメージを作成できます。たとえば、Pythonのバージョンを変えたい、TensorFlowを最新にしたい、足りないライブラリがあった、など。

今回お試しで使ったDockerイメージのもとになるDockerfileを公開してますので、ご参考までに。

github.com

Dockerfileのビルドは、docker buildコマンドを使いますが、DockerHubとGitHubを連携させると「Automated Build」という機能が使えます。

これは、GitHubへのpushをトリガーにして、DockerHubでDockerイメージを自動でビルドできる機能です。

f:id:dr_asa:20170821112347p:plain

ビルドに時間はかかりますが、なかなか便利です。

無理のない、よい機械学習ライフを。

WindowsでのJupyter演習環境の準備手順

このエントリは、enakaiさん著書の「ITエンジニアのための機械学習理論入門」を読んで、私がWindowマシンで勉強するための手順をまとめたエントリです。こちらのブログを参考にしています。

www.amazon.co.jp

もし環境構築に関して不明点があれば、私@_dr_asaまでお問い合わせください。

1. Windows環境の確認

書籍のサンプルコードは、Dockerコンテナ上で動作するJupyterNotebookで公開されています。 WindowsでDockerを利用する場合は、次の2つのツールがDocker社より提供されていますのでいずれかを選んでインストールしてください。

Dockerは、Linuxのコンテナ技術をベースとしたプロセス実行環境のため、Dockerを動作させるためにはLinux OS(のコンテナ)が必要でした。 そのため、WindowsではLinuxコンテナを直接実行させることができないため、Windows上にOracle VirtualBoxという仮想化環境上でLinuxを動作させていました。これがWindows向けに提供されていた「Docker Toolbox」です。

Windows 8以降は、OS標準の仮想化環境としてHyper-Vがリリースされました。この、Hyper-Vを使ったDockerが「Docker for Windows」です。

ただし、この「Docker for Windows」を利用するには、以下の3つの条件を満たす必要があります。

まず、Windowsメニューの[システム]をクリックすると、利用している端末の詳細が確認できますので、「エディション」と「システムの詳細」で、Windows 10 ProまたはEnterprise(64bit)であることを確認してください。

次に、VirtualBoxVMWare Playerなどの仮想環境をPCからアンインストールします。 最後、にWindowsメニューの[コントロールパネル]―[プログラムと機能]―[Windowsの機能の有効化または無効化]をクリックし、[Hyper-V]を有効にしてください。設定変更にはOSの再起動が必要です。

[:320]

なお、上記の条件を満たさない端末をお使いの方、またはWindowsでのDockerの環境構築に不慣れな方は、「3.Docker Toolboxのインストール手順」を参照してインストールください。ただし、マシンスペックが低いクライアントPCでは、Dockerが正しく動作しない場合もありますので、こちらの手順パブリッククラウドを使ったDocker環境を構築することをお勧めします。

2. Docker for Windowsのインストール手順

はじめに、Dockerの公式Webサイト(https://www.docker.com/docker-windows)から、Windows用のDockerをダウンロードします。「Download Now from Docker Store」のリンクからダウンロードページを開いて、「Get Docker」をクリックすると、インストーラーファイル InstallDocker.msiがダウンロードできます。InstallDocker.msiをダブルクリックし、指示にしたがって、インストールを完了させてください。インストールが完了するとDockerが自動的に起動します。

インストールが完了してDockerが起動すると、Windwosタスクバーにクジラのアイコンが表示されます。ここを右クリックし、Dockerの管理メニューを表示して、[Settings]を選択した後、[Advanced]のタブから[Memory]を4GB以上に設定します。「CPUs」の指定は任意ですが、サンプルコードの実行時間が極端に長くならないよう、4以上に設定することをおすすめします。最後に[Apply]を押して、設定変更を反映します。Dockerが再起動されます。

次に、WindowsマシンとDockerコンテナでドライブを共有する設定を行います。Dockerの管理メニューを表示して、[Settings]を選択した後、[Shared Drives]のタブから共有したいドライブを選択し、[Apply]を押して、設定変更を反映します。ここでは、Cドライブを共有しています。

3. Docker Toolboxのインストール手順

「Docker for Windows」が利用できない場合は、「Docker Toolbox」をインストールします。

Dockerの公式Webサイト(https://www.docker.com/products/docker-toolbox)から、Windows用のDocker Toolboxをダウンロードします。「Download」をクリックすると、インストーラーファイル DockerToolbox.exeがダウンロードできます。DockerToolbox.exeをダブルクリックし、指示にしたがって、インストールを完了させてください。Docker Toolboxの動作に必要なOracle VirtualBoxもインストールされます。

インストールが完了し、デスクトップに作成された「Docker Quickstart Terminal」アイコンをダブルクリックすると、Dockerの環境が構築されます。

                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/

docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com

Welcome to Git (version 1.9.5-preview20150319)


Run 'git help git' to display the help index.
Run 'git help <command>' to display help for specific commands.

$

これでDockerのインストールが完了しました。

4. Dockerコンテナの起動

Windowsコマンドプロンプトを開いて、下記のコマンドを実行すると、Docker Hubからイメージをダウンロードして、コンテナ上でJupyterが起動します。

> mkdir c:\data
> docker run -itd --name jupyter -p 8888:8888 -p 6006:6006 -v /c/data:/root/notebook -e PASSWORD=passw0rd enakai00/jupyter_tensorflow:latest

「-e PASSWORD」オプションには、WebブラウザーからJupyterに接続する際の認証パスワードを指定します。この例では、「passw0rd」を指定しています。この手順でコンテナを起動した場合、Jupyterで作成したノートブックのファイルは、Cドライブの下にある「data」フォルダーに保存されます。

Windowsブラウザーを起動して、http://localhost:8888にアクセスすると、ログイン画面が表示されるので前述のパスワードを入力してログインします。なお、Docker Toolboxのときはhttp://192.168.99.100:8888にアクセスしてください。

なお Windowsを再起動した場合は、コマンドプロンプトから下記のコマンドを実行して、コンテナを再度、起動してください。

> docker stop jupyter
> docker start jupyter

5. JupyterNotebookの確認

Jupyterにログインすると「ノートブックファイル」の一覧画面が表示されますが、今はまだノートブックファイルはありません。

右上のプルダウンメニューから「New」→「Python 2」を選択すると新しいノートブックが開きます。

ノートブック上では、セルにプログラムコードを入力して、「▶」ボタン、もしくは [Ctrl] + [Enter] で実行すると結果が表示されます。マークダウン形式のセルには説明文を記載することができます。

ノートブック全体を最初から実行し直す場合は、メニューから「Kernel」→「Restart & Clear Output」を選択して、これまでの実行内容をクリアします。

空のセルで次のコマンドを実行すると、演習用のノートブックがダウンロードできます。

!git clone https://github.com/enakai00/jupyter_ml4se

ノートブックファイル一覧画面でフォルダー「jupyter_ml4se」を開くと、ノートブックファイルが入っています。

「02-square_error.ipynb」のチェックボックスにチェック入れて、画面上部の「Duplicate」を押すと、ノートブックファイルのコピー「02-square_error-Copy1.ipynb」ができます。これをクリックして、ノートブックを開きます。

メニューから「Kernel」→「Restart & Clear Output」を選択して、これまでの実行内容をクリアした後に、メニューから「Cell」→「Run All」を選択すると、すべてのセルが上から順に自動実行されます。すべてのセルが正しく実行されることを確認しておいてください。たとえば、最後の2つのセルでは、次のようなグラフが表示されます。

以上

「Google Cloudではじめるデザイナ/プログラマのためのDocker実践入門」 ハンズオン資料

このドキュメントは、「Google Cloudではじめるデザイナ/プログラマのためのDocker実践入門 」勉強会のハンズオン用資料です。

ハンズオンのスライドはこちらです。 詳細については、こちらを参照してください。 Docs.com: docs.com/asashiho

このハンズオンでは、次の流れでDockerの実行環境を構築していきます。


構築する環境の構成は次の通りです。

1. Dockerイメージ作成

サンプルのダウンロード(2)

$ git clone https://github.com/asashiho/docker-handson.git

サンプルの構成(1)

$ ls docker-handson/

Dockerfile

$ vi docker-handson/v1.0/Dockerfile

Dockerイメージの作成

$ cd docker-handson/v1.0
$ docker build -t docker-sample:v1.0 .

Dockerイメージの確認

$ docker images

やってみよう

$ cd ~/docker-handson/v1.1
$ docker build -t docker-sample:v1.1 .

2.Dockerイメージ公開

プロジェクトIDの設定

$ GCP_PROJECT_ID=$(gcloud config list project --format "value(core.project)")
 
$ echo $GCP_PROJECT_ID

Dockerイメージにtag設定

$ docker tag docker-sample:v1.0 gcr.io/$GCP_PROJECT_ID/docker-sample:v1.0
$ docker tag docker-sample:v1.1 gcr.io/$GCP_PROJECT_ID/docker-sample:v1.1

Dockerイメージの公開

$ gcloud docker -- push gcr.io/$GCP_PROJECT_ID/docker-sample:v1.0
$ gcloud docker -- push gcr.io/$GCP_PROJECT_ID/docker-sample:v1.1

Dockerイメージ公開の確認

$ gcloud docker -- search gcr.io/$GCP_PROJECT_ID

3. Docker実行環境の構築~仮想マシン1台構成の場合~

Docker実行環境構築

$ docker-machine create --driver google \
  --google-project $GCP_PROJECT_ID \
  --google-zone asia-northeast1-a \
  --google-machine-type n1-standard-1 \
  --google-machine-image https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-1404-trusty-v20161109 \
  webserver

仮想マシンへのログイン

$ cat /etc/redhat-release

Google Cloud利用のための設定

$ export GCP_PROJECT_ID=<ご自身のプロジェクトID>
$ sudo gcloud components update
$ sudo gcloud config set project $GCP_PROJECT_ID

Dockerイメージのダウンロード

$ sudo gcloud docker -- pull gcr.io/$GCP_PROJECT_ID/docker-sample:v1.0
$ sudo gcloud docker -- pull gcr.io/$GCP_PROJECT_ID/docker-sample:v1.1

Dockerイメージの確認

$ sudo docker images

4. コンテナの起動~仮想マシン1台構成の場合~

Dockerコンテナの起動

$ sudo docker run -it -p 80:80 --rm --name webserver gcr.io/$GCP_PROJECT_ID/docker-sample:v1.0

Dockerコンテナの動作確認

$ sudo docker run -it -p 80:80 --rm --name webserver gcr.io/$GCP_PROJECT_ID/docker-sample:v1.1

仮想マシンの削除

$ docker-machine stop webserver
$ docker-machine rm webserver

5. Docker実行環境の構築~クラスタ構成の場合~

クラスタ操作のための環境設定

$ cd ~/docker-handson/
$ gcloud container clusters get-credentials web-cluster --zone=asia-northeast1-a
$ kubectl get nodes

コンテナの起動

$ kubectl create -f deployment.yaml 
$ kubectl get pods

サービス設定ファイルの作成

$ cat service.yaml

サービスの起動

$ kubectl create -f service.yaml 
$ kubectl get services

6. コンテナのアップデート~クラスタ構成の場合~

デプロイ設定ファイルの修正

$ kubectl edit deployment/web-container

アップデートの確認

$ kubectl describe deployment/web-container

クラスタの削除

$ kubectl delete service web-service 
$ kubectl delete deployment web-container

おつかれさまでした

© 2017 ASA.