Translate

2017年10月12日木曜日

Keras.js の README.md を翻訳してみた

タイムラインに keras.js なる単語がでてきた。

..Kerasに JavaScript ライブラリがあるのか..とおもい検索すると

GitHub に以下のページが見つかった。

[GitHub] Keras.js
https://github.com/transcranial/keras-js


ということでトップページの README.md を翻訳してみた。
以下、勝手翻訳なので、参照の際は at your own risk でお願いします。

-----

Keras.js


ブラウザでGPUをサポートしているル(Tensorflowバックエンドを使って訓練済みの)Kerasモデを実行します。モデルは、対応するHDF5ファイルから直接シリアル化されたウェイトを使用して、Keras JSON形式設定ファイルから直接作成されます。nodeでも動作しますが、CPUモードでのみ動作します。

現在、このライブラリの焦点は順方向推論のみです。

テンソル操作は、ndarrayライブラリの上で拡張されます。GPUのサポートは、WebGLを介してWebGLによってサポートされています。

ライブラリバージョンの互換性:


  • Keras 2.0.4
  • TensorFlow 1.1.0


インタラクティブなデモ

  • MNISTで訓練された基礎的な埋め込みネット
  • MNISTで訓練された畳み込み変分オートエンコーダ
  • MNIST上の補助分類子生成的敵対ネットワーク(AC-GAN)
  • ImageNetで訓練された50層の残存ネットワーク
  • ImageNetで訓練された Inception v3 モデル
  • ImageNetで訓練された SqueezeNet v1.1
  • IMDBセンチメント分類の双方向LSTM

使い方


demos/src/ にある vue.js で書かれた実際のサンプルのソースコードを参照してください。


1. Model、Sequential クラスベースでともに動作します:
model = Sequential()
model.add(...)
 ...

...
model = Model(input=..., output=...)

 訓練を終えたら、ウェイトを保存し、モデルアーキテクチャの設定をエクスポートします。

model.save_weights('model.hdf5')
with open('model.json', 'w') as f:
    f.write(model.to_json())
詳細については、デモの Jupyter note (demos/notebooks/)を参照してください 。たとえば、ResNet50に必要なものは次のとおりです:

from keras.applications import resnet50
model = resnet50.ResNet50(include_top=True, weights='imagenet')
model.save_weights('resnet50.hdf5')
with open('resnet50.json', 'w') as f:
    f.write(model.to_json())

2. エンコーダスクリプトをHDF5 ウェイトファイルで実行します。

$ python encoder.py /path/to/model.hdf5

 HDF5 ウェイトファイルと同じフォルダに2つのファイル model_weights.buf model_metadata.json が作成されます。


3. Keras.jsに必要な3つのファイルは次のとおりです。

  • モデルファイル: model.json
  • ウェイトファイル: model_weights.buf 
  • ウェイトメタデータファイル: model_metadata.json

4. keras,js をインクルードします。



 もしくは node(バージョン4以降が必須):

$ npm install keras-js --save
# もしくは
$ yarn add keras-js

// 名前空間
const KerasJS = require('keras-js')
// nodeの場合は
import * as KerasJS from 'keras-js'

// 名前空間なし
const Model = require('keras-js').Model
// nodeの場合は
import { Model } from 'keras-js'

5. 新規モデルを作成します。

 インスタンス化では、XHR(同じドメインまたはCORSが必要)を使用してデータがロードされ、レイヤーは有向非循環グラフとして初期化されます。



// ブラウザ内では相対/絶対URLを指定できます
const model = new KerasJS.Model({
  filepaths: {
    model: 'url/path/to/model.json',
    weights: 'url/path/to/model_weights.buf',
    metadata: 'url/path/to/model_metadata.json'
  },
  gpu: true
})

// nodeでは gpu フラグはoffに
// パスはファイルシステムパスもしくは絶対URLを指定
// ファイルシステムパスの場合以下のように指定します
const model = new KerasJS.Model({
  filepaths: {
    model: 'path/to/model.json',
    weights: 'path/to/model_weights.buf',
    metadata: 'path/to/model_metadata.json'
  },
  filesystem: true
})


 クラスメソッドready()は、これらのステップが完了したときに解決するPromiseを返します。次に、predict()モデルを通じてデータを実行し、Promiseを返します。

model.ready()
  .then(() => {
    // 入力レイヤの名前でキー入力された入力データオブジェクト、
    // またはシーケンシャルモデルの場合は `input` です。
    // 値は平坦化された Float32Array データです
    // (入力テンソルの形状はモデルの設定で指定されています)
    const inputData = {
      'input_1': new Float32Array(data)
    }

    // 推論します
    return model.predict(inputData)
  })
  .then(outputData => {
    // outputData は出力レイヤーの名前をキーとするオブジェクトであり、
    // Sequential モデルの場合は `output` です
    // e.g.,
    // outputData['fc1000']
  })
  .catch(err => {
    // ハンドルエラー
  })


 あるいは、async/await を使用することもできます。

