저자:
(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.
그림 1에서 볼 수 있듯이 Deep Lake는 원시 데이터와 뷰를 S3와 같은 객체 스토리지에 저장하고 전체 계보로 데이터 세트를 구체화합니다. 스트리밍, Tensor 쿼리 언어 쿼리 및 시각화 엔진은 외부 관리 또는 중앙 집중식 서비스 없이 딥 러닝 컴퓨팅이나 브라우저에서 실행됩니다.
4.1.1 추출. 때로는 메타데이터가 이미 관계형 데이터베이스에 있을 수도 있습니다. Airbyte[3][22]를 사용하여 ETL 대상 커넥터를 추가로 구축했습니다. 프레임워크를 사용하면 SQL/NoSQL 데이터베이스, 데이터 레이크 또는 데이터 웨어하우스를 포함하여 지원되는 모든 데이터 소스에 연결하고 데이터를 Deep Lake에 동기화할 수 있습니다. 커넥터 프로토콜은 데이터를 열 형식으로 변환합니다.
4.1.2 변환. 데이터 처리 워크플로를 크게 가속화하고 사용자가 청크 레이아웃에 대해 걱정하지 않도록 Deep Lake는 Python 변환을 병렬로 실행할 수 있는 옵션을 제공합니다. 변환은 데이터세트를 가져와 샘플 방식으로 첫 번째 차원을 반복하고 새 데이터세트를 출력합니다. 사용자 정의 Python 함수는 두 개의 필수 인수 𝑠𝑎𝑚𝑝𝑙𝑒_𝑖𝑛, 𝑠𝑎𝑚𝑝𝑙𝑒_𝑜𝑢𝑡를 예상하고 @𝑑𝑒𝑒𝑝𝑙𝑎𝑘𝑒로 장식됩니다. 𝑐𝑜𝑚𝑝𝑢𝑡𝑒. 단일 𝑠𝑎𝑚𝑝𝑙𝑒_𝑖𝑛은 여러 개의 𝑠𝑎𝑚𝑝𝑙𝑒_𝑜𝑢𝑡𝑠을 동적으로 만들 수 있습니다. 일대일 변환과 일대다 변환이 모두 가능합니다. 새 데이터세트를 만들지 않고도 변환을 적용할 수도 있습니다.
뒤에서 스케줄러는 근처 청크에서 작동하는 샘플별 변환을 일괄 처리하고 프로세스 풀에서 예약합니다. 선택적으로 컴퓨팅을 Ray 클러스터에 위임할 수 있습니다[53]. 입력 데이터 세트를 정의하는 대신 사용자는 사용자 정의 개체와 함께 임의의 반복기를 제공하여 수집 워크플로를 만들 수 있습니다. 사용자는 여러 변환을 함께 쌓고 복잡한 파이프라인을 정의할 수도 있습니다.
Deep Lake는 또한 실험의 재현성과 완전한 데이터 계보 준수에 대한 요구 사항을 해결합니다. 다양한 버전의 데이터 세트가 동일한 스토리지에 하위 디렉터리로 구분되어 존재합니다. 각 하위 디렉터리는 해당 메타데이터 파일과 함께 독립적인 데이터세트 역할을 합니다. 버전이 지정되지 않은 데이터 세트와 달리 이러한 하위 디렉터리에는 수정된 모든 청크의 이름을 포함하는 텐서당 해당 Chunk_set과 함께 특정 버전에서 수정된 청크만 포함됩니다. 디렉토리 루트에 있는 버전 제어 정보 파일은 분기 버전 제어 트리로서 이러한 버전 간의 관계를 추적합니다. 특정 버전의 텐서 청크에 액세스하는 동안 버전 제어 트리는 현재 커밋부터 시작하여 첫 번째 커밋을 향해 순회됩니다. 순회 중에 각 버전의 청크 세트에 필요한 청크가 있는지 확인됩니다. 청크가 발견되면 순회가 중지되고 데이터가 검색됩니다. 버전 간 차이점을 추적하기 위해 각 버전에 대해 커밋 diff 파일도 텐서별로 저장됩니다. 이렇게 하면 버전과 분기 간 비교가 더 빨라집니다. 또한 데이터 세트를 채우는 동안 샘플 ID가 생성되고 저장됩니다. 이는 병합 작업 중에 동일한 샘플을 추적하는 데 중요합니다. Deep Lake의 버전 제어 인터페이스는 Python API로, 이를 통해 기계 학습 엔지니어는 CLI에서 전환하지 않고도 데이터 처리 스크립트 내에서 데이터 세트의 버전을 지정할 수 있습니다. 다음 명령을 지원합니다.
• 커밋 : 데이터세트의 현재 상태에 대한 변경 불가능한 스냅샷을 생성합니다.
• 체크아웃 : 기존 브랜치/커밋을 체크아웃하거나, 존재하지 않는 경우 새 브랜치를 생성합니다.
• Diff : 두 버전의 데이터 세트 간의 차이점을 비교합니다.
• 병합 : 두 가지 다른 버전의 데이터 집합을 병합하여 사용자가 정의한 정책에 따라 충돌을 해결합니다.
데이터 시각화는 특히 데이터를 분석적으로 구문 분석하기 어려운 경우 ML 워크플로에서 중요한 부분입니다. 빠르고 원활한 시각화를 통해 더 빠른 데이터 수집, 주석, 품질 검사 및 교육 반복이 가능합니다. Deep Lake 시각화 엔진은 소스에서 직접 대규모 데이터를 시각화하기 위한 웹 인터페이스를 제공합니다. 시각화를 위한 최상의 레이아웃을 결정하기 위해 텐서의 htype을 고려합니다. 이미지, 비디오, 오디오와 같은 기본 텐서가 먼저 표시되고 텍스트, class_label, bbox 및 bin_mask와 같은 보조 데이터 및 주석이 오버레이됩니다. 또한 시각화 도우미는 시퀀스와 같은 메타 유형 정보를 고려하여 데이터의 순차적 보기를 제공합니다. 여기서 시퀀스를 재생하고 전체 데이터를 가져오지 않고도 시퀀스의 특정 위치로 이동할 수 있습니다. 이는 비디오 또는 오디오 사용 사례와 관련이 있습니다. . Visualizer는 ML 워크플로의 중요한 요구 사항을 해결하여 사용자가 데이터를 이해 및 문제 해결하고, 데이터의 진화를 묘사하고, 예측을 실제와 비교하거나, 여러 이미지 시퀀스(예: 카메라 이미지 및 시차 맵)를 나란히 표시할 수 있도록 해줍니다.
데이터 세트 쿼리 및 균형 조정은 딥 러닝 워크플로 교육의 일반적인 단계입니다. 일반적으로 이는 샘플링 전략을 사용하거나 데이터세트를 하위 선택하기 위한 별도의 전처리 단계를 사용하여 데이터로더 내에서 수행됩니다. 반면에 기존 데이터 레이크는 외부 분석 쿼리 엔진[66]에 연결하고 데이터 프레임을 데이터 과학 워크플로로 스트리밍합니다. 특정 데이터에 대한 형식과 빠른 액세스 간의 격차를 해결하기 위해 TQL(Tensor Query Language)이라는 C++로 구현된 내장형 SQL 유사 쿼리 엔진을 제공합니다. 예제 쿼리가 그림 5에 나와 있습니다. SQL 파서가 Hyrise [37]에서 확장되어 Tensor 쿼리 언어를 설계하는 동안 선택적으로 계산을 외부 텐서 계산 프레임워크에 위임할 수 있는 플래너 및 실행 엔진을 구현했습니다. 쿼리 계획은 텐서 작업의 계산 그래프를 생성합니다. 그런 다음 스케줄러는 쿼리 그래프를 실행합니다.
쿼리 실행은 PyTorch[58] 또는 XLA[64]와 같은 외부 텐서 계산 프레임워크에 위임될 수 있으며 기본 가속 하드웨어를 효율적으로 활용할 수 있습니다. 표준 SQL 기능 외에도 TQL은 숫자 계산도 구현합니다. 새로운 쿼리 언어를 구현하는 데에는 두 가지 주요 이유가 있습니다. 첫째, 기존 SQL은 이미지 픽셀의 평균을 계산하거나 특정 차원에 배열을 투영하는 등의 다차원 배열 작업을 지원하지 않습니다. TQL은 Python/NumPy 스타일 인덱싱을 추가하고, 배열을 분할하고, 배열 작업을 위한 대규모 편의 함수 세트를 제공하여 이 문제를 해결합니다. 이들 중 다수는 NumPy에서 지원되는 일반적인 작업입니다. 둘째, TQL을 사용하면 버전 제어, 스트리밍 엔진, 시각화 등 Deep Lake의 다른 기능과 쿼리를 더욱 심층적으로 통합할 수 있습니다. 예를 들어 TQL을 사용하면 특정 버전의 데이터를 쿼리하거나 잠재적으로 데이터 세트의 여러 버전에 걸쳐 데이터를 쿼리할 수 있습니다. 또한 TQL은 쿼리 결과의 시각화를 사용자 정의하거나 필터링된 스트리밍을 위해 데이터 로더와의 원활한 통합을 위한 특정 지침을 지원합니다. 내장된 쿼리 엔진은 원격 컴퓨팅 인스턴스에서 모델을 교육하는 동안이나 WebAssembly를 통해 브라우저 내에서 컴파일되는 동안 클라이언트와 함께 실행됩니다. TQL은 다차원 열에 대한 숫자 계산을 통해 SQL을 확장합니다. 시각화하거나 딥 러닝 프레임워크로 직접 스트리밍할 수 있는 데이터 세트의 뷰를 구성합니다. 그러나 쿼리 보기는 희소할 수 있으며 이는 스트리밍 성능에 영향을 미칠 수 있습니다.
딥러닝에 사용되는 대부분의 원시 데이터는 로컬 또는 클라우드에 원시 파일(JPEG와 같은 형식으로 압축)로 저장됩니다. 데이터세트를 구성하는 일반적인 방법은 데이터베이스에 이러한 원시 파일에 대한 포인터를 보존하고, 이를 쿼리하여 필요한 데이터 하위 집합을 얻은 다음, 필터링된 파일을 컴퓨터로 가져온 다음, 파일을 반복하면서 모델을 교육하는 것입니다. 또한 데이터 계보는 출처 파일을 사용하여 수동으로 유지 관리해야 합니다. Tensor Storage Format은 연결된 텐서를 사용하여 이러한 단계를 단순화합니다. 즉, 원본 데이터에 대한 포인터(하나 또는 여러 클라우드 제공업체에 대한 링크/URL)를 저장합니다. 단일 텐서 내의 포인터는 여러 스토리지 제공자에 연결될 수 있으므로 사용자는 여러 소스에 있는 데이터에 대한 통합 보기를 얻을 수 있습니다. 쿼리, 버전 제어, 딥 러닝 프레임워크로의 스트리밍을 포함한 Deep Lake의 모든 기능은 연결된 텐서와 함께 사용할 수 있습니다. 그러나 데이터 스트리밍 성능은 기본 텐서만큼 최적이 아닙니다. 청크 레이아웃으로 인해 비효율적으로 스트리밍되는 쿼리로 인해 생성된 희소 뷰에도 비슷한 문제가 있습니다. 또한 구체화는 데이터 세트 보기를 최적의 레이아웃으로 변환하여 딥 러닝 프레임워크로 스트리밍하여 더 빠르게 반복하도록 합니다. 구체화에는 링크나 보기에서 실제 데이터를 가져와 효율적으로 청크로 배치하는 작업이 포함됩니다. 기계 학습 워크플로가 끝날 때까지 이 단계를 수행하면 전체 데이터 계보를 통해 최적의 스트리밍 성능과 데이터 중복을 최소화하면서 데이터 중복을 최소화할 수 있습니다.
데이터 세트가 커짐에 따라 원격으로 분산된 스토리지에서 네트워크를 통해 저장하고 전송하는 것이 불가피해졌습니다. 데이터 스트리밍을 사용하면 모든 데이터가 로컬 시스템에 복사될 때까지 기다리지 않고 모델을 교육할 수 있습니다. 스트리밍 데이터 로더는 데이터 가져오기, 압축 풀기, 변환 적용, 대조 및 훈련 모델에 대한 데이터 핸드오버를 보장합니다. 딥 러닝 데이터로더는 일반적으로 동기 계산을 피하기 위해 가져오기 및 변환을 병렬 실행 프로세스에 위임합니다. 그런 다음 메모리 복사 오버헤드가 발생하거나 일부 안정성 문제가 있는 공유 메모리를 사용하는 프로세스 간 통신(IPC)을 통해 데이터가 기본 작업자로 전송됩니다. 이와 대조적으로 Deep Lake 데이터로더는 전역 인터프리터 잠금을 방지하기 위해 프로세스별로 C++에서 고도로 병렬 가져오기 및 내부 압축 풀기를 위임합니다. 그런 다음 메모리 내 포인터를 사용자 정의 변환 함수에 전달하고 대조한 후 이를 딥러닝 기본 메모리 레이아웃의 훈련 루프에 노출합니다. 변환은 네이티브 라이브러리 루틴 호출만 사용하고 그에 따라 Python 전역 인터프리터 잠금(GIL)을 해제하는 경우 병렬로 동시에 실행됩니다. 결과적으로 우리는 다음을 얻습니다:
• 성능 : GPU가 완전히 활용되거나 컴퓨팅에 의해 병목 현상이 발생하도록 딥 러닝 모델에 데이터를 충분히 빠르게 제공합니다.
• 스마트 스케줄러 : CPU 집약적인 작업과 덜 집중적인 작업의 우선순위를 동적으로 구분합니다.
• 효율적인 리소스 할당 : 메모리 과잉으로 인해 훈련 프로세스가 중단되는 것을 방지하기 위해 메모리 소비를 예측합니다.
이 문서는 CC 4.0 라이선스에 따라 arxiv에서 볼 수 있습니다.
[3] 사용 가능한 소스 코드: @feature/connector/deeplake 브랜치의 https://github.com/activeloopai/airbyte