এই নিবন্ধে আমি কীভাবে আমার Framework Desktop PC (Max+ 395, 128GB ইউনিফাইড মেমরি) কনফিগার করেছি যাতে Docker কনটেইনার ব্যবহার করে llama.cpp এবং Ollama—দুটো দিয়েই লোকাল LLM চালানো যায়, তা নথিভুক্ত করেছি।
হার্ডওয়্যার ওভারভিউ
Framework Desktop Max+ 395-এ রয়েছে ইন্টিগ্রেটেড Radeon গ্রাফিক্স (Strix Halo) সহ AMD Ryzen AI Max 395 প্রসেসর, বৈশিষ্ট্যসমূহ:
- 128GB ইউনিফাইড মেমরি (CPU/GPU শেয়ারড)
- AMD RDNA 3.5 আর্কিটেকচার
- gfx1151 GPU টার্গেট
https://frame.work/gb/en/desktop
GPU মেমরি কনফিগারেশন
GPU ওয়ার্কলোডের জন্য ইউনিফাইড মেমরির পুরো 128GB সক্রিয় করতে নিচের কনফিগারেশন দরকার। এই নির্দেশনাগুলো technigmaai-wiki-এর Ubuntu-ভিত্তিক গাইড এবং lhl/strix-halo-testing-এর Fedora 43-এর জন্য LLM বেঞ্চমার্ক সেটআপ—দুটোকে একত্র করে তৈরি করা হয়েছে Fedora 43.
BIOS সেটআপ
- রিবুট করে BIOS/UEFI-তে ঢুকুন
- Integrated Graphics/UMA Frame Buffer Size-কে 512MB সেট করুন
- 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 মেমরি সক্রিয় করে, যা 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
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 ড্রাইভার উন্নয়নগুলো LLM ওয়ার্কলোডের জন্য আরও ভালো ইউনিফাইড মেমরি ম্যানেজমেন্ট এবং VRAM বরাদ্দে সহায়তা করে
প্যাকেজের নতুনত্ব: Fedora-এর rolling release মডেল গুরুত্বপূর্ণ ডিপেনডেন্সিগুলোর আরও নতুন ভার্সন দেয়, যেমন:
- HIP কম্পাইলেশনের জন্য LLVM/Clang
- Vulkan ড্রাইভার (Mesa RADV/AMDVLK)
- CMake এবং build toolchains
- SELinux বিবেচনা: SELinux অতিরিক্ত কনফিগারেশন (যেমন
container_use_devices=1) চাইলেও, কনটেইনারাইজড LLM ওয়ার্কলোডের জন্য এটি আরও ভালো সিকিউরিটি আইসোলেশন দেয়
এই পদ্ধতিটি গঠনে যে মূল সোর্সগুলো সাহায্য করেছে:
Docker-ভিত্তিক LLM কনটেইনার
আমি kyuz0/amd-strix-halo-toolboxes ভিত্তি করে Docker কনটেইনার তৈরি করেছি যাতে llama.cpp এবং Ollama—দুটোই চালানো যায়।
কনটেইনারের প্রয়োজনীয়তা
যে কোনো কনটেইনার চালানোর আগে, কনটেইনারকে GPU ডিভাইসে অ্যাক্সেস দিতে SELinux সক্রিয় করুন:
sudo setsebool container_use_devices=1
এটি একবারের কনফিগারেশন, যা রিবুটের পরও বজায় থাকতে হবে:
sudo setsebool -P container_use_devices=1
Vulkan সহ Ollama (কাজ করছে)
Vulkan backend Fedora 43-এ Ollama-এর সাথে একদম ঠিকঠাক কাজ করে.
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 ইমপ্লিমেন্টেশন বর্তমানে Fedora 43-এ ROCm 7.x সহ কাজ করে না। সমস্যাটি ট্র্যাক হচ্ছে 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" এরর দিচ্ছে। এটি সম্ভবত ROCm 7.2-এ একটি রিগ্রেশন, যা Ollama-এর মেমরি ক্যালকুলেশনকে প্রভাবিত করছে।
বর্তমান অবস্থা: 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-এর নেটিভ GPU কম্পিউটিং প্ল্যাটফর্ম, যা 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 কনটেক্সট উইন্ডোসহ Qwen3-Coder-Next-এর সম্পূর্ণ UD-Q8_K_XL ভার্সন চালাতে পারি।
লিংকসমূহ:
মডেলের স্পেসিফিকেশন:
- আর্কিটেকচার: 80B MoE (3B active parameters)
- কনটেক্সট উইন্ডো: 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 একাধিক সার্ভিস ডিফাইন করে:
| সার্ভিস | ব্যাকএন্ড | মডেল | কনটেক্সট |
|---|---|---|---|
| qwen-3-coder-next-rocm | ROCm | Qwen3-Coder-Next (UD-Q8_K_XL) | 262k |
| qwen-3-coder-next-vulkan | Vulkan | Qwen3-Coder-Next | 262k |
| qwen-3-next-rocm | ROCm | Qwen3-Next-80B-A3B-Thinking | 32k |
| gpt-oss-rocm | ROCm | gpt-oss-120b-GGUF | 131k |
| glm-4.7 | Vulkan | GLM-4.7 | 16k |
লঞ্চ কমান্ড
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 issue #13939। Claude Code মাঝে মাঝে এমন মডেল নাম ব্যবহার করতে চেষ্টা করে যা লোকালি উপলব্ধ নয়, ফলে টাইমআউট হয়।
ওয়ার্কঅ্যারাউন্ড: আমার সেটআপে এজেন্টিক ওয়ার্কফ্লোর জন্য সরাসরি llama.cpp ব্যবহার করলে আরও নির্ভরযোগ্য ফল পাওয়া যায়। স্থিতিশীলতা ও ধারাবাহিকতা চোখে পড়ার মতো ভালো।
এই সেটআপে আমি কেন রোমাঞ্চিত
ফ্রি-তে অসীম "টোকেন"
এই কনফিগারেশন আমাকে ফ্রি-তে 24x7 অসীম LLM টোকেন “burn” করতে দেয়। পেইড মডেলগুলো দ্রুত হলেও, এই সেটআপ সক্ষম করে:
- বিভিন্ন মডেল ও প্রম্পট নিয়ে অনন্ত পরীক্ষানিরীক্ষা
- দীর্ঘমেয়াদি স্বয়ংক্রিয় এজেন্ট সেশন
- per-token খরচ নিয়ে কোনো দুশ্চিন্তা নেই
- সম্পূর্ণ ডাটা প্রাইভেসি এবং অফলাইন অপারেশন
পারফরম্যান্স বৈশিষ্ট্য
- পেইড মডেলের চেয়ে ধীর: হ্যাঁ, তবে বেশিরভাগ কাজের জন্য পার্থক্য গ্রহণযোগ্য
- কোডিং-এর জন্য ভালো: লোকাল মডেলগুলো কোড কমপ্লিশন ও বোঝার ক্ষেত্রে দারুণ
- আনলিমিটেড কনটেক্সট: Qwen3-Coder-Next-এর 256K কনটেক্সট উইন্ডো গেম-চেঞ্জিং
ভবিষ্যৎ
এই কনফিগারেশন আমার কাজকে অসাধারণভাবে প্রোডাক্টিভ করেছে। এখন আমি:
- ঘণ্টার পর ঘণ্টা সম্পূর্ণ স্বয়ংক্রিয় Claude Code সেশন চালাচ্ছি
- বিভিন্ন quantisation এবং মডেল আর্কিটেকচার নিয়ে পরীক্ষানিরীক্ষা করছি
- লোকাল GPU কাজে লাগিয়ে কাস্টম এজেন্ট ওয়ার্কফ্লো ডেভেলপ করছি
শিগগিরই আমি আমার Claude Code সেটআপ এবং কীভাবে এটি এই লোকাল মডেলগুলোর সাথে কাজ করানোর জন্য কনফিগার করি—তা নিয়ে একটি নিবন্ধ যোগ করব।
অ্যাট্রিবিউশন এবং ধন্যবাদ
ওপেন-সোর্স কমিউনিটির অবিশ্বাস্য কাজ ছাড়া এই সেটআপ সম্ভব হতো না। বিশাল ধন্যবাদ:
- kyuz0/amd-strix-halo-toolboxes - Docker কনটেইনারগুলোর অনুপ্রেরণা; Vulkan এবং ROCm backend-এর জন্য প্রি-বিল্ট ইমেজসহ
- technigmaai-wiki - GPU মেমরি কনফিগারেশনের জন্য বিস্তৃত step-by-step নির্দেশনা
- lhl/strix-halo-testing - Strix Halo-এর জন্য বিস্তারিত LLM বেঞ্চমার্কিং সেটআপ
- Unsloth - অসাধারণ GGUF-optimized মডেল সরবরাহ করার জন্য
- ROCm - ওপেন GPU সফটওয়্যার স্ট্যাক
- llama.cpp - ggerganov এবং কনট্রিবিউটরদের অসাধারণ কাজ
এই রিসোর্সগুলো উল্লেখযোগ্য পরিশ্রমের ফল, এবং AMD হার্ডওয়্যারে লোকাল LLM inference-এর cutting edge-কে প্রতিনিধিত্ব করে।
