news 2026/10/2 2:06:03

Linux下NVIDIA显卡型号识别的三层诊断法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux下NVIDIA显卡型号识别的三层诊断法

1. 为什么在Linux服务器上查NVIDIA显卡型号不是“敲个命令就完事”的事

你刚接手一台跑AI训练任务的Ubuntu服务器,同事只留了句“显卡驱动好像有问题”,没给任何硬件信息。你想先确认下到底插的是哪块卡——是RTX 4090还是A100?是单卡还是双卡?PCIe插槽位置有没有冲突?结果nvidia-smi一执行,直接报错:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver。你心里一沉:这台机器连驱动都没装好,那还能靠什么判断显卡型号?这时候翻文档、查维基、问群友,最后发现真正能“穿透驱动层”看到物理设备的,其实是lspci——但光知道这个还不够。我踩过三次坑:第一次用lspci | grep -i nvidia只看到“3D controller”,根本分不清是P4还是V100;第二次在虚拟机里执行nvidia-smi,结果返回空,误以为没装驱动,其实根本是VM不透传GPU;第三次在国产信创服务器上跑lspci -v,输出里一堆中文乱码,连设备ID都看不清。这些都不是命令本身的问题,而是Linux环境下显卡识别这件事,本质是三层信息叠加的结果:最底层是PCIe总线上的硬件枚举(lspci),中间层是内核模块加载状态(lsmod | grep nvidia),最上层才是用户态驱动接口(nvidia-smi)。三者缺一不可,而每层失败的表现、排查路径、甚至输出格式都完全不同。所以这篇内容不是教你背几个命令,而是帮你建立一套可验证、可回溯、可交叉比对的显卡识别工作流——它适用于所有NVIDIA GPU场景:从边缘计算盒子里的T4,到超算中心的H100集群,再到你本地WSL2里偷偷跑Stable Diffusion的RTX 4070。核心关键词就五个:linux、nvidia、显卡型号、lspci、nvidia-smi,但每个词背后都藏着一个完整的诊断逻辑链。

2. 显卡识别的三层结构:为什么必须交叉验证,单靠一个命令永远不保险

2.1 第一层:PCIe硬件层——lspci是唯一不依赖驱动的“透视眼”

lspci读取的是主板BIOS/UEFI在系统启动时扫描PCIe总线后写入内存的设备配置空间(Configuration Space),这个过程发生在内核加载任何驱动之前。也就是说,只要显卡物理插在主板上、供电正常、PCIe插槽没虚焊,lspci就一定能“看见”它。但问题来了:lspci默认输出极其简略。比如你执行lspci | grep -i nvidia,可能只看到:

01:00.0 3D controller: NVIDIA Corporation GA102 [GeForce RTX 3090] (rev a1)

这里“GA102”是GPU架构代号,“GeForce RTX 3090”是消费级命名,但如果你面对的是数据中心卡,比如A10或L40,lspci常显示为“3D controller”或“VGA compatible controller”,根本不提具体型号。这是因为PCI ID数据库(/usr/share/misc/pci.ids)里只收录了厂商和设备ID的通用映射,而NVIDIA习惯把同一GPU芯片用于多款卡(比如GA100既用在A100上,也用在DGX A100里),所以仅靠lspci的文本描述无法100%确定物理卡型号。实操中我见过最典型的混淆案例:一台服务器插着两块卡,lspci显示都是“GV100GL [Tesla V100 SXM2]”,但其中一块实际是V100 PCIe版——因为SXM2和PCIe版的散热设计、功耗墙、甚至PCIe通道数都不同,直接影响CUDA Kernel调度效率。这时候必须结合第二层信息才能区分。

