SiameseUIE开源大模型部署教程:GPU显存监控告警与自动服务重启配置

1. 引言:为什么需要GPU监控和自动重启

当你部署了强大的SiameseUIE中文信息抽取模型后,可能会遇到一个常见问题:长时间运行后GPU显存逐渐被占用,最终导致服务崩溃。这种情况在持续处理大量文本数据时尤其常见。

手动监控和重启不仅效率低下,还可能因为未能及时发现故障而导致业务中断。本文将手把手教你如何为SiameseUIE模型配置完整的GPU显存监控、告警和自动重启系统,让你的AI服务更加稳定可靠。

2. 环境准备与基础配置

2.1 检查当前环境

在开始配置之前,我们先确认一下基础环境:

# 检查GPU状态
nvidia-smi

# 检查Python环境
python --version

# 检查必要的Python包
pip list | grep -E "gpustat|supervisor"

2.2 安装必要的监控工具

# 安装gpustat用于GPU监控
pip install gpustat

# 安装supervisor用于进程管理(如果尚未安装)
apt-get update && apt-get install -y supervisor

3. GPU显存监控脚本编写

3.1 创建监控脚本

在 /opt/siamese-uie/ 目录下创建监控脚本:

mkdir -p /opt/siamese-uie/monitor
nano /opt/siamese-uie/monitor/gpu_monitor.py

3.2 监控脚本内容

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import subprocess
import json
import smtplib
import time
from email.mime.text import MIMEText

# 配置参数
GPU_MEMORY_THRESHOLD = 90  # 显存使用率阈值(%)
CHECK_INTERVAL = 60        # 检查间隔(秒)
MAX_RESTART_ATTEMPTS = 3   # 最大重启尝试次数

def get_gpu_memory_usage():
    """获取GPU显存使用情况"""
    try:
        result = subprocess.run(['gpustat', '--json'], 
                              capture_output=True, text=True, timeout=10)
        gpu_data = json.loads(result.stdout)
        
        memory_usage = []
        for gpu in gpu_data['gpus']:
            memory_used = gpu['memory.used']
            memory_total = gpu['memory.total']
            usage_percent = (memory_used / memory_total) * 100
            memory_usage.append(usage_percent)
            
        return memory_usage
    except Exception as e:
        print(f"获取GPU信息失败: {e}")
        return []

def check_service_status():
    """检查SiameseUIE服务状态"""
    try:
        result = subprocess.run(['supervisorctl', 'status', 'siamese-uie'],
                              capture_output=True, text=True, timeout=10)
        return 'RUNNING' in result.stdout
    except Exception as e:
        print(f"检查服务状态失败: {e}")
        return False

def restart_service():
    """重启SiameseUIE服务"""
    try:
        result = subprocess.run(['supervisorctl', 'restart', 'siamese-uie'],
                              capture_output=True, text=True, timeout=30)
        return 'started' in result.stdout or 'restarted' in result.stdout
    except Exception as e:
        print(f"重启服务失败: {e}")
        return False

def send_alert(message):
    """发送告警通知(示例代码,需要配置实际邮箱)"""
    print(f"告警: {message}")
    # 实际使用时可以配置邮件、钉钉、微信等告警方式
    # 这里仅作示例,需要根据实际情况配置

def main():
    restart_attempts = 0
    
    while True:
        try:
            # 获取GPU显存使用情况
            memory_usage = get_gpu_memory_usage()
            
            if memory_usage:
                max_usage = max(memory_usage)
                print(f"当前GPU最大显存使用率: {max_usage:.1f}%")
                
                # 检查是否超过阈值
                if max_usage > GPU_MEMORY_THRESHOLD:
                    print("显存使用超过阈值,检查服务状态...")
                    
                    # 检查服务是否还在运行
                    if check_service_status():
                        print("服务仍在运行,但显存占用过高")
                        send_alert(f"SiameseUIE服务显存占用过高: {max_usage:.1f}%")
                    else:
                        print("服务已停止,尝试重启...")
                        
                        if restart_attempts < MAX_RESTART_ATTEMPTS:
                            if restart_service():
                                print("服务重启成功")
                                restart_attempts = 0
                            else:
                                restart_attempts += 1
                                print(f"服务重启失败,尝试次数: {restart_attempts}")
                                send_alert(f"SiameseUIE服务重启失败,尝试次数: {restart_attempts}")
                        else:
                            send_alert("SiameseUIE服务多次重启失败,需要人工干预")
            else:
                print("无法获取GPU信息,跳过本次检查")
                
        except Exception as e:
            print(f"监控程序异常: {e}")
            
        # 等待下一次检查
        time.sleep(CHECK_INTERVAL)

if __name__ == "__main__":
    main()

3.3 设置脚本权限

chmod +x /opt/siamese-uie/monitor/gpu_monitor.py

4. Supervisor配置监控服务

4.1 创建监控服务配置文件

nano /etc/supervisor/conf.d/siamese-uie-monitor.conf

4.2 监控服务配置内容

