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.