Введение

Всем привет! Меня зовут Максимов Максим, я — NLP‑инженер в компании red_mad_robot. Сегодня я хотел бы представить вам практическое руководство по запуску и использованию популярных инструментов для работы с LLM.

Целью этой работы было познакомиться и опробовать следующие инструменты:

Для каждого из них я приведу краткое описание, пошаговое руководство по запуску, а также приведу практические примеры по работе с каждым из них.

Начинаем!

Ollama

Это платформа с открытым исходным кодом, которая упрощает запуск и управление LLM, а также дает возможность локально запускать языковые модели без доступа в интернет. Ссылка на платформу.

Шаг за шагом, используя этот инструмент, развернем LLM на компьютере.

Перед началом необходимо установить Ollama себе на компьютер. Для этого переходим по ссылке https://ollama.com/download, выбираем вашу ОС и скачиваем инсталлятор Ollama. Я буду производить установку на Windows.

Скачиваем Ollama
Скачиваем Ollama

После скачивания установщика вам необходимо его запустить и нажать кнопку «Install». Будет произведена установка Ollama.

Нажимаем "Install"
Нажимаем «Install»

*Недавно в Ollama был добавлен графический интерфейс в виде чата, в котором сразу после установки можно пообщаться с LLM. После выбора модели и отправки первого сообщения, будет произведена установка модели. В качестве демонстрации работы, я выбрал LLM gemma3:4b

После установки можем воспользоваться чатом
После установки можем воспользоваться чатом
Все быстро и просто
Все быстро и просто

Как могли заметить, в этом вся красота Ollama. Всего за пару кликов мы запустили модель и можем начинать с ней работу.

Также мы можем работать с Ollama через командную строку

Доступные команды в Ollama
Доступные команды в Ollama
Запуск чата с LLM в командной строке
Запуск чата с LLM в командной строке

Приведем пример использования Ollama в своей программе на Python. Воспользуемся библиотекой LangChain. Для взаимодействия с LLM необходимо, чтобы Ollama была запущена на вашем компьютере. Для этого либо запустите приложения напрямую, либо в консоли запустите команду:

ollama serve
Иконка при запуске Ollama напрямую через интерфейс
Иконка при запуске Ollama напрямую через интерфейс
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama.llms import OllamaLLM

template = """Question: {question}

Answer: Let's think step by step."""

# Создаем шаблон промпта
prompt = ChatPromptTemplate.from_template(template)

# Создаем клиент для взаимодействия с LLM Ollama.
# По умолчанию Ollama использует порт 11434
model = OllamaLLM(model="gemma3:4b", base_url="http://127.0.0.1:11434") 

# Создаем цепочку LangChain
chain = prompt | model

# Отправляем запрос модели
chain.invoke({"question": "What is LangChain?"})
Ответ LLM
Ответ LLM

LM Studio

Это кроссплатформенное десктопное приложение для запуска LLM. По своей простоте оно схоже с Ollama, но по наличию функционала LM Studio опережает. Вот небольшой список того, что есть в данном инструменте:

  • Графический интерфейс в виде чата, который позволяет общаться с моделью;

  • Загрузка LLM из Hugging Face;

  • Использование внешних MCP инструментов;

  • Работа с документами в виде контекста и в виде RAG;

  • Сохранение\загрузка\передача системных подсказок, для переиспользования;

  • Запуск сервера с LLM с доступом по API, а также поддержка OpenAI API.

Ссылка на LM Studio.

Для установки LM Studio необходимо скачать инсталлятор с официального сайта

Скачиваем инсталлятор с официального сайта
Скачиваем инсталлятор с официального сайта

После скачивания инсталлятора будет произведена классическая установка

Далее далее далее
Далее далее далее

После установки можем открыть графический интерфейс

Графический интерфейс LM Studio
Графический интерфейс LM Studio

Давайте в качестве примера также установим модель gemma. Для этого в левом меню переходим в поиск и находим нужную нам модель

Выбираем нужную модель из Hugging Face
Выбираем нужную модель из Hugging Face

После скачивания можем начинать общение с LLM в чате

Все быстро и просто
Все быстро и просто

Помимо работы с графическим интерфейсом, LM Studio позволяет осуществлять работу с моделями в консоли, а также запускать сервер с LLM для использования их в своих приложениях. Чтобы получить список доступных команд введите в командной строке:

lms
Доступные команды LM Studio
Доступные команды LM Studio

