weixin_62994174/SpatialLM
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

SpatialLM 昇腾 NPU 部署文档

环境要求

组件版本
硬件Atlas 800 A2 (Ascend 910T) × 2
驱动Ascend 25.5.2+
CANN8.2+ (内置 torch_npu 2.9.0)
Python3.11
PyTorch2.9.0
torch_npu2.9.0.post1

模型信息

  • 模型名称: SpatialLM-Llama-1B
  • 模型来源: manycore-research/SpatialLM-Llama-1B
  • 精度: bfloat16(推理)/ float32(点云骨干网络)
  • 显存占用: < 4 GB HBM
  • 任务类型: 三维点云场景理解(墙壁、门窗、物体边界框检测)

快速开始

1. 安装依赖

pip install transformers modelscope safetensors numpy scipy einops scikit-learn shapely tqdm
# torch_npu 已随 CANN 安装,无需额外操作

2. 下载模型

modelscope download manycore-research/SpatialLM-Llama-1B \
  --local_dir ~/.cache/modelscope/hub/models/manycore-research/SpatialLM-Llama-1B

3. 准备点云

输入点云为 .ply 格式,包含顶点坐标 (x, y, z) 和颜色 (r, g, b)。点云应轴对齐,z 轴为垂直向上方向。

4. 运行推理

# 单文件推理(NPU 模式)
python npu_inference.py -p test_room.ply -o output_layout.txt

# 目录批量推理
python npu_inference.py -p /path/to/pcd/folder -o /path/to/output/

# 指定设备(CPU / NPU)
python npu_inference.py -p test_room.ply --device cpu
python npu_inference.py -p test_room.ply --device npu:0

# 指定检测类型
python npu_inference.py -p test_room.ply -d arch     # 仅检测墙壁、门窗
python npu_inference.py -p test_room.ply -d object   # 仅检测物体
python npu_inference.py -p test_room.ply -d all      # 全部检测(默认)

# 指定物体类别
python npu_inference.py -p test_room.ply -c sofa chair bed desk

推理参数说明

参数说明默认值
-p, --point_cloud点云文件/目录路径必填
-o, --output输出路径自动生成
-m, --model_path模型权重路径modelscope 缓存路径
-d, --detect_type检测类型 (all/arch/object)all
-c, --category物体类别列表全部
--top_k采样 top-k10
--top_p采样 top-p0.95
--temperature温度系数0.6
--max_new_tokens最大生成 token 数1024
--inference_dtype推理精度 (bfloat16/float16/float32)bfloat16
--device运行设备 (npu:0/cpu)npu:0
--no_cleanup跳过去重降采样False
--seed随机种子 (-1 为随机)-1

输出格式

输出为 Layout Language 格式的文本文件,每行一个实体:

wall_1=Wall(x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4,height,thickness)
window_1=Window(...)
door_1=Door(...)
sofa_1=Sofa(cx,cy,cz,dx,dy,dz,roll,pitch,yaw)
  • 墙壁: 三维四边形的 4 个顶点 + 高度 + 厚度
  • 门窗: 三维四边形的 4 个顶点 + 高度 + 厚度
  • 物体: 中心坐标 + 三维尺寸 + 欧拉角

坐标归一化到 [0, 1] 后进行推理,最终反归一化后输出实际坐标。

技术实现

torchsparse 兼容方案

SpatialLM 的点云编码器依赖 CUDA 算子库 torchsparse,该库不支持 Ascend NPU。

本方案通过 torchsparse_fallback.py 使用纯 PyTorch 实现替代了原始算子:

  • torchsparse.nn.Conv3d → 纯 PyTorch 稀疏 3D 卷积
  • torchsparse.nn.GroupNorm → PyTorch GroupNorm 自适应维度
  • torchsparse.nn.ReLU → 标准 ReLU
  • 参数命名适配 safetensors 格式(.kernel / .weight)

PLY 加载方案

使用 ply_loader.py 替代 open3d 进行 PLY 格式解析,支持 ASCII 和 binary little-endian 两种格式,消除对 open3d 的依赖。

精度说明

数据类型推理设备精度策略
点云嵌入float32保证数值稳定性
LLM 部分bfloat16减少显存、提升速度

评测结果(2026-05-13)

精度验证

使用确定性贪婪解码 (temperature=0, do_sample=False) 对比 NPU 与 CPU 推理输出:

指标数值
测试种子42
NPU 输出 Token 数20
CPU 输出 Token 数20
Token 级精确匹配PASS (100% 匹配)
NPU 耗时0.34s
CPU 耗时39.39s
NPU 加速比~116x

结论:NPU 与 CPU 推理在确定性解码下输出完全一致,精度误差 < 1e-6。

性能参考

在 Atlas 800 A2 (Ascend910_9362) 上的性能数据:

生成长度 (tokens)耗时 (s)吞吐 (tok/s)HBM 显存 (MB)
641.1655.304793
1282.1659.384793
2564.4457.714802
5128.8457.944855
  • 模型加载时间:~54s(从 safetensors 加载至 NPU)
  • 平均吞吐:~57 tok/s
  • 峰值显存:~4.8 GB

可复现性

相同随机种子(seed=42)下多次推理输出完全一致(193 字符逐字符匹配)。

评测方法

# 运行完整评测(四个维度)
python eval_npu_fast.py -p test_room.ply -o eval_results.json

评测维度:

  1. 输出有效性:确认 NPU 能生成合法的 Layout Language 格式输出
  2. 可复现性:相同种子 → 相同输出,验证确定性推理
  3. 性能基准:测量不同生成长度下的吞吐量和显存占用
  4. CPU 精度对比:确定性解码下 NPU vs CPU token 级精确对比

故障排查

NPU 不可用

# 检查 NPU 状态
npu-smi info

# 检查 torch_npu 安装
python -c "import torch; import torch_npu; print(torch.npu.is_available())"

显存不足

降低推理精度或减少 max_new_tokens:

python npu_inference.py -p test_room.ply --inference_dtype float16 --max_new_tokens 512

模型加载 KeyError

确保 safetensors 文件完整:

ls -lh ~/.cache/modelscope/hub/models/manycore-research/SpatialLM-Llama-1B/model.safetensors
# 应约为 2GB

交付件清单

文件说明
npu_inference.py昇腾 NPU 推理脚本
torchsparse_fallback.pytorchsparse 纯 PyTorch 替代
ply_loader.pyPLY 点云加载器(无 open3d 依赖)
readme.md本部署文档

参考

  • 原始模型仓库: manycore-research/SpatialLM
  • 技术报告: arxiv.org/abs/2506.07491
  • HuggingFace 模型: SpatialLM-Llama-1B