点击AladdinEdu,同学们用得起的【H卡】算力平台”,H卡级别算力80G大显存按量计费灵活弹性顶级配置学生更享专属优惠


引言:AI算力时代的监控挑战

随着深度学习模型规模的指数级增长,AI训练集群已成为各大企业和科研机构的核心基础设施。一个典型的AI集群可能包含数百甚至数千块GPU,每块价值数十万元,如何充分高效地利用这些昂贵计算资源变得至关重要。传统的系统监控方案往往只关注节点级别的CPU、内存、网络等基础指标,无法深入洞察GPU内部的运行状态,更难以将底层硬件指标与上层业务表现相关联。

本文将深入探讨AI集群全链路监控体系的构建,从最底层的GPU微架构指标采集开始,到SM(Streaming Multiprocessor)利用率的深度剖析,最终建立训练任务的"性能指纹",实现硬件指标与业务Metric的智能关联分析。通过这套监控体系,运维团队可以快速定位性能瓶颈,研发人员可以优化训练代码,管理者可以做出精准的容量规划决策。

第一部分:GPU微架构监控基础

1.1 NVML架构与指标体系

NVIDIA Management Library (NVML) 是监控NVIDIA GPU设备的官方库,提供了一套完整的编程接口用于获取设备状态和性能指标。其架构如下图所示:

+-----------------------+
|     Application       |
+-----------------------+
|     NVML Library      |
+-----------------------+
|   NVIDIA Driver       |
+-----------------------+
|   GPU Hardware        |
+-----------------------+

1.1.1 NVML核心指标分类

设备状态指标

  • 温度、功耗、时钟频率
  • ECC错误计数
  • PCIe链路信息

利用率指标

  • GPU整体利用率
  • 内存控制器利用率
  • PCIe吞吐量

性能计数器

  • SM活动周期计数
  • 各种指令吞吐量
  • 内存访问模式统计

1.2 NVML数据采集实战

1.2.1 基础环境配置

# 安装NVML开发包
sudo apt-get install cuda-nvml-dev# 验证驱动版本
nvidia-smi --query-gpu=driver_version --format=csv

1.2.2 基础指标采集代码

#include <nvml.h>
#include <stdio.h>
#include <unistd.h>#define CHECK_NVML(call) do { \nvmlReturn_t result = call; \if (result != NVML_SUCCESS) { \fprintf(stderr, "NVML error %d at %s:%d\n", result, __FILE__, __LINE__); \exit(1); \} \
} while(0)int main() {// 初始化NVMLCHECK_NVML(nvmlInit());unsigned int device_count;CHECK_NVML(nvmlDeviceGetCount(&device_count));for (unsigned int i = 0; i < device_count; i++) {nvmlDevice_t device;CHECK_NVML(nvmlDeviceGetHandleByIndex(i, &device));// 获取设备名称char name[NVML_DEVICE_NAME_BUFFER_SIZE];CHECK_NVML(nvmlDeviceGetName(device, name, sizeof(name)));// 获取温度信息unsigned int temp;CHECK_NVML(nvmlDeviceGetTemperature(device, NVML_TEMPERATURE_GPU, &temp));// 获取功耗信息unsigned int power;CHECK_NVML(nvmlDeviceGetPowerUsage(device, &power));// 获取利用率信息nvmlUtilization_t utilization;CHECK_NVML(nvmlDeviceGetUtilizationRates(device, &utilization));printf("Device %d (%s):\n", i, name);printf("  Temperature: %u°C\n", temp);printf("  Power Usage: %uW\n", power / 1000);printf("  GPU Utilization: %u%%\n", utilization.gpu);printf("  Memory Utilization: %u%%\n", utilization.memory);}// 关闭NVMLCHECK_NVML(nvmlShutdown());return 0;
}

1.2.3 高级性能计数器采集
对于深度性能分析,需要访问更底层的性能计数器:

// 创建性能监控组
nvmlEventSet_t event_set;
CHECK_NVML(nvmlEventSetCreate(&event_set));// 启用特定事件
CHECK_NVML(nvmlDeviceRegisterEvents(device, NVML_GRSM_CLOCK_GATING_BLOCK_CYCLES_EVENT | NVML_SM_ACTIVE_CYCLES_EVENT, event_set));// 读取事件数据
nvmlEventData_t event_data;
while (1) {CHECK_NVML(nvmlEventSetWait(event_set, &event_data, 1000));process_event_data(event_data);
}// 清理资源
CHECK_NVML(nvmlEventSetFree(event_set));

