tfrecord 파일을 샤드로 분할하면 어떤 이점이 있습니까?


17

Tensorflow를 사용하여 음성 인식을 연구하고 있으며 대규모 웨이브 데이터 세트로 LSTM NN을 훈련시킬 계획입니다. 성능 향상으로 인해 tfrecords를 사용할 계획입니다. tfrecords 파일이 샤드로 분할되는 인터넷 (예 : Inception for example)에는 몇 가지 예가 있습니다. 내 질문은 : tfrecords 파일을 샤드에 저장하면 어떤 이점이 있습니까? 이 스플릿의 추가 성능 향상이 있습니까?

답변:


11

여러 파일로 분할 할 때 얻을 수있는 이점을 조사 할 때 유일한 대답 은 Google 직원 중 한 사람으로부터 얻은 것입니다.

그들은 성능 향상은 무시할 만하다고 말했지만 특히 데이터 세트를 다른 위치로 전송하려는 경우 파일을 분할하면 도움이 될 것입니다.

TFRecords를 읽는 데 권장되는 방법 ( tf.data.TFRecordDataset매우 유용한 .shuffle()방법 을 구현)을 사용하기 때문에 저장하기 전에 셔플 할 필요가 없습니다 .


2
.shuffle()하나의 큰 tfrecord 파일이있는 경우 방법은 이상적인 솔루션이 아닙니다. 큰 버퍼 크기를 사용하지 않으면 섞인 출력이 원래 순서와 다소 관련이 있습니다. 큰 데이터 세트가있는 경우 tfrecord에 저장하거나 샤드로 분할하기 전에 데이터를 사전 셔플 링해야한다고 생각합니다.
Bruce Chou

7

여전히 궁금한 사람들은 데이터를 섞을 수 있습니다. 하나의 파일에 TF 레코드를 사용하면 주문을 섞을 수 없습니다. 이것은 일반적으로 SGD에 필요합니다.

그러나 샤드를 사용하면 샤드 순서를 섞을 수 있으므로 개별 TFRecord에 액세스 할 수있는 것처럼 데이터를 섞는 것을 대략적으로 계산할 수 있습니다. 이것은 아무것도 아닌 것보다 분명히 낫고, 더 많은 샤드가 많을수록이 근사치가 더 좋습니다.

대안은 데이터를 복제하거나 TFRecords를 전혀 사용하지 않고 데이터를 미리 섞는 것입니다.


4

TFRecord 파일을 샤드로 분할하면 메모리에 맞지 않는 대용량 데이터 세트를 섞을 수 있습니다.

디스크에 수백만 개의 교육 예제가 저장되어 있고이를 훈련 프로세스를 통해 반복적으로 실행하려고한다고 가정하십시오. 또한 훈련 데이터를 반복 할 때마다 (즉, 각 에포크) 데이터를 완전히 임의의 순서로로드하려고한다고 가정하십시오.

한 가지 방법은 훈련 예제 당 하나의 파일을 만들고 모든 파일 이름 목록을 생성하는 것입니다. 그런 다음 각 에포크의 시작 부분에서 파일 이름 목록을 섞고 개별 파일을로드합니다. 이 방법의 문제점은 디스크의 임의 위치에서 수백만 개의 파일을로드한다는 것입니다. 특히 하드 디스크 드라이브에서 속도가 느려질 수 있습니다. 임의의 위치에서 수백만 개의 작은 파일을로드하는 경우 RAID 0 어레이라도 속도에 도움이되지 않습니다. 네트워크 연결을 통해 파일에 액세스하면 문제가 더욱 악화됩니다.

또 다른 방법은 하나의 큰 TFRecord 파일에서 학습 예제를 순서대로 읽고 셔플 버퍼를 사용하여 메모리에서 예제를 섞습니다. 그러나 셔플 버퍼는 일반적으로 CPU에서 사용 가능한 DDR 메모리보다 클 수 없습니다. 또한 셔플 버퍼가 데이터 세트보다 훨씬 작 으면 데이터를 제대로 섞을 수 없습니다. 데이터는 "로컬로"섞이지 만 "글로벌로"섞이지 않을 수 있습니다. 즉, 데이터 세트의 시작부터의 예는 데이터 세트의 끝에서 나온 예와 섞이지 않을 수 있습니다.

좋은 해결책은 데이터 세트를 여러 TFRecord 파일 (샤드라고 함)로 분할하여 위의 두 가지 접근 방식의 균형 잡힌 조합을 사용하는 것입니다. 각 에포크 동안 샤드 파일 이름을 셔플하여 전체 셔플 링을 얻고 셔플 버퍼를 사용하여 로컬 셔플 링을 얻을 수 있습니다. 균형이 잘 잡히면 샤드 크기가 디스크 속도 문제를 방지 할만큼 충분히 커지지 만, 샤드 버퍼는 셔플 버퍼로 적절히 섞을 수 있도록 샤드 크기를 작게 유지합니다.

정확한 단계는 다음과 같습니다.

  1. 모든 교육 예제를 여러 TFRecord 파일 (샤드)에 무작위로 배치합니다.
  2. 각 시대의 시작 부분에서 샤드 파일 이름 목록을 섞습니다.
  3. 샤드에서 학습 예제를 읽고 셔플 버퍼를 통해 예제를 전달하십시오. 일반적으로 셔플 버퍼는 샤드 크기보다 커야 샤드 전체에서 셔플 링이 잘됩니다.
  4. 섞인 예제를 훈련 과정에 전달하십시오.

3

TFRecords 파일을 여러 샤드로 분할하면 기본적으로 3 가지 장점이 있습니다.

  1. 셔플이 더 쉽습니다 . 다른 사람들이 지적했듯이 셔플 버퍼를 사용하기 전에 데이터를 거친 수준으로 쉽게 셔플 할 수 있습니다.
  2. 빠른 다운로드 . 파일이 여러 서버에 분산 된 경우 다른 서버에서 여러 파일을 병렬로 다운로드하면 단일 서버에서 하나의 파일을 다운로드하는 대신 대역폭 사용이 최적화됩니다. 단일 서버에서 데이터를 다운로드하는 것과 비교하여 성능을 크게 향상시킬 수 있습니다.
  3. 조작이 간단합니다 . 단일 1TB 파일이 아닌 100MB의 10,000 개 파일을 처리하는 것이 더 쉽습니다. 대용량 파일은 처리하기 어려울 수 있습니다. 특히 전송이 실패 할 가능성이 훨씬 높습니다. 데이터가 모두 하나의 파일에 있으면 데이터의 하위 집합을 조작하기가 더 어렵습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.