#!/bin/bash
## KEIN VORPROMPT!!! BITTE SELBST EINTRAGEN!!!
## FALCON KI 40K Kontext Inhaltsgroesse trotz 7B BF16
## SEHR LANGSAM!!! Aber auch sehr Gut! 1.5 Token Pro Sekunde auf 100 Watt mit der A770LE
## Mehr Energie bringt nur wenig mehr Leistung. Beschraenken sSie den Takt der GPU!!! Um die 1300 Mhz sollten ausreichen
#| XAIGPUARC |✅| 29.10.26 SYCL ONLY ARC A770LE (16GiB Vram minimum) Vendor Lokal Version
#Werkzeug zur Optimierung und Bereitstellung von neuronalen Netzen, insbesondere für GPU-basierte Berechnungen
#XAIGPUARC kombiniert verschiedene Technologien und Bibliotheken, um die Effizienz und Leistung von Modellen zu steigern
#Es verwendet OpenCL und spezifische Compiler wie icx und icpx für die Kompilierung von C++ Code
#Das Hauptziel ist es, neuronale Netze auf Intel Xe/ARC-Grafikkarten sowie anderen GPU-Architekturen effizient zu bereitstellen und zu optimieren
if [ -n "$FISH_VERSION" ]; then
echo "❌FEHLER: Bitte starte das Script mit 'bash XAIGPUARC.sh' oder installiere 'bass'"
exit 1
fi
set -euo pipefail
IFS=$'\n\t'
PRECISION="FP16"
DEVICE="ARC"
LLAMA_CPP_DIR="llama.cpp"
BUILD_DIR="${BUILD_DIR:-XAIGPUARC}"
BUILD_DIR="${BUILD_DIR%/}"
#|XAIGPUARC|
GGML_SYCL_CPP="${LLAMA_CPP_DIR}/ggml/src/ggml-sycl/ggml-sycl.cpp}"
CMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE:-Release}"
NPROC="${NPROC:-$(nproc)}"
LOG_FILE="${BUILD_DIR}/XAIGPUARC.log}"
LLAMA_CLI_PATH="bin/llama-cli"
LS_SYCL_DEVICE_PATH="bin/llama-ls-sycl-device"
ADD_SUBDIR_LINE="${LLAMA_CPP_DIR}/ggml/src/ggml-sycl/ggml-sycl.cpp"
#|ONEAPIFUNKTIONEN
export LIBVA_DRIVER_NAME=iHD
export TCM_ROOT="${TCM_ROOT:-"/opt/intel/oneapi/tcm/latest/"}"
export SYCL_CACHE_PERSISTENT=0
export OCL_ICD_FILENAMES=""
export ZES_ENABLE_SYSMAN=0
export OverrideDefaultFP64Settings=0
export CCACHE_DIR="$HOME/.ccache"
export COMPILER_VERSION="2025.3"
export SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1
export SYCL_PI_LEVEL_ZERO_BATCH_SIZE=256
export FP_FLAG=FP16
export ONEAPI_DEVICE_SELECTOR=level_zero:0
export SYCL_DEVICE_FILTER=level_zero:gpu
export ZE_ENABLE_PCI_ID_DEVICE_ORDER=1
#|HILFSFUNKTIONEN
log() { printf "🔷 %s\n" "$*"; }
success() { printf "✅ %s\n" "$*"; }
error() { printf "❌ %s\n\n" "$*"; }
warn() { printf "⚠️ %s\n" "$*"; }
#|INTERNETPRUEFUNG
check_internet() {
log "🔷PRUEFE INTERNETZ VERBINDUNG..."
if timeout 5 bash -c "</dev/tcp/8.8.8.8/53" 2>/dev/null;
then
success "✅INTERNETZ VERBINDUNG VORHANDEN"
return 0
else
warn "⚠️KEINE INTERNETZ VERBINDUNG! BEI ERSTINSTALLATION ONLINE ABHAENGIGKEITEN! ANSCHLUSS PRUEFEN"
return 1
fi
}
#|UMGEBUNG|RUECKFALL|MECHANISMEN|VORBEREITEN
prepare_environment() { log "🔷HOLE ONEAPI KOPFZEILEN XAIGPUARC"
local SETVARS_PATH="/opt/intel/oneapi/setvars.sh"
if [ ! -f "$SETVARS_PATH" ]; then
error "❌ONE API KOEPFZEILEN NICHT GEFUNDEN $SETVARS_PATH INSTALLIERE ONEAPI BIBLIOTHEKEN"
exit 1
fi
log "🔷SETVARS SETZEN + SUCHEN SS+S"
source "$SETVARS_PATH" --force 2>/dev/null
local ONEAPI_ROOT_FALLBACK="/opt/intel/oneapi"
local COMPILER_VERSION_FALLBACK="${COMPILER_VERSION:-2025.3}"
DPCPP_ROOT="${DPCPP_ROOT:-${ONEAPI_ROOT_FALLBACK}/compiler/${COMPILER_VERSION_FALLBACK}}"
MKL_ROOT="${MKL_ROOT:-${ONEAPI_ROOT_FALLBACK}/mkl/${COMPILER_VERSION_FALLBACK}}"
ONEAPI_ROOT="${ONEAPI_ROOT:-${ONEAPI_ROOT_FALLBACK}}"
export CC=icx
export CXX=icpx
export FC=ifx
export DPCPP_ROOT
export MKL_ROOT
export ONEAPI_ROOT
export CPATH="${CPATH:-}:${MKL_ROOT}/include"
local LIB_DIR="/opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_sycl.so"
export LD_LIBRARY_PATH="./${BUILD_DIR}/bin:${LIB_DIR}:${LD_LIBRARY_PATH:-}"
if ! command -v icx "&>/dev/null" ! command -v icpx "&>/dev/null"; then
error "❌ICX IPCX ONE API XAIGPUARC UNTERMODUL INSTALLATION FEHLGESCHLAGEN"
exit 1
fi
log "🔷VERBINDUNG ONEAPI GELADEN DPCPP${DPCPP_ROOT}MKL${MKL_ROOT}"
}
#1|PROJEKT|VORBAU
setup_project() {
if [[ "${1:-}" == "--clean" ]]; then
warn "⚠️ REINIGUNGSMODUS LOESCHE ALTE BAUSTEINE"
rm -rf "${LLAMA_CPP_DIR}"
rm -rf "${BUILD_DIR}"
success "✅ REINIGUNG ABGESCHLOSSEN"
fi
log "🔷BEREITE XAIGPUARC VORBAU BITTE WARTEN"
if [ ! -d "${LLAMA_CPP_DIR}" ]; then
log "🔷ZIEHE BAUSTEINE AUS INTERNETZ"
git clone https://github.com/ggerganov/llama.cpp "${LLAMA_CPP_DIR}"
if [ ! -d "${LLAMA_CPP_DIR}" ]; then
error "❌ZIEHEN DER BAUSTEINE FEHLGESCHLAGEN ABBRUCH"
exit 1
fi
fi
if pushd "${LLAMA_CPP_DIR}" > /dev/null; then
log "🔷AKTUALISIERE BAUSTEINE FUER UNTERMODULE"
git reset --hard HEAD
git pull
git submodule update --init --recursive
popd > /dev/null
success "✅LADE BAUSTEINE IN XAIGPUARC UNTERBAUMODULE"
else
error "❌FEHLER HAUPTVERZEICHNIS'${LLAMA_CPP_DIR}'NICHT GEFUNDEN"
exit 1
fi
}
#PATCH|LOGIK:1-8+a+b+c|
patch_llama_cpp() {
log "🔷PATCH 1|8 GGML SYCL DOCTPHELPER REGESTRIERUNG BIBLIOTHEK KOPFZEILENEINTRAEGE"
local DPCT_HELPER_FILE="${LLAMA_CPP_DIR}/ggml/src/ggml-sycl/dpct/helper.hpp"
local CMAKE_LISTS_FILE="${LLAMA_CPP_DIR}/ggml/src/ggml-sycl/CMakeLists.txt"
local CUSTOM_KERNEL_DIR="${LLAMA_CPP_DIR}/ggml/src/ggml-sycl/custom_kernels"
local CUSTOM_KERNEL_SRC="${CUSTOM_KERNEL_DIR}/ggml_flash_attention_sycl.cpp"
local CUSTOM_KERNEL_CMAKE="${CUSTOM_KERNEL_DIR}/CMakeLists.txt"
local GGML_SYCL_CPP="${LLAMA_CPP_DIR}/ggml/src/ggml-sycl/ggml-sycl.cpp"
local KERNEL_SOURCE_LOCAL="ggml_flash_attention_sycl.cpp"
#1|8
if [ -f "$DPCT_HELPER_FILE" ]; then
log "🔷PATCH 1|8 DOCTPHELPER BIBLIOTHEK REGESTRIERTE KOPFZEILENEINTRAEGE LADEN"
if sed -i 's|#include |#include |g' "$DPCT_HELPER_FILE"; then
log "🔷PATCH 1|8 SCHREIBE DOCTPHELPER BIBLIOTHEK KOPFZEILENEINTRAEGE IN XAIGPUARC"
elif sed -i '#if !defined(DPCT_USM_LEVEL_NONE) && defined(DPCT_ENABLE_MKL_MATH).#endif|#include |g' "$DPCT_HELPER_FILE"; then
log "✅PATCH 1|8 DOCTPHELPER BIBLIOTHEK KOPFZEILENEINTRAEGE ERFOLGREICH REGESTRIERT - SPEICHERE"
else
error "❌PATCH 1|8 DOCTPHELPER BIBLIOTHEK KOPFZEILENEINTRAEGE EINLADEN DER REGESTRIERUNG FEHLGESCHLAGEN"
return 1
fi
else
warn "⚠️PATCH 1|8 DOCTPHELPER BIBLIOTHEK NICHT GEFUNDEN ABHAENIGKEITEN PRUEFEN"
return 1
fi
#2|8
log "🔷PATCH 2|8 BAUE FLASH ATTENTION KERN"
#2a|8
if [ ! -d "$CUSTOM_KERNEL_DIR" ]; then
mkdir -p "$CUSTOM_KERNEL_DIR"
log "✅PATCH 2|8 ORNDER FUER FLASH ATTENTION KERN'${CUSTOM_KERNEL_DIR}'ANGELEGT"
fi
if [ -f "$KERNEL_SOURCE_LOCAL" ]; then
cp "$KERNEL_SOURCE_LOCAL" "$CUSTOM_KERNEL_SRC"
log "✅PATCH 2|8 ggml_flash_attention_sycl.cpp KERN'${KERNEL_SOURCE_LOCAL}' '${CUSTOM_KERNEL_SRC}'EINGEBAUT"
fi
if [ ! -f "$CUSTOM_KERNEL_SRC" ]; then
echo "ggml_flash_attention_sycl.cpp KERN VERZEICHNIS" > "$CUSTOM_KERNEL_SRC"
warn "⚠️PATCH 2|8 LADEN DER KERNELDATEI'${KERNEL_SOURCE_LOCAL} FEHLGESCHLAGEN"
fi
echo "
add_library(ggml_flash_attention_sycl OBJECT
ggml_flash_attention_sycl.cpp
)
target_include_directories(ggml_flash_attention_sycl PRIVATE \${GGML_SYCL_INCLUDE_DIRS})
target_compile_options(ggml_flash_attention_sycl PUBLIC \${GGML_SYCL_COMPILE_FLAGS})
" > "$CUSTOM_KERNEL_CMAKE"
log "🔷PATCH 2a|8 CMAKE TXT LISTEN OBJEKTE KOPFZEILENEINTRAEGE EINFUEGEN"
#2b|8
local ADD_SUBDIR_LINE="add_subdirectory(ggml_flash_attention_sycl)"
if ! grep -Fq "${ADD_SUBDIR_LINE}" "$CMAKE_LISTS_FILE"; then
if sed -i "\|#add_subdirectory(dpct)|a ${ADD_SUBDIR_LINE}" "$CMAKE_LISTS_FILE"; then
log "✅PATCH 2b|8 ERFOLGREICH FLASH ATTENTION KOPFZEILENEINTRAEGE CMAKE TXT GESCHRIEBEN"
else
error "❌PATCH 2b|8 FLASH ATTENTION KOPFZEILENEINTRAEGE EINGLIEDERUNG CMAKE TXT FEHLGESCHLAGEN"
return 1
fi
else
log "🔷PATCH 2b|8 FLASH ATTENTION KOPFZEILENEINTRAEGE BEREITS AKTIV UEBERSPRINGE"
fi
#3|8
if [ -f "$CMAKE_LISTS_FILE" ]; then
log "🔷PATCH 3|8: CMAKE TEXT LISTEN MKL KOPZEILEN IC|P|X IMPLEMENTIERUNG VORBEREITEN"
local MKL_INCLUDE_PATH="${MKL_ROOT}/include"
local COMPILER_INCLUDE_PATH="${DPCPP_ROOT}/include"
local DPCPP_LIB_INCLUDE_PATH="${DPCPP_ROOT}/lib/dpcpp/include"
local ALL_INCLUDE_FLAGS="-I${MKL_INCLUDE_PATH} -I${COMPILER_INCLUDE_PATH} -I${DPCPP_LIB_INCLUDE_PATH}"
local PATCH_LINE="target_compile_options (ggml-sycl PUBLIC ${ALL_INCLUDE_FLAGS})"
local SEARCH_MARKER="#Add include directories for MKL headers"
if ! grep -Fq "${COMPILER_INCLUDE_PATH}" "$CMAKE_LISTS_FILE"; then
local SED_PATCH_LINE=$(echo "$PATCH_LINE" | sed 's| |\ |g; s|[|&]|\&|g')
if sed -i "\|${SEARCH_MARKER}|a $SED_PATCH_LINE" "$CMAKE_LISTS_FILE"; then
log "✅PATCH 3|8 ICP|X CMAKET LISTS TXT MKL KOPFZEILENEINTRAEGE EINGEFUEGT"
else
error "❌PATCH 3|8 ICP|X CMAKE LISTS TXT MKL NICHT GEFUNDEN ABHAENGIKEITEN PRUEFEN"
return 1
fi
else
log "✅PATCH 3a|8 CMAKE LISTS TXT PFAD SYCL GGML BEREITS BENUTZT UEBERSPRINGE"
fi
else
error "❌PATCH 3a|8 FEHLGESCHLAGEN CMAKE LISTS TXT SYCL GGML PFADE ABHAENGIGKEITEN GARUDA LINUX ARCH"
return 1
fi
#4|8
log "🔷PATCH 4|8 FLASH ATTENTION HAUPTKERN KOPFZEILENEINTRAEGE INJIZIEREN"
if [ -f "$GGML_SYCL_CPP" ]; then
#4a|8
local FA_REGISTER_CODE=$'//REGESTRIERE ggml_flash_attention_sycl.cpp \nextern "C"
void ggml_flash_attention_sycl(ggml_flash_attention_sycl * ctx, ggml_tensor *
dst, const ggml_tensor * Q, const ggml_tensor * K, const ggml_tensor * V);\n'
if ! grep -Fq "ggml_flash_attention_sycl" "${GGML_SYCL_CPP}"; then
#Anmerkung keine Berechtigung!!LoesenFlashattention is meine gemeint.
echo "${FA_REGISTER_CODE}" > /tmp/ggml_flash_attention_sycl.cpp
awk '/extern "C" void ggml_flash_attention_sycl/ { system("cat /tmp/ggml_flash_attention_sycl.patch"); } { print }' "${GGML_SYCL_CPP}" > /tmp/ggml-sycl.cpp.new
mv /tmp/ggml-sycl.cpp.new "${GGML_SYCL_CPP}"
cp "$GGML_SYCL_CPP" "$GGML_SYCL_CPP.bak"
if [ $? -eq 0 ]; then
log "✅PATCH 4a|8 AWK KOPFZEILENEINTRAEGE DEKLARATION EINGEFUEGT"
else
error "❌PATCH 4a|8 FEHLER EINFUEGEN FLASH ATTENTION KOPFZEILENEINTRAEGE DEKLARATION AWK FEHLT"
return 1
fi
else
log "🔷PATCH 4a|8 FLASH ATTENTION KOPFZEILENEINTRAEGE DEKLARATIONEN VORHANDEN FORTFAHREN"
fi
local FA_DISPATCH_CASE=$' case GGML_OP_FLASH_ATTN:\n ggml_flash_attention_sycl(ctx, dst, src0, src1, src2);\n break;'
if ! grep -Fq "case GGML_OP_FLASH_ATTN:" "${GGML_SYCL_CPP}"; then
log "🔷PATCH 4a|8 FUEGE ZWISCHENSPEICHER PER AWK KOPFZEILE EIN"
echo "${FA_DISPATCH_CASE}" > /tmp/fa_dispatch.patch
awk '/case GGML_OP_MUL_MAT_Q_K:/ { system("cat /tmp/fa_dispatch.patch"); } { print }' "${GGML_SYCL_CPP}" > /tmp/ggml-sycl.cpp.new
mv /tmp/ggml-sycl.cpp.new "${GGML_SYCL_CPP}"
if [ $? -eq 0 ]; then
log "✅PATCH 4a|8 AWK UNTERBAU KOPFZEILENEINTRAEGE EINGEFUEHRT"
else
error "❌PATCH 4a|8 FEHLER EINFUEGEN AWK KOPFZEILENEINTRAEGE"
fi
else
log "✅PATCH 4a|8 AWK UNTERBAU FLASH ATTENTION KOPFZEILENEINTRAEGE INJEKTION VORHANDEN FORTFAHREN"
fi
log "🔷PATCH 4b|8 ERFOLGREICH FLASH ATTENTION AKW UNTERBAU GELADEN"
else
error "❌PATCH 4b|8 FEHLGESCHLAGEN FLASH ATTENTION AWK PATCH KERN STOPP"
return 1
fi
#5|8
log "🔷PATCH 5/8 FLASH ATTENTION OBJEKT INJIZIERE VARIABLEN UNTERBLOCK SYCL BIBLIOTHEKEN"
local CMAKE_LISTS_FILE="${LLAMA_CPP_DIR}/ggml/src/ggml-sycl/CMakeLists.txt"
#5a|8
local VAR_LINE="set(FA_OBJECT_FILES \"\$\")"
local VAR_SEARCH_MARKER="set(GGML_SYCL_SOURCES"
if ! grep -Fq "FA_OBJECT_FILES" "$CMAKE_LISTS_FILE"; then
local SED_VAR_LINE=$(echo "$VAR_LINE" | sed 's/[\/&]/\\&/g')
if sed -i "\|${VAR_SEARCH_MARKER}|a ${SED_VAR_LINE}" "$CMAKE_LISTS_FILE"; then
log "✅PATCH 5a|8 FLASH ATTENTION OBJEKT VARIABLE ERFOLGREICH DEFINIERT WEITER"
else
error "❌PATCH 5a|8 FLASH ATTENTION OBJEKT REGESTRIERUNG FEHLGESCHLAGEN STOPP"
return 1
fi
else
log "🔷PATCH 5a|8 FLASH ATTENTION OBJEKT VARIABLEN VORHANDEN UEBERSPRINGE"
fi
#5b|8
local TARGET_SEARCH_MARKER="target_sources(ggml-sycl PRIVATE \${GGML_SYCL_SOURCES})"
local NEW_TARGET_SOURCES_LINE="target_sources(ggml-sycl PRIVATE \${GGML_SYCL_SOURCES} \${FA_OBJECT_FILES})"
if grep -Fq "${TARGET_SEARCH_MARKER}" "$CMAKE_LISTS_FILE" && ! grep -Fq "\${FA_OBJECT_FILES}" "$CMAKE_LISTS_FILE"; then
local SED_NEW_LINE=$(echo "$NEW_TARGET_SOURCES_LINE" | sed 's/[\/&]/\\&/g')
local SED_SEARCH_MARKER=$(echo "$TARGET_SEARCH_MARKER" | sed 's/[\/&]/\\&/g')
if sed -i "\|${SED_SEARCH_MARKER}|${SED_NEW_LINE}|" "$CMAKE_LISTS_FILE"; then
log "✅PATCH 5b|8 ERFOLGREICHE GGML SYCL INJEKTIONEN"
else
error "❌PATCH 5b|8 GGML SYCL INJEKTION FEHLGESCHLAGEN"
return 1
fi
else
log "✅PATCH 5b|8 GGML SYCL AKTIV INJECTION UEBERSPRUNGEN"
fi
#6|8
log "🔷PATCH 6|8: SSMCONV CPP WARNUNG BEHEBEN VORZEICHEN VERGLEICH AKW PATCH"
local SSM_CONV_FILE="${LLAMA_CPP_DIR}/ggml/src/ggml-sycl/ssm_conv.cpp"
local SEARCH_LINE='GGML_ASSERT(src0->nb\[1\] == src0->ne\[0\] * static_cast(sizeof(float)));'
local REPLACE_LINE='GGML_ASSERT(src0->nb\[1\] == (size_t)(src0->ne\[0\] * sizeof(float)));'
if [ -f "$SSM_CONV_FILE" ]; then
#6a
if grep -Fq "${SEARCH_LINE}" "$SSM_CONV_FILE"; then
log "🔷PATCH 6a|8 SUCHE ssm_conv.cpp NATIVE ADRESSIERUNG"
if grep -Fq "${SEARCH_LINE}" "$SSM_CONV_FILE"; then
if sed -i "|${SEARCH_LINE}|${REPLACE_LINE}|g" "$SSM_CONV_FILE"; then
log "✅PATCH 6|8 SSMCONV CPP ERFOLGREICH GESCHRIEBEN"
else
error "❌PATCH 6|8 SSMCONV CPP FEHLGESCHLAGEN"
return 1
fi
else
warn "⚠️PATCH 6|8 SSMCONV CPP ZEILE NICHT GEFUNDEN UEBERSPRINGE"
fi
fi
#7|8 Diese Groessen koennen selbst angepasst werden
log "🔷PATCH 7|8: ERZWINGE MAXIMALE BLOCK GROESSE 256 FUER ARC ALCHEMIST"
if [ -f "$GGML_SYCL_CPP" ]; then
if ! grep -q "GGML_SYCL_MAX_BLOCK_SIZE 256" "$GGML_SYCL_CPP"; then
sed -i 's/#define GGML_SYCL_MAX_BLOCK_SIZE [0-9]*/#define GGML_SYCL_MAX_BLOCK_SIZE 256/g' "$GGML_SYCL_CPP"
success "✅PATCH 7|8 ERZWINGE MAXIMALE BLOCK GROESSE 256 FUER ARC ALCHEMIST AKTIVIERT"
log "✅PATCH 7|8 MAXIMALE BLOCK GROESSE 256 ZWANG ERFOLGREICH INJIZIERT"
else
log "🔷PATCH 7|8 MAXIMALE BLOCK GROESSE 256 ZWANG FUER ARC BEREITS DEFINIERT"
fi
fi
#8|8
log "🔷PATCH 8|8 SYCL QUEUE ORDNER: HOME/NUTZERNAME/XAIGPUARC OPTIMIERVORGANG KOPFZEILENEINTRAEGE"
local SYCL_FILE="${LLAMA_CPP_DIR}/ggml/src/ggml-sycl/ggml-sycl.cpp"
if [ ! -f "$SYCL_FILE" ]; then
error "❌PATCH 8|8 KONNTE DIE DATEI ${LLAMA_CPP_DIR}/ggml/src/ggml-sycl/ggml-sycl.cpp NICHT FINDEN"
return 1
fi
if grep -q "sycl::property_list" "$SYCL_FILE"; then
sed -i 's|sycl::property_list prop_list{[^}]*}|sycl::property_list prop_list{sycl::property::queue::in_order{}}|' "$SYCL_FILE"
else
sed -i '/sycl::queue q{/i\ sycl::property_list prop_list{sycl::property::queue::in_order{}};' "$SYCL_FILE"
fi
fi
#8a|8
if grep -q "sycl::queue q{" "$SYCL_FILE"; then
sed -i 's|sycl::queue q{[^}]*}|sycl::queue q{dev, ctx, prop_list}|g' "$SYCL_FILE"
if grep -q "in_order" "$SYCL_FILE"; then
success "✅PATCH 8|8 SYCL QUEUE ERFOLGREICH KOPFZEILENEINTRAEGE OPTIMIERT"
else
error "❌PATCH 8|8 SYCL QUEUE AENDERUNGEN KOPFZEILENEINTRAEGE NICHT FERTIG"
return 1
fi
else
warn "⚠️PATCH 8|8 SYCL QUEUE KOPFZEILENEINTRAEGE NICHT GEFUNDEN UEBERSPRINGE"
fi
success "🔷ALLE FUENF VON ACHT EINGLIEDERUNGEN INTEL XE/ARC/iGPU/dGPU/eGPU FUER XAIGPUARC ERFOLGREICH"
}
#3|XAIGPUARC|BAUKONFIGURATION|
configure_build() {
log "🔷BEREITE XAIGPUARC KOPFZEILEN BAUVORGANG VOR"
local FP_MODE="${1:-1}"
local SYCL_FLAGS="-DGGML_SYCL_F16=${FP_MODE} -fsycl-device-code-split=per_kernel"
if [ ! -d "${BUILD_DIR}" ]; then
log "🔷LEGE XAIGPUARC IN ORDNER HOME ${BUILD_DIR}"
mkdir -p "${BUILD_DIR}" || { error "❌KONNTE ORDNER XAIGPUARC'${BUILD_DIR}'NICHT ANLEGEN"; return 1; }
fi
if pushd "${BUILD_DIR}" > /dev/null; then
log "🔷STARTE CMAKE TXT KOPFZEILENBAU XAIGPUARC ${FP_FLAG:-FP_MODE}"
cmake "../${LLAMA_CPP_DIR}" \
-G "Unix Makefiles" \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DCMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE}" \
-DGGML_SYCL=ON \
-DGGML_SYCL_TARGET=INTEL \
-DGGML_SYCL_CCACHE=ON \
-DGGML_SYCL_F16=${FP_MODE} \
-DGGML_SYCL_FLASH_ATTN=ON \
-DGGML_SYCL_MKL_SYCL_BATCH_GEMM=1 \
-DCMAKE_C_COMPILER=icx \
-DCMAKE_CXX_COMPILER=icpx \
-DCMAKE_CXX_STANDARD=23 \
-DCMAKE_CXX_STANDARD_REQUIRED=ON \
-DCMAKE_CXX_EXTENSIONS=ON \
-DGGML_SYCL_PRIORITIZE_DMMV=ON \
-DGGML_SYCL_DISABLE_DNN=OFF \
-DTHREADS_PREFER_PTHREAD_FLAG=ON \
-DCMAKE_C_FLAGS="-O3 -ffast-math -fno-trapping-math" \
-DGGML_SYCL_DISABLE_GRAPH=OFF \
-DCMAKE_THREAD_LIBS_INIT="-pthread"\
-DCMAKE_C_COMPILER_WORKS=1
local CMAKE_STATUS=$?
popd > /dev/null
if [ ${CMAKE_STATUS} -ne 0 ]; then
error "❌CMAKE TXT KOPFZEILEN SCHREIBEN FEHLGESCHLAGEN"
return 1
fi
success "✅VORBAU ABGESCHLOSSEN"
else
error "❌KONNTE NICHT NACH HOME/NUTZERNAME/XAIGPUARC WECHSELN'${BUILD_DIR}'COMPUTER NUTZER BERECHTIGUNG PRUEFEN"
return 1
fi
}
#4KOMPILIEREN
compile_project() {
log "🔷BAUE XAIGPUARC GRUND GERUEST STRUKTUR"
local LOG_FILE="build.log"
log "🔷KOPFZEILEN AUSGABE UNTERORNDER GESPEICHERT"
log "🔷BAUVORGANG LAEUFT XAIGPUARC SYCL C++ LEVEL ZERO KOPFZEILEN SCHREIBEN ABGESCHLOSSEN"
if pushd "${BUILD_DIR}" > /dev/null; then
log "🔷
|🟢|XAIGPUARC
|🔧|INSTALLATION auf ihrem Endgeraet in 🧰 .../HOME/USERNAME/XAIGPUARC/...|✅|
|📌|Zur DEInstallation einfach entsprechende ORDNER LOESCHEN!
|💡|min. 9GiB - 17GiB RAM DATENVORGAENGE 🔄
|🧱|VORBERRECHUNG SPRACHPROGRAMM ASSISTENT FUER ⚫ MATHEMATIK 🔧
|🟡|ACHTUNG! Wenn Sie DAS Hier Lesen Koennen...! :-)
|🔄|WIRD-es...
|📌|ERSTMALIG Mindestens-...
|💡|3 bis 7 Minuten-...
|💡|ANDAUERN!!!...
|⚙️|BITTE ETWAS GEDULD...
|✅||Beim zweitem Start mit demselbem Vorgang wie diesem, dauert es nur wenige Sekunden bis die KI startet!
|⚫|DUNKLE-MATHEMATIK 🧰 🔄 🎁 🔄 🔧 🔄 🎯 DEUTSCH-SPRACHPROGRAMM
|💡|NUTZEN SIE DEN MATH-TUTOR_F16
|🟡|A770LE 16GiB VRAM @ 14.2GiB@MathTutor-f16 MAXIMAL MATHEMATIK SPRUCH
|👉|DANKE FUER DIE NUTZUNG VON ❌AIGPUARC"
cmake --build . --verbose --config "${CMAKE_BUILD_TYPE}" -j ${NPROC} --target llama-cli llama-ls-sycl-device > "${LOG_FILE}" 2>&1
local BUILD_STATUS=$?
popd > /dev/null
if [ ${BUILD_STATUS} -ne 0 ]; then
error "❌XAIGPUARC KOPFZEILEN FEHLGESCHLAGEN UEBERPRUEFEN**${BUILD_DIR}/${LOG_FILE}**"
return 1
fi
success "✅BAU XAIGPUARC ERFOLGREICH"
else
error "❌XAIGPUARC '${BUILD_DIR}' WEGEN FEHLERHAFTEM WECHSEL KOPZEILENBAU NICHT MOEGLICH"
return 1
fi
}
#5AUTOMATISCHEGERAETEAUSWAHL
auto_select_device() {
log "🔷SUCHE NACH VERFUEGBAREN SYCL GERAETEN AUF IHREM SYSTEM"
local FULL_LS_PATH="./${BUILD_DIR}/${LS_SYCL_DEVICE_PATH}"
if [ ! -x "${FULL_LS_PATH}" ]; then
warn "⚠️SYCL UNTERBAU NICHT GEFUNDEN ${FULL_LS_PATH} ZWEITSUCHE ODER RUECKFALL AUF CPU"
export ONEAPI_DEVICE_SELECTOR="level_zero:${TARGET_ID}"
DEVICE="ARC"
return
fi
local DEVICES
DEVICES=$(bash -c "${FULL_LS_PATH}")
if [ -z "$DEVICES" ]; then
warn "⚠️KEINE KOMPATIBLEN SYCL GERAETE GEFUNDEN! SUCHE ERNEUT UND UEBERGEHE iGPU VOR dGPU NUTZUNG MIT dGPU"
export ONEAPI_DEVICE_SELECTOR="level_zero:0->❌ANBINDUNG FEHLGESCHLAGEN"
DEVICE="ARC"
N_GPU_LAYERS=99
return
fi
local ARC_ID
ARC_ID=$(echo "$DEVICES" | grep -i "Intel Arc" | head -n1 | awk '{print $1}')
local IGPU_ID
IGPU_ID=$(echo "$DEVICES" | grep -Ei "Iris|Xe|Graphics" | head -n1 | awk '{print $1}')
local TARGET_LINE=""
if [ -n "$ARC_ID" ]; then
TARGET_LINE=$(echo "$DEVICES" | grep -i "Intel Arc" | head -n1)
DEVICE="ARC"
elif [ -n "$IGPU_ID" ]; then
TARGET_LINE=$(echo "$DEVICES" | grep -Ei "Iris|Xe|Graphics" | head -n1)
DEVICE="iGPU"
else
export ONEAPI_DEVICE_SELECTOR="opencl:cpu"
DEVICE="CPU"
N_GPU_LAYERS=99
error "❌KEINE GEEIGNETE GRAFIKKARTE GEFUNDEN FALLE ENDGUELTIG AUF CPU ZURUECK"
return
fi
if [ -n "$TARGET_LINE" ]; then
local TARGET_ID
TARGET_ID=$(echo "$TARGET_LINE" | awk '{print $1}')
export ONEAPI_DEVICE_SELECTOR="level_zero:${TARGET_ID}"
log "🔷NUTZE INTEL XE/ARC GRAFIKKARTE ${DEVICE}(Device ${TARGET_ID})"
local VRAM_GIB_RAW=$(echo "$TARGET_LINE" | grep -oP '\d+(?=M)' | head -n1)
VRAM_GIB=$((VRAM_GIB_RAW / 1024)) #MIBzuGIB
if [ -z "${VRAM_GIB_RAW}" ]; then
VRAM_GIB_RAW=1024
fi
local LAYER_SIZE_MIB=256
#MagicKeyMagischerSchluessel
local VRAM_MIB_CALC=$((VRAM_GIB * 1024))
if [ "${VRAM_GIB}" -lt 1 ]; then
VRAM_GIB=1
fi
N_GPU_LAYERS=$((VRAM_MIB_CALC * 99 / 100 / LAYER_SIZE_MIB))
if [ "$N_GPU_LAYERS" -gt 99 ]; then
N_GPU_LAYERS=99
fi
if [ "$N_GPU_LAYERS" -lt 1 ]; then
N_GPU_LAYERS=1
fi
log "🔷NGL**${N_GPU_LAYERS}**SCHICHTEN MODELL PRIORITAET GLEICHMAESSIG AUF GPU/CPU VERTEILT"
fi
}
#6SYCLKOMPATIBLEGERAETEPRUEFEN
list_sycl_devices() {
log "🔷SUCHE ZWEIMAL HINTEREINANDER SYCL FAEHIGES GERAET UM SUCHFEHLER ZU UMGEHEN"
local FULL_LS_PATH="./${BUILD_DIR}/${LS_SYCL_DEVICE_PATH}"
if [ -f "${FULL_LS_PATH}" ]; then
"${FULL_LS_PATH}"
else
warn "⚠️AKTUELL KEIN SYCL GERAET GEFUNDEN ${FULL_LS_PATH} VERSUCH ZWEI SUCHE..."
fi
}
#Falcon-H1-7B-Instruct-BF16
prepare_model() {
MODEL_PATH=${1:-"models/Falcon-H1-7B-Instruct-BF16.gguf"} #MathTutor-7B-H_v0.0.1.f16
mkdir -p models
if [ ! -f "$MODEL_PATH" ]; then
warn "⚠️IHR MODELL NICHT UNTER HOME/NUTZERNAME/MODELS GEFUNDEN! BITTE DORT HIN**$MODEL_PATH**KOPIEREN"
fi
export MODEL_PATH
}
run_inference() {
local DEFAULT_MODEL_PATH="models/Falcon-H1-7B-Instruct-BF16.gguf"
local MODEL_PATH_ARG=${2:-$DEFAULT_MODEL_PATH}
local PROMPT_ARG=${3:-"\
"
}
local GPU_ID=$(echo "$ONEAPI_DEVICE_SELECTOR" | awk -F':' '{print $2}')
local NGL_SET=${N_GPU_LAYERS:-99}
local FULL_LLAMA_CLI_PATH="./${BUILD_DIR}/${LLAMA_CLI_PATH}"
local CONTEXT_SIZE=43448
local PREDICT_TOKENS=43448
local layer=${N_GPU_LAYERS:-99}
local TENSOR_SPLIT=99
local row=99
log "🔷STARTE KI ANTWORT MIT PARAMETER**${DEVICE}(ID: ${GPU_ID})**NGL WERT GLEICH${NGL_SET}**${FULL_LLAMA_CLI_PATH}**"
if [ ! -x "${FULL_LLAMA_CLI_PATH}" ]; then
error "❌FEHLER AKTUELLER UNTERBAU NEUBAU FEHLGESCHLAGEN${FULL_LLAMA_CLI_PATH}"
return 1
fi
ZES_ENABLE_SYSMAN=1 "${FULL_LLAMA_CLI_PATH}" \
-no-cnv \
--n-cpu-moe 35 \
--model "${MODEL_PATH_ARG}" \
--prompt "${PROMPT_ARG}" \
--no-mmap \
--mlock \
--cache-type-k f16 \
--cache-type-v f16 \
--n-predict "${PREDICT_TOKENS}" \
--ctx-size "${CONTEXT_SIZE}" \
-ngl "${N_GPU_LAYERS}" \
--keep 43448 \
--main-gpu ${GPU_ID} \
--color auto
echo "✅SPRACHMODELL INTERAKTIONS FUNKTION JETZT AKTIV"
}
#DEFINITIONHAUPTFUNKTION
main() {
local FP_MODE="${1:-1}"
local RERUN_BUILD=1
prepare_environment #01
local FULL_LLAMA_CLI_PATH="./${BUILD_DIR}/${LLAMA_CLI_PATH}"
local FULL_LS_PATH="./${BUILD_DIR}/${LS_SYCL_DEVICE_PATH}"
if [[ -f "${FULL_LLAMA_CLI_PATH}" ]] && [[ -f "${FULL_LS_PATH}" ]]; then
success "✅ XAIGPUARC WERKZEUGKASTEN VORHANDEN NEUBAU UNNOETIG**${FULL_LLAMA_CLI_PATH}** **${FULL_LS_PATH}**"
log "🔷UEBERSPRINGE BAUVORGANG WERKZEUGKASTEN"
RERUN_BUILD=0
else
warn "⚠️KEIN AKTUELLES XAIGPUARC GEFUNDEN WIRD NEU GEBAUT"
RERUN_BUILD=1
fi
if [[ "$RERUN_BUILD" -eq 1 ]]; then
log "🔷STARTE ERSTMALIGEN BAUVORGANG XAIGPUARC"
if check_internet; then
log "🔷LADE WERKZEUGKASTEN" #0
setup_project #1
patch_llama_cpp #2
else
warn "⚠️INTERNET NICHT VERFUEGBAR UEBERSPRINGE AUFWERTUNG WERKZEUGKASTEN LOKALE VERSION"
fi
fi
configure_build "${FP_MODE}" #3
compile_project #4
auto_select_device #5
list_sycl_devices #6
prepare_model "${2:-}" #7
run_inference "${2:-}" "${3:-}" #8
log "✅NUTZUNG VON XAIGPUARC JETZT MOEGLICH /IHRE FRAGE NACH: > ... DRUECKEN SIE |ENTER**${BUILD_DIR}/${LLAMA_CLI_PATH}**"
}
#HAUPTSCHLEIFE
main "${1:-1}" "${2:-}" "${3:-}"
#42
log "✅KOMPLETTER BAUVORGANG HIER GESPEICHERT**${LOG_FILE}**"