Введение
Всем привет! Меня зовут Максимов Максим, я — NLP‑инженер в компании red_mad_robot. Сегодня я хотел бы представить вам практическое руководство по запуску и использованию популярных инструментов для работы с LLM.
Целью этой работы было познакомиться и опробовать следующие инструменты:
Для каждого из них я приведу краткое описание, пошаговое руководство по запуску, а также приведу практические примеры по работе с каждым из них.
Начинаем!
Ollama
Это платформа с открытым исходным кодом, которая упрощает запуск и управление LLM, а также дает возможность локально запускать языковые модели без доступа в интернет. Ссылка на платформу.
Шаг за шагом, используя этот инструмент, развернем LLM на компьютере.
Перед началом необходимо установить Ollama себе на компьютер. Для этого переходим по ссылке https://ollama.com/download, выбираем вашу ОС и скачиваем инсталлятор Ollama. Я буду производить установку на Windows.

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

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


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


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

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?"})

LM Studio
Это кроссплатформенное десктопное приложение для запуска LLM. По своей простоте оно схоже с Ollama, но по наличию функционала LM Studio опережает. Вот небольшой список того, что есть в данном инструменте:
Графический интерфейс в виде чата, который позволяет общаться с моделью;
Загрузка LLM из Hugging Face;
Использование внешних MCP инструментов;
Работа с документами в виде контекста и в виде RAG;
Сохранение\загрузка\передача системных подсказок, для переиспользования;
Запуск сервера с LLM с доступом по API, а также поддержка OpenAI API.
Для установки LM Studio необходимо скачать инсталлятор с официального сайта

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

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

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

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

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

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

Чтобы начать с ней общение в консоли, введите команду:
lms chat google/gemma-3n-e4b

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

По умолчанию 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)

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.
После успешного запуска вы увидите следующее:

Теперь запустим 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.
После успешного запуска увидите следующее:

Теперь можем использовать 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.
После успешного запуска сервера вы увидите следующее:

Воспользуемся запущенной моделью в нашей программе на 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)
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 не знаю почему, но нифига не быстрая. Если её заменить на деление и вычитание умноженного значения, быстродействие возрастает.
Razoon
21.09.2025 01:47Ничто не мешает вам переписать этот участок кода и открыть пулреквест на гитхаб llama.cpp, если все так как вы описали, то вам ещё и спасибо скажут
da-nie
21.09.2025 01:47Увы, мешает то, что нужно очень хорошо вникнуть в сам проект. К тому же есть ведь и свои дела и свои проекты. И на всё нужны силы и время.
onyxmaster
21.09.2025 01:47Они багрепорты на креши со 100% повторяемостью не смотрят, если не выпрашивать, думаете там спасибо кто-то скажет? :))
PelmenBlin
Немного не по теме поста. Я на Хабре совсем недавно. Вижу пост в закладки добавлен 17 раз и 0 лайков. Здесь на Хабре своя особая атмосфера? Информацию полезную получили, а поблагодарить слабо? Или я что-то не правильно интерепретирую?
Arkham
Это как "список книг на прочтение", выглядит книга интересно, но пока не прочитаешь - оценку дать не можешь.
А Вам, возможно, ещё и минусов в карму наставят.
akaleks
Список книг, на прочтение, которые, скорее всего, никогда не прочитают.