From dc8cc2dd6fcba4629af7ec751ca42ab13f7d6e4e Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Wed, 26 Jun 2024 20:11:38 +0300 Subject: [PATCH] whisper : disable CUDA mel + fix FFMPEG --- examples/CMakeLists.txt | 35 +++++++++++++++++++++++---- examples/common.cpp | 6 ++--- scripts/build-info.sh | 8 +++---- src/CMakeLists.txt | 53 +++++++++++++++++++++-------------------- src/whisper-mel-cuda.cu | 3 +-- src/whisper.cpp | 4 +++- 6 files changed, 68 insertions(+), 41 deletions(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 24678e1..ab1e5aa 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -11,7 +11,7 @@ if (WHISPER_SDL2) string(STRIP "${SDL2_LIBRARIES}" SDL2_LIBRARIES) message(STATUS "SDL2_INCLUDE_DIRS = ${SDL2_INCLUDE_DIRS}") - message(STATUS "SDL2_LIBRARIES = ${SDL2_LIBRARIES}") + message(STATUS "SDL2_LIBRARIES = ${SDL2_LIBRARIES}") endif() if (WHISPER_CLBLAST) @@ -22,10 +22,35 @@ endif() set(TARGET common) +unset(COMMON_EXTRA_LIBS) + if (WHISPER_FFMPEG) + # As of cmake 3.27, there is no official cmake support for FindFFmpeg. + # Consequnelty we added a FindFFmpeg.cmake script the cmake subfolder: + # whisper.cpp does not need the full ffmpeg libs, just AVFORMAT AVCODEC AVUTIL SWRESAMPLE + # libswresample performs highly optimized audio resampling, rematrixing and sample format conversion operations + # libavcodec provides a generic encoding/decoding framework and contains multiple decoders and encoders for audio, video and subtitle streams, and several bitstream filters. + # libavformat provides a generic framework for multiplexing and demultiplexing (muxing and demuxing) audio, video and subtitle streams. + find_package(FFmpeg REQUIRED) + + if (NOT ${FFMPEG_FOUND}) + message(FATAL_ERROR "Cannot find ffmpeg libs/headers") + endif() + + message(STATUS "Found ffmpeg libs: ${FFMPEG_LIBRARIES}") + message(STATUS "Found ffmpeg headers in: ${FFMPEG_INCLUDE_DIRS}") + message(STATUS "ffmpeg definitions: ${FFMPEG_DEFINITIONS}") + message(STATUS "Found avformat ${AVFORMAT_VERSION}") + + include_directories(${FFMPEG_INCLUDE_DIRS}) + add_compile_definitions(WHISPER_FFMPEG) + + list(APPEND COMMON_EXTRA_LIBS ${FFMPEG_LIBRARIES}) + set(COMMON_SOURCES_FFMPEG ffmpeg-transcode.cpp) endif() + add_library(${TARGET} STATIC common.h common.cpp @@ -38,7 +63,7 @@ add_library(${TARGET} STATIC include(DefaultTargetOptions) -target_link_libraries(${TARGET} PRIVATE whisper) +target_link_libraries(${TARGET} PRIVATE whisper ${COMMON_EXTRA_LIBS}) set_target_properties(${TARGET} PROPERTIES POSITION_INDEPENDENT_CODE ON) set_target_properties(${TARGET} PROPERTIES FOLDER "libs") @@ -55,8 +80,8 @@ if (WHISPER_SDL2) include(DefaultTargetOptions) - target_include_directories(${TARGET} PUBLIC ${SDL2_INCLUDE_DIRS}) - target_link_libraries(${TARGET} PRIVATE ${SDL2_LIBRARIES}) + target_include_directories(${TARGET} PUBLIC ${SDL2_INCLUDE_DIRS}) + target_link_libraries (${TARGET} PRIVATE ${SDL2_LIBRARIES}) set_target_properties(${TARGET} PROPERTIES POSITION_INDEPENDENT_CODE ON) set_target_properties(${TARGET} PROPERTIES FOLDER "libs") @@ -108,7 +133,7 @@ if (WHISPER_SDL2) set_target_properties(talk-llama PROPERTIES FOLDER "examples") add_subdirectory(lsp) set_target_properties(lsp PROPERTIES FOLDER "examples") - if (LLAMA_SYCL) + if (GGML_SYCL) add_subdirectory(sycl) set_target_properties(sycl PROPERTIES FOLDER "examples") endif() diff --git a/examples/common.cpp b/examples/common.cpp index 25a0272..2e3a454 100644 --- a/examples/common.cpp +++ b/examples/common.cpp @@ -30,7 +30,7 @@ extern bool ffmpeg_decode_audio(const std::string & ifname, std::vector #endif // Function to check if the next argument exists -std::string get_next_arg(int& i, int argc, char** argv, const std::string& flag, gpt_params& params) { +static std::string get_next_arg(int& i, int argc, char** argv, const std::string& flag, gpt_params& params) { if (i + 1 < argc && argv[i + 1][0] != '-') { return argv[++i]; } else { @@ -346,7 +346,7 @@ std::vector gpt_tokenize(const gpt_vocab & vocab, const std::stri return tokens; } -std::vector parse_tokens_from_string(const std::string& input, char delimiter) { +static std::vector parse_tokens_from_string(const std::string& input, char delimiter) { std::vector output; std::stringstream ss(input); std::string token; @@ -358,7 +358,7 @@ std::vector parse_tokens_from_string(const std::string& input, ch return output; } -std::map> extract_tests_from_file(const std::string & fpath_test){ +static std::map> extract_tests_from_file(const std::string & fpath_test){ if (fpath_test.empty()){ fprintf(stderr, "%s : No test file found.\n", __func__); return std::map>(); diff --git a/scripts/build-info.sh b/scripts/build-info.sh index fa9e7ba..f4b7957 100755 --- a/scripts/build-info.sh +++ b/scripts/build-info.sh @@ -24,7 +24,7 @@ if out=$($CC -dumpmachine); then build_target=$out fi -echo "int LLAMA_BUILD_NUMBER = ${build_number};" -echo "char const *LLAMA_COMMIT = \"${build_commit}\";" -echo "char const *LLAMA_COMPILER = \"${build_compiler}\";" -echo "char const *LLAMA_BUILD_TARGET = \"${build_target}\";" +echo "int WHISPER_BUILD_NUMBER = ${build_number};" +echo "char const *WHISPER_COMMIT = \"${build_commit}\";" +echo "char const *WHISPER_COMPILER = \"${build_compiler}\";" +echo "char const *WHISPER_BUILD_TARGET = \"${build_target}\";" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4e4b9f8..84c5d29 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -77,27 +77,27 @@ if (WHISPER_OPENVINO) set_target_properties(${TARGET} PROPERTIES FOLDER "libs") endif() -if (GGML_CUDA) - cmake_minimum_required(VERSION 3.18) # for CMAKE_CUDA_ARCHITECTURES - - find_package(CUDAToolkit) - if (CUDAToolkit_FOUND) - message(STATUS "CUDA found") - - if (NOT DEFINED CMAKE_CUDA_ARCHITECTURES) - # 52 == lowest CUDA 12 standard - # 60 == f16 CUDA intrinsics - # 61 == integer CUDA intrinsics - # 70 == compute capability at which unrolling a loop in mul_mat_q kernels is faster - set(CMAKE_CUDA_ARCHITECTURES "52;61;70") # lowest CUDA 12 standard + lowest for integer intrinsics - endif() - message(STATUS "Using CUDA architectures: ${CMAKE_CUDA_ARCHITECTURES}") - - enable_language(CUDA) - else() - message(WARNING "CUDA not found") - endif() -endif() +#if (GGML_CUDA) +# cmake_minimum_required(VERSION 3.18) # for CMAKE_CUDA_ARCHITECTURES +# +# find_package(CUDAToolkit) +# if (CUDAToolkit_FOUND) +# message(STATUS "CUDA found") +# +# if (NOT DEFINED CMAKE_CUDA_ARCHITECTURES) +# # 52 == lowest CUDA 12 standard +# # 60 == f16 CUDA intrinsics +# # 61 == integer CUDA intrinsics +# # 70 == compute capability at which unrolling a loop in mul_mat_q kernels is faster +# set(CMAKE_CUDA_ARCHITECTURES "52;61;70") # lowest CUDA 12 standard + lowest for integer intrinsics +# endif() +# message(STATUS "Using CUDA architectures: ${CMAKE_CUDA_ARCHITECTURES}") +# +# enable_language(CUDA) +# else() +# message(WARNING "CUDA not found") +# endif() +#endif() # whisper @@ -107,11 +107,12 @@ add_library(whisper whisper-mel.hpp ) -if (GGML_CUDA) - target_sources(whisper PRIVATE whisper-mel-cuda.cu) - - target_link_libraries(whisper PRIVATE CUDA::cufft) -endif() +# TODO: disabled because it relies on ggml internals that are no longer accessible (ggml-backend-impl.h, ggml-cuda/common.cuh, ..) +#if (GGML_CUDA) +# target_sources(whisper PRIVATE whisper-mel-cuda.cu) +# +# target_link_libraries(whisper PRIVATE CUDA::cufft) +#endif() # Set the version numbers set_target_properties(whisper PROPERTIES diff --git a/src/whisper-mel-cuda.cu b/src/whisper-mel-cuda.cu index 40d9f99..85ea23e 100644 --- a/src/whisper-mel-cuda.cu +++ b/src/whisper-mel-cuda.cu @@ -2,8 +2,7 @@ #include "whisper-mel-cuda.hpp" #include "whisper.h" -#include -#include +#include #include #include diff --git a/src/whisper.cpp b/src/whisper.cpp index c9d83b8..dc06ee2 100644 --- a/src/whisper.cpp +++ b/src/whisper.cpp @@ -3215,7 +3215,9 @@ struct mel_calc_cpu : public whisper_mel_calc { } static whisper_mel_calc * whisper_mel_calc_create(ggml_backend_t backend, const whisper_filters & filters) { -#if defined(GGML_USE_CUDA) && !defined(GGML_USE_HIPBLAS) +// TODO: disabled because it relies on ggml internals that are no longer accessible (ggml-backend-impl.h, ggml-cuda/common.cuh, ..) +//#if defined(GGML_USE_CUDA) && !defined(GGML_USE_HIPBLAS) +#if 0 if (ggml_backend_is_cuda(backend)) { auto ret = whisper_mel_calc_create_cuda(backend, filters); if (ret) {