文档导航

ARM64 与 DGX Spark 容器

ARM64 与 DGX Spark 容器

Dockerfile 为 Linux AMD64 和 ARM64 构建。两者默认都用 CPU;ARM64 的 CPU 并不代表就有 NVIDIA GPU。

主机 配置 验证
Linux AMD64 CPU compose.yaml CI 构建与检查;CPU 推理
Linux ARM64 CPU compose.yaml,在 ARM64 主机上构建 在原生 ARM64 runner 上做 CI 构建与检查;CPU 推理
Linux AMD64 NVIDIA 加上 compose.cuda.yaml(CUDA 12.8) 用基础快速开始在 RTX 4070 Ti 上做 CUDA 推理
DGX Spark 加上 compose.spark.yaml(ARM64,CUDA 13.0),可选再叠加 compose.http.yaml CI 在没有 GPU 的情况下构建并加载 CUDA 库;Spark 推理尚无报告
Apple Silicon 在 CPU 上跑 Linux ARM64 容器 见 Apple Silicon

ARM64 CPU

在目标主机上构建。Docker 会选择它原生的架构:

docker compose run --build --rm laya

用 docker buildx build --platform linux/arm64 --load -t laya:arm64 . 做交叉构建,需要一台 ARM64 构建机或配置好的模拟。模拟构建体现不出原生推理性能。

DGX Spark

用 Spark 的 Linux 主机,配上它支持的 NVIDIA 驱动和 NVIDIA Container Toolkit。 这个 override 选择 ARM64、CUDA 13.0 wheel 和 GPU 0。用它来代替 compose.cuda.yaml,而不是 和它一起用:

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

要在 Spark 上提供 HTTP API,加上 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。改动其中任何一个都需要重新 构建,因为运行时的环境变量无法替换已安装的 wheel。

PyTorch 面向 ARM64 的 CUDA 13.0 构建依赖 cuSPARSELt 0.8.0(PyTorch 2.11)或 0.8.1(PyTorch 2.14)。NVIDIA 这两个版本的 AArch64 wheel 在 WHEEL 文件里声明了 manylinux2014_sbsa, 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())
'

对你打算运行的每个 checkpoint 都重复一遍。一次原生 ARM64 CPU 测试并不能证明 Blackwell 内核 或 GPU 推理得到支持。Jetson 平台专属的 CUDA 栈不在 Spark override 的覆盖范围内。

Apple Silicon

Apple GPU 加速需要带 MPS 的原生 macOS PyTorch。Docker Desktop 跑的是 Linux 容器,没有 MPS 后端,所以容器只能用 CPU。Laya 已经有 MPS 设备路径, PR #51 和 PR #109 处理了 Docker 之外的 MPS 兼容性和性能。