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