349 lines
11 KiB
Markdown
349 lines
11 KiB
Markdown
# История команд: Установка и настройка LLM-системы с Docker и Qwen3
|
||
|
||
Данный документ представляет собой структурированный и человекочитаемый отчёт на основе выполненных в терминале команд. Он описывает процесс установки Docker, NVIDIA-инструментов, загрузки модели Qwen3 и развёртывания LLM-приложения с использованием Docker Compose.
|
||
|
||
---
|
||
|
||
## 1. Установка базовых компонентов
|
||
|
||
### Редактирование и запуск скрипта установки
|
||
|
||
Добавляем следующий код:
|
||
|
||
```bash
|
||
# Add Docker's official GPG key:
|
||
sudo apt-get update
|
||
sudo apt-get 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
|
||
|
||
# Add the repository to Apt sources:
|
||
echo \
|
||
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
|
||
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
|
||
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||
sudo apt-get update
|
||
```
|
||
|
||
```bash
|
||
nano install.sh
|
||
bash install.sh
|
||
```
|
||
|
||
### Установка Docker и его компонентов
|
||
```bash
|
||
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||
```
|
||
|
||
---
|
||
|
||
## 2. Настройка поддержки NVIDIA GPU
|
||
|
||
### Добавление репозитория NVIDIA Container Toolkit
|
||
```bash
|
||
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
|
||
```
|
||
|
||
### Обновление пакетов и установка NVIDIA Container Toolkit
|
||
```bash
|
||
apt-get update
|
||
export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.17.8-1
|
||
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}
|
||
```
|
||
|
||
### Проверка работы GPU в Docker
|
||
```bash
|
||
docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
|
||
```
|
||
|
||
> ✅ Успешный запуск контейнера с `nvidia-smi` подтверждает корректную настройку GPU.
|
||
|
||
---
|
||
|
||
## 3. Проверка наличия драйверов видеокарты
|
||
|
||
### Проверка видеодрайверов
|
||
```bash
|
||
lspci -k | grep -EA2 'VGA|3D'
|
||
nvidia-smi
|
||
```
|
||
|
||
---
|
||
|
||
## 4. Настройка Docker для работы с GPU
|
||
|
||
### Конфигурация демона Docker
|
||
```bash
|
||
nano /etc/docker/daemon.json
|
||
```
|
||
|
||
Добавляем в ранее открытый файл следующие данные:
|
||
|
||
```bash
|
||
{
|
||
"runtimes": {
|
||
"nvidia": {
|
||
"path": "nvidia-container-runtime",
|
||
"runtimeArgs": []
|
||
}
|
||
},
|
||
"default-runtime": "nvidia"
|
||
}
|
||
```
|
||
|
||
> Файл был отредактирован для добавления поддержки `nvidia` в качестве рантайма.
|
||
|
||
### Установка `nvidia-container-runtime` и перезапуск Docker
|
||
```bash
|
||
apt-get install -y nvidia-container-runtime
|
||
systemctl restart docker
|
||
```
|
||
|
||
---
|
||
|
||
## 5. Подготовка рабочей директории и загрузка модели Qwen3
|
||
|
||
### Создание директории для LLM
|
||
```bash
|
||
mkdir /opt/llm
|
||
cd /opt/llm/
|
||
```
|
||
|
||
### Клонирование модели Qwen3-8B с Hugging Face
|
||
|
||
> ✅ Установка необходимых инструментов:
|
||
```bash
|
||
apt install git
|
||
apt install git-lfs
|
||
git lfs install
|
||
```
|
||
|
||
> ✅ Успешное клонирование:
|
||
```bash
|
||
mkdir models/
|
||
cd models
|
||
git clone https://huggingface.co/Qwen/Qwen3-4B
|
||
git clone https://huggingface.co/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2
|
||
```
|
||
|
||
---
|
||
|
||
## 6. Развёртывание приложения с Docker Compose
|
||
|
||
### Сборка и запуск контейнера
|
||
```bash
|
||
docker compose build
|
||
docker compose up -d
|
||
```
|
||
|
||
### Настройка прав на исполняемый файл
|
||
```bash
|
||
chmod +x entrypoint.sh
|
||
```
|
||
|
||
> После исправления прав — повторная пересборка:
|
||
```bash
|
||
docker compose up -d
|
||
```
|
||
|
||
---
|
||
|
||
## 7. Работа с контейнером
|
||
|
||
### Проверка состояния контейнеров и логов
|
||
```bash
|
||
docker ps
|
||
docker logs llm-chat
|
||
```
|
||
|
||
### Вход в контейнер
|
||
```bash
|
||
docker exec -it llm-chat bash
|
||
```
|
||
|
||
---
|
||
|
||
## 8. Управление версиями и пересборка
|
||
|
||
### Многократные циклы остановки, пересборки и запуска
|
||
```bash
|
||
docker compose down
|
||
docker compose build
|
||
docker compose up -d --build
|
||
```
|
||
> Выполнялось многократно (команды 67–141) для отладки и пересборки образа.
|
||
|
||
---
|
||
|
||
## 9. Работа с дополнительным хранилищем
|
||
|
||
### Создание резервной директории `llm2`
|
||
```bash
|
||
mkdir llm2
|
||
cp -r llm/models/ llm2/
|
||
```
|
||
|
||
### Удаление ненужной модели (освобождение места)
|
||
```bash
|
||
rm -rf Qwen3-4B/
|
||
```
|
||
|
||
> Проверка свободного места:
|
||
```bash
|
||
df -h
|
||
```
|
||
|
||
---
|
||
|
||
## 10. Загрузка дополнительной модели
|
||
|
||
### Клонирование базовой версии Qwen3-4B
|
||
```bash
|
||
git clone https://huggingface.co/Qwen/Qwen3-4B
|
||
```
|
||
|
||
---
|
||
|
||
## 11. Подготовка образа для офлайн-использования
|
||
|
||
### Сохранение Docker-образа в архив
|
||
```bash
|
||
docker save llm-chat -o llm-chat-offline.tar
|
||
```
|
||
> Исправление опечатки (`-0` → `-o`) в команде 148.
|
||
|
||
> Уточнение имени образа:
|
||
```bash
|
||
docker images | grep llm-chat
|
||
docker save llm2-llm-chat -o llm-chat-offline.tar
|
||
```
|
||
|
||
---
|
||
|
||
## 12. Финальные действия
|
||
|
||
### Проверка структуры и сохранение истории
|
||
```bash
|
||
ls -lah
|
||
df -h
|
||
history > history.md
|
||
```
|
||
|
||
> ✅ История команд сохранена в формате Markdown для документации.
|
||
|
||
---
|
||
|
||
## Структура проекта
|
||
|
||
```bash
|
||
├── Dockerfile
|
||
├── README.md
|
||
├── app
|
||
│ ├── __pycache__
|
||
│ │ └── config.cpython-310.pyc
|
||
│ ├── config.py
|
||
│ ├── data
|
||
│ │ ├── chroma_db
|
||
│ │ │ ├── 55652433-5130-4082-b593-3dcf3ad2bc92
|
||
│ │ │ └── chroma.sqlite3
|
||
│ │ ├── docs
|
||
│ │ │ ├── REALITY.md
|
||
│ │ │ ├── VLESS-GRPC.md
|
||
│ │ │ ├── XTLS-Vision.md
|
||
│ │ │ └── marzban_ru.md
|
||
│ │ ├── generate_json_files.py
|
||
│ │ ├── generated_docs_db.py
|
||
│ │ └── parsed_json
|
||
│ │ ├── REALITY.json
|
||
│ │ ├── VLESS-GRPC.json
|
||
│ │ ├── XTLS-Vision.json
|
||
│ │ └── marzban_ru.json
|
||
│ ├── main.py
|
||
│ └── old_without_db.py
|
||
├── backup_docker_image.md
|
||
├── cache
|
||
│ ├── cache
|
||
│ │ ├── chroma
|
||
│ │ │ └── telemetry_user_id
|
||
│ │ └── pip
|
||
│ │ ├── http-v2
|
||
│ │ └── selfcheck
|
||
│ └── site-packages
|
||
├── docker-compose.yml
|
||
├── history.md
|
||
├── models
|
||
│ ├── Qwen3-4B
|
||
│ │ ├── LICENSE
|
||
│ │ ├── README.md
|
||
│ │ ├── config.json
|
||
│ │ ├── generation_config.json
|
||
│ │ ├── merges.txt
|
||
│ │ ├── model-00001-of-00003.safetensors
|
||
│ │ ├── model-00002-of-00003.safetensors
|
||
│ │ ├── model-00003-of-00003.safetensors
|
||
│ │ ├── model.safetensors.index.json
|
||
│ │ ├── tokenizer.json
|
||
│ │ ├── tokenizer_config.json
|
||
│ │ └── vocab.json
|
||
│ └── paraphrase-multilingual-MiniLM-L12-v2
|
||
│ ├── 1_Pooling
|
||
│ │ └── config.json
|
||
│ ├── README.md
|
||
│ ├── config.json
|
||
│ ├── config_sentence_transformers.json
|
||
│ ├── model.safetensors
|
||
│ ├── modules.json
|
||
│ ├── onnx
|
||
│ │ ├── model.onnx
|
||
│ │ ├── model_O1.onnx
|
||
│ │ ├── model_O2.onnx
|
||
│ │ ├── model_O3.onnx
|
||
│ │ ├── model_O4.onnx
|
||
│ │ ├── model_qint8_arm64.onnx
|
||
│ │ ├── model_qint8_avx512.onnx
|
||
│ │ ├── model_qint8_avx512_vnni.onnx
|
||
│ │ └── model_quint8_avx2.onnx
|
||
│ ├── openvino
|
||
│ │ ├── openvino_model.bin
|
||
│ │ ├── openvino_model.xml
|
||
│ │ ├── openvino_model_qint8_quantized.bin
|
||
│ │ └── openvino_model_qint8_quantized.xml
|
||
│ ├── pytorch_model.bin
|
||
│ ├── sentence_bert_config.json
|
||
│ ├── sentencepiece.bpe.model
|
||
│ ├── special_tokens_map.json
|
||
│ ├── tf_model.h5
|
||
│ ├── tokenizer.json
|
||
│ ├── tokenizer_config.json
|
||
│ └── unigram.json
|
||
└── offline_packages
|
||
└── requirements.txt
|
||
```
|
||
|
||
|
||
## Выводы
|
||
|
||
Был успешно выполнен полный цикл:
|
||
- Установка Docker и поддержки GPU
|
||
- Настройка NVIDIA Container Toolkit
|
||
- Загрузка моделей **Qwen3-4B**
|
||
- Развёртывание LLM-приложения через Docker Compose
|
||
- Отладка и пересборка контейнера
|
||
- Подготовка офлайн-образа для переноса
|
||
|
||
### Рекомендации
|
||
- Убедитесь, что `llm-chat-offline.tar` содержит актуальную версию образа.
|
||
- При переносе на другую систему используйте `docker load -i llm-chat-offline.tar`.
|
||
- Для экономии места рассмотрите использование только одной версии модели (8B или 4B).
|
||
|
||
---
|
||
|
||
> ✅ Проект готов к использованию в офлайн-режиме. |