[program:siamese-uie-monitor]
command=python3 /opt/siamese-uie/monitor/gpu_monitor.py
directory=/opt/siamese-uie
autostart=true
autorestart=true
startretries=3
stopwaitsecs=30
user=root
redirect_stderr=true
stdout_logfile=/var/log/siamese-uie-monitor.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=5
environment=PYTHONUNBUFFERED="1"

4.3 重新加载Supervisor配置

# 重新加载配置
supervisorctl reread
supervisorctl update

# 启动监控服务
supervisorctl start siamese-uie-monitor

# 查看监控服务状态
supervisorctl status siamese-uie-monitor

5. 高级监控与告警配置

5.1 配置邮件告警(可选)

如果你需要邮件告警功能,可以修改监控脚本中的 send_alert 函数:

def send_alert(message):
    """发送邮件告警"""
    try:
        # 配置发件人信息
        sender = 'your_email@example.com'
        receiver = 'admin@example.com'
        password = 'your_email_password'
        
        # 创建邮件内容
        msg = MIMEText(f'SiameseUIE监控告警:\n\n{message}\n\n时间: {time.strftime("%Y-%m-%d %H:%M:%S")}')
        msg['Subject'] = 'SiameseUIE服务告警'
        msg['From'] = sender
        msg['To'] = receiver
        
        # 发送邮件
        with smtplib.SMTP_SSL('smtp.example.com', 465) as server:
            server.login(sender, password)
            server.sendmail(sender, [receiver], msg.as_string())
            
        print("告警邮件发送成功")
    except Exception as e:
        print(f"发送告警邮件失败: {e}")

5.2 添加详细日志记录

创建日志记录功能,便于后续排查问题:

def setup_logging():
    """配置日志记录"""
    import logging
    from logging.handlers import RotatingFileHandler
    
    logger = logging.getLogger('gpu_monitor')
    logger.setLevel(logging.INFO)
    
    # 文件日志处理器
    file_handler = RotatingFileHandler(
        '/var/log/siamese-uie-monitor.log',
        maxBytes=10*1024*1024,  # 10MB
        backupCount=5
    )
    
    # 控制台日志处理器
    console_handler = logging.StreamHandler()
    
    # 日志格式
    formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    )
    file_handler.setFormatter(formatter)
    console_handler.setFormatter(formatter)
    
    logger.addHandler(file_handler)
    logger.addHandler(console_handler)
    
    return logger

# 在main函数开始处添加
logger = setup_logging()

6. 测试监控系统

6.1 手动测试监控功能

# 手动运行监控脚本测试
python3 /opt/siamese-uie/monitor/gpu_monitor.py

# 查看监控日志
tail -f /var/log/siamese-uie-monitor.log

# 测试服务重启功能
supervisorctl restart siamese-uie

6.2 模拟高显存占用测试

为了测试监控系统是否正常工作,可以创建一个临时脚本模拟高显存占用:

# 创建测试脚本
nano /tmp/test_gpu_memory.py
import torch
import time

# 分配大量GPU显存
tensors = []
try:
    for i in range(10):
        # 每次分配100MB显存
        tensor = torch.randn(25000000, device='cuda')  # 约100MB
        tensors.append(tensor)
        print(f"已分配 {(i+1)*100}MB 显存")
        time.sleep(2)
except RuntimeError as e:
    print(f"显存分配失败: {e}")
finally:
    # 清理显存
    del tensors
    torch.cuda.empty_cache()

7. 日常维护与故障排查

7.1 常用监控命令

# 查看GPU状态
nvidia-smi
gpustat -i

# 查看服务状态
supervisorctl status siamese-uie
supervisorctl status siamese-uie-monitor

# 查看监控日志
tail -f /var/log/siamese-uie-monitor.log

# 查看应用日志
tail -f /root/workspace/siamese-uie.log

7.2 常见问题解决

问题1:监控脚本无法获取GPU信息

# 检查gpustat安装
pip install --upgrade gpustat

# 检查GPU驱动
nvidia-smi

问题2:监控服务无法启动

# 检查配置文件语法
supervisorctl reread

# 查看详细错误信息
supervisorctl tail siamese-uie-monitor

问题3:频繁误报警

# 调整显存阈值
# 修改 /opt/siamese-uie/monitor/gpu_monitor.py 中的 GPU_MEMORY_THRESHOLD

8. 总结

通过本教程,你已经为SiameseUIE模型搭建了一套完整的GPU显存监控和自动重启系统。这个系统能够:

  1. 实时监控GPU显存使用情况,预防因显存耗尽导致的服务崩溃
  2. 自动检测服务状态,在服务异常时及时重启
  3. 发送告警通知,让你第一时间了解系统状态
  4. 记录详细日志,便于后续排查和分析问题

这套监控系统不仅适用于SiameseUIE模型,也可以稍作修改后用于其他GPU加速的AI服务。定期检查监控日志,根据实际使用情况调整阈值参数,能够让你的AI服务更加稳定可靠。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

聚焦RDK与具身智能,汇集机器人开发教程、开源案例和技术交流

更多推荐