Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Chainer/CuPy v5 and Future (Japanese)

372 views

Published on

Chainer Meetup #08 でのスライドです

Published in: Technology
  • Be the first to comment

Chainer/CuPy v5 and Future (Japanese)

  1. 1. Chainer/CuPy v5 and Future Seiya Tokui @ Preferred Networks. Dec. 15, 2018. Chainer Meetup #08 @ PFN
  2. 2. Oct. 2018
  3. 3. Chainer/CuPy v5 Speed Usability Interoperability ChainerMN Probability distributions CuPy w/ DLpack CuPy w/ np.ufunc CuPy w/ Numba
  4. 4. • 重みの初期値やデータセットのデフォ ルト dtype を外から変更する • float16 を使うことで TensorCore が使 われる $ CHAINER_DTYPE=float16 python ... or chainer.global_config.dtype = numpy.dtype(‘float16’)
  5. 5. • 初回呼び出し時に順伝播・逆伝播に 必要な計算過程を記録、2回め以降は それを再生する • 計算グラフのオブジェクトを再利用 することで CPU オーバーヘッドを削減 class NN(chainer.Chain): def __init__(self): with self.init_scope(): self.l1 = L.Linear(1000) self.l2 = L.Linear(1000) self.l3 = L.Linear(10) @static_graph def forward(self, x): h = F.relu(self.l1(x)) h = F.relu(self.l2(h)) return self.l3(h)
  6. 6. ChainerMN 統合 • ChainerMN が パッケー ジに統合 • CUDA-aware MPI および mpi4py を インストールすることですぐに利用 することが可能に $ pip install chainer mpi4py import chainermn
  7. 7. Distributions • Variable レベルでサンプリングしたり 統計量を計算できる確率分布実装 • 微分可能な値を実際に微分できる • Reparameterization trick • v5 で実装済みの分布: Bernoulli, Beta, Categorical, Dirichlet, Laplace, LogNormal, MultivariateNormal, Normal, Uniform p = D.Normal(mu, sigma) log_p = p.log_prob(x) entropy = p.entorpy sample = p.sample() q = D.Normal(mu2, sigma2) kld = chainer.kl_divergence(p, q)
  8. 8. CuPy と外部ライブラリの相互運用 • DLpack を通して MXNet や PyTorch などと相互変換する • NumPy の ufunc に CuPy ndarray を直接渡せる • Numba で JIT コンパイルされた CUDA カーネルに CuPy ndarray を直接渡せる @numba.cuda.jit def add(x, y, out): start = numba.cuda.grid(1) stride = numba.cuda.gridsize(1) for i in range(start, x.shape[0], stride): out[i] = x[i] + y[i] a = cupy.arange(10) b = a * 2 out = cupy.zeros_like(a) add[1, 32](a, b, out)
  9. 9. Future......
  10. 10. DL フレームワークに求められているもの Speed より高速な試行錯誤 さらに大規模な実験 Environment support デバイス・OS など 多様な環境に素早く対応 Quick Deployment 研究成果を素早く アプリケーションに展開
  11. 11. ChainerXincluded in Chainer v6 beta1
  12. 12. ChainerX = NumPy-like ndarray + autograd • in C++ w/ a thin binding layer = far less host-side overhead • with pluggable device backends = open to quickly add a new device support • with pure C++ API = available for Python-free native apps Speed Environment Support Quick Deployment
  13. 13. ChainerX Python API: namespace • NumPy 互換 API • NN 向けの関数も提供 ( , など) • デバイスを指定可能 • で微分可 能な配列へ import chainerx as chx x = chx.ones((2, 3), dtype=chx.float32, device='cuda:0') y = (x + 1).require_grad() z = chx.exp(y).sum() z.backward()
  14. 14. Chainer on ChainerX ChainerX Python API ChainerX C++ API
  15. 15. Chainer on ChainerX • を でラップ • で NumPy/CuPy 実装への自動 フォールバック対応 • ChainerX (C++) の計算グラフを 用いるので backprop が低オー バーヘッドに arr = chx.ones((2, 3), dtype=chx.float32) x = chainer.Variable(arr) y = model(x) y.backward()
  16. 16. ChainerX C++ API • Python API とほぼ1対1に 対応 • Python 非依存で利用可能 chainerx::Array x = chainerx::ones( {2, 3}, chainerx::Dtype::kFloat32, chainerx::GetDevice("cuda:0")); chainerx::Array y = (x + 1).RequireGrad(); chainerx::Array z = chainerx::Exp(y).Sum(); chainerx::Backward(z);
  17. 17. Host logic overhead Framework/API Time per iteration (=fwd+bwd+update, msec) Chainer on NumPy Chainer on ChainerX ChainerX Python PyTorch
  18. 18. Model compiler Execute models written in Python without CPython Python Chainer ONNX+ ChainerX VM Execution with ChainerX Vendor-specific graph formats Native binary Tracing (ONNX-Chainer) Translation (Chainer to ONNX)
  19. 19. Model compiler Preserves the logics written in Python syntax • Define-by-Run model precompiled into static graph • Debug with CPython interpreter and ship/optimize with the model compiler
  20. 20. Chainer/CuPy v6 roadmap features (highlight) • ChainerX • NHWC layout • Inference loop abstraction • Unified Link interface • ONNX-Chainer integration • Stabilize cupy.fuse • Shared memory pool with ChainerX
  21. 21. まとめ • Chainer v5 • 既存スクリプトを少しの工夫で高速化する機能 float16, static graph, ChainerMN 統合 • Distributions • Chainer v6 • ChainerX – C++ による配列・自動微分レベルの高速化・プラガブル化 • 高レベル API についても中規模な機能・変更を追加予定

×