Documentación

Contenedores ARM64 y DGX Spark

El Dockerfile compila para Linux AMD64 y ARM64. La CPU sigue siendo el valor por defecto en ambos; una CPU ARM64 no implica una GPU NVIDIA.

Host Configuración Validación
CPU Linux AMD64 compose.yaml Compilación y comprobaciones de CI; inferencia en CPU
CPU Linux ARM64 compose.yaml, compilado en el host ARM64 Compilación y comprobaciones de CI en un runner ARM64 nativo; inferencia en CPU
NVIDIA Linux AMD64 añade compose.cuda.yaml (CUDA 12.8) Inferencia CUDA en una RTX 4070 Ti con el inicio rápido base
DGX Spark añade compose.spark.yaml (ARM64, CUDA 13.0), con o sin compose.http.yaml CI compila y carga las bibliotecas de CUDA sin GPU; inferencia de Spark todavía no informada
Apple Silicon Contenedor Linux ARM64 en CPU Consulta Apple Silicon

CPU ARM64

Compila en el host de destino. Docker selecciona su arquitectura nativa:

docker compose run --build --rm laya

Las compilaciones cruzadas con docker buildx build --platform linux/arm64 --load -t laya:arm64 . necesitan un builder ARM64 o emulación configurada. Una compilación emulada no muestra el rendimiento de inferencia nativo.

DGX Spark

Usa el host Linux del Spark con su controlador NVIDIA compatible y el NVIDIA Container Toolkit. La anulación selecciona ARM64, ruedas CUDA 13.0 y la GPU 0. Úsala en lugar de compose.cuda.yaml, no junto a ella:

docker compose -f compose.yaml -f compose.spark.yaml run --build --rm laya

Para servir la API HTTP en el Spark, añade compose.http.yaml. Los ajustes de Servicio HTTP se aplican sin cambios:

docker compose -f compose.yaml -f compose.http.yaml -f compose.spark.yaml up --build laya-serve

Define LAYA_GPU_ID para seleccionar otro dispositivo.

TORCH_VERSION fija PyTorch para todas las compilaciones, tanto de CPU como de CUDA. Compose lee LAYA_TORCH_VERSION; las compilaciones directas toman --build-arg TORCH_VERSION=2.14.0 --build-arg TORCH_INDEX=cu130. Cambiar cualquiera de los dos necesita una recompilación, porque una variable de entorno de runtime no puede reemplazar la rueda instalada.

Las compilaciones de CUDA 13.0 de PyTorch para ARM64 dependen de cuSPARSELt 0.8.0 (PyTorch 2.11) o 0.8.1 (PyTorch 2.14). Las ruedas AArch64 de NVIDIA para esas dos versiones declaran manylinux2014_sbsa dentro de su archivo WHEEL, que pip check rechaza; 0.9.0 lo corrige. La compilación comprueba que la biblioteca es ELF64 AArch64 y que carga, y luego corrige esa etiqueta y su hash de RECORD. Cualquier otra versión con el mismo defecto hace fallar la compilación en lugar de recibir la reparación, y pip check sigue ejecutándose. Esto sigue el hallazgo de compatibilidad de @TheIrritainer en FastLaya.

Informar de resultados de Spark

CI no tiene GPU, así que la inferencia de Spark necesita un informe desde hardware real. Ejecuta esto en el Spark e incluye su salida junto con nvidia-smi, las versiones del sistema operativo y del controlador, y la revisión de la imagen:

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())
'

Repite con cada checkpoint que pretendas ejecutar. Una prueba de CPU ARM64 nativa no establece soporte de kernels de Blackwell ni de inferencia en GPU. La pila CUDA específica de plataforma de Jetson no está cubierta por la anulación de Spark.

Apple Silicon

La aceleración por GPU de Apple necesita PyTorch nativo de macOS con MPS. Docker Desktop ejecuta un contenedor Linux, que no tiene backend MPS, así que el contenedor usa CPU. Laya ya tiene una ruta de dispositivo MPS, y PR #51 y PR #109 abordan la compatibilidad y el rendimiento de MPS fuera de Docker.