Linux 系统中安装 NVIDIA 显卡驱动 + 4090M 测评+SAM2测试

linux安装显卡驱动

因为项目需要,买了一块4090M的外置显卡,来测试是否满足项目的需求。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

第一部分:安装前的关键准备
1 确认显卡型号

lspci | grep -i nvidia
  1. 确定系统架构
uname -m # x86_64 表示64位系统

第二部分:Ubuntu/Debian 系
使用官方仓库安装(推荐)

# 添加官方PPA仓库
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update

# 查询可用驱动版本
ubuntu-drivers devices

# 自动安装推荐版本(通常标记为recommended)
sudo ubuntu-drivers autoinstall

# 或手动指定版本
sudo apt install nvidia-driver-580-open

在这里插入图片描述
如果下载缓慢的话可以换源。

删除残留下载文件的方法:

# 清理所有下载的软件包缓存(保留空目录)
sudo apt clean

# 可选:仅删除不再需要的缓存(如旧版本、未安装成功的包),保留已安装软件的包
sudo apt autoclean

# 列出缓存中NVIDIA相关的包(含.partial临时文件)
ls /var/cache/apt/archives/nvidia*

# 删除这些残留文件
sudo rm -rf /var/cache/apt/archives/nvidia*

然后重启,输入验证即可。

sudo reboot
nvidia-smi
nvidia-smi -L # 可以直接查看显卡型号

在这里插入图片描述
在这里插入图片描述

Anaconda+pytorch环境配置

uname-a # 查看内核

在这里插入图片描述
https://repo.anaconda.com/archive/

在这里插入图片描述

wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh

./Anaconda3-5.3.0-Linux-x86_64.sh

开始安装,一直enter ,yes 直到安装完
点击enter,输入yes,点击enter,输入yes
在这里插入图片描述

配置Anaconda环境

# 打开/etc/profile
vim /etc/profile
# 在末尾添加环境变量
export PATH=~/anaconda3/bin:$PATH
# 打开 ~/.bashrc
vim ~/.bashrc
# 在末尾添加环境变量
export PATH=~/anaconda3/bin:$PATH
# 刷新环境变量
source /etc/profile
source ~/.bashrc

conda -V

在这里插入图片描述

conda create -n track python=3.10.18

在这里插入图片描述

安装pytorch
https://pytorch.org/get-started/previous-versions/

conda install pytorch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 pytorch-cuda=11.8 -c pytorch -c nvidia
# CUDA 11.8
pip install torch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 --index-url https://download.pytorch.org/whl/cu118

在这里插入图片描述
在这里插入图片描述

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

在这里插入图片描述
安装vscode

sudo snap install code --classic

后续方案:
在这里插入图片描述

SAM2配置相关的问题

修改image_size,关于图像分辨率

由1024改为512,对应的feat_sizes: [64, 64]两个地方需要改成feat_sizes: [32, 32]

  memory_attention:
    _target_: sam2.modeling.memory_attention.MemoryAttention
    d_model: 256
    pos_enc_at_input: true
    layer:
      _target_: sam2.modeling.memory_attention.MemoryAttentionLayer
      activation: relu
      dim_feedforward: 2048
      dropout: 0.1
      pos_enc_at_attn: false
      self_attention:
        _target_: sam2.modeling.sam.transformer.RoPEAttention
        rope_theta: 10000.0
        feat_sizes: [32, 32] # 修改这里,64->32
        embedding_dim: 256
        num_heads: 1
        downsample_rate: 1
        dropout: 0.1
      d_model: 256
      pos_enc_at_cross_attn_keys: true
      pos_enc_at_cross_attn_queries: false
      cross_attention:
        _target_: sam2.modeling.sam.transformer.RoPEAttention
        rope_theta: 10000.0
        feat_sizes: [32, 32] # 修改这里,64->32
        rope_k_repeat: True
        embedding_dim: 256
        num_heads: 1
        downsample_rate: 1
        dropout: 0.1
        kv_in_dim: 64
    num_layers: 4

image_size: 512 # 修改这里, 1024->512

这样带来的结果就是:速度变快,不管是图像分割还是视频分割;缺点就是效果会相对应的变差(因为SAM2这个模型原始的训练图像大小就是1024*1024的)
在这里插入图片描述

另外,还需要修改一个地方才能正常使用。
SAM2ImagePredictor这个地方会出现问题:.view

feats = [
            feat.permute(1, 2, 0).view(1, -1, *feat_size)
            for feat, feat_size in zip(vision_feats[::-1], self._bb_feat_sizes[::-1])
][::-1]
self._bb_feat_sizes = [
            (256, 256),
            (128, 128),
            (64, 64),
        ]

最简单的修改方法就是把上面的这个改为下面的这个

