Однажды захотел я установить Ubuntu 24.04 для локального запуска LLM-моделей. Поскольку моя система полностью на базе AMD (процессор Ryzen 7600 и видеокарта Radeon RX 9060 XT), логичным выбором стал стек ROCm

Однако быстрого и понятного руководства «от и до» для свежего Ubuntu 24.04 я не нашёл — даже нейросети давали устаревшие или фрагментированные советы.

В этой статье я подробно разберу весь путь: от установки драйверов ROCm до получения первого ответа от модели через Python-скрипт. Надеюсь, этот гайд сэкономит время тем, кто столкнётся с аналогичной задачей.

1. Установка системы и драйверов ROCm

Сам процесс установки Ubuntu 24.04 опущу — с ним справится каждый. Но был нюанс: с активной дискретной картой RX 9060 XT установщик Ubuntu отказался работать, постоянно зависал без видимых причин. Пришлось временно переключить монитор на встроенную графику (iGPU), установить систему, поставить драйверы и только затем вернуться к дискретной карте.

Первым и самым важным шагом является установка драйверов и ПО ROCm. Действуем по официальной инструкции AMD.

Открываем терминал и выполняем следующие команды:

# Скачиваем и устанавливаем пакет amdgpu-install
wget https://repo.radeon.com/amdgpu-install/7.1.1/ubuntu/noble/amdgpu-install_7.1.1.70101-1_all.deb
sudo apt install ./amdgpu-install_7.1.1.70101-1-1_all.deb

# Обновляем списки пакетов и устанавливаем необходимые компоненты
sudo apt update
sudo apt install python3-setuptools python3-wheel

# Добавляем текущего пользователя в необходимые группы для доступа к GPU
sudo usermod -a -G render,video $LOGNAME

# Устанавливаем ROCm
sudo apt install rocm

Теперь можно перезагрузиться и переключится на дискретную видеокарту

Небольшой бонус: я привык к переключению раскладки клавиатуры как в Windows (Alt+Shift). В Ubuntu по умолчанию такой опции нет, но её легко добавить одной командой:

gsettings set org.gnome.desktop.wm.keybindings switch-input-source "['<Alt>Shift_L']"

2. Установка Docker

Для запуска llama.cpp я выбрал Docker-образ от AMD. Это удобно, изолированно и не засоряет систему.

Добавляем официальные репозитории Docker и устанавливаем:

# Добавляем GPG-ключ Docker
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Добавляем репозиторий в источники Apt
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update

# Устанавливаем Docker
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Проверяем, что служба запущена
sudo systemctl status docker

# Добавляем текущего пользователя в группу docker (чтобы не использовать sudo)
sudo usermod -aG docker $USER
newgrp docker

Для применения изменений с группой нужно выйти из системы и залогиниться заново (или просто запустить новую сессию терминала).

3. Запуск llama.cpp в Docker

Переходим к ключевому этапу — запуску модели. На странице документации AMD по llama.cpp доступно несколько образов. Для себя выбрал образ server.

  1. Скачиваем образ:

    docker pull rocm/llama.cpp:llama.cpp-b6652.amd0_rocm7.0.0_ubuntu24.04_server
  2. Скачиваем модель. Например, с Hugging Face. Я использовал квантованную модель в формате GGUF (например, gpt-oss-20b-UD-Q4_K_XL.gguf). Сохраните её в удобную директорию, например, /mnt/f_disk/llm.

  3. Запускаем контейнер. Команда выглядит объёмно, но каждый параметр важен для работы ROCm внутри контейнера:

    docker run --privileged \
      --network=host \
      --device=/dev/kfd \
      --device=/dev/dri \
      --group-add video \
      --cap-add=SYS_PTRACE \
      --security-opt seccomp=unconfined \
      --ipc=host \
      --shm-size 16G \
      -v /mnt/f_disk/llm:/data \
      rocm/llama.cpp:llama.cpp-b6652.amd0_rocm7.0.0_ubuntu24.04_server \
      -m /data/gpt-oss-20b-UD-Q4_K_XL.gguf \
      --port 8081 \
      --host 0.0.0.0 \
      -n 512 \
      --n-gpu-layers 999

    -v /mnt/f_disk/llm:/data — монтирует вашу папку с моделями в контейнер.

    -m /data/... — указывает путь к модели внутри контейнера.

    --n-gpu-layers 999 — загружает максимально возможное количество слоёв на GPU для ускорения.

ВАЖНОЕ ПРЕДУПРЕЖДЕНИЕ: Если в системе есть встроенная графика (iGPU), она может вызвать конфликт. Я столкнулся с ошибкой:

ggml_cuda_compute_forward: MUL_MAT failed
ROCm error: invalid device function
current device: 1

Проблема решилась только отключением встроенной видеокарты в BIOS. Альтернативные методы (например, явное указание устройства через переменные окружения) в моём случае не сработали.

4. Тестирование через Python

Сервер запущен на порту 8081. Протестируем его, используя совместимый с OpenAI Python-клиент.

Устанавливаем необходимый пакет:

sudo apt install python3 python3-pip
pip install openai

Создаём простой скрипт test_llama.py:

from openai import OpenAI

# Клиент настраивается на наш локальный сервер
client = OpenAI(
    api_key="not-needed", # Токен не требуется, но поле должно быть
    base_url="http://localhost:8081/v1"
)

response = client.chat.completions.create(
    model="gpt-oss", # Имя модели может быть любым, оно игнорируется сервером
    messages=[
        {"role": "user", "content": "Напиши короткую сказку на ночь про единорога."}
    ]
)

print(response.choices[0].message.content)

Запускаем скрипт:

python3 test_llama.py

Если всё настроено верно, вы получите ответ от локально работающей модели.

Необязательные, но полезные доработки

  • Текстовый редактор: В качестве удобного редактора кода я установил Geany:

    sudo apt install geany geany-plugins
  • Проблемы с микрофоном: В Ubuntu я столкнулся с очень низкой чувствительностью аналогового микрофона. Проблема решилась переходом на USB-микрофон и ручной регулировкой уровней через alsamixer (выкрутил gain до 80%).

И заключение

Надеюсь, этот гайд поможет другим энтузиастам как минимум потратить меньше времени :-). Если у вас есть более изящные решения для некоторых этапов (особенно для проблемы с iGPU) — делитесь в комментариях!