diff --git a/backend/go/stablediffusion-ggml/.gitignore b/backend/go/stablediffusion-ggml/.gitignore index 2dfc6b056191..045cc4512439 100644 --- a/backend/go/stablediffusion-ggml/.gitignore +++ b/backend/go/stablediffusion-ggml/.gitignore @@ -2,5 +2,5 @@ package/ sources/ .cache/ build/ -libgosd.so +*.so stablediffusion-ggml diff --git a/backend/go/stablediffusion-ggml/Makefile b/backend/go/stablediffusion-ggml/Makefile index da1ec28cd924..e103d6d8de0a 100644 --- a/backend/go/stablediffusion-ggml/Makefile +++ b/backend/go/stablediffusion-ggml/Makefile @@ -66,15 +66,18 @@ sources/stablediffusion-ggml.cpp: git checkout $(STABLEDIFFUSION_GGML_VERSION) && \ git submodule update --init --recursive --depth 1 --single-branch -libgosd.so: sources/stablediffusion-ggml.cpp CMakeLists.txt gosd.cpp gosd.h - mkdir -p build && \ - cd build && \ - cmake .. $(CMAKE_ARGS) && \ - cmake --build . --config Release -j$(JOBS) && \ - cd .. && \ - mv build/libgosd.so ./ +# Detect OS +UNAME_S := $(shell uname -s) + +# Only build CPU variants on Linux +ifeq ($(UNAME_S),Linux) + VARIANT_TARGETS = libgosd-avx.so libgosd-avx2.so libgosd-avx512.so libgosd-fallback.so +else + # On non-Linux (e.g., Darwin), build only fallback variant + VARIANT_TARGETS = libgosd-fallback.so +endif -stablediffusion-ggml: main.go gosd.go libgosd.so +stablediffusion-ggml: main.go gosd.go $(VARIANT_TARGETS) CGO_ENABLED=0 $(GOCMD) build -tags "$(GO_TAGS)" -o stablediffusion-ggml ./ package: stablediffusion-ggml @@ -82,5 +85,46 @@ package: stablediffusion-ggml build: package -clean: - rm -rf libgosd.so build stablediffusion-ggml package sources +clean: purge + rm -rf libgosd*.so stablediffusion-ggml package sources + +purge: + rm -rf build* + +# Build all variants (Linux only) +ifeq ($(UNAME_S),Linux) +libgosd-avx.so: sources/stablediffusion-ggml.cpp + $(MAKE) purge + $(info ${GREEN}I stablediffusion-ggml build info:avx${RESET}) + SO_TARGET=libgosd-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) libgosd-custom + rm -rfv build* + +libgosd-avx2.so: sources/stablediffusion-ggml.cpp + $(MAKE) purge + $(info ${GREEN}I stablediffusion-ggml build info:avx2${RESET}) + SO_TARGET=libgosd-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) libgosd-custom + rm -rfv build* + +libgosd-avx512.so: sources/stablediffusion-ggml.cpp + $(MAKE) purge + $(info ${GREEN}I stablediffusion-ggml build info:avx512${RESET}) + SO_TARGET=libgosd-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) libgosd-custom + rm -rfv build* +endif + +# Build fallback variant (all platforms) +libgosd-fallback.so: sources/stablediffusion-ggml.cpp + $(MAKE) purge + $(info ${GREEN}I stablediffusion-ggml build info:fallback${RESET}) + SO_TARGET=libgosd-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) libgosd-custom + rm -rfv build* + +libgosd-custom: CMakeLists.txt gosd.cpp gosd.h + mkdir -p build-$(SO_TARGET) && \ + cd build-$(SO_TARGET) && \ + cmake .. $(CMAKE_ARGS) && \ + cmake --build . --config Release -j$(JOBS) && \ + cd .. && \ + mv build-$(SO_TARGET)/libgosd.so ./$(SO_TARGET) + +all: stablediffusion-ggml package \ No newline at end of file diff --git a/backend/go/stablediffusion-ggml/main.go b/backend/go/stablediffusion-ggml/main.go index 4f053fbbef94..2181f576439f 100644 --- a/backend/go/stablediffusion-ggml/main.go +++ b/backend/go/stablediffusion-ggml/main.go @@ -2,6 +2,7 @@ package main import ( "flag" + "os" "github.com/ebitengine/purego" grpc "github.com/mudler/LocalAI/pkg/grpc" @@ -17,7 +18,13 @@ type LibFuncs struct { } func main() { - gosd, err := purego.Dlopen("./libgosd.so", purego.RTLD_NOW|purego.RTLD_GLOBAL) + // Get library name from environment variable, default to fallback + libName := os.Getenv("SD_LIBRARY") + if libName == "" { + libName = "./libgosd-fallback.so" + } + + gosd, err := purego.Dlopen(libName, purego.RTLD_NOW|purego.RTLD_GLOBAL) if err != nil { panic(err) } diff --git a/backend/go/stablediffusion-ggml/package.sh b/backend/go/stablediffusion-ggml/package.sh index 34b158c41faa..8006e081ff8b 100755 --- a/backend/go/stablediffusion-ggml/package.sh +++ b/backend/go/stablediffusion-ggml/package.sh @@ -11,7 +11,7 @@ REPO_ROOT="${CURDIR}/../../.." # Create lib directory mkdir -p $CURDIR/package/lib -cp -avf $CURDIR/libgosd.so $CURDIR/package/ +cp -avf $CURDIR/libgosd-*.so $CURDIR/package/ cp -avf $CURDIR/stablediffusion-ggml $CURDIR/package/ cp -fv $CURDIR/run.sh $CURDIR/package/ diff --git a/backend/go/stablediffusion-ggml/run.sh b/backend/go/stablediffusion-ggml/run.sh index ab8c576a0843..71342e43b91c 100755 --- a/backend/go/stablediffusion-ggml/run.sh +++ b/backend/go/stablediffusion-ggml/run.sh @@ -1,14 +1,52 @@ #!/bin/bash set -ex +# Get the absolute current dir where the script is located CURDIR=$(dirname "$(realpath $0)") +cd / + +echo "CPU info:" +if [ "$(uname)" != "Darwin" ]; then + grep -e "model\sname" /proc/cpuinfo | head -1 + grep -e "flags" /proc/cpuinfo | head -1 +fi + +LIBRARY="$CURDIR/libgosd-fallback.so" + +if [ "$(uname)" != "Darwin" ]; then + if grep -q -e "\savx\s" /proc/cpuinfo ; then + echo "CPU: AVX found OK" + if [ -e $CURDIR/libgosd-avx.so ]; then + LIBRARY="$CURDIR/libgosd-avx.so" + fi + fi + + if grep -q -e "\savx2\s" /proc/cpuinfo ; then + echo "CPU: AVX2 found OK" + if [ -e $CURDIR/libgosd-avx2.so ]; then + LIBRARY="$CURDIR/libgosd-avx2.so" + fi + fi + + # Check avx 512 + if grep -q -e "\savx512f\s" /proc/cpuinfo ; then + echo "CPU: AVX512F found OK" + if [ -e $CURDIR/libgosd-avx512.so ]; then + LIBRARY="$CURDIR/libgosd-avx512.so" + fi + fi +fi + export LD_LIBRARY_PATH=$CURDIR/lib:$LD_LIBRARY_PATH +export SD_LIBRARY=$LIBRARY # If there is a lib/ld.so, use it if [ -f $CURDIR/lib/ld.so ]; then echo "Using lib/ld.so" + echo "Using library: $LIBRARY" exec $CURDIR/lib/ld.so $CURDIR/stablediffusion-ggml "$@" fi -exec $CURDIR/stablediffusion-ggml "$@" \ No newline at end of file +echo "Using library: $LIBRARY" +exec $CURDIR/stablediffusion-ggml "$@" diff --git a/backend/go/whisper/Makefile b/backend/go/whisper/Makefile index 076f9372f8cb..aaf9d909ff85 100644 --- a/backend/go/whisper/Makefile +++ b/backend/go/whisper/Makefile @@ -88,19 +88,19 @@ ifeq ($(UNAME_S),Linux) libgowhisper-avx.so: sources/whisper.cpp $(MAKE) purge $(info ${GREEN}I whisper build info:avx${RESET}) - SO_TARGET=libgowhisper-avx.so CMAKE_ARGS="$(CMAKE_ARGS) -DGGML_AVX=on -DGGML_AVX2=off -DGGML_AVX512=off -DGGML_FMA=off -DGGML_F16C=off" $(MAKE) libgowhisper-custom + SO_TARGET=libgowhisper-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) libgowhisper-custom rm -rfv build* libgowhisper-avx2.so: sources/whisper.cpp $(MAKE) purge $(info ${GREEN}I whisper build info:avx2${RESET}) - SO_TARGET=libgowhisper-avx2.so CMAKE_ARGS="$(CMAKE_ARGS) -DGGML_AVX=on -DGGML_AVX2=on -DGGML_AVX512=off -DGGML_FMA=on -DGGML_F16C=on" $(MAKE) libgowhisper-custom + SO_TARGET=libgowhisper-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) libgowhisper-custom rm -rfv build* libgowhisper-avx512.so: sources/whisper.cpp $(MAKE) purge $(info ${GREEN}I whisper build info:avx512${RESET}) - SO_TARGET=libgowhisper-avx512.so CMAKE_ARGS="$(CMAKE_ARGS) -DGGML_AVX=on -DGGML_AVX2=off -DGGML_AVX512=on -DGGML_FMA=on -DGGML_F16C=on" $(MAKE) libgowhisper-custom + SO_TARGET=libgowhisper-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) libgowhisper-custom rm -rfv build* endif @@ -108,7 +108,7 @@ endif libgowhisper-fallback.so: sources/whisper.cpp $(MAKE) purge $(info ${GREEN}I whisper build info:fallback${RESET}) - SO_TARGET=libgowhisper-fallback.so CMAKE_ARGS="$(CMAKE_ARGS) -DGGML_AVX=off -DGGML_AVX2=off -DGGML_AVX512=off -DGGML_FMA=off -DGGML_F16C=off" $(MAKE) libgowhisper-custom + SO_TARGET=libgowhisper-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) libgowhisper-custom rm -rfv build* libgowhisper-custom: CMakeLists.txt gowhisper.cpp gowhisper.h