2016/04/04 ククククククク ククククク ククククク クククククククククククククク ・ TensorFlow ク CNTK
2016/04/04 クラウド研究会 丸山不二夫
ニューラル・ネットワークと技術革新の展望TensorFlow と CNTK
Agenda ニューラル・ネットワークと技術革新の展望
クラウドとモバイルへのインパクト 我々自身がデータをもつことの重要性
ニューラル・ネットワーク技術の共通の基礎 訓練と実行 グラフ表現とモジュール構造 パラメーター変更のアルゴリズム
TensorFlow と CNTK CNTK の高速化チューニング TensorFlow の大規模分散化
ニューラル・ネットワークと技術革新の展望
クラウドとモバイルへのインパクト 我々自身がデータをもつことの重要性
Part I
クラウドとモバイルへのインパクト
クラウド・ビジネスの新しい市場 新しいスタイルのモバイル・アプリ GCPNEXT から 技術とビジネス --- Google の場合 今後の展望
ニューラル・ネットワークの訓練と推論実行の「非対称性」 ニューラル・ネットワークでの計算は、データ学習
を行う「訓練」と「推論実行」の大きく二つのフェーズに分かれる。
訓練では、膨大なデータを繰り返し学習して、ニューラル・ネットワーク内部のパラメーターを、少しづつ修正していく。それは、大規模で時間のかかるバッチ処理になる。
しかし、こうしていったん学習されたパラメーターを利用すれば、推論(数値予測・クラス分類等)を実行するのは、スマホ上でもリアルタイムに可能なぐらい、軽い処理になる。
ニューラル・ネットワークの訓練と実行の二つのフェーズの、必要とされる処理能力の大きな「非対称性」は、今日の IT の基本的なインフラであるクラウドとモバイルの双方の今後に、大きなインパクトを与えていくだろう。
「訓練」のサービス提供クラウド・ビジネスの新しい市場 訓練のフェーズで必要とされる、膨大なデータ処理
の能力は、クラウド・ビジネスに、訓練のサービスを提供するという、これまでになかった新しい市場を提供していくだろう。
今回の GCPNEXT では、商業サービス公開の発表はなかったが、 Google Cloud Machine Learning がターゲットとしているのは、そうした市場だ。このクラウドの新しい市場でも、 Google は先行しているように見える。 小論の Part III でも述べるように、Google は、 TensorFlow の大規模分散化に注力している。
Google Cloud Machine Learning
GCPNEXT 2016 での Jeff Dean
新しいスタイルのモバイル・アプリ 学習の成果が、モバイル上でも実行可能なことは、
ネイティブ・アプリとも Web アプリともことなった第三のスタイルのモバイル・アプリが生まれることを意味する。それは、プログラムではなく、訓練済みのデータに基づいて動作する。
既に、 TensorFlow では Google の画像認識のInception 相当モデルが、ネットワーク接続なしでも Android 上で動くサンプルが提供されている。これは、驚異的なものだ。
ここではまた、クラウドがモバイルにリアルタイムの AI サービスを提供することも可能になる。今回公開された Speech API や Vision API は、そうしたものだ。当然、クラウド上・モバイル上のそれらのハイブリッド・アプリが生まれてくるだろう。
Cloud Vision API
GCPNEXT 2016 から
Cloud Vision API
GCPNEXT 2016 から
Cloud Vision API
GCPNEXT 2016 から
Cloud Vision API
GCPNEXT 2016 から
Cloud Vision API
GCPNEXT 2016 から
Cloud Vision API
GCPNEXT 2016 から
Cloud Speech API
GCPNEXT 2016 から
Use your own data to train models
GCPNEXT 2016 から
技術とビジネス --- Google の場合
Google 内部での機械学習技術の利用は急増している。ただ、それには理由がある。それは、彼らの基本的なビジネスである検索と広告の分野で、機械学習技術が極めて有効に利用可能だという認識が広まっているからである。技術をビジネスがドライブし、ビジネスを技術がドライブしている。
Google 内部での Deeo Learning 技術利用の拡大
Cloud Machine Learning の発表では、どんなデモが行われたか?
GCP NEXT での Click Prediction デモ
よく見えないので拡大してみた
目標は、過去のクリックのデータから、ユーザーがもっともクリックしそうな広告・コンテンツを見つけるということ。そのために、 BigQuery 上の大量のクリック・ストリームのデータを利用して、大規模な確率モデルを訓練して、大規模な予測を実行する。
Click Prediction
Google RankBrain !!!
https://goo.gl/o7RQrU
他の例より規模が一桁大きい
https://goo.gl/o7RQrU
自動応答メール Smart Reply
今後の展望新しい分散処理技術と言語理解へ それらをコントロールする技術は、人間の脳が、感覚・運動器官として相対的には独立した、眼・耳・口・ ... をコントロールしているのに似た、新しいハードウェアの利用を含む、ソフトウェアだけに閉じない新しい分散処理技術の時代の扉を開いて行くだろう。
ニューラル・ネットワークの最先端の研究は、 RNN/LSTM に移行している。そこでの中心的な課題は、 Sequence to Sequence と言われる、基本的には、言語理解に関わる問題である。この分野でも、大きな展開が起きる可能性がある。そうした飛躍が可能になれば、その応用分野は広大である。
https://goo.gl/o7RQrU
Sequence to Sequence
https://goo.gl/o7RQrU
Sequence to Sequence
我々自身がデータをもつことの重要性
機械学習の基本 基本的なデータたち Human Computing どう、データをつくるか?
機械学習の基本は、人間の知識を機械に移転すること
機械学習の基本を確認しよう。ただ、人間の知識を機械に移転するためには、単にマシンと大量のデータがあればいいというわけではない。正確にラベル付けられたデータの「作成」と「蓄積」が不可欠。それには、人間の根気強い、組織的な取り組みが必要。
「人間には容易でも機械には難しいこと」「機械には容易でも人間には難しいこと」
その境界は、動的に変化するのだが、いつの時点でも、機械に提供する学習データ作りは、前者。その段階を経なければ、機械は賢くならない。現実的には、それぞれに要する経済的なコストが、現実を動かす。その費用を、誰がどう負担するのか? 以下で、基本的な学習用データセットを見てみよう。
http://yann.lecun.com/exdb/mnist/
MNIST 手書き数字のデータベース
60,000 サンプル
CIFAR-10 10 のカテゴリーの画像データ
一つのカテゴリーに 6,000枚。計 60,000 サンプル
https://www.cs.toronto.edu/~kriz/cifar.htmlTront 大学
ImageNet
http://www.image-net.org
WordNet の名詞( 80,000+ )に対応した画像データベース
Stanford 大学
https://wordnet.princeton.edu/
Princeton 大学
The Penn Treebank Project
https://www.cis.upenn.edu/~treebank/
Pennsylvania 大学
https://www.ldc.upenn.edu/
The Penn Treebank Project
基本的な性格をもつオープンなデータの共有が、機械学習のイノベーションをドライブしている
先の「データ作成のコスト」の問題に対する最も有力な回答は、オープンなコミュニティ(大学・学会を含む)が、基本的な性格をもつ学習用データを公開し、それを皆が共有すること。(日本は、どうだろう? 少なくとも日本語は、日本がやるしかない。)
Human Computing
「人間には容易でも機械には難しいこと」Captcha画像のラベル付け ( with Google )Duolingoゲミフィケーションとクラウド・ソーシング
人間の自由時間の利用 2003年に、ソリティアを遊んだ、人間の総
時間は、 90億時間。 ある人たちは、コンピュータの無駄な計算サ
イクルについて話をしているが、人間の無駄なサイクルについては、どうなんだろう?
エンパイア・ステートビルを作るために、人間が使った時間は、 700万時間。
パナマ運河を作るために、人間が使った時間は、 2000万時間。(ソリティアの一日分以下)Carnegy Melon Univ. Luis von Ahn
Most human can pass, but current computer can not pass.
http://elie.im/blog/security/five-surprising-captcha-schemes/#.UjUKt7zqH9I
http://www.youtube.com/watch?v=tx082gDwGcM
Human Computing / Crowd Sourcing2012年 Google TechTalk
我々が、それぞれのドメインで持つ知識を、きちんとデータ化すること
それを機械に学習させる。量優先で質的規定が曖昧な Big Data ではなく、優れた質をもった、それぞれのドメインに固有のGood Data を持つことが、より重要。ニッチでもいい。チャンスは、 AI の応用領域の数ほど、たくさん存在している。もちろん、その前提は、基本的なオープンなデータの存在と共有なのだが。
ニューラル・ネットワーク技術の共通の基礎
訓練と実行 グラフ表現とモジュール構造 パラメーター変更のアルゴリズム
Part II
ニューラル・ネットワーク技術の共通の基礎
ニューラル・ネットワークの様々なフレームワークが提案されている。ただ、それらの基礎にあるのは、共通のものだ。ここでは、次の三点で共通性を見ることにする。
訓練の定義と実行 グラフ表現とモジュール構造 パラメーター変更のアルゴリズム
訓練の定義と実行
訓練の実行 -- TensorFlow と CNTK 訓練の定義 -- TensorFlow と CNTK
Part II ニューラル・ネットワーク技術の共通の基礎
訓練の定義と実行ニューラル・ネットワークの学習は、基本的には、次のようなステップからなる。 訓練の定義
推論を行うネットワーク・グラフの定義 学習、すなわち、ネットワークのパラメーターの変更を行
うアルゴリズムの定義 訓練、すなわち、データでの繰り返し学習を行う、繰り返
しの定義 ...
訓練の実行
訓練の実行 -- TensorFlow と CNTK
訓練の実行での、 TensorFlow と CNTKのコマンド・シーケンスを見てみよう。ここでは、まだ、違いしか見えてこない。
訓練の実行例 TensorFlow$ python –m モデル$ python -m tensorflow.models.image.mnist.convolutional
tensorflor-master/tensorflow/ 以下
訓練の実行例 CNTK$ cntk configFile=cntk ファイル$ cntk configFile=../Config/02_Convolution.cntk
CNTK/Examples/ 以下
訓練の定義 -- TensorFlow と CNTK
TensorFlow と CNTK の訓練の定義を比較してみよう。 TensorFlow は Python で手続きをベタに記述し、 CNTK は宣言的な Domain Specific Language を使う。違いが目立つが、グラフの定義・最適化のアルゴリズムの指定・訓練の繰り返しの指定等で、基本的な対応が見え始める。
# Create the modelx = tf.placeholder("float", [None, 784])W = tf.Variable(tf.zeros([784, 10]))b = tf.Variable(tf.zeros([10]))y = tf.nn.softmax(tf.matmul(x, W) + b)
# Define loss and optimizery_ = tf.placeholder("float", [None, 10])cross_entropy = -tf.reduce_sum(y_ * tf.log(y))train_step = tf.train.GradientDescentOptimizer(0.01)\ .minimize(cross_entropy)
# Traintf.initialize_all_variables().run()for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) train_step.run({x: batch_xs, y_: batch_ys})
グラフの定義
最適化のアルゴリズム
グラフで訓練繰り返し
https://goo.gl/MwscZO
訓練の定義例 TensorFlow
ndlMacros = "$ConfigDir$/Macros.ndl”
train = [ action = "train”
NDLNetworkBuilder = [ networkDescription = "$ConfigDir$/02_Convolution.ndl” ] < ndlは、 Net Definition Language 次にリストを示す >
SGD = [ epochSize = 60000 minibatchSize = 32 learningRatesPerMB = 0.5 momentumPerMB = 0*10:0.7 maxEpochs = 15 ]
reader = [... ]]
訓練の定義例 CNTK
グラフの定義
繰り返しの指定
....run = DNN // 実際に DNN という名前のグラフを構成する
ndlMnistMacros = [ .... ]
DNN = [ .... <省略: グラフの定義の一部を次ページに示す > .... ce = CrossEntropyWithSoftmax(labels, ol ) err = ErrorPrediction(labels, ol)
# Special Nodes FeatureNodes = (features) LabelNodes = (labels) CriterionNodes = (ce) EvalNodes = (err) OutputNodes = (ol) ]
最適化のアルゴリズム
02_Convolution.ndl 最適化の定義 CNTK
DNN = [ .... # conv1 kW1 = 5; kH1 = 5; cMap1 = 16 hStride1 = 1; vStride1 = 1 # weight[cMap1, kW1 * kH1 * inputChannels] # ConvReLULayer is defined in Macros.ndl conv1_act = ConvReLULayer(featScaled, cMap1, 25, kW1, kH1, hStride1, vStride1, 10, 1) # pool1 ... # conv2 ... # pool2 ... # DNNImageSigmoidLayer and DNNLayer are defined in Macros.ndl h1 = DNNImageSigmoidLayer(4, 4, cMap2, h1Dim, pool2, 1) ol = DNNLayer(h1Dim, labelDim, h1, 1)
ce = CrossEntropyWithSoftmax(labels, ol) ...]
02_Convolution.ndl グラフの定義 CNTK
Macros.ndl を参照している
ConvReLULayer(inp, outMap, inWCount, kW, kH, hStride, vStride, wScale, bValue) = [ convW = LearnableParameter(outMap, inWCount, init="uniform", initValueScale=wScale) convB = ImageParameter(1, 1, outMap, init="fixedValue", value=bValue, imageLayout=$imageLayout$) conv = Convolution(convW, inp, kW, kH, outMap, hStride, vStride, zeroPadding=false, imageLayout=$imageLayout$) convPlusB = Plus(conv, convB); act = RectifiedLinear(convPlusB);]DNNImageSigmoidLayer(inW, inH, inC, outDim, x, parmScale) = [ ... ]DNNLayer(inDim, outDim, x, parmScale) = [ W = LearnableParameter(outDim, inDim, init="uniform", initValueScale=parmScale) b = LearnableParameter(outDim, 1, init="uniform", initValueScale=parmScale) t = Times(W, x) z = Plus(t, b)]
Macro.ndl グラフの定義 CNTK
マクロを見るとネットワークの見慣れた形が見えてくる
ニューラル・ネットワークのグラフ表現とモジュール構造
DNN のグラフ表現とモジュール構造 CNN のグラフ表現とモジュール構造 RNN モジュールの数式による表現
Part II ニューラル・ネットワーク技術の共通の基礎
丸山の次の資料を参照されたい https://goo.gl/Q0mKfy
ニューラル・ネットワークのグラフ表現とモジュール構造
それぞれのフレームワークごとに表現のスタイルには違いがあるものの、重要なことは、それが表現しているニューラル・ネットワークの「グラフ」は、同一のものであるということである。それは、基本的なモジュールの組み合わせでできている。
DNN のグラフ表現とモジュール構造
まずは、基本的な DNN (Deep Neural Network) のグラフ表現とモジュール構造を見ていこう
ニューラル・ネットワークの例
これでも省略されている 784->8
DNN のグラフ
TensorFlow では、複数のニューロンからなる一つの層は、次のようなグラフで表現される。
行列の積X
W
行列の和
b
φ の適用
5 つのノードがあるが、 W と b には、重みとバイアスの値が入り、残りの 3 つのノードは、演算を行うノードである。この層の働きは、φ(X ・ W+b) で表現される。
一つの層
積X
W和
bφ 積
W和
bφ
隠れ層の ニューロン数 :15 重み WH: 784x15次元 バイアス bH: 15次元
出力層の ニューロン数 :10 重み WO: 15x10次元 バイアス bO: 10次元
入力層 隠れ層 出力層
こっちのグラフの方が、ずっとわかりやすい!
隠れ層の 入力:784 784次元
TensorFlow のグラフ
TensorFlowCNTK
これらのグラフは、同じものである
TensorFlowCNTK
これらのグラフは、同じものである
TensorFlow Torch7
これらのグラフは、ほぼ、同じものである
Torch7 での DNN モジュールの記述例
DNN
# Hidden 1 with tf.name_scope('hidden1'): weights = tf.Variable( tf.truncated_normal([IMAGE_PIXELS, hidden1_units], stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))), name='weights') biases = tf.Variable(tf.zeros([hidden1_units]), name='biases') hidden1 = tf.nn.relu(tf.matmul(images, weights) + biases) # Hidden 2 with tf.name_scope('hidden2'): weights = tf.Variable( tf.truncated_normal([hidden1_units, hidden2_units], stddev=1.0 / math.sqrt(float(hidden1_units))), name='weights') biases = tf.Variable( tf.zeros([hidden2_units]), name='biases') hidden2 = tf.nn.relu(tf.matmul(hidden1, weights) + biases) # Linear .... ....
TensorFlow での DNN モジュールの記述例
DNN モジュールが、 φ(X ・ W+b) の形をしていることは、簡単に確認できる。
DNN = [ hiddenDim = 200
# DNNSigmoidLayer and DNNLayer are defined in Macros.ndl h1 = DNNSigmoidLayer(featDim, hiddenDim, featScaled, 1) ol = DNNLayer(hiddenDim, labelDim, h1, 1)
ce = CrossEntropyWithSoftmax(labels, ol) err = ErrorPrediction(labels, ol)
# Special Nodes FeatureNodes = (features) LabelNodes = (labels) CriterionNodes = (ce) EvalNodes = (err) OutputNodes = (ol)]
CNTK での DNN モジュールの記述例
DNNSigmoidLayer, DNNLayer の定義は、 Macro.ndlの中にある。
DNNLayer(inDim, outDim, x, parmScale) = [ W = LearnableParameter(outDim, inDim, init="uniform", initValueScale=parmScale) b = LearnableParameter(outDim, 1, init="uniform",initValueScale=parmScale) t = Times(W, x) z = Plus(t, b)]
DNNSigmoidLayer(inDim, outDim, x, parmScale) = [ W = LearnableParameter(outDim, inDim, init="uniform", initValueScale=parmScale) b = LearnableParameter(outDim, 1, init="uniform",initValueScale=parmScale) t = Times(W, x) z = Plus(t, b) y = Sigmoid(z)]
CNTK マクロでの DNN モジュールの記述例
DNN モジュールが、 φ(X ・ W+b) の形をしていることは、簡単に確認できる。
CNN のグラフ表現とモジュール構造
現在、もっとも利用されている CNN (Convolutional Neural Network) のグラフ表現とモジュール構造を見てみよう。 CNN は、どんどん多層化しているので、こうしたアプローチは必須である。
複雑な CNN のグラフ
http://www.cs.unc.edu/~wliu/papers/GoogLeNet.pdf
“Going Deeper with Convolutions”Google Inception
この二つを区別する!
回転する
モジュールからなるモジュール
複雑な CNN のグラフ
回転するこ
の組
み合
わせ
モジュールからなるモジュール
複雑な CNN のグラフ
モジュールからなるモジュールの組み合わせ
複雑な CNN のグラフ
複雑な CNN のグラフ
モジュールからなるモジュールの組み合わせ
いまは、こんなことになっている
http://lsun.cs.princeton.edu/slides/Christian.pdf
CNTK マクロでの CNN モジュールの記述例
ConvReLULayer(inp, outMap, inWCount, kW, kH, hStride, vStride, wScale, bValue) = [ convW = LearnableParameter(outMap, inWCount, init="uniform", initValueScale=wScale) convB = ImageParameter(1, 1, outMap, init="fixedValue", value=bValue, imageLayout=$imageLayout$) conv = Convolution(convW, inp, kW, kH, outMap, hStride, vStride, zeroPadding=false, imageLayout=$imageLayout$) convPlusB = Plus(conv, convB); act = RectifiedLinear(convPlusB);]
この CNN モジュールは、φ(Conv(X,W, ...)+b) の形をしている。
次回マルレク予告Convolutional Network
入門講座
日時: 5月 13 日 19:00~場所: TIS 西新宿定員: 200名
Convolutional Network は、現在のニューラル・ネットワーク技術の中心的な技術で、また、もっとも成功した技術でもあります。講演では、ニューラル・ネットワークを学び始めた人を対象に、 CNN の基本をわかりやすく解説します。
RNN モジュールの数式による表現
現在、もっとも活発に研究されている RNN (Recurrent Neural Network) のモジュール構造を見てみよう。ただし、そのグラフ表現は複雑であり、モジュールの数式による表現を併用したほうが、見通しは良くなる。
少し複雑な RNN のグラフの例(これは、 LSTMのセル) σ(sigmoid のこと ), tanh は、活性化関数
次の式をグラフで追ってみるといい。
Chris Olah "Understanding LSTM Networks" http://colah.github.io/posts/2015-08-Understanding-LSTMs/
これは、 CNTK のサンプルだが、グラフだけでは、全容を把握するのは難しい。
ニューラル・ネットワークのパラメーター変更のアルゴリズム
Gradient Descent Stochastic Gradient Descent と
mini-batch Back Propagation Automatic Differentiation
Part II ニューラル・ネットワーク技術の共通の基礎
Gradient Descent
ここでは、パラメータ変更の基本的なアルゴリズムである Gradient Descent の基本を確認する。まずは、線形回帰の問題で考えよう。
Gradient Descent の基本 損失関数を定めて、誤差を最小にするパラメータを求める
次の図で、サンプル中の i 番目の点を (x(i), y(i)) とすれば、 y=ax+b 上の点と点 (x(i), y(i)) との垂直方向の誤差は、 (ax(i)+b) – y(i) となる。
誤差は、正負の値をとるので、単純に、誤差の平均を取っても、打ち消しあって、全体としての誤差の大きさはわからなくなる。
そこで、誤差の二乗をとって、その平均を最小にすることを考える。
a, b の関数である、この誤差の二乗の平均を、損失関数とすればいい。
線形回帰の場合
誤差誤差
誤差誤差
データの各点と、 y=ax+b との誤差が、もっとも小さくなるように、 a,b の値を修正する。
(x(i), y(i))
(ax(i)+b) – y(i)
( ax(i)+b), y(i) )
誤差の二乗を Loss関数にする
こうした形の損失関数を、 “ quadratic cost” という
仮説 :
パラメーター : a, b
損失関数 :
目標 :
問題の整理
y(x) = ax + b
a, b y
a, ba, b
損失関数 J(a, b) は、 a,b についての関数で、この例では、次のような形をしている
a b
簡単にするために、二次元のグラフで考えよう。ある点から始めて、その点から極小点に近ずくためには、どうすればいいか?
二つの場合がある。その点が極小点の右側にある場合には、その点の x座標を少し減らせばいい。その点が極小点の左側にある場合には、その点の x座標を少し増やせばいい。
その点が、極小点の右にあるか左にあるかは、その点での接戦の傾きが、正であるか負であるかでわかる。
よって、 α を正の数値とすれば、次の式が、より近づいた点の位置を与える。
直感的な説明
損失関数を、パラメーターで微分している
どう、重みとバイアスを修正するのか?
もう少し、一般的に、 Gradient Descent をまとめてみよう。損失関数を C とするとき、次の式に従って、重み Wk とバイアス bl を変更すればいい。
損失関数が、 ここで見た、 quadratic cost の形をしていない場合(例えば、 Cross Entropy の場合)でも、この考え方は、変わらない。
η は学習率
コスト関数が Quadratic Cost の時の勾配を求めてみる (線形回帰)
だとして、 1項だけの場合の微分を考える
j jj
この式を、そのまま用いると、パラメータ更新の、基本的なアルゴリズムは、次のようになる。この操作を、値が収束するまで何度も繰り返す。m は、全データの数である。
二項分類の Logistic 回帰の場合
コスト関数 ( Log Likelihood )
Logitic 回帰の微分も、線形回帰の場合の Quadratic Costの微分と同じ形になる!計算は省略したが、次の文献を参照されたい。“ CS229 Lecture notes”http://cs229.stanford.edu/notes/cs229-notes1.pdf
NDLNetworkBuilder = [ run = ndlLR ndlLR = [ .... # parameters to learn B = Parameter(LDim, 1) W = Parameter(LDim, SDim)
# operations t = Times(W, features) z = Plus(t, B) s = Sigmoid(z)
LR = Logistic(labels, s) EP = SquareError(labels, s)
# root nodes FeatureNodes = (features) LabelNodes = (labels) CriteriaNodes = (LR) EvalNodes = (EP) OutputNodes = (s) ] ]
Logistic(label, s) = -sum(labels * log(s) + (1 - labels) * log(1 - s) )
CNTK でのLogistic 回帰の
ネットワーク定義例
Stochastic Gradient Descent
ここでは、まず、訓練実行の三つのスタイル、 Batch, SDG, mini-Batch の違いを見る。実際の応用では、 mini-Batch を用いるのが一般的である。最後に、 mini-Batch も、その確率論的性格から、 SDGと呼ばれることを述べる。
変数の修正にどのくらいの時間がかかるか?前向きの推論と比べて、約 3倍の時間がかかる。
Batch
・・・・・全てのデータ
先のパラメータ更新のアルゴリズムを、そのまま実装したもの。すべてのデータについて前向き推論した後で、一つの更新が行われる
データの数が大きくなると、計算量とメモリー消費が巨大になり、現実的でない。
Stochastic Gradient Descent ( SDG )
・・・・・
こういうやり方もある。ひとつのデータについて前向き推論した後で、一つのパラメータ更新を行う。これを、 SDG という。
一つのデータのみで全てのパラメータをいじるので、収束性にやや問題がある。
Mini-Batch
・・・・・
先に見た Batch と SDG を組み合わせたスタイル。一定数のかたまりのデータで推論を行った後、それに基づいてパラメータを変更する。今の訓練の基本的スタイルである。
ミニバッチ ミニバッチ ミニバッチ ミニバッチ
Batch
キレイに収束しているが、計算量が巨大
一回のパラメータ変更のために全データを読み込む。推論の結果を蓄えるための領域も巨大になる
Stochastic Gradient Descent
迷走気味
一回のパラメータ変更のために、一個だけデータを読み込む。
Mini-Batch
10個のデータを読み込んで、その結果で、パラメータを変更することを繰り返すプログラム
SDG の現在の用法 現在の ML の文脈では、 SDG は、一個のデータにつ
き一回全データの更新を行う前述の SDG ではなく、mini-batch の処理を行う訓練のスタイルを SDG と呼ぶことがある。下の CNTK での SDG の定義を見て欲しい。この時は、 SDG とは mini-batch のことである。
SDG の Stochastic というのは、全体のデータから少数のデータをサンプリングして、確率的に推定をおこなうということ。モンテカルロ法と同様のアプローチである。
Back Propagation
前向きの推論に対して、パラメータの変更は、勾配( Gradient )を用いて、後ろ向きに行われる。そのプロセスをまとめてみよう。
F1(X0 , W1)
Fi(Xi-1 , Wi)
Fn(Xn-1 , Wn)Wn
Wi
W1
X0 (入力 )
n層のネットワークの前向きの推論。推論の結果を X としよう。
簡単にするために、バイアスの項 bi は省略している。
Xi-1
Xi
X
省略
前向きの推論
F1(X0 , W1)
Fi(Xi-1 , Wi)
Fn(Xn-1 , Wn)Wn
Wi
W1
X0 (入力 ) Y (期待される出力 )
Cost
C(X,Y, ...)
前向きの推論の結果X は、 Cost関数( Loss関数・損失関数)で、期待される出力 Y と比較される。
その結果を C としよう。
X
Xi
Xi-1
省略
Cost関数
F1(X0 , W1)
Fi(Xi-1 , Wi)
Fn(Xn-1 , Wn)d C/dWn
Cost
C(X,Y, ...)
各層の出力 Xi について、 C に対する勾配d C/dXi が計算される。
同様に、各層の重みWi について、 C に対する勾配d C/dWi が計算される。この値に基づいて重みは更新される。
d C/dWi
d C/dW1
d C/dX
d C/dXi
d C/dXi-1
X
Xi
Xi-1
省略
Backpropagation/Gradient
F1(X0 , W1)
Fi(Xi-1 , Wi)
Fn(Xn-1 , Wn)d C/dWn
Cost
C(X,Y, ...)
Xi = Fi(Xi-1,Wi) なので、
dC/dXi-1 = dC/dXi ・ dXi/dXi-1 = dC/dXi ・ dFi(Xi-1,Wi)/dXi-1
dC/dWi = dC/dXi ・ dXi/dWi = dC/dXi ・ dFi(Xi-1,Wi)/dWi
d C/dWi
d C/dW1
d C/dX
d C/dXi
d C/dXi-1
省略
Chain Rule
[Appendix]Automatic Differentiation
Back Propagation は、 Reverse Automatic Differentiation の応用である。それは記号処理による微分でも、数値計算による微分でもない。“Calculus on Computational Graphs: Backpropagation”http://colah.github.io/posts/2015-08-Backprop/“Automatic Differentiation” https://en.wikipedia.org/wiki/Automatic_differentiation
次のような計算グラフを考えよう。矢印にそって、下から上に計算が進む。
今、 a=2, b=1 という値が入ったとしよう。この時、各ノードでの計算は、次のようになる。
この時、一つ上のノードを一つ下のノードで偏微分すると各ノードでの計算は、次のようになる。
∂e/∂d=c でc=3 だから
∂e/∂c=d でd=2 だから
このように、直接隣り合った項の偏微分は簡単である。それでは、離れた項の偏微分はどうなるだろうか?
∂e/∂a を考えてみようa が1だけ変化した時、 c は 1 だけ変化する。c が1だけ変化した時、 e は 1 だけ変化する。だから、a が1だけ変化した時、 e は 1*2 だけ変化する。だから、 ∂ e/∂a = 2
まあ、式で書けば、∂e/∂a= ∂e/∂c ・ ∂ c/∂a = 2*1 =2 ということなのだが
このように、直接隣り合った項の偏微分は簡単である。それでは、離れた項の偏微分はどうなるだろうか?
今度は、∂ e/∂b を考えてみようb の変化が e に与える道は、二つある。先と同じように考えて、 a の一つの変化は、緑の経路で 1*2青の経路で 1*3 の影響を与える。だから、 ∂ e/∂b = 1*2 + 1*3 = 5
まあ、式で書けば、∂e/∂a= ∂(c*d)/∂b = c*∂d/∂b + ∂c/∂b*d = 3*1+ 1*2 =5 ということなのだが
今、ノード X からノード Y に三つの道 α, β, γ が、ノード Y からノード Z に三つの道 δ, ε, ζ があったとしよう。
X から Z には、 3*3=9 通りの道がある。それらの道を、 αδのように積の形で表せば、 Z を X で偏微分したものは、先に見たように、可能な全ての道の寄与分を足し合わせたものである。
この形の方が見やすい。
これは、元の例だが、これで Forward-Mode とReverse-Mode の微分を考えてみよう。
Forward-Mode Differentiation( これは、入力 b についての場合 )
Forward-Mode Differentiationでは、一つの特定の入力について、全てのノードが受ける影響が計算される。入力パラメータの数だけ、計算が必要。計算は膨大になる。
Reverse-Mode Differentiation
Reverse-Mode Differentiationでは、一つの出力について、全てのノードが与える影響の計算は、一回で済む。
隣り合ったノードの微分(茶色)を計算しておけば一つ経路上で掛け算をし、全経路分を足せばいい。
Reverse-Mode Differentiation は、Back Propagation の計算法
TensorFlow と CNTK
CNTK の高速化チューニング TensorFlow の大規模分散化
Part III
CNTK は、 TensorFlow よりずっと早い!
CNTK の高速化チューニング
1-bit Quantaized SGD ループ検出 前向き推論の効率化 勾配計算の効率化 メモリー共有
Part III TensorFlow と CNTK
1-bit Quantaized SGD
分散学習にとってのボトルネックは、通信コストである。勾配を、 1-bit までに量子化することで、ノード間の通信に必要なデータの量を減らす。
1-bit Quantaized SGD モデルのパラメーターや出力を量子化するよりも、勾配を量子化する方が、はるかに安全である。(勾配の値は小さく、いずれにしても、ノイズが多い。)
次のミニバッチに、切り捨てられた量子化の残りの部分を持ち越すことは重要である。
更に、一つの勾配を処理している間に、 double-buffering を行う隠れた通信で、一つの勾配を送る。
勾配の同期に、 O(1) 通信スケジューラーを使う。 できるだけ早く、それぞれの GPU をフル活用するた
めに、 GPU の処理サイズに合わせてミニバッチのサイズを大きくする。
パラメーター変更のアルゴリズム勾配:損失関数をパラメーターで微分したもの
実際の変更分は、勾配にアルファ(学習率)を掛けたものである。
勾配の役割 学習率の影響
勾配>0 の時パラメーターを減らす
勾配<0 の時パラメーターを増やす
アルファが小さい時
アルファが大きい時
ループ検出とシーケンス長のチェック( RNN の場合)
ネットワークのループを検出するアルゴリズムを開発
ループ検出とシーケンス長のチェック( RNN の場合) ネットワークのループを検出する賢いアルゴリズム
を開発したので、次のようなことが可能となった。 任意の CN から、ループを見つける。 すべてのミニバッチの計算で、ループ内のノードを除外する。
複数のシーケンスを長さごとにグループ分けする。同じ長さのシーケンスのバッチのみをサポートするツールより、収束の性質がいい。
前向き推論の効率化
複数のノードを評価する必要がある時、重複した計算を少なくするために、ノードにタイムスタンプをつける。
複数のノードを評価する必要がある時、重複した計算を削減するために タイムスタンプを追加する
複数のノードを評価する必要がある時、重複した計算を削減するために タイムスタンプを追加する
ノードに余分な計算をさせない
複数のノードを評価する必要がある時、重複した計算を削減するために タイムスタンプを追加する
ノードに余分な計算をさせない
勾配計算の効率化 勾配計算は、すべてのノードにとって必要なわけで
はない。 データノード
に、 patameterUpdateRequired=false と設定して、これらのノードは、 needGradient=false であることを示す。
深さ優先の探索で、このフラグをグラフの上の方に伝播させる。プログラムは、次のリスト。
needGradient=true の場合のみ、勾配を計算する。
深さ優先で DAG(Directed Acyclic Graph) のノードを全て巡回して、フラグを立てる
Leafノードでは、勾配計算は、必要ない
Memory Sharing ミニバッチを通じて、同じメモリーを使う。それぞ
れのミニバッチのたびに、メモリーを消したり再配置しない。
可能な場合には、計算ノードでメモリーを共有する。 実行プランを分析して、可能ならば、他のノードないしは
計算で再利用されるように、メモリーをプールに解放する。 例えば、あるノードが、子のノードの勾配をすべて計算しおえたなら、そのノードが持っている行列は、すべて、解放できる。
大部分の場合、訓練では、メモリーを 1/3 から 1/2削減できる。
勾配計算が必要でなければ、もっと、多くのメモリーを削減できる。
メモリー共有なしだと、各ノードは、メモリーを持ち続ける。
メモリー共有ありだと、各ノードは、勾配計算の一ステップが終わると、次々にメモリーを解放してゆく
メモリー共有なしだと、各ノードは、メモリーを持ち続ける。
ミニバッチのあいだ、 Weight のメモリーは固定され、繰り返し利用される。それ以外のメモリーは、演算が終わるたびに解放され、再利用される。
TensorFlow の大規模分散化
NIPS 2015 スライドから White Paper から GitHub から 分散 TensorFlow 用語のまとめ
Part III TensorFlow と CNTK
2016/02/26 公開
Distributed TensorFlow
一つのデバイスでのパフォーマンスは重要です。 ... しかし、最も大きなパフォーマンスの改良は、モデル・パラレルとデータ・パラレルを備えた、大規模分散システムによってもたらされます。
Google TensorFlow の基本的な考え方
一回の実験に必要な時間と研究の生産性
数分あるいは数時間単位インタラクティブな研究。すぐに満足が得られる。
1〜4日耐えられる。インタラクティブではなくなるが、代わりに複数の実験を並行して走らせることができる。
1~4週高い価値のある研究のみ。進行は止まる。
1ヶ月以上やろうとも思わない。
TensorFlow の分散処理NIPS 2015 スライドから
NIPS 2015 のスライドから、 TensorFlow の分散処理の特徴を見ておこう。
https://media.nips.cc/Conferences/2015/tutorialslides/Jeff-Oriol-NIPS-Tutorial-2015.pdf
モデル・パラレル 訓練時間を減らす最良の方法:ステップ時間を減ら
す。 たくさんのモデルに、モデル固有の並行性がある。 問題は、通信がそれを妨げないように、仕事を分散
させることである。 CNN にみられる、局所的な関連性 AlexNet が、その例だが、タワー同士は、ほとんど、ある
いはまったく、関連を持たない。 モデルの特定の部分は、あるサンプルでしか動いていない。
GPU 1
GPU 2
学習されたKernel
GPU 1
GPU 2
AlexNethttp://www.cs.toronto.edu/~fritz/absps/imagenet.pdf
モデル・パラレルを開発するには 単一コア : 命令の並列化( SIMD )。とても自由にで
きる。 コアをまたぐ: スレッドの並列化。ソケットをまたが
なければ、ほとんど自由にできる、ソケットをまたぐ場合には、ソケット間の帯域が問題になる。( Intelの QPI )
デバイスをまたぐ: GPU では PCIe の帯域に、制限されることがよくある。
マシンをまたぐ: ネットワークの帯域・遅延に制限される。:
モデル・パラレルModel Parallelism
モデル・パラレルModel Parallelism
モデル・パラレルモデルをマシンをまたいで分割する
モデル・パラレルモデルをマシンをまたいで分割する
ネットワーク・トラフィックを最小にする。もっとも密に結合した領域は、同じパーティション上にある。
データ・パラレル 同時に、異なるデータ・サンプルを処理するように、複数のモデルのレプリカを利用する。 モデルの状態(パラメーター)の更新は、共有パラメー
ター・サーバー上で、全て共同して行う。 スピードアップは、モデルの種類に大きく依存する。
密なモデルでは、 50 のレプリカで、 10 から 40倍のスピードアップ
疎なモデルでは、もっと多くのレプリカをサポートする。1000台ものレプリカを利用できる。
データ・パラレル
データ・パラレル
データ・パラレル
データ・パラレル
データ・パラレル
データ・パラレル
データ・パラレルの選択 同期的に可能か?
N個のレプリカは、バッチ・サイズを N倍大きくすることに等しい。
利点:勾配の計算は、常に新しい 弱点:一つのマシンが落ちた場合、リカバリーが必要なの
で、耐障害性に問題がある 非同期に可能か?
利点:一つのモデル・レプリカが落ちても、それが他のレプリカをブロックすることはないので、相対的には、耐障害性は高い
弱点:勾配が新しいとは限らないということは、その勾配が、効果的なものではないということ
モデルの計算時間が、ネットワーク上でのパラメーターの send/receive に要する時間より大きくなるようにする
データ・パラレルの成功 Google の問題(非常に大規模なデータセット、大規
模なモデル)の多くにとって、データ・パラレルは、実際に重要である
RankBrain は、 500 のレプリカを使っている ImageNet Inception は、訓練に 50個の GPU
を使って、 40倍のスピードアップ SmartReply は、それぞれ複数の GPU を持
つ、 16 のレプリカを使う 最新の学習機械 “One Billion Word” のベンチ
マークモデルは、 32 の GPU 上で、データ・パラレルとモデル・パラレルの両方を使っている
TensorFlow の分散処理White Paper から
分散 TensorFlow の実装は、今年公開されたのだが、その仕様については、昨年のTensorFlow の公開時に発表された White Paper に、既に詳しく述べられていた。White Paper の記述を振り返ろう。
http://download.tensorflow.org/paper/whitepaper2015.pdf 丸山訳 https://goo.gl/z6pQV8
デバイス
デバイスの名前 デバイスの名前は、デバイスの型 (CPU/GPU) とワーカーの中でのデバイスのインデックスを含む。
分散設定では、ワーカーのジョブとタスクを指定する。(プロセスに対してデバイスがローカルな場合には、 localhostが用いられる)
デバイス名の例は、次のようになる。 "/job:localhost/device:cpu:0" "/job:worker/task:17/device:gpu:3"
複数デバイスでの実行の課題 システムが複数デバイスの場合、主に二つほど厄介
なことがある。 ノードの配置:一つは、グラフ上のそれぞれのノードについてどのデバイスを実行配置につかさせるかを決定することである。(ノードとデバイスの対応付け)。
デバイス間通信:もう一つは、その後で、この配置決定によって導かれるデバイスの境界をまたいで要求されるデータ通信を管理することである。
ノードの配置 配置アルゴリズムは、最初に、そのグラフ実行のシミレーションを走らせる。このシミレーションは、グラフ中のそれぞれのノードについて、 greedy heuristics を使って一つのデバイスを選択して終わる。このシミレーションで生成された、ノードのデバイスへの配置は、実際の実行での配置でも利用される。
TensorFlow のクライアントは、ノードについて、どのデバイスが実行可能かについての部分的な制約条件を与えることで、デバイス上のノードの配置をコントロールできる。例えば、”このノードは、 GPUタイプのデバイス上にのみ置くこと” とか “このノードは、 /job:worker/task:17 内の任意のデバイス上に置くことができる” とか “このノードは、 variable13 という名前のノードと同じマシン上に置くこと” 等々。
デバイス間通信 いったんノードの配置が計算されると、グラフはデ
バイスごとに部分グラフの集合に分割される。 x から y への全てのデバイスをまたぐエッジは削除され、x から x の部分グラフ内の新しい Sendノードへのエッジに、また、対応する Receiveノードからyの部分グラフ内の y へのエッジに置き換えられる。このグラフの変形については、次の図を見てほしい。
Send/Receive ノードの挿入
分散実行 グラフの分散実行は、複数のデバイスでの実行に、
とてもよく似ている。デバイスの配置後に、デバイスごとに部分グラフが生成される。ワーカープロセスをまたいで通信する Send/Receiveノードのペアは、マシン境界をまたいでデータを移動するのに、TCP または RDMA といったリモート通信のメカニズムを利用する。
データ・パラレルな訓練 SGD をスピードアップする最も単純なテクニックは、ミニバッチ要素間をまたぐミニバッチの勾配計算をパラレル化することである。例えば、 1000 要素のサイズのミニバッチを使っていたとすると、モデルの 10個のレプリカを使って、その各々に 100 要素の勾配を計算させることができる。その後、あたかも、 1000 要素のサイズのバッチを持つシーケンシャルな SDG アルゴリズムの実行のように正確に振る舞うために勾配を結合して、パラメーターを同期して更新をかける。この場合では、 TensorFlow のグラフは、単純に、グラフの一部がたくさんのレプリカを持つだけである。それが、大量のモデル計算を行う。この大規模なグラフの訓練用のループ全体をクライアントの単一のスレッドがドライブしている。図7の上の図が、これを図示している。
同期型と非同期型のデータ・パラレルな訓練
モデル・パラレルな訓練 モデル・パラレルな訓練では、モデルの異なった部
分の計算が、サンプルの同じバッチのために、異なる計算デバイス上で同時に行われる。これも、容易に TensorFlow で表現できる。図8は、シーケンスからシーケンスの学習に使われるリカレントでディープな LSTM モデル( [47] )が、三つの異なるデバイス上でパラレルに実行される様子を示している。
モデル・パラレルな訓練
モデル計算のパイプラインのための並行ステップ ディープ・ニューラル・ネットワークの訓練で、
もっと性能を引き出すためによく使われるもう一つの別の手法は、同じデバイス内で、モデルの計算をパイプライン化することである。同じデバイスのセットの内部で、複数の少数の並行ステップを走らせる。図9にその様子を示す。これは、どこか非同期のデータ・パラレル処理に似ている。異なったデバイス上に計算グラフのレプリカを作るのではなく、同じデバイス上でパラレル計算が行われることを除いては。このアプローチは、サンプルの単一のバッチの計算では、この単一のステップの間に、すべてのデバイスをすべての時間完全に使い切ることができない場合、「タイルの隙間を埋める」ことを可能にする。
Concurrent steps
TensorFlow の分散処理GitHub から
今年の分散 TensorFlow の実装の公開時に、添付されたドキュメントを紹介する。分散TensorFlow プログラミングの具体的なイメージがわくと思う。
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/how_tos/distributed/index.md
TensorFlow Server GrpcServer# Start a TensorFlow server as a single-process "cluster". $ python >>> import tensorflow as tf >>> c = tf.constant("Hello, distributed TensorFlow!") >>> server = tf.GrpcServer.create_local_server() >>> sess = tf.Session(server.target) >>> sess.run(c) 'Hello, distributed TensorFlow!’
tf.GrpcServer.create_local_server() メソッドは、単一プロセスのクラスターを生成する。もっと現実的な分散クラスターを作るためには、 TensorFlow クラスターのメンバーを定義するtf.ServerDef を渡して tf.GrpcServer を作る。こうして、それぞれが同じクラスター定義を持つ複数のプロセスを走らせる。
ClusterDef クラスターを定義する
tf.make_cluster_def( {"local": ["localhost:2222", "localhost:2223"]}) /job:local/task:0 /job:local/task:1
tf.make_cluster_def( {“worker”: [“worker0:2222”, “worker1:2222”,"worker2:2222"], "ps": ["ps0:2222", "ps1:2222"]}) /job:worker/task:0 /job:worker/task:1 /job:worker/task:2 /job:ps/task:0 /job:ps/task:1
job名: [ ネットワーク名 , ....]
ps: parameter server
# In task 0: server_def = tf.ServerDef( cluster=tf.make_cluster_def({ "local": ["localhost:2222", "localhost:2223"]}), job_name="local” , task_index=0) server = tf.GrpcServer(server_def)
# In task 0: server_def = tf.ServerDef( cluster=tf.make_cluster_def({ "local": ["localhost:2222", "localhost:2223"]}), job_name="local” , task_index=1) server = tf.GrpcServer(server_def)
クラスターで、 localhost:2222 と localhost:2223 上で、二つのサーバーが走る。
同じクラスター定義
ClusterDef の使い方
with tf.device("/job:ps/task:0"): weights_1 = tf.Variable(...) biases_1 = tf.Variable(...)
with tf.device("/job:ps/task:1"): weights_2 = tf.Variable(...) biases_2 = tf.Variable(...)
with tf.device("/job:worker/task:7"): input, labels = ... layer_1 = tf.nn.relu(tf.matmul(input, weights_1) + biases_1) logits = tf.nn.relu(tf.matmul(layer_1, weights_2) + biases_2) # ... train_op = ...
with tf.Session("grpc://worker7:2222") as sess: for _ in range(10000): sess.run(train_op)
モデルの中で分散したデバイスを指定する
二台の parameter サーバー
訓練を実行するサーバー
worker7 で訓練を実行
訓練のレプリカを作る よく使われる訓練の設定(データ・パラレル)では、同じモデルを訓練するワーカーのジョブに、たくさんのタスクが含まれている。この設定では、一つ(あるいは複数)の parameter server のジョブのタスクが保持する、共有パラメータを利用する。 それぞれのタスクは、典型的には、異なるマシンで走るだろう。
こうした構造を指定するやり方が、 TensorFlow にはたくさんあって、我々は、モデルのレプリカを指定するのを簡単にするライブラリーを構築中である。
可能なアプローチには、次のようなものがある。
非同期型の訓練 一つのパラメータの集合を含む、単一のグラフを構築する。 ( tf.Variable ノードは、パラメータ・サーバー /job:ps に割り当てられる。) この「モデル」の複数のコピーが、ワーカー /job:worker 内の異なったタスクに割り当てられる。
このモデルのそれぞれのコピーは、異なったtrain_op を持つことができる。そして、それぞれのワーカー i で、一つ以上のクライアントのスレッドが、 sess.run(train_ops[i]) を呼び出すことができる。
これは、非同期型の訓練の実装である。このアプローチは、そのターゲットがクラスター内のワーカーの一つであるような、単一の tf.Session を利用する。
同期型の訓練 ノードの配置は先と同じだが、同期型の訓練の実装
では、すべてのワーカーからの勾配は、平均化される。このタイプのレプリカの例については、 CIFAR-10 multi-GPU trainer を参照のこと。
例えば、 300 要素のサイズのミニバッチを使っていたとすると、モデルの 3個のレプリカを使って、その各々に 100 要素の勾配を計算させることができる。その後、あたかも、 300 要素のサイズのバッチを持つシーケンシャルな SDG アルゴリズムの実行のように正確に振る舞うために、勾配を結合して、パラメーターを同期して更新をかける。
3
3
m+1
2
3
2m+1
m m m
A B C
A
B
Cミニバッチのデータを3 分割して 3台で処理
3台のマシンでの勾配計算 データと式の分割
3m
データの分割 式の分割
3
3
3
A B C
同期型のデータ・パラレル
3台のレプリカ・モデルでの勾配計算の分割
ミニバッチのデータを 3 分割して、同じモデルのレプリカを持つ 3台で処理。パラメータ・サーバーが、その結果を足し合わせて、パラメータを更新する。
分散型訓練 分散型訓練(“ distributed trainer” ) アプロー
チでは、ワーカー毎に一つのグラフをもたせ、複数のグラフを利用する。ワーカー毎のそれぞれのグラフは、次の二つを含んでいる。パラメータの集合が一つ( /job:ps に割り当てられる)、あと一つは、モデルのコピーが一つ (特定の /job:worker/task/i に割り当てられる ) である。
異なったグラフ間で変数を共有するために、コンテナーのメカニズムが利用される。すなわち、それぞれの変数が構築される時、グラフのそれぞれのコピーで同じ値を持つ、オプショナルなコンテナーの引数が指定される。 大きなモデルでは、全体的なグラフはより小さいので、この方法は、より効率的に機能する。
分散型訓練 このアプローチは、複数の tf.Session オブジェク
トを利用する。ワーカー毎に、一つのプロセスがあって、それぞれのターゲットは、異なるワーカーのアドレスである。
tf.Session オブジェクトは、すべて単一の Pythonクライアントで生成することができる。あるいは、訓練の負荷をもっとうまく分散するために、複数のPython クライアントを利用することもできる。
[Appendix]分散 TensorFlow 用語のまとめ
Client クライアントは、典型的には、 TensorFlow のグラ
フを構築し、クラスターと相互作用するために、 `tensorflow::Session` を構成するプログラムである。クライアントは、典型的には、 Python かC++ で書かれている。単一のクライアント・プロセスは、複数の TensorFlow サーバーと直接に相互作用することが出来る(先の「訓練のレプリカを作る」を参照のこと)。そして、単一のサーバーは、複数のクライアントにサービスを提供することが出来る。
Cluster TensorFlow のクラスターは、名前が付けられたジョ
ブの集合に分割された、一つ以上の TensorFlowサーバーから構成される。 名前が付けられたジョブは、今度は、タスクのリストで構成される。クラスターは、典型的には、たくさんのマシンをパラレルに走らせる、ニューラル・ネットワークの訓練のような、特定の高レベルの目的のために利用される。
Job ジョブは、典型的には、共通の目的にサービスを提
供する、タスクのリストから構成される。例えば、ps (parameter server の略 ) と名付けられたジョブは、典型的には、変数を格納し更新するノードをホストとして含んでいる。一方、 worker と名付けられたジョブは、典型的には、計算中心の状態を持たないノードをホストとして含んでいる。ジョブの中のタスクは、典型的には、異なったマシン上で走る。
Master service マスター・サービスは、分散したデバイスの集合に
リモートアクセスを提供する RPC サービスである。このマスター・サービスが、 tensorflow::Session インターフェースを実装する。 そして、一つ以上のワーカー・サービスをまたいだ仕事の協調に、責任を持つ。
Task タスクは、典型的には、単一の TensorFlow サー
バー・プロセスに対応する。タスクは、特定のジョブに属し、ジョブのタスクのリストの中で、特定のインデックスを持っている。
TensorFlow server TensorFlow サーバーは、 tf.GrpcServer インスタ
ンスを走らせているプロセスである。それは、クラスターのメンバーで、「マスター・サービス」と「ワーカー・サービス」を外部に提供する。
Worker service ワーカー・サービスは、そのローカルなデバイスを利
用して、 TensorFlow グラフの一部分を実行する、 RPC サービスである。ワーカー・サービスは、worker_service.proto を実装している。
次回マルレク予告Convolutional Network
入門講座
日時: 5月 13 日 19:00~場所: TIS 西新宿定員: 200名
Convolutional Network は、現在のニューラル・ネットワーク技術の中心的な技術で、また、もっとも成功した技術でもあります。講演では、ニューラル・ネットワークを学び始めた人を対象に、 CNN の基本をわかりやすく解説します。