단일 CPU 코어 행렬 곱셈 벤치마크
이 리포지토리는 Matrix Multiply (SGEMM) 수동 튜닝 라이브러리 및 코드 생성 스택을 단일 스레드, 단일 CPU 코어에서 벤치마킹하는 것을 목표로 합니다. 초점은 기계 학습(machine learning) 워크로드에 맞춰져 있어 FP32 또는 그 이하의 정밀도와 불규칙한 크기의 행렬을 다룹니다. 목표는 높은 성능의 원자적 커널(atomic kernels)을 노출하여, 이를 활용해 여러 코어에 걸쳐 작동하거나 시스템 전반에 분산되는 고효율의 상위 레벨 구현체를 구축하는 것입니다.
결과 (Results)
Nvidia A100에서의 결과 (cublas 대 SHARK)
Results
Intel Alderlake 12900k에서의 결과 (AVX2)
Results
Intel XEON Skylake에서의 결과 (iMAC PRO, AVX512)
Results
Xeon Cascade Lake에서의 결과 (GCP C2 인스턴스, AVX 512)
Results
Xeon Cascade Lake Codegen TVM, Halide, MLIR에서의 결과 (GCP C2 인스턴스, AVX 512)
Results
AMD Ryzen 5950x에서의 결과 (ZenV3, RESNET50 크기에 대해 AMD의 BLIS 및 OpenBLAS와 비교)
Results
Intel XEON E-2276M Coffee lake에서의 결과 (Thinkpad P53, AVX2)
Results
Apple M1에서의 결과 (NEON - AMX2 없음)
참고: 8GB Mac Mini는 다른 테스트에서 16GB 버전보다 약 25% 느리게 실행됩니다.
Results
설치 (Installation)
리포지토리와 서브모듈을 함께 클론합니다.
git clone --recurse-submodules https://github.com/mmperf/mmperf.git
가상 환경을 생성하고 요구 사항을 설치합니다. Python 3.8이 필요합니다.
cd mmperf
python3 -m venv ./mmperf_env
source mmperf_env/bin/activate
...
코드 빌드 (Building the codes)
CPU에서 지정된 백엔드 구축
matmul을 실행하기 위해 백엔드를 지정하여 프로젝트를 빌드합니다. 아래는 MLIR 백엔드로 mmperf를 빌드하는 명령어입니다.
cmake -GNinja \
-DCMAKE_CXX_COMPILER=clang++-11 \
-DCMAKE_C_COMPILER=clang-11 \
...
사용 가능한 모든 백엔드로 빌드하는 또 다른 예시입니다. MKL, OpenBLAS, Halide가 설치되어 있다고 가정합니다 (설치 세부 정보는 아래 참조).
GPU 백엔드 빌드하기
어떤 GPU 백엔드로 벤치마킹을 하든, 시스템에 NVIDIA CUDA 11이 미리 설치되어 있어야 합니다. CUDA 컴파일러를 활성화하려면 명령줄에서 -DCMAKE_CUDA_COMPILER=nvcc를 설정해야 합니다. 예를 들어, IREE-CUDA를 컴파일하고 cuBLAS 및 TVM-CUDA(TVM Auto-scheduler, 즉 Ansor)와 비교하려면 다음 명령을 실행하십시오:
cmake -GNinja \
-DCMAKE_CXX_COMPILER=clang++-11 \
-DCMAKE_C_COMPILER=clang-11 \
...
참고: -DTVM_LIB_DIR는 TVM 바이너리가 위치한 절대 경로로 설정해야 합니다. TVM 자동 스케줄러를 실행하는 방법은 이 README를 참조하십시오.
독립형 llvm로 빌드하기 (선택 사항)
서브모듈 external/llvm-project의 빌드는 공간과 시간이 많이 소요될 수 있습니다. 이미 자체적인 독립형 llvm을 가지고 있고 이 서브모듈을 가져와 컴파일하고 싶지 않다면, PREBUILT_LLVM_PATH 컴파일 플래그를 사용하여 시스템에 있는 llvm을 지정할 수 있습니다:
cmake -GNinja \
-DCMAKE_CXX_COMPILER=clang++-11 \
-DCMAKE_C_COMPILER=clang-11 \
...
만약 처음부터 llvm을 컴파일하려면, 다음 내용들도 필요할 수 있습니다:
echo "deb http://apt.llvm.org/DISTRO_NAME/ llvm-toolchain-DISTRO_NAME main" >> /etc/apt/sources.list
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -
apt-get update && apt-get upgrade -y
...
실행 및 결과 생성
우리는 지정된 백엔드에 대한 행렬 곱셈(matrix multiplication) 바이너리를 생성하기 위해 AOT 컴파일을 사용하고, 이를 실행하여 벤치마킹 수치를 생성합니다. 성능 수치를 생성하고 비교 플롯을 얻으려면 다음을 실행하십시오:
python3 mmperf.py ./build/matmul/ results
결과(results) 폴더는 mmperf의 최상위 디렉터리에 생성되며, 모든 matmul 크기 및 모든 백엔드에 대한 GLOPS를 포함합니다. 또한, 백엔드의 성능을 비교하는 플롯이 matmul.png에 생성됩니다.
생성된 바이너리는 개별적으로 실행할 수도 있습니다. 특정 행렬 크기(예: 24x64x512)를 특정 백엔드에서 실행하려면 다음 명령어를 사용합니다:
./build/matmul/matmul_<LIBRARY>_24x64x512
프로그램 설정 (Program configuration)
행렬 크기(Matrix sizes): benchmark_sizes 폴더에는 mmperf가 실행하는 행렬 크기를 담은 텍스트 파일들이 있습니다. 행렬 크기 입력 파일을 변경하려면 cmake/common.cmake에서 SIZE_FILE 옵션을 편집할 수 있습니다. 기본값은 benchmark_all_sizes.txt입니다.
정밀도(Precision): 모든 백엔드의 기본 정밀도는 FP32입니다. FP16 벤치마크는 cuBLAS, IREE, 그리고 triton 백엔드에 추가되었습니다. FP16을 활성화하려면 플래그 -DUSE_FP16=ON을 사용하십시오.
triton으로 FP16 실행하기
openai-triton의 성능을 하프 정밀도(half precision)로 테스트하려면, pip install triton을 설치한 후 다음 명령어를 실행해야 합니다:
python mmperf.py ./build/matmul results -triton -dtype f16 -benchmark_path=./benchmark_sizes/bert_large_matmul.txt
Nvidia A100에서 nodai-shark-cuda 예제 실행하기
Nod-ai SHARK 자동 튜너(auto-tuner)를 실행한 후, 설정 파일 샘플을 업로드했습니다. Nvidia A100에서 nodai_shark_cuda의 성능을 테스트하려면, IREE-CUDA를 빌드하고(이전 섹션 참조), 다음 명령어를 실행해야 합니다:
python mmperf.py ./build/matmul/ results -nodai_shark_cuda -nodai_shark_configs=official_results/best_configs_minilm/
참고: 이 설정은 Nvidia A100 GPU에 특히 최적화되어 있으므로, 다른 GPU 아키텍처에서는 잘 작동하지 않을 수 있습니다.
IREE: Intermediate Representation Execution Environment
Nod-ai SHARK
선택적 종속성 설치하기 (Installing optional dependencies): Halide, OpenBLAS, MKL
Halide
git clone https://github.com/halide/Halide.git --recurse-submodules
cd Halide/
sudo apt install libclang-11-dev clang-11 liblld-11-dev
...
OpenBLAS
sudo apt install libopenblas-dev
BLIS
git clone https://github.com/flame/blis
cd blis
./configure --prefix=/home/foo/lokal/ --enable-cblas -c amd64
...
Intel MKL
https://software.intel.com/content/www/us/en/develop/articles/installation-guide-for-intel-oneapi-toolkits.html에서 다운로드 및 설치
이론적 최대 FLOPS
이 벤치마크는 3.1GHz로 작동하는 Intel Xeon CPU에서 실행되었습니다. 이 장치는 L1 캐시 256Kb, L2 캐시 8Mb, L3 캐시 24.8Mb를 갖추고 있습니다. AVX-512 명령어를 지원합니다. 이 장치의 최대 성능은 배정밀도(double precision)의 경우 3.1 x 8 x 2 x 2 = 99.2 GFLOPS, 단정밀도(single precision)의 경우 198.4 GFLOPS입니다.