提示:lspci -nn会强制显示十六进制的Vendor ID和Device ID(如[10de:1db6]),这才是真正的“身份证号”。NVIDIA的Vendor ID固定为10de,Device ID则对应具体GPU型号。你可以直接查NVIDIA官方PCI ID列表(https://developer.nvidia.com/pci-id-database),或者用lspci -vv -s 01:00.0 | grep "Subsystem"提取子系统ID(Subsystem ID),它由OEM厂商烧录,能精确指向某款定制卡(如戴尔Precision工作站的RTX 6000 Ada版子系统ID是1028:152d)。

2.2 第二层:内核模块层——lsmod和dmesg告诉你“驱动是否真的活了”

假设lspci确认有NVIDIA设备,下一步必须验证内核模块是否加载成功。很多人直接跳到nvidia-smi,结果报错就慌了,其实应该先执行:

lsmod | grep nvidia

正常情况会输出类似:

nvidia_uvm 1228800 0 nvidia_drm 61440 1 nvidia 45056000 75 nvidia_uvm,nvidia_drm

注意三点:第一,nvidia主模块必须存在且引用计数(最后一列数字)大于0;第二,nvidia_uvm(Unified Virtual Memory)和nvidia_drm(Direct Rendering Manager)是现代驱动必备模块,缺失任一都可能导致nvidia-smi通信失败;第三,模块大小(如45056000字节)能间接反映驱动版本——45系列驱动通常>40MB,50系列>45MB,这是快速判断是否装错驱动的土办法。

如果lsmod没输出,说明驱动根本没加载。此时要查dmesg日志:

dmesg | grep -i nvidia

常见失败原因有三类:

  • 签名问题:在启用Secure Boot的系统(如Ubuntu 22.04默认开启)上,未签名的NVIDIA驱动会被内核拒绝加载,dmesg会显示module verification failed。解决方案不是关Secure Boot,而是用mokutil --import导入驱动签名密钥。
  • 内核版本不匹配:比如你装了适配5.15内核的驱动,但系统升级到了6.2,dmesg会报disagrees about version of symbol。这时必须重装对应内核版本的驱动,或用dkms status检查DKMS是否自动重建模块。
  • GPU被其他驱动抢占:最典型的是nouveau开源驱动。dmesg会显示nouveau: loading failsafe firmware,然后nvidia模块加载失败。必须在/etc/modprobe.d/blacklist-nouveau.conf里添加blacklist nouveau并执行update-initramfs -u,否则重启后nouveau仍会抢设备。

注意:lsmod只能告诉你模块是否加载,不能证明GPU是否被正确初始化。我遇到过一次诡异故障:lsmod显示nvidia已加载,但nvidia-smi报Failed to initialize NVML,最后发现是/dev/nvidiactl设备节点权限错误(属组不是video),导致用户进程无法访问GPU控制通道。这种问题lsmod完全无法暴露。

2.3 第三层:用户态接口层——nvidia-smi不是万能钥匙,而是“最终验收报告”

当lspci看到硬件、lsmod确认驱动加载后,nvidia-smi才该登场。它的作用不是“查型号”,而是验证GPU是否进入可工作状态。执行nvidia-smi时,它会通过/dev/nvidiactl向内核模块发送NVML(NVIDIA Management Library)指令,要求返回GPU状态。如果成功,输出顶部会明确显示型号:

+-----------------------------------------------------------------------------+ | NVIDIA-SMI 535.129.03 Driver Version: 535.129.03 CUDA Version: 12.2 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 NVIDIA A100-SXM4... On | 00000000:3B:00.0 Off | 0 | | N/A 32C P0 52W / 400W | 0MiB / 40960MiB | 0% Default | +-------------------------------+----------------------+----------------------+

关键点在于:

  • 型号字段(GPU Name)是NVIDIA驱动从GPU固件(VBIOS)中读取的真实型号,比lspci的文本描述更权威。例如A100-SXM4-40GB明确区分了SXM4封装和40GB显存规格。
  • Driver Version和CUDA Version是配套关系:驱动版本决定了支持的最高CUDA版本(如535驱动支持CUDA 12.2),而CUDA版本又限制了可编译的PyTorch/TensorFlow版本。很多AI框架报错CUDA error: no kernel image is available for execution on the device,根源就是驱动与CUDA版本不匹配。
  • Bus-Id(如00000000:3B:00.0)是PCIe地址,与lspci输出的3b:00.0完全对应,这是交叉验证的黄金锚点。如果lspci显示3b:00.0是NVIDIA设备,而nvidia-smi里Bus-Id却是41:00.0,说明GPU被错误地分配到了另一个PCIe插槽——这在多GPU服务器热插拔后极常见。

实操心得:nvidia-smi默认每5秒刷新一次(见热搜词every 5.0s: nvidia-smi star),但生产环境严禁这样用!高频率轮询会增加GPU中断负载,尤其在A100/H100这类带NVLink的卡上,可能引发NVLink带宽抖动。正确做法是加-l 30参数设为30秒刷新,或用nvidia-smi -q -d MEMORY,UTILIZATION获取单次快照。我曾因没改刷新间隔,在一个8卡A100集群上导致NVLink通信延迟升高12%,训练吞吐直接掉20%。

3. 四种实战场景下的完整诊断流程与命令组合

3.1 场景一:全新服务器首次开机,nvidia-smi报“Failed to initialize NVML”

这是最典型的“驱动未就绪”状态。不要急着重装驱动,按以下顺序排查:

第一步:确认硬件存在

lspci -nn | grep -i "10de"

输出应类似:

3b:00.0 0300: 10de:2204 (rev a1) 41:00.0 0300: 10de:2204 (rev a1)

10de是NVIDIA Vendor ID,2204是H100 PCIe的Device ID。如果这里没输出,立刻检查:

  • 服务器是否启用Above 4G Decoding(BIOS设置,影响PCIe地址空间分配)
  • GPU供电线是否插牢(H100需双8pin,缺一不可)
  • 主板PCIe插槽是否启用(有些服务器默认关闭Slot 3/4)

第二步:检查内核模块

lsmod | grep nvidia # 若无输出,再查nouveau是否抢占 lsmod | grep nouveau # 若有,立即禁用 echo 'blacklist nouveau' | sudo tee /etc/modprobe.d/blacklist-nouveau.conf sudo update-initramfs -u sudo reboot

第三步:验证驱动安装完整性

# 检查驱动文件是否存在 ls -l /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.* # 正常应有libnvidia-ml.so.1和libnvidia-ml.so.535.129.03两个文件 # 若缺失libnvidia-ml.so,说明驱动安装不完整(常见于离线安装漏拷贝库) # 解决方案:重新运行NVIDIA.run安装包,或手动从驱动包解压libnvidia-ml.so.*

第四步:检查设备节点权限

ls -l /dev/nvidia* # 正常输出: # crw-rw-rw- 1 root root 195, 255 Oct 10 10:00 /dev/nvidiactl # crw-rw-rw- 1 root root 195, 254 Oct 10 10:00 /dev/nvidia-uvm # crw-rw-rw- 1 root root 195, 253 Oct 10 10:00 /dev/nvidia0 # 如果属组不是video,执行: sudo groupadd video sudo usermod -a -G video $USER sudo chgrp video /dev/nvidia* # 然后重启或重新登录

3.2 场景二:虚拟机环境,nvidia-smi返回空或“no devices were found”

虚拟机(VM)无法直接访问物理GPU,必须通过GPU直通(GPU Passthrough)或vGPU技术。先确认宿主机状态:

# 在宿主机执行 lspci -k -s 3b:00.0 | grep -A 3 "Kernel driver in use" # 输出应为: # Kernel driver in use: vfio-pci # 表示已直通给VM # 或 # Kernel driver in use: nvidia # 表示被宿主机占用,VM无法访问

如果宿主机驱动占用,VM里必然看不到GPU。解决方案:

  • KVM/QEMU直通:在宿主机/etc/default/grub中添加intel_iommu=on(Intel CPU)或amd_iommu=on(AMD CPU),然后grub-update && reboot。再用virsh edit vm-name添加PCI设备:
<hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x3b' slot='0x00' function='0x0'/> </source> </hostdev>
  • vGPU(仅限数据中心卡):A10/A100/L40支持vGPU,需在宿主机安装NVIDIA vGPU软件套件(vGPU Manager),并在VM配置中指定vGPU类型(如A10-2Q)。此时VM里lspci能看到NVIDIA设备,但nvidia-smi显示的是虚拟化后的型号(如NVIDIA A10-2Q),而非物理卡型号。

踩坑记录:我在ESXi 7.0上配置A10直通时,nvidia-smi在VM里始终报错。最后发现是ESXi BIOS里启用了Above 4G Decoding,但VM的.vmx文件里没加pciPassthru.useSafeMMIO = "TRUE",导致MMIO地址冲突。这个参数必须手动添加,否则GPU无法初始化。

3.3 场景三:国产Linux系统(如麒麟、UOS),lspci中文乱码且nvidia-smi找不到命令

国产系统常预装nvidia-driver但未包含nvidia-smi工具,或pci.ids数据库未更新。解决步骤:

第一步:修复lspci乱码

# 临时解决:强制UTF-8编码 LC_ALL=C lspci -nn | grep 10de # 永久解决:更新pci.ids数据库 sudo wget -O /usr/share/misc/pci.ids http://pciids.sourceforge.net/pci.ids # 或使用国内镜像 sudo curl -o /usr/share/misc/pci.ids https://mirrors.tuna.tsinghua.edu.cn/pciids/pci.ids

第二步:安装缺失的nvidia-smi

# 先查驱动是否已装 rpm -qa | grep nvidia # 麒麟/UOS用rpm包管理 # 若显示nvidia-driver-535.129.03,则说明驱动已装,但nvidia-smi不在PATH # 查找nvidia-smi位置 find /usr -name "nvidia-smi" 2>/dev/null # 通常在/usr/lib/nvidia/bin/nvidia-smi,添加软链接 sudo ln -sf /usr/lib/nvidia/bin/nvidia-smi /usr/bin/nvidia-smi

第三步:处理国产系统特有的Secure Boot问题
国产系统Secure Boot密钥与NVIDIA官方不兼容,需手动签名:

# 生成密钥对 openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=My Custom Module/" # 导入密钥 sudo mokutil --import MOK.der # 重启后按提示输入密码,完成密钥注册 # 重新编译驱动模块 sudo /usr/src/nvidia-*/nvidia-installer --uninstall sudo /usr/src/nvidia-*/nvidia-installer --no-opengl-files --no-opengl-libs

3.4 场景四:多GPU服务器,需精确识别每块卡的物理位置和型号

在8卡A100服务器上,仅靠nvidia-smi的序号(GPU 0~7)无法定位物理槽位。必须结合PCIe拓扑:

第一步:获取每块GPU的完整PCIe路径

nvidia-smi -L # 输出: # GPU 0: NVIDIA A100-SXM4-40GB (UUID: GPU-xxxxxx) # GPU 1: NVIDIA A100-SXM4-40GB (UUID: GPU-yyyyyy) # 记下UUID,然后查对应PCIe地址 nvidia-smi -q -d PCI | grep -A 5 "GPU UUID" # 找到GPU 0的Bus Id: 00000000:3B:00.0

第二步:用lspci反查物理位置

lspci -tv | grep -A 5 "3b:00.0" # 输出类似: # +-3b.0-[3b-3f]----00.0 NVIDIA Corporation GA100 [A100 SXM4] # | \-+-01.0-[3c]----00.0 NVIDIA Corporation GA100 [A100 SXM4] # | \-+-02.0-[3d]----00.0 NVIDIA Corporation GA100 [A100 SXM4] # 这里3b:00.0对应主板Slot 1,3c:00.0对应Slot 2...

第三步:物理定位(终极验证)

# 启动GPU风扇全速,听声辨位 sudo nvidia-smi -r # 重置GPU(清空所有状态) sudo nvidia-smi -i 0 -r # 对GPU 0执行reset,此时该卡风扇会狂转 # 到服务器机柜前,根据风扇声音定位Slot 1 # 再执行sudo nvidia-smi -i 1 -r,定位Slot 2...

实操技巧:在机房巡检时,我习惯用手机录下每块GPU reset时的风扇声纹,存成音频备忘录。因为A100 SXM4和PCIe版的风扇曲线完全不同——SXM4是高频尖啸,PCIe版是低频轰鸣。这种“听声识卡”法比看标签快十倍,尤其在标签脱落或油污覆盖时。

4. 常见报错深度解析与独家修复方案

4.1nvidia-smi has failed because it couldn't communicate with the NVIDIA driver

这个报错覆盖了70%以上的GPU识别失败案例,但根源差异极大。我们按排查优先级排序:

排查项检查命令典型现象修复方案
驱动未安装`dpkg -lgrep nvidia(Ubuntu) 或rpm -qagrep nvidia` (CentOS)
驱动版本与内核不匹配uname -r和cat /proc/driver/nvidia/version内核5.15.0,但驱动编译于5.10.0重装驱动时加--kernel-version=$(uname -r)参数,或启用DKMS自动重建
Secure Boot阻止模块加载`dmesggrep -i "secure boot"`SecureBoot is enabled+module verification failed
nouveau抢占GPUlspci -k -s 3b:00.0 | grep "Kernel driver"Kernel driver in use: nouveau黑名单禁用nouveau并更新initramfs(见3.1节)
设备节点权限错误ls -l /dev/nvidia*/dev/nvidiactl属组为root而非videosudo chgrp video /dev/nvidia* && sudo usermod -a -G video $USER

独家技巧:当dmesg显示NVRM: API mismatch时,说明用户态驱动库(libnvidia-ml.so)与内核模块版本不一致。此时不要重装驱动,只需执行:

sudo /usr/bin/nvidia-uninstall sudo rm -rf /usr/lib/nvidia-* sudo apt-get install --reinstall nvidia-driver-535 # Ubuntu

这能强制刷新所有库文件,比完整重装快5分钟。

4.2Command 'nvidia-smi' not found, but can be installed with:

这是Ubuntu/Debian系特有提示,本质是nvidia-smi不在/usr/bin路径。原因有两个:

原因一:驱动安装时未创建符号链接
NVIDIA官方.run包默认将nvidia-smi放在/usr/bin/,但某些发行版(如Ubuntu 22.04)的nvidia-driver-535deb包将其放在/usr/lib/nvidia/bin/。解决方案:

sudo ln -sf /usr/lib/nvidia/bin/nvidia-smi /usr/bin/nvidia-smi sudo ln -sf /usr/lib/nvidia/bin/nvidia-settings /usr/bin/nvidia-settings

原因二:PATH环境变量未包含nvidia目录
检查echo $PATH,若无/usr/lib/nvidia/bin,则永久添加:

echo 'export PATH="/usr/lib/nvidia/bin:$PATH"' >> ~/.bashrc source ~/.bashrc

4.3Failed to initialize NVML与Unable to determine the device handle

这两个报错常同时出现,根源是GPU控制通道(/dev/nvidiactl)不可达。除了权限问题(见3.1节),还有两个隐蔽原因:

原因一:GPU被其他进程独占
某些AI框架(如TensorFlow 1.x)默认占用全部GPU显存,导致nvidia-smi无法获取设备句柄。验证方法:

nvidia-smi -q | grep "Attached GPUs" # 若显示0,说明GPU被隔离 # 释放方法:杀掉占用进程 sudo fuser -v /dev/nvidia* # 或重启相关服务 sudo systemctl restart docker # 如果GPU被容器占用

原因二:PCIe ACS(Access Control Services)未启用
在多GPU服务器上,若ACS未启用,会导致GPU间DMA请求被拦截,nvidia-smi无法初始化NVML。检查:

dmesg | grep -i "acs" # 若输出`ACS disabled`,需在BIOS中启用ACS,或在GRUB中添加`pci=acs_override`

4.4NVIDIA-SMI couldn't find libnvidia-ml.so library in your system

libnvidia-ml.so是NVML核心库,缺失意味着驱动安装不完整。常见于离线安装场景:

离线安装漏文件
NVIDIA.run包解压后有libnvidia-ml.so.*文件,但安装脚本可能因权限问题未拷贝。手动修复:

# 找到驱动包解压目录 find /tmp -name "libnvidia-ml.so.*" 2>/dev/null # 通常在/tmp/NVIDIA-Linux-x86_64-535.129.03/kernel/ # 拷贝到系统库路径 sudo cp /tmp/NVIDIA-Linux-x86_64-535.129.03/kernel/libnvidia-ml.so.* /usr/lib/x86_64-linux-gnu/ sudo ldconfig

库文件版本冲突
系统已存在旧版libnvidia-ml.so.470,新驱动需要libnvidia-ml.so.535。此时ldconfig可能缓存旧路径。强制刷新:

sudo ldconfig -p | grep nvidia-ml # 若显示多个版本,删除旧版 sudo rm /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.470* sudo ldconfig

5. 超越基础:从型号识别延伸到GPU健康度与性能基线评估

查到型号只是起点,真正价值在于利用这些信息建立GPU运维基线。我给团队制定的《GPU服务器健康检查清单》包含以下必做项:

5.1 型号→功耗墙→散热策略映射表

不同型号GPU的TDP(热设计功耗)差异巨大,必须匹配散热方案:

GPU型号TDP(W)散热要求风扇策略典型故障
RTX 4090450W双槽涡轮散热默认模式(60%转速)降频至P2状态,显存温度>95℃
A100 PCIe250W三槽主动散热自动调速(依据GPU温度)PCIe链路降速至x8,nvidia-smi -q -d PCIE显示Current Link Width: 8x
L40220W单槽被动散热强制满速(需修改VBIOS)显存ECC错误率突增,nvidia-smi -q -d MEMORY显示Total ECC Errors: 120

实操心得:A100 PCIe版在25℃室温下,若风扇转速低于40%,GPU核心温度会突破85℃触发降频。我用ipmitool sensor list \| grep "Fan"监控机箱风扇,当GPU温度>80℃时,自动提升机箱风扇转速——这比单纯调GPU风扇更有效,因为A100的热量主要通过PCB传导到机箱。

5.2 型号→CUDA核心数→算力瓶颈预判

nvidia-smi不显示CUDA核心数,但这是评估AI训练吞吐的关键。查NVIDIA官方规格表(https://www.nvidia.com/en-us/data-center/gpus/)可得:

GPU型号CUDA核心数Tensor核心数FP32算力(TFLOPS)适用场景
RTX 40901638451282.6本地大模型微调
A100 40GB691243219.5大规模分布式训练
L401817656891.6高吞吐推理(Llama3-70B)

注意:FP32算力是理论峰值,实际训练中受显存带宽限制。A100的2039GB/s带宽 vs L40的864GB/s,意味着L40在处理大batch size时,显存带宽会先成为瓶颈。所以选型时不能只看CUDA核心数,必须交叉对比带宽指标。

5.3 型号→PCIe版本→带宽瓶颈检测

nvidia-smi -q -d PCIE输出中的Current Link Width和Current Link Speed决定GPU与CPU的数据传输能力:

nvidia-smi -q -d PCIE | grep -E "(Current Link Width|Current Link Speed)" # 输出: # Current Link Width : 16x # Current Link Speed : 32 GT/s
  • 16x表示使用全部16条PCIe通道
  • 32 GT/s对应PCIe 5.0(PCIe 4.0是16 GT/s,PCIe 3.0是8 GT/s)

如果显示8x或4x,说明PCIe协商失败。常见原因:

  • 主板PCIe插槽物理损坏(用lspci -vv -s 3b:00.0 \| grep "LnkSta"查链路状态)
  • BIOS中PCIe Speed设置为Gen3(需设为Auto)
  • GPU与CPU代际不匹配(如13代Intel CPU配PCIe 5.0 GPU,但BIOS未启用Resizable BAR)

独家技巧:用ibstat查InfiniBand状态,再用nvidia-smi nvlink -gt查NVLink带宽。如果NVLink带宽正常(如A100 SXM4的600GB/s),但nvidia-smi dmon -s u显示GPU利用率<30%而CPU利用率>90%,说明数据搬运成了瓶颈——此时必须优化数据加载Pipeline,而非升级GPU。

最后分享个小技巧:我把所有GPU型号、Device ID、TDP、CUDA核心数整理成一个CSV文件,写了个Python脚本,输入lspci -nn的输出就能自动匹配型号并给出运维建议。比如输入10de:2204,脚本立刻返回“A100 PCIe,TDP 250W,需检查PCIe链路宽度”。这个脚本现在是我们团队GPU巡检的标准工具,比背命令有用多了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 2:05:29

Spring Boot 3 + MyBatis-Plus 3.5.9 实战:CRUD、分页与性能优化

1. 项目背景与整体设计思路1.1 为什么在这个时间节点选择Spring Boot 3我最近在一个新项目里把技术栈切到了 Spring Boot 3 MyBatis-Plus 3.5.9&#xff0c;整体体验下来确实有不少值得说的东西。先说结论&#xff1a;如果你是一个新启动的 Java 后端项目&#xff0c;现在可以…

作者头像 李华
网站建设 2026/10/2 2:02:56

PyTorch强化学习实战(27)——进化策略在强化学习中的应用

PyTorch强化学习实战&#xff08;27&#xff09;——进化策略在强化学习中的应用0. 前言1. 黑盒优化方法2. 进化策略3. 在 CartPole 环境中实现进化策略小结系列链接0. 前言 在本节中&#xff0c;我们将改变对强化学习 (Reinforcement Learning, RL) 训练的视角&#xff0c;转…

作者头像 李华
网站建设 2026/10/2 2:02:24

基于springboot + vue鲜花销售系统(源码+数据库+文档)

鲜花销售系统 目录 基于springboot vue鲜花销售系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue鲜花销售系统 一、前言 博主介绍&#xff1a;✌…

作者头像 李华
网站建设 2026/10/2 2:02:03

KCF与卡尔曼滤波融合:视觉目标跟踪的观测预测互补方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/2 2:02:03

MFC对话框添加工具栏:原理、代码与常见问题

简介&#xff1a;这是一份面向Visual C与MFC开发者的完整示例工程&#xff0c;聚焦对话框窗体如何集成工具栏这一常见需求&#xff0c;覆盖CDialog派生类搭建、工具栏资源设计、控件关联以及按钮消息映射等关键环节&#xff0c;适合正在学习MFC界面开发或需要为对话框添加快捷工…

作者头像 李华