如何优雅地抢占显卡

各位是否一直头疼于服务器抢不上卡?不用担心,在我的邀请下,deepseek给大家写了一个自动检测显卡空闲情况并及时抢占的代码。使用只需要简单改部分参数即可~

需要实现的功能如下:

  • 检测显卡状态
  • 在终端执行需要跑的命令
  • 每隔一段时间进行检测

这些功能下面都实现了,本人亲测能跑,需要修改的部分有

  • 显卡数,如果你只需要1张卡,在main函数的if_available>=8那里把8改成1即可(其他同理)
  • 时间啥的自己改
  • 激活conda环境名,自己改自己的就好,以及conda.sh位置自己找一下改了就行

如下:

def run_training():
    """执行训练命令"""
    try:
        cmd = [
            "/bin/bash", "-c",
            "source /xxx/miniconda3/etc/profile.d/conda.sh && "
            "conda activate xxx && "
            "FORCE_TORCHRUN=1 llamafactory-cli train "
            "/xxx/LLaMA-Factory/examples/train_full/qwen2_5vl_full_sft.yaml"
        ]
        subprocess.run(cmd, check=True)
        return True
    except subprocess.CalledProcessError as e:
        print(f"训练任务启动失败: {e}")
        return False

这里面,source /xxx/miniconda3/etc/profile.d/conda.sh 就是在准备conda环境(具体叫啥忘了,理解为前期准备),执行完这个就可以用conda activate xxx激活conda环境了。

下面是最终代码,nvidia-smi后面那一串不同机器可能报不同的错,自己找deepseek捣鼓捣鼓就行。

import subprocess
import time
import sys

def get_available_gpus():
    """获取前8张显卡的空闲状态"""
    try:
        # 使用通用字段查询GPU使用情况
        cmd = [
            "nvidia-smi",
            "--query-gpu=index,utilization.gpu,memory.used,memory.total",
            "--format=csv,noheader,nounits"
        ]
        result = subprocess.run(cmd, capture_output=True, text=True, check=True)
        
        available_gpus = 0
        for line in result.stdout.strip().split('\n'):
            if not line:
                continue
            
            # 解析GPU信息
            gpu_id, gpu_util, mem_used, mem_total = map(int, line.split(', '))
            
            # 仅检查前8张卡
            if gpu_id >= 8:
                continue
                
            # 空闲判断标准(可调整阈值)
            if gpu_util < 5 and (mem_used / mem_total) < 0.1:
                available_gpus += 1

        return available_gpus
    
    except Exception as e:
        print(f"GPU状态检测失败: {e}")
        return 0

def run_training():
    """执行训练命令"""
    try:
        cmd = [
            "/bin/bash", "-c",
            "source /xxx/miniconda3/etc/profile.d/conda.sh && "
            "conda activate xxx && "
            "FORCE_TORCHRUN=1 llamafactory-cli train "
            "/xxx/LLaMA-Factory/examples/train_full/qwen2_5vl_full_sft.yaml"
        ]
        subprocess.run(cmd, check=True)
        return True
    except subprocess.CalledProcessError as e:
        print(f"训练任务启动失败: {e}")
        return False

def main():
    print("🛠️ GPU监控系统启动...")
    check_interval = 300  # 默认20分钟检测一次
    
    while True:
        try:
            available = get_available_gpus()
            print(f"▏ 可用显卡:{available}/8 | 下次检测:{check_interval//60}分钟后")
            
            if available >= 8:
                print("🚦 满足条件,启动训练进程...")
                if run_training():
                    print("✅ 训练任务已部署")
                    sys.exit(0)
                else:
                    check_interval = 1800  # 失败后30分钟重试
            else:
                # 动态调整检测间隔(1-15分钟)
                check_interval = min(900, max(60, (8 - available) * 120))
            
            time.sleep(check_interval)
            
        except KeyboardInterrupt:
            print("\n🔌 用户终止监控进程")
            sys.exit(1)

if __name__ == "__main__":
    main()

OK,就到这里,祝大家不用再蹲GPU,都能优雅地度过每一个跑实验的日子…

### 解决方案概述 为了有效应对服务器中的显卡资源抢占问题,可以采用多种策略和技术手段来确保任务能够稳定运行并充分利用闲置的GPU资源。 #### 使用守护进程监控特定进程状态 对于固定名称的任务,可以通过编写Shell脚本来定期检查该任务的状态。具体实现方式如下: ```bash # 获取要守护进程的PID PID=$(ps -ef | grep PROCESS_NAME | grep -v grep | awk '{print $2}') if [ -z "$PID" ]; then echo "Process not found, it might have been preempted." else echo "Process is running with PID: $PID" fi ``` 这段代码用于检测名为`PROCESS_NAME`的进程是否存在,如果找不到对应的PID则说明此进程已被终止或者挤掉[^1]。 #### 自动化GPU占用监测与调度机制 针对希望在GPU空闲时立即启动新任务的需求,可设计一个自动化脚本周期性地查询各张显卡的工作负载状况,并据此决定何时发起新的计算作业。下面是一个简单的Bash脚本实例: ```bash #!/bin/bash ocp_memory=${2:-500} while true; do for i in $(nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits); do if [ $i -lt $ocp_memory ]; then CUDA_VISIBLE_DEVICES=$count python ${1} exit 0 fi ((count++)) done sleep 60 # Wait one minute before checking again. done ``` 上述脚本会在发现某块GPU可用(即已用内存小于给定阈值)时立刻执行传入的第一个参数所指向的Python脚本,并设置环境变量使目标程序仅能访问选定编号的GPU设备[^4]。 #### Python脚本辅助管理训练过程 考虑到某些场景下需要更精细控制实验流程的情况,还可以利用Python编写的专用工具来进行更加复杂的逻辑处理。例如,在每次完成一轮评估指标(`metric`)之前阻止意外中断操作;当用户指定了更高的优先级后自动增加额外的一次迭代次数等特性均有助于提高整体效率和灵活性[^3]。 ### 实施建议 - **建立健壮的日志记录体系**:无论是哪种类型的解决方案都应重视日志功能的设计,以便后续分析可能出现的问题。 - **考虑引入队列管理系统**:像Slurm这样的软件可以帮助更好地协调多用户的并发请求,减少冲突发生的概率。 - **优化现有硬件配置**:适当调整虚拟机分配比例或是升级物理机器性能也是缓解竞争压力的有效途径之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值