Giter VIP home page Giter VIP logo

webdnn's Introduction

WebDNN

日本語

This is the alpha version of WebDNN version 2. The main difference between WebDNN 1.x and WebDNN 2.x is that WebDNN 2.x only accepts ONNX models as input, allowing ONNX models to be loaded directly into a web browser without Python preprocessing. In addition, offline model optimization is also possible.

Version 1.x

Supported backends (acceleration technologies)

WebGL is available in most modern browsers.

  • WebGPU
    • The draft version implemented in Chrome Canary.
    • The WebGPU in iOS13 is not supported because it requires shaders based on the deprecated WSL language.
  • WebGL
    • Use WebGL2 if available; also supports Safari, which only supports WebGL1.
  • WebAssembly

Environment setting

The environment which runs node.js 14, python 3.6+ and emscripten 2.0+.

yarn
python setup.py develop

Build

yarn build:all

Build outputs:

  • dist/webdnn.js
    • Library that can load unoptimized ONNX models
  • dist/webdnn-core.js
    • Library that can load optimized ONNX models by WebDNN

Basic usage

Load dist/webdnn.js with the <script> tag to globally add a WebDNN object. Assuming that the ONNX model model_directory/model.onnx exists, and run the model with a input tensor of the shape [1, 2].

const runner = await WebDNN.load("model_directory/");
const inputDataArray = new Float32Array([5.1, -2.3]);
const inputTensor = new WebDNN.CPUTensor([1, 2], "float32", inputDataArray);
const [outputTensor] = await runner.run([inputTensor]);

console.log(outputTensor.data);  // Float32Array

See example/minimum for the complete minimal code that works.

Test

Generate ONNX models and input/output tensors to be tested

python test/model_test/make_models.py

Run on web browser

yarn server

Open http://localhost:8080/test/model_test/runner/standard.html with web browser, check the backend you want to test, and click the Test button to run the test.

Use

python test/model_test/make_models.py --optimize

http://localhost:8080/test/model_test/runner/optimized.html

when testing, including model optimization. However, the execution time of make_models.py takes a long time.

webdnn's People

Contributors

aixile avatar burgalon avatar kiikurage avatar kylemcdonald avatar lygstate avatar milhidaka avatar y-ich avatar zaghaghi avatar zhangjk95 avatar zhaoming0 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

webdnn's Issues

Add tests

テストを用意する。
Operator, Kernelについてはデータオーダー・パディングなどを変えた入出力ケースを作り、正しい出力をするか検証。

  • graph, variable, operator
  • optimize_rule
  • graph/operators
  • graph/converters
  • frontend/optimize_rule
  • backend/webgpu/optimize_rule
  • backend/webgpu/operators
  • backend/fallback/kernels
  • backend/fallback/optimize_rule
  • backend/fallback/operators
  • backend/fallback/kernels
  • backend/webassembly/optimize_rule
  • backend/webassembly/operators
  • backend/webassembly/kernels

ConvolutionKernelの高速化

現状

  • Im2colで実装したConvolutionのFLOPSは、パラメータにもよるがおおよそ 20[G FLOPS] 程度と低い。
  • im2colで作られるcol-matrixは不均等(行数が多く、列数が少ない)なため、キャッシュ効率等の面でsgemm本来の性能( 60~70[G FLOPS] )を出せていない。
  • また、im2col Kernelが非常に短い処理であるためCPU側のオーバーヘッドも大きい
    • im2col-Convolutionを連続で呼び出し、呼び出しコストをsgemmの実行コストで隠蔽すると、およそ 40~50[G FLOPS] までは改善できる

  • そもそもそんなに問題になるのか?

    • 実際にはconvは単体で呼び出されることはなく、何度も呼び出されるため、呼び出しコストは隠蔽できる
  • cuDNN の implicit_sgemm のようなものを実装し、im2colとsgemmを1つのカーネルにまとめる

    • カーネル呼び出しを一回に減らせる
    • 複雜。参考資料がない。
  • winogradFFT

    • 早いconvolutionの実装。詳細も実装も公開されている。
    • test環境に限定すれば、バッチサイズは基本的に1であるため、性能が出るか怪しい。元論文ではsuper blockingという手法で擬似的にバッチサイズを増やしているが、それでも限界がある。
    • 例えば 7x7 の画像(ResNet50のconv5.x) だと super-blockingでも16枚分にしか増やせない。 winogradFFTの性能をフルに出すには今回の場合32image/batchが必要で、これでは性能は半分。
    • wingogradFFTはim2colと比較して1.4x ~ 2x程度の速度向上とのことなので、これでは意味がない。

rename Optimizer → Transformer

大したことではないが、Optimizerを最適化のためというよりグラフ変換全般に使うので。
例えばconvの実装に合わせた、weightのデータオーダー変換など
ちなみにLLVMでは、このような変換規則群はPassという名前

