첫 글에서 보았던 것처럼,
Raspberry Pi는 OpenGL ES 3.1, Vulkan 1.2를 지원한다고 합니다.
OpenGL ES 쪽은 딥러닝에 별로 안 쓰이는 것 같아서, vulkan 쪽을 집중적으로 찾아봤습니다.
Whisper 관련 라이브러리들을 뒤지다가, whisper.cpp라는 것을 찾았습니다.
일반 whisper를 C로 포팅해놓은 거라서 훨씬 빠르다고 하지만?
이걸 그냥 쓰면, 아무리 C여도 끔찍하게 느릴 것이기 때문에 포기 하려는 순간

Vulkan이다VulkanVulkanVulkanVulkanVulkanVulkanVulkanVulkan
Whisper.cpp 패키지에 Vulkan 지원이 있는 것을 보고 헐레벌떡 다운받았습니다.
열심히 다운받아서 빌드해봤는데,
근데 Raspberry Pi의 GPU에는 Fused-Multiply-Add(곱하기, 더하기를 한 번에 수행하는 연산) 기능이 없어서 자꾸 에러가 나더라구요ㅎㅎㅎ???
그래서
1. FMA 연산 안 쓰는 옵션으로 컴파일하렴
-> 그런 옵션 없는데요.
2. 그래? 그럼 컴파일 정보에서 FMA 빼줄게
-> 그러면 정의 안된 항목이 3000개 생겨요.컴파일에러컴파일에러컴파일에러
3. 알겠어..코드 직접 들어가서 고쳐볼게....
-> 해보시던가ㅋㅋ
이거 고쳐보려고 며칠동안 코드에 별 짓을 다 해봤는데
안됨
으아아악
내 능력탓이겠지만....
얘는 보내주고 더 좋은 방법을 찾기로 했습니다
(빡쳐서 지운 뒤라 사진은 없서요ㅎ)

중국 텐센트에서 만든 라이브러리라고 합니다...
여러 YOLO 버전을 만든 Ultralytics에서도 관련 튜토리얼을 제공하고 있는 것으로 봐서는 꽤 유명한 라이브러리인가봐요...
PyTorch나 ONNX 파일(다른 딥러닝 프레임워크보다 빠름)을, NCNN 형식으로 바꿔서 먹여주면, 좀 더 빠르게 돌릴 수 있다고 합니다.
그리고 외부 라이브러리 의존이 없다는 장점이 있습니다.
이 라이브러리도 Vulkan을 지원한다길래 헐레벌떡 깔았습니다.
git clone https://github.com/Tencent/ncnn.git
sudo apt install build-essential git cmake libprotobuf-dev protobuf-compiler libomp-dev libvulkan-dev vulkan-tools libopencv-dev 해서 필요한 패키지 설치하기
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 하니까
진짜 많이 빨라짐

저장해 놓은 것이 없어서 짤은 퍼왔읍니다.(실제로 하면 저거보다 더 잘 나와요)
열 배 넘게 빨라지는 거 보고 눈 돌아감ㅋㅋㅋㅋㅋㅋ
테스트하려면 ncnn/benchmark 안에 있는 .param 파일들을
ncnn/build/benchmark 폴더 안에 넣은 다음
./benchncnn 10 4 0 0 -1 하시면 됩니당
NCNN에서 모델을 돌리려면, pt파일(pytorch)이나 onnx파일을 ncnn으로 변환해줘야 합니다.
그러려면 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 라이브러리로 가져와서 추론시키면 됩니다.
그런데...
whisper 모델을 변환하려니 별별 에러들이 뜨면서 괴롭힘
1. 변환ㄱㄱ
-> input 차원이 이상해요
2. input 차원 맞춰줄게
-> 이거 소리 처리해야해서 다른 방식으로 넣어주세요
3. 알겠어 원하는 방식 맞춰줄게
-> 올바른 소리 입력이 아니에요!!!!!!
4. 2~3 반복.
얘도 별 짓 다 해봤는데 안됐어요.
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ야!!!!!!!!ㅡㅡ
그냥 삽질의 연속이었습니다...왜 다 안되니^^...
고민하면서 여러 가지 찾아보다가,
PyTorch의 Backend를 Vulkan으로 바꾸는 방법이 있다는 것을 알아냈습니다.
그래서 다음글은 PyTorch를 Vulkan Backend로 바꾸는 방법!