はじめに
Numo::Linalgは、numpy.linalgに相当するもので、QR分解や特異値分解を行うメソッドを提供する。これら線形代数の機能は、いわゆるBLAS/LAPACK系のバックエンドライブラリの関数を呼び出すことで実現している。このバックエンドライブラリは、まだ開発途中(?)にあるため、.soファイルを読み込むようになっている。例えばmacOSでは、共有ライブラリの拡張子が.dylibになるため、バックエンドライブラリを指定する必要がある。これについては、詳細なドキュメントが先日公開された(感謝)。
Numo::Linalg - Selecting Backend Library
一方で、Numo::Linalgを使ったライブラリを作っていると「シンプルにrequire 'hoge'とかで上手いことできれば便利だな〜」という気持ちもあり、個人的にローダーを作っていた。元日だし、せっかくなので、gemとして公開することにした。
numo-linalg-autoloader | RubyGems.org | your community gem host
インストール
$ gem install numo-linalg-autoloader
使い方
requireするだけでよい。バックエンドライブラリを読み込むのに失敗するとRuntimeErrorだします。
require 'numo/linalg/autoloader'
仕組み
RbConfig::CONFIG['host_os']でOSを取ってきて、適切な拡張子を選択する。そして、Intel MKL, OpenBLAS, BLAS/LAPACKの順に、インストールされているだろうディレクトリを探していく。環境変数のLD_LIBRARY_PATHが設定されていれば、そこを優先的に探すようにしている。一通り必要なライブラリがそろったものを、バックエンドライブラリとして読み込む。
numo-linalg-autoloader/autoloader.rb at master · yoshoku/numo-linalg-autoloader · GitHub
ATLASは、UbuntuとCentOSのパッケージでファイル名が異なったこと、macOSでは(例えばHomebrewなど)簡単にインストールする術がなかったのでサポートしなかった。OpenBLASも、UbuntuのパッケージではLAPACKのインターフェースを含まないなどの違いがあるので、ソースからビルドしてインストールすることをおすすめする。この他、macOSでは、Accelerate FrameworkでBLAS/LAPACKは提供されているが、LAPACKEは提供されていない(ので、Homebrewなどでインストールする必要があるが、うまみはあまりない)。Intel MKLかOpenBLASを使用することをおすすめする。
おわりに
私自身Numo::NArrayとNumo::Linalgのユーザーなので、上記の様なOSなど環境に依らないバックエンドライブラリを読み込む仕組みが、Numo::Linalgに組み込まれるまでサポートするつもりでいます。あと勝手に(Numo::Linalg::Autoloaderという)クラス生やして申し訳ありません 🙇🏻♂️ 🙇🏻♂️ 🙇🏻♂️
つまらないものですが、よろしくお願い致します。