| 组件 | 版本 |
|---|---|
| 硬件 | Atlas 800 A2 (Ascend 910T) × 2 |
| 驱动 | Ascend 25.5.2+ |
| CANN | 8.2+ (内置 torch_npu 2.9.0) |
| Python | 3.11 |
| PyTorch | 2.9.0 |
| torch_npu | 2.9.0.post1 |
pip install transformers modelscope safetensors numpy scipy einops scikit-learn shapely tqdm
# torch_npu 已随 CANN 安装,无需额外操作modelscope download manycore-research/SpatialLM-Llama-1B \
--local_dir ~/.cache/modelscope/hub/models/manycore-research/SpatialLM-Llama-1B输入点云为 .ply 格式,包含顶点坐标 (x, y, z) 和颜色 (r, g, b)。点云应轴对齐,z 轴为垂直向上方向。
# 单文件推理(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-k | 10 |
--top_p | 采样 top-p | 0.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)坐标归一化到 [0, 1] 后进行推理,最终反归一化后输出实际坐标。
SpatialLM 的点云编码器依赖 CUDA 算子库 torchsparse,该库不支持 Ascend NPU。
本方案通过 torchsparse_fallback.py 使用纯 PyTorch 实现替代了原始算子:
torchsparse.nn.Conv3d → 纯 PyTorch 稀疏 3D 卷积torchsparse.nn.GroupNorm → PyTorch GroupNorm 自适应维度torchsparse.nn.ReLU → 标准 ReLU.kernel / .weight)使用 ply_loader.py 替代 open3d 进行 PLY 格式解析,支持 ASCII 和 binary little-endian 两种格式,消除对 open3d 的依赖。
| 数据类型 | 推理设备 | 精度策略 |
|---|---|---|
| 点云嵌入 | float32 | 保证数值稳定性 |
| LLM 部分 | bfloat16 | 减少显存、提升速度 |
使用确定性贪婪解码 (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) |
|---|---|---|---|
| 64 | 1.16 | 55.30 | 4793 |
| 128 | 2.16 | 59.38 | 4793 |
| 256 | 4.44 | 57.71 | 4802 |
| 512 | 8.84 | 57.94 | 4855 |
相同随机种子(seed=42)下多次推理输出完全一致(193 字符逐字符匹配)。
# 运行完整评测(四个维度)
python eval_npu_fast.py -p test_room.ply -o eval_results.json评测维度:
# 检查 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确保 safetensors 文件完整:
ls -lh ~/.cache/modelscope/hub/models/manycore-research/SpatialLM-Llama-1B/model.safetensors
# 应约为 2GB| 文件 | 说明 |
|---|---|
npu_inference.py | 昇腾 NPU 推理脚本 |
torchsparse_fallback.py | torchsparse 纯 PyTorch 替代 |
ply_loader.py | PLY 点云加载器(无 open3d 依赖) |
readme.md | 本部署文档 |