Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Chainer/CuPy v5 and Future (Japanese)

433 Aufrufe

Veröffentlicht am

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

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

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 についても中規模な機能・変更を追加予定

×