洋食の日記

「だ・である」調ではなく「です・ます」調で書きはじめれば良かったなと後悔してる人のブログです

Numo::Linalgのバックエンドライブラリを良い感じに読み込むライブラリを作った

はじめに

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は、UbuntuCentOSのパッケージでファイル名が異なったこと、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という)クラス生やして申し訳ありません 🙇🏻‍♂️ 🙇🏻‍♂️ 🙇🏻‍♂️

つまらないものですが、よろしくお願い致します。