Build fails on Mac; Linker missing Metal and Objc libraries
envgap__pytorch__vision-8222
01 / FAILURE SIGNATURE
As reported upstream
No identifying execution failure has been captured.
Not a benchmark task.
- In a clean container the reported failure did not reproduce, or the known fix did not make the project run.
02 / ENVIRONMENT RECIPE
- Base commit
315f31527e720999eecbb986679b3177d4ed5e37- Manifest
CMakeLists.txt- Reproduce
Awaiting issue-specific recipe- Run under trace
Awaiting a meaningful runtime command
03 / ORIGINAL ISSUE TEXT
pytorch/vision #8222 · read the original issue
### 🐛 Describe the bug
When I build the library from source according to the instructions I get the following linker errors:
```bash
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_MTLCompileOptions", referenced from:
objc-class-ref in nms_kernel.mm.o
objc-class-ref in ps_roi_align_kernel.mm.o
objc-class-ref in ps_roi_pool_kernel.mm.o
objc-class-ref in roi_align_kernel.mm.o
objc-class-ref in roi_pool_kernel.mm.o
"_OBJC_CLASS_$_NSString", referenced from:
objc-class-ref in nms_kernel.mm.o
objc-class-ref in ps_roi_align_kernel.mm.o
objc-class-ref in ps_roi_pool_kernel.mm.o
objc-class-ref in roi_align_kernel.mm.o
objc-class-ref in roi_pool_kernel.mm.o
"_objc_autorelease", referenced from:
vision::ops::mps::compileVisionOpsLibrary(id<MTLDevice>) in nms_kernel.mm.o
vision::ops::mps::compileVisionOpsLibrary(id<MTLDevice>) in ps_roi_align_kernel.mm.o
vision::ops::mps::compileVisionOpsLibrary(id<MTLDevice>) in ps_roi_pool_kernel.mm.o
vision::ops::mps::compileVisionOpsLibrary(id<MTLDevice>) in roi_align_kernel.mm.o
vision::ops::mps::compileVisionOpsLibrary(id<MTLDevice>) in roi_pool_kernel.mm.o
"_objc_autoreleasePoolPop", referenced from:
____ZN6vision3ops12_GLOBAL__N_110nms_kernelERKN2at6TensorES5_d_block_invoke in nms_kernel.mm.o
____ZN6vision3ops12_GLOBAL__N_127ps_roi_align_forward_kernelERKN2at6TensorES5_dxxx_block_invoke in ps_roi_align_kernel.mm.o
____ZN6vision3ops12_GLOBAL__N_128ps_roi_align_backward_kernelERKN2at6TensorES5_S5_dxxxxxxx_block_invoke in ps_roi_align_kernel.mm.o
____ZN6vision3ops12_GLOBAL__N_126ps_roi_pool_forward_kernelERKN2at6TensorES5_dxx_block_invoke in ps_roi_pool_kernel.mm.o
____ZN6vision3ops12_GLOBAL__N_127ps_roi_pool_backward_kernelERKN2at6TensorES5_S5_dxxxxxx_block_invoke in ps_roi_pool_kernel.mm.o
____ZN6vision3ops12_GLOBAL__N_124roi_align_forward_kernelERKN2at6TensorES5_dxxxb_block_invoke in roi_align_kernel.mm.o
____ZN6vision3ops12_GLOBAL__N_125roi_align_backward_kernelERKN2at6TensorES5_dxxxxxxxb_block_invoke in roi_align_kernel.mm.o
...
"_objc_autoreleasePoolPush", referenced from:
____ZN6vision3ops12_GLOBAL__N_110nms_kernelERKN2at6TensorES5_d_block_invoke in nms_kernel.mm.o
____ZN6vision3ops12_GLOBAL__N_127ps_roi_align_forward_kernelERKN2at6TensorES5_dxxx_block_invoke in ps_roi_align_kernel.mm.o
____ZN6vision3ops12_GLOBAL__N_128ps_roi_align_backward_kernelERKN2at6TensorES5_S5_dxxxxxxx_block_invoke in ps_roi_align_kernel.mm.o
____ZN6vision3ops12_GLOBAL__N_126ps_roi_pool_forward_kernelERKN2at6TensorES5_dxx_block_invoke in ps_roi_pool_kernel.mm.o
____ZN6vision3ops12_GLOBAL__N_127ps_roi_pool_backward_kernelERKN2at6TensorES5_S5_dxxxxxx_block_invoke in ps_roi_pool_kernel.mm.o
____ZN6vision3ops12_GLOBAL__N_124roi_align_forward_kernelERKN2at6TensorES5_dxxxb_block_invoke in roi_align_kernel.mm.o
____ZN6vision3ops12_GLOBAL__N_125roi_align_backward_kernelERKN2at6TensorES5_dxxxxxxxb_block_invoke in roi_align_kernel.mm.o
...
"_objc_opt_new", referenced from:
vision::ops::mps::compileVisionOpsLibrary(id<MTLDevice>) in nms_kernel.mm.o
vision::ops::mps::compileVisionOpsLibrary(id<MTLDevice>) in ps_roi_align_kernel.mm.o
vision::ops::mps::compileVisionOpsLibrary(id<MTLDevice>) in ps_roi_pool_kernel.mm.o
vision::ops::mps::compileVisionOpsLibrary(id<MTLDevice>) in roi_align_kernel.mm.o
vision::ops::mps::compileVisionOpsLibrary(id<MTLDevice>) in roi_pool_kernel.mm.o
ld: symbol(s) not found for architecture arm64
```
I use cmake to set up the build like so: ` /opt/homebrew/bin/cmake -DCMAKE_PREFIX_PATH=`python3 -c 'import torch;print(torch.utils.cmake_prefix_path)'` -DWITH_MPS=1`. Torchvision builds when I turn MPS builds off.
What can I do to build the project from source with MPS successfully?
### Versions
Collecting environment information...
PyTorch version: 2.1.0
Is debug build: False
CUDA used to build PyTorch: None
ROCM used to build PyTorch: N/A
OS: macOS 13.4.1 (arm64)
GCC version: Could not collect
Clang version: 14.0.3 (clang-1403.0.22.14.1)
CMake version: version 3.27.1
Libc version: N/A
Python version: 3.9.6 (default, May 7 2023, 23:32:44) [Clang 14.0.3 (clang-1403.0.22.14.1)] (64-bit runtime)
Python platform: macOS-13.4.1-arm64-arm-64bit
Is CUDA available: False
CUDA runtime version: No CUDA
CUDA_MODULE_LOADING set to: N/A
GPU models and configuration: No CUDA
Nvidia driver version: No CUDA
cuDNN version: No CUDA
HIP runtime version: N/A
MIOpen runtime version: N/A
Is XNNPACK available: True
CPU:
Apple M2 Max
Versions of relevant libraries:
[pip3] numpy==1.25.2
[pip3] torch==2.1.0
[pip3] torchdata==0.7.0
[pip3] torchtext==0.16.0
[pip3] torchvision==0.16.0
[conda] Could not collect04 / LABELS
Labels from the report text only; not yet run
No supported category has been assigned.
Label rules and the text that matched
[]