try {
  await model.ready()
  const inputData = {
    'input_1': new Float32Array(data)
  }
  const outputData = await model.predict(inputData)
} catch (err) {
  // ハンドルエラー
}


使用可能なLayer

  • core: Dense, Activation, Dropout, SpatialDropout1D, SpatialDropout2D, SpatialDropout3D, Flatten, Reshape, Permute, RepeatVector 
  • convolutional: Conv1D, Conv2D, SeparableConv2D, Conv2DTranspose, Conv3D, Cropping1D, Cropping2D, Cropping3D, UpSampling1D, UpSampling2D, UpSampling3D, ZeroPadding1D, ZeroPadding2D, ZeroPadding3D
  • pooling: MaxPooling1D, MaxPooling2D, MaxPooling3D, AveragePooling1D, AveragePooling2D, AveragePooling3D, GlobalMaxPooling1D, GlobalMaxPooling2D, GlobalMaxPooling3D, GlobalAveragePooling1D, GlobalAveragePooling2D, GlobalAveragePooling3D
  • recurrent: SimpleRNN, LSTM, GRU
  • embeddings: Embedding
  • merge: Add, Multiply, Average, Maximum, Concatenate, Dot
  • advanced activations: LeakyReLU, PReLU, ELU, ThresholdedReLU
  • normalization: BatchNormalization
  • noise: GaussianNoise, GaussianDropout
  • wrappers: Bidirectional, TimeDistributed
  • legacy: Merge, MaxoutDense, Highway

実装レイヤ

  • core: Lambda
  • local: LocallyConnected1D, LocallyConnected2D

注意


WebWorkersとその限界

Keras.js は、メインスレッドとは別の WebWorker で実行できます。Keras.js は多くの同期計算を実行するため、UI が推論処理の影響を受けるのを防ぐことができます。しかし、WebWorkers の最大の制限の1つは、 (の元であるWebGL) アクセスできない点です。したがって、別のスレッドで Keras.js を実行することによって得られる利点は、CPUモードでのみ実行が必要なことと相殺されます。言い換えれば、GPUモードで Keras.js をメインスレッド上でのみ実行することができます。これは永遠に続くことはありません



WebGL MAX_TEXTURE_SIZE

GPU モードでは、テンソルオブジェクトは計算に先立って WebGL テクスチャとしてエンコードされます。これらのテンソルのサイズ gl.getParameter(gl.MAX_TEXTURE_SIZE) は、ハードウェア/プラットフォームで異なります。典型的な期待値については、ここを参照してください。この値が任意の次元を超えてテンソルを含む操作の場合、その操作は CPU に戻されます。


特定のプラットフォーム(特に macOS、おそらく他のプラットフォーム)の Firefox は、依然としてテクスチャサイズの制限がハードコードされています。最新の GPU であっても、この制限は低すぎる可能性があります。これは既知の問題です。この場合、 Keras.js が CPU を使用するように正常にダウングレードされますが、計算パフォーマンスが低下します。これを回避する1つの方法は、ブラウザに移動し about:config にて gfx.work-around-driver-bugs false に変更してブラウザを再起動することです。これにより、最大テクスチャサイズが通常に戻されます。


開発/テスト

実装されたlayerごとに広範なテストが行われています。  これらすべてのテストのデータを生成する Jupyter notebooks (notebooks/) を参照してください。


$ npm install
 # または
$ yarn

すべてのテストを実行するには npm run server して http://localhost:3000/test/ を開くだけです。すべてのテストが自動的に実行されます。追加のテストデータ情報については、ブラウザの開発ツールを開きます。

開発者は次を実行してください:


$ npm run watch

src/ のファイルを編集すると webpack の dist/keras.js が更新されます。

プロダクション UMD webpack ビルドを作成するには、次のように dist/keras.js を出力します:


$ npm run build:browser

デモ用のデータファイルは demos/data/ にあります。大きなサイズのため、このフォルダは git によって無視されます。 keras-js-demos-data リポジトリをクローンし、内容を demos/data/ へコピーします。


ライセンス


MIT

---------

ブラウザの動くPCをのGPUが使えるんだ..
でも node で動かす場合はCPUのみか..

WebWorkerのマルチスレッド..そろそろJavaScript自体の実行エンジンについても本気で勉強してないかないと、ついていけなくなるよな..

Webでぐいんぐいん動くゲームアプリも出だしたからなあ、このあたりの技術がガンガン上がってるんだよなあ..

アプリケーションサーバでなくブラウザのエンジンへ開発の主流がうつっていったんだけど、Webアプリ屋がフレームワークの上で踊っている間に、じだいがかわっちゃったかな..

なんでか知らないけど、Java屋ってJavaScriptをパチもんだと勘違いして小馬鹿にしていたから、そのツケを今払わされている感じがする..

モデルファイルのエンコードツールっていうのは、圧縮とかも考えてのことなのかな..

HDF5のファイルってTensorFlow側で作れたんだっけ..
もしだめならKeras実装モデルでないと動かないのかもしれないなあ..


deeplearning.js もあるし、そろそろ考えないとなあ..









0 件のコメント:

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

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