概要
Elixir の数値計算ライブラリ Nx
の OSS 開発に参加するにあたって行ったこと、参加して良かったことを紹介します。
数値計算ライブラリ Nx とは?
Nx
は線形代数・テンソルの数値計算と自動微分の機能を備えたライブラリです。読者によっては 「Python の JAX
のような機能を持った Elixir の数値計算ライブラリ」と簡便に表現した方がイメージし易いかもしれません。この Nx
は Github 上でソースコードが公開されている OSS で様々なエンジニアが開発に参加しています。
Nx の開発に参加するにあたって行ったこと
Nx
の 開発に参加するにあたって行ったことを3つのポイントにわけて紹介します。
- 自分の興味・知見を活かせる OSS を見つける
- Issue を確認して OSS の課題を知る
- 関連ライブラリのソースコードを読み込む
自分の興味・知見を活かせる OSS を見つける
まずはプライベートの時間(筆者の場合は業務とは無関係に開発をしていた)を使って開発に貢献したいと思える OSS を探しました。筆者は、大学院時代に数値計算のアプローチでの理論物理学の研究を行っていたことがあり数値計算に関して多少の知見がありました。加えて、自身の周りに Elixir エンジニアが多くおり、その方々から Nx
の存在を開発の初期段階から教えていただくことができました。このようなことから Nx
の開発に貢献したいという思いが出てきました。
Issue を確認して OSS の課題を知る
次に、どのような機能を実装したら良いかについて課題ベースで考えることにしました。理由は、 OSS 開発においてもレビューなどチーム開発的な活動が必要であり、チーム開発では共通認識のある課題に注力すべきだと考えたためです。そこで、共通認識されている課題を知るために Github の issue を読むことにしました。そこにはいくつかの関数が未実装であることが示されており、中でも「固有値・固有ベクトルを計算する関数を実装する」という課題に興味を持ったのでこの関数の実装を行うことにしました。ただし、この時に関連 PR が既に存在しないかはチェックしておいた方が良いです。
ちなみに、上記の課題に興味を持った理由は、データ分析で度々利用される主成分分析では固有値・固有ベクトルを計算するロジックを必要とするため[1]で、この数値計算ロジックの理解を深めたいと考えたためです。
関連ライブラリのソースコードを読み込む
最後に関連するライブラリのソースコードを読み込みました。その理由は、普段の業務では圧倒的に数値計算ライブラリを使う側としての実装活動の方が多く、作る側の知見が不足していると感じたためです。具体的に、今回の関連ライブラリとしては数値計算ライブラリ LAPACK
, Python の NumPy
のソースコードを読み込みました。
上記の活動によって「固有値・固有ベクトルを計算する関数を実装する」という課題を解決し、実際に PR をオープンすることができ、レビューで議論を重ねた後に main ブランチへマージすることができました。筆者が実装した関数は Nx.LinAlg.eigh
で例えば以下のように利用することができます。
{eigenvals, eigenvecs} = Nx.LinAlg.eigh(Input_tensor)
ただし、今回実装した Nx.LinAlg.eigh
は入力の Input_tensor
が対称行列の場合に限られていることに注意して下さい。
Nx 開発に参加して良かったこと
上記の活動を通して個人的に感じた良かったことは以下3点です。
- Elixir という関数型の特徴を持った言語での開発経験を積める
- Elixir が比較的新しい言語ということもあって大規模な OSS 開発の初期段階に関われる
- Elixir に限らないが、普段の業務メンバーとは異なる文化のエンジニアと PR を通して議論できる