Mark Stratmann
Running LLMs Background

تشغيل نماذج LLM المحلية على Framework Desktop (Max+ 395 - 128GB)

شغّل نماذج LLM محلية باستخدام كلٍّ من llama.cpp وOllama عبر حاويات Docker

تُوثّق هذه المقالة كيفية إعدادي لحاسوب Framework Desktop PC (Max+ 395 مع ذاكرة موحّدة بسعة 128GB) لتشغيل نماذج LLM محلياً باستخدام كلٍّ من llama.cpp وOllama عبر حاويات Docker.

نظرة عامة على العتاد

يأتي Framework Desktop Max+ 395 بمعالج AMD Ryzen AI Max 395 مع رسوميات Radeon مدمجة (Strix Halo)، ويتميّز بـ:

  • ذاكرة موحّدة بسعة 128GB (مشتركة بين CPU/GPU)
  • معمارية AMD RDNA 3.5
  • هدف GPU من نوع gfx1151

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

تهيئة ذاكرة الـGPU

لتمكين كامل 128GB من الذاكرة الموحّدة لأحمال عمل الـGPU، يلزم الإعداد التالي. تجمع هذه التعليمات بين الدليل المعتمد على Ubuntu من technigmaai-wiki وإعدادات قياس أداء LLM من lhl/strix-halo-testing على Fedora 43.

إعداد BIOS

  1. أعد التشغيل وادخل إلى BIOS/UEFI
  2. اضبط Integrated Graphics/UMA Frame Buffer Size على 512MB
  3. قم بتعطيل IOMMU

تهيئة GRUB على Fedora 43

حرّر الملف /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

تُفعّل هذه التهيئة حوالي 128GB من ذاكرة GTT لأحمال عمل الـGPU، وهو أمر أساسي لتشغيل نماذج كبيرة مثل Qwen3-Coder-Next مع نافذة سياق 256K.

