SlideShare a Scribd company logo
Hikettei
cl-waffe2
Programmable Deep Learning Framework
Github https://github.com/hikettei/cl-wa
ff
e2
ドキュメント https://hikettei.github.io/cl-wa
ff
e2/
cl-waffe2
・概要
Common Lisp上で動作する行列演算ライブラリ
cl-waffe2
・概要
Common Lisp上で動作する行列演算ライブラリ
自動微分と深層学習などの数理最適化に専念したライブラリを提供
=> 将来的に深層学習フレームワークとして提供したい
cl-waffe2
・概要
Common Lisp上で動作する行列演算ライブラリ
自動微分と深層学習などの数理最適化に専念したライブラリを提供
=> 将来的に深層学習フレームワークとして提供したい
・Common Lispについて
メタプログラミング REPL駆動開発 Conditional System Closer-MOP 等の機能
=> 試行と失敗を繰り返すスタイルの開発だと異次元の強さを誇る(個人的主観)
✅ 長所
cl-waffe2
・概要
Common Lisp上で動作する行列演算ライブラリ
自動微分と深層学習などの数理最適化に専念したライブラリを提供
=> 将来的に深層学習フレームワークとして提供したい
・Common Lispについて
メタプログラミング REPL駆動開発 Conditional System Closer-MOP 等の機能
=> 試行と失敗を繰り返すスタイルの開発だと異次元の強さを誇る(個人的主観)
✅ 長所
1994年のANSI Common Lispから21年間 仕様が変更されていない
=> 高い信頼性 10年以上前のライブラリも普通に動く互換性
cl-waffe2
・概要
Common Lisp上で動作する行列演算ライブラリ
自動微分と深層学習などの数理最適化に専念したライブラリを提供
=> 将来的に深層学習フレームワークとして提供したい
・Common Lispについて
メタプログラミング REPL駆動開発 Conditional System Closer-MOP 等の機能
=> 試行と失敗を繰り返すスタイルの開発だと異次元の強さを誇る(個人的主観)
✅ 長所
1994年のANSI Common Lispから21年間 仕様が変更されていない
=> 高い信頼性 10年以上前のライブラリも普通に動く互換性
行列演算への適正
=> 優秀な行列演算ライブラリが揃っている SBCL等一部の処理系の自動ベクトル化(AVX2まで)
cl-waffe2
・Common Lispについて
静的型が弱い
❌ 短所
=> 行列のランクなどの情報は高速化に大変役立つので それを捨てるのは勿体無い!
cl-waffe2
・Common Lispについて
静的型が弱い
❌ 短所
=> 行列のランクなどの情報は高速化に大変役立つので それを捨てるのは勿体無い!
コミュニティーの狭さ
=> Python/Julia/MATLAB等にはもっと広くて優秀なライブラリが存在するが・・・
Common Lispに自動微分をサポートする行列演算ライブラリは(知る限り)存在しない
cl-waffe2
・Common Lispについて
静的型が弱い
❌ 短所
=> 行列のランクなどの情報は高速化に大変役立つので それを捨てるのは勿体無い!
コミュニティーの狭さ
=> Python/Julia/MATLAB等にはもっと広くて優秀なライブラリが存在するが・・・
Common Lispに自動微分をサポートする行列演算ライブラリは(知る限り)存在しない
・方針
1. ChainRuleで計算できるノード(DAG)に専念 + 不足する部分は他ライブラリとの互換性で補う
2. 演算は全て遅延評価にして、後からコンパイルする
3. 最小限の記述量で、他のデバイスに移植できるようにする
4. REPLでの開発がしやすい設計にする
実装 1/5
・遅延評価のサイクル
1. 計算ノードを組み立てる
out = ax+b
実装 1/5
・遅延評価のサイクル
1. 計算ノードを組み立てる
2. コンパイルして実行
proceed(out = ax+b)
実装 1/5
・遅延評価のサイクル
1. 計算ノードを組み立てる
2. コンパイルして実行
3. 更に他の計算ノードを組み立てる
… -> 1.
proceed(sum(proceed(ax+b)))
実装 2/5
・計算ノードの前処理
1. 計算ノードは破壊的な計算として定義されている
→順伝播の副作用防止
逆伝播の計算用に一度Copyを作成する
実装 2/5
・計算ノードの前処理
1. 計算ノードは破壊的な計算として定義されている
→順伝播の副作用防止
逆伝播の計算用に一度Copyを作成する
2. 参照回数を元に不要なCopyを削除(In-place mutation)
実装 2/5
・計算ノードの前処理
1. 計算ノードは破壊的な計算として定義されている
→順伝播の副作用防止
逆伝播の計算用に一度Copyを作成する
2. 参照回数を元に不要なCopyを削除(In-place mutation)
3. 与えられた設定を元にデバイスを割り当てる
実装 3/5
・動的なコード生成
Before
After
1. Nが十分小さい時の高速化
→オフセットの計算
関数呼び出しのオーバーヘッド
その他実行時にする計算(einsumの計算量最小化など)
(諸々のオーバーヘッド) >> (実際の実行時間)
図: gemmのスケール別ベンチマーク
実装 3/5
・動的なコード生成
Before
After
1. Nが十分小さい時の高速化
→オフセットの計算
関数呼び出しのオーバーヘッド
その他実行時にする計算(einsumの計算量最小化など)
(諸々のオーバーヘッド) >> (実際の実行時間)
図: gemmのスケール別ベンチマーク
2. 実行前にできることが増える
→事前にメモリ割り当て
並列化スケジューリングの管理
loopのインライン化 後付けJIT etc…
実装 3/5
・動的なコード生成
1. AbstractTensor
→Tensorのデータ型 実行するデバイス 環境に応じて
クラスを用意する
AbstractTensor -> 各デバイス
注) CUDATensorは未実装
実装 3/5
・動的なコード生成
1. AbstractTensor
→Tensorのデータ型 実行するデバイス 環境に応じて
クラスを用意する
AbstractTensor -> 各デバイス
注) CUDATensorは未実装
2. AbstractNode
→計算ノードの一般的な定義(e.g.: 形状の遷移 逆伝播…)
を定義する
→:whereの後の文章はSubscript DSLというマクロ
静的型が弱いCommon Lispをサポートする
実装 3/5
・動的なコード生成
1. AbstractTensor
→Tensorのデータ型 実行するデバイス 環境に応じて
クラスを用意する
AbstractTensor -> 各デバイス
注) CUDATensorは未実装
2. AbstractNode
→計算ノードの一般的な定義(e.g.: 形状の遷移 逆伝播…)
を定義する
→:whereの後の文章はSubscript DSLというマクロ
静的型が弱いCommon Lispをサポートする
3. デバイスごとに実装
→各デバイス用にインライン化されたプログラムを生成する
Common Lispプログラムを用意しておく
ユーザーによって拡張可能
各実装が吐き出したコードを後からcompileする
実装 4/5
・キャッシュ化
1. そもそも実行時のevalやcompileは本来避けるべき
→ 実行時に200ms程度のオーバーヘッド
実装 4/5
・キャッシュ化
1. そもそも実行時のevalやcompileは本来避けるべき
→ 実行時に200ms程度のオーバーヘッド
2. 一度コンパイルしたコードはキャッシュする
→ インタプリタモード(proceed関数)
proceedは微分可能 REPLと組み合わせながら
トライアンドエラーを大量に試行
遅延評価ベースだが、計算ノードのつながりを意識しなくて良い
(i.e.: Numpy等を使うのと同じノリでコーディング)
実装 4/5
・キャッシュ化
1. そもそも実行時のevalやcompileは本来避けるべき
→ 実行時に200ms程度のオーバーヘッド
2. 一度コンパイルしたコードはキャッシュする
→ インタプリタモード(proceed関数)
proceedは微分可能 REPLと組み合わせながら
トライアンドエラーを大量に試行
遅延評価ベースだが、計算ノードのつながりを意識しなくて良い
(i.e.: Numpy等を使うのと同じノリでコーディング)
→ コンパイルモード(build関数)
事前に関数の検索 + 最大限インライン化されたコードを生成
最大限のパフォーマンスが必要な時 (学習を走らせる時など)
=> 特定の条件に特化してインライン化した関数を大量生成 + 再利用
設定で一部ノードだけ無効化もできる
実装 5/5
・実行
1. 様々な環境への移植性
→ 一度cl-wa
ff
e2で記述すると
以降グローバル変数の設定だけで
他の環境へ移植可能(を目指す)
実装 5/5
・実行
1. 様々な環境への移植性
→ 一度cl-wa
ff
e2で記述すると
以降グローバル変数の設定だけで
他の環境へ移植可能(を目指す)
→ 他デバイスの実装はユーザーが拡張可能
開発者 ユーザー間の壁を設けない
実装 5/5
・実行
1. 様々な環境への移植性
→ 一度cl-wa
ff
e2で記述すると
以降グローバル変数の設定だけで
他の環境へ移植可能(を目指す)
→ 他デバイスの実装はユーザーが拡張可能
開発者 ユーザー間の壁を設けない
→ 互換性のあるデバイスは再利用できる
例: AVX512拡張命令を用いて
exp関数の低精度近似に対応したバックエンドを追加する
→ ExpNode以外の実装は既存の互換性のあるものを再利用
=> cl-wa
ff
e2本体にはCPUで動作する実行のみを同梱する(i.e.: 余計な依存を増やさない)
実装 5/5
・実行
2. 複数の演算を融合させる (JITLispTensorの実装例)
→コンパイル時に任意のコードを埋め込める
→AbstractTensorを継承したJITLispTensorを定義
これに与える実装は空にしておく
→任意のタイミングで、cl-wa
ff
e2にコンパイル済み
コードを渡せる
実装 5/5
・実行
2. 複数の演算を融合させる (JITLispTensorの実装例)
→コンパイル時に任意のコードを埋め込める
→AbstractTensorを継承したJITLispTensorを定義
これに与える実装は空にしておく
→任意のタイミングで、cl-wa
ff
e2にコンパイル済み
コードを渡せる
→上のcl-wa
ff
e2コードから
下のCommon Lispプログラムを生成できる
実装 5/5
・実行
2. 複数の演算を融合させる (JITLispTensorの実装例)
→コンパイル時に任意のコードを埋め込める
→AbstractTensorを継承したJITLispTensorを定義
これに与える実装は空にしておく
→任意のタイミングで、cl-wa
ff
e2にコンパイル済み
コードを渡せる
→上のcl-wa
ff
e2コードから
下のCommon Lispプログラムを生成できる
=> 将来的にC++/CUDA等へのコード生成も可能 機会があればぜひやりたい
その他
・実態を持たないTensor
1. InputTensor
→ InputTensorはメモリ割り当てを伴わないテンソルを作成する
まるで普通のTensorとして計算可能
後から値を埋め込んだりできる
図: make-input
必要になって初めて割り当てられる
その他
・実態を持たないTensor
1. InputTensor
→ InputTensorはメモリ割り当てを伴わないテンソルを作成する
まるで普通のTensorとして計算可能
後から値を埋め込んだりできる
2. ネットワークの形状特定
→ あらゆる計算ノードをTraceする動作を簡単にしてくれる
特別な設定無しで入出力の形状を特定
図: make-input
必要になって初めて割り当てられる
線形回帰モデルの入出力の自動推論
形状自動推論
その他
・実態を持たないTensor
2. ネットワークの形状特定
その他
・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可能軸に対応
その他
・Optional Broadcasting
2. ルールに従って演算
意図しないBroadcastingは発生しない
行ごと/列ごとにベクトルを加算するなどの演算が
より自明に

