Mark Stratmann
Running LLMs Background

Framework Desktop-ൽ ലോക്കൽ LLMകൾ പ്രവർത്തിപ്പിക്കൽ (Max+ 395 - 128GB)

Docker കണ്ടെയ്‌നറുകൾ ഉപയോഗിച്ച് llama.cppയും Ollamaയും രണ്ടും ഉപയോഗിച്ച് ലോക്കൽ LLMകൾ പ്രവർത്തിപ്പിക്കുക

ഈ ലേഖനം, llama.cppയും Docker കണ്ടെയ്നറുകളോടൊപ്പം Ollamaയും ഉപയോഗിച്ച് ലോക്കൽ LLMകൾ പ്രവർത്തിപ്പിക്കാൻ, എന്റെ Framework Desktop PC (Max+ 395, 128GB unified memory) ഞാൻ എങ്ങനെ കോൺഫിഗർ ചെയ്തിരിക്കുന്നുവെന്നത് രേഖപ്പെടുത്തുന്നു.

ഹാർഡ്‌വെയർ അവലോകനം

Framework Desktop Max+ 395-ൽ ഇന്റഗ്രേറ്റഡ് Radeon ഗ്രാഫിക്സോടുകൂടിയ AMD Ryzen AI Max 395 പ്രോസസർ (Strix Halo) ഉണ്ട്. പ്രത്യേകതകൾ:

  • 128GB unified memory (CPU/GPU ഷെയർ ചെയ്യുന്ന)
  • AMD RDNA 3.5 ആർക്കിടെക്ചർ
  • gfx1151 GPU target

https://frame.work/gb/en/desktop

GPU മെമ്മറി കോൺഫിഗറേഷൻ

GPU വർക്ക്ലോഡുകൾക്കായി 128GB unified memory പൂർണ്ണമായി പ്രാപ്തമാക്കാൻ, താഴെ പറയുന്ന കോൺഫിഗറേഷൻ ആവശ്യമാണ്. technigmaai-wikiയിലെ Ubuntu അടിസ്ഥാനത്തിലുള്ള ഗൈഡും lhl/strix-halo-testingയിലെ Fedora 43-യ്ക്കുള്ള LLM ബെഞ്ച്മാർക്ക് സെറ്റപ്പും ചേർത്തു ചേർന്നതാണ് ഈ നിർദ്ദേശങ്ങൾ.

BIOS സെറ്റപ്പ്

  1. റീബൂട്ട് ചെയ്ത് BIOS/UEFI-ൽ പ്രവേശിക്കുക
  2. Integrated Graphics/UMA Frame Buffer Size 512MB ആയി സജ്ജമാക്കുക
  3. IOMMU ഡിസേബിൾ ചെയ്യുക

Fedora 43 GRUB കോൺഫിഗറേഷൻ

/etc/default/grub എഡിറ്റ് ചെയ്ത് GRUB_CMDLINE_LINUX_DEFAULT ലൈൻ മാറ്റുക:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=off amdgpu.gttsize=131072 ttm.pages_limit=33554432"

പിന്നീട് GRUB അപ്‌ഡേറ്റ് ചെയ്ത് റീബൂട്ട് ചെയ്യുക:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot

മെമ്മറി സെറ്റിങ്ങുകൾ സ്ഥിരീകരിക്കുക

റീബൂട്ട് കഴിഞ്ഞ ശേഷം, പാരാമീറ്ററുകൾ പ്രയോഗിച്ചതാണെന്ന് പരിശോധിക്കുക:

cat /proc/cmdline
sudo dmesg | grep -i gtt
sudo dmesg | grep -i ttm

ഈ കോൺഫിഗറേഷൻ GPU വർക്ക്ലോഡുകൾക്കായി ഏകദേശം 128GB GTT മെമ്മറി പ്രാപ്തമാക്കുന്നു. 256K context window ഉള്ള Qwen3-Coder-Next പോലുള്ള വലിയ മോഡലുകൾ ഓടിക്കാൻ ഇത് അനിവാര്യമാണ്.

മാറ്റുവായ Kernel Module കോൺഫിഗറേഷൻ

കൂടുതൽ സൂക്ഷ്മമായ നിയന്ത്രണത്തിനായി, /etc/modprobe.d/amdgpu_llm_optimized.conf സൃഷ്ടിക്കുക:

options amdgpu gttsize=120000
options ttm pages_limit=31457280
options ttm page_pool_size=15728640

പിന്നീട് initramfs പുനഃസൃഷ്ടിക്കുക:

sudo dracut --force

LLMകൾക്കായി Fedora 43 എന്തുകൊണ്ട്?

പല ഗൈഡുകളും Ubuntu ലക്ഷ്യമിടുന്നുവെങ്കിലും, ലോക്കൽ LLM വർക്ക്ലോഡുകൾക്കായി Fedora 43 ചില നേട്ടങ്ങൾ നൽകുന്നു:

കൂടുതൽ പുതിയത് Kernel: Fedora 43 kernel 6.18.4+ നോടൊപ്പം വരുന്നു; ഇത് ROCm 7.x-ിനും Ryzen AI Max 395-ന്റെ GPU-ക്കും മികച്ച പിന്തുണ നൽകുന്നു

മികച്ച ROCm പിന്തുണ: പുതിയ kernel-ുകളിലെ Linux kernel AMDGPU ഡ്രൈവർ മെച്ചപ്പെടുത്തലുകൾ unified memory മാനേജ്‌മെന്റും VRAM അലോക്കേഷനും LLM വർക്ക്ലോഡുകൾക്കായി കൂടുതൽ നല്ലതാക്കുന്നു

പാക്കേജ് പുതുമ: Fedora-യുടെ rolling release മോഡൽ, താഴെപ്പറയുന്ന പ്രധാന ഡിപ്പെൻഡൻസികളുടെ കൂടുതൽ പുതിയ വേർഷനുകൾ നൽകുന്നു:

  • HIP കംപൈലേഷൻക്കായി LLVM/Clang
  • Vulkan ഡ്രൈവർകൾ (Mesa RADV/AMDVLK)
  • CMakeയും build toolchainsഉം
  1. SELinux പരിഗണനകൾ: SELinux-ന് അധിക കോൺഫിഗറേഷൻ (ഉദാ: container_use_devices=1) ആവശ്യമുണ്ടെങ്കിലും, കണ്ടെയ്നറൈസ്ഡ് LLM വർക്ക്ലോഡുകൾക്കായി ഇത് കൂടുതൽ നല്ല സുരക്ഷാ ഐസലേഷൻ നൽകുന്നു

ഈ സമീപനത്തെ രൂപപ്പെടുത്താൻ സഹായിച്ച പ്രധാന ഉറവിടങ്ങൾ:

Docker അടിസ്ഥാനത്തിലുള്ള LLM കണ്ടെയ്നറുകൾ

llama.cppയും Ollamaയും ഓടിക്കാൻ, kyuz0/amd-strix-halo-toolboxes അടിസ്ഥാനമാക്കി ഞാൻ Docker കണ്ടെയ്നറുകൾ സൃഷ്ടിച്ചിട്ടുണ്ട്.

കണ്ടെയ്നർ മുൻകൂർ ആവശ്യകതകൾ

ഏതെങ്കിലും കണ്ടെയ്നറുകൾ പ്രവർത്തിപ്പിക്കുന്നതിന് മുമ്പ്, GPU ഡിവൈസുകളിലേക്ക് കണ്ടെയ്നറിന് ആക്‌സസ് അനുവദിക്കാൻ SELinux എനേബിൾ ചെയ്യുക:

sudo setsebool container_use_devices=1

ഇത് റീബൂട്ടുകൾക്കും ശേഷവും നിലനിൽക്കേണ്ട ഒറ്റത്തവണ കോൺഫിഗറേഷനാണ്:

sudo setsebool -P container_use_devices=1

Vulkan ഉപയോഗിച്ചുള്ള Ollama (പ്രവർത്തിക്കുന്നു)

Fedora 43-ൽ Ollama-യോടൊപ്പം Vulkan backend പൂർണ്ണമായി പ്രവർത്തിക്കുന്നു.

Dockerfile: ollama-vulkan/Dockerfile Docker Compose: ollama-vulkan/docker-compose.yml

# Ollama + Vulkan on Strix Halo (Fedora 43)
FROM registry.fedoraproject.org/fedora-minimal:43