**تهيئة بديلة لوحدة نواة (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

لماذا Fedora 43 لنماذج LLM؟

بينما تستهدف العديد من الأدلة Ubuntu، يقدّم Fedora 43 عدة مزايا لأحمال عمل LLM المحلية:

نواة أحدث: يأتي Fedora 43 مع نواة 6.18.4+، ما يوفر دعماً أفضل لـ ROCm 7.x وGPU الخاص بـ Ryzen AI Max 395

دعم أفضل لـ ROCm: تحسينات سائق AMDGPU في النواة ضمن الإصدارات الأحدث تترجم إلى إدارة أفضل للذاكرة الموحّدة وتخصيص VRAM لأحمال عمل LLM

حداثة الحزم: نموذج الإصدارات المتدحرجة لدى Fedora يوفّر إصدارات أحدث من الاعتماديات الأساسية، مثل:

  • LLVM/Clang لترجمة HIP
  • تعريفات Vulkan (Mesa RADV/AMDVLK)
  • CMake وسلاسل أدوات البناء
  1. اعتبارات SELinux: رغم أن SELinux يتطلب إعداداً إضافياً (مثل container_use_devices=1)، فإنه يوفّر عزلاً أمنياً أفضل لأحمال عمل LLM المُحَوْسَبة داخل الحاويات

المصادر الأساسية التي أرشدت هذا النهج هي:

حاويات LLM المعتمدة على Docker

أنشأتُ حاويات Docker مبنية على kyuz0/amd-strix-halo-toolboxes لتشغيل كلٍّ من llama.cpp وOllama.

متطلبات الحاويات

قبل تشغيل أي حاويات، فعّل SELinux للسماح للحاويات بالوصول إلى أجهزة الـGPU:

sudo setsebool container_use_devices=1

هذا إعداد لمرة واحدة ويجب أن يستمر عبر عمليات إعادة التشغيل:

sudo setsebool -P container_use_devices=1

Ollama مع Vulkan (يعمل)

تعمل الواجهة الخلفية Vulkan بشكل مثالي مع Ollama على Fedora 43.

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"]

تشغيل Ollama مع Vulkan:

# 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

Ollama مع ROCm (لا يعمل - بانتظار الإصلاح)

إن تنفيذ ROCm الخاص بـ Ollama لا يعمل حالياً على Fedora 43 مع ROCm 7.x. تتم متابعة المشكلة في مشكلة ROCm رقم #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"]

تفشل الواجهة الخلفية ROCm برسائل خطأ "out of memory" حتى عندما يبلّغ النظام عن توفر ~111GB من VRAM. يبدو أن ذلك تراجع (regression) في ROCm 7.2 يؤثر على حساب الذاكرة في Ollama.

الحالة الحالية: بانتظار إصلاح من فريق AMD/ROCm في المصدر upstream.

llama.cpp مع Vulkan

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"]

تُعد واجهة Vulkan الخلفية لـ llama.cpp مستقرة ومجرّبة بشكل جيد. وهي تقدّم أداءً موثوقاً لجميع أحجام النماذج.

مدخل 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"

llama.cpp مع ROCm (أسرع - زيادة أداء ~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"]

توفّر الواجهة الخلفية ROCm لـ llama.cpp أداءً أفضل بحوالي 30% مقارنةً بـ Vulkan. وذلك لأن ROCm هي منصة AMD الأصلية للحوسبة على الـGPU، والمُحسّنة لأحمال العمل الثقيلة حسابياً مثل استدلال (inference) نماذج LLM.

مدخل 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 فعلاً. يمكنني تشغيل النسخة الكاملة UD-Q8_K_XL من Qwen3-Coder-Next مع نافذة السياق الكاملة 256K.

الروابط:

مواصفات النموذج:

  • المعمارية: 80B MoE (3B معاملات نشطة)
  • نافذة السياق: 262,144 توكن
  • الذاكرة المطلوبة: ~93.4 GB لنسخة UD-Q8_K_XL (8-bit)
  • الإعدادات الموصى بها: 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

أقوم بتشغيل جلسات 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 رقم #13939. يحاول Claude Code أحياناً استخدام أسماء نماذج غير متاحة محلياً، ما يؤدي إلى انتهاء المهلة.

الحل الالتفافي (Workaround): استخدام llama.cpp مباشرةً يعطي نتائج أكثر موثوقية لسير العمل الوكيلي على إعدادي. الاستقرار والثبات أفضل بشكل ملحوظ.

لماذا أنا متحمّس جداً لهذا الإعداد

"توكنز" لا نهائية مجاناً

يسمح لي هذا الإعداد بـ"حرق" توكنز LLM بلا حدود 24x7 مجاناً. ورغم أن النماذج المدفوعة أسرع، فإن هذا الإعداد يتيح:

  • تجارب بلا نهاية مع نماذج مختلفة ومحفزات (prompts) متنوعة
  • جلسات وكلاء ذاتية طويلة التشغيل
  • دون تكاليف لكل توكن تقلق بشأنها
  • خصوصية بيانات كاملة وتشغيل دون اتصال

خصائص الأداء

  • أبطأ من النماذج المدفوعة: نعم، لكن الفارق مقبول لمعظم المهام
  • أفضل للبرمجة: النماذج المحلية ممتازة في إكمال الشيفرة وفهمها
  • سياق غير محدود: نافذة سياق 256K على Qwen3-Coder-Next تغيّر قواعد اللعبة

المستقبل

كان هذا الإعداد منتجاً للغاية. أنا الآن:

  • أشغّل جلسات Claude Code ذاتية بالكامل لساعات
  • أجرّب درجات quantisation مختلفة ومعماريات نماذج متعددة
  • أطوّر مسارات عمل وكلاء مخصصة تستفيد من الـGPU المحلي

سأضيف قريباً مقالة عن إعداد Claude Code لدي وكيف أهيّئه للعمل مع هذه النماذج المحلية.

الإسناد والشكر

لم يكن هذا الإعداد ممكناً لولا العمل المذهل من مجتمع المصادر المفتوحة. جزيل الشكر إلى:

  • kyuz0/amd-strix-halo-toolboxes - الإلهام لحاويات Docker، مع صور جاهزة مسبقاً لواجهات Vulkan وROCm الخلفية
  • technigmaai-wiki - تعليمات شاملة خطوة بخطوة لتهيئة ذاكرة الـGPU
  • lhl/strix-halo-testing - إعداد تفصيلي لقياس أداء LLM على Strix Halo
  • Unsloth - توفير نماذج مذهلة محسّنة لـ GGUF
  • ROCm - حزمة البرمجيات المفتوحة للـGPU
  • llama.cpp - العمل الرائع من ggerganov والمساهمين

تمثل هذه الموارد جهداً كبيراً وتمثل أحدث ما وصلت إليه استدلالات LLM المحلية على عتاد AMD.