Cloud TPU와 함께 사용할 이미지 분류 데이터 세트 변환

이 튜토리얼에서는 이미지 분류 데이터 변환기 샘플 스크립트를 사용하여 원시 이미지 분류 데이터 세트를 Cloud TPU 모델 학습에 사용하는 TFRecord 형식으로 변환하는 방법을 설명합니다.

TFRecord는 각 이미지를 개별 파일로 읽는 것보다 효율적으로 Cloud Storage에서 큰 파일을 읽습니다. tf.data.Dataset 파이프라인을 사용하는 모든 곳에서 TFRecord를 사용할 수 있습니다.

TFRecord 사용에 대한 자세한 내용은 다음 TensorFlow 문서를 참조하세요.

PyTorch 또는 JAX 프레임워크를 사용하고 데이터 세트 스토리지에 Cloud Storage를 사용하지 않는 경우 TFRecord에서 동일한 이점을 얻지 못할 수 있습니다.

전환 개요

GitHub의 데이터 변환기 저장소 내의 이미지 분류 폴더에는 converter 스크립트, image_classification_data.py, 샘플 구현, simple_example.py가 포함되어 있습니다. 복사하고 수정하여 자체 데이터 변환을 수행하세요.

이미지 분류 데이터 변환기 샘플은 두 개의 클래스 ImageClassificationConfigImageClassificationBuilder를 정의합니다. 이들 클래스는 tpu/tools/data_converter/image_classification_data.py에 정의됩니다.

ImageClassificationConfig는 추상 기본 클래스입니다. ImageClassificationConfig를 서브클래스로 만들어서 ImageClassificationBuilder를 인스턴스화하는데 필요한 구성을 정의합니다.

ImageClassificationBuilder는 이미지 분류 데이터 세트의 TensorFlow 데이터 세트 빌더입니다. tdfs.core.GeneratorBasedBuilder의 서브클래스입니다. 데이터 세트에서 데이터 예시를 검색하여 TFRecord로 변환합니다. TFRecord는 data_dir 매개변수로 지정한 경로에 ImageClassificationBuilder__init__ 메서드에 기록됩니다.

simple_example.py에서 SimpleDatasetConfigImageClassificationConfig의 서브클래스를 만들고 지원 모드, 이미지 클래스 수, 데이터 세트의 각 예시에 대한 이미지 데이터와 이미지 클래스를 포함하는 사전을 생성하는 생성기 예시를 정의하는 속성을 구현합니다.

main() 함수는 무작위로 생성된 이미지 데이터의 데이터 세트를 만들고 클래스 수와 디스크의 데이터 세트 경로를 지정하는 SimpleDatasetConfig 객체를 인스턴스화합니다. 다음으로, main()SimpleDatasetConfig 인스턴스를 전달하며 ImageClassificationBuilder 객체를 인스턴스화합니다. 마지막으로 main()download_and_prepare()를 호출합니다. 이 메서드가 호출되면 ImageClassificationBuilder 인스턴스는 SimpleDatasetConfig에서 구현한 데이터 예시 생성기를 사용하여 각 예시를 로드하고 일련의 TFRecord 파일에 저장합니다.

자세한 내용은 분류 변환기 노트북을 참조하세요.

데이터 세트를 로드하도록 데이터 변환 샘플 수정

데이터 세트를 TFRecord 형식으로 변환하려면 다음 속성을 정의하는 ImageClassificationConfig 클래스의 서브클래스를 만듭니다.

  • num_labels: 이미지 클래스 수를 반환합니다.
  • supported_modes: 데이터 세트에서 지원하는 모드 목록을 반환합니다(예: 테스트, 학습, 검증).
  • text_label_map: 텍스트 클래스 라벨과 정수 클래스 라벨 간의 매핑을 모델링하는 사전을 반환합니다. 매핑이 필요하지 않으므로 SimpleDatasetConfig는 이 속성을 사용하지 않습니다.
  • download_path: 데이터 세트를 다운로드할 경로이며 SimpleDatasetConfig는 이 속성을 사용하지 않고 example_generator는 디스크에서 데이터를 로드합니다.

