Submit Search
cl-waffe2 実装
0 likes
221 views
H
hiketteinya
↑のスライド古いのでこっち見た方が面白いです→ https://speakerdeck.com/hikettei/cl-waffe2
Engineering
Read more
1 of 34
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
More Related Content
ODP
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
m2ym
PDF
Hiveを高速化するLLAP
Yahoo!デベロッパーネットワーク
PDF
Lisp Tutorial for Pythonista Day 6
Ransui Iso
PDF
lilo.linux.or.jp の話 (2017年8月)
Kazuhiro Nishiyama
PDF
謎の言語Forthが謎なので実装した
t-sin
PPTX
nftables: the Next Generation Firewall in Linux
Tomofumi Hayashi
KEY
Alfrescoクラスタリング入門
Ashitaba YOSHIOKA
PDF
Lispの同図像性とその周辺
Naoya Yamashita
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
m2ym
Hiveを高速化するLLAP
Yahoo!デベロッパーネットワーク
Lisp Tutorial for Pythonista Day 6
Ransui Iso
lilo.linux.or.jp の話 (2017年8月)
Kazuhiro Nishiyama
謎の言語Forthが謎なので実装した
t-sin
nftables: the Next Generation Firewall in Linux
Tomofumi Hayashi
Alfrescoクラスタリング入門
Ashitaba YOSHIOKA
Lispの同図像性とその周辺
Naoya Yamashita
Similar to cl-waffe2 実装
(20)
PPT
Ruby Extended Library
Akio Tajima
KEY
Shelly
fukamachi
PDF
rpscala35-scala2.9.0
Kenji Yoshida
PDF
Mod mrubyについて
Ryosuke MATSUMOTO
ODP
Vim scriptとJavaとHaskell
aiya000
PDF
Scala2.8への移行
Takeda Hiroyuki
PDF
Scala2.8への移行
guest5f4320
PDF
Pry による repl 駆動開発について
Tomoya Kawanishi
PDF
Laravel5.1 Release
Yuuki Takezawa
PDF
Packagist
Yasuo Harada
PDF
Making Editor written in Ruby version 20160611
Langur
PDF
Reco choku tech night #09 -reinvent2018報告会-
recotech
PDF
What is java_se_7
TakumiIINO
PPTX
Solr 4.0 の主な機能
Shinichiro Abe
PDF
ChefユーザのためのAnsible入門
Mahito Ogura
PDF
PHP & Queue
sasezaki
PDF
LINEのMySQL運用について
LINE Corporation
PDF
Uk ar
uk-ar
PPT
Scala Daysに行ってみて
Kota Mizushima
PDF
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
sasezaki
Ruby Extended Library
Akio Tajima
Shelly
fukamachi
rpscala35-scala2.9.0
Kenji Yoshida
Mod mrubyについて
Ryosuke MATSUMOTO
Vim scriptとJavaとHaskell
aiya000
Scala2.8への移行
Takeda Hiroyuki
Scala2.8への移行
guest5f4320
Pry による repl 駆動開発について
Tomoya Kawanishi
Laravel5.1 Release
Yuuki Takezawa
Packagist
Yasuo Harada
Making Editor written in Ruby version 20160611
Langur
Reco choku tech night #09 -reinvent2018報告会-
recotech
What is java_se_7
TakumiIINO
Solr 4.0 の主な機能
Shinichiro Abe
ChefユーザのためのAnsible入門
Mahito Ogura
PHP & Queue
sasezaki
LINEのMySQL運用について
LINE Corporation
Uk ar
uk-ar
Scala Daysに行ってみて
Kota Mizushima
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
sasezaki
Ad
cl-waffe2 実装
1.
Hikettei cl-waffe2 Programmable Deep Learning
Framework Github https://github.com/hikettei/cl-wa ff e2 ドキュメント https://hikettei.github.io/cl-wa ff e2/
2.
cl-waffe2 ・概要 Common Lisp上で動作する行列演算ライブラリ
3.
cl-waffe2 ・概要 Common Lisp上で動作する行列演算ライブラリ 自動微分と深層学習などの数理最適化に専念したライブラリを提供 => 将来的に深層学習フレームワークとして提供したい
4.
cl-waffe2 ・概要 Common Lisp上で動作する行列演算ライブラリ 自動微分と深層学習などの数理最適化に専念したライブラリを提供 => 将来的に深層学習フレームワークとして提供したい ・Common
Lispについて メタプログラミング REPL駆動開発 Conditional System Closer-MOP 等の機能 => 試行と失敗を繰り返すスタイルの開発だと異次元の強さを誇る(個人的主観) ✅ 長所
5.
cl-waffe2 ・概要 Common Lisp上で動作する行列演算ライブラリ 自動微分と深層学習などの数理最適化に専念したライブラリを提供 => 将来的に深層学習フレームワークとして提供したい ・Common
Lispについて メタプログラミング REPL駆動開発 Conditional System Closer-MOP 等の機能 => 試行と失敗を繰り返すスタイルの開発だと異次元の強さを誇る(個人的主観) ✅ 長所 1994年のANSI Common Lispから21年間 仕様が変更されていない => 高い信頼性 10年以上前のライブラリも普通に動く互換性
6.
cl-waffe2 ・概要 Common Lisp上で動作する行列演算ライブラリ 自動微分と深層学習などの数理最適化に専念したライブラリを提供 => 将来的に深層学習フレームワークとして提供したい ・Common
Lispについて メタプログラミング REPL駆動開発 Conditional System Closer-MOP 等の機能 => 試行と失敗を繰り返すスタイルの開発だと異次元の強さを誇る(個人的主観) ✅ 長所 1994年のANSI Common Lispから21年間 仕様が変更されていない => 高い信頼性 10年以上前のライブラリも普通に動く互換性 行列演算への適正 => 優秀な行列演算ライブラリが揃っている SBCL等一部の処理系の自動ベクトル化(AVX2まで)
7.
cl-waffe2 ・Common Lispについて 静的型が弱い ❌ 短所 =>
行列のランクなどの情報は高速化に大変役立つので それを捨てるのは勿体無い!
8.
cl-waffe2 ・Common Lispについて 静的型が弱い ❌ 短所 =>
行列のランクなどの情報は高速化に大変役立つので それを捨てるのは勿体無い! コミュニティーの狭さ => Python/Julia/MATLAB等にはもっと広くて優秀なライブラリが存在するが・・・ Common Lispに自動微分をサポートする行列演算ライブラリは(知る限り)存在しない
9.
cl-waffe2 ・Common Lispについて 静的型が弱い ❌ 短所 =>
行列のランクなどの情報は高速化に大変役立つので それを捨てるのは勿体無い! コミュニティーの狭さ => Python/Julia/MATLAB等にはもっと広くて優秀なライブラリが存在するが・・・ Common Lispに自動微分をサポートする行列演算ライブラリは(知る限り)存在しない ・方針 1. ChainRuleで計算できるノード(DAG)に専念 + 不足する部分は他ライブラリとの互換性で補う 2. 演算は全て遅延評価にして、後からコンパイルする 3. 最小限の記述量で、他のデバイスに移植できるようにする 4. REPLでの開発がしやすい設計にする
10.
実装 1/5 ・遅延評価のサイクル 1. 計算ノードを組み立てる out
= ax+b
11.
実装 1/5 ・遅延評価のサイクル 1. 計算ノードを組み立てる 2.
コンパイルして実行 proceed(out = ax+b)
12.
実装 1/5 ・遅延評価のサイクル 1. 計算ノードを組み立てる 2.
コンパイルして実行 3. 更に他の計算ノードを組み立てる … -> 1. proceed(sum(proceed(ax+b)))
13.
実装 2/5 ・計算ノードの前処理 1. 計算ノードは破壊的な計算として定義されている →順伝播の副作用防止 逆伝播の計算用に一度Copyを作成する
14.
実装 2/5 ・計算ノードの前処理 1. 計算ノードは破壊的な計算として定義されている →順伝播の副作用防止 逆伝播の計算用に一度Copyを作成する 2.
参照回数を元に不要なCopyを削除(In-place mutation)
15.
実装 2/5 ・計算ノードの前処理 1. 計算ノードは破壊的な計算として定義されている →順伝播の副作用防止 逆伝播の計算用に一度Copyを作成する 2.
参照回数を元に不要なCopyを削除(In-place mutation) 3. 与えられた設定を元にデバイスを割り当てる
16.
実装 3/5 ・動的なコード生成 Before After 1. Nが十分小さい時の高速化 →オフセットの計算 関数呼び出しのオーバーヘッド その他実行時にする計算(einsumの計算量最小化など) (諸々のオーバーヘッド)
>> (実際の実行時間) 図: gemmのスケール別ベンチマーク
17.
実装 3/5 ・動的なコード生成 Before After 1. Nが十分小さい時の高速化 →オフセットの計算 関数呼び出しのオーバーヘッド その他実行時にする計算(einsumの計算量最小化など) (諸々のオーバーヘッド)
>> (実際の実行時間) 図: gemmのスケール別ベンチマーク 2. 実行前にできることが増える →事前にメモリ割り当て 並列化スケジューリングの管理 loopのインライン化 後付けJIT etc…
18.
実装 3/5 ・動的なコード生成 1. AbstractTensor →Tensorのデータ型
実行するデバイス 環境に応じて クラスを用意する AbstractTensor -> 各デバイス 注) CUDATensorは未実装
19.
実装 3/5 ・動的なコード生成 1. AbstractTensor →Tensorのデータ型
実行するデバイス 環境に応じて クラスを用意する AbstractTensor -> 各デバイス 注) CUDATensorは未実装 2. AbstractNode →計算ノードの一般的な定義(e.g.: 形状の遷移 逆伝播…) を定義する →:whereの後の文章はSubscript DSLというマクロ 静的型が弱いCommon Lispをサポートする
20.
実装 3/5 ・動的なコード生成 1. AbstractTensor →Tensorのデータ型
実行するデバイス 環境に応じて クラスを用意する AbstractTensor -> 各デバイス 注) CUDATensorは未実装 2. AbstractNode →計算ノードの一般的な定義(e.g.: 形状の遷移 逆伝播…) を定義する →:whereの後の文章はSubscript DSLというマクロ 静的型が弱いCommon Lispをサポートする 3. デバイスごとに実装 →各デバイス用にインライン化されたプログラムを生成する Common Lispプログラムを用意しておく ユーザーによって拡張可能 各実装が吐き出したコードを後からcompileする
21.
実装 4/5 ・キャッシュ化 1. そもそも実行時のevalやcompileは本来避けるべき →
実行時に200ms程度のオーバーヘッド
22.
実装 4/5 ・キャッシュ化 1. そもそも実行時のevalやcompileは本来避けるべき →
実行時に200ms程度のオーバーヘッド 2. 一度コンパイルしたコードはキャッシュする → インタプリタモード(proceed関数) proceedは微分可能 REPLと組み合わせながら トライアンドエラーを大量に試行 遅延評価ベースだが、計算ノードのつながりを意識しなくて良い (i.e.: Numpy等を使うのと同じノリでコーディング)
23.
実装 4/5 ・キャッシュ化 1. そもそも実行時のevalやcompileは本来避けるべき →
実行時に200ms程度のオーバーヘッド 2. 一度コンパイルしたコードはキャッシュする → インタプリタモード(proceed関数) proceedは微分可能 REPLと組み合わせながら トライアンドエラーを大量に試行 遅延評価ベースだが、計算ノードのつながりを意識しなくて良い (i.e.: Numpy等を使うのと同じノリでコーディング) → コンパイルモード(build関数) 事前に関数の検索 + 最大限インライン化されたコードを生成 最大限のパフォーマンスが必要な時 (学習を走らせる時など) => 特定の条件に特化してインライン化した関数を大量生成 + 再利用 設定で一部ノードだけ無効化もできる
24.
実装 5/5 ・実行 1. 様々な環境への移植性 →
一度cl-wa ff e2で記述すると 以降グローバル変数の設定だけで 他の環境へ移植可能(を目指す)
25.
実装 5/5 ・実行 1. 様々な環境への移植性 →
一度cl-wa ff e2で記述すると 以降グローバル変数の設定だけで 他の環境へ移植可能(を目指す) → 他デバイスの実装はユーザーが拡張可能 開発者 ユーザー間の壁を設けない
26.
実装 5/5 ・実行 1. 様々な環境への移植性 →
一度cl-wa ff e2で記述すると 以降グローバル変数の設定だけで 他の環境へ移植可能(を目指す) → 他デバイスの実装はユーザーが拡張可能 開発者 ユーザー間の壁を設けない → 互換性のあるデバイスは再利用できる 例: AVX512拡張命令を用いて exp関数の低精度近似に対応したバックエンドを追加する → ExpNode以外の実装は既存の互換性のあるものを再利用 => cl-wa ff e2本体にはCPUで動作する実行のみを同梱する(i.e.: 余計な依存を増やさない)
27.
実装 5/5 ・実行 2. 複数の演算を融合させる
(JITLispTensorの実装例) →コンパイル時に任意のコードを埋め込める →AbstractTensorを継承したJITLispTensorを定義 これに与える実装は空にしておく →任意のタイミングで、cl-wa ff e2にコンパイル済み コードを渡せる
28.
実装 5/5 ・実行 2. 複数の演算を融合させる
(JITLispTensorの実装例) →コンパイル時に任意のコードを埋め込める →AbstractTensorを継承したJITLispTensorを定義 これに与える実装は空にしておく →任意のタイミングで、cl-wa ff e2にコンパイル済み コードを渡せる →上のcl-wa ff e2コードから 下のCommon Lispプログラムを生成できる
29.
実装 5/5 ・実行 2. 複数の演算を融合させる
(JITLispTensorの実装例) →コンパイル時に任意のコードを埋め込める →AbstractTensorを継承したJITLispTensorを定義 これに与える実装は空にしておく →任意のタイミングで、cl-wa ff e2にコンパイル済み コードを渡せる →上のcl-wa ff e2コードから 下のCommon Lispプログラムを生成できる => 将来的にC++/CUDA等へのコード生成も可能 機会があればぜひやりたい
30.
その他 ・実態を持たないTensor 1. InputTensor → InputTensorはメモリ割り当てを伴わないテンソルを作成する まるで普通のTensorとして計算可能 後から値を埋め込んだりできる 図:
make-input 必要になって初めて割り当てられる
31.
その他 ・実態を持たないTensor 1. InputTensor → InputTensorはメモリ割り当てを伴わないテンソルを作成する まるで普通のTensorとして計算可能 後から値を埋め込んだりできる 2.
ネットワークの形状特定 → あらゆる計算ノードをTraceする動作を簡単にしてくれる 特別な設定無しで入出力の形状を特定 図: make-input 必要になって初めて割り当てられる 線形回帰モデルの入出力の自動推論 形状自動推論
32.
その他 ・実態を持たないTensor 2. ネットワークの形状特定
33.
その他 ・Optional Broadcasting 1. より安全なBroadcasting Broadcasting可能な軸を演算側(i.e.:
defnode)で宣言しておく Broadcastingして良い軸をTensor側に宣言しておく cl-wa ff e2のBroadcastingのルール 演算時にShapeErrorが発生する場合 -> <1 x N>をunsqueeze/repeat ~がBroadcasting可能軸に対応 <1 x N>がBroadcasting可能軸に対応
34.
その他 ・Optional Broadcasting 2. ルールに従って演算 意図しないBroadcastingは発生しない 行ごと/列ごとにベクトルを加算するなどの演算が より自明に