第二部分:SM利用率深度剖析

2.1 SM架构与性能模型

NVIDIA GPU中的Streaming Multiprocessor(SM)是实际执行计算的核心单元。每个SM包含:

  • CUDA Cores:执行整数和单精度浮点运算
  • Tensor Cores:执行矩阵运算(Volta架构及以上)
  • 调度器:管理warp调度
  • 寄存器文件:存储线程状态
  • 共享内存:线程间通信的高速内存

2.1.1 SM利用率关键指标

计算利用率指标

  • SM活跃周期比例
  • 指令发射效率
  • Warp调度效率

内存利用率指标

  • 各级缓存命中率
  • 内存访问吞吐量
  • DRAM带宽利用率

特殊功能单元利用率

  • Tensor Core利用率
  • RT Core利用率(对于支持光追的GPU)

2.2 SM利用率采集实战

2.2.1 使用NVIDIA DCGM进行高级监控
NVIDIA Data Center GPU Manager (DCGM) 提供了更强大的监控能力:

# 安装DCGM
curl -O https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/datacenter-gpu-manager_2.2.9_amd64.deb
sudo dpkg -i datacenter-gpu-manager_2.2.9_amd64.deb# 启动DCGM
sudo systemctl start nvidia-dcgm

2.2.2 DCGM Python接口示例

import pydcgm
import dcgm_fields
from dcgm_structs import dcgmExceptionClass# 初始化DCGM
dcgm_handle = pydcgm.DcgmHandle(ipAddress="127.0.0.1")
group_manager = dcgm_handle.GetGroupManager()
field_group_manager = dcgm_handle.GetFieldGroupManager()# 创建监控组
group_id = group_manager.CreateGroup("monitoring_group")
group_manager.AddEntityToGroup(group_id, dcgm_fields.DCGM_FE_GPU)# 定义监控字段
field_ids = [dcgm_fields.DCGM_FI_DEV_SM_CLOCK,dcgm_fields.DCGM_FI_DEV_SM_ACTIVITY,dcgm_fields.DCGM_FI_DEV_TENSOR_ACTIVITY,dcgm_fields.DCGM_FI_PROF_GR_ENGINE_ACTIVE,dcgm_fields.DCGM_FI_PROF_SM_ACTIVE,dcgm_fields.DCGM_FI_PROF_SM_OCCUPANCY,dcgm_fields.DCGM_FI_PROF_PIPE_TENSOR_ACTIVE,
]field_group_id = field_group_manager.CreateFieldGroup("sm_fields", field_ids)# 开始监控
dcgm_handle.system.WatchFields(group_id, field_group_id, updateFreq=1000000, maxKeepAge=3600)# 获取数据
fields = dcgm_handle.fields.GetSinceValues(group_id, field_group_id, sinceTimestamp=0)
for field in fields:print(f"Field {field.fieldId}: {field.value}")

2.3 SM利用率数据分析

2.3.1 计算SM理论性能上限

def calculate_theoretical_performance(gpu_arch, sm_count, clock_rate):"""计算GPU的理论性能上限"""if gpu_arch == "ampere":# Ampere架构: FP32性能 = SM数量 * 时钟频率 * 每个SM的FP32核心数 * 2 (FMA)fp32_cores_per_sm = 128theoretical_tflops = sm_count * (clock_rate / 1000) * fp32_cores_per_sm * 2 / 1000return theoretical_tflopselif gpu_arch == "hopper":# Hopper架构计算pass# 其他架构...def analyze_sm_efficiency(actual_tflops, theoretical_tflops):"""分析SM效率"""efficiency = (actual_tflops / theoretical_tflops) * 100return efficiency

2.3.2 识别常见性能模式

def identify_performance_pattern(sm_activity, memory_activity, tensor_activity):"""识别常见的性能瓶颈模式"""# 计算瓶颈if sm_activity > 80 and memory_activity < 30 and tensor_activity < 20:return "COMPUTE_BOUND"# 内存瓶颈elif sm_activity < 50 and memory_activity > 70:return "MEMORY_BOUND"# Tensor Core瓶颈elif sm_activity < 60 and tensor_activity > 75:return "TENSOR_CORE_BOUND"# 均衡状态elif 60 < sm_activity < 90 and 40 < memory_activity < 70:return "BALANCED"else:return "UNDEFINED"

