场景:Homebrew 安装 vLLM-Metal 0.32.0,加载
mlx-community/Qwen3.8-27B-bf16模型,服务能正常拉起,但控制台一堆警告,存在随机崩溃风险。平台:Apple Silicon(M 系列)macOS
原始报错日志预览
objc[84324]: Class AVFFrameReceiver is implemented in both /opt/homebrew/Cellar/ffmpeg/8.1.2/lib/libavdevice.62.3.102.dylib (0x16fce4328) and /opt/homebrew/Cellar/vllm-metal/0.32.0/libexec/lib/python3.12/site-packages/cv2/.dylibs/libavdevice.61.3.100.dylib (0x16fc6c3a8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[84324]: Class AVFAudioReceiver is implemented in both /opt/homebrew/Cellar/ffmpeg/8.1.2/lib/libavdevice.62.3.102.dylib (0x16fce4378) and /opt/homebrew/Cellar/vllm-metal/0.32.0/libexec/lib/python3.12/site-packages/cv2/.dylibs/libavdevice.61.3.100.dylib (0x16fc6c3f8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
W1024 18:17:10.485000 84324 torch/_library/triton.py:53] Triton not available, find_triton_kernels = []
(APIServer pid=84324) WARNING 10-24 18:17:10 [system_utils.py:255] Found ulimit of 2048 and failed to automatically increase with error current limit exceeds maximum limit. This can cause fd limit errors like `OSError: [Errno 24] Too many open files`. Consider increasing with ulimit -n
Could not reach the Hub ([Errno 60] Operation timed out). Using cached commit hash for 'mlx-community/Qwen3.8-27B-bf16'.
✅ 核心结论前置:vLLM 服务本身已经成功启动,模型加载正常;下面几条属于不同等级的警告,区分风险再处理。
问题 1:AVFFrameReceiver / AVFAudioReceiver OBJC 类重复定义(高风险,优先处理)
现象
macOS dyld 提示同一个 Objective-C 类同时存在两份 libavdevice:
- 全局 Homebrew 安装的
ffmpeg@8.1.2 - vLLM-Metal 内置
cv2(opencv-python)自带的内嵌 FFmpeg
警告原文提示:会造成随机类型转换失败、无规律神秘崩溃,属于典型的动态库符号冲突。
根因
OpenCV 官方 wheel 自带一套独立 FFmpeg;macOS 的 Objective-C 运行时不允许同一个类名注册两次,dyld 抛出这个告警。
重点:vLLM 推理完全不需要 OpenCV 的视频采集、avdevice 音视频输入能力,我们可以直接禁用这份冲突库。
修复方案(推荐,不卸载全局 ffmpeg)
进入 vLLM-Metal 的 venv 目录,把 cv2 自带的冲突库备份改名:
cd /opt/homebrew/Cellar/vllm-metal/0.32.0/libexec
mv lib/python3.12/site-packages/cv2/.dylibs/libavdevice.61.3.100.dylib lib/python3.12/site-packages/cv2/.dylibs/libavdevice.61.3.100.dylib.bak
回滚方式:把
.bak后缀删掉即可恢复。
备选方案(不推荐,会影响其他依赖 ffmpeg 的工具):
brew uninstall ffmpeg
备选环境变量方案(SIP 下不稳定,仅辅助)
export OPENCV_FFMPEG_SKIP_AVDEVICE=1
问题 2:Triton not available(无害,直接忽略)
Triton not available, find_triton_kernels = []
Triton 是面向 NVIDIA CUDA 的内核编译器,vLLM-Metal 是 Apple Metal 后端,原生不依赖 Triton。 这条警告完全不影响推理性能、功能,无需任何修复。
问题 3:ulimit 打开文件数限制 2048(中等风险,并发高时容易炸)
Found ulimit of 2048 and failed to automatically increase with error current limit exceeds maximum limit. This can cause fd limit errors like OSError: [Errno 24] Too many open files
macOS 默认软文件句柄上限 2048,vLLM 服务在高并发、多连接、KV Cache 场景下容易触发 Too many open files。 报错 current limit exceeds maximum limit:普通终端无权突破系统硬上限。
临时生效(当前终端会话)
ulimit -n 8192
想要永久调高,需要修改
/Library/LaunchDaemons/下的 plist 配置,适合长期跑服务的机器。
问题 4:HuggingFace Hub 超时 [Errno 60] Operation timed out
Could not reach the Hub ([Errno 60] Operation timed out). Using cached commit hash
网络访问 hf.co 超时,好在本地已经存在模型缓存,服务可以继续启动。 解决:启动前配置 HF 镜像地址:
export HF_ENDPOINT=https://hf-mirror.com
最终一键启动脚本(整合全部优化)
#!/bin/zsh
# HF镜像,解决hub超时
export HF_ENDPOINT=https://hf-mirror.com
# 辅助屏蔽opencv ffmpeg avdevice
export OPENCV_FFMPEG_SKIP_AVDEVICE=1
# 调高文件句柄限制
ulimit -n 8192
# vLLM-Metal 启动命令,按需修改参数
vllm serve mlx-community/Qwen3.8-27B-bf16 \
--port 8090 \
--enable-auto-tool-choice \
--tool-call-parser hermes \
--trust-remote-code \
--language-model-only
排错优先级清单
- 【最高优先级】重命名 cv2 内部的 libavdevice,根除 OBJC 重复类警告,规避随机崩溃
- 【次优先】配置 HF 镜像,避免每次启动拉取元数据超时
- 【按需】调高 ulimit,预防高并发下文件句柄耗尽
- 【无视】Triton not available 警告
补充备注