example_generator 생성기 함수를 구현합니다. 이 메서드는 각 예시에 대해 이미지 데이터와 이미지 클래스 이름이 포함된 사전을 생성해야 합니다. ImageClassificationBuilderexample_generator() 함수를 사용하여 각 예시를 검색하고 이를 TFRecord 형식으로 디스크에 씁니다.

데이터 변환 샘플 실행

  1. 다음 명령어를 사용하여 Cloud Storage 버킷을 만듭니다.

    gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=us-central2
  2. 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 소프트웨어 버전입니다.
  3. SSH를 사용하여 TPU에 연결합니다.

    $ gcloud compute tpus tpu-vm ssh tpu-name --zone=us-central2-b

    TPU에 연결하면 셸 프롬프트가 username@projectname에서 username@vm-name으로 변경됩니다.

  4. 필수 패키지 설치

    (vm)$ pip3 install opencv-python-headless pillow
  5. 스크립트에 사용되는 다음 환경변수를 만듭니다.

    (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"
  6. data_converter 디렉터리로 변경합니다.

    (vm)$ cd /usr/share/tpu/tools/data_converter

모의 데이터 세트에서 데이터 변환기 실행

simple_example.py 스크립트는 데이터 변환기 샘플의 image_classification 폴더에 위치합니다. 다음 매개변수로 스크립트를 실행하면 가짜 이미지 모음이 생성되어 TFRecords로 변환됩니다.

(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

원시 데이터 세트 중 하나에서 데이터 변환기 실행

  1. 원시 데이터의 위치를 위한 환경 변수를 만듭니다.

    (vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
  2. 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_pathgenerate=True인 경우 데이터가 생성되는 경로, 또는 generate=False인 경우 원시 데이터가 저장되는 경로를 나타냅니다.
  • num_examples_per_class_lownum_examples_per_class_high 클래스당 생성할 예제의 수를 결정합니다. 스크립트는 이 범위에서 임의의 수의 예제를 생성합니다.
  • save_dir은 저장된 TFRecord가 저장되는 위치를 나타냅니다. Cloud TPU에서 모델을 학습시키려면 데이터를 Cloud Storage에 저장해야 합니다. Cloud Storage 또는 VM에 저장할 수 있습니다.

TFRecord 이름 변경 및 Cloud Storage로 이동

다음 예시에서는 ResNet 모델과 함께 변환된 데이터를 사용합니다.

  1. TFRecords 이름을 ImageNet TFRecords와 동일한 형식으로 바꿉니다.

    (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' *
  2. TFRecords를 Cloud Storage에 복사합니다.

    (vm)$ gcloud storage cp train* $GCS_CONVERTED
    (vm)$ gcloud storage cp validation* $GCS_CONVERTED

삭제

  1. 아직 연결을 해제하지 않았다면 Cloud TPU에서 연결을 해제합니다.

    (vm)$ exit

    프롬프트가 user@projectname으로 바뀌면 Cloud Shell에 있는 것입니다.

  2. Cloud Shell에서 gcloud를 실행하여 VM 리소스를 삭제합니다.

    $ gcloud compute tpus tpu-vm delete tpu-name \
      --zone=us-central2-b
  3. gcloud compute tpus tpu-vm list를 실행하여 VM이 삭제되었는지 확인합니다. 삭제하는 데 몇 분 정도 걸릴 수 있습니다. 다음과 같은 응답이 나타나면 인스턴스가 성공적으로 삭제되었다는 의미입니다.

    $ gcloud compute tpus tpu-vm list --zone=us-central2-b
    Listed 0 items.
    
  4. 다음과 같이 gcloud CLI를 실행하고 bucket-name을 이 튜토리얼용으로 만든 Cloud Storage 버킷 이름으로 바꿉니다.

    $ gcloud storage rm gs://bucket-name --recursive