저자:
(1) Sasun Hambardzumyan, Activeloop, Mountain View, CA, USA;
(2) Abhinav Tuli, Activeloop, 미국 캘리포니아주 마운틴뷰;
(3) Levon Ghukasyan, Activeloop, Mountain View, CA, USA;
(4) Fariz Rahman, Activeloop, 미국 캘리포니아주 마운틴뷰;.
(5) Hrant Topchyan, Activeloop, Mountain View, CA, USA;
(6) David Isayan, Activeloop, 미국 캘리포니아주 마운틴뷰;
(7) 마크 맥퀘이드(Mark McQuade), 미국 캘리포니아주 마운틴뷰 소재 Activeloop;
(8) Mikayel Harutyunyan, Activeloop, 미국 캘리포니아주 마운틴뷰;
(9) Tatevik Hakobyan, Activeloop, Mountain View, CA, USA;
(10) Ivo Stranic, Activeloop, Mountain View, CA, USA;
(11) Davit Buniatyan, Activeloop, Mountain View, CA, USA.
Deep Lake 데이터세트는 그림 3과 같이 텐서를 열로 사용하는 열형 스토리지 아키텍처를 따릅니다. 각 텐서는 데이터 샘플을 포함하는 바이너리 블롭인 청크 모음입니다. 각 텐서와 연결된 인덱스 맵은 주어진 샘플 인덱스에 대해 해당 청크 내에서 샘플의 올바른 청크와 인덱스를 찾는 데 도움이 됩니다.
데이터 세트의 샘플은 병렬 텐서에 걸쳐 인덱싱된 단일 행을 나타냅니다. 문서 저장 형식과 달리 샘플 요소는 논리적으로 독립적이므로 성능 쿼리를 실행하거나 선택한 텐서를 네트워크를 통해 GPU 훈련 인스턴스로 스트리밍하기 위해 샘플에 부분적으로 액세스할 수 있습니다. 여러 개의 텐서를 그룹화할 수 있습니다. 그룹은 구문 중첩을 구현하고 텐서가 서로 관련되는 방식을 정의합니다. 구문 중첩은 계층적 메모리 레이아웃의 형식 복잡성을 방지합니다. 데이터 세트의 스키마 변경 사항도 데이터 세트 콘텐츠 변경과 유사하게 버전 제어를 통해 시간이 지남에 따라 추적됩니다.
Tensors는 입력되며 내부에서 추가되거나 수정될 수 있습니다. 인덱스 또는 인덱스 집합에 대한 기본 액세스는 데이터를 NumPy 배열로 반환합니다[55]. Parquet [79] 또는 Arrow [13]의 계열에서 볼 수 있는 1차원 데이터를 저장하는 대신, 텐서는 일반적으로 첫 번째 차원이 인덱스 또는 배치 차원에 해당하는 n차원 데이터를 수용할 수 있습니다. 텐서는 Zarr [52]와 같은 정적으로 청크된 배열 형식과 달리 비정형 텐서라고도 하는 동적으로 모양이 지정된 배열을 포함할 수 있습니다.
Htype은 데이터 유형(NumPy [55]에 표시된 dtype), 모양, 차원 수 또는 압축과 같은 텐서의 샘플에 대한 기대치를 정의합니다. 형식화된 텐서는 딥 러닝 프레임워크와의 상호 작용을 간단하게 만들고 온전성 검사와 효율적인 메모리 레이아웃을 가능하게 합니다. 일반 텐서 htype을 상속하여 이미지, 비디오, 오디오, bbox, dicom 등과 같은 유형을 구성할 수 있습니다. 예를 들어, 이미지 htype이 있는 텐서는 추가되는 샘플의 dtype이 uint8이고 모양 길이가 3(예: 너비, 높이, 채널 수)일 것으로 예상합니다. 우리는 이미지 텐서(link[image])의 일반적인 동작을 유지하면서 원격으로 저장된 이미지를 참조하면서 텐서(sequence[image])에 이미지 시퀀스를 저장하는 것을 지원하는 메타 유형을 허용하는 htypes 개념을 더 확장합니다. 가능한 교차 형식 지원.
Deep Lake 데이터 세트에는 JSON 형식의 출처 파일과 텐서당 폴더가 포함되어 있습니다. 텐서는 청크, 청크 인코더, 타일 인코더 및 텐서 메타데이터를 포함합니다. 텐서는 선택적으로 숨길 수 있습니다. 예를 들어, 숨겨진 텐서는 다운샘플링된 이미지 버전을 유지하거나 빠른 쿼리를 위해 모양 정보를 보존하는 데 사용될 수 있습니다.
텐서는 스토리지 수준에서 청크로 저장됩니다. 정적으로(추론된) 모양의 청킹은 청크 맵 테이블을 유지하지 않지만 텐서를 지정하는 동안 상당한 사용자 오버헤드, 사용자 정의 압축 사용 제한, 동적으로 모양이 지정된 텐서에 대해 활용도가 낮은 스토리지 및 사후 처리 비효율성을 초래합니다. Deep Lake 청크는 제한된 수의 샘플에 맞도록 청크 크기의 하한 및 상한을 기반으로 구성됩니다. 이는 텐서당 청크 ID 매핑에 대한 샘플 인덱스를 유지하는 동시에 혼합 모양 샘플을 수용하면서 스트리밍에 최적인 범위의 청크 크기를 활성화하는 압축된 인덱스 맵을 갖는 절충안이 필요합니다. 이 백서에서 취한 접근 방식은 파일 시스템 페이지 맵과 계산 정의 맵 없는 배열 스토리지 시스템 간의 최적화된 절충안으로 간주할 수 있습니다. 실용적인 이유로 단일 청크 인코더는 1PB 텐서 데이터당 150MB 청크 인코더를 유지하면서 수십억 개의 이미지로 확장될 수 있습니다. 청크 인코더를 샤딩하여 추가 스케일링을 도입할 수 있습니다. 청크에는 바이트 범위, 샘플 모양, 샘플 데이터 자체와 같은 헤더 정보가 포함되어 있습니다. 큰 항공 또는 현미경 이미지의 경우와 같이 샘플이 상한 청크 크기보다 큰 경우 샘플은 공간 차원에 걸쳐 청크로 타일링됩니다. 타일링의 유일한 예외는 비디오입니다. 스트리밍 중 인덱스에 대한 효율적인 프레임 매핑, 키프레임 전용 압축 해제 및 범위 기반 요청으로 인해 비디오가 보존됩니다.
텐서 저장 형식은 순차 및 무작위 액세스를 포함한 딥 러닝 훈련 및 추론에 최적화되어 있습니다. 순차적 액세스는 스캔 쿼리 실행, 텐서를 다른 텐서로 변환 또는 추론 실행에 사용됩니다. 무작위 액세스 사용 사례에는 동일한 이미지에 레이블을 쓰는 여러 주석자 또는 데이터세트와 함께 예측을 다시 저장하는 모델이 포함됩니다. 엄격 모드가 비활성화되어 있는 동안 텐서의 범위를 벗어난 인덱스를 할당하여 희소 텐서를 수용할 수 있습니다. 그러나 시간이 지남에 따라 무작위로 할당하면 비효율적으로 저장된 데이터 청크가 생성됩니다. 데이터 레이아웃을 수정하기 위해 데이터 레이아웃을 최적화하는 즉석 재청킹 알고리즘을 구현합니다. Deep Lake의 주요 액세스 패턴 중 하나는 기계 학습 모델 교육을 위한 섞인 스트림 액세스입니다. 청크를 훈련 프로세스로 스트리밍하는 동안 무작위 또는 사용자 정의 순서 액세스가 필요합니다. 이는 청크 내의 하위 요소에 액세스하기 위한 범위 기반 요청을 포함하고, 순서를 결정하기 위해 훈련하기 전에 복잡한 쿼리를 실행하고, 가져온 데이터와 사용되지 않은 데이터의 버퍼 캐시를 유지함으로써 달성됩니다. 이렇게 하면 셔플링 알고리즘을 실행하기 위한 별도의 컴퓨팅 클러스터가 필요하지 않습니다[50].
각 텐서에는 자체 청크가 있으며 기본 청크 크기는 8MB입니다. 단일 청크는 개별 데이터 포인트(이미지, 레이블, 주석 등)가 청크 크기보다 작은 경우 여러 인덱스의 데이터로 구성됩니다. 반대로, 개별 데이터 포인트가 청크 크기보다 큰 경우 데이터는 여러 청크로 분할됩니다(타일링). 청킹 논리의 예외는 비디오 데이터입니다.
Deep Lake 형식은 GPU 처리 처리량을 극대화하는 데 최적화되어 있습니다. 여기에는 딥 러닝 프레임워크의 예상 레이아웃에서 CPU 프리페칭, 압축 풀기 또는 디코딩, 변환, GPU 메모리 전송이 포함됩니다.
Deep Lake는 AWS S3 [1], Google Cloud Storage(GCS) [3], POSIX 호환 파일 시스템 또는 로컬 인메모리 스토리지와 같은 객체 스토리지를 포함한 모든 스토리지 공급자에 연결할 수 있습니다. 또한 다양한 스토리지 공급자를 함께 연결하여 메모리 캐싱을 구성합니다. 예를 들어 로컬 메모리 내 데이터가 있는 원격 S3 스토리지의 LRU(Least Recent Used) 캐시가 있습니다.
이 문서는 CC 4.0 라이선스에 따라 arxiv에서 볼 수 있습니다.