159 lines
5.8 KiB
Markdown
159 lines
5.8 KiB
Markdown
# Windows Docker GPU Host
|
||
|
||
Целевой хост: `docker-gpu.cin.su` / `192.168.220.91`.
|
||
|
||
Назначение: Windows-машина с NVIDIA GPU, Docker Desktop/Engine и контейнерами/моделями на диске `Z:`.
|
||
|
||
## Что сейчас видно с рабочей машины
|
||
|
||
- DNS `docker-gpu.cin.su` указывает на `192.168.220.91`.
|
||
- Открыты SSH `22` и RDP `3389`.
|
||
- Docker API `2375/2376`, WinRM `5985/5986`, Portainer `9000`, inference `8000/8080` снаружи не открыты.
|
||
- SSH под `test@docker-gpu.cin.su` ключ не принимает: нужен правильный пользователь или добавление публичного ключа.
|
||
|
||
## Доступ
|
||
|
||
Предпочтительный вариант - SSH-ключ, без хранения паролей в репозитории.
|
||
|
||
Публичный ключ пользователя, который нужно добавить на Windows-хост:
|
||
|
||
```text
|
||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGS167Ors2oDzveI1iNlRiuGSqdR90x0O05JrcoQ4UBL llm-docker-gpu
|
||
```
|
||
|
||
Для обычного Windows-пользователя ключ добавляется в:
|
||
|
||
```powershell
|
||
C:\Users\<USER>\.ssh\authorized_keys
|
||
```
|
||
|
||
Для пользователей из группы Administrators OpenSSH Server обычно читает:
|
||
|
||
```powershell
|
||
C:\ProgramData\ssh\administrators_authorized_keys
|
||
```
|
||
|
||
После добавления ключа права на файл администраторского ключа должны быть строгими:
|
||
|
||
```powershell
|
||
icacls C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r
|
||
icacls C:\ProgramData\ssh\administrators_authorized_keys /grant "Administrators:F" /grant "SYSTEM:F"
|
||
```
|
||
|
||
Проверка:
|
||
|
||
```powershell
|
||
ssh <USER>@docker-gpu.cin.su "whoami; hostname"
|
||
```
|
||
|
||
Для Codex настроен локальный SSH alias:
|
||
|
||
```powershell
|
||
ssh docker-gpu "whoami & hostname"
|
||
docker -H ssh://docker-gpu info
|
||
```
|
||
|
||
## Проверка Windows GPU/Docker
|
||
|
||
На самом Windows-хосте:
|
||
|
||
```powershell
|
||
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/check_windows_gpu_host.ps1
|
||
```
|
||
|
||
Через SSH, когда ключ уже добавлен:
|
||
|
||
```powershell
|
||
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/check_windows_gpu_host.ps1 -SshTarget <USER>@docker-gpu.cin.su
|
||
```
|
||
|
||
Скрипт проверяет:
|
||
|
||
- `nvidia-smi`;
|
||
- Docker Engine;
|
||
- Docker Compose;
|
||
- наличие/создание `Z:\LLM\models`;
|
||
- запуск CUDA-контейнера с `--gpus all`.
|
||
|
||
## Docker Desktop в SSH-сессии
|
||
|
||
На Windows-хосте Docker Desktop должен быть запущен в интерактивной пользовательской сессии. Если `docker version` показывает клиент, но не может открыть pipe `dockerDesktopLinuxEngine`, запустите Docker Desktop в активной RDP/console-сессии пользователя.
|
||
|
||
Проверка через Docker-over-SSH:
|
||
|
||
```powershell
|
||
docker -H ssh://docker-gpu version
|
||
docker -H ssh://docker-gpu run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi
|
||
```
|
||
|
||
Если `ssh docker-gpu "docker pull ..."` падает с ошибкой `A specified logon session does not exist`, причиной может быть `credsStore: desktop` в `%USERPROFILE%\.docker\config.json`. Для деплоя предпочтительно тянуть образы локальным Docker CLI через `docker -H ssh://docker-gpu ...`; такой режим не требует удаленного desktop credential helper.
|
||
|
||
## Автозапуск Docker Desktop
|
||
|
||
На `M7` настроена задача Windows Task Scheduler:
|
||
|
||
```text
|
||
LLM-DockerDesktop-Autostart
|
||
```
|
||
|
||
Задача запускает:
|
||
|
||
```text
|
||
C:\ProgramData\LLM\Ensure-DockerDesktop.ps1
|
||
```
|
||
|
||
Режим:
|
||
|
||
- при старте Windows с задержкой 2 минуты;
|
||
- watchdog каждые 5 минут;
|
||
- запуск от пользователя `m7\m` с повышенными правами;
|
||
- пароль хранится в Windows Task Scheduler, не в репозитории и не в скрипте.
|
||
|
||
Лог:
|
||
|
||
```text
|
||
C:\ProgramData\LLM\logs\docker-desktop-autostart.log
|
||
```
|
||
|
||
Проверка задачи:
|
||
|
||
```powershell
|
||
ssh docker-gpu "schtasks /Query /TN LLM-DockerDesktop-Autostart /V /FO LIST"
|
||
ssh docker-gpu "cmd /c type C:\ProgramData\LLM\logs\docker-desktop-autostart.log"
|
||
```
|
||
|
||
После проверочной перезагрузки `2026-06-19` задача подняла Docker Desktop автоматически, а GPU smoke test прошел через `docker -H ssh://docker-gpu`.
|
||
|
||
## Env-файлы под Z:
|
||
|
||
Для Windows-хоста подготовлены отдельные примеры:
|
||
|
||
```text
|
||
core/deploy/docker-gpu/vllm/.env.windows-z.example
|
||
core/deploy/docker-gpu/llama-cpp/.env.windows-z.example
|
||
```
|
||
|
||
В них используются bind mount пути вида:
|
||
|
||
```text
|
||
HOST_MODELS_DIR=Z:/LLM/models
|
||
HOST_HF_CACHE_DIR=Z:/LLM/models/cache/huggingface
|
||
```
|
||
|
||
Внутри контейнеров модели видны как `/models`.
|
||
|
||
## Следующий запуск
|
||
|
||
После появления SSH-доступа и подтверждения GPU:
|
||
|
||
```powershell
|
||
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_gpu_stack.ps1 `
|
||
-SshTarget <USER>@docker-gpu.cin.su `
|
||
-DockerHost ssh://<USER>@docker-gpu.cin.su `
|
||
-VllmEnvFile core/deploy/docker-gpu/vllm/.env.windows-z.example `
|
||
-LlamaEnvFile core/deploy/docker-gpu/llama-cpp/.env.windows-z.example `
|
||
-Pull
|
||
```
|
||
|
||
Если Docker Desktop на Windows не принимает remote Docker over SSH напрямую, запуск compose нужно выполнить интерактивно на самом хосте через RDP/SSH PowerShell, используя те же `.env.windows-z.example`.
|