mnist classification (fc)の実装

fully-connectedおよびreluを実装して、mnistの識別が行えるようにする。
最適化はせず、webgpuでとりあえず動くようにする。

conv-fc混在モデルでのウェイト回転

Chainerのモデルでは、(n, c, h, w)でデータが流れているつもりで、
fcレイヤーがあると(n, c-h-w)という入力とみなし、これに掛けるようにウェイトのデータ順序が割り当てられる。
しかし(n, h, w, c)でデータを流している場合、fcレイヤーのウェイトとの整合性がとれない。
グラフ生成側でうまく対応する必要あり。

行列APIの設計と実装

行列の作成、カーネルを渡して演算ができる行列レベルのAPIの開発
CNNをやる予定なので多次元対応したほうがよさげ

単純なJIT実装

fc-reluの並びをより少ないカーネルの実行で処理できるようなJITを開発する。
fcの中にも行列積とバイアス加算があり、3カーネルを要する。

Inplace operation

計算グラフがcyclicになってしまうので対応方法を考える必要あり

名称変更

Graph optimizerとよんでいる部分をfrontendという更に大きな名前空間切って

  • frontend.graph
    計算グラフの各種レイヤー・属性定義
  • frontend.graph.chainer
    chainerに依存する差異を取り除き共通表現へ落とすためのモジュール
  • frontend.graph.caffe
    caffeに依存する(以下略)
  • frontend.graph_optimrzer
    共通表現の最適化

のように分類しませんか

Flattenの必要性判定

次のいずれかの場合、Flattenは省略できる

  • データオーダーが変化しない
  • 変化はするが、軸サイズが1なため実質変化しない

この場合

X --[Flatten]--> Y

について、

  • FlattenNonsense 属性をつけておき、カーネル生成時にスキップする
  • Y をXと同じ場所にAllocateする

LayerをNodeに統合

現在のNodeが持っている「複数レイヤーをまとめる機能」はCompositeLayer(仮名)という、Nodeを継承したクラスとする

WebAssembly backend

シングルスレッドCPUで実現可能な範囲で、多くのモダンブラウザでそこそこの速度が出るバックエンド

move operator/variable attributes

これは本来 Operator, Variable とは非依存なはずだが、 operators, variables ディレクトリ以下に置かれているせいで依存関係が発生しており import が非常にしづらくなっている

Definition of reshape

In some cases, axis of variables have to be re-interpreted.
In Chainer, linear layer accepts 4D (n, c, h, w) variable and interpret it as 2D (n, chw).
In Keras, 2D variable can be interpreted as (n, c) and (n, t). (t means time-series)
In order to match these variables with variables with semantic axis order, some operations are needed.

  • Reshape
    • Interpret variable as C-order and change the length of each axis.
  • Remove axis with length 1
  • Insert axis with length 1
  • Replace axis meaning (channel -> time)

Flatten can be implemented with the combination of reshape ((n,h,w,c) -> (n,1,1,hwc)) and remove axis.

OptimzierRuleのPriority指定方法

複数のルールが干渉した結果、最適化が十分に働かない可能性があるので
priorityを定義できる機構が必要

Optimizer AffineConcatを用いるとウェイトが少し大きくなる

ResNet50の変換で、
最適化なしだと102228384バイトなのが最適化すると102334624バイトになる。
使われないウェイトが書き出されている?
削除されたレイヤーはremove_all()を読んで変数へのリンクを切っているはずだが、なにか切り忘れているかもしれない。

conv+BN+ReLU

よくあるセットなので特殊なカーネルを組んだほうが良さそう

Allocatorの改善

現状は、全てのメモリを重ならないように確保しているが、生存区間がかぶっていない2つの変数があれば積極的に最適化すべき。Variableの生存区間を見て、メモリ割付を最適化する

memorylayoutによるconcatの省略

条件

  • concatがinplace
  • concatするaxisがメモリオーダーで一番外側
  • memory layoutが隣接している

が揃えばconcatは省略できる
そのためには

  • frontend側でチャンネルオーダに関するattributeを追加する
  • backendのAllocaterにも最適化ルールを拡張できる機構を作る

が必要

CompositionにおけるAttributeの継承方法

足し算した後にただ和集合をとれば良いわけではない

PostElementwise + Elementwise != PostElementwise
    Elementwise + Elementwise == Elementwise

より一般に属性 TS について T + S => S というルールが定義されているときに

{ T    } + { S, R } == { R, S }
{ T, R } + { S    } == { R, S }
{ T, R } + { S, R } == { R, S }

はそれぞれ成り立つのか?
独立な属性、従属な属性を管理してやる必要がある?

channel-wise layerの定義

biasなどを実装するためのレイヤーの抽象化方法を検討
mnistが動くところまでやる

compose関係の可視化

backendの一種として、ブラウザで計算グラフを確認できるsvg込みのhtmlを吐くようにする

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.