文件導航

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