그래픽 처리 장치 (GPU)를 사용하여 머신러닝 (ML) 모델 실행 모델의 성능과 사용자 경험을 크게 향상할 수 있습니다. ML 지원 애플리케이션을 관리할 수 있습니다 LiteRT는 GPU와 애플리케이션, 다른 특수 프로세서를 통해 대리인입니다. LiteRT ML로 GPU 사용 설정 애플리케이션에는 다음과 같은 이점이 있습니다.
- 속도 - GPU는 대규모 병렬 처리의 높은 처리량을 위해 빌드됩니다. 워크로드도 사용할 수 있습니다 이러한 설계는 신경망이 작동하는 심층신경망에 수많은 연산자로 이루어져 있으며, 각각은 입력 텐서에서 작동하는 동시에 처리될 수 있으므로 일반적으로 지연 시간이 단축됩니다. 포함 최적의 시나리오에 따라 GPU에서 모델을 실행하면 실시간 애플리케이션을 빌드할 수 있게 되었습니다.
- 전력 효율성 - GPU는 매우 효율적인 방식으로 ML 계산을 수행합니다. 최적화된 방식으로, 일반적으로 더 적은 전력을 소비하고 CPU에서 실행되는 동일한 작업보다 발열이 더 높기 때문입니다.
이 문서에서는 LiteRT의 GPU 지원에 대한 개요와 고급 용도를 위한 고급 사용 방법을 알아봅니다 이 제품에 대한 자세한 내용은 특정 플랫폼에서 GPU 지원을 구현하는 방법은 다음 가이드를 참조하세요.
GPU ML 작업 지원
TensorFlow ML 작업(작업)의 대상에는 몇 가지 제한사항이 있습니다. LiteRT GPU 대리자로 가속화됩니다. 위임은 16비트 및 32비트 부동 정밀도의 다음 연산:
ADD
AVERAGE_POOL_2D
CONCATENATION
CONV_2D
DEPTHWISE_CONV_2D v1-2
EXP
FULLY_CONNECTED
LOGICAL_AND
LOGISTIC
LSTM v2 (Basic LSTM only)
MAX_POOL_2D
MAXIMUM
MINIMUM
MUL
PAD
PRELU
RELU
RELU6
RESHAPE
RESIZE_BILINEAR v1-3
SOFTMAX
STRIDED_SLICE
SUB
TRANSPOSE_CONV
기본적으로 모든 작업은 버전 1에서만 지원됩니다. 양자화 사용 설정 지원을 선택하면 적절한 버전이 사용 설정됩니다(예: ADD 버전 2
GPU 지원 문제 해결
일부 작업을 GPU 대리자가 지원하지 않는 경우 프레임워크는 GPU에서 그래프의 일부만 실행하고 나머지 부분은 CPU에서 실행합니다. 기한 높은 비용의 CPU/GPU 동기화에 이르기까지, 이와 같은 분할 실행 모드는 전체 네트워크가 단일 컴퓨터에서 실행될 때보다 속도가 느려지는 경우가 많습니다. CPU 단독으로 사용할 수 있습니다. 이 경우 애플리케이션에서 다음과 같은 경고를 생성합니다.
WARNING: op code #42 cannot be handled by this delegate.
이 유형은 실제 실패에 관한 콜백이 아니므로 콜백이 없습니다. 런타임 실패를 표시합니다 GPU 대리자를 사용하여 모델 실행을 테스트할 때 이러한 경고에 주의해야 합니다 이러한 경고가 너무 많으면 모델이 GPU 가속에 사용하기에 적합하지 않음을 나타냅니다. 모델 리팩터링이 필요할 수 있습니다
예시 모델
다음 예시 모델은 LiteRT는 참조 및 테스트용으로 제공됩니다.
- MobileNet v1 (224x224) 이미지
분류
<ph type="x-smartling-placeholder">
- </ph>
- 모바일 및 임베디드를 위해 설계된 이미지 분류 모델 살펴보겠습니다 (모델)
- DeepLab 세분화
(257x257)
<ph type="x-smartling-placeholder">
- </ph>
- 개와 같은 시맨틱 라벨을 할당하는 이미지 분할 모델 입력 이미지의 모든 픽셀에 적용할 수 있습니다. (모델)
- MobileNet SSD 객체
감지
<ph type="x-smartling-placeholder">
- </ph>
- 여러 객체를 감지하는 이미지 분류 모델: 경계 상자입니다. (모델)
- 포즈용 PoseNet
추정
<ph type="x-smartling-placeholder">
- </ph>
- 이미지나 고양이에 있는 사람의 포즈를 추정하는 있습니다. (모델)
GPU 최적화
다음 기법을 사용하면 모델을 실행할 때 성능을 높일 수 있습니다. LiteRT GPU 대리자를 사용하여 GPU 하드웨어에서:
작업의 형태 변경 - CPU에서 빠른 일부 작업은 모바일 장치의 GPU에 높은 비용이 들 수 있습니다. 형태 변경 작업은 특히
BATCH_TO_SPACE
,SPACE_TO_BATCH
,SPACE_TO_DEPTH
등 데이터 레이크의 형태 변경 사용 사례를 데이터 탐색에만 적용되었을 수 있다고 생각해야 합니다 모델을 학습시키는 데 사용할 수 있습니다 이러한 키워드를 삭제하면 성능을 개선할 수 있습니다이미지 데이터 채널 - GPU에서 텐서 데이터는 4채널로 분할됩니다. 따라서 형태가
[B,H,W,5]
인 텐서에 대한 계산은[B,H,W,8]
형태의 텐서에서 동일하지만[B,H,W,4]
입니다. 사용 중인 카메라 하드웨어가 RGBA는 4채널 입력을 3채널 RGB에서 4채널 RGBX로의 메모리 사본입니다.모바일에 최적화된 모델 - 최상의 성능을 위해서는 다음을 고려해야 합니다. 모바일에 최적화된 네트워크 아키텍처로 분류기를 재학습시켜야 합니다. 온디바이스 추론을 최적화하면 지연 시간을 크게 줄이고 활용하여 전력 소비를 줄일 수 있습니다.
고급 GPU 지원
GPU 처리와 함께 추가적인 고급 기술을 사용하여 양자화, 직렬화 등 모델 성능 향상을 지원합니다. 다음 섹션에서는 이러한 기법을 자세히 설명합니다.
양자화 모델 사용
이 섹션에서는 GPU 대리자가 8비트 양자화 모델을 가속화하는 방법을 설명합니다. 여기에는 다음이 포함됩니다.
성능을 최적화하려면 부동 소수점 입력과 출력 텐서를 생성합니다.
작동 방식
GPU 백엔드는 부동 소수점 실행만 지원하므로 양자화된 원래 모델의 '부동 소수점 뷰'를 제공하여 모델 학습에 사용할 수 있습니다. 개략적으로 설명하면 다음과 같은 단계가 포함됩니다.
상수 텐서 (예: 가중치/편향)는 사용할 수 있습니다 이 작업은 LiteRT입니다.
GPU 프로그램에 대한 입력 및 출력(8비트 양자화된 경우)은 양자화되기 때문입니다. 이 작업 LiteRT의 최적화된 커널을 사용하여 CPU에서 수행됩니다.
양자화 시뮬레이터는 연산 사이에 삽입되어 양자화를 모방합니다. 확인할 수 있습니다 이 접근 방식은 운영팀이 활성화를 예상하는 모델에 필요합니다. 양자화 중에 학습한 범위를 따르기 위함입니다.
GPU 대리자로 이 기능을 사용 설정하는 방법에 대한 자세한 내용은 있습니다.
직렬화를 통해 초기화 시간 단축
GPU 대리자 기능을 사용하면 사전 컴파일된 커널 코드에서 로드하고 모델 데이터를 직렬화하여 이전 실행에서 디스크에 저장합니다. 이 접근 방식은 재컴파일하며 시작 시간을 최대 90% 단축할 수 있습니다. 이러한 개선사항은 시간 절약을 위해 디스크 공간을 교환하여 달성할 수 있습니다 이 기능을 사용 설정할 수 있습니다. 를 사용할 수 있습니다.
C++
TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default(); options.experimental_flags |= TFLITE_GPU_EXPERIMENTAL_FLAGS_ENABLE_SERIALIZATION; options.serialization_dir = kTmpDir; options.model_token = kModelToken; auto* delegate = TfLiteGpuDelegateV2Create(options); if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
자바
GpuDelegate delegate = new GpuDelegate( new GpuDelegate.Options().setSerializationParams( /* serializationDir= */ serializationDir, /* modelToken= */ modelToken)); Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
직렬화 기능을 사용할 때 코드가 구현 규칙:
- 직렬화 데이터를 다른 사용자가 액세스할 수 없는 디렉터리에 저장
있습니다. Android 기기의 경우
getCodeCacheDir()
드림 현재 애플리케이션의 비공개 위치를 가리킵니다. - 모델 토큰은 특정 모델의 기기별로 고유해야 합니다. 다음을 수행할 수 있습니다.
를 사용하여 모델 데이터에서 디지털 지문을 생성하여 모델 토큰을 계산합니다.
이러한 라이브러리를
farmhash::Fingerprint64