Translate

2017年6月28日水曜日

SONYのAIコアライブラリ NNabla の概要を調べてみる

ソニーがAIライブラリをオープンソース公開したという記事を読んだ。

ソニー、ディープラーニングのコアライブラリを無償公開
https://japan.cnet.com/article/35103402/
トップサイトが

https://nnabla.org/ja/

にあるが、どうもナンチャッテとっぷさいとのようだ。
おそらくだけど、真のトップがここのようだ。

https://nnabla.readthedocs.io/en/latest/#

..結局英語かよ..


トップの英語をGoogle翻訳にかけてみた。

NNablaは、研究、開発、および生産に使用するための深い学習フレームワークです。 私たちは、デスクトップPC、HPCクラスタ、組み込み機器、プロダクションサーバなどあらゆる場所で稼動させることを目指しています。

このドキュメントでは、Python APIおよびC ++ APIの使用方法、開発者向けの寄付ガイド、およびこのソフトウェアのライセンス期間について説明します。 Python APIは、ディープ・ラーニング・システムの迅速なプロトタイプ作成や実験に適していますが、C ++ APIは、推論やトレーニング・アルゴリズムを組み込みシステムやサーバーに組み込むためのものです(ドキュメントは現在のところ入手できません。 このフレームワークは、モジュール性と拡張性を念頭に置いて設計されています。 コミュニティ寄稿者は、ニューラルネットワークの新しいオペレータまたはオプティマイザモジュール、および特定のターゲットデバイス用のニューラルネットワークモジュールの特別な実装を拡張モジュールとして追加できます。

Pythonライブラリになっていて、C++ もあるけどそっちはどうも実際の計算モジュール実装に使っていて、今のところドキュメントはないらしい。今回はコアライブラリで、オプティマイザとかのcontribを追加できるような構造になってるよ、ということらしい。

ちなみにラインセンスはApache2.0である。

以下、Windows環境でのインストール手順をGoogle翻訳に掛けたものだ。

■Windowsへのインストール

・前提条件

Windows8.1 64bitとWindows10 64bitでは動作確認テスト済み。

インストールには次のソフトウェアが必要となる。

 - 必要なソフトウェア。
   Python 2.7:PIP
   Microsoft Visual C ++ 2015再頒布可能
 - 推奨ソフトウェア
   CUDAツールキット8.0 / cuDNN 6.0(NVIDIA GPUユーザー向け)

・セットアップ環境
 - Python2.7
   この手順では、minicondaを使用します。
   ここからWindowsバイナリを入手してインストールしてください。
  
   コマンドプロンプトから必要なパッケージをインストールします。
   > conda install scipy scikit-image ipython
   ネットワークがプロキシを使用しており、セットアップが失敗した場合は、環境変数を使用してプロキシサーバーを構成し、再度インストールしてください。
   > SET HTTP_PROXY=http://(ここにhttpプロキシサーバーのアドレスを入力します)
   > SET HTTPS_PROXY = https://(ここにhttpsプロキシサーバーのアドレスを入力します)


 - Microsoft Visual C ++ 2015 Redistributable
   ここから取得してインストールしてください
 

 - CUDA Toolkit 8.0 / cuDNN 6.0
   NVIDIA GPUを使用している場合、次のソフトウェアをインストールすることで実行速度が大幅に向上します。
   CUDAツールキット
 
  cuDNN
 
  cuDNNをインストールするには、binincludelibを"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0"にコピーします。

 - インストール
  CPUパッケージをインストールします。
  > pip install nnabla

  NVIDIA GPUを使用している場合は、CUDA/cuDNN パッケージをインストールします。
  > pip install nnabla_ext_cuda

  実行を確認します。
  > ipython
 
  In [1]: import nnabla
  2017-06-06 21:36:07,101 [nnabla][Level 99]: Initializing CPU extension...
 
  In [2]: exit
 
  >


  動作(CUDA/cuDNN)を確認します。
  > ipython
 
  In [1]: import nnabla_ext.cuda.cudnn
  2017-06-16 18:42:18,881 [nnabla][Level 99]: Initializing CPU extension...
  2017-06-16 18:42:19,923 [nnabla][Level 99]: Initializing CUDA extension...
  2017-06-16 18:42:20,243 [nnabla][Level 99]: Initializing cuDNN extension...
 
  In [2]: exit
 
  >


・サンプルの実行
 ここからNNablaリポジトリをダウンロードし、解凍してサンプルディレクトリに移動してください。

 > cd nnabla \ examples \ vision \ mnist

 MNIST分類を実行します。
 nnabla\examples\vision\mnist > python classification.py

 CUDA/cuDNNでMNIST分類を実行します。
 nnabla\examples\vision\mnist > python classification.py -c cuda.cudnn

・FAQ
 Q. Scikitイメージのインストールには長い時間がかかります。
 環境によっては時間がかかります。 お待ちください。

 Q.インストール中にScipyのインストールに失敗しました。
 "pip install nnabla"の前に "conda install"を使ってscipyをインストールしてください。


インストールは簡単そうだ。

Windows7で動作確認はしてないんだ..というのはおいといて..

Anacondaが入ってるのでこれでできそうだし、GitHubのIssueにはPython3で云々っていうのも見かけた。

ちょっとおもしろそうなのは、MS C++ランタイムを入れている所。おそらくだけど、Anaconda上からなのにネイティブのC++ライブラリを使ってGPUが使える..つまりWindows上でGPUが使えるんじゃなかろうか

Windows上のAnacondaからのTensorFlowはCPUのみしかサポートしていなかったはずだから、Windowsの世界から出たくないよってもやし君にはちょうどいいかもしれない。

でもグラフィックリソースバリバリ使っているWindows OS 上でGPUって..どれくらいリソース開いてるのかはわからないけど..



Dockerインストールの方はTODOでからっぽだったが、Docker Hubにはもう載っかていた。

CPU版のほうのREADME.mdは

開発用Dockerイメージのビルド

 ./docker-build <タグ名>

これは、nnabla:<タグ名>という名前のDocker イメージを生成します。

使用可能なタグは、 Dockerfile.<タグ名> を使用して、このディレクトリのファイルに名前形式で表示されます。

とだけしか書かれていない。タグも今見たらlatestしかない..怖ェ..

CUDA版のREADME.mdは、

■NNablaのCUDA拡張機能

このリポジトリは、公式のCUDA / cuDNNで拡張されたNNablaの深い学習フレームワークです。


使用するには、デフォルトのコンテキストを 'cpu'から 'cuda.cudnn'に変更します:
from nnabla.contrib.context import extension_context

ctx = extension_context('cuda.cudnn', device_id=args.device_id)
nn.set_default_context(ctx)


現在、インストールのドキュメントと使用方法はbase NNablaに統合されています。



・FAQ
  近日公開


..どうもコンテキストというオブジェクト処理をコードに加えないとダメっぽいことが書かれている。
#TensorFlowのsession相当かもしれないなあ..

それに numpy のかわりに CuPy をとか nvidia-docker で動かせとかの指示もない..

Dockerは少し枯れるまで、待ったほうが良いかもしれない..




p.s.

どうでもいいはなしだが、NNabla の読み。
NNはニューラルネットワークをあらわしてるのだから
エヌエヌイネーブラ」と読んでいたが..
もしかしたら、単に「イネーブラ」と読んでほしいと思っているのかも..



(2017/08/22追記)

遅ればせながら..Neural Network Consoleの記事を読む。

SONYの本気!AI開発ツール『Neural Network Console』が現場の常識をぶっ壊す

この動画を見る限りでは




Azure Machine Learning と TensorBoard の機能を合わせた

ようなGUIツールらしい..

エンジンはこの NNabla らしいが、
どうもSONYは本気のようだ..

とすると、苦しくなるのが同じ日本勢のChainer..
なんたって事業継続性がネ...

..しかも日本人って大企業大好きだから..


個人的に
試そうとしたのですが、
Windows8.1以降らしく
残念ながら断念..
Ubuntu版ないのか..


..全部ビンボが悪いんや..


2017年6月19日月曜日

udemy のAI入門とTensorFlow入門を試してみた

AIブームというけれど、
それを使いこなすプログラマを育成する道具が
あまり揃っていない。

全員が全員、
TensorFlow のページをGoogle翻訳でゴリゴリ読むなんて
正直無理だ。

ド素人とまでは言わないが、
数年の経験をもつプログラマに使いこなしてもらわないと
とてもビジネスアプリケーション分野での発展は望めない。


..ということでいきついたのがudemy。

udemy は有料のeラーニングサービスで、
海外でも展開していてその日本版のサービスを試してみた。

日本版udemyはどうもあの Benesse が絡んでいるようなのだけど
..まあそのあたりのリスクはどうするかは始める人次第。

なぜ試してみたか..というのは、
AI、機械学習、ディープラーニングの良さげな研修が
あまりないこと。

幾つか存在するのだけど、
書籍も含め難易度が高い。
特に数式の出てこない本とかだと


私がパラ見した中では「はじめてのディープラーニング」という本くらい。
この本でも数式はどうしても出てくる。

個人的にはこの本はプロマネや営業..は辛いかもしれないけど技術系営業なら
できれば知っておいて欲しい単語がならんでいる。

なのでPMや技術系営業でAIと絡みそうない人は、
ちょっとづつ読みながら用語集を作っていくと
AI系のPMや営業業務にはついていける様になると思う。
#最後のCafeを使うセクションは飛ばしても良い

でも、これだと頭でっかちで、
どうしてプログラムを書かないで分類とか識別とかができるのか
というそもそもの本質的なところを埋めてくれないのだ。

それ用の本として



「ゼロから作るDeep Learning」というのがあるのだけど..
これが"ゼロから"とかいってるくせに
パーセプトロンとかXORとかNANDとか線形だ非線形だとか書いちゃって
「お前、教える気、ないやんけ!」
と思えるほど読む難易度が高い。


もっと3年目くらいのプログラマが手を使いながら
できればパーセプトロンとか線形とかの単語をそれほどつかわずに
おしえてくれそうな教材はないものか..

で、見つけたのがudemyの講座
「みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習」
https://www.udemy.com/learning-ai/

だ。

で、実際にやってみた。

テキストの流れは、以下の通り。

・コースと人工知能の概要
・準備
 Python2.7と最新版PyCharmをインストールする。
 ここで手順に従わず、Anaconda最新版でPython2.7仮想環境を作るのが実は近道。
・Pyhtonの基礎
 この講座の中でもっともつまらないセクション。
 だけど、後でPythonコードを書くので、一応知っておかないと進められない。
 ここをクリアすればAIのはなしに入ることができる。
 既に知ってる人は2倍速で飛ばせばいい。
 他の言語を知っている人は、四則演算の演算器とクラス、関数の書き方、リスト[]/タプル()/ディクショナリ{}の違いと使い方のところだけしっかり学習すればOK
・必要な数学の学習
 次のセクションで使うシグモイド関数を勉強するセクション。
 matplotlibというライブラリを使ってグラフをpythonで図示させて、継続意識を絶やさない講師の努力が伺える。
・ニューラルネットワーク
 「ゼロから作るDeep Learning」の2章「パーセプトロン」をわかりやすく、かつ順番にコードを肉付けしながら学んでいくこの講座の中心。
 ニューロンクラスを完成させ、ニューラルネットワーククラスで複数連結させるところまで。
・機械学習
 前のセクションで作ったニューラルネットワーククラスのWとbをどうやって自動学習できるようにするかをおしえるセクション。ここも中心のひとつ。
 バックプロパゲーションで微分を傾きとして教えている。
・機械学習ライブラリの活用
 自分で実装しなくてもライブラリがあるのでそれを使えば簡単に実装できるよという、応用セクション。
 scikit-learnをインストールするが、WindowsOS上のPython2.7.x系に直にscipyをインストールするところは、皆結構引っかかるところなのだけど、そこが書かれていない。
 最新のAnacondaでcondaしてpython2.7仮想環境を作っていればもんだいなし。
 動かすのはサポートベクタマシンを使ったMNISTと株価分析。
・さらに学ぶために
 ここはGPUの話やディープラーニングの例としてCNNやDCGAN(贋作者つきCNN)のほんのさわりだけしょうかいしてまとめ
 TensorFlowも使おうとするが、AnacondaでないWindows利用者は確実にハマる。
 でも疎通用プログラムを動かすだけなので無視してOK
・ボーナスレクチャー
 講師主催の勉強会案内などの、塾帰り直前とかの案内的な話


Python知らなくても学習するところから始めるし、数学用語は知らなくても継続可能。
バックプロパゲーションで?となる人もいるだろうが、ニュートン法を計算機実習で学んだ人ならほぼスルー可能。
このあたりだけごまかせば、たぶん新入社員でもなんとかなるだろう。

この講座は、環境面の問題がクリアできれば初心者SEのAIへのエントリポイントに最適だ。
ただPMや営業が必要としているのは、"用語"集のインストールだが、この講座はそこは満たすことができない。先の「はじめてのディープラーニング」とかの本を読みつつExcelシート上に用語集を作っていくのが最短ルートだとおもう。



この講座の"次"候補として、


【4日で体験】 TensorFlow x Python 3 で学ぶディープラーニング入門
https://www.udemy.com/tensorflow/


を受けたが、前の講座を公立小学校としたら、これは中学2年か。
("中1"部分が抜けてる気がする)

TesnorFlowのチュートリアルの最初にあるMNISTを順番に解説するが、
その後はサンプルコードをGitから落として動かすだけなので、
知識としてはCNN(畳み込みとプーリング、全結合層で何やっているか)
にとどまる。

本音としては、
tf変数がなんであるのとか、
計算グラフは定義しただけでは動作せずsessionをrunしてうごかすとか
runするときのディクショナリのplaceholderでpython界とC++界を行き来しているとか
を説明する講座が欲しいところだ。

MNIST以外の2つのセクションはそれぞれサンプルコードの動かし方例だが
これを1本にして、自然言語系のチュートリアルをCNNのように
詳細解説してほしいなあ..

講師からのコメントによるとこれかららしいが、
1つのコース内でいれてくれるか
別コースになるか..
なんとなく別コースになりそうな気がする..

なんにせよこのコースは修正過渡期なので
この段階で評価することは難しい。

..というか、TensorFlow は私の学習時期が悪すぎた..
はじめた翌日にTesnroFlow1.2.0がリリースされたし..

バージョン自体がグラグラしている時期だからなあ..
Keras優先したにしても、tf.keras問題もあるし...


既に1.3.0の噂も聞いているので、TensorFlow系の教育はあまり手を出さないほうが実は件名だったりスルのだけど、組織や個人の事情でそうもいってられないひともいるだろうし..



p.s.
講座を完了すると、以下のような修了証が発行される。





まあ、これはどうでもいいですが..


2017年6月16日金曜日

TensorFlow1.2.0実行環境をnvidia-dockerで立ち上げるシェルスクリプトを書いてみる




とってもヘボいので、晒すのもどうかなと思うのですが、自分の忘備録として記事にしておこうかな..と、ふと。

環境はCentOS7、hara2devというdockerグループにも入っているユーザで以下の3つのスクリプトはホームの下にdockerというディレクトリを切ってその中に入っているてい。


/home/hara2dev/docker/env_tensorflow.sh

#!/bin/bash
############################################################
# filename: env_tensorflow.sh
#
# (C) hara^2 development, 2017 all rights reserved.
############################################################

## Jupyter notebook password

PASSWORD=harahara

## PORT

# Jyupiter port
JUP_PORT=8888
# TensorFlow Boad port
TFB_PORT=6006
# REST API port
REST_PORT=3000

## TensorFlow Version

TF_VER=1.2.0
#TF_VER=1.1.0
#TF_VER=1.0.1

## CPU / GPU

# CPU
#NODE=
#DOCKER=/usr/bin/docker

# GPU
NODE=-gpu
DOCKER=/usr/bin/nvidia-docker

## Python Version

# 2.x
#PY_VER=

#  3.x
PY_VER=-py3

## docker image

DOCKER_IMAGE=tensorflow/tensorflow

## docker tag

#DOCKER_TAG=latest
DOCKER_TAG=${TF_VER}${NODE}${PY_VER}

## pid file path

PID_DIR=/home/hara2dev/docker/pid
#PID_DIR=.
PID_FILE=${PID_DIR}/${DOCKER_TAG}.pid

## bin path
# ubuntu
CAT=/bin/cat
RM=/bin/rm
# cent
#CAT=/usr/bin/cat
#RM=/usr/bin/rm


/home/hara2dev/docker/start.sh

#!/bin/bash
############################################################
# filename: start.sh
#
# (C) hara^2 development, 2017 all rights reserved.
############################################################

## env script path
ENV_PATH=./env_tensorflow.sh

## operations
source ${ENV_PATH}

${DOCKER} run \
   --name "${DOCKER_TAG}" \
   --publish "${JUP_PORT}:8888" \
   --publish "${TFB_PORT}:6006" \
   --publish "${REST_PORT}:3000" \
   --volume /home/hara2dev/docker/work:/notebooks/work \
   --volume /home/hara2dev/docker/share:/notebooks/share \
   --env HTTP_PROXY="http://proxy.server:8080/" \
   --env HTTPS_PROXY="http://proxy.server:8080/" \
   --env NO_PROXY="localhost,127.0.0.1,*.hara2dev.local" \
   --env PASSWORD="${PASSWORD}" \
   --log-driver=syslog \
   --log-opt syslog-address=tcp://172.17.0.1:514 \
   --log-opt tag="${DOCKER_TAG}" \
   --detach \
   --cidfile ${PID_FILE} \
   ${DOCKER_IMAGE}:${DOCKER_TAG}


/home/hara2dev/docker/stop.sh

#!/bin/bash
############################################################
# filename: stop.sh
#
# (C) hara^2 development, 2017 all rights reserved.
############################################################

## env script path
ENV_PATH=./env_tensorflow.sh

## operations
source ${ENV_PATH}

PID=`${CAT} ${PID_FILE}`

${DOCKER} stop ${PID}
${DOCKER} rm ${PID}

${RM} -rf ${PID_FILE}




ログインして
cd dockerして
start.shで起動、
stop.shで停止、
docker ps で状態確認。

コンテナ停止、即コンテナイメージ削除してますが
shareとworkというディレクトリを共有させているので
ここにファイルを置けばなんとかなるとおもって..

TensorFlowのバージョンやGPU指定Pythonバージョン指定などを
変更する場合は、停止している状態で env_tensorflow.sh を修正する。

あと、rsyslogdも動いているていで。


172.17.0.1 はデフォルトルータの一つでホスト側IPを指しているんだけど、ここにIP書くわけに行かないので、代わりにこのIPを入れてます。

ホントは、docker-composeしたいんだけど、GPUイメージはnvidia-docker起動だから..

TensorFlow 1.2.0 の変更点を翻訳してみる

今朝、自分のTwitterのタイムラインで TensorFlow が 1.2.0 になったことを知った。


前日TensorFlowサイトではたしかに一番上には "API r1.1" だったのが、今みるとたしかに " AIP r1.2" になっている。

TensorFlow DevSummit2017 の動画で、怒涛の更新がかかることは知っていたが、つい昨日動いていたサンプルコードが今日動かない憂き目をここ数ヶ月何度味わったことか..


しょうがないので Release 1.2.0 のところだけ翻訳してみた。
いつもどおり参照するかたは at your own risk でお願いします。

-----

Release 1.2.0


主な機能と改善点


  • WindowsでのPython 3.6をサポートしました。
  • 時空間デコンボリューションのための tf.layers.conv3d_transpose レイヤが追加されました。
  • tf.Session.make_callable() を追加しました。これは、同様のステップを複数回実行するオーバーヘッドを削減します。
  • contrib ibverbs ベースの RDMA サポートが追加されました(Yahoo @junshi15 の黙認により)。
  • RNNCell オブジェクトは、 tf.layers.Layer のサブクラスになりました。 TensorFlow 1.1 リリースで説明されている厳密性はなくなりました。 RNNCell が初めて使用されたときに、そのスコープがキャッシュされます。将来の RNNCell の使用はすべて同じスコープの変数を再利用します。これは TensorFlow バージョン <= 1.0.1 の RNNCells の動作からの大きな変化です。 TensorFlow 1.1 には、古いコードが新しいセマンティクスで正しく機能することを確認するためのチェックがありました。このバージョンでは RNNCell の柔軟な使用が可能になりますが、 TensorFlow <= 1.0.1 のコードを使用すると微妙なエラーにつながる可能性があります。たとえば、 MultiRNNCell([lstm] * 5) と書くと、各層が同じパラメータを共有する5層 LSTM スタックが構築されます。独自のパラメータで5つのレイヤーを取得するには、 MultiRNNCell([LSTMCell(...) for _ in range(5)]) と記述します。全くわからない場合は、最初に TF 1.1 でコードをテストしてください。エラーが発生していないことを確認し、 TF 1.2 にアップグレードしてください。
  • TensorForest Estimator は、サーブ用の SavedModel エクスポートをサポートするようになりました。
  • クライアント提供の ClusterSpec をサポートし、それらをすべてのワーカーに伝播し、動的な TensorFlow クラスタの作成を可能にします。
  • TensorFlow C ライブラリが Windows 用に利用可能になりました。
  • TensorBoard の新しいオープンソース版をリリースしました。
  • SavedModelMetaGraph を調べて実行するための SavedModel CLI ツールの提供。
  • TensorFlow の Android リリースは、アプリケーションへの統合を容易にするため、 jcenter にプッシュされるようになりました。 詳細については、 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/android/README.md をご覧ください。
  • RNNCells の変数名は、Keras レイヤーとの一貫性のために名前が変更されました。 具体的には、以前の変数名  "weights" と  "biases" がそれぞれ "kernel" と "bias" に変更されました。 このような RNN セルを含む古いチェックポイントに関する後方互換性が損なわれる可能性があります。この場合、ツール checkpoint_convert スクリプトを使用して古いチェックポイントの変数名を変換することができます。
  • 1.0 リリース以前の tf.nn 名前空間にあって、 tf.contrib.rnn に移動された多くの RNN 関数とクラスは、コア名前空間に戻されました。これには、 RNNCell 、 LSTMCell 、 GRUCell 、および他の多くのセルが含まれます。これらは現在 tf.nn.rnn_cell にあります(下位互換性のために tf.contrib.rnn のエイリアスが付いています)。元の tf.nn.rnn 関数は tf.nn.static_rnn になりました。双方向静的スタティック関数と状態保存静的関数も tf.nn 名前空間に戻ります。
  • 注目すべき例外は EmbeddingWrapper 、 InputProjectionWrapper 、 OutputProjectionWrapper です。これはゆっくりと tf.contrib.rnn の非推奨に移行します。これらは非効率的なラッパーで、 rnn の前処理または後処理として embedding_lookup または layers.dense を呼び出すことによって置き換えられることがよくあります。 RNN のデコードでは、この機能は tf.contrib.seq2seq の代替APIに置き換えられました。
  • インテルMKLインテグレーション( https://software.intel.com/en-us/articles/tensorflow-optimizations-on-modern-intel-architecture )。インテルは、数多くの最適化されたディープ・ラーニング・プリミティブを開発しました。行列の乗算とコンボリューションに加えて、これらのビルディング・ブロックには次のものがあります。直接バッチ・コンボリューションプール:最大、最小、平均正規化:LRN、多次元転置(変換)、分割、連結、合計、およびスケール。

廃止

  • TensorFlow 1.2 は、cuDNN 5.1 で構築する最後の機会になります。 TensorFlow 1.3 以降、cuDNN 6.0 を使用して、すべてのビルド済みバイナリをビルドしようとします。 私たちは、ソースコードを cuDNN 5.1 と互換性を保つように努めますが、最善の努力をします。

API の変更点

  • org.tensorflow.contrib.android.TensorFlowInferencefaceは可能な限り例外をスローし、メソッドシグネチャを単純化しました。


Contrib APIの変更

  • tf.contrib.util.create_exampleを追加しました。
  • tf.contrib.imageに双線形補間を追加しました。
  • カスタムのシードコントロールを使用してランダム操作にtf.contrib.statelessを追加します。
  • contrib/distributions/ に追加された MultivariateNormalFullCovariance
  • tensorflow/contrib/rnnは、Kerasレイヤーとの一貫性のためにRNNセル変数の名前を変更します。 具体的には、前の変数名「weights(重み)」と「biases(バイアス)」をそれぞれ「kernel(カーネル)」と「bias(バイアス)」に変更する。 このようなRNNセルを含む古いチェックポイントに関する後方互換性が損なわれる可能性があります。この場合、checkpoint_convertスクリプトを使用して古いチェックポイントの変数名を変換することができます。
  • TensorFlowのprimal(明示的)カーネルメソッドのためのOpsestimatorsを持つtf.contrib.kernel_methodsモジュールを追加しました。


バグ修正、その他の変更

  • Python では、 type 属性の Operation.get_attr は、 protobuf 列挙型ではなく、予想される get_attr ドキュメントに一致する Python DType バージョンの型を返します。
  • iOS ライブラリを構築する際に、 MIN_SDK のバージョンを 8.0 に変更しました。
  • LIBXSMM の統合を修正しました。
  • decode_jpeg/decode_png/ decode_gif がすべてのフォーマットを扱うようにするのは、ユーザーが画像を間違ったタイプとして解読しようとすることが多いからです。
  • 暗黙 broadcasting の低下を改善。
  • GCS/Bigquery クライアントの安定性を向上させます。
  • proto 依存関係を最小限に抑えるために、 OpKernelConstruction::op_def() を削除してください。
  • VectorLaplaceDiag ディストリビューションが追加されました。
  • Android のデモでは libtensorflow_demo.so を実行する必要はありません( libtensorflow_inference.so はまだ必要です)
  • categorical_column_with_vocabulary_file を追加しました。
  • Session::Run() 呼び出しでテンソルをバッチ/アンバッチするための ops を導入します。
  • tf.log_sigmoid(x) = tf.log(tf.sigmoid(x)) = -tf.nn.softplus(-x) を追加します。
  • フックリストを変更不能なタプルに変更しました。これで、関連する引数の任意の反復可能性が可能になりました。
  • TFDecorator を紹介します。
  • 音声機能の生成に Mfcc を追加しました。
  • 改善された DirectSession::Run() オーバーヘッドとエラーチェック。内部エラーを非同期的に発生させる代わりに、間違った型の値を入力すると INVALID_ARGUMENT エラーが同期的に発生するようになりました。間違った型のテンソルを与えるときの(未定義の)振る舞いに依存するコードを更新する必要があるかもしれません。
  • 還元されていない NONE を追加し、損失の MEAN オプションを減らしました。 他の縮小定数から "WEIGHTED_" 接頭辞を削除しました。
  • assertAllClose dicts を処理するようになりました。
  • HloInstructions 用の Gmock マッチャを追加しました。
  • 変数の復元時にエラーに var 名を追加します。
  • オーディオ機能生成用の AudioSpectrogram を追加しました。
  • 損失の削減 arg を追加しました。
  • tf.placeholder は、スカラー形状を表すことができ、部分的に知られています。
  • estimator_spec(mode) 引数を削除してください。
  • オーディオ機能生成用の AudioSpectrogram を追加しました。
  • TensorBoard は、40回以上実行されている場合、デフォルトですべての実行を無効にします。
  • 古いドキュメント生成コードを削除しました。
  • GCS ファイルシステムの統合で、ドメインバケット( gs://bucket.domain.com/path など )がサポートされるようになりました。
  • テキストを TensorBoard に出力するための tf.summary.text を追加します。
  • tfdbg のコマンドラインインターフェースの "run" コマンドは、ノード名、opタイプ、およびテンソルdtypeによるテンソルのフィルタリングをサポートするようになりました。
  • tf.string_to_numberint64 float64 の出力をサポートするようになりました。

 

貢献に対する謝辞


このリリースには、Googleの多くの人々の貢献が含まれていますのでここに感謝の意を表します:

4F2E4A2E, Aaron Schumacher, Abhi Agg, admcrae, Adriano Carmezim, Adrià Arrufat, agramesh1, Akimitsu Seo, Alan Mosca, Alex Egg, Alex Rothberg, Alexander Heinecke, Alexander Matyasko, Alexandr Baranezky, Alexandre Caulier, Ali Siddiqui, Anand Venkat, Andrew Hundt, Androbin, Anmol Sharma, Arie, Arno Leist, Arron Cao, AuréLien Geron, Bairen Yi, Beomsu Kim, Carl Thomé, cfperez, Changming Sun, Corey Wharton, critiqjo, Dalei Li, Daniel Rasmussen, Daniel Trebbien, DaríO Hereñú, David Eng, David Norman, David Y. Zhang, Davy Song, ddurham2, Deepak Subburam, Dmytro Kyrychuk, Dominic Rossi, Dominik SchlöSser, Dustin Tran, Eduardo Pinho, Egil Martinsson, Elliot Saba, Eric Bigelow, Erik Smistad, Evan Klitzke, Fabrizio Milo, Falcon Dai, Fei Gao, FloopCZ, Fung Lam, Gautam, GBLin5566, Greg Peatfield, Gu Wang, Guenther Schmuelling, Hans Pabst, Harun Gunaydin, Huaizheng, Ido Shamay, Ikaro Silva, Ilya Edrenkin, Immexxx, James Mishra, Jamie Cooke, Jay Young, Jayaram Bobba, Jianfei Wang, jinghua2, Joey Meyer, John Maidens, Jonghoon Jin, Julian Villella, Jun Kim, Jun Shi, Junwei Pan, jyegerlehner, Karan Desai, Karel Van De Plassche, Kb Sriram, KhabarlakKonstantin, Koan-Sin Tan, krivard, Kwotsin, Leandro Gracia Gil, Li Chen, Liangliang He, Louie Helm, lspvic, Luiz Henrique Soares, LáSzló Csomor, Mark Wong, Mathew Wicks, Matthew Rahtz, Maxwell Paul Brickner, Michael Hofmann, Miguel Flores Ruiz De Eguino, MikeTam1021, Mortada Mehyar, Mycosynth, Namnamseo, Nate Harada, Neven Miculinic, Nghia Tran, Nick Lyu, Niranjan Hasabnis, Nishidha, Oleksii Kuchaiev, Oyesh Mann Singh, Panmari, Patrick, Paul Van Eck, Piyush Chaudhary, Quim Llimona, Raingo, Richard Davies, Ruben Vereecken, Sahit Chintalapudi, Sam Abrahams, Santiago Castro, Scott Sievert, Sean O'Keefe, Sebastian Schlecht, Shane, Shubhankar Deshpande, Spencer Schaber, Sunyeop Lee, t13m, td2014, Thomas H. P. Andersen, Toby Petty, Umang Mehta, Vadim Markovtsev, Valentin Iovene, Vincent Zhao, Vit Stepanovs, Vivek Rane, Vu Pham, wannabesrevenge, weipingpku, wuhaixutab, wydwww, Xiang Gao, Xiaolin Lin, xiaoyaozhuzi, Yaroslav Bulatov, Yi Liu, Yoshihiro Sugi, Yuan (Terry) Tang, Yuming Wang, Yuxin Wu, Zader Zheng, Zhaojun Zhang, zhengjiajin, ZhipengShen, Ziming Dong, zjj2wry

私たちは、問題提起し、解決するのを助け、質問し、質問に答えたすべての人にも感謝しています。


--------
ここまで。

やはりというか、RNN系のサンプルはまた影響を受ける..というか戻すとかいうのは..正直「えっ」となってしまうよねえ..

このあたりのいじりが多いのは、テキスト操作系のディープラーニングをGoogleが頑張っていると読んで良いのだろうか..

1.2.0 で keras がとりこまれることは DevSummit の動画で知っていた。たしかあのときは tf.keras だったのだけど、 tf.contrib.keras ?まさかまた正式ライブラリとして tf.keras 昇格なんてないだろうな..


2017年6月12日月曜日

PROXY環境下でRedmine/Jenkins/RocketChatをdocker-composeで管理する

表題の環境を作ったので、ブログにも残しておきます。

docker/docker-composeが使用可能なアカウントが読み書きできる適当なディレクトリで、以下のような docker-compose.yml ファイルを作成します。

version: '2'

services:

  jenkins:
    image: jenkins:latest
    restart: unless-stopped
    volumes:
      - ./data/jenkins:/var/jenkins_home
    ports:
      - 3002:8080
      - 50000:50000
    environment:
      - TZ=Asia/Tokyo
      - HTTP_PROXY=http://your.proxy.server:8080
      - HTTPS_PROXY=http://your.proxy.server:8080

  redmine:
    image: redmine:latest
    restart: unless-stopped
    volumes:
      - ./data/redmine:/usr/src/redmine/files
    ports:
      - 3001:3000
    environment:
      - REDMINE_DB_MYSQL=mariadb
      - REDMINE_DB_PASSWORD=admin123
      - TZ=Asia/Tokyo
      - HTTP_PROXY=http://your.proxy.server:8080
      - HTTPS_PROXY=http://your.proxy.server:8080
    depends_on:
      - mariadb

  mariadb:
    image: mariadb:latest
    restart: unless-stopped
    volumes:
      - ./data/mariadb/conf:/etc/mysql/conf.d
      - ./data/mariadb/data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=admin123
      - MYSQL_DATABASE=redmine
      - TZ=Asia/Tokyo

  rocketchat:
    image: rocketchat/rocket.chat:latest
    restart: unless-stopped
    volumes:
      - ./data/rocketchat:/app/uploads
    ports:
      - 3000:3000
    environment:
      - PORT=3000
      - ROOT_URL=http://your.host.fqdn:3000
      - MONGO_URL=mongodb://mongo:27017/rocketchat
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
      - MAIL_URL=smtp://127.0.0.11
      - TZ=Asia/Tokyo
    depends_on:
      - mongo
    labels:
      - "traefik.backend=rocketchat"
      - "traefik.frontend.rule=Host: your.domain"

  mongo:
    image: mongo:3.2
    restart: unless-stopped
    volumes:
     - ./data/mongo/db:/data/db
     - ./data/mongo/dump:/dump
    command: mongod --smallfiles --oplogSize 128 --replSet rs0
    labels:
      - "traefik.enable=false"

  mongo-init-replica:
    image: mongo:3.2
    command: 'mongo mongo/rocketchat --eval "rs.initiate({ _id: ''rs0'', members: [ { _id: 0, host: ''localhost:27017'' } ]})"'
    depends_on:
      - mongo

ポートは3000~3002へ変更していますが、このあたりは各自で適当に振り替えてください。

RocketChatの http://your.host.fqdn:3000 はホスト側のFQDNに変更してください。
また your.proxy.server:8080 も環境に合わせて変更してください。

imageのタグ"latest"はそれぞれバージョンを指定してあげたほうが良いと思います。
なお Jenkins は自分でバージョンを上げる機能があるので、latestでも良いかもしれません(新バージョンが出てくるとトップにメッセージが出て、リンクを踏むと更新できるようになっている)。

起動するにはまず docker-compose.ymlが存在するディレクトリ上に data ディレクトリを作成します。
CentOSでSELINUX=enforcingしている場合は

chcon -Rt svirt_sandbox_file_t ./data

を実行しておいてください。
またfirewalldenableにしたまま運用する場合、firewall-cmdでポートを使えるように設定しておいてください。

firewall-cmd --zone=public --add-port=3000/tcp --permanent
firewall-cmd --zone=public --add-port=3001/tcp --permanent
firewall-cmd --zone=public --add-port=3002/tcp --permanent
firewall-cmd --reload



最初に起動する場合だけ

docker-compose up -d

でうごかします。 up は、イメージのダウンロードから起動までおこないます。
ただし Jenkins は、初回の起動時のみログ上に初回パスワードが表示されます。
なので

docker-compose logs jenkins

を実行してパスワードを確認してください。
最後のjenkins部分をdocker-compose.yml上のほかのコンテナ名(redmine, mariadb, rocketchat, mongo)にすることで、それぞれのログを参照できます。


コンテナの状態確認は

doker-compose ps

です。動作中かどうか確認できます。
mongo-init-replicaはレプリカなのでExitしているのが正常です。

全部一気に起動・停止させる場合は

docker-compose start
docker-compose stop

でおこないます。今回はrestart指定をunless-stoppedにしているので、上記のstopをかけずにOSのrebootを行うと、自動でコンテナも再起動します。


個別コンテナの起動・停止・再起動は、logs同様最後にdocker-compose.yml上のコンテナ名を最後に指定します。

docker-compose start redmine
docker-compose stop redmine
docker-compose restart redmine

redminedepend_onmariadbも指定しているのでstart時にmariadbが起動していなければ一緒に起動しますが、stop時はmariadbを落としません。

redmineのマイナーバージョンを3.3.1から3.3.2にしたい場合は、一旦redmineだけ停止し、docker-compose.ymlimageラストのタグを3.3.2に変えてから以下のコマンドを実行します。

docker-compose rm redmine
docker-compose up -d redmine

mariadb上のオブジェクト構成をマイナーバージョンで変えていなければ正常にバージョンアップが可能になります。

redmineのプラグインをインストールするためにログインしたい場合は、以下のコマンドで入ることができます。

docker-compose exec redmine /bin/bash

どうもredmine(、jenkins、rocketchatも,)コンテナはUbuntu/apt構成なのでaptしたり、curlしたりする場合は、それぞれのプロクシ設定を行う必要があります

Jenkins のプラグインは初期設定指示のプロクシ指定さえ正しく行えていれば、execする必要なく実行できます。


バックアップは、docker-compose.ymlの存在するディレクトリ上に backup をつくっておいて
以下のようなスクリプトをcrontabなどに仕込んでおけば1日分の復元は可能です。

#!/bin/sh
TAR=/usr/bin/tar
COMPOSE=/usr/local/bin/docker-compose
RSYNC=/usr/bin/rsync
# docker-compose.ymlのあるディレクトリフルパス
CONTAINERS_HOME=hogehoge
# rsync server config
RSYNC_SERVER=your.rsync.server
RSYNC_TARGET=your_rsync_server_target
#
# operations
#
cd ${HOGEHOGE}
${COMPOSE} stop
${TAR} cvfz ./backup/data.tar.gz ./data
${COMPOSE} start
#${RSYNC} -avz --delete ${CONTAINERS_HOME}/backup/ ${RDYNC_SERVER}:${RSYNC_TARGET}

上記スクリプトではrsyncで移動させていますが、別途rsyncサーバが必要なのでコメント化してあります。

当然、タグをlatestにしていて、復元時にメジャーバージョンアップされてしまうと戻せなくなったりするので注意してください。





おそらく、Redmine、Jenkins、rocketChatなどのアジャイル開発3種の神器はdocker-composeで上げ下げ・rysncでバックアップが正解なきがしています。

なので、PMOのおじさんたちはdocker/docker-composeはしっかり覚えて欲しいところですねえ..

2017年6月9日金曜日

Official なredmineイメージをdocker-composeしたらデフォルト設定ロード時にエラーになる


Docker HubにRedmineのofficialイメージがある。
これを使ってDocker CE(17.03)上でコンテナをあげようとしたのだけど、うまく行かなかった。


Official Repository redmine
https://hub.docker.com/_/redmine/

ここのREADME.md上にdocker-compose.yml

version: '2'

services:

  redmine:
    image: redmine
    ports:
      - 8080:3000
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: example
    depends_on:
      - db
    restart: always

  db:
    image: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: redmine
    restart: always

と書かれているので、既にjenkins(tomcat)で使ってる
8080のところを3000にして動かそうとしたら..

redmine コンテナがやたらRestartを繰り返すのだ。


で、docker-compose logs redmine したら
gem失敗していることに気づく。

どうも、proxyが引けないらしい..

ということでdocker-compose.yml上の environment: に
環境変数 HTTP_PROXY (と念のため HTTPS_PROXY)をセットした。

で、開こうとしたら..
http://redmine.. :3000/ から admin/admin でログインはできたのだけど、
管理画面の先頭に最初だけ出てくる日本語環境の「デフォルト設定のロード」ボタン
押すと

デフォルト設定がロードできませんでした: Mysql2::Error: Incorrect string value: '\xE7\xAE\xA1\xE7\x90\x86...'

なるメッセージが出てしまう..

これ..MySQL..じゃなく mariadb の文字コード設定の問題がでているらしい。

mariadbイメージ..official docker hubサイトを調べてみた。

Official Repository mariadb
https://hub.docker.com/_/mariadb/


残念ながら良さげな環境変数はなかった。
environmentを1行加えるだけという訳にはいかないらしい..

だが、ホスト側のcnfファイルを追加で読んでくれるconf.dexposeされているので
これを使った。

最終型のdocker-compose.ymlは大体以下のような感じ。

version: '2'

services:

  redmine:
    image: redmine:latest
    restart: unless-stopped
    volumes:
      - ./data/redmine:/usr/src/redmine/files
    ports:
      - 3001:3000
    environment:
      - REDMINE_DB_MYSQL=mariadb
      - REDMINE_DB_PASSWORD=example
      - HTTP_PROXY=http://your.proxy.server:8080
      - HTTPS_PROXY=http://your.proxy.server:8080
    depends_on:
      - mariadb

  mariadb:
    image: mariadb:latest
    restart: unless-stopped
    volumes:
      - ./data/mariadb/conf:/etc/mysql/conf.d
      - ./data/mariadb/data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=example
      - MYSQL_DATABASE=redmine

イメージのタグ、latest だと運用上マズイので、
本番ではキチンとバージョンを指定してやるようにしてください。

最初に docker-compose up する前に用意した
./data/mariadb/conf/server.cnf はホスト側のmariadbの本物(/etc/my.cnf.d/server.cnf)をつかったが、
たぶん

[mysqld]
character-set-server=utf8

だけでも大丈夫だとは思う。試してないけど...


運用上restartalwaysより最後のdocker-compose stopが効くコッチがよかろうということで
unless-stoppedに変更している。

あとバックアップをdocker-compose stopして ./data
まるっとコピーするので、exposeされたvolumeは全部使った。

SELINUX=enforcing のままredmineを導入する場合は
念のため chcon -Rt svirt_sandbox_file_t ./data しておいたほうがいいだろう。



にしても..

ひさしぶりにdocker-compose使ったが..
相当手が入っているなあ..

裏でネットワーク用コンテナ上がるようになっていて
bridgeだのhostだのnullだの選択できるようになってる..

docker-compose.ymlファイルごとにIPアドレスが172.17.0.2やら172.20.0.2やら
ちょっとづつ変わる。

コンテナ側のリゾルバはみな127.0.0.11をさしていて
どうもこれがホスト側のDNSリソルバ設定につながっているらしい..

なのでホスト側IPアドレスのエイリアスアドレスなのかと
内部からホスト側を呼ぶときにコレを使おうとしたら
うまく行かなかった...

ホスト側のFQDNをキチンとDNSで登録するかhostを使えということらしい..

裏技として..かならず作成されるデフォルトbridgeのゲートウェイIP
172.17.0.1 をホスト側のIPとしてつかうことはできる..けど美しくない!


ホストサーバをFreeIPAとかでたてていて
DESSEC設定変えたくないばっかりに
FreeIPAにはフォワーダ指定なしにして
ホスト側のリゾルバにフォワーダだけ登録して抜けていたが
このせいでホスト側のDNSサーバのforwarderをセットしなくちゃならない羽目にあった..


Dockerは、ますます重くなっていくのだろうか...

これじゃVMwareやVirtualBoxとかわらなくなってきちまうよ..


既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...