더 빠른 연산 : Matmul API

Matrix Multiplication API

Matmul API는 RKNN Runtime에서 제공하는 C 기반 API로, NPU에서 수행되는 행렬 연산에 사용됩니다.

RKNN User Guide에서 언급하기로는 , Self-Attention, Feed Forward에서 광범위하게 사용되는 행렬 곱셈 연산의 성능을 향상시키는 것이 Transformer 기반 모델의 성능 향상에 중요하다고 하고 있습니다.

따라서 RKNN 자동 변환으로 커버되지 않는 특정 연산들을 Performance Evaluation으로 모니터링하면서, 치명적으로 시간이 오래 걸리는 연산들은 Matmul API를 사용하여 직접 구현하는 것도 RKNN 모델 성능 향상의 방법이 될 수 있다고 생각합니다.

Matmul API Flow Chart

  1. rknn_matmul_create: rknn_matmul_info 구조체를 생성하여 M, K, N 입력 및 출력 행렬의 데이터 유형, 입력, 및 출력 데이터 배열 등을 설정합니다. 그리고 rknn_matmul_create 인터페이스를 호출하여 컨텍스트를 초기화합니다.

  2. rknn_matmul_set_core_mask: rknn_matmul_set_core_mask를 호출하고 마스크를 설정하여 특정 NPU 코어에서 작업을 수행하도록 지정합니다.

  3. rknn_matmul_set_quant_params: rknn_matmul_set_quant_params를 호출해 해당 행렬의 양자화 매개변수 값을 퐇함하는 rknn_quant_params 구조체를 전달합니다. default는 각 행렬에 대해 scale = 1.0, zero_point = 0 입니다.

  4. rknn_create_mem

  5. set matrix A and matrix B data

  6. rknn_matmul_set_io_mem: rknn_matmul_set_io_mem을 호출해 데이터가 채워진 입력 행렬을 컨텍스트에 기록하고 출력 메모리도 컨텍스트에 기록합니다.

  7. rknn_matmul_run: 입력 및 출력 메모리를 확정한 후 rknn_matmul_run을 호출해 행렬 곱셈을 수행합니다.

Matmul API를 사용하면 동일한 행렬 곱셈이 반복적으로 수행되는 경우 한 번 최적화 된 설정을 재사용하여 전체적인 성능을 향상시킬 수 있습니다.

ADB 모드에서 matmul API 예제 코드 실행하기

Last updated