第三部分:训练任务性能指纹构建

3.1 性能指纹概念与价值

训练任务性能指纹是一组能够唯一标识任务性能特征的多维指标集合。它就像人类的指纹一样,可以用于:

  1. 性能基线管理:建立正常性能基准,快速发现异常
  2. 瓶颈定位:精确定位性能瓶颈所在层次
  3. 资源调度优化:根据任务特征分配合适的硬件资源
  4. 成本分析:关联资源消耗与业务价值

3.2 性能指纹指标体系

3.2.1 硬件层指标

hardware_metrics:gpu_utilization: description: "GPU整体利用率"unit: "percent"weight: 0.15sm_efficiency:description: "SM计算效率"unit: "percent" weight: 0.20memory_bandwidth_utilization:description: "内存带宽利用率"unit: "percent"weight: 0.15tensor_core_utilization:description: "Tensor Core利用率"unit: "percent"weight: 0.10

3.2.2 框架层指标

framework_metrics:iteration_time:description: "单次迭代时间"unit: "milliseconds"weight: 0.20gradient_update_time:description: "梯度更新时间"unit: "milliseconds"weight: 0.10data_loading_time:description: "数据加载时间"unit: "milliseconds"weight: 0.10

3.3 性能指纹采集系统实现

3.3.1 数据采集架构

+----------------+     +----------------+     +----------------+
|   GPU Metrics  |     | Framework      |     | Application    |
|   Collector    |     | Metrics        |     | Metrics        |
|   (NVML/DCGM)  |     | Collector      |     | Collector      |
+----------------+     +----------------+     +----------------+|                      |                      |+----------+-----------+----------+-----------+|                      |+------------------+   +------------------+|   Metrics        |   |   Metadata       ||   Aggregator     |   |   Enricher       |+------------------+   +------------------+|                      |+------------------+   +------------------+|   Performance    |   |   Storage        ||   Fingerprint    |   |   Backend        ||   Generator      |   |   (TSDB)         |+------------------+   +------------------+

3.3.2 指纹生成算法

class PerformanceFingerprint:def __init__(self, config):self.metrics = {}self.weights = config['weights']self.baselines = config['baselines']def add_metric(self, name, value, timestamp):"""添加指标数据"""self.metrics[name] = {'value': value,'timestamp': timestamp,'score': self.calculate_score(name, value)}def calculate_score(self, name, value):"""计算指标得分"""baseline = self.baselines.get(name, {})expected = baseline.get('expected', 0)threshold = baseline.get('threshold', 0)if expected == 0:return 0deviation = abs(value - expected) / expectedscore = max(0, 100 - (deviation * 100))return scoredef generate_fingerprint(self):"""生成性能指纹"""total_score = 0total_weight = 0fingerprint = {'timestamp': time.time(),'metrics': {},'anomalies': []}for name, data in self.metrics.items():weight = self.weights.get(name, 0)score = data['score']total_score += score * weighttotal_weight += weightfingerprint['metrics'][name] = {'value': data['value'],'score': score,'weight': weight}# 检测异常if score < 60:  # 低于60分视为异常fingerprint['anomalies'].append({'metric': name,'value': data['value'],'score': score,'severity': 'high' if score < 30 else 'medium'})fingerprint['overall_score'] = total_score / total_weight if total_weight > 0 else 0return fingerprint

3.3.3 实时监控与告警

class PerformanceMonitor:def __init__(self, fingerprint_config, alert_rules):self.fingerprint_generator = PerformanceFingerprint(fingerprint_config)self.alert_rules = alert_rulesself.history = deque(maxlen=1000)def process_metrics(self, metrics_batch):"""处理指标批量数据"""for metric in metrics_batch:self.fingerprint_generator.add_metric(metric['name'], metric['value'], metric['timestamp'])fingerprint = self.fingerprint_generator.generate_fingerprint()self.history.append(fingerprint)# 检查告警alerts = self.check_alerts(fingerprint)if alerts:self.send_alerts(alerts)return fingerprintdef check_alerts(self, fingerprint):"""检查告警条件"""alerts = []# 检查总体分数告警if fingerprint['overall_score'] < self.alert_rules['overall_score_threshold']:alerts.append({'type': 'OVERALL_PERFORMANCE_DEGRADATION','severity': 'critical','score': fingerprint['overall_score'],'timestamp': fingerprint['timestamp']})# 检查单项指标告警for anomaly in fingerprint['anomalies']:if anomaly['severity'] == 'high':alerts.append({'type': 'METRIC_ANOMALY','metric': anomaly['metric'],'value': anomaly['value'],'severity': 'high','timestamp': fingerprint['timestamp']})return alertsdef send_alerts(self, alerts):"""发送告警通知"""for alert in alerts:# 集成到现有的告警系统print(f"ALERT: {alert}")# 实际环境中可以发送邮件、短信、钉钉等通知

