上篇文章大致講了下Vision Mamba的相關知識,網上關于Vision Mamba的配置博客太多,筆者主要用來整合下。
筆者在Win10和Linux下分別嘗試配置相關環境。
Win10下配置 失敗 \textcolor{red}{失敗} 失敗,最后出現的問題如下:
https://blog.csdn.net/weixin_46135891/article/details/137141378
有解決方法還請留言。
配置Linux下的Vision Mamba還是比較方便的,
目錄
- 前言
- CUDA,cudnn下載以及安裝
- CUDA
- cudnn
- 多CUDA環境切換
- Vision Mamba環境配置
- mamba-1.1.1
- casual-conv1d-1.1.3
- 其他組件
- 測試代碼
- vision mamba的簡單運行
- 參考博客
前言
筆者在linux下選用CUDA 11.8 \textcolor{red}{11.8} 11.8版本,也比較推薦讀者使用此版本,方便后續環境配置。
CUDA,cudnn下載以及安裝
CUDA
CUDA官網:https://developer.nvidia.com/cuda-11-8-0-download-archive?
筆者Linux版本是Ubuntu20.20的,固下載如下文件:cuda_11.8.0_520.61.05_linux.run
Cudnn官網:https://developer.nvidia.com/rdp/cudnn-archive
選擇適配CUDA11.8的版本即可, 筆者選用cudnn 8.9.7 (for CUDA 11.x)
選擇 --Local Installer for Linux x86_64 (Tar) 下載離線包
首先安裝CUDA,采用離線安裝方式,
sudo sh cuda_11.8.0_520.61.05_linux.run
首先accpet,
然后具體配置的時,去掉Deiver,只保留 CUDA 相關。
如下圖類似,(下圖取自網絡,不是筆者的CUDA11.8的實時截圖)
然后正常安裝即可,一般安裝在了 /usr/local/CUDA-11.8
配置CUDA環境
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export PATH=/usr/local/cuda/bin:$PATH
export CUDA_HOME=/usr/local/cuda
export LIBRARY_PATH=/usr/local/cuda/lib64
如果/usr/local/中沒有自動生成CUDA文件, 手動生成CUDA軟連接
sudo ln -s /usr/local/cuda-11.8 /usr/local/cuda
cudnn
解壓縮
tar -xvf cudnn-XX-linux-x64-vXXX.XXX.XX.tgz ## 這是最開始下載的cudnn文件
再將 剛剛解壓的 cuDNN里面的對應文件拷貝至CUDA指定路徑:
sudo cp include/cudnn*.h /usr/local/cuda-11.8/include
sudo cp lib/libcudnn* /usr/local/cuda-11.8/lib64
sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*
一切弄完后,重啟電腦。
多CUDA環境切換
如果讀者只有一個cudaXX.X版本的文件夾可以不用看此處,此節涉及多cuda環境切換。
在/usr/local 路徑下,分別執行
nvcc -V
stat cuda
如果指向同一個cuda版本,那么該版本就是正在使用的版本,而且沒意外的話,應該都是cuda-11.8
輸出類似如下:(下圖取自網絡,不是筆者的CUDA11.8的實時截圖)
如果要切換另一個cuda版本:
sudo rm -rf /usr/local/cuda ##這一步是去除軟連接
sudo ln -s /usr/local/cuda-XX.X /usr/local/cuda ##指定XX.X 為想要使用的版本
然后重新執行
nvcc -V
stat cuda
發現輸出的cuda版本同時發生了變化,此時就更換成功了
比如 將cuda11.8 設置為想要的版本:
sudo rm -rf /usr/local/cuda
sudo ln -s /usr/local/cuda-11.8 /usr/local/cuda
Vision Mamba環境配置
重啟后,電腦就有了CUDA-11.8,下面我們來具體配置Vision Mamba的環境。
筆者推薦Anaconda創建虛擬環境
#anaconda 創建py310虛擬環境
conda create -n your_name python=3.10.13 -y
安裝對應的torch包
#安裝虛擬環境其它包(筆者是 cuda11.8,安裝pytorch如下)
pip install torch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 --index-url https://download.pytorch.org/whl/cu118
去github上下載 vision mamba源碼包
https://github.com/hustvl/Vim
下載.zip文件然后手動解壓縮
或
git clone https://github.com/hustvl/Vim.git
接下來先安裝兩個比較有問題的包,這兩個裝好后基本就沒什么問題了。
mamba-1.1.1
方法1
下載 mamba-1.1.1的源碼包 :https://github.com/state-spaces/mamba/archive/refs/tags/v1.1.1.zip
解壓縮 mamba-1.1.1.zip
虛擬環境 進入到這個文件夾 執行
pip install .
方法2
如果方法1不行,來執行方法2
手動下載輪子:https://github.com/state-spaces/mamba/releases/download/v1.1.1/mamba_ssm-1.1.1+cu118torch2.1cxx11abiFALSE-cp310-cp310-linux_x86_64.whl
注:此輪子只對應cuda11.8的版本,所以筆者在文章開頭推薦讀者使用cuda11.8的環境。
然后安裝輪子
# 虛擬環境下安裝
pip install /下載路徑/mamba_ssm-1.1.1+cu118torch2.1cxx11abiFALSE-cp310-cp310-linux_x86_64.whl
方法2的安裝一般沒什么問題,如果報超時問題,可以梯子或重復執行上面這個安裝命令
安裝好后需要執行下面這個步驟,否則后續運行會報錯:
( “TypeError: Mamba.init() got an unexpected keyword argument ‘bimamba_type’.”)
讀者把vision mamba源碼里面的mamba-ssm替換到虛擬環境里面的mamba-ssm
具體的
sudo cp -r "其他路徑/Vim-main/mamba-1p1p1/mamba_ssm" "Annotation路徑/envs/mamba的虛擬環境/lib/python3.10/site-packages/"
casual-conv1d-1.1.3
方法1
下載casual-conv1d-1.1.3的源碼包 : https://github.com/Dao-AILab/causal-conv1d/archive/refs/tags/v1.1.3.zip
解壓縮 casual-conv1d-1.1.3.zip
虛擬環境 進入到這個文件夾 執行
pip install .
方法2
手動下載輪子:
https://github.com/Dao-AILab/causal-conv1d/releases/download/v1.1.3/causal_conv1d-1.1.3+cu118torch2.1cxx11abiFALSE-cp310-cp310-linux_x86_64.whl
注:此輪子只對應cuda11.8的版本,所以筆者在文章開頭推薦讀者使用cuda11.8的環境。
然后安裝輪子
# 虛擬環境下安裝
pip install /下載路徑/causal_conv1d-1.1.3+cu118torch2.1cxx11abiFALSE-cp310-cp310-linux_x86_64.whl
方法2的安裝一般沒什么問題,如果報超時問題,可以梯子或重復執行上面這個安裝命令
其他組件
如果上面兩個組件都安裝上了,那么以及成功99%了
#虛擬環境下
pip install timm mlflow -i https://pypi.tuna.tsinghua.edu.cn/simple
可能有遺漏的組件,后續執行代碼的時候,缺少什么安裝同樣的方式添加
測試代碼
在 VIM-main/vim/models_mamba.py的末尾添加如下代碼
if __name__ == '__main__':# cuda or cpudevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")print(device)# 實例化模型得到分類結果inputs = torch.randn(1, 3, 224, 224).to(device)model = vim_small_patch16_stride8_224_bimambav2_final_pool_mean_abs_pos_embed_with_midclstok_div2(pretrained=False).to(device)print(model)outputs = model(inputs)print(outputs.shape)# 實例化mamba模塊,輸入輸出特征維度不變 B C H Wx = torch.rand(10, 16, 64, 128).to(device)B, C, H, W = x.shapeprint("輸入特征維度:", x.shape)x = x.view(B, C, H * W).permute(0, 2, 1)print("維度變換:", x.shape)mamba = create_block(d_model=C).to(device)# mamba模型代碼中返回的是一個元組:hidden_states, residualhidden_states, residual = mamba(x)x = hidden_states.permute(0, 2, 1).view(B, C, H, W)print("輸出特征維度:", x.shape)
執行(run) VIM-main/vim/models_mamba.py
如果沒有問題會輸出 模型架構和一些結果:
torch.Size([1, 1000])
輸入特征維度: torch.Size([10, 16, 64, 128])
維度變換: torch.Size([10, 8192, 16])
輸出特征維度: torch.Size([10, 16, 64, 128])
如果輸出以上結果,那么恭喜你,vision mamba環境配置好了
vision mamba的簡單運行
希望讀者能夠大概看下vision mamba 的readme 來看看如何進行訓練的。
也應當看看main.py的參數配置,來進行選擇如何自定義一些配置信息
如下是筆者cifar-python100的訓練參數:
(虛擬環境下,在Vim-main/vim/路徑下 terminal終端執行代碼)
CUDA_VISIBLE_DEVICES=0 python main.py \
--model vim_small_patch16_224_bimambav2_final_pool_mean_abs_pos_embed_with_midclstok_div2 --batch-size 2 \
--drop-path 0.05 --weight-decay 0.05 --lr 1e-3 --num_workers 1 \
--data-set CIFAR \
--data-path /home/cr7/python/code/mamba_classify_test/cifer_dataset/ \
--output_dir /home/cr7/python/code/mamba_classify_test/mamba_outputs/cifar_result \
--no_amp
當然讀者也可以直接配置train.py,在pycharm里面點擊train.py執行,修改main.py的參數來進行想要的訓練了。
以下是必須配置,否則執行的時候缺少配置報錯,在main.py的對應配置地方進行修改
--batch-size , default=64 ##按照自己gpu顯存來設置 太大會爆顯存
--epochs, default=300 ## 訓練批次
--model, default="vim_small_patch16_224_bimambav2_final_pool_mean_abs_pos_embed_with_midclstok_div2" ## 在 models_mamba.py的結尾有4個可以選擇
--data-path , default=" /home/cr7/python/code/mamba_classify_test/cifer_dataset/" ##下載的分類數據集路徑
--data-set, default="CIFAR" ##分類數據集名字
--num_workers ,default =4 ##根據電腦性能 調整
注:以下是 pycharm 運行 main.py必要做的事情,否則會報錯
在main.py中的
def main(args):
添加一行 args.gpu=0 ##設置gpu的index
這里由于筆者只有一個gpu , 所以使用gpu序號0 做為訓練gpu
不添加的話,后續運行main.py會報錯:
AttributeError: 'Namespace' object has no attribute 'gpu'
輸出大致如下。
(mamba_py310) cr7@cr7:~/python/code/mamba_classify_test/Vim/vim$ CUDA_VISIBLE_DEVICES=0 python main.py \
> --model vim_small_patch16_224_bimambav2_final_pool_mean_abs_pos_embed_with_midclstok_div2 --batch-size 2 \
> --drop-path 0.05 --weight-decay 0.05 --lr 1e-3 --num_workers 1 \
> --data-set CIFAR \
> --data-path /home/cr7/python/code/mamba_classify_test/cifer_dataset/ \
> --output_dir /home/cr7/python/code/mamba_classify_test/mamba_outputs/cifar_result \
> --no_amp
Not using distributed mode
Namespace(batch_size=2, epochs=300, bce_loss=False, unscale_lr=False, model='vim_small_patch16_224_bimambav2_final_pool_mean_abs_pos_embed_with_midclstok_div2', input_size=224, drop=0.0, drop_path=0.05, model_ema=True, model_ema_decay=0.99996, model_ema_force_cpu=False, opt='adamw', opt_eps=1e-08, opt_betas=None, clip_grad=None, momentum=0.9, weight_decay=0.05, sched='cosine', lr=0.001, lr_noise=None, lr_noise_pct=0.67, lr_noise_std=1.0, warmup_lr=1e-06, min_lr=1e-05, decay_epochs=30, warmup_epochs=5, cooldown_epochs=10, patience_epochs=10, decay_rate=0.1, color_jitter=0.3, aa='rand-m9-mstd0.5-inc1', smoothing=0.1, train_interpolation='bicubic', repeated_aug=True, train_mode=True, ThreeAugment=False, src=False, reprob=0.25, remode='pixel', recount=1, resplit=False, mixup=0.8, cutmix=1.0, cutmix_minmax=None, mixup_prob=1.0, mixup_switch_prob=0.5, mixup_mode='batch', teacher_model='regnety_160', teacher_path='', distillation_type='none', distillation_alpha=0.5, distillation_tau=1.0, cosub=False, finetune='', attn_only=False, data_path='/home/cr7/python/code/mamba_classify_test/cifer_dataset/', data_set='CIFAR', inat_category='name', output_dir='/home/cr7/python/code/mamba_classify_test/mamba_outputs/cifar_result', device='cuda', seed=0, resume='', start_epoch=0, eval=False, eval_crop_ratio=0.875, dist_eval=False, num_workers=1, pin_mem=True, distributed=False, world_size=1, dist_url='env://', if_amp=False, if_continue_inf=False, if_nan2num=False, if_random_cls_token_position=False, if_random_token_rank=False, local_rank=0)
Creating model: vim_small_patch16_224_bimambav2_final_pool_mean_abs_pos_embed_with_midclstok_div2
number of params: 25450084
Start training for 300 epochs
Epoch: [0] [ 0/25000] eta: 22:46:27 lr: 0.000001 loss: 4.2079 (4.2079) time: 3.2795 data: 0.0525 max mem: 707
Epoch: [0] [ 10/25000] eta: 2:23:41 lr: 0.000001 loss: 4.6698 (4.6594) time: 0.3450 data: 0.0049 max mem: 765
Epoch: [0] [ 20/25000] eta: 1:25:18 lr: 0.000001 loss: 4.7118 (4.7024) time: 0.0512 data: 0.0001 max mem: 765
Epoch: [0] [ 30/25000] eta: 1:04:32 lr: 0.000001 loss: 4.7599 (4.6847) time: 0.0506 data: 0.0001 max mem: 765
Epoch: [0] [ 40/25000] eta: 0:54:04 lr: 0.000001 loss: 4.7495 (4.6971) time: 0.0513 data: 0.0001 max mem: 765
Epoch: [0] [ 50/25000] eta: 0:47:35 lr: 0.000001 loss: 4.6873 (4.6862) time: 0.0515 data: 0.0001 max mem: 765
Epoch: [0] [ 60/25000] eta: 0:43:12 lr: 0.000001 loss: 4.6870 (4.6894) time: 0.0506 data: 0.0001 max mem: 765
Epoch: [0] [ 70/25000] eta: 0:40:04 lr: 0.000001 loss: 4.6236 (4.6846) time: 0.0506 data: 0.0001 max mem: 765
Epoch: [0] [ 80/25000] eta: 0:37:45 lr: 0.000001 loss: 4.5900 (4.6900) time: 0.0512 data: 0.0001 max mem: 765
Epoch: [0] [ 90/25000] eta: 0:36:03 lr: 0.000001 loss: 4.6688 (4.6900) time: 0.0528 data: 0.0001 max mem: 765
參考博客
linux 下 多CUDA版本切換: https://blog.csdn.net/weixin_43408382/article/details/128358138
linux 下 vision mamba環境配置:https://blog.csdn.net/qq_52811934/article/details/136818016
linux 下 vision mamba配置的可能問題:https://blog.csdn.net/weixin_43408382/article/details/128358138
(筆者不建議參考下文博客中的cuda版本切換的方法)
linux 下 cuda11.8的安裝https://blog.csdn.net/w946612410/article/details/131786512