vaex を Google Colaboratoryで試す

Colaboratory の主記憶不足で処理できないデータがある。DataFrameのキャッシュライブラリのようなものを作ればディスクを利用して主記憶不足を補えるのではないかと思い、現状で使えるものがないか調べてみた。

Out of core な DataFrameのライブラリとして vaex があることがわかった。例を試したところ、Google Colaboratoryでは、現時点で一部うまく機能しないものがあるものの多くの基本的な機能は使えることがわかった。

サンプルコード

2020年3月26日の時点では、次のコードを実行するとデータファイルのダウンロードでエラーになるため、exampleを使えない。

import vaex
df = vaex.example()

http://vaex.astro.rug.nl/data/helmi-dezeeuw-2000-10p.hdf5 がアクセスできなくなっているためのようだ。

そこで、次の記事に従って別データで試してみた。

ML impossible: Train 1 billion samples in 5 minutes on your laptop using Vaex and Scikit-Learn

しかし、vaexとgoogle-colabとで、必要とするライブラリのバージョンの相違があるためか、正常に動作しないコードがある。2020年3月26日の時点では、解消の方法があるのかどうかわかっていない。

多くのコードは動作することを確認した。

環境

Jupyter Notebook

次にあるjupyter notebook を基本とした。Google Colaboratoryではディスク容量も限られているので、後述のように2015年のデータのみを対象にした。

Exploratory data analysis: N. Y. CityCabs data: 2009-2015

https://github.com/vaexio/vaex-examples/blob/master/medium-nyc-taxi-data-eda/vaex-taxi-article.ipynb

データ

ML impossible: Train 1 billion samples in 5 minutes on your laptop using Vaex and Scikit-Learn によれば、New York City Taxi & Limousine Commission のサイト https://www1.nyc.gov/site/tlc/about/tlc-trip-record-data.page から csvファイルをダウンロードして、hdf5 に変換したということが書いてある。

対象のデータの指定が面倒でやる気が起きないが、次のnotebookのリストを使えば少し楽になると思われる。ただし、そのままではURLが異なるので、変更が必要である。

https://github.com/vaexio/vaex/blob/master/examples/example_ny_taxi.ipynb

面倒なのでどうしようかと考えていたが、調べてみると AWS に hdf5 に変換したファイルがある。

AWSにログインする必要があるが(アカウントを持っていないといけないが)、次のURLにあるファイルをダウンロードすることで、細かな単位でcsvファイルをダウンロードして、それらをまとめて hdf5に変換するということは不要と思われた。

https://s3.console.aws.amazon.com/s3/buckets/vaex/taxi/?region=us-east-2

2009年から2015年のデータ yellow_taxi_2009_2015_f32.hdf5 は、107GBあり、Colaboratoryでは明らかに無理であるので、以下では、2015年のデータyellow_taxi_2015_f32s.hdf5 を利用する。これは12GBほどである。

手元の環境では、yellow_taxi_2015_f32s.hdf5 のダウンロードに半日かかった。Colaboratoryではなく、ローカルPCで試すために yellow_taxi_2009_2015_f32.hdf5 もダウンロードしてみたが、こちらは1日以上かかった感じであった。試していないが、csvファイルをダウンロードして、変換した方が速いかもしれない。

ダウンロードしたファイル yellow_taxi_2015_f32s.hdf5 を Google Drive にアップロードし、Google Drive をColaboratoryにマウントして使う。

また、圧縮した yellow_taxi_2015_f32s.zipも Google Driveにアップロードし、ローカルドライブにデータを置く際には、それを伸張して使うようにした。

修正したノートブック

修正し、実行したノートブックはGitHubの次のところに置いてある。

https://github.com/kunsen-an/vaex-examples/tree/master/medium-nyc-taxi-data-eda

仮想マシンのローカルドライブ利用

Colaboratoryの仮想マシンインスタンスのローカルドライブにデータをコピーして、それを利用した場合が次のファイルである。

https://github.com/kunsen-an/vaex-examples/blob/master/medium-nyc-taxi-data-eda/vaex_taxi_article_2015_local_200325.ipynb

Google Driveのデータをそのまま利用

ファイルアクセスが遅くなるが、容量制限の強いローカルドライブにコピーせず、マウントしたGoogle Driveのデータをそのまま利用する場合も試した。繰り返して実行していないが、多数のファイルへのアクセスを行う場合に起きるGoogle Driveのアクセスエラーなどは経験しなかった。

