Documentação

Contêineres ARM64 e DGX Spark

O Dockerfile compila para Linux AMD64 e ARM64. A CPU continua sendo o padrão em ambos; uma CPU ARM64 não implica uma GPU NVIDIA.

Host Configuração Validação
CPU Linux AMD64 compose.yaml Build e checks de CI; inferência em CPU
CPU Linux ARM64 compose.yaml, compilado no host ARM64 Build e checks de CI em um runner ARM64 nativo; inferência em CPU
NVIDIA Linux AMD64 adicione compose.cuda.yaml (CUDA 12.8) Inferência CUDA em uma RTX 4070 Ti com o guia de início rápido base
DGX Spark adicione compose.spark.yaml (ARM64, CUDA 13.0), com ou sem compose.http.yaml A CI compila e carrega as bibliotecas CUDA sem GPU; inferência no Spark ainda não reportada
Apple Silicon Contêiner Linux ARM64 em CPU Veja Apple Silicon

CPU ARM64

Compile no host de destino. O Docker seleciona sua arquitetura nativa:

docker compose run --build --rm laya

Compilações cruzadas com docker buildx build --platform linux/arm64 --load -t laya:arm64 . precisam de um builder ARM64 ou de emulação configurada. Uma compilação emulada não mostra desempenho de inferência nativo.

DGX Spark

Use o host Linux do Spark com seu driver NVIDIA compatível e o NVIDIA Container Toolkit. O override seleciona ARM64, wheels de CUDA 13.0 e a GPU 0. Use-o no lugar de compose.cuda.yaml, não junto com ele:

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

Para servir a API HTTP no Spark, adicione compose.http.yaml. As configurações de Serviço HTTP se aplicam sem mudança:

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

Defina LAYA_GPU_ID para selecionar outro dispositivo.

TORCH_VERSION fixa o PyTorch em toda compilação, em CPU e CUDA igualmente. O Compose lê LAYA_TORCH_VERSION; compilações diretas aceitam --build-arg TORCH_VERSION=2.14.0 --build-arg TORCH_INDEX=cu130. Mudar qualquer um dos dois exige uma recompilação, porque uma variável de ambiente de runtime não substitui a wheel instalada.

As compilações CUDA 13.0 do PyTorch para ARM64 dependem do cuSPARSELt 0.8.0 (PyTorch 2.11) ou 0.8.1 (PyTorch 2.14). As wheels AArch64 da NVIDIA para essas duas versões declaram manylinux2014_sbsa dentro do arquivo WHEEL, o que o pip check rejeita; a 0.9.0 corrige isso. A compilação verifica que a biblioteca é ELF64 AArch64 e que ela carrega, depois corrige essa tag e o hash do seu RECORD. Qualquer outra versão com o mesmo defeito falha a compilação em vez de receber o reparo, e o pip check continua rodando. Isso segue a descoberta de compatibilidade de @TheIrritainer no FastLaya.

Relatar resultados do Spark

A CI não tem GPU, então a inferência no Spark precisa de um relato de hardware real. Rode isto no Spark e inclua sua saída junto com nvidia-smi, as versões de SO e driver, e a revisão da imagem:

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

Repita com cada checkpoint que você pretende rodar. Um teste em CPU ARM64 nativo não estabelece suporte a kernels Blackwell nem a inferência em GPU. A pilha CUDA específica da plataforma Jetson não é coberta pelo override do Spark.

Apple Silicon

A aceleração de GPU da Apple exige PyTorch nativo do macOS com MPS. O Docker Desktop roda um contêiner Linux, que não tem backend MPS, então o contêiner usa CPU. O Laya já tem um caminho de dispositivo MPS, e o PR #51 e o PR #109 tratam da compatibilidade e do desempenho do MPS fora do Docker.