2019よーめー日記2019年3月13日水曜日Lua言語用のプラグインDLLを作ってみた。最近ディープラーニングはTorchやPytorchでやるようです。TorchはLuaというスクリプト言語で書かれています。スクリプト言語ですが、中間言語にコンパイルして高速に動かすこともできます。Luaのソースコードを見て分かったのですが、とてもコンパクト。Lua言語は簡単にC言語の関数やDLLを呼び出せるので、簡単にいろんなライブラリと連携させることができます。動的にDLLを呼び出せて、オブジェクトの演算子の再定義ができて、簡単にC言語連携ができるので、たくさんのソースをビルドしないといけない機械学習に適しているんだと思います。TorchのプラグインのDLLってどうやって作るのかを調べたら、Lua用のプラグインDLLをつくればそのままTorchから使えることがわかったので、本日はLua用のプラグインを作ってみます。123;}--------------------------------------------------test.lua--------------------------------------------------f=package.loadlib("luadll_sample.dll","func_sample")f()--------------------------------------------------こんだけでプラグインができるなんて。簡単にプラグインを作れます。これだとビルド時にliblua.dllがいるので、ビルド時にliblua.dllがいらない版も作ってみました。これで、ばんばんtorchのプラグインが作れる。共有いろんなBLASを使ってみた最近はやっているディープラーニング、大体Pythonで書かれています。Pythonだけでは行列の計算が貧弱なので、numpyというライブラリを使って行列の計算をしいます。Subprograms)というライブラリで行っています。以前このブログでも触れたのですが、このBLASは1979年に作られたため、その後いろいろな人が改良していろいろなBLASがあります。オリジナルはFORTRANという言語で書かれていて、最新のディープラーニングは半世紀も前のプログラムに支えられています。組み込みで使いたいときはどうすればよいのかと思い、これらの半世紀前のプログラムをいろいろビルドしてみました。BLASのビルドオリジナルのBLASです。LAPACKというBLASの拡張もあります。Fortanで書かれています。以前この日記にも書きました。・まずf2cというFORTRANからC言語に変換するプログラムをまずビルドします。・次にlibf2cというライブラリをビルドして、FORTRANの複素数型や高度な数学関数をビルドします。・fc2でBLASとXBLASとLAPACKのFORTRANソースコードをC言語に変換してビルドします。・CBLASとCLAPACKのラッパー関数もビルドします。めんどくさいんですが、半世紀前のソースコードがWindows10とVisualStudio2019でビルドできます。OpenBLASのビルド現在一番使われているBLASです。マルチスレッド化してあるので、CPUのコア数が増えれば増えるほど高速に演算できます。大部分がC言語で書かれていますが、高速化のため一部がアセンブラとフォートランで書かれています。このため、その特定の部分をVisualCなどでコンパイルできません。このため、Windowsではなかなか手軽に遊べず。MinGWなどでコンパイルすればWindows版も作れます。高速動作に命を懸けているので、コンパイラーに依存しています。アセンブラ部分をなくてもビルドを通るようにしてくれればよいのに。LAPACKというライブラリ部分はGFORTRANを使うので、GFORTRANがない場合はLAPACKがコンパイルされません。ファイル数が1000個以上あるのでコンパイルに非常に時間がかかります。Libraryの中に入っているBLASです。LAPACKは入っていませんがC言語で書かれていて一番簡単にビルドできます。テストコードも簡単にビルドできるので、Windows10のVisualStudio2019でもビルドできてテストにパスしました。BLASGoogleが機械学習用に作っている行列演算ライブラリEigenの中に入っています。BLASはほぼ全関数、LAPACKは一部の関数が入っています。ファイル数が少なくビルドも高速。まともですごいのになんで全関数ないんだ。BLASがよさそうです。Torchなどの機械学習の学習で使うときはフルのLAPACKが必要でEigenが使えません。OpenBLASかGPU対応のcuDNNじゃないとだめですね。(2)Lua言語用のプラグインDLLを作ってみた。