Cloud TPU で使用する画像分類データセットを変換します。
このチュートリアルでは、画像分類データ変換プログラムのサンプルスクリプトを使用して、生の画像分類データセットを Cloud TPU モデルのトレーニングで使用される TFRecord 形式に変換する方法について説明します。
TFRecord は、各画像を個別のファイルとして読み取るよりも効率的に、Cloud Storage から大きなファイルを読み取ります。TFRecord は、tf.data.Dataset
パイプラインを使用している場所であればどこでも使用できます。
TFRecord の使用について詳しくは、次の TensorFlow ドキュメントをご覧ください。
- TFRecord と tf.train.Example
- tf.data.Dataset
- tf.data: TensorFlow 入力パイプラインのビルド
- PyTorch TFRecord の読み取りおよび書き込み
PyTorch または JAX フレームワークを使用しており、データセット ストレージに Cloud Storage を使用していない場合は、TFRecord による同じ利点を得られない可能性があります。
コンバージョンの概要
GitHub のデータ コンバータ リポジトリ内の画像分類フォルダには、converter
スクリプト(image_classification_data.py
)とサンプル実装(simple_example.py
)が含まれており、独自のデータ変換を行うためにコピーして変更できます。
画像分類データ コンバーターのサンプルでは、ImageClassificationConfig
と ImageClassificationBuilder
の 2 つのクラスを定義しています。これらのクラスは tpu/tools/data_converter/image_classification_data.py
で定義されています。
ImageClassificationConfig
は要約ベースクラスです。ImageClassificationConfig
をサブクラス化して、ImageClassificationBuilder
をインスタンス化するために必要な構成を定義します。
ImageClassificationBuilder
は画像分類データセットの TensorFlow データセット ビルダーです。これは tdfs.core.GeneratorBasedBuilder
のサブクラスです。
データセットからデータの例を取得し、TFRecords に変換します。TFRecord は、ImageClassificationBuilder
の __init__
メソッドの data_dir
パラメータで指定されたパスに書き込まれます。
simple_example.py で、サポートされるモードを定義するプロパティ、イメージクラスの数、データセット内の各サンプルの画像データと画像クラスを含む辞書を生成するサンプル生成ツールを実現して、SimpleDatasetConfig
は ImageClassificationConfig
をサブクラス化します。
main()
関数は、ランダムに生成された画像データのデータセットを作成し、クラスの数とディスク上のデータセットへのパスを指定する SimpleDatasetConfig
オブジェクトをインスタンス化します。次に、main()
は、SimpleDatasetConfig
インスタンスを渡し、ImageClassificationBuilder
オブジェクトをインスタンス化します。最後に、main()
が download_and_prepare()
を呼び出します。 このメソッドが呼び出されると、ImageClassificationBuilder
インスタンスはSimpleDatasetConfig
によって実装されたデータサンプル 生成ツールを使用して各サンプルを読み込み、一連の TFRecord ファイルに保存します。
詳細については、分類コンバーターのノートブックをご覧ください。
データ コンバージョン サンプルを変更してデータセットを読み込む
データセットを TFRecord 形式に変換するには、次のプロパティを定義する ImageClassificationConfig
クラスをサブクラス化します。
- num_labels: イメージクラスの数を返します
- supported_modes: データセットでサポートされているモードのリストを返します(例: test、train、validate)
- text_label_map: テキストクラス ラベルと整数クラスラベル間のマッピングをモデル化する辞書を返します(SimpleDatasetConfig はマッピングを必要としないため、このプロパティを使用しません)
- download_path: データセットのダウンロード元のパス(SimpleDatasetConfig はこのプロパティを使用しません。example_generator はディスクからデータを読み込みます)
example_generator 生成ツール関数を実装します。このメソッドでは、画像データと各サンプルの画像クラス名を含む辞書を生成する必要があります。ImageClassificationBuilder
は example_generator()
関数を使用して各サンプルを取得し、TFRecord 形式でディスクに書き込みます。
データ変換のサンプルを実行する
次のコマンドを使用して Cloud Storage バケットを作成します。
gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=us-central2
gcloud
コマンドを使用して Cloud TPU を起動します。$ gcloud compute tpus tpu-vm create tpu-name \ --zone=us-central2-b \ --accelerator-type=v4-8 \ --version=tpu-vm-tf-2.17.0-pjrt
コマンドフラグの説明
zone
- Cloud TPU を作成するゾーン。
accelerator-type
- アクセラレータ タイプでは、作成する Cloud TPU のバージョンとサイズを指定します。TPU のバージョンごとにサポートされているアクセラレータ タイプの詳細については、TPU のバージョンをご覧ください。
version
- Cloud TPU ソフトウェアのバージョン。
SSH を使用して TPU に接続します。
$ gcloud compute tpus tpu-vm ssh tpu-name --zone=us-central2-b
TPU に接続すると、シェル プロンプトが
username@projectname
からusername@vm-name
に変わります。必要なパッケージをインストールする
(vm)$ pip3 install opencv-python-headless pillow
スクリプトで使用する次の環境変数を作成します。
(vm)$ export STORAGE_BUCKET=gs://bucket-name (vm)$ export CONVERTED_DIR=$HOME/tfrecords (vm)$ export GENERATED_DATA=$HOME/data (vm)$ export GCS_CONVERTED=$STORAGE_BUCKET/data_converter/image_classification/tfrecords (vm)$ export GCS_RAW=$STORAGE_BUCKET/image_classification/raw (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
data_converter
ディレクトリに移動します。(vm)$ cd /usr/share/tpu/tools/data_converter
フェイク データセットでデータを実行する
simple_example.py
スクリプトは、データ コンバージョン サンプルの image_classification
フォルダにあります。次のパラメータを使用してスクリプトを実行すると、一連のフェイク画像が生成され、TFRecord に変換されます。
(vm)$ python3 image_classification/simple_example.py \ --num_classes=1000 \ --data_path=$GENERATED_DATA \ --generate=True \ --num_examples_per_class_low=10 \ --num_examples_per_class_high=11 \ --save_dir=$CONVERTED_DIR
生のデータセットでデータ変換ツールを実行する
元データの場所の環境変数を作成します。
(vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
simple_example.py
スクリプトを実行する(vm)$ python3 image_classification/simple_example.py \ --num_classes=1000 \ --data_path=$GCS_RAW \ --generate=False \ --save_dir=$CONVERTED_DIR
simple_example.py
スクリプトは次のパラメータを受け取ります。
num_classes
はデータセット内のクラスの数のことです。ここでは、ImageNet フォーマットに合わせて 1000 を使用しています。generate
は、生データを生成するかどうかを決定します。data_path
は、generate=True
の場合はデータが生成されるパス、generate=False
の場合は生データが保存されるパスを指します。num_examples_per_class_low
とnum_examples_per_class_high
はクラスごとにいくつのサンプルを生成するかを決定します。スクリプトは、この範囲内のサンプルの乱数を生成します。save_dir
は、保存された TFRecord が保存される場所を参照します。Cloud TPU でモデルをトレーニングするには、データは Cloud Storage に保存されている必要があります。データは、Cloud Storage 上、または VM 上のどちらでもかまいません。
TFRecord の名前を変更し Cloud Storage に移動する
次の例では、変換されたデータを ResNet モデルで使用します。
TFRecord の名前を ImageNet の TFRecord と同じ形式に変更します。
(vm)$ cd $CONVERTED_DIR/image_classification_builder/Simple/0.1.0/ (vm)$ sudo apt install rename
(vm)$ rename -v 's/image_classification_builder-(\w+)\.tfrecord/$1/g' *
TFRecord を Cloud Storage にコピーします。
(vm)$ gcloud storage cp train* $GCS_CONVERTED (vm)$ gcloud storage cp validation* $GCS_CONVERTED
クリーンアップ
Cloud TPU との接続を切断します(まだ切断していない場合)。
(vm)$ exit
プロンプトが
user@projectname
に変わります。これは、現在、Cloud Shell 内にいることを示しています。Cloud Shell で
gcloud
を実行して、VM リソースを削除します。$ gcloud compute tpus tpu-vm delete tpu-name \ --zone=us-central2-b
gcloud compute tpus tpu-vm list
を実行して、VM が削除されたことを確認します。削除には数分かかることがあります。以下のようなレスポンスは、インスタンスが正常に削除されたことを示します。$ gcloud compute tpus tpu-vm list --zone=us-central2-b
Listed 0 items.
次に示すように gcloud CLI を実行します。bucket-name は、このチュートリアルで作成した Cloud Storage バケット名に置き換えます。
$ gcloud storage rm gs://bucket-name --recursive