RecordIO形式って何?
Amazon Machine Learning Specialityなどでよく出てくるRecordIO形式について、具体的にどういう形式なのか調べてもいまいち出てこないのでまとめてみました。
データの変換方法などは他の記事等にも書いてあるので、今回はRecordIO形式の概念や特徴について中心に書きたいと思います。
自分の理解した範囲でのまとめなので間違っていたら指摘いただけるとありがたいです。
結論: RecordIO形式
いきなり結論ですが、RecordIO形式には以下の様な特徴がある様です。
- RecordIO はバイナリデータ交換フォーマットの一種
- データを「レコード」という単位に分割
- 各レコードの長さをバイト単位で前置して格納
- 正式な仕様がなく、実装ごとに非互換性がある
- マジックバリューの追加や圧縮対応などの違いがある
よく使われる場面
- Amazon Sagemaker
- MXNet
- Apache MESOS
サイトにあるRecordIO形式
ここからは調べた詳細を書いていきます。
まず、実際にRecordIO形式を採用しているサービス等ではなんと書かれているのでしょうか。
- Apache MESOSに書いてある説明を和訳すると
RecordIOは、一連のバイナリ・データ交換フォーマットの名前である。基本的な考え方は、データを「レコード」と呼ばれる個々のチャンクに分割し、すべてのレコードにバイト単位の長さを前置し、その後にデータを続けるというものである。
RecordIOフォーマットには正式な仕様がないため、RecordIOの実装には若干の非互換性がある。一般的な違いとしては、例えば、ストリーム・フォーマットを示すためにストリームの先頭にマジック・バリューを指定したり、レコード長をネイティブの整数で固定サイズのフィールドを使用してエンコードしたり、圧縮されたレコード・コンテンツをサポートするために余分なフィールドを追加したりすることなどがある。
"RecordIOフォーマットには正式な仕様がないため、RecordIOの実装には若干の非互換性がある"
なるほど...正式な仕様がないらしいです...
- AWSでの説明を和訳すると
protobuf RecordIOフォーマットでは、SageMaker AIはデータセット内の各観測値を4バイトの浮動小数点数のセットとしてバイナリ表現に変換し、protobuf値フィールドにロードします。 データ準備に Python を使用している場合は、これらの既存の変換を使用することを強くお勧めします。 しかし、他の言語を使用している場合、以下の protobuf 定義ファイルは、データを SageMaker AI protobuf 形式に変換するために使用するスキーマを提供します。
どうやらMESOSではMESOSなりの、SageMakerではSageMakerなりの形式があって微妙に違う様です。
SageMakerでは基本的にrecordio-protobufを使用することが多いようです。
メリット/デメリット
ではどんなメリットやデメリットがあるのでしょうか?
メリット
- サイズが小さい(圧縮されるため)
- 読み込みが高速(バイナリ形式のため)
- ストリーミング処理が可能(一括ロード不要)
- SageMaker や MXNet で最適化されている
デメリット
- 可読性が低い(テキストデータのように開いて確認できない)
- 専用のツールが必要(直接編集が難しい)
RecordIO形式とParquet形式の違い
Machine Learning Specialityで他によく出てくるデータ形式といえばParquet形式かと思います。こちらも大規模なデータに対して使われる形式と書いてあることが多いのですが、なにがRecordIO形式と違うのでしょうか。
自分でまとめてみた限りは以下の様になっています。
- RecordIO は 機械学習向け の ストリーム指向 フォーマットで、シンプルな構造。
- Parquet は データ分析向け の 列指向 フォーマットで、圧縮やクエリが最適化されている。
Parquet形式の詳細はこちらが詳しいと思うので割愛します。
まとめ
今回は、用途等は知っているもののRecordIO形式が実際どういった形式なのかを理解がしたく、まとめてみました。
想像以上にRecordIO形式について(英語、日本語問わず)Web上で探しても書いてないことが多く、全容が理解しきれませんでした。
もし、記事の中で間違っている点等ありましたらお知らせいただけると助かります。
Discussion