# Base runtime deps + Vulkan userspace
RUN microdnf -y --nodocs --setopt=install_weak_deps=0 install \
      bash ca-certificates curl tar \
      libatomic libstdc++ libgcc \
      vulkan-loader vulkan-loader-devel vulkaninfo \
      mesa-vulkan-drivers radeontop \
      pciutils procps-ng wget gzip zstd \
  && microdnf clean all && rm -rf /var/cache/dnf/*

# Install AMDVLK (optional, can use Mesa RADV)
RUN curl -L -o /tmp/amdvlk-2025.Q2.1.x86_64.rpm \
    https://github.com/GPUOpen-Drivers/AMDVLK/releases/download/v-2025.Q2.1/amdvlk-2025.Q2.1.x86_64.rpm \
 && microdnf -y install /tmp/amdvlk-*.rpm \
 && rm -f /tmp/amdvlk-*.rpm

# Install Ollama (generic Linux build with Vulkan support)
RUN wget -P /tmp https://github.com/ollama/ollama/releases/download/v0.15.5-rc2/ollama-linux-amd64.tar.zst \
 && tar --zstd -C /usr -xf /tmp/ollama-linux-amd64.tar.zst \
 && rm -f /tmp/ollama-linux-amd64.tar.zst

RUN mkdir -p /root/.ollama

ENV OLLAMA_VULKAN=1 \
    GGML_VK_VISIBLE_DEVICES=0 \
    OLLAMA_HOST=0.0.0.0 \
    OLLAMA_ORIGINS="*"

EXPOSE 11434

CMD ["/usr/bin/ollama", "serve"]

Vulkan ഉപയോഗിച്ച് Ollama ആരംഭിക്കുക:

# Build the image
docker build -t ollama-strix-vulkan -f ollama-vulkan/Dockerfile .

# Or using Docker Compose
cd ollama-vulkan
docker compose up -d

Ollama ആക്‌സസ് ചെയ്യുക:

ollama list
ollama pull qwen3-coder-next

ROCm ഉപയോഗിച്ചുള്ള Ollama (പ്രവർത്തിക്കുന്നില്ല - പരിഹാരം കാത്തിരിക്കുന്നു)

Ollama-യുടെ ROCm implementation, ROCm 7.x ഉള്ള Fedora 43-ൽ നിലവിൽ പ്രവർത്തിക്കുന്നില്ല. പ്രശ്നം ഇവിടെ ട്രാക്ക് ചെയ്യുന്നു: ROCm issue #5902.

Dockerfile: ollama-rocm/Dockerfile Docker Compose: ollama-rocm/docker-compose.yml

# Ollama + Vulkan on Strix Halo (Fedora 43)
FROM registry.fedoraproject.org/fedora:43

RUN dnf -y --nodocs --setopt=install_weak_deps=False install \
  make gcc cmake lld clang clang-devel compiler-rt libcurl-devel \
  radeontop git vim patch curl ninja-build tar xz aria2c wget zstd \
  && dnf clean all && rm -rf /var/cache/dnf/*


# find & fetch the latest Linux 7.x.x tarball (gfx1151)
WORKDIR /tmp
ARG ROCM_MAJOR_VER=7
ARG GFX=gfx1151
RUN set -euo pipefail; \
  BASE="https://therock-nightly-tarball.s3.amazonaws.com"; \
  PREFIX="therock-dist-linux-${GFX}-${ROCM_MAJOR_VER}"; \
  KEY="$(curl -s "${BASE}?list-type=2&prefix=${PREFIX}" \
  | tr '<' '\n' \
  | grep -o "therock-dist-linux-${GFX}-${ROCM_MAJOR_VER}\..*\.tar\.gz" \
  | sort -V | tail -n1)"; \
  echo "Latest tarball: ${KEY}"; \
  aria2c -x 16 -s 16 -j 16 --file-allocation=none "${BASE}/${KEY}" -o therock.tar.gz
RUN mkdir -p /opt/rocm-7.0 \
  && tar xzf therock.tar.gz -C /opt/rocm-7.0 --strip-components=1

ENV ROCM_PATH=/opt/rocm-7.0 \
  HIP_PLATFORM=amd \
  HIP_PATH=/opt/rocm-7.0 \
  HIP_CLANG_PATH=/opt/rocm-7.0/llvm/bin \
  HIP_INCLUDE_PATH=/opt/rocm-7.0/include \
  HIP_LIB_PATH=/opt/rocm-7.0/lib \
  HIP_DEVICE_LIB_PATH=/opt/rocm-7.0/lib/llvm/amdgcn/bitcode \
  PATH=/opt/rocm-7.0/bin:/opt/rocm-7.0/llvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
  LD_LIBRARY_PATH=/opt/rocm-7.0/lib:/opt/rocm-7.0/lib64:/opt/rocm-7.0/llvm/lib \
  LIBRARY_PATH=/opt/rocm-7.0/lib:/opt/rocm-7.0/lib64 \
  CPATH=/opt/rocm-7.0/include \
  PKG_CONFIG_PATH=/opt/rocm-7.0/lib/pkgconfig

RUN printf '%s\n' \
  'export ROCM_PATH=/opt/rocm-7.0' \
  'export HIP_PLATFORM=amd' \
  'export HIP_PATH=/opt/rocm-7.0' \
  'export HIP_CLANG_PATH=/opt/rocm-7.0/llvm/bin' \
  'export HIP_INCLUDE_PATH=/opt/rocm-7.0/include' \
  'export HIP_LIB_PATH=/opt/rocm-7.0/lib' \
  'export HIP_DEVICE_LIB_PATH=/opt/rocm-7.0/lib/llvm/amdgcn/bitcode' \
  'export PATH="$ROCM_PATH/bin:$HIP_CLANG_PATH:$PATH"' \
  'export LD_LIBRARY_PATH="$HIP_LIB_PATH:$ROCM_PATH/lib:$ROCM_PATH/lib64:$ROCM_PATH/llvm/lib"' \
  'export LIBRARY_PATH="$HIP_LIB_PATH:$ROCM_PATH/lib:$ROCM_PATH/lib64"' \
  'export CPATH="$HIP_INCLUDE_PATH"' \
  'export PKG_CONFIG_PATH="$ROCM_PATH/lib/pkgconfig"' \
  > /etc/profile.d/rocm.sh \
  && chmod +x /etc/profile.d/rocm.sh \
  && echo 'source /etc/profile.d/rocm.sh' >> /etc/bashrc

# Install the Ollama ROCm drivers (v0.15.2)
RUN wget -P /tmp https://github.com/ollama/ollama/releases/download/v0.15.5-rc3/ollama-linux-amd64-rocm.tar.zst \
 && tar -C /usr --use-compress-program=unzstd -xf /tmp/ollama-linux-amd64-rocm.tar.zst \
 && rm -f /tmp/ollama-linux-amd64-rocm.tar.zst

# Install ollama (v0.15.2)
RUN wget -P /tmp https://github.com/ollama/ollama/releases/download/v0.15.5-rc3/ollama-linux-amd64.tar.zst \
 && tar -C /usr --use-compress-program=unzstd -xf /tmp/ollama-linux-amd64.tar.zst \
 && rm -f /tmp/ollama-linux-amd64.tar.zst

# Make Ollama + ROCm shared libs visible to the runtime linker
RUN printf '%s\n' \
  /usr/lib/ollama \
  /opt/rocm-7.0/lib \
  > /etc/ld.so.conf.d/ollama-rocm.conf \
  && ldconfig

# Create /opt/rocm symlink that Ollama expects
RUN ln -sfn /opt/rocm-7.0 /opt/rocm

# Data directory
RUN mkdir -p /root/.ollama

# Expose Ollama API port
EXPOSE 11434

# profile
RUN printf '%s\n' \
  'export ROCBLAS_USE_HIPBLASLT=1' \
  > /etc/profile.d/rocm.sh && chmod +x /etc/profile.d/rocm.sh \
  && echo 'source /etc/profile.d/rocm.sh' >> /etc/bashrc

ENV OLLAMA_HOST=0.0.0.0 \
    OLLAMA_ORIGINS="*"

# Start the server
CMD ["/usr/bin/ollama", "serve"]

സിസ്റ്റം ~111GB ലഭ്യമായ VRAM റിപ്പോർട്ട് ചെയ്യുമ്പോഴും ROCm backend "out of memory" പിശകുകളോടെ പരാജയപ്പെടുന്നു. Ollama-യുടെ മെമ്മറി കണക്കുകൂട്ടലിനെ ബാധിക്കുന്ന ROCm 7.2-ലെ ഒരു regression ആണെന്ന് ഇത് തോന്നുന്നു.

നിലവിലെ നില: AMD/ROCm ടീമിൽ നിന്നുള്ള upstream പരിഹാരം കാത്തിരിക്കുന്നു.

Vulkan ഉപയോഗിച്ചുള്ള llama.cpp

Dockerfile: llamacpp/Dockerfile.llamacpp-strix-vulkan

# build stage
FROM registry.fedoraproject.org/fedora:43 AS builder

# deps
RUN dnf -y --nodocs --setopt=install_weak_deps=False install \
      git vim \
      make gcc cmake ninja-build lld clang clang-devel compiler-rt libcurl-devel \
      vulkan-loader-devel vulkaninfo mesa-vulkan-drivers \
      radeontop glslc \
    && dnf clean all && rm -rf /var/cache/dnf/*

# llama.cpp
WORKDIR /opt/llama.cpp
RUN git clone --recursive https://github.com/ggerganov/llama.cpp.git .

# build
RUN git clean -xdf \
 && git submodule update --recursive \
 && cmake -S . -B build -G Ninja \
      -DGGML_VULKAN=ON \
      -DCMAKE_BUILD_TYPE=Release \
      -DGGML_RPC=ON \
      -DCMAKE_INSTALL_PREFIX=/usr \
      -DLLAMA_BUILD_TESTS=OFF \
      -DLLAMA_BUILD_EXAMPLES=ON \
      -DLLAMA_BUILD_SERVER=ON \
 && cmake --build build --config Release \
 && cmake --install build --config Release

# libs
RUN find /opt/llama.cpp/build -type f -name 'lib*.so*' -exec cp {} /usr/lib64/ \; \
 && ldconfig


# runtime stage
FROM registry.fedoraproject.org/fedora-minimal:43

# runtime deps
RUN microdnf -y --nodocs --setopt=install_weak_deps=0 install \
      bash ca-certificates libatomic libstdc++ libgcc \
      vulkan-loader vulkan-loader-devel vulkaninfo mesa-vulkan-drivers radeontop \
  && microdnf clean all && rm -rf /var/cache/dnf/*

# copy
COPY --from=builder /usr/ /usr/
COPY --from=builder /usr/local/ /usr/local/
COPY --from=builder /opt/llama.cpp/build/bin/rpc-* /usr/local/bin/

# ld
RUN echo "/usr/local/lib"  > /etc/ld.so.conf.d/local.conf \
 && echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local.conf \
 && ldconfig \
 && cp -n /usr/local/lib/libllama*.so* /usr/lib64/ 2>/dev/null || true \
 && ldconfig

# shell
CMD ["/bin/bash"]

llama.cpp-ന്റെ Vulkan backend സ്ഥിരതയുള്ളതും നന്നായി ടെസ്റ്റ് ചെയ്തതുമാണ്. എല്ലാ മോഡൽ സൈസുകൾക്കും ഇത് വിശ്വസനീയമായ പെർഫോമൻസ് നൽകുന്നു.

Docker Compose എൻട്രി:

qwen-3-coder-vulkan:
  image: llamacpp-strix-vulkan
  container_name: llamacpp
  restart: unless-stopped
  devices:
    - /dev/dri:/dev/dri
  group_add:
    - "video"
  volumes:
    - /home/mark/running-llms/:/root/running-llms
  ports:
    - "8080:8080"
  security_opt:
    - seccomp=unconfined
  command: >
    bash -c "llama-server --alias Qwen3-Coder-30B -m /root/running-llms/hf-models/unsloth/Qwen3-Coder-30B-A3B-Instruct-1M-BF16/BF16/Qwen3-Coder-30B-A3B-Instruct-1M-BF16-00001-of-00002.gguf --ctx-size 262144 -fa 1 --no-mmap --host 0.0.0.0 --port 8080 --temp 0.7 --top-k 20 --min-p 0.01 --top-p 0.8 --repeat-penalty 1.05 --jinja -ngl 99 --threads -1"

ROCm ഉപയോഗിച്ചുള്ള llama.cpp (വേഗം - ~30% പെർഫോമൻസ് വർധന)

Dockerfile: llamacpp/Dockerfile.llamacpp-rocm

# build
FROM registry.fedoraproject.org/fedora:43 AS builder

RUN dnf -y --nodocs --setopt=install_weak_deps=False install \
  make gcc cmake lld clang clang-devel compiler-rt libcurl-devel \
  radeontop git vim patch curl ninja-build tar xz aria2c \
  && dnf clean all && rm -rf /var/cache/dnf/*

# find & fetch the latest Linux 7.x.x tarball (gfx1151)
WORKDIR /tmp
ARG ROCM_MAJOR_VER=7
ARG GFX=gfx1151
RUN set -euo pipefail; \
  BASE="https://therock-nightly-tarball.s3.amazonaws.com"; \
  PREFIX="therock-dist-linux-${GFX}-${ROCM_MAJOR_VER}"; \
  KEY="$(curl -s "${BASE}?list-type=2&prefix=${PREFIX}" \
  | tr '<' '\n' \
  | grep -o "therock-dist-linux-${GFX}-${ROCM_MAJOR_VER}\..*\.tar\.gz" \
  | sort -V | tail -n1)"; \
  echo "Latest tarball: ${KEY}"; \
  aria2c -x 16 -s 16 -j 16 --file-allocation=none "${BASE}/${KEY}" -o therock.tar.gz
RUN mkdir -p /opt/rocm-7.0 \
  && tar xzf therock.tar.gz -C /opt/rocm-7.0 --strip-components=1

ENV ROCM_PATH=/opt/rocm-7.0 \
  HIP_PLATFORM=amd \
  HIP_PATH=/opt/rocm-7.0 \
  HIP_CLANG_PATH=/opt/rocm-7.0/llvm/bin \
  HIP_INCLUDE_PATH=/opt/rocm-7.0/include \
  HIP_LIB_PATH=/opt/rocm-7.0/lib \
  HIP_DEVICE_LIB_PATH=/opt/rocm-7.0/lib/llvm/amdgcn/bitcode \
  PATH=/opt/rocm-7.0/bin:/opt/rocm-7.0/llvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
  LD_LIBRARY_PATH=/opt/rocm-7.0/lib:/opt/rocm-7.0/lib64:/opt/rocm-7.0/llvm/lib \
  LIBRARY_PATH=/opt/rocm-7.0/lib:/opt/rocm-7.0/lib64 \
  CPATH=/opt/rocm-7.0/include \
  PKG_CONFIG_PATH=/opt/rocm-7.0/lib/pkgconfig

RUN printf '%s\n' \
  'export ROCM_PATH=/opt/rocm-7.0' \
  'export HIP_PLATFORM=amd' \
  'export HIP_PATH=/opt/rocm-7.0' \
  'export HIP_CLANG_PATH=/opt/rocm-7.0/llvm/bin' \
  'export HIP_INCLUDE_PATH=/opt/rocm-7.0/include' \
  'export HIP_LIB_PATH=/opt/rocm-7.0/lib' \
  'export HIP_DEVICE_LIB_PATH=/opt/rocm-7.0/lib/llvm/amdgcn/bitcode' \
  'export PATH="$ROCM_PATH/bin:$HIP_CLANG_PATH:$PATH"' \
  'export LD_LIBRARY_PATH="$HIP_LIB_PATH:$ROCM_PATH/lib:$ROCM_PATH/lib64:$ROCM_PATH/llvm/lib"' \
  'export LIBRARY_PATH="$HIP_LIB_PATH:$ROCM_PATH/lib:$ROCM_PATH/lib64"' \
  'export CPATH="$HIP_INCLUDE_PATH"' \
  'export PKG_CONFIG_PATH="$ROCM_PATH/lib/pkgconfig"' \
  > /etc/profile.d/rocm.sh \
  && chmod +x /etc/profile.d/rocm.sh \
  && echo 'source /etc/profile.d/rocm.sh' >> /etc/bashrc

WORKDIR /opt/llama.cpp
RUN git clone --recursive https://github.com/ggerganov/llama.cpp.git . \
  && git clean -xdf \
  && git submodule update --recursive

RUN cmake -S . -B build \
  -DGGML_HIP=ON \
  -DAMDGPU_TARGETS=gfx1151 \
  -DCMAKE_BUILD_TYPE=Release \
  -DGGML_RPC=ON \
  -DLLAMA_HIP_UMA=ON \
  && cmake --build build --config Release -- -j$(nproc) \
  && cmake --install build --config Release

# keep bin; drop headers/docs/static libs (retain llama.cpp for rpc binaries)
RUN find /opt/rocm-7.0 -type f -name '*.a' -delete \
  && rm -rf /opt/rocm-7.0/include /opt/rocm-7.0/share \
  /opt/rocm-7.0/llvm/include /opt/rocm-7.0/llvm/share

# runtime
FROM registry.fedoraproject.org/fedora-minimal:43

RUN microdnf -y --nodocs --setopt=install_weak_deps=0 install \
  bash ca-certificates libatomic libstdc++ libgcc radeontop vim procps-ng \
  && microdnf clean all && rm -rf /var/cache/dnf/*

COPY --from=builder /opt/rocm-7.0 /opt/rocm-7.0
COPY --from=builder /usr/local/ /usr/local/
COPY --from=builder /opt/llama.cpp/build/bin/rpc-* /usr/local/bin/

# COPY gguf-vram-estimator.py /usr/local/bin/
# RUN chmod +x /usr/local/bin/gguf-vram-estimator.py

ENV ROCM_PATH=/opt/rocm-7.0 \
  HIP_PLATFORM=amd \
  HIP_PATH=/opt/rocm-7.0 \
  HIP_CLANG_PATH=/opt/rocm-7.0/llvm/bin \
  HIP_INCLUDE_PATH=/opt/rocm-7.0/include \
  HIP_LIB_PATH=/opt/rocm-7.0/lib \
  HIP_DEVICE_LIB_PATH=/opt/rocm-7.0/lib/llvm/amdgcn/bitcode \
  PATH=/opt/rocm-7.0/bin:/opt/rocm-7.0/llvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
  LD_LIBRARY_PATH=/opt/rocm-7.0/lib:/opt/rocm-7.0/lib64:/opt/rocm-7.0/llvm/lib \
  LIBRARY_PATH=/opt/rocm-7.0/lib:/opt/rocm-7.0/lib64 \
  CPATH=/opt/rocm-7.0/include \
  PKG_CONFIG_PATH=/opt/rocm-7.0/lib/pkgconfig

RUN printf '%s\n' \
  'export ROCM_PATH=/opt/rocm-7.0' \
  'export HIP_PLATFORM=amd' \
  'export HIP_PATH=/opt/rocm-7.0' \
  'export HIP_CLANG_PATH=/opt/rocm-7.0/llvm/bin' \
  'export HIP_INCLUDE_PATH=/opt/rocm-7.0/include' \
  'export HIP_LIB_PATH=/opt/rocm-7.0/lib' \
  'export HIP_DEVICE_LIB_PATH=/opt/rocm-7.0/lib/llvm/amdgcn/bitcode' \
  'export PATH="$ROCM_PATH/bin:$HIP_CLANG_PATH:$PATH"' \
  'export LD_LIBRARY_PATH="$HIP_LIB_PATH:$ROCM_PATH/lib:$ROCM_PATH/lib64:$ROCM_PATH/llvm/lib"' \
  'export LIBRARY_PATH="$HIP_LIB_PATH:$ROCM_PATH/lib:$ROCM_PATH/lib64"' \
  'export CPATH="$HIP_INCLUDE_PATH"' \
  'export PKG_CONFIG_PATH="$ROCM_PATH/lib/pkgconfig"' \
  > /etc/profile.d/rocm.sh \
  && chmod +x /etc/profile.d/rocm.sh \
  && echo 'source /etc/profile.d/rocm.sh' >> /etc/bashrc

# make /usr/local libs visible without touching env
RUN echo "/usr/local/lib"  > /etc/ld.so.conf.d/local.conf \
  && echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local.conf \
  && ldconfig

CMD ["/bin/bash"]

llama.cpp-നുള്ള ROCm backend, Vulkan-നെക്കാൾ ഏകദേശം 30% മികച്ച പെർഫോമൻസ് നൽകുന്നു. കാരണം ROCm AMD-യുടെ native GPU computing പ്ലാറ്റ്‌ഫോമാണ്; LLM inference പോലുള്ള compute-heavy വർക്ക്ലോഡുകൾക്കായി ഇത് ഒപ്റ്റിമൈസ് ചെയ്തിരിക്കുന്നു.

Docker Compose എൻട്രി:

qwen-3-coder-rocm:
  image: llamacpp-rocm
  container_name: llamacpp
  restart: unless-stopped
  devices:
    - /dev/dri:/dev/dri
    - /dev/kfd:/dev/kfd
  group_add:
    - "video"
    - "render"
  volumes:
    - /home/mark/running-llms/:/root/running-llms
  ports:
    - "8080:8080"
  security_opt:
    - seccomp=unconfined
  command: >
    bash -c "llama-server --alias Qwen3-Coder-30B -m /root/running-llms/hf-models/unsloth/Qwen3-Coder-30B-A3B-Instruct-1M-BF16/BF16/Qwen3-Coder-30B-A3B-Instruct-1M-BF16-00001-of-00002.gguf --ctx-size 262144 -fa 1 --no-mmap --host 0.0.0.0 --port 8080 --temp 0.7 --top-k 20 --min-p 0.01 --top-p 0.8 --repeat-penalty 1.05 --jinja -ngl 99 --threads -1"

മോഡലുകൾ പ്രവർത്തിപ്പിക്കൽ

Qwen3-Coder-Next (80B MoE)

ഇവിടെയാണ് Framework Desktop ശരിക്കും തിളങ്ങുന്നത്. 256K context window പൂർണ്ണമായും ഉപയോഗിച്ച് Qwen3-Coder-Next-ന്റെ മുഴുവൻ UD-Q8_K_XL വേർഷൻ എനിക്ക് പ്രവർത്തിപ്പിക്കാൻ കഴിയുന്നു.

ലിങ്കുകൾ:

മോഡൽ സ്പെസിഫിക്കേഷനുകൾ:

  • ആർക്കിടെക്ചർ: 80B MoE (3B active parameters)
  • Context Window: 262,144 tokens
  • ആവശ്യമായ മെമ്മറി: UD-Q8_K_XL (8-bit) ന് ~93.4 GB
  • ശുപാർശ ചെയ്യുന്ന സെറ്റിങ്ങുകൾ: temp=1.0, top_p=0.95, top_k=40, min_p=0.01

നിലവിലെ മോഡൽ സെറ്റപ്പ്

എന്റെ docker-compose.yml നിരവധി സേവനങ്ങൾ നിർവ്വചിക്കുന്നു:

ServiceBackendModelContext
qwen-3-coder-next-rocmROCmQwen3-Coder-Next (UD-Q8_K_XL)262k
qwen-3-coder-next-vulkanVulkanQwen3-Coder-Next262k
qwen-3-next-rocmROCmQwen3-Next-80B-A3B-Thinking32k
gpt-oss-rocmROCmgpt-oss-120b-GGUF131k
glm-4.7VulkanGLM-4.716k

ലോഞ്ച് കമാൻഡുകൾ

Ollama സർവീസ് ആരംഭിക്കുക:

cd ollama-vulkan
docker compose up -d

ഒരു പ്രത്യേക മോഡലിനായി llama.cpp ആരംഭിക്കുക:

docker compose up -d qwen-3-coder-next-rocm

എല്ലാ സേവനങ്ങളും നിർത്തുക:

docker compose down

ഏജെന്റിക് വർക്ക്‌ഫ്ലോകളും Claude Code-ഉം

ഈ കോൺഫിഗറേഷനിൽ പൂർണ്ണമായും സ്വയംഭരണ (fully autonomous) Claude Code സെഷനുകൾ പല മണിക്കൂറുകളായി ഞാൻ പ്രവർത്തിപ്പിച്ചുകൊണ്ടിരിക്കുന്നു. ഈ സ്വയംഭരണ സെഷനുകളിലൂടെ ഈ ലേഖനത്തിന്റെ ഭൂരിഭാഗവും Framework Desktop തന്നെ എഴുതിയതാണ്.

Claude Code കോൺഫിഗറേഷൻ

export ANTHROPIC_AUTH_TOKEN=ollama
export ANTHROPIC_API_KEY=""
export ANTHROPIC_BASE_URL=http://your-framework-desktop-ip:11434

claude --model qwen3-coder-next

കുറിപ്പ്: your-framework-desktop-ip നിങ്ങളുടെ യഥാർത്ഥ ഡൊമെയ്ൻ അല്ലെങ്കിൽ IP വിലാസം ആയി മാറ്റുക.

നിലവിലെ പ്രശ്നങ്ങൾ

ഏജെന്റിക് വർക്ക്‌ഫ്ലോകളിൽ Ollama-യുമായി ബന്ധപ്പെട്ട് ഒരു പ്രശ്നം ഞാൻ കണ്ടിട്ടുണ്ട് - Ollama issue #13939 കാണുക. Claude Code ചിലപ്പോഴൊക്കെ ലോക്കലായി ലഭ്യമല്ലാത്ത മോഡൽ പേരുകൾ ഉപയോഗിക്കാൻ ശ്രമിക്കുന്നു; അതിന്റെ ഫലമായി timeouts ഉണ്ടാകുന്നു.

Workaround: എന്റെ സെറ്റപ്പിൽ ഏജെന്റിക് വർക്ക്‌ഫ്ലോകൾക്കായി llama.cpp നേരിട്ട് ഉപയോഗിക്കുന്നത് കൂടുതൽ വിശ്വസനീയമായ ഫലങ്ങൾ നൽകുന്നു. സ്ഥിരതയും തുടർച്ചയായ ഒരേ നിലവാരത്തിലുള്ള പ്രവർത്തനവും വ്യക്തമായി മികച്ചതാണ്.

ഈ സെറ്റപ്പിനോട് ഞാൻ അതീവ സന്തോഷപ്പെട്ടിരിക്കുന്നതെന്തുകൊണ്ട്

സൗജന്യമായി അനന്തമായ "Tokens"

ഈ കോൺഫിഗറേഷൻ എനിക്ക് 24x7 സൗജന്യമായി അനന്തമായ LLM ടോക്കണുകൾ "ചുടാൻ" അനുവദിക്കുന്നു. പെയ്ഡ് മോഡലുകൾ വേഗമേറിയതാണെങ്കിലും, ഈ സെറ്റപ്പ് നൽകുന്നത്:

  • വിവിധ മോഡലുകളിലും പ്രോംപ്റ്റുകളിലും അവസാനമില്ലാത്ത പരീക്ഷണങ്ങൾ
  • ദീർഘനേരം ഓടുന്ന സ്വയംഭരണ ഏജന്റ് സെഷനുകൾ
  • ഓരോ ടോക്കണിനും ചെലവ് എന്ന ആശങ്ക ഇല്ല
  • പൂർണ്ണ ഡാറ്റ പ്രൈവസിയും ഓഫ്‌ലൈൻ പ്രവർത്തനവും

പെർഫോമൻസ് സവിശേഷതകൾ

  • പെയ്ഡ് മോഡലുകളേക്കാൾ മന്ദം: അതെ, പക്ഷേ മിക്ക ജോലികൾക്കും വ്യത്യാസം സ്വീകരിക്കാവുന്നതാണ്
  • കോഡിങ്ങിന് കൂടുതൽ നല്ലത്: ലോക്കൽ മോഡലുകൾ code completion-ലും understanding-ലും മികവാണ്
  • അപരിമിത context: Qwen3-Coder-Next-യിലെ 256K context window game-changing ആണ്

ഭാവി

ഈ കോൺഫിഗറേഷൻ അസാധാരണമായി പ്രൊഡക്ടീവ് ആയിരുന്നു. ഇപ്പോൾ ഞാൻ:

  • മണിക്കൂറുകളോളം fully autonomous Claude Code സെഷനുകൾ ഓടിക്കുന്നു
  • വ്യത്യസ്ത quantisations-കളും മോഡൽ ആർക്കിടെക്ചറുകളും പരീക്ഷിക്കുന്നു
  • ലോക്കൽ GPU പ്രയോജനപ്പെടുത്തുന്ന കസ്റ്റം agent workflows ഡെവലപ് ചെയ്യുന്നു

എന്റെ Claude Code സെറ്റപ്പിനെയും ഈ ലോക്കൽ മോഡലുകളുമായി പ്രവർത്തിക്കുന്നവിധം എങ്ങനെ കോൺഫിഗർ ചെയ്യുന്നതെന്നും കുറിച്ച് ഉടൻ ഒരു ലേഖനം കൂടി ഞാൻ ചേർക്കും.

അട്രിബ്യൂഷനും നന്ദിയും

ഓപ്പൺ-സോഴ്‌സ് കമ്മ്യൂണിറ്റിയുടെ അത്ഭുതകരമായ പ്രവർത്തനം ഇല്ലാതെ ഈ സെറ്റപ്പ് സാധ്യമാകില്ലായിരുന്നു. താഴെപ്പറയുന്നവർക്കു വലിയ നന്ദി:

  • kyuz0/amd-strix-halo-toolboxes - Vulkan, ROCm backends-ിനുള്ള pre-built ഇമേജുകളോടുകൂടിയ Docker കണ്ടെയ്നറുകൾക്കുള്ള പ്രചോദനം
  • technigmaai-wiki - GPU മെമ്മറി കോൺഫിഗറേഷനായി സമഗ്രമായ step-by-step നിർദ്ദേശങ്ങൾ
  • lhl/strix-halo-testing - Strix Halo-ക്കായുള്ള വിശദമായ LLM benchmarking സെറ്റപ്പ്
  • Unsloth - അതിമനോഹരമായ GGUF-optimized മോഡലുകൾ നൽകുന്നതിന്
  • ROCm - ഓപ്പൺ GPU സോഫ്റ്റ്‌വെയർ സ്റ്റാക്ക്
  • llama.cpp - ggerganov-ിന്റെയും സംഭാവനകരുടേയും അത്ഭുതകരമായ പ്രവർത്തനം

ഈ റിസോഴ്‌സുകൾ വലിയ പരിശ്രമത്തെ പ്രതിനിധീകരിക്കുന്നു; AMD ഹാർഡ്‌വെയറിലെ ലോക്കൽ LLM inference-ന്റെ cutting edge-നെയും ഇവ പ്രതിനിധീകരിക്കുന്നു.