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 兼容性和性能。