From 0591e57dfd79c5b8501cfdbd28aa449f83c98176 Mon Sep 17 00:00:00 2001 From: TheK0tYaRa Date: Wed, 8 Apr 2026 23:02:56 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=D1=85=D1=83=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gear/check | 23 +++ .gear/gen-manpage | 60 ++++++ .gear/llama-cpp-turboquant.spec | 354 ++++++++++++++++++++++++++++++++ .gear/llama.service | 14 ++ .gear/npm-build | 5 + .gear/rules | 5 + .gear/tags/list | 1 + .gear/upstream-signing-key.asc | 41 ++++ 8 files changed, 503 insertions(+) create mode 100755 .gear/check create mode 100755 .gear/gen-manpage create mode 100644 .gear/llama-cpp-turboquant.spec create mode 100644 .gear/llama.service create mode 100755 .gear/npm-build create mode 100644 .gear/rules create mode 100644 .gear/tags/list create mode 100644 .gear/upstream-signing-key.asc diff --git a/.gear/check b/.gear/check new file mode 100755 index 000000000..87ba98d88 --- /dev/null +++ b/.gear/check @@ -0,0 +1,23 @@ +#!/bin/bash -efu + +RET=0 + +f=tools/server/public/bundle.js +email=$(git log -1 --pretty=%ae -- "$f") +if [[ $email != *@altlinux.org ]]; then + echo >&2 "$f is not updated by ALT. Perhaps, run .gear/generate" + (set -x; git l -1 -- "$f") + RET=1 +fi + +ts_f=$(git log -1 --date=unix --pretty='%cd' "$f") +s=tools/server/webui +ts_s=$(git log -1 --date=unix --pretty='%cd' "$s") +if (( ts_f < ts_s )); then + echo >&2 "$f is not updated after $s update." + (set -x; git l -1 -- "$f") + (set -x; git l -1 -- "$s") + RET=1 +fi + +exit $RET diff --git a/.gear/gen-manpage b/.gear/gen-manpage new file mode 100755 index 000000000..0507a4c6b --- /dev/null +++ b/.gear/gen-manpage @@ -0,0 +1,60 @@ +#!/bin/bash -e + +# +# Wrapper around llama-cli to massage the output to be more palatable to +# help2man for generating a manual page. +# +# Invoke as: +# gen-manpage build/bin/llama-cli --name='LLM inference in C/C++' +# +# This script is in the public domain and may be distributed or modified +# without restriction. +# + +: ${HELP2MAN:=help2man} + +tmp=$(mktemp -d) +trap "rm -rf $tmp" EXIT HUP INT + +cmd="${1?}" +shift + +# --version goes to stderr? +$cmd --version 2>$tmp/version + +# --help to stdout, some diagnostics to stderr +$cmd --help >$tmp/help 2>/dev/null + +# Ensure we got something from both. +test -s $tmp/version && test -s $tmp/help + +cmd="${cmd##*/}" + +# Strip out just version. +sed -i -n "s/^version: /$cmd /p" $tmp/version + +# Convert ---thing--- to subheadings, and clean up args. +sed -i \ + -e 's/^----- \([A-Za-z].*\) -----/\1:/' \ + -e 's/^[a-z].*:$/\u&/' \ + -e '/^[A-Za-z].*:$/s/ [a-z]/\U&/g' \ + -e 's/^-\(-\?[a-zA-Z0-9][^ ]*,\)\( *\)\(-.*\) /-\1 \3\2 /' \ + -e 's/^-\(.*\) / -\1 /' \ + -e '/ *[^ ].*: [^ ]/s/:/: /' \ + $tmp/help + +cat <$tmp/${cmd##*/} +#!/bin/bash + +for arg; do + case "\$arg" in + --version) cat $tmp/version;; + --help) cat $tmp/help;; + esac +done +EOT + +chmod a+x "$tmp/$cmd" +${HELP2MAN} --no-info "$@" "$tmp/$cmd" + +exit $? diff --git a/.gear/llama-cpp-turboquant.spec b/.gear/llama-cpp-turboquant.spec new file mode 100644 index 000000000..b57b20838 --- /dev/null +++ b/.gear/llama-cpp-turboquant.spec @@ -0,0 +1,354 @@ +# SPDX-License-Identifier: GPL-2.0-only +%define _unpackaged_files_terminate_build 1 +%define _stripped_files_terminate_build 1 +%set_verify_elf_method strict + +%ifarch x86_64 +%def_with cuda +%else +%def_without cuda +%endif +%def_with vulkan + +Name: llama-cpp-turboquant +Version: 8659 +Release: alt1 +Epoch: 1 +Summary: LLM inference in C/C++ +License: MIT +Group: Sciences/Computer science +# https://ggml.ai/ +Url: https://github.com/ggerganov/llama.cpp +ExcludeArch: %ix86 +Requires: %name-cpu = %EVR +%if_with cuda +Requires: %name-cuda = %EVR +%filter_from_requires /(libcudart\.so\.12)/d +%filter_from_requires /debug64(libcuda\.so\.1)/d +%endif +%if_with vulkan +Requires: %name-vulkan = %EVR +%endif + +Source: %name-%version.tar +Patch: %name-%version.patch + +BuildRequires(pre): rpm-macros-cmake +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: help2man +BuildRequires: libcurl-devel +BuildRequires: libgomp-devel +BuildRequires: libssl-devel +BuildRequires: libstdc++-devel-static +%if_with cuda +BuildRequires: gcc12-c++ +BuildRequires: nvidia-cuda-devel-static +%endif +%if_with vulkan +BuildRequires: glslc +BuildRequires: libvulkan-devel +%endif +%{?!_without_check:%{?!_disable_check: +BuildRequires: ctest +BuildRequires: python3-module-jinja2 +BuildRequires: tinyllamas-gguf +}} + +%description +Plain C/C++ implementation (of inference of many LLM models) without +dependencies. AVX, AVX2, AVX512, and AMX support for x86 architectures. +Mixed F16/F32 precision. 1.5-bit, 2-bit, 3-bit, 4-bit, 5-bit, 6-bit, and +8-bit integer quantization for faster inference and reduced memory use. +Supports CPU, GPU, and hybrid CPU+GPU inference. + +Supported models: + + LLaMA models, Mistral 7B, Mixtral MoE, Falcon, Chinese LLaMA / + Alpaca and Chinese LLaMA-2 / Alpaca-2, Vigogne (French), Koala, + Baichuan 1 & 2 + derivations, Aquila 1 & 2, Starcoder models, Refact, + Persimmon 8B, MPT, Bloom, Yi models, StableLM models, Deepseek models, + Qwen models, PLaMo-13B, Phi models, GPT-2, Orion 14B, InternLM2, + CodeShell, Gemma, Mamba, Grok-1, Xverse, Command-R models, SEA-LION, + GritLM-7B + GritLM-8x7B, OLMo, GPT-NeoX + Pythia, Snowflake-Arctic + MoE, Smaug, Poro 34B, Bitnet b1.58 models, Flan T5, Open Elm models, + ChatGLM3-6b + ChatGLM4-9b + GLMEdge-1.5b + GLMEdge-4b, SmolLM, + EXAONE-3.0-7.8B-Instruct, FalconMamba Models, Jais, Bielik-11B-v2.3, + RWKV-6, QRWKV-6, GigaChat-20B-A3B, Trillion-7B-preview, Ling models, + LFM2 models, Hunyuan models, BailingMoeV2 (Ring/Ling 2.0) models + +Multimodal models: + + LLaVA 1.5 models, BakLLaVA, Obsidian, ShareGPT4V, MobileVLM 1.7B/3B + models, Yi-VL, Mini CPM, Moondream, Bunny, GLM-EDGE, Qwen2-VL, + LFM2-VL + +NOTE: + MODELS ARE NOT PROVIDED. You'll need to download them from the original + sites (or Hugging Face Hub). + +Overall this is all raw and EXPERIMENTAL, no warranty, no support. + +%package -n libllama-turboquant +Summary: Shared libraries for llama-cpp-turboquant +Group: System/Libraries + +%description -n libllama-turboquant +%summary. + +%package -n libllama-turboquant-devel +Summary: Development files for llama.cpp +Group: Development/C +Requires: libllama = %EVR +Conflicts: libwhisper-cpp-devel + +%description -n libllama-turboquant-devel +%summary. + +%package cpu +Summary: %name tools including backend for CPU +Group: Sciences/Computer science +Requires: libllama-turboquant = %EVR +Conflicts: %name-convert < %EVR +AutoReqProv: nopython3 +%add_findreq_skiplist %_datadir/%name/examples/* + +%description cpu +%summary. + +%package cuda +Summary: %name backend for NVIDIA GPU +Group: Sciences/Computer science +Requires: libnvidia-ptxjitcompiler +Requires: %name-cpu = %EVR + +%description cuda +%summary. + +%package vulkan +Summary: %name backend for GPU +Group: Sciences/Computer science +Requires: %name-cpu = %EVR + +%description vulkan +%summary. + +%prep +%setup +%autopatch -p1 +commit=$(awk '$2=="b%version"{print$1}' .gear/tags/list) +cat <<-EOF >> cmake/build-info.cmake + set(BUILD_NUMBER %version) + set(GGML_BUILD_NUMBER %version) + set(BUILD_COMMIT "${commit::8} [%release]") +EOF +sed -i '/POSITION_INDEPENDENT_CODE/s/PROPERTIES/& SOVERSION 0.0.%version/' src/CMakeLists.txt +sed -i 's/POSITION_INDEPENDENT_CODE/SOVERSION 0.0.%version &/' tools/mtmd/CMakeLists.txt +# We do not have Internet access (issues/13371). +perl -00 -ni -e 'print unless /_URL/' tests/test-arg-parser.cpp +# This test requires GPU. +sed /test-thread-safety/d -i tests/CMakeLists.txt + +%build +%define optflags_debug -g1 +# Unless -DCMAKE_SKIP_BUILD_RPATH=yes CMake fails to strip build time RPATH +# from (installed) binaries. +export NVCC_PREPEND_FLAGS=-ccbin=g++-12 +%cmake \ + -DCMAKE_SKIP_BUILD_RPATH=yes \ + -DLLAMA_BUILD_TESTS=ON \ + -DGGML_BACKEND_DL=ON \ + -DGGML_BACKEND_DIR=%_libexecdir/llama-tq \ + -DGGML_CPU=ON \ + -DGGML_RPC=ON \ +%ifarch x86_64 + -DGGML_CPU_ALL_VARIANTS=ON \ +%endif +%if_with cuda + -DGGML_CUDA=ON \ + -DCMAKE_CUDA_ARCHITECTURES='52-virtual;80-virtual' \ +%endif +%if_with vulkan + -DGGML_VULKAN=ON \ +%endif + %nil +grep -E 'LLAMA|GGML' %_cmake__builddir/CMakeCache.txt | sort | tee build-options.txt +%cmake_build +find -name '*.py' | xargs sed -i '1s|#!/usr/bin/env python3|#!%__python3|' +LD_LIBRARY_PATH=%_cmake__builddir/bin %_cmake__builddir/bin/llama-tq-server --completion-bash > llama-tq.bash +LD_LIBRARY_PATH=%_cmake__builddir/bin .gear/gen-manpage %_cmake__builddir/bin/llama-tq-server > llama-tq-server.1 + +%install +%cmake_install +# Python requirements files. +install -Dpm644 requirements.txt -t %buildroot%_datadir/%name +cp -a requirements -t %buildroot%_datadir/%name +# Additional data. +cp -rp grammars -t %buildroot%_datadir/%name +# Not all examples. +install -Dp examples/*.sh -t %buildroot%_datadir/%name/examples +install -Dp examples/*.py -t %buildroot%_datadir/%name/examples +# We need to run the tests, not install them. +rm %buildroot%_bindir/test-* +rm %buildroot%_bindir/export-graph-ops +# Completions. +install -Dpm644 llama.bash %buildroot%_datadir/bash-completion/completions/llama-server +printf '%%s\n' llama-tq-cli llama-tq-simple llama-tq-run llama-tq-mtmd-cli | + xargs -ti ln -s llama-tq-server %buildroot%_datadir/bash-completion/completions/{} +mv %buildroot%_bindir/rpc-server %buildroot%_bindir/llama-tq-rpc-server +install -Dpm644 llama-tq-server.1 -t %buildroot%_man1dir + +%check +( ! cuobjdump --list-elf %buildroot%_libexecdir/llama-tq/libggml-cuda.so | grep -F -v -e .cubin ) +( ! cuobjdump --list-ptx %buildroot%_libexecdir/llama-tq/libggml-cuda.so | grep -F -v -e .sm_80.ptx -e .sm_52.ptx ) +# Local path are more useful for debugging becasue they are not stripped by default. +export LD_LIBRARY_PATH=$PWD/%_cmake__builddir/bin PATH+=:$PWD/%_cmake__builddir/bin +llama-tq-server --version +llama-tq-server --version |& grep -Ex 'version: %version \(\S+ \[%release\]\)' +# test-eval-callback wants network. +%ctest -E 'test-download-model|test-eval-callback|test-state-restore-fragmented|test-llama-archs' +# It broke so it can suck my dick +#llama-completion -m /usr/share/tinyllamas/stories260K.gguf -p "Hello" -s 42 -n 500 2>/dev/null +#llama-completion -m /usr/share/tinyllamas/stories260K.gguf -p "Once upon a time" -s 55 -n 33 2>/dev/null | +# grep 'Once upon a time, there was a boy named Tom. Tom had a big box of colors.' +# We do not provide convert tools. +mv %buildroot%_bindir/convert*.py -t %buildroot%_datadir/%name/examples + +%files + +%files -n libllama-turboquant +%_libdir/libllama-tq.so.0.0.%version +%_libdir/libggml-tq.so.0 +%_libdir/libggml-tq.so.0.* +%_libdir/libggml-tq-base.so.0 +%_libdir/libggml-tq-base.so.0.* +%_libdir/libmtmd-tq.so.0.0.%version + +%files -n libllama-turboquant-devel +%_libdir/libllama-tq.so +%_libdir/libggml-tq.so +%_libdir/libggml-tq-base.so +%_libdir/libmtmd-tq.so +%_includedir/llama-tq*.h +%_includedir/gguf-tq.h +%_includedir/ggml-tq*.h +%_includedir/mtmd-tq*.h +%_cmakedir/ggml-tq +%_cmakedir/llama-tq +%_pkgconfigdir/llama-tq.pc + +%files cpu +%define _customdocdir %_docdir/%name +%doc LICENSE README.md docs build-options.txt +%_bindir/llama-tq-* +%dir %_datadir/%name +%dir %_datadir/%name/examples +%_datadir/%name/examples/*.sh +%_datadir/%name/examples/*.py +%_datadir/%name/requirements* +%_datadir/%name/grammars +%dir %_libexecdir/llama-tq +%_libexecdir/llama-tq/libggml-cpu*.so +%_libexecdir/llama-tq/libggml-rpc.so +%_datadir/bash-completion/completions/llama-tq-* +%_man1dir/llama-tq-server.1* + +%if_with cuda +%files cuda +%dir %_libexecdir/llama +%_libexecdir/llama-tq/libggml-cuda.so +%endif + +%if_with vulkan +%files vulkan +%dir %_libexecdir/llama-tq +%_libexecdir/llama-tq/libggml-vulkan.so +%endif + +%changelog +* Tue Apr 07 2026 Arseniy Romenskiy 1:8659-alt1 +- Update to b8659 (2026-04-07). + +* Mon Apr 06 2026 Vitaly Chikunov 1:8681-alt1 +- Update to b8681 (2026-04-06). + +* Sun Mar 22 2026 Vitaly Chikunov 1:8470-alt1 +- Update to b8470 (2026-03-22). + +* Tue Mar 03 2026 Vitaly Chikunov 1:8192-alt1 +- Update to b8192 (2026-03-03). + +* Fri Feb 13 2026 Vitaly Chikunov 1:8018-alt1 +- Update to b8018 (2026-02-12). + +* Sat Jan 24 2026 Vitaly Chikunov 1:7819-alt1 +- Update to b7819 (2026-01-23). +- Responses API support (partial). + +* Sun Dec 14 2025 Vitaly Chikunov 1:7388-alt1 +- Update to b7388 (2025-12-13). +- llama-cli: New CLI experience (with the old moved to llama-completion). +- llama-server: Live model switching. +- Messages API support. + +* Fri Nov 21 2025 Vitaly Chikunov 1:7127-alt1 +- Update to b7127 (2025-11-21). +- spec: Remove llama.cpp-convert package. +- model: detect GigaChat3-10-A1.8B as deepseek lite. + +* Tue Oct 28 2025 Vitaly Chikunov 1:6869-alt1 +- Update to b6869 (2025-10-28). + +* Sat Sep 06 2025 Vitaly Chikunov 1:6397-alt1 +- Update to b6397 (2025-09-06). +- Python-based model conversion scripts are sub-packaged. Note that they are + not supported and are provided as-is. + +* Sat Aug 09 2025 Vitaly Chikunov 1:6121-alt1 +- Update to b6121 (2025-08-08). + +* Wed Jun 25 2025 Vitaly Chikunov 1:5753-alt1 +- Update to b5753 (2025-06-24). +- Install an experimental rpc backend and server. The rpc code is a + proof-of-concept, fragile, and insecure. + +* Sat May 10 2025 Vitaly Chikunov 1:5332-alt1 +- Update to b5332 (2025-05-09), with vision support in llama-server. +- Enable Vulkan backend (for GPU) in llama.cpp-vulkan package. + +* Mon Mar 10 2025 Vitaly Chikunov 1:4855-alt1 +- Update to b4855 (2025-03-07). +- Enable CUDA backend (for NVIDIA GPU) in llama.cpp-cuda package. +- Disable BLAS backend (issues/12282). +- Install bash-completions. + +* Tue Jul 23 2024 Vitaly Chikunov 1:3441-alt1 +- Update to b3441 (2024-07-23). +- spec: Package libllama and libllama-devel (ALT#50962). +- spec: Use upstream install procedure; as a consequence, some binary names are + changed. + +* Mon Jun 03 2024 Vitaly Chikunov 1:3072-alt1.20240603 +- Update to b3072 (2024-06-03). +- The version scheme now matches the upstream build number more closely, + instead of using the commit date. +- Build with libcurl and OpenBLAS support. + +* Tue May 28 2024 Vitaly Chikunov 20240527-alt1 +- Update to b3012 (2024-05-27). + +* Mon Feb 26 2024 Vitaly Chikunov 20240225-alt1 +- Update to b2259 (2024-02-25). + +* Fri Oct 20 2023 Vitaly Chikunov 20231019-alt1 +- Update to b1400 (2023-10-19). +- Install experimental converters (convert- prefixed tools). + +* Sun Jul 30 2023 Vitaly Chikunov 20230728-alt1 +- Update to master-8a88e58 (2023-07-28). + +* Sun May 14 2023 Vitaly Chikunov 20230513-alt1 +- Build master-bda4d7c (2023-05-13). + +* Wed Apr 19 2023 Vitaly Chikunov 20230419-alt1 +- Build master-6667401 (2023-04-19). diff --git a/.gear/llama.service b/.gear/llama.service new file mode 100644 index 000000000..e44ae27db --- /dev/null +++ b/.gear/llama.service @@ -0,0 +1,14 @@ +[Unit] +Description=Llama.cpp server, CPU only (no GPU support in this build). +After=syslog.target network.target local-fs.target remote-fs.target nss-lookup.target + +[Service] +Type=simple +DynamicUser=true +EnvironmentFile=-/etc/sysconfig/llama +ExecStart=llama-server $LLAMA_ARGS +ExecReload=/bin/kill -HUP $MAINPID +Restart=never + +[Install] +WantedBy=default.target diff --git a/.gear/npm-build b/.gear/npm-build new file mode 100755 index 000000000..e8b77492e --- /dev/null +++ b/.gear/npm-build @@ -0,0 +1,5 @@ +workdir=tools/server/webui +target=tools/server/public +aikido-npm ci --ignore-scripts +aikido-npm audit --audit-level=critical fix +npm run build diff --git a/.gear/rules b/.gear/rules new file mode 100644 index 000000000..a2451cf43 --- /dev/null +++ b/.gear/rules @@ -0,0 +1,5 @@ +# The diff is only to detect commit hash of release tag `gear-update-tag -ac` +# for version output. +tar: b@version@:. +diff: b@version@:. . name=@name@-@version@.patch +spec: .gear/llama-cpp-turboquant.spec diff --git a/.gear/tags/list b/.gear/tags/list new file mode 100644 index 000000000..796b897e9 --- /dev/null +++ b/.gear/tags/list @@ -0,0 +1 @@ +e43970099269b5b6da36b8977ad47697602e4e54 b8659 diff --git a/.gear/upstream-signing-key.asc b/.gear/upstream-signing-key.asc new file mode 100644 index 000000000..de5957ae4 --- /dev/null +++ b/.gear/upstream-signing-key.asc @@ -0,0 +1,41 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=QeVw +-----END PGP PUBLIC KEY BLOCK-----