📊

FireDucks を触ってみる 〜 Polars との比較を添えて〜

2023/12/10に公開

この記事は Magic Moment Advent Calendar 2023 10 日目の記事です。

Magic Moment Data チームというチームでプロダクトのデータを活用した機能の検討・開発をしている @nagomiso と言います。好きな物はお酒とラーメンで普段は 9% チューハイ[1] で喉の渇きを癒しています。

さて Python でデータ加工や集計処理をするときに欠かせないライブラリと言えば pandas ですね。なんだかんだ Tabular Data を扱う時には欠かせないライブラリだと思います。

そんな定番ライブラリを高速化するライブラリとして颯爽と現れたのが FireDucks です。 2023-10-19 のファーストリリース以来ずっと気になっていたライブラリだったのでこの機会に触ってみようというのがこの記事の趣旨です。

FireDucks

FireDucks は NEC が開発した pandas と高い互換性を持った API で高速に DataFrame 操作ができるというライブラリです。

高速化のキモとなる部分のソースコードは非公開ですが上記のリリース記事や公式の User Guide を読む限り

  • JIT Compiler による最適化
  • Multithreading による処理の並列化
  • 遅延実行

によって高速化を実現しているようです[2]。( PyPI で配布されている Wheel の中身を見ると fireducks_ext.so という Shared Object が含まれているのでこの部分に高速化の秘密が詰まっているはず)

実際に使ってみる

Compiler Accelerated DataFrame Library for Python with fully-compatible pandas API

と公式が謳っているように使い方は非常に簡単で

  • import pandas as pdimport fireducks.pandas as pd に書き換える
  • import hook を使って pandas を利用しているスクリプトを実行する(こちらはコードを書き換える必要なし)

のどちらかをするだけで FireDucks による高速化の恩恵が受けられます。

使い方がわかったところで試しに

の Notebook の import pandas as pdimport fireducks.pandas as pd に書き換えて全 Cell を実行してみました[3]

結果としては何のエラーも出ずに無事実行が完了。この何事もなく実行できる高い互換性は非常に魅力的です。

本当に高速化できるのか?

FireDucks は pandas のコードをほぼ書き換えることなく使用できることは分かりましたが肝心の実行速度についてはどうなのでしょうか。

DataFrame を高速に操作できるライブラリとして最近定番となりつつある Polars を対抗馬としてみた時に FireDucks がどれぐらいの性能を出るのかベンチマークを行いました。

ベンチマーク方法

ベンチマーク方法と実行条件は以下の通りです。

  • 実行環境として以下の環境を使用する(家に余っていた Zenbook )
    • OS: Xubuntu 22.04
    • CPU: Intel Core i5-8265U @ 1.60GHz
    • RAM: LPDDR3 8GB
  • Polars 公式が公開しているベンチマーク( pola-rs/tpch )を Fork して一部改変したコード を使用する。
    • TPC-H はデータウェアハウス分野のデータベースシステムについて検索や抽出処理を行うベンチマークです。
    • pola-rs/tpch では 8 つのクエリ( Tabular Data 操作)について性能が評価されており group by を使った集計や複数 DataFrame の merge などが行われています。
  • データは make tables_scale_1 で生成されるものを使用する。
    • make tables_scale_10 は私の貧弱なマシンでは OOM が発生してデータが作りきれませんでした 😭

先にも書きましたが pandas を使用したコードを FireDucks に書き換えるのは非常に簡単なため FireDucks 用のベンチマークコードはサクッと実装できました

ベンチマーク結果

ベンチマーク結果は以下の通りです。実行時間で評価されているので値が小さいほど良い結果です。

in-memory-performance
インメモリデータ操作の性能

including-io-performance
ファイル IO ( Parquet データの読込み)込みの性能

今回のベンチマークでは Polars が圧倒的な性能を見せつけています。これは仕方がない。

では pandas と FireDucks の比較はどうでしょうか。

インメモリデータに対する操作では FireDucks が pandas に勝ったり負けたりとどちらが良いとも言いづらい結果になっています。今回のようなデータ規模(比較的小さめ)では JIT Compiler, Multithreading による並列化, 遅延実行によって得られる恩恵よりもオーバーヘッドの方が大きいということかも知れません。

一方で IO 込みでは pandas よりも FireDucks の方が明確に速い場合が多いようでした。 IO 込みだと遅延実行によって読み込まれるデータを局所化できて実行速度が改善するのかも知れません。

実験条件の問題もありそうですが今回のベンチマーク結果は「 FireDucks はこれからに期待!」という感じですね。ただ pandas との高い互換性を保ちつつ高速化ができる可能性を秘めている点が非常に魅力的なのは間違いありません。 pandas を使った資産があってその速度を改善したいというときは手軽に試せる良い手だと思いました。

まとめ

  • FireDuck は pandas と非常に高い互換性を持っているので導入が非常に簡単です。
  • ただ実行条件によっては pandas よりも性能が出ないケースもあるようでした。
  • 対抗馬として挙げた Polars は噂に違わずやはり速かった。(ちょっとした脱線)

新規プロジェクトは Polars を使って実装する, pandas の既存資産のパフォーマンスを改善したいという時は FireDucks を使うという棲み分けが今のところ良さそうですね。もう少し大規模なデータを使ってベンチマークしたらどうなるかも試してみたいところです。

さて明日のアドベントカレンダー栗原 さんの「 エンジニアリングマネージャーになりたいですか? 」 です。お楽しみに!!

脚注
  1. SAPPORO 99.99 が一番好きだったのですが最近は近所のスーパーで見かけないので 1 周回ってストロングゼロを愛飲しています。 ↩︎

  2. NEC デジタルテクノロジー開発研究所 Advent Calendar 2023 で FireDucks の開発に携わっている方々が詳細な記事を投稿してくれそうです!中身が気になる方は要チェックですね。 ↩︎

  3. kunishou/Pandas_100_knocks を Fork して import fireducks.pandas as pd にしたものを Push しようと思ったのですが作者様のご意向で Pandas 100 本ノックのコンテンツは再配布・改編不可となっていることに後から気づき辞めました。試してみたい方はお手元にダウンロードしてコードを書き換えて実行してみてください。 ↩︎

Discussion