Raspberry Pi 5에서 GPU로 Whisper/TTS 돌리기 - 2. Whisper.cpp / NCNN 시도(and 삽질)

이름을 입력하세요·2025년 1월 4일

Raspberry Pi

목록 보기
2/4

첫 글에서 보았던 것처럼,
Raspberry Pi는 OpenGL ES 3.1, Vulkan 1.2를 지원한다고 합니다.

OpenGL ES 쪽은 딥러닝에 별로 안 쓰이는 것 같아서, vulkan 쪽을 집중적으로 찾아봤습니다.


Whisper.cpp

https://github.com/ggerganov/whisper.cpp

Whisper 관련 라이브러리들을 뒤지다가, whisper.cpp라는 것을 찾았습니다.

일반 whisper를 C로 포팅해놓은 거라서 훨씬 빠르다고 하지만?
이걸 그냥 쓰면, 아무리 C여도 끔찍하게 느릴 것이기 때문에 포기 하려는 순간

Vulkan이다VulkanVulkanVulkanVulkanVulkanVulkanVulkanVulkan

Whisper.cpp 패키지에 Vulkan 지원이 있는 것을 보고 헐레벌떡 다운받았습니다.



열심히 다운받아서 빌드해봤는데,
근데 Raspberry Pi의 GPU에는 Fused-Multiply-Add(곱하기, 더하기를 한 번에 수행하는 연산) 기능이 없어서 자꾸 에러가 나더라구요ㅎㅎㅎ???

그래서
1. FMA 연산 안 쓰는 옵션으로 컴파일하렴
-> 그런 옵션 없는데요.
2. 그래? 그럼 컴파일 정보에서 FMA 빼줄게
-> 그러면 정의 안된 항목이 3000개 생겨요.컴파일에러컴파일에러컴파일에러
3. 알겠어..코드 직접 들어가서 고쳐볼게....
-> 해보시던가ㅋㅋ

이거 고쳐보려고 며칠동안 코드에 별 짓을 다 해봤는데

안됨
으아아악

내 능력탓이겠지만....
얘는 보내주고 더 좋은 방법을 찾기로 했습니다

(빡쳐서 지운 뒤라 사진은 없서요ㅎ)

NCNN

https://github.com/Tencent/ncnn

중국 텐센트에서 만든 라이브러리라고 합니다...
여러 YOLO 버전을 만든 Ultralytics에서도 관련 튜토리얼을 제공하고 있는 것으로 봐서는 꽤 유명한 라이브러리인가봐요...

PyTorch나 ONNX 파일(다른 딥러닝 프레임워크보다 빠름)을, NCNN 형식으로 바꿔서 먹여주면, 좀 더 빠르게 돌릴 수 있다고 합니다.
그리고 외부 라이브러리 의존이 없다는 장점이 있습니다.

이 라이브러리도 Vulkan을 지원한다길래 헐레벌떡 깔았습니다.

NCNN 설치

1. github에서 NCNN 가져오기

git clone https://github.com/Tencent/ncnn.git

2. Dependencies 설치하기

sudo apt install build-essential git cmake libprotobuf-dev protobuf-compiler libomp-dev libvulkan-dev vulkan-tools libopencv-dev 해서 필요한 패키지 설치하기

3. Build 하기

cd ncnn
mkdir -p build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=ON -DNCNN_BUILD_EXAMPLES=ON ..
make -j$(nproc)

만약에 더 필요한 패키지가 있다고 뜨면, 검색 후 sudo apt install ~~~ 해서 깔아주기!

아래 링크 참고
https://github.com/Tencent/ncnn/wiki/how-to-build#raspberry-pi

공식 문서대로 build 하기 전에, 어떤 웹사이트 보고 이상하게 build 했었는데, GPU가 안 쓰이는 것 같더라구요...?

그러다 공식 문서 찾아서 Vulkan 사용 옵션 켜고 build 하니까
진짜 많이 빨라짐

https://qengineering.eu/ncnn_rpi5.html

저장해 놓은 것이 없어서 짤은 퍼왔읍니다.(실제로 하면 저거보다 더 잘 나와요)
열 배 넘게 빨라지는 거 보고 눈 돌아감ㅋㅋㅋㅋㅋㅋ

테스트하려면 ncnn/benchmark 안에 있는 .param 파일들을
ncnn/build/benchmark 폴더 안에 넣은 다음
./benchncnn 10 4 0 0 -1 하시면 됩니당


NCNN 변환

NCNN에서 모델을 돌리려면, pt파일(pytorch)이나 onnx파일을 ncnn으로 변환해줘야 합니다.

그러려면 PNNX 라이브러리를 사용하면 된다고 합니다.

https://github.com/pnnx/pnnx

사실 그냥 pip install pnnx 해도 설치돼요ㅋㅋ

import torch
import torchvision.models as models
import pnnx

model = models.resnet18(pretrained=True)

x = torch.rand(1, 3, 224, 224)

opt_model = pnnx.export(model, "resnet18.pt", x)

# use tuple for model with multiple inputs
# opt_model = pnnx.export(model, "resnet18.pt", (x, y, z))

설치한 후, 위 코드처럼 실행하면 ncnn파일이 나온다고 합니다.

이걸 NCNN 라이브러리로 가져와서 추론시키면 됩니다.


그런데...
whisper 모델을 변환하려니 별별 에러들이 뜨면서 괴롭힘

1. 변환ㄱㄱ
-> input 차원이 이상해요
2. input 차원 맞춰줄게
-> 이거 소리 처리해야해서 다른 방식으로 넣어주세요
3. 알겠어 원하는 방식 맞춰줄게
-> 올바른 소리 입력이 아니에요!!!!!!
4. 2~3 반복.


얘도 별 짓 다 해봤는데 안됐어요.
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ야!!!!!!!!ㅡㅡ


그냥 삽질의 연속이었습니다...왜 다 안되니^^...

고민하면서 여러 가지 찾아보다가,
PyTorch의 Backend를 Vulkan으로 바꾸는 방법이 있다는 것을 알아냈습니다.

그래서 다음글은 PyTorch를 Vulkan Backend로 바꾸는 방법!

profile
한 줄 소개를 입력해주세요

0개의 댓글