GitHub - brody-0125/dart_tensor_preprocessing: Tensor preprocessing library for Flutter/Dart. NumPy-like transforms pipeline for ONNX Runtime, TFLite, and other AI inference engines.
핵심 포인트
- 1`dart_tensor_preprocessing`는 Flutter/Dart 환경에서 ONNX Runtime, TFLite 등 AI 추론 엔진을 위한 NumPy-like 텐서 전처리 라이브러리로, PyTorch 호환성을 제공하며 다양한 변환 파이프라인을 지원합니다.
- 2이 라이브러리는 Isolate 기반의 비동기 실행으로 UI 지연을 방지하고, SIMD 가속화를 통해 Float32/Float64 연산 속도를 2-4배 향상시키며, 메모리 효율적인 Zero-copy 뷰 연산을 제공합니다.
- 3사용자는 리사이즈, 정규화, 레이아웃 변경, 활성화 함수 등 광범위한 텐서 연산을 선언적으로 연결하여 재사용 가능한 파이프라인을 구축할 수 있으며, 이는 특히 모바일 AI 애플리케이션에서 고성능 전처리를 가능하게 합니다.
dart_tensor_preprocessing 라이브러리는 Flutter 및 Dart 환경에서 ONNX Runtime, TFLite 등 인공지능 추론 엔진을 위한 NumPy-like tensor 전처리 파이프라인을 제공합니다. 이는 특히 PyTorch/torchvision에서 사용되는 Tensor operation들을 Dart 환경에서 동일하게 재현하여, AI 모델 배포 시 데이터 전처리 과정을 간소화하고 호환성을 확보하는 데 중점을 둡니다.
핵심 방법론 및 구성 요소:
- TensorBuffer:
TensorBuffer는 물리적인 데이터 저장 공간(예:Float32List,Uint8List) 위에shape,stride,offset등의 메타데이터를 맵핑하여 다차원 텐서를 표현하는 핵심 클래스입니다.- Zero-copy Operations: 이 라이브러리의 가장 중요한 특징 중 하나는
transpose(),reshape(),squeeze(),unsqueeze(),sliceFirst(),unbind(),select(),narrow(),toChannelsLast(),toChannelsFirst(),flatten()과 같은 Operation들이 물리적인 데이터 복사 없이 메타데이터(shape, stride, offset)만 변경하여 텐서의 "뷰(view)"를 생성한다는 점입니다. 이는 메모리 사용량을 최소화하고 연산 속도를 극대화합니다.- 예를 들어,
transpose()는 축 순서만 변경하며, 새로운 메모리 할당 없이 텐서의 논리적 구조를 재정의합니다. stride는 각 차원에서 다음 원소로 이동하기 위해 필요한 바이트 수를 나타내며,shape와 함께 텐서의 메모리 레이아웃을 정의합니다.
- 예를 들어,
- Copy Operations: 필요에 따라
contiguous()(메모리를 연속적으로 재배열) 또는clone()(완전한 복사본 생성)과 같은 Operation을 통해 데이터 복사를 수행할 수도 있습니다. - Tensor Creation:
zeros(),ones(),full(),random(),randn(),eye(),linspace(),arange()등 PyTorch와 유사한 다양한 텐서 생성 메서드를 제공합니다.
- DType (Data Type):
- ONNX에서 사용되는 데이터 타입(예:
DType.float32,DType.int64,DType.uint8)을 지원하여, AI 추론 엔진과의 데이터 타입 호환성을 보장합니다.
- ONNX에서 사용되는 데이터 타입(예:
- BufferPool (Memory Management):
BufferPool은Float32List,Uint8List등 원시 버퍼의 재사용을 위한 메모리 풀링 메커니즘을 구현합니다. 이는 잦은 버퍼 할당 및 해제로 인한 가비지 컬렉션(GC) 오버헤드를 줄여 핫 패스(hot path)에서의 성능을 최적화합니다.acquireFloat32()로 버퍼를 얻고, 사용 후release()로 반환하여 재사용 큐에 넣습니다.
- TensorPipeline (Declarative Processing):
- 여러
TensorOp들을 순차적으로 체이닝하여 복잡한 전처리 과정을 선언적으로 정의할 수 있도록 하는 클래스입니다. run()메서드는 동기적으로 파이프라인을 실행하며,runAsync()메서드는 Dart의Isolate기능을 활용하여 비동기적으로 실행합니다. 이는 장시간 소요되는 전처리 작업이 UI 스레드를 블로킹(blocking)하여 사용자 인터페이스의 끊김(UI jank) 현상을 방지합니다.isolateThreshold파라미터를 통해 텐서의 크기가 일정 임계값(기본값 100,000 element)보다 작을 경우Isolate오버헤드를 피하고 동기적으로 실행하도록 최적화할 수 있습니다.
- 여러
- Tensor Operations (
TensorOps):TensorOp은 개별적인 전처리 단계를 나타내는 추상 클래스이며, 다양한 구체적인 Operation들이 구현되어 있습니다.- In-place Operations: 많은
TensorOp들은applyInPlace(tensor)메서드를 지원하여, 새로운 텐서 객체를 생성하지 않고 기존 텐서의 데이터를 직접 수정합니다. 이는 메모리 할당 및 복사 오버헤드를 크게 줄여 성능을 향상시킵니다.ReLUOp,NormalizeOp,BatchNormOp,AddOp,MulOp등이 대표적입니다. - SIMD Acceleration:
Float32x4및Float64x2SIMD(Single Instruction, Multiple Data) 벡터화 연산을 활용하여ClipOp,AbsOp,SqrtOp,NormalizeOp,ReLUOp,ScaleOp,AddOp,SubOp,MulOp,DivOp와 같은 element-wise operation들의 연산 속도를 2~4배까지 가속화합니다 (Float32의 경우 약 6.2 GE/s). - 주요 Operation 분류:
- Resize & Crop:
ResizeOp(bilinear, bicubic, area, lanczos 모드 지원),CenterCropOp,ClipOp,PadOp,SliceOp등 - Normalization:
NormalizeOp(ImageNet, CIFAR-10 프리셋 제공),ScaleOp,BatchNormOp,LayerNormOp,GroupNormOp,InstanceNormOp,RMSNormOp등 (PyTorch 호환 구현) - Layout:
PermuteOp,ToTensorOp(HWC Uint8 -> CHW Float32 변환),ToImageOp - Data Augmentation:
RandomCropOp,GaussianBlurOp - Fused Operations:
ResizeNormalizeFusedOp는Resize와Normalize를 단일 패스에서 결합하여 중간 텐서 생성을 제거하고 효율성을 높입니다. - Activation Functions:
ReLUOp,LeakyReLUOp,GELUOp,SiLUOp/SwishOp,HardsigmoidOp,HardswishOp,MishOp,ELUOp,SigmoidOp,TanhOp,SoftmaxOp등 다양한 활성화 함수를 제공합니다. - Math & Arithmetic:
AbsOp,NegOp,SqrtOp,ExpOp,LogOp,PowOp,AddOp,SubOp,MulOp,DivOp(대부분 SIMD 가속화) - Shape Manipulation:
UnsqueezeOp,SqueezeOp,ReshapeOp,FlattenOp - Utility:
concat(),stack()
- Resize & Crop:
성능:
벤치마크 결과에 따르면, ImageNet Classification 파이프라인 (224x224 input)은 약 3.0ms, Object Detection 파이프라인 (640x640 input)은 약 25ms가 소요됩니다. runAsync() (isolate)의 경우 run() (sync) 대비 Isolate 오버헤드(약 7ms for 224x224, 64ms for 640x640)가 존재하지만, UI 응답성 유지가 중요한 경우 대형 텐서 처리에 유리합니다. Zero-copy operation들은 마이크로초 단위의 실행 시간과 수십만-수백만 Ops/sec의 처리량을 보여주며 매우 효율적입니다.
PyTorch 호환성:
이 라이브러리는 torch.zeros(), tensor.permute(), transforms.Normalize(), F.interpolate(), torch.clamp(), torch.cat(), torch.stack(), F.relu(), torch.nn.BatchNorm2d 등 PyTorch/torchvision의 동등한 Operation들과 동일한 결과를 생성하도록 설계되어 있어, 기존 PyTorch 생태계와의 원활한 연동을 지원합니다.