第四部分:全链路监控系统集成

4.1 系统架构设计

4.1.1 数据流架构

+-------------+    +-------------+    +-------------+
|   GPU节点   |    |  训练框架   |    |  业务应用   |
|  指标采集   |    |  指标采集   |    |  指标采集   |
+-------------+    +-------------+    +-------------+|                |                |+--------+-------+-------+--------+|               |+-------------------------------+|          指标聚合层            ||   (Fluentd/Logstash/Vector)   |+-------------------------------+|               |+-------------------------------+|          流处理层              ||     (Flink/Spark Streaming)   |+-------------------------------+|               |+-------------------------------+|          存储层                ||   (Prometheus/InfluxDB/TDengine) |+-------------------------------+|               |+-------------------------------+|          分析层                ||   (性能指纹/关联分析/告警)    |+-------------------------------+|               |+-------------------------------+|          可视化层              ||   (Grafana/Kibana)           |+-------------------------------+

4.1.2 关键技术选型
数据采集

  • GPU指标:DCGM、NVML、Prometheus DCGM Exporter
  • 框架指标:PyTorch Profiler、TensorFlow Profiler
  • 业务指标:自定义指标SDK

数据存储

  • 时序数据:TDengine、InfluxDB
  • 日志数据:Elasticsearch
  • 性能指纹:Redis、PostgreSQL

流处理

  • 实时分析:Flink、Spark Streaming
  • 复杂事件处理:Apache Flink CEP

4.2 关键集成代码示例

4.2.1 Prometheus DCGM Exporter配置

# dcgm-exporter-config.yaml
metrics:- name: "dcgm_sm_activity"field: "DCGM_FI_PROF_SM_ACTIVE"type: "gauge"- name: "dcgm_memory_activity" field: "DCGM_FI_PROF_DRAM_ACTIVE"type: "gauge"- name: "dcgm_tensor_activity"field: "DCGM_FI_PROF_PIPE_TENSOR_ACTIVE"type: "gauge"- name: "dcgm_fp64_activity"field: "DCGM_FI_PROF_PIPE_FP64_ACTIVE"type: "gauge"- name: "dcgm_fp32_activity"field: "DCGM_FI_PROF_PIPE_FP32_ACTIVE"type: "gauge"- name: "dcgm_fp16_activity"field: "DCGM_FI_PROF_PIPE_FP16_ACTIVE"type: "gauge"

4.2.2 基于Flink的实时处理

public class GPUmetricsProcessor extends ProcessFunction<MetricEvent, PerformanceFingerprint> {private transient PerformanceFingerprint fingerprint;@Overridepublic void open(Configuration parameters) {// 初始化性能指纹生成器fingerprint = new PerformanceFingerprint(loadConfig());}@Overridepublic void processElement(MetricEvent event, Context ctx, Collector<PerformanceFingerprint> out) {// 处理单个指标事件fingerprint.addMetric(event.getName(), event.getValue(), event.getTimestamp());// 每分钟生成一次性能指纹if (shouldGenerateFingerprint()) {PerformanceFingerprint newFingerprint = fingerprint.generateFingerprint();out.collect(newFingerprint);fingerprint.reset();}}@Overridepublic void onTimer(long timestamp, OnTimerContext ctx, Collector<PerformanceFingerprint> out) {// 定时生成性能指纹(防止数据稀疏)PerformanceFingerprint newFingerprint = fingerprint.generateFingerprint();out.collect(newFingerprint);fingerprint.reset();}
}

4.2.3 Grafana监控仪表板

{"dashboard": {"title": "AI集群全链路监控","panels": [{"title": "GPU利用率概览","type": "stat","targets": [{"expr": "avg(dcgm_gpu_utilization) by (host, gpu_id)","legendFormat": "{{host}}-GPU{{gpu_id}}"}]},{"title": "SM效率分析","type": "heatmap","targets": [{"expr": "dcgm_sm_efficiency","legendFormat": "SM效率"}]},{"title": "性能指纹得分","type": "timeseries","targets": [{"expr": "performance_fingerprint_score{job='training-job'}","legendFormat": "总体得分"}]}]}
}

第五部分:实战案例与最佳实践

5.1 典型性能问题诊断

5.1.1 内存带宽瓶颈诊断
症状