self._bb_feat_sizes = [
            (128, 128),
            (64, 64),
            (32, 32),
        ]     

或者增加一段代码:这样可以自动计算特征尺寸列表

# Spatial dim for backbone feature maps
hires_size = self.model.image_size // 4
self._bb_feat_sizes = [[hires_size // (2**k)]*2 for k in range(3)]

这样改虽然速度会获得提升,但是效果会变得很差,所以一般不推荐这样修改

推理速度太慢

在这里插入图片描述
待测试。。。

如何推理更长的视频?或者说更长视频的支持

因为SAM2会同时将所有帧加载进来,后续是一帧一帧做的推理。所以前期这个将所有帧加载进来极其消耗内存。
现在这个方法并不能支持更长视频的支持,但是会一定程度上解决内存溢出的问题。
方法:将视频首先分割成单帧图像,保存在一个文件夹里,然后将视频帧的图像文件夹路径传给init_state函数即可。

# 提取视频帧
frames_path = self.extractVideoFrames(videoPath)

# 初始化推理状态
predictor = self.getPredictorVideo()
inference_state = predictor.init_state(video_path=frames_path)

分割成一帧一帧的图片:

def extractVideoFrames(self, videoPath):
    """
    将视频分割成一帧一帧的图片,保存到与视频同一个文件夹下的frames文件夹中。
    
    参数:
        videoPath (str): 视频文件的路径
        
    返回:
        str: frames文件夹的路径
    """
    self.log.debug(f'----------开始提取视频帧: {videoPath}----------')
    
    # 获取视频所在的文件夹路径
    video_dir = os.path.dirname(os.path.abspath(videoPath))
    # 创建frames文件夹路径
    frames_dir = os.path.join(video_dir, 'frames')
    
    # 如果frames文件夹不存在,则创建
    if not os.path.exists(frames_dir):
        os.makedirs(frames_dir)
        self.log.debug(f'创建frames文件夹: {frames_dir}')
    
    # 打开视频文件
    cap = cv2.VideoCapture(videoPath)
    if not cap.isOpened():
        self.log.error(f'无法打开视频文件: {videoPath}')
        return frames_dir
    
    frame_count = 0
    saved_count = 0
    
    try:
        while True:
            ret, frame = cap.read()
            if not ret:
                break
            
            # 保存帧为图片,使用帧序号命名(例如: frame_0001.jpg)
            frame_filename = os.path.join(frames_dir, f'{frame_count:06d}.jpg')
            cv2.imwrite(frame_filename, frame)
            saved_count += 1
            frame_count += 1
            
            # 每100帧打印一次进度
            if frame_count % 100 == 0:
                self.log.debug(f'已提取 {frame_count} 帧')
        
        self.log.debug(f'----------视频帧提取完成,共提取 {saved_count} 帧,保存到: {frames_dir}----------')
    except Exception as e:
        self.log.error(f'提取视频帧时发生错误: {e}')
    finally:
        cap.release()
    
    return frames_dir

测试效果 4090M

20s视频 511帧 3条线 181s 350ms/帧 8G显存左右
再多的话就会爆内存了,理论上16G内存的话最多支持40s 25帧的视频
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
40s视频 1000帧 3条线(跟踪三个物体) 352s 352ms/帧 16G显存左右
在这里插入图片描述
增加内存条,8G+16G=24G
在这里插入图片描述
1000帧图片推理,显存占用大概在16G左右,接近跑满
在这里插入图片描述
耗时5:52,也就是352s
在这里插入图片描述
这是内存1000帧的时候的消耗,还剩下5G空闲
在这里插入图片描述
这是正常时候,还剩下17G空闲,也就是说1000帧的视频消耗掉了12G内存

测试效果 4080M

4080M相比4090M一帧推理慢100ms;16G内存对于500帧的视频是足够的。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

关于Swap交换空间,与SAM2关系不大

增大 Swap 交换空间的核心作用,是当物理内存被占满时,为系统和程序提供临时的 “内存兜底”,避免出现内存不足导致的程序崩溃或系统卡死
在这里插入图片描述
在这里插入图片描述
增大Swap交换空间的方法:

sudo swapoff /swapfile
sudo swapon --show # 查看启用的Swap文件
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile # 仅让 root 用户读写该文件,避免普通用户篡改
sudo mkswap /swapfile # 将新文件格式化为 Swap 格式
sudo swapon --show # 查看启用的Swap文件
sudo swapon /swapfile # 启用 Swap 文件

参考文章:
1 在Linux系统上安装NVIDIA显卡驱动的终极指南
2 在 Linux 系统中安装 NVIDIA 显卡驱动:详细指南
3 Linux安装Anaconda教程(2024最新)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值