https://github.com/kunsen-an/vaex-examples/blob/master/medium-nyc-taxi-data-eda/vaex_taxi_article_2015_gdrive_200324c.ipynb

主な修正点

主な修正点は次の通り。

Google Drive をマウント

from google.colab import drive
drive.mount('/content/gdrive')

vaexのインストール

!pip install vaex-core vaex-viz vaex-hdf5 vaex-jupyter PyQt5 vaex-ui

カーネルの再起動

インストール後に次のメッセージとボタンが表示される。RESTART RUNTIMEのボタンを押して、カーネルを再起動する必要がある。再起動しないと、ノートブックの[12]の df_filtered.plot1d で実行時エラーとなる。

RESTART RUNTIMEのボタンを押すと次のような確認が出るので、「はい」をクリックする。

インストール時のエラー

インストール時にライブラリのバージョンの不整合で次のエラーが発生している。

ERROR: tensorflow-federated 0.12.0 has requirement tensorflow~=2.1.0, but you'll have tensorflow 1.15.0 which is incompatible.
ERROR: tensorflow-federated 0.12.0 has requirement tensorflow-addons~=0.7.0, but you'll have tensorflow-addons 0.8.3 which is incompatible.
ERROR: google-colab 1.0.0 has requirement ipykernel~=4.6.0, but you'll have ipykernel 5.2.0 which is incompatible.
ERROR: datascience 0.10.6 has requirement folium==0.2.1, but you'll have folium 0.8.3 which is incompatible.

3行目のエラーで、google-colab 1.0.0 と vaex-jupyter で必要とする ipykernel のバージョンが異なっているために、後述の問題が発生していると思われる。ちゃんとした確認はできていないが、インストール時の最後の WARNINGでも ipykernelのアップグレードについて注意されている。問題の解消方法はよくわからない。

vaex.open (ローカルドライブにコピーしてから)

まず、次のコードで/content/gdrive/My Drive/Colab Notebooks/vaex/taxi/yellow_taxi_2015_f32s.zip をローカルドライブのホームディレクトリに伸張する。

%cd ~

import zipfile
with zipfile.ZipFile('/content/gdrive/My Drive/Colab Notebooks/vaex/taxi/yellow_taxi_2015_f32s.zip','r') as inputFile:
    inputFile.extractall()

次のコードでローカルドライブのhdf5ファイルをオープンする。

# Read in the data from disk
df = vaex.open('./yellow_taxi_2015_f32s.hdf5')

vaex.open (Google Driveをそのまま利用)

Google Drive の Colab Notebooks/vaex/taxi にある yellow_taxi_2015_f32s.hdf5 をオープンする。 yellow_taxi_2015_f32s.hdf5 を格納した場所に応じてパスは変更する必要がある。 

# Read in the data from Google Drive
df = vaex.open('/content/gdrive/My Drive/Colab Notebooks/vaex/taxi/yellow_taxi_2015_f32s.hdf5')

前述のように試した範囲では経験しなかったが、高い頻度でアクセスを繰り返すとGoogle Driveのアクセスエラーなどが起きるかもしれない。

plot_widgetの実行抑制

以下の複数行コメントの内部のコードを実行するとランタイムが切断されてしまう。そのため、コメントアウトした。

# Interactively visualise the pickup locations of all taxi trips in our dataset.
'''
df.plot_widget(df.pickup_longitude, 
               df.pickup_latitude, 
               shape=512, 
               limits='minmax',
               f='log1p', 
               colormap='plasma')
'''

google-colab 1.0.0 と vaex-jupyter で必要とする ipykernel のバージョンの相違の問題ではないかと思われるが、はっきりしない。

結果

Google Colaboratoryでは、現時点では一部制限があるが使えることがわかった。

Google Drive のファイルをアクセスする場合とColaboratoryの仮想マシンインスタンスのローカルドライブにアクセスする場合を比較すると当然ながら仮想マシンインスタンスのローカルドライブにアクセスする方が速い。

GitHubに置いたノートブックの記録からわかるように、対象のデータフレームのdescribe() で見てみると、Google Drive のファイルをアクセスする場合は680秒で、ローカルドライブのファイルをアクセスする場合は206秒の3.3倍程度かかっていた(1回しか実行していないのであくまでも参考値である)。

もっとも、今回利用したhdf5のファイルサイズが12GBで、Colaboratoryのメモリが12GBくらいなので、メモリを超えたファイルを扱っている場合としては不十分なので、ノートブックのdescribe()以降の処理時間にGoogle Driveと ローカルドライブの影響がどの程度あるかは不明である。