  • GPU利用率高但SM效率低
  • 内存控制器利用率持续高位
  • 训练迭代时间波动大

诊断步骤

  • 检查dcgm_dram_activity指标
  • 分析内存访问模式
  • 验证batch size是否过大

解决方案

  • 使用梯度累积减少内存压力
  • 优化数据布局提高缓存命中率
  • 调整模型结构减少内存访问

5.1.2 Tensor Core未充分利用
症状

  • SM效率高但Tensor Core利用率低
  • FP16/FP32计算比例失衡
  • 模型无法达到理论性能

诊断步骤

  1. 检查dcgm_tensor_activity指标
  2. 验证模型操作是否支持Tensor Core
  3. 分析数据类型使用情况

解决方案

  • 确保使用适合Tensor Core的数据类型(FP16/BF16)
  • 调整模型层大小满足Tensor Core要求(矩阵维度为8的倍数)
  • 使用混合精度训练

5.2 性能优化最佳实践

5.2.1 监控配置优化

# 优化的采集配置
collection_intervals:high_frequency_metrics: 100ms    # 关键性能指标medium_frequency_metrics: 1s     # 一般性能指标  low_frequency_metrics: 10s       # 状态指标metric_groups:essential: ["sm_activity", "memory_activity", "tensor_activity"]detailed: ["fp64_activity", "fp32_activity", "fp16_activity"]diagnostic: ["pcie_traffic", "nvlink_traffic"]

5.2.2 告警策略配置

alerting_rules:- alert: "SM效率低下"expr: "dcgm_sm_efficiency < 60"for: "5m"labels:severity: "warning"annotations:summary: "SM效率低于阈值"description: "GPU {{$labels.gpu_id}} SM效率为 {{$value}}%"- alert: "内存带宽瓶颈"expr: "dcgm_dram_activity > 85"for: "2m"labels:severity: "critical"annotations:summary: "内存带宽使用率过高"description: "GPU {{$labels.gpu_id}} 内存带宽使用率为 {{$value}}%"- alert: "性能指纹异常"expr: "performance_fingerprint_score < 70"for: "3m"labels:severity: "warning"annotations:summary: "任务性能异常"description: "任务 {{$labels.job_id}} 性能得分为 {{$value}}"

5.3 容量规划与成本优化

5.3.1 资源利用率分析

def analyze_cluster_utilization(metrics_data, time_range):"""分析集群资源利用率"""utilization_stats = {}for gpu in metrics_data['gpus']:gpu_id = gpu['id']utilization_stats[gpu_id] = {'avg_utilization': calculate_average(gpu['utilization'], time_range),'peak_utilization': calculate_peak(gpu['utilization'], time_range),'idle_time': calculate_idle_time(gpu['utilization'], time_range),'cost_efficiency': calculate_cost_efficiency(gpu)}return utilization_statsdef generate_capacity_report(utilization_stats):"""生成容量规划报告"""report = {'underutilized_gpus': [],'overutilized_gpus': [],'recommendations': []}for gpu_id, stats in utilization_stats.items():if stats['avg_utilization'] < 30:report['underutilized_gpus'].append({'gpu_id': gpu_id,'utilization': stats['avg_utilization'],'suggestion': '考虑合并工作负载或降配'})elif stats['avg_utilization'] > 85:report['overutilized_gpus'].append({'gpu_id': gpu_id, 'utilization': stats['avg_utilization'],'suggestion': '需要扩容或优化工作负载'})return report

结论

构建AI集群全链路监控体系是一个系统工程,需要从GPU微架构指标采集开始,逐步构建SM利用率分析能力,最终形成训练任务的性能指纹。这套体系不仅能够帮助运维团队实时掌握集群状态,更能为研发人员提供深度的性能洞察,为管理者提供数据驱动的决策支持。

关键成功因素包括:

  1. 多层次指标采集:覆盖硬件、框架、业务各个层面
  2. 实时处理能力:及时发现和响应性能问题
  3. 智能关联分析:将底层指标与业务表现相关联
  4. 可行动洞察:提供具体的优化建议而不仅仅是告警

随着AI模型复杂度的不断提升和计算资源的持续昂贵,全链路监控将从不错的选择变为必备的基础设施。通过本文介绍的方法论和实践经验,您应该能够构建起适合自己业务场景的AI集群监控体系,充分发挥昂贵计算资源的潜力,加速AI研发和创新进程。


点击AladdinEdu,同学们用得起的【H卡】算力平台”,H卡级别算力80G大显存按量计费灵活弹性顶级配置学生更享专属优惠

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:
http://www.pswp.cn/news/921811.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921811.shtml
英文地址,请注明出处:http://en.pswp.cn/news/921811.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8s Ingress Annotations参数使用指南

Kubernetes Ingress Annotations 是与特定 Ingress 控制器&#xff08;如 Nginx、Traefik、HAProxy 等&#xff09;配合使用&#xff0c;用于扩展和定制 Ingress 资源行为的关键配置项。它们通常以键值对的形式添加在 Ingress 资源的 metadata部分。Ingress Annotations参数速查…

CodeBuddy Code深度实战:从零构建智能电商推荐系统的完整开发历程

项目背景与挑战作为一名有着多年全栈开发经验的技术人员&#xff0c;我最近接手了一个具有挑战性的项目&#xff1a;为某中型服装电商平台开发一套智能商品推荐系统。该系统需要在2个月内完成&#xff0c;包含以下核心功能&#xff1a;前端&#xff1a;React TypeScript构建的…

Day 19: 算法基础与面试理论精通 - 从思想理解到策略掌握的完整体系

Day 19: 算法基础与面试理论精通 - 从思想理解到策略掌握的完整体系 🎯 课程概述 核心目标:深度理解算法设计思想和核心原理,掌握面试高频算法概念,建立完整的算法知识体系 学习重点: ✅ 核心数据结构的本质理解和应用场景分析 ✅ 经典算法设计模式的思想精髓和解题策…

AI与AR融合:重塑石化与能源巡检的未来

在石化企业和新能源电站的巡检工作中&#xff0c;传统模式正被一场技术革命所颠覆。AI与AR&#xff08; www.teamhelper.cn &#xff09;的深度融合&#xff0c;不仅提升了巡检效率&#xff0c;更将巡检工作从被动响应转变为预测预防&#xff0c;开启了智能运维的新篇章。一、透…

滴滴二面(准备二)

手写防抖函数并清晰阐述其价值&#xff0c;确实是前端面试的常见考点。下面我将为你直接呈现防抖函数的代码&#xff0c;并重点结合滴滴的业务场景进行解释&#xff0c;帮助你向面试官展示思考深度。 这是防抖函数的一个基本实现&#xff0c;附带注释以便理解&#xff1a; func…

Kubernetes(四):Service

目录 一、定义Service 1.1 typeClusterIP 1.2 typeNodePort 1.3 typeLoadBalancer 1.4 typeExternalName 1.5 无标签选择器的Service 1.6 Headless Service 二、Kubernetes的服务发现 2.1 环境变量方式 2.2 DNS方式 Kubernetes 中 Service 是 将运行在一个或一组 Pod 上的应用…

在 Python 中实现观察者模式的具体步骤是什么?

在 Python 中实现观察者模式可以遵循以下具体步骤&#xff0c;这些步骤清晰地划分了角色和交互流程&#xff1a; 步骤 1&#xff1a;定义主题&#xff08;Subject&#xff09;基类 主题是被观察的对象&#xff0c;负责管理观察者和发送通知。需实现以下核心方法&#xff1a; 存…

分布式方案 一 分布式锁的四大实现方式

Java分布式锁实现方式详解 什么是分布式锁 基于数据库的分布式锁基于Redis的分布式锁基于ZooKeeper的分布式锁基于Etcd的分布式锁 各种实现方式对比最佳实践建议多节点/线程调用结果展示 基于数据库的分布式锁 - 多线程测试基于Redis的分布式锁 - 多节点测试基于ZooKeeper的分…

基于Room+RESTful的双权限Android开机时间监控方案

概述 以下是使用Kotlin实现的商业级Android开机时间记录功能&#xff0c;包含现代Android开发最佳实践。 系统架构 组件设计 // BootReceiver - 接收开机广播 class BootReceiver : BroadcastReceiver() {override fun onReceive(context: Context, intent: Intent?) {if (int…

水库大坝安全监测系统的作用

水库大坝作为重要的水利基础设施&#xff0c;承担着防洪、供水、发电、灌溉等多重功能&#xff0c;其安全性直接关系到人民生命财产安全和社会经济发展。然而&#xff0c;由于自然环境变化、材料老化、荷载作用以及人为因素的影响&#xff0c;大坝在长期运行过程中可能出现裂缝…

《Kubernetes 构建 MySQL MGR 集群实战教程》

#### 一、前言 MySQL Group Replication (MGR) 是 MySQL 官方提供的高可用集群方案&#xff0c;基于 Paxos 协议实现多节点数据强一致性。本教程将指导如何在 Kubernetes 上部署 MySQL MGR 集群&#xff0c;适用于生产级高可用场景。---#### 二、环境准备 1. **Kubernetes 集…

影视APP源码 SK影视 安卓+苹果双端APP 反编译详细视频教程+源码

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 影视APP源码 SK影视 安卓苹果双端APP 反编译详细视频教程源码 自带对接优效SDK广告&#xff08;已失效&#xff09;。域名和IP都可以搭建。 自带一起看和短剧页面功能&#xff0c;三种…

pyqt+python之二进制生肖占卜

目录 一、引言 二、GUI界面设计 1.效果演示 2.相关提示 3.界面设计.py 三、主要程序详解 1.导入相关模块 2.初始化设置 3.组内判断 4.猜测过程 四、总程序代码 一、引言 在数字时代&#xff0c;传统文化与编程语言的碰撞总能迸发奇妙火花。本项目以PyQtPython为技术…

人工智能-python-深度学习-经典网络模型-LeNets5

文章目录LeNet-5&#xff08;详解&#xff09;—— 从原理到 PyTorch 实现&#xff08;含训练示例&#xff09;简介LeNet-5 的核心思想LeNet-5 逐层结构详解逐层计算举例&#x1f4cc; 输入层&#x1f4cc; C1 卷积层&#x1f4cc; S2 池化层&#x1f4cc; C3 卷积层&#x1f4…

机器视觉的手机柔性屏贴合应用

在智能手机制造领域&#xff0c;柔性屏逐渐成为智能手机的主流选择&#xff0c;柔性屏因其轻便、易于弯曲的特性&#xff0c;已成为现代电子设备的重要组成部分&#xff0c;但同时也带来了前所未有的制造挑战。柔性屏与传统刚性玻璃屏有本质区别&#xff0c;它容易形变&#xf…

贪心算法应用:数字孪生同步问题详解

Java中的贪心算法应用&#xff1a;数字孪生同步问题详解 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。下面我将全面详细地讲解贪心算法在数字孪生同步问题中的应用。…

UOS20系统安装与 SSH/XRDP 远程访问功能配置指南

UOS20系统安装与 SSH/XRDP 远程访问功能配置指南 一、UOS 20 系统安装​ ​1. 下载系统镜像​ 访问统信官网下载 UOS 20 专业版镜像&#xff08;推荐适配当前硬件的版本&#xff09;&#xff1a; https://www.chinauos.com/resource/download-professional 2. 系统安装与硬件配…

【Python】S1 基础篇 P5 字典模块指南

目录字典的本质与底层实现基础语法结构使用字典访问字典中的值添加键值对修改字典中的值删除键值对使用 get() 来访问值遍历字典遍历所有键值对遍历字典中的所有键遍历字典中的所有值嵌套字典列表在字典中存储列表字典&#xff08;Dictionary&#xff09;是Python中灵活且强大的…

计算机视觉之多模板匹配

简介 计算机视觉第一课opencv&#xff08;四&#xff09;保姆级教学 之前说过模糊匹配只是对于单个目标进行匹配&#xff0c;今天我们就来学习一下如何对多个目标进行匹配 一、多目标匹配 对于这个图片我们要匹配下面那个箭头&#xff0c;我们可以发现图中是有两个位置相同的…

封装日期选择器组件,带有上周,下周按钮

ui图组件代码如下&#xff1a; <template><div><el-date-pickerv-model"dateRange"type"daterange"align"right"size"mini":editable"false"unlink-panelsrange-separator"至"start-placeholder&q…