More Related Content

ODP
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
PDF
Hiveを高速化するLLAP
PDF
Lisp Tutorial for Pythonista Day 6
PDF
lilo.linux.or.jp の話 (2017年8月)
PDF
謎の言語Forthが謎なので実装した
PPTX
nftables: the Next Generation Firewall in Linux
KEY
Alfrescoクラスタリング入門
PDF
Lispの同図像性とその周辺
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
Hiveを高速化するLLAP
Lisp Tutorial for Pythonista Day 6
lilo.linux.or.jp の話 (2017年8月)
謎の言語Forthが謎なので実装した
nftables: the Next Generation Firewall in Linux
Alfrescoクラスタリング入門
Lispの同図像性とその周辺

Similar to cl-waffe2 実装 (20)

PPT
Ruby Extended Library
KEY
Shelly
PDF
rpscala35-scala2.9.0
PDF
Mod mrubyについて
ODP
Vim scriptとJavaとHaskell
PDF
Scala2.8への移行
PDF
Scala2.8への移行
PDF
Pry による repl 駆動開発について
PDF
Laravel5.1 Release
PDF
Packagist
PDF
Making Editor written in Ruby version 20160611
PDF
Reco choku tech night #09 -reinvent2018報告会-
PDF
What is java_se_7
PPTX
Solr 4.0 の主な機能
PDF
ChefユーザのためのAnsible入門
PDF
PHP & Queue
PDF
LINEのMySQL運用について
PDF
Uk ar
PPT
Scala Daysに行ってみて
PDF
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
Ruby Extended Library
Shelly
rpscala35-scala2.9.0
Mod mrubyについて
Vim scriptとJavaとHaskell
Scala2.8への移行
Scala2.8への移行
Pry による repl 駆動開発について
Laravel5.1 Release
Packagist
Making Editor written in Ruby version 20160611
Reco choku tech night #09 -reinvent2018報告会-
What is java_se_7
Solr 4.0 の主な機能
ChefユーザのためのAnsible入門
PHP & Queue
LINEのMySQL運用について
Uk ar
Scala Daysに行ってみて
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
Ad

cl-waffe2 実装