Mark Stratmann
Running LLMs Background

Menjalankan LLM Lokal di Framework Desktop (Max+ 395 - 128GB)

Jalankan LLM lokal menggunakan llama.cpp dan Ollama dengan kontainer Docker

Artikel ini mendokumentasikan bagaimana saya mengonfigurasi Framework Desktop PC saya (Max+ 395 dengan 128GB unified memory) untuk menjalankan LLM lokal menggunakan llama.cpp dan Ollama dengan kontainer Docker.

Ikhtisar Perangkat Keras

Framework Desktop Max+ 395 menggunakan prosesor AMD Ryzen AI Max 395 dengan grafis Radeon terintegrasi (Strix Halo), dengan fitur:

  • 128GB unified memory (berbagi CPU/GPU)
  • Arsitektur AMD RDNA 3.5
  • Target GPU gfx1151

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

Konfigurasi Memori GPU

Untuk mengaktifkan penuh 128GB unified memory untuk beban kerja GPU, diperlukan konfigurasi berikut. Instruksi ini mensintesis panduan berbasis Ubuntu dari technigmaai-wiki dengan pengaturan benchmark LLM dari lhl/strix-halo-testing untuk Fedora 43.

Pengaturan BIOS

  1. Restart dan masuk ke BIOS/UEFI
  2. Setel Integrated Graphics/UMA Frame Buffer Size ke 512MB
  3. Nonaktifkan IOMMU

Konfigurasi GRUB Fedora 43

Edit /etc/default/grub dan modifikasi baris GRUB_CMDLINE_LINUX_DEFAULT:

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

Lalu perbarui GRUB dan reboot:

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

Verifikasi Pengaturan Memori

Setelah reboot, verifikasi bahwa parameternya sudah diterapkan:

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

Konfigurasi ini mengaktifkan sekitar 128GB memori GTT untuk beban kerja GPU, yang penting untuk menjalankan model besar seperti Qwen3-Coder-Next dengan context window 256K.

Konfigurasi Modul Kernel Alternatif

Untuk kontrol yang lebih granular, buat /etc/modprobe.d/amdgpu_llm_optimized.conf:

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

Lalu regenerasi initramfs:

sudo dracut --force

Mengapa Fedora 43 untuk LLM?

Walaupun banyak panduan menargetkan Ubuntu, Fedora 43 menawarkan beberapa keunggulan untuk beban kerja LLM lokal:

Kernel Lebih Baru: Fedora 43 hadir dengan kernel 6.18.4+, yang menyediakan dukungan lebih baik untuk ROCm 7.x dan GPU Ryzen AI Max 395

Dukungan ROCm Lebih Baik: Peningkatan driver AMDGPU pada kernel Linux yang lebih baru menghasilkan manajemen unified memory dan alokasi VRAM yang lebih baik untuk beban kerja LLM

Kebaruan Paket: Model rolling release Fedora menyediakan versi yang lebih baru untuk dependensi kunci, seperti:

  • LLVM/Clang untuk kompilasi HIP
  • Driver Vulkan (Mesa RADV/AMDVLK)
  • CMake dan toolchain build
  1. Pertimbangan SELinux: Walaupun SELinux memerlukan konfigurasi tambahan (seperti container_use_devices=1), SELinux memberikan isolasi keamanan yang lebih baik untuk beban kerja LLM berbasis kontainer

Sumber utama yang menjadi dasar pendekatan ini adalah:

Kontainer LLM Berbasis Docker

Saya membuat kontainer Docker berbasis kyuz0/amd-strix-halo-toolboxes untuk menjalankan llama.cpp dan Ollama.

Prasyarat Kontainer

Sebelum menjalankan kontainer apa pun, aktifkan SELinux agar kontainer dapat mengakses perangkat GPU:

sudo setsebool container_use_devices=1

Ini adalah konfigurasi satu kali yang perlu persisten antar-reboot:

sudo setsebool -P container_use_devices=1

Ollama dengan Vulkan (Berfungsi)

Backend Vulkan berfungsi sempurna dengan Ollama di 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"]

Jalankan Ollama dengan 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

Akses Ollama:

ollama list
ollama pull qwen3-coder-next

Ollama dengan ROCm (Tidak Berfungsi - Menunggu Perbaikan)

Implementasi ROCm untuk Ollama saat ini tidak berfungsi di Fedora 43 dengan ROCm 7.x. Isu ini dilacak di 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"]

Backend ROCm gagal dengan error "out of memory" bahkan ketika sistem melaporkan ~111GB VRAM tersedia. Ini tampaknya regresi di ROCm 7.2 yang memengaruhi perhitungan memori Ollama.

Status Saat Ini: Menunggu perbaikan upstream dari tim AMD/ROCm.

llama.cpp dengan 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"]

Backend Vulkan untuk llama.cpp stabil dan sudah teruji dengan baik. Ini memberikan performa yang andal untuk semua ukuran model.

Entri 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 dengan ROCm (Lebih Cepat - Peningkatan Performa ~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"]

Backend ROCm untuk llama.cpp memberikan performa sekitar 30% lebih baik dibanding Vulkan. Ini karena ROCm adalah platform komputasi GPU native milik AMD, yang dioptimalkan untuk beban kerja berat komputasi seperti inferensi LLM.

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

Menjalankan Model

Qwen3-Coder-Next (80B MoE)

Di sinilah Framework Desktop benar-benar unggul. Saya dapat menjalankan versi penuh UD-Q8_K_XL dari Qwen3-Coder-Next dengan context window lengkap 256K.

Tautan:

Spesifikasi model:

  • Arsitektur: 80B MoE (3B parameter aktif)
  • Context Window: 262.144 token
  • Memori yang Dibutuhkan: ~93,4 GB untuk UD-Q8_K_XL (8-bit)
  • Pengaturan yang Direkomendasikan: temp=1.0, top_p=0.95, top_k=40, min_p=0.01

Pengaturan Model Saat Ini

docker-compose.yml saya mendefinisikan beberapa layanan:

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

Perintah Menjalankan

Jalankan layanan Ollama:

cd ollama-vulkan
docker compose up -d

Jalankan llama.cpp untuk model tertentu:

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

Hentikan semua layanan:

docker compose down

Alur Kerja Agentic dan Claude Code

Saya menjalankan sesi Claude Code yang sepenuhnya otonom selama berjam-jam pada konfigurasi ini. Framework Desktop telah menulis sebagian besar artikel ini melalui sesi-sesi otonom tersebut.

Konfigurasi 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

Catatan: Ganti your-framework-desktop-ip dengan domain atau alamat IP Anda yang sebenarnya.

Masalah Saat Ini

Saya menemui satu masalah dengan Ollama dalam alur kerja agentic - lihat Ollama issue #13939. Claude Code terkadang mencoba menggunakan nama model yang tidak tersedia secara lokal, sehingga terjadi timeout.

Solusi Sementara: Menggunakan llama.cpp secara langsung memberikan hasil yang lebih andal untuk alur kerja agentic pada setup saya. Stabilitas dan konsistensinya terasa jauh lebih baik.

Mengapa Saya Sangat Senang dengan Pengaturan Ini

"Token" Tak Terbatas Gratis

Konfigurasi ini memungkinkan saya "membakar" token LLM tak terbatas 24x7 secara gratis. Walaupun model berbayar lebih cepat, setup ini memungkinkan:

  • Eksperimen tanpa henti dengan berbagai model dan prompt
  • Sesi agen otonom yang berjalan lama
  • Tidak perlu khawatir biaya per token
  • Privasi data penuh dan operasi offline

Karakteristik Performa

  • Lebih lambat daripada model berbayar: Ya, tetapi perbedaannya dapat diterima untuk sebagian besar tugas
  • Lebih baik untuk coding: Model lokal unggul dalam penyelesaian dan pemahaman kode
  • Context tak terbatas: Context window 256K pada Qwen3-Coder-Next benar-benar mengubah permainan

Masa Depan

Konfigurasi ini sangat produktif. Sekarang saya:

  • Menjalankan sesi Claude Code yang sepenuhnya otonom selama berjam-jam
  • Bereksperimen dengan berbagai kuantisasi dan arsitektur model
  • Mengembangkan alur kerja agen kustom yang memanfaatkan GPU lokal

Saya akan segera menambahkan artikel tentang setup Claude Code saya dan bagaimana saya mengonfigurasinya agar bekerja dengan model-model lokal ini.

Atribusi dan Terima Kasih

Setup ini tidak akan mungkin terwujud tanpa kerja luar biasa dari komunitas open-source. Terima kasih sebesar-besarnya kepada:

  • kyuz0/amd-strix-halo-toolboxes - Inspirasi untuk kontainer Docker, dengan image siap pakai untuk backend Vulkan dan ROCm
  • technigmaai-wiki - Instruksi langkah demi langkah yang komprehensif untuk konfigurasi memori GPU
  • lhl/strix-halo-testing - Setup benchmark LLM yang detail untuk Strix Halo
  • Unsloth - Menyediakan model luar biasa yang dioptimalkan untuk GGUF
  • ROCm - Stack perangkat lunak GPU terbuka
  • llama.cpp - Karya luar biasa dari ggerganov dan para kontributor

Sumber-sumber ini merepresentasikan upaya yang signifikan dan berada di garis terdepan inferensi LLM lokal di perangkat keras AMD.