TorchData 0.3.0 Beta : 概要

TorchData 0.3.0 Beta : 概要 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 03/14/2022

* 本ページは、TorchData の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

TorchData 0.3.0 Beta : 概要

torchdata は柔軟で高性能なデータパイプラインを容易に構築するための一般的なモジュール化されたデータロード・プリミティブのライブラリです。

その目的は、PyTorch の DataLoader と共に out of the box に上手く動作する、DataPipe と呼称される構成可能な Iterable-スタイルと Map-スタイルのビルディングブロックを提供することです。それは TorchVision と TorchText の多くの様々なデータセットを再現する機能を含みます、つまりロード、パース、キャッシング、そして幾つかの他のユティリティ (e.g. ハッシュチェック) を含みます。私達はユーザのフィードバックに基づいてこの API セットを拡張して固め続けていきます。

DataPipe の基本的な構造を理解するためには、下の What are DataPipes? を見てください、そして DataPipe がデータセットにどのように実際に構成できるかを見るには、examples/ ディレクトリを見てください。

元の DataLoader の多くの機能は DataPipe にモジュール化されましたので、torch 内の BC functional パリティを保持するために、今は幾つかは torchdata ではなく standard DataPipes in pytorch/pytorch として在ることに注意してください。

 

何故構成可能な (= composable) データローディングなのでしょう?

長年に渡る PyTorch DataLoader と Dataset のフィードバックとコミュニティの本質的な使用により、以下を見出しました :

  1. 元の DataLoader は多くの機能を一緒にバンドルし過ぎて、拡張したり、操作したり、あるいは置き換えることを難しくしました。これはコミュニティで相互運用可能な要素のエコシステムではなく、ユースケース固有の DataLoader バリアントの蔓延を招きました。

  2. 個々の PyTorch ドメインライブラリを含む、多くのライブラリは同じデータロード・ユティリティを繰り返し書き直しています。これらの最低限必要なものを書き直し、デバッグしてメンテナンスする時間と労力を OSS 保守者は節約できます。

 

インストール

バージョン互換性

以下は対応する torchdata バージョンとサポートされる Python バージョンです。

  • torch main / nightly 1.11.0
  • torchdata main/nightly 0.3.0
  • python >=3.7, <=3.10

 

Colab

この Colab ノートブック の手順に従ってください。

 

Local pip or conda

最初に環境をセットアップします。torchdata に加えて nightly PyTorch バイナリをインストールしていきます。conda を使用している場合には、conda 環境を作成します :

conda create --name torchdata
conda activate torchdata

代わりに venv を使用することを望む場合 :

python -m venv torchdata-env
source torchdata-env/bin/activate

 
torchdata のインストール :

pip の使用 :

pip install torchdata

conda の使用 :

conda install -c pytorch torchdata

Python で素早いサニティチェックを実行します :

from torchdata.datapipes.iter import HttpReader
URL = "https://raw.githubusercontent.com/mhjabreel/CharCnn_Keras/master/data/ag_news_csv/train.csv"
ag_news_train = HttpReader([URL]).parse_csv().map(lambda t: (int(t[0]), " ".join(t[1:])))
agn_batches = ag_news_train.batch(2).map(lambda batch: {'labels': [sample[0] for sample in batch],\
                                      'text': [sample[1].split() for sample in batch]})
batch = next(iter(agn_batches))
assert batch['text'][0][0:8] == ['Wall', 'St.', 'Bears', 'Claw', 'Back', 'Into', 'the', 'Black']

 

ソースから

python setup.py install

 

DataPipe とは何か?

初期の頃、再利用可能なロードツール (e.g. TorchVision の ImageFolder ) を意味する PyTorch Dataset と、実際のデータコーパスについて事前構築されたイテレータ/アクセサー (e.g. TorchVision の ImageNet) を意味する Dataset との間で広範な混乱を観察しました。これはデータツールの構成 (= composition) ではなく、データツールの備蓄された (= siloed) 遺産 (= inheritance) の不幸なパターンに繋がりました。

DataPipe は単純に構成的な利用のための PyTorch Dataset の改称と再目的化です。DataPipe は Python データ構造に渡るあるアクセス関数、IterDataPipe のために __iter__ そして MapDataPipe のために __getitem__ を取り、そして僅かな変換が適用された新しいアクセス関数を返します。例えば、この JsonParser を見てください、これはファイル名と raw ストリームに渡る IterDataPipe を受け取り、そしてファイル名とデシリアライズされたデータについて新しいイテレータを生成します :

import json

class JsonParserIterDataPipe(IterDataPipe):
    def __init__(self, source_datapipe, **kwargs) -> None:
        self.source_datapipe = source_datapipe
        self.kwargs = kwargs

    def __iter__(self):
        for file_name, stream in self.source_datapipe:
            data = stream.read()
            yield file_name, json.loads(data)

    def __len__(self):
        return len(self.source_datapipe)

このサンプルで、ファーストクラスとしてのストリーム化操作を持つ、洗練されたデータパイプラインを再生成するような変換グラフを構成するために DataPipe がどのように一緒に簡単に連鎖できるかが分かります。

この命名規則では、DataSet は単純に DataPipe のグラフを参照し、そして ImageNet のようなデータセットモジュールは必要な構成された DataPipe を返すファクトリ関数として再構築できます。初期サポートの大部分は IterDataPipe にフォーカスされる一方で、より多くの MapDataPipe のサポートは後で予定されていることに注意してください。

 

チュートリアル

このライブラリのチュートリアルは ドキュメントサイトのここで利用可能です。それは 3 つのトピックをカバーします : DataPipe の使用DataLoader との作業, そして DataPipe の実装 です。

 

使用例

DataPipe を使用する、様々な研究領域に渡るポピュラーなデータセットの幾つかのデータロードの実装があります。幾つかの 選択された例をここで 見つけることができます。

 

FAQ

Q: DataPipe の既存のセットが必要なことを行なわない場合にはどうするべきでしょうか?

A: 独自のカスタム DataPipe を実装する ことができます。貴方のケースが、コミュニティが貴方のカスタム DataPipe をこのライブラリに追加させることにより利益を得られるほどに十分に一般的であると考えるのであれば、自由に GitHub issue をオープンしてください。

 
Q : Shuffler/Batcher DataPipe が DataLoader と共に使用されるとき何が起きるでしょうか?

A: DataLoader に対して shuffle=True/batch_size>1 を設定している間にこれらの DataPipe を選択する場合、サンプルは 1 度以上シャッフル/バッチ化されます。どちらか一方を選択するべきです。

 
Q: マルチプロセス処理は DataPipe でどのように処理されますか?

A: マルチプロセス処理データロードは依然として DataLoader により処理されます、詳細は DataLoader ドキュメント を見てください。

 
Q: DataLoader の今後の計画は何でしょう?

A: 次のリリースで DataLoader の新しいバージョンが予定されています。高位レベルでは、DataLoader V2 はデータ処理ロジックではなく、マルチプロセス処理, 分散, そして類似の機能だけを担当する予定です。シャッフリングとバッチ化のような、総てのデータ処理機能は DataLoader から DataPipe に移されます。同時に、DataLoader の現行/旧バージョンは依然として利用可能で、それと共に DataPipe を利用することもできます。

 

将来の計画

PyTorch 1.12 リリース (mid 2022) で次のリリースが可能になるように、私達はライブラリを拡張し、API を固め、そしてフィードバックを集め続けることを望みます。それまでに DataLoader の新しいバージョンをリリースする計画もあります。Stay tuned !

 

以上