Можем увидеть нашу загруженную модель и пообщаться с ней, введя команду:

lms ls
Доступные модели
Доступные модели

Чтобы начать с ней общение в консоли, введите команду:

lms chat google/gemma-3n-e4b
Запуск LLM в консоли
Запуск LLM в консоли

Теперь попробуем запустить сервер с этой LLM и воспользоваться ей в программе на Python. Для запуска LM Studio сервера нужно выполнить команду:

lms server start
Информация об успешном запуске сервера LM Studio
Информация об успешном запуске сервера LM Studio

По умолчанию LM Studio использует порт 1234.

Как говорилось выше, инструмент поддерживает OpenAI API, поэтому воспользуемся библиотекой openai

from openai import OpenAI

url = "localhost:1234"

# Настройка клиента 
client = OpenAI(
    base_url=f"http:{url}/v1"  
)

# Отправка запроса LLM
response = client.chat.completions.create(
    model="google/gemma-3n-e4b",
    messages=[
        {"role": "user", "content": "Hello!"}
    ]
)
print(response.choices[0].message.content)
Ответ модели
Ответ модели

vLLM

Это популярный фреймворк для высокоэффективного запуска LLM. Его особенностью является эффективное управление памятью (через PagedAttention), совместимость с популярными моделями с Hugging Face, а также поддержка OpenAI API. Ссылка на фреймворк.

Давайте шаг за шагом произведем запуск модели на vLLM. Запуск будет производится на удаленном сервере с Ubuntu 24.04 и видеокартой NVIDIA RTX 3090. Для запуска будем использовать Docker.

Откроем командную строку и произведем обновление списка доступных пакетов:

sudo apt update

Установим docker:

sudo apt install docker.io

Далее необходимо установить NVIDIA Container Toolkit. Это набор утилит, который позволяет пользователям создавать и запускать контейнеры с графическим ускорением. Для установки воспользуемся следующими командами:

Настройка репозитория:

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

Обновление списка пакетов из репозитория:

 apt-get update

Установка пакетов NVIDIA Container Toolkit:

export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.17.8-1
  sudo apt-get install -y \
      nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
      nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
      libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
      libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION}

Далее необходимо настроить Docker для работы с nvidia‑container‑toolkit. Для этого необходимо выполнить команды:

Настройка среды выполнения контейнера:

sudo nvidia-ctk runtime configure --runtime=docker

Перезапуск Docker:

sudo systemctl restart docker

Для проверки корректной установки nvidia‑container‑toolkit вызовите следующую команду:

sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi

Эта команда должна показать информацию о ваших видеокартах. Если у вас возникла ошибка на этом этапе (как у меня), можно воспользоваться советами по решению проблемы здесь.

После настройки окружения можно производить запуск vLLM. В качестве LLM будет взята Qwen/Qwen3-0.6B. Воспользуемся командой с дефолтными настройками из официальной документации vLLM.

docker run --runtime nvidia --gpus all \
    -v ~/.cache/huggingface:/root/.cache/huggingface \
    --env "HUGGING_FACE_HUB_TOKEN=<YOUR_HG_TOKEN>" \
    -p 8000:8000 \
    --ipc=host \
    vllm/vllm-openai:latest \
    --model Qwen/Qwen3-0.6B

<YOUR_HG_TOKEN> замените на ваш access token из Hugging Face. Получить можно здесь.

После успешной загрузки LLM и запуска сервера можем обращаться к нашей модели по OpenAI API. Сделаем это на языке Python

from openai import OpenAI
 
url = "195.209.284.168:8000" # Замените на url вашего сервера

# Настройка клиента 
client = OpenAI(
    base_url=f"http:{url}/v1"  
)

# Отправка запроса нашей LLM
response = client.chat.completions.create(
    model="Qwen/Qwen3-0.6B",
    messages=[
        {"role": "user", "content": "Hello!"}
    ]
)

print(response.choices[0].message.content)
Ответ модели
Отправка запроса нашей LLMОтвет модели

Triton

Это фреймворк, разработанный NVIDIA для оптимизированного инференса моделей ИИ специально на GPU. Triton позволяет разворачивать модели ИИ из различных фреймворков ML и DL (TensorRT, PyTorch, ONNX, OpenVINO, Python и другие). Ссылка на фреймворк.

Для запуска Triton нам потребуется предварительная подготовка.

Необходимо создать так называемый «репозиторий моделей», с которыми будет работать Triton. Об этом можно подробнее можно почитать в официальной документации здесь.

Для упрощения возьмем демонстрационную модель falcon7b из официального репозитория Triton Server. Скачать ее можно здесь.

Создадим папку model_repository, и поместим туда скачанную модель. Должна получиться следующая структура папок:

? models/
    └── ? falcon7b/
        ├── ? 1/
        │   └── ? model.py
        └── ? config.pbtxt

Запуск будем производить на Ubuntu 24.04 с GPU RTX 4090.

Предварительно также необходимо установить Docker и nvidia comtainer toolkit для работы GPU в контейнере. Последовательность команд я описывал выше.

Далее необходимо создать файл с названием Dockerfile, который содержит команды для настройки контейнера с Triton. Он должен содержать следующее:

FROM nvcr.io/nvidia/tritonserver:25.08-py3
RUN apt install --only-upgrade python3-pip
RUN pip install transformers >=4.34.0 protobuf>=3.20.3 sentencepiece>=0.1.99 accelerate>=0.23.0 einops>=0.6.1 --root-user-action=ignore

Во время запуска Triton сервера я столкнулся с ошибками запуска контейнера. Поискав проблему я обнаружил то, что в официальном github установлена старая версия образа Triton, не подходящая под мою версию Ubuntu. Для того чтобы найти нужную версию, можно воспользоваться следующим ресурсом. Определив нужную версию Triton, поменяйте в Dockerfile в первой строке "FROM nvcr.io/nvidia/tritonserver:<xx.yy>-py3" место <xx.yy> — на нужную версию Triton.

После создания Dockerfile необходимо собрать образ командой:

docker build -t triton_transformer_server .

После успешной сборки образа можно запускать Triton для инференса модели следующей командой:

docker run --gpus all -it --rm --net=host --shm-size=1G \
    --ulimit memlock=-1 --ulimit stack=67108864 \ 
    -v ${PWD}/model_repository:/opt/tritonserver/model_repository \
    triton_transformer_server tritonserver --model-repository=model_repository

После настройки всех зависимостей и загрузки модели вы должны увидеть следующие логи в консоли:

I0918 16:58:59.397705 1 grpc_server.cc:2562] "Started GRPCInferenceService at 0.0.0.0:8001"
I0918 16:58:59.397909 1 http_server.cc:4789] "Started HTTPService at 0.0.0.0:8000"
I0918 16:58:59.439052 1 http_server.cc:358] "Started Metrics Service at 0.0.0.0:8002"

Теперь мы можем делать запросы к нашей LLM. Ниже будет описан пример на Python.

import requests
import json

# Укажите название вашей модели из папки model_repository
model_name = "falcon7b"

# url вашего сервера
url = "192.214.210.111:8000"

# Тело запроса к модели
payload = {
    "inputs": [
        {
            "name": "text_input",
            "datatype": "BYTES",
            "shape": [1],
            "data": ["I am doing"]
        }
    ]
}

# Запрос к Triton LLM
result = requests.post(f"http://{url}/v2/models/{model_name}/infer", json=payload).json()['outputs'][0]['data']
print(result)
Ответ модели
Ответ модели

llama.cpp

Это мощный кроссплатформенный движок для инференса моделей. llama.cpp позволяет без наличия мощного оборудования производить развертывания LLM. Данный движок является бекендом у многих популярных инструментов для инференса моделей. Например у таких как Ollama и LM Studio. Ссылка на движок.

Ниже будет описана пошаговая инструкция по использования и запуску сервера llama.cpp. Для этого будем использовать Docker.

llama.cpp использует в работе с моделями формат gguf. Это формат для хранения квантизированных моделей, который использует движок.

llama.cpp предоставляет инструменты для перевода Hugging Face моделей в формат gguf. Место этого будет скачана готовая модель в нужном формате. На Hugging Face можно найти уже готовые файлы с моделями в формате gguf. Посмотреть можно здесь.

Создайте папку models и поместите туда файл модели. В качестве примера возьмем Llama-3.2-1B‑Instruct‑Q8_0.gguf, которая была скачана отсюда.

Также можно сделать это командой

curl -Lo YOUR_MODELS_PATH/Llama-3.2-1B-Instruct-Q8_0.gguf https://huggingface.co/unsloth/Llama-3.2-1B-Instruct-GGUF/resolve/main/Llama-3.2-1B-Instruct-Q8_0.gguf

YOUR_MODELS_PATH — путь к вашей папке models.

Запуск модели будем производить на Ubuntu 24.04 с GPU RTX 4090.

Перед запуском также необходимо установить Docker и nvidia comtainer toolkit для работы GPU в контейнере. Последовательность команд я описывал выше.

После этого мы можем запустить интерактивный чат следующей командой:

docker run -it --rm -v YOUR_MODELS_PATH:/models \
    --gpus all ghcr.io/ggml-org/llama.cpp:light-cuda \
    -ngl 99 -m /models/Llama-3.2-1B-Instruct-Q8_0.gguf -p "Hello!"

YOUR_MODELS_PATH — путь к вашей папке models.

После успешного запуска вы увидите следующее:

Чат с моделью в консоли. В случае необходимости генерации можно остановить командой CTRL + С.
Чат с моделью в консоли. В случае необходимости генерации можно остановить командой CTRL + С.

Теперь запустим llama.cpp сервер и используем его в своей программе на Python.

Для запуска сервера воспользуемся командой:

docker run -v YOUR_MODELS_PATH:/models \
    -p 8000:8000 ghcr.io/ggml-org/llama.cpp:server \
    -m /models/Llama-3.2-1B-Instruct-Q8_0.gguf --port 8000 --host 0.0.0.0

YOUR_MODELS_PATH — путь к вашей папке models.

После успешного запуска увидите следующее:

llama.cpp сервер запущен
llama.cpp сервер запущен

Теперь можем использовать Python для работы с запущенной LLM

import requests

# URL сервера
server_url = "http://localhost:8000/completion"

# Данные для запроса
payload = {
    "prompt": "Я люблю есть",  # Ваш промпт
    "n_predict": 200,  # Максимальное количество токенов для генерации
    "temperature": 0.2,  # Параметр случайности (0.1-1.0)
    "stop": ["\n", "###"]  # Строки, при которых генерация останавливается
}

# Запрос на сервер  
response = requests.post(server_url, json=payload)

# Парсим ответ
result = response.json()

print("Ответ модели:", result['content'])
Ответ модели
Ответ модели

SGLang

Это быстродействующий фреймворк для LLM и Computer Vision моделей. Он предлагает быструю среду выполнения (благодаря RadixAttention), интуитивно понятный интерфейс для программирования LLM приложений, а также поддержку широкого спектра различных LLM моделей.

В качестве примера запустим SGLang сервер на GPU с использованием Docker. Перед запуском необходимо установить Docker и nvidia comtainer toolkit для работы GPU в контейнере. Последовательность команд я описывал выше.

После успешной настройки среды вы можете запускать SGLang. Для этого воспользуемся командой:

sudo docker run ‑runtime nvidia ‑gpus all \
  ‑e HF_TOKEN=YOUR_HG_TOKEN \
  ‑v ~/.cache/huggingface:/root/.cache/huggingface \
  ‑p 8000:8000 ‑ipc=host arrichm/sglang:latest \
  ‑model‑path TheBloke/Mistral-7B‑v0.1-AWQ ‑host 0.0.0.0

YOUR_HG_TOKEN — ваш access token с Hugging Face

В качестве модели была взята Mistral-7B‑v0.1-AWQ. Вы же можете взять ту, которую вам нужно с Hugging Face.

После успешного запуска сервера вы увидите следующее:

SGLang сервер запущен
SGLang сервер запущен

Воспользуемся запущенной моделью в нашей программе на Python. SGLang поддерживает OpenAI API, поэтому используем библиотеку openai для работы с моделью.

from openai import OpenAI

url = "195.209.214.168:8000" # Замените на url вашего сервера

# Настройка клиента 
client = OpenAI(
    base_url=f"http:{url}/v1"  
)

# Отправка запроса LLM
response = client.chat.completions.create(
    model="TheBloke/Mistral-7B-v0.1-AWQ",
    messages=[
        {"role": "user", "content": "Hello!"}
    ]
)
print(response.choices[0].message.content)
Ответ модели
Ответ модели

Заключение

В этой статье были рассмотрены практические примеры запуска и использования популярных инструментов для работы с LLM. Все они решают схожую задачу, но имеют в своем арсенале различный функционал, а также свои плюсы и минусы, которые стоит учитывать для каждой задачи индивидуально.

Целью этой работы было познакомиться и попрактиковаться в запуске и работе с каждым из инструментов, а также поделиться теми шагами, которые я проделал.

Подписывайтесь на мой телеграмм канал, в котором я рассказываю интересные вещи об IT и AI технологиях.

Комментарии (0)


  1. PelmenBlin
    21.09.2025 01:47

    Немного не по теме поста. Я на Хабре совсем недавно. Вижу пост в закладки добавлен 17 раз и 0 лайков. Здесь на Хабре своя особая атмосфера? Информацию полезную получили, а поблагодарить слабо? Или я что-то не правильно интерепретирую?


    1. Arkham
      21.09.2025 01:47

      Это как "список книг на прочтение", выглядит книга интересно, но пока не прочитаешь - оценку дать не можешь.

      А Вам, возможно, ещё и минусов в карму наставят.


      1. akaleks
        21.09.2025 01:47

        Список книг, на прочтение, которые, скорее всего, никогда не прочитают.


  1. da-nie
    21.09.2025 01:47

    Данный движок является бекендом у многих популярных инструментов для инференса моделей. Например у таких как Ollama и LM Studio. Ссылка на движок.

    Как-то заинтересовало меня, как люди в таких движках свёртки быстрые на GPU делают. Открыл я вот этот файлик. И что же там я вижу?

    template <typename T, typename Layout>
    __global__ void conv2d_dw_kernel(const T * __restrict__ input, const T * __restrict__ kernel, T * __restrict__ output,
                                     const int in_w, const int in_h, const int out_w, const int out_h,
                                     const int kernel_w, const int kernel_h, const int stride_x, const int stride_y,
                                     const int padding_x, const int padding_y, const int dilation_x, const int dilation_y,
                                     const int channels, const int batches) {
        const int global_idx     = blockIdx.x * blockDim.x + threadIdx.x;
        const int total_elements = batches * channels * out_h * out_w;
    
        if (global_idx >= total_elements) {
            return;
        }
    
        conv_params params = { in_w,     in_h,      out_w,     out_h,      kernel_w,   kernel_h, stride_x,
                               stride_y, padding_x, padding_y, dilation_x, dilation_y, channels, batches };
    
        int batch_idx, channel_idx, out_y_idx, out_x_idx;
        Layout::unpack_indices(global_idx, params, batch_idx, channel_idx, out_y_idx, out_x_idx);
    
        T accumulator = 0;
        kernel_bounds bounds = calculate_kernel_bounds(out_x_idx, out_y_idx, params);
    
        for (int kern_y = bounds.y_min; kern_y < bounds.y_max; ++kern_y) {
            int in_y_idx = calculate_input_coord(out_y_idx, kern_y, params.stride_y, params.dilation_y, params.padding_y);
    
            for (int kern_x = bounds.x_min; kern_x < bounds.x_max; ++kern_x) {
                int in_x_idx = calculate_input_coord(out_x_idx, kern_x, params.stride_x, params.dilation_x, params.padding_x);
    
                const T input_val  = input[Layout::input_index(batch_idx, channel_idx, in_y_idx, in_x_idx, params)];
                const T kernel_val = kernel[Layout::kernel_index(channel_idx, kern_y, kern_x, params)];
    
                accumulator += input_val * kernel_val;
            }
        }
    
        output[Layout::output_index(batch_idx, channel_idx, out_y_idx, out_x_idx, params)] = accumulator;
    }

    Это ж свёртка в лоб как на CPU один в один! Такой алгоритм крайне медленный. Гораздо, гораздо (на пару порядков) быстрее на основе умножения матриц с разделяемой памятью. Если вся llama такая, то как же она тормозит-то?

    И операция % в CUDA не знаю почему, но нифига не быстрая. Если её заменить на деление и вычитание умноженного значения, быстродействие возрастает.


    1. Razoon
      21.09.2025 01:47

      Ничто не мешает вам переписать этот участок кода и открыть пулреквест на гитхаб llama.cpp, если все так как вы описали, то вам ещё и спасибо скажут


      1. da-nie
        21.09.2025 01:47

        Увы, мешает то, что нужно очень хорошо вникнуть в сам проект. К тому же есть ведь и свои дела и свои проекты. И на всё нужны силы и время.


      1. onyxmaster
        21.09.2025 01:47

        Они багрепорты на креши со 100% повторяемостью не смотрят, если не выпрашивать, думаете там спасибо кто-то скажет? :))