mirror of
https://github.com/mudler/LocalAI.git
synced 2026-09-20 21:28:16 -04:00
tests-qwen3-tts-cpp has been failing on master since 2026-07-31. The suite
loads every component fine and then stops: TTS() never returns from the
native call, so a job that takes ~5 minutes runs into the 20 minute Go test
timeout instead.
goroutine 74 [syscall, 19 minutes]:
github.com/ebitengine/purego.RegisterFunc.func4
qwen3-tts-cpp.(*Qwen3TtsCpp).TTS goqwen3ttscpp.go:154
qwen3-tts-cpp.init.func2.4 e2e_test.go:90
Not a flake: reproduced on master and again on an explicit re-run.
Bisected across this cycle's eight qwentts.cpp bumps by their own check:
10832, 10850, 10902, 10964, 11006, 11039 and 11127 all pass in ~5 minutes;
11241 (abab6b3) fails at 1h58m. That PR was merged with this check already
red, which is how the hang reached master.
35ebe537..abab6b3 is three upstream commits, and the only functional one is
26dd8adb, "predictor: unroll the frame into one cgraph and sample in standard
ops", which is consistent with a generation loop that never reaches its stop
condition.
Hold the pin at the last known-good commit. The bump entry is commented out
rather than left in place, because it tracks upstream master and would put
the hang straight back on the next nightly run. Both spots carry a pointer to
the other so the hold is discoverable, and restoring it is uncommenting four
lines once upstream is fixed.
Assisted-by: Claude Code:claude-opus-5 [Read] [Edit] [Bash]
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
Co-authored-by: Ettore Di Giacinto <mudler@localai.io>
151 lines
5.4 KiB
Makefile
151 lines
5.4 KiB
Makefile
CMAKE_ARGS?=
|
|
BUILD_TYPE?=
|
|
NATIVE?=false
|
|
|
|
GOCMD?=go
|
|
GO_TAGS?=
|
|
JOBS?=$(shell nproc --ignore=1)
|
|
|
|
# qwentts.cpp version
|
|
#
|
|
# Held at 35ebe537 rather than tracking latest: abab6b3 hangs in synthesis.
|
|
# TTS() never returns from the native call, so tests-qwen3-tts-cpp goes from
|
|
# ~5 minutes to the 20 minute Go test timeout. Reproduced on master on
|
|
# 2026-08-01 and again on re-run, and the bump PR (#11241) was merged with
|
|
# this same check already red.
|
|
#
|
|
# The regression is in 35ebe537..abab6b3, three upstream commits whose only
|
|
# functional change is 26dd8adb, "predictor: unroll the frame into one cgraph
|
|
# and sample in standard ops". Restore the bump once that is fixed upstream.
|
|
QWEN3TTS_REPO?=https://github.com/ServeurpersoCom/qwentts.cpp
|
|
QWEN3TTS_CPP_VERSION?=35ebe5376b82a0a59d008586d55bbe623d449011
|
|
SO_TARGET?=libgoqwen3ttscpp.so
|
|
|
|
CMAKE_ARGS+=-DBUILD_SHARED_LIBS=OFF
|
|
|
|
ifeq ($(NATIVE),false)
|
|
CMAKE_ARGS+=-DGGML_NATIVE=OFF
|
|
endif
|
|
|
|
ifeq ($(BUILD_TYPE),cublas)
|
|
CMAKE_ARGS+=-DGGML_CUDA=ON
|
|
else ifeq ($(BUILD_TYPE),openblas)
|
|
CMAKE_ARGS+=-DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS
|
|
else ifeq ($(BUILD_TYPE),clblas)
|
|
CMAKE_ARGS+=-DGGML_CLBLAST=ON -DCLBlast_DIR=/some/path
|
|
else ifeq ($(BUILD_TYPE),hipblas)
|
|
# This ggml only understands GGML_HIP (GGML_HIPBLAS was removed upstream),
|
|
# so passing GGML_HIPBLAS silently produced a CPU-only build (see #10666).
|
|
ROCM_HOME ?= /opt/rocm
|
|
ROCM_PATH ?= /opt/rocm
|
|
export CXX=$(ROCM_HOME)/llvm/bin/clang++
|
|
export CC=$(ROCM_HOME)/llvm/bin/clang
|
|
AMDGPU_TARGETS ?= gfx908,gfx90a,gfx942,gfx950,gfx1030,gfx1100,gfx1101,gfx1102,gfx1151,gfx1200,gfx1201
|
|
CMAKE_ARGS+=-DGGML_HIP=ON -DAMDGPU_TARGETS=$(AMDGPU_TARGETS)
|
|
else ifeq ($(BUILD_TYPE),vulkan)
|
|
CMAKE_ARGS+=-DGGML_VULKAN=ON
|
|
else ifeq ($(OS),Darwin)
|
|
ifneq ($(BUILD_TYPE),metal)
|
|
CMAKE_ARGS+=-DGGML_METAL=OFF
|
|
else
|
|
CMAKE_ARGS+=-DGGML_METAL=ON
|
|
CMAKE_ARGS+=-DGGML_METAL_EMBED_LIBRARY=ON
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(BUILD_TYPE),sycl_f16)
|
|
CMAKE_ARGS+=-DGGML_SYCL=ON \
|
|
-DCMAKE_C_COMPILER=icx \
|
|
-DCMAKE_CXX_COMPILER=icpx \
|
|
-DGGML_SYCL_F16=ON
|
|
endif
|
|
|
|
ifeq ($(BUILD_TYPE),sycl_f32)
|
|
CMAKE_ARGS+=-DGGML_SYCL=ON \
|
|
-DCMAKE_C_COMPILER=icx \
|
|
-DCMAKE_CXX_COMPILER=icpx
|
|
endif
|
|
|
|
sources/qwentts.cpp:
|
|
mkdir -p sources/qwentts.cpp
|
|
cd sources/qwentts.cpp && \
|
|
git init && \
|
|
git remote add origin $(QWEN3TTS_REPO) && \
|
|
git fetch origin && \
|
|
git checkout $(QWEN3TTS_CPP_VERSION) && \
|
|
git submodule update --init --recursive --depth 1 --single-branch
|
|
|
|
# Detect OS
|
|
UNAME_S := $(shell uname -s)
|
|
|
|
# Only build CPU variants on Linux
|
|
ifeq ($(UNAME_S),Linux)
|
|
VARIANT_TARGETS = libgoqwen3ttscpp-avx.so libgoqwen3ttscpp-avx2.so libgoqwen3ttscpp-avx512.so libgoqwen3ttscpp-fallback.so
|
|
else
|
|
# On non-Linux (e.g., Darwin), build only fallback variant (as a dylib)
|
|
VARIANT_TARGETS = libgoqwen3ttscpp-fallback.dylib
|
|
endif
|
|
|
|
qwen3-tts-cpp: main.go goqwen3ttscpp.go $(VARIANT_TARGETS)
|
|
CGO_ENABLED=0 $(GOCMD) build -tags "$(GO_TAGS)" -o qwen3-tts-cpp ./
|
|
|
|
package: qwen3-tts-cpp
|
|
bash package.sh
|
|
|
|
build: package
|
|
|
|
clean: purge
|
|
rm -rf libgoqwen3ttscpp*.so libgoqwen3ttscpp*.dylib package sources/qwentts.cpp qwen3-tts-cpp
|
|
|
|
purge:
|
|
rm -rf build*
|
|
|
|
# Variants must build sequentially
|
|
.NOTPARALLEL:
|
|
|
|
# Build all variants (Linux only)
|
|
ifeq ($(UNAME_S),Linux)
|
|
libgoqwen3ttscpp-avx.so: sources/qwentts.cpp
|
|
$(info ${GREEN}I qwen3-tts-cpp build info:avx${RESET})
|
|
SO_TARGET=libgoqwen3ttscpp-avx.so CMAKE_ARGS="$(CMAKE_ARGS) -DGGML_AVX=on -DGGML_AVX2=off -DGGML_AVX512=off -DGGML_FMA=off -DGGML_F16C=off -DGGML_BMI2=off" $(MAKE) libgoqwen3ttscpp-custom
|
|
rm -rf build-libgoqwen3ttscpp-avx.so
|
|
|
|
libgoqwen3ttscpp-avx2.so: sources/qwentts.cpp
|
|
$(info ${GREEN}I qwen3-tts-cpp build info:avx2${RESET})
|
|
SO_TARGET=libgoqwen3ttscpp-avx2.so CMAKE_ARGS="$(CMAKE_ARGS) -DGGML_AVX=on -DGGML_AVX2=on -DGGML_AVX512=off -DGGML_FMA=on -DGGML_F16C=on -DGGML_BMI2=on" $(MAKE) libgoqwen3ttscpp-custom
|
|
rm -rf build-libgoqwen3ttscpp-avx2.so
|
|
|
|
libgoqwen3ttscpp-avx512.so: sources/qwentts.cpp
|
|
$(info ${GREEN}I qwen3-tts-cpp build info:avx512${RESET})
|
|
SO_TARGET=libgoqwen3ttscpp-avx512.so CMAKE_ARGS="$(CMAKE_ARGS) -DGGML_AVX=on -DGGML_AVX2=on -DGGML_AVX512=on -DGGML_FMA=on -DGGML_F16C=on -DGGML_BMI2=on" $(MAKE) libgoqwen3ttscpp-custom
|
|
rm -rf build-libgoqwen3ttscpp-avx512.so
|
|
endif
|
|
|
|
# Build fallback variant (all platforms)
|
|
libgoqwen3ttscpp-fallback.so: sources/qwentts.cpp
|
|
$(info ${GREEN}I qwen3-tts-cpp build info:fallback${RESET})
|
|
SO_TARGET=libgoqwen3ttscpp-fallback.so CMAKE_ARGS="$(CMAKE_ARGS) -DGGML_AVX=off -DGGML_AVX2=off -DGGML_AVX512=off -DGGML_FMA=off -DGGML_F16C=off -DGGML_BMI2=off" $(MAKE) libgoqwen3ttscpp-custom
|
|
rm -rf build-libgoqwen3ttscpp-fallback.so
|
|
|
|
# Build fallback variant as a dylib (Darwin)
|
|
libgoqwen3ttscpp-fallback.dylib: sources/qwentts.cpp
|
|
$(info ${GREEN}I qwen3-tts-cpp build info:fallback (dylib)${RESET})
|
|
SO_TARGET=libgoqwen3ttscpp-fallback.dylib CMAKE_ARGS="$(CMAKE_ARGS) -DGGML_AVX=off -DGGML_AVX2=off -DGGML_AVX512=off -DGGML_FMA=off -DGGML_F16C=off -DGGML_BMI2=off" $(MAKE) libgoqwen3ttscpp-custom
|
|
rm -rf build-libgoqwen3ttscpp-fallback.dylib
|
|
|
|
libgoqwen3ttscpp-custom: CMakeLists.txt cpp/goqwen3ttscpp.cpp cpp/goqwen3ttscpp.h
|
|
mkdir -p build-$(SO_TARGET) && \
|
|
cd build-$(SO_TARGET) && \
|
|
cmake .. $(CMAKE_ARGS) && \
|
|
cmake --build . --config Release -j$(JOBS) --target goqwen3ttscpp && \
|
|
cd .. && \
|
|
(mv build-$(SO_TARGET)/libgoqwen3ttscpp.so ./$(SO_TARGET) 2>/dev/null || \
|
|
mv build-$(SO_TARGET)/libgoqwen3ttscpp.dylib ./$(SO_TARGET) 2>/dev/null)
|
|
|
|
test: qwen3-tts-cpp
|
|
@echo "Running qwen3-tts-cpp tests..."
|
|
bash test.sh
|
|
@echo "qwen3-tts-cpp tests completed."
|
|
|
|
all: qwen3-tts-cpp package
|