Найти тему
LLM. GPT. AI.

Запуск LM-Studio в docker-контейнере

Оглавление

LM Studio — это десктопное приложение для разработки и экспериментирования с моделями больших языковых моделей (LLM) на вашем компьютере. LM Studio использует llama.cpp backend, позволяет запускать gguf-модели на различном железе. Есть исполняемые файлы для различных ОС (windows, mac, linux). В приложении есть OpenAI-API сервер для доступа по локальной сети, поэтому LM Studio позволяет не только проверить возможности различных llm моделей, но так же подходит для разработки ПО.

Ключевым недостатком этого ПО является отсутствие возможности за пуска в headless режиме (старт OpenAI-API сервера без визуального интерфейса), это усложняет использование студии на арендованных облачных серверах, по сути ограничивает сценарии использования только локальным запуской.

Для решения этой проблемы я собрал скрипты для развертывания LM Studio в docker-контейнере в headless-режиме с использованием ОС Ububnu-linux.

Для развертывания будет нужна подготовленная ОС Ubuntu (использовал версию 22.04 и облако с видеокартами NVIDIA):

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

2. Установлен container-toolkit

3. Установлен docker

4. Установлен docker-compose

Набор файлов, необходимый для автоматического развертывания выложил в гит: https://gitlab.com/logliwo/lm-studio-docker-compose

Дополнительно необходимо скачать LM Studio AppImage (использовал версию 0.3.2 для linux) и расположить ее в директории с этими файлами.

Более подробно разберу содержимое файлов:

Dockerfile:

FROM nvidia/cuda:12.6.1-cudnn-devel-ubuntu22.04
COPY ./LM_Studio* /data/lms/

Исходный образ обязательно должен иметь совместимую версию CUDA. Использую образ от NVIDIA, который уже настроен на использование CUDA приложений внутри

COPY ./LM_Studio* /data/lms/
COPY ./keyboard /etc/default/keyboard
COPY ./http-server-config.json /http-server-config.json
COPY ./start_services.sh /start_services.sh

Копирование необходимых для сборки файлов

RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y keyboard-configuration console-setup tzdata dbus x11-utils x11-xserver-utils libgl1-mesa-glx

Запуск установки предварительных зависимостей

RUN dpkg-reconfigure -f noninteractive keyboard-configuration

Настройка клавиатуры для автоматизации дальнейшей установки

RUN apt-get update && apt-get install -y libfuse2 kmod fuse libglib2.0-0 libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libgtk-3-0 libgbm1 libasound2 xserver-xorg xvfb x11vnc

Установка оставшихся зависимостей

RUN mkdir -p /root/.vnc && x11vnc -storepasswd <password> /root/.vnc/passwd,

Для управления LM Studio используется VNC, пароль для доступа необходимо подставить за место <password>

ENV DISPLAY=:99

Установка переменной окружения для определения виртуального дисплея

RUN chmod ugo+x /data/lms/*.AppImage
RUN /data/lms/*.AppImage --appimage-extract

Распаковка AppImage файла LM Studio

RUN cd /squashfs-root/
RUN chown root:root /squashfs-root/chrome-sandbox
RUN chmod 4755 /squashfs-root/chrome-sandbox
RUN chmod +x /start_services.sh

Выдача необходимых прав доступа к файлам

CMD ["/start_services.sh"]

Команда для старта студии.

keyboard: настройки для виртуальной клавиатуры

http-server-config.json: файл конфигурации локального сервера OpenAI-API

start_services.sh:

rm /tmp/.X99-lock

Снимаем блокировку виртуального монитора (если заблокирован)

Xvfb :99 -screen 0 1920x1080x16 &

Запуск виртуального монитора

/squashfs-root/lm-studio --no-sandbox &

Запуск lm-studio в отдельном процессе

~/.cache/lm-studio/bin/lms server start --cors &

Старт OpenAI-API с включенными CORS заголовками ответов

~/.cache/lm-studio/bin/lms load --gpu max --context-length ${CONTEXT_LENGTH:-4096} ${MODEL_PATH} &

Загрузка llm модели, путь к фалу модели должен быть передан в переменной окружения MODEL_PATH, длина контекста в CONTEXT_LENGTH

cp -f /http-server-config.json /root/.cache/lm-studio/.internal/http-server-config.json

Копирование конфигурации OpenAI-API сервера делается с целью автоматического включения серва по локальной сети (по умолчанию отключен, управление через lms для текущей версии не доступно)

x11vnc -display :99 -forever -rfbauth /root/.vnc/passwd -quiet -listen 0.0.0.0 -xkb

Запуск VNC серера на виртуальном дисплее

docker-compose.yml:

build: .

Образ для запуска контейнера будет собран из Dockerfile

ports:
- "1234:1234"
- "5900:5900"

Порт 1234 прокинут для доступа к OpenAI-API серверу. Порт 5900 для доступа по VNC к интерфейсу управления LM Studio.

volumes:
- /root/.cache/lm-studio/models:/root/.cache/lm-studio/models

Подключение локального хранилища для моделей (что бы модели не удалялись при удалении контейнера)

environment:
- CONTEXT_LENGTH=32768
- MODEL_PATH=bartowski/Codestral-22B-v0.1-GGUF/Codestral-22B-v0.1-Q8_0.gguf

Установка переменных окружения для работы моделей

deploy:
resources:
reservations:
devices:
- capabilities: [gpu]

Прокидывает ВСЕ GPU адаптеры внутрь контейнера

command: ["/start_services.sh"]

Каждый раз при старте контейнера будет сполняться эта команда

restart: always

Автоматический перезапуск при ошибках

Запуск контейнера:

docker-compose up --build -d

--build пересоберет контейнер заново, для перезапсука данную опцию использовать не нужо

-d запустит контейнер в отдельном процессе

Итог:

LM Studio запущена в отдельном контейнере (например на удаленном сервере с GPU) без необходимости держать интерфейсное окно активным, но с возможностью доступа к интерфейсу через любой VNC клиент.

Для доступа по сети доступен OpenAI-API сервер, модель автоматически загружена при старте.

-2