Mamba-Yolo (AAAI 2025)是《Mamba YOLO: SSMs-Based YOLO For Object Detection》一文中提出的,在Yolo v8中加入VMamba模块的Yolo算法。GitHub项目代码为:https://github.com/HZAI-ZJNU/Mamba-YOLO。很多同学通过博客《Windows环境下Mamba-Yolo的运行环境搭建》找到笔者询问安装包等相关事宜,由于原文作者的环境是本人配置,原文博客未解释清楚原理,特此叙述。
- 环境配置
1. 环境安装原理
从其论文和项目代码可知,Mamba YOLO 的核心是Vmamba (VMamba: Visual State Space Model),本人给那位同学的也是用自己编译的 Windows下的 VMamba (含selective_scan_cuda_core模块)。因此,基本的安装只需要参考本人之前的系列博客:
- Windows 下 VMamba 安装教程(无需更改base环境中的cuda版本且可加速)(此版本为 cuda 11.8,需要绕过triton)
- Windows 下Mamba2 / Vim / Vmamba 环境安装问题记录及解决方法终极版(无需绕过triton)(此版本为 cuda 12.4,无需绕过triton)
整个过程已经开源,大家可以按照教程自己编译即可,成功编译后会在虚拟环境里(xxx\conda\envs\xxx\Lib\site-packages\
)生成:
selective-scan-cuda-core.cp310-win-amd64.pyd
;selective-scan-cuda-oflex.cp310-win-amd64.pyd
。
如果嫌麻烦,本人编译好的 whl 安装包也有(python,torch及cuda版本需要和博客里保持一致):
- CUDA 11.8:【优快云:selective-scan-0.0.2-cp310-cp310-win-amd64.whl (包含core)】;或者【优惠通道:(含core / cuda11.8)selective-scan-0.0.2-cp310-cp310-win-amd64.whl】
- CUDA 12.4:【优快云:(只适用于torch 2.4,cuda12.4,python 3.10,GPU算力8.9)selective-scan-0.0.2-cp310-cp310-win-amd64.whl(包含core)】或者 【mbd优惠地址】
- CUDA 12.4:【优快云:通用算力版(cuda12.4)selective-scan-0.0.2-cp310-cp310-win-amd64.whl(包含core)】或者 【mbd优惠地址】
即使是终极版没有绕过triton,在Windows上运行目测还是和Linux上区别,如果有条件,最好还是换成Linux平台。
2. 关于 selective_scan_cuda
注意,selective_scan_cuda.cp310-win_amd64.pyd 是selective_scan_cuda模块对应的文件,它是成功安装 Mamba 后生成的文件。在 Vmamba 里面,selective_scan_cuda (其代码里简称为“cuda”)是可选的,不是必须,Mamba YOLO 里面的readme同样也未曾说这是必须要安装的。如果个人有研究的需要,想要安装 Mamba,可以参考本人之前的系列教程:
- Window 下Mamba 环境安装踩坑问题汇总及解决方法 (无需绕过selective_scan_cuda)(CUDA 11.8 , Mamba1版本,不支持triton)
- Windows 下Mamba2 环境安装问题记录及解决方法(causal_conv1d=1.4.0,mamba_ssm=2.2.2)(CUDA 11.8 , Mamba2版本,不支持triton)
- Windows 下Mamba2 / Vim / Vmamba 环境安装问题记录及解决方法终极版(无需绕过triton)(CUDA 12.4 , Mamba2版本,支持triton)
配置过程依旧是开源的,大家可以按照教程自己编译即可,成功编译后会在虚拟环境里(xxx\conda\envs\xxx\Lib\site-packages\
)生成:selective_scan_cuda.cp310-win_amd64.pyd
。如果嫌麻烦,本人编译好的 whl 安装包链接在博客里也有(python,torch及cuda版本需要和博客里保持一致)。
selective_scan_cuda 只在 Mamba-YOLO/ultralytics/nn/modules/common_utils_mbyolo.py
下开头出现:
try:
"sscore acts the same as mamba_ssm"
import selective_scan_cuda_core
except Exception as e:
print(e, flush=True)
"you should install mamba_ssm to use this"
SSMODE = "mamba_ssm"
import selective_scan_cuda
# from mamba_ssm.ops.selective_scan_interface import selective_scan_fn, selective_scan_ref
即 selective_scan_cuda_core 导入失败才会导入 selective_scan_cuda,如个人无这种特殊需求,可以不安装 Mamba 。
3. 环境验证
尝试运行 import selective_scan_cuda_core
,一般无报错即可。
- 报错及解决
大部分报错可以参考本人之前的系列博客。
4. DLl load failed
使用whl 安装的同学需要跟对应博客的环境(python 3.10,torch 及 cuda 版本)相同,否则会由于版本不匹配出现 DLl load failed
错误:
ImportError: DLL load failed while importing selective_scan_cuda_core: 找不到指定的程序。
检查识别到的CUDA版本是否和博客里的一致:
nvcc -V
python -c "import torch.utils.cpp_extension; print(torch.utils.cpp_extension.CUDA_HOME)"
5. FutureWarning
出现
FutureWarning: Importing from timm.models.layers is deprecated, please import via timm.layers
这不是报错,只是警告,可以观察程序正常运行完成。
- 模型训练
由于平台的不同,对 Mamba-YOLO/mbyolo_train.py 文件里面包含文件路径的部分略作修改:
from ultralytics import YOLO
import argparse
import os
ROOT = os.path.abspath('.')
def parse_opt():
parser = argparse.ArgumentParser()
parser.add_argument('--data', type=str, default=os.path.normpath(os.path.join(ROOT,
'ultralytics/cfg/datasets/coco8.yaml')), help='dataset.yaml path')
parser.add_argument(
'--config', type=str, default=os.path.normpath(os.path.join(ROOT, 'ultralytics/cfg/models/mamba-yolo/Mamba-YOLO-T.yaml')), help='model path(s)')
parser.add_argument('--batch_size', type=int,
default=5, help='batch size')
parser.add_argument('--imgsz', '--img', '--img-size',
type=int, default=640, help='inference size (pixels)')
parser.add_argument('--task', default='train',
help='train, val, test, speed or study')
parser.add_argument('--device', default='0',
help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--workers', type=int, default=64,
help='max dataloader workers (per RANK in DDP mode)')
parser.add_argument('--epochs', type=int, default=300)
parser.add_argument('--optimizer', default='SGD', help='SGD, Adam, AdamW')
parser.add_argument('--amp', action='store_true', help='open amp')
parser.add_argument('--project', default=os.path.normpath(
os.path.join(ROOT, 'output_dir/mscoco')), help='save to project/name')
parser.add_argument('--name', default='mambayolo',
help='save to project/name')
parser.add_argument('--half', action='store_true',
help='use FP16 half-precision inference')
parser.add_argument('--dnn', action='store_true',
help='use OpenCV DNN for ONNX inference')
opt = parser.parse_args()
return opt
if __name__ == '__main__':
print(ROOT)
opt = parse_opt()
task = opt.task
print(opt.data)
args = {
"data": opt.data,
"epochs": opt.epochs,
"workers": opt.workers,
"batch": opt.batch_size,
"optimizer": opt.optimizer,
"device": opt.device,
"amp": opt.amp,
"project": opt.project,
"name": opt.name,
}
# 遍历打印字典args
for key, value in args.items():
print(key, value)
model_conf = opt.config
task_type = {
"train": YOLO(model_conf).train(**args),
"val": YOLO(model_conf).val(**args),
"test": YOLO(model_conf).test(**args),
}
task_type.get(task)