Контейнеры ARM64 и DGX Spark
Dockerfile собирается для Linux AMD64 и ARM64. В обоих случаях по умолчанию используется CPU; CPU ARM64 не подразумевает наличие GPU NVIDIA.
| Хост | Конфигурация | Проверка |
|---|---|---|
| Linux AMD64 CPU | compose.yaml |
Сборка и проверки CI; инференс на CPU |
| Linux ARM64 CPU | compose.yaml, собранный на хосте ARM64 |
Сборка и проверки CI на нативном раннере ARM64; инференс на CPU |
| Linux AMD64 NVIDIA | добавьте compose.cuda.yaml (CUDA 12.8) |
Инференс CUDA на RTX 4070 Ti с базовым быстрым стартом |
| DGX Spark | добавьте compose.spark.yaml (ARM64, CUDA 13.0), с compose.http.yaml или без него |
CI собирает и загружает библиотеки CUDA без GPU; инференс на Spark пока не подтверждён |
| Apple Silicon | Контейнер Linux ARM64 на CPU | См. Apple Silicon |
ARM64 CPU
Соберите на целевом хосте. Docker выбирает свою нативную архитектуру:
docker compose run --build --rm laya
Кросс-сборки с docker buildx build --platform linux/arm64 --load -t laya:arm64 .
требуют сборщика ARM64 или настроенной эмуляции. Эмулированная сборка не показывает
нативную производительность инференса.
DGX Spark
Используйте Linux-хост Spark с поддерживаемым драйвером NVIDIA и
NVIDIA Container Toolkit.
Оверрайд выбирает ARM64, колёса CUDA 13.0 и GPU 0. Используйте его вместо
compose.cuda.yaml, а не вместе с ним:
docker compose -f compose.yaml -f compose.spark.yaml run --build --rm laya
Чтобы обслуживать HTTP API на Spark, добавьте compose.http.yaml. Настройки
обслуживания HTTP применяются без изменений:
docker compose -f compose.yaml -f compose.http.yaml -f compose.spark.yaml up --build laya-serve
Задайте LAYA_GPU_ID, чтобы выбрать другое устройство.
TORCH_VERSION фиксирует версию PyTorch для каждой сборки, как CPU, так и CUDA. Compose читает
LAYA_TORCH_VERSION; прямые сборки принимают
--build-arg TORCH_VERSION=2.14.0 --build-arg TORCH_INDEX=cu130. Чтобы изменить любое из двух,
нужна пересборка, потому что переменная окружения времени выполнения не может заменить
установленное колесо.
Сборки PyTorch для CUDA 13.0 на ARM64 зависят от cuSPARSELt 0.8.0 (PyTorch 2.11) или
0.8.1 (PyTorch 2.14). Колёса NVIDIA AArch64 для этих двух версий объявляют
manylinux2014_sbsa в своём файле WHEEL, что pip check отклоняет;
0.9.0 это исправляет. Сборка проверяет, что библиотека имеет формат ELF64 AArch64 и загружается,
а затем исправляет этот тег и его хеш в RECORD. Любая другая версия с тем же
дефектом приводит к сбою сборки вместо получения исправления, а pip check всё равно
запускается. Это следует находке о совместимости от @TheIrritainer в
FastLaya.
Отчёт о результатах Spark
В CI нет GPU, поэтому инференс на Spark требует отчёта с реального оборудования. Запустите это на
Spark и приложите его вывод вместе с nvidia-smi, версиями ОС и драйвера,
и ревизией образа:
docker compose -f compose.yaml -f compose.spark.yaml run --build --rm laya python -c '
import json, platform, torch
from pathlib import Path
from laya import load
assert platform.machine() == "aarch64"
assert torch.cuda.is_available()
print(torch.__version__, torch.version.cuda, torch.cuda.get_device_name(0))
print(torch.cuda.get_device_capability(0), torch.cuda.get_arch_list())
agent = load("convaiinnovations/laya", device="cuda")
request = json.loads(Path("/opt/laya/examples/request.json").read_text())
result = agent.predict(request["state"], request["questions"])
assert next(agent.model.parameters()).device.type == "cuda", "fell back to CPU"
assert set(result["answers"]) == set(request["questions"])
print("CUDA inference passed", torch.cuda.max_memory_allocated())
'
Повторите для каждого чекпойнта, который вы собираетесь запускать. Нативный тест CPU ARM64 не устанавливает поддержку ядер Blackwell или инференса на GPU. Специфичный для платформы стек CUDA у Jetson не покрывается оверрайдом Spark.
Apple Silicon
Ускорение на GPU Apple требует нативного PyTorch для macOS с MPS. Docker Desktop запускает Linux-контейнер, в котором нет бэкенда MPS, поэтому контейнер использует CPU. У Laya уже есть путь для устройства MPS, и PR #51 и PR #109 решают проблемы совместимости и производительности MPS вне Docker.