KubeVirt下gpu operator实践(GPU直通)

KubeVirt下gpu operator实践(GPU直通)

参考《在 KubeVirt 中使用 GPU Operator》,记录gpu operator在KubeVirt下实践的过程,包括虚拟机配置GPU直通,容器挂载GPU设备等。

KubeVirt 提供了一种将主机设备分配给虚拟机的机制。该机制具有通用性,支持分配各种类型的 PCI 设备,例如加速器(包括 GPU)或其他连接到 PCI 总线的设备。

1. 准备工作

硬件信息

三台服务器,每台服务器的主要硬件配置信息如下:

  • 型号: H3C UniServer R5200 G3

  • cpu:Xeon® Gold 5118 CPU @ 2.30GHz,2x12x2

  • mem: 512GB

  • disk: 1.75GBx2,一块用于系统盘,一块用于ceph数据盘。

  • gpu:GV100GL_TESLA_V100_PCIE_16GB*4

kubernetes集群环境

k8s环境信息如下,使用v1.27.6版本,节点同时作为管理节点和业务节点。

]# kubectl get node
NAME    STATUS   ROLES                  AGE     VERSION
node1   Ready    control-plane,master   7d18h   v1.27.6
node2   Ready    control-plane,master   7d18h   v1.27.6
node3   Ready    control-plane,master   7d18h   v1.27.6

rook-ceph环境安装

使用版本v1.13.5,组件信息如下:

]#  kubectl get pod -n rook-ceph
NAME                                                READY   STATUS      RESTARTS        AGE
csi-cephfsplugin-5k87k                              2/2     Running     4 (5d22h ago)   12d
csi-cephfsplugin-88rmz                              2/2     Running     0               5d22h
csi-cephfsplugin-np9lb                              2/2     Running     4 (5d22h ago)   12d
csi-cephfsplugin-provisioner-5556f68f89-bsphz       5/5     Running     0               5d22h
csi-cephfsplugin-provisioner-5556f68f89-jswvj       5/5     Running     0               5d22h
csi-rbdplugin-5v8dm                                 2/2     Running     0               5d22h
csi-rbdplugin-provisioner-76f966fdd8-6jwdk          5/5     Running     0               5d22h
csi-rbdplugin-provisioner-76f966fdd8-sjf6c          5/5     Running     3 (4d21h ago)   5d22h
csi-rbdplugin-s8k4x                                 2/2     Running     4 (5d22h ago)   12d
csi-rbdplugin-s97mc                                 2/2     Running     4 (5d22h ago)   12d
os-rook-set-cronjob-28865084-h5jdf                  0/1     Completed   0               118s
rook-ceph-agent-7bdf69b4f7-wzl7r                    1/1     Running     0               5d22h
rook-ceph-crashcollector-node1-c9bc54894-s7lps      1/1     Running     0               5d22h
rook-ceph-crashcollector-node2-6448cdd8f9-7dlgs     1/1     Running     0               5d22h
rook-ceph-crashcollector-node3-56d876f9c6-6bjlr     1/1     Running     0               5d22h
rook-ceph-exporter-node1-7c7d659d96-6k55c           1/1     Running     0               5d22h
rook-ceph-exporter-node2-7bc85dfdf-xdt8g            1/1     Running     0               5d22h
rook-ceph-exporter-node3-f45f5db9d-8jrgs            1/1     Running     0               5d22h
rook-ceph-mds-ceph-filesystem-a-5bbf4d5d79-qwsd2    2/2     Running     0               5d22h
rook-ceph-mds-ceph-filesystem-b-69b5fc4f7-fhlth     2/2     Running     0               5d22h
rook-ceph-mgr-a-5f5768988-6dsm2                     3/3     Running     0               5d22h
rook-ceph-mgr-b-5c96dcf465-7gcrk                    3/3     Running     0               5d22h
rook-ceph-mon-a-5dcb9b69c5-p5mh9                    2/2     Running     0               5d22h
rook-ceph-mon-b-6575d4f46b-gsthp                    2/2     Running     0               5d22h
rook-ceph-mon-c-7ff969d568-gqzr4                    2/2     Running     0               5d22h
rook-ceph-operator-86d5cb7c46-nx4jc                 1/1     Running     0               5d22h
rook-ceph-osd-0-69c8c7fb45-nvvsx                    2/2     Running     0               5d22h
rook-ceph-osd-1-5fcdbc57bf-dh8cf                    2/2     Running     0               5d22h
rook-ceph-osd-2-7445bdc885-sxqbc                    2/2     Running     0               5d22h
rook-ceph-rgw-ceph-objectstore-a-795c4c64cf-xbhkl   2/2     Running     0               5d22h
rook-ceph-tools-5877f9f669-tndwc                    1/1     Running     0               5d22h

kubevirt安装

参考kubevirt官方文档完成虚拟化插件的安装,本文使用的版本为v1.2.0-amd64。

]# kubectl get pod -n kubevirt
NAME                                READY   STATUS    RESTARTS   AGE
virt-api-74d58d7fc8-5v5t4           1/1     Running   0          5d21h
virt-api-74d58d7fc8-m7lhw           1/1     Running   0          5d21h
virt-controller-55d7978dc-d9tk2     1/1     Running   0          5d21h
virt-controller-55d7978dc-xsvtm     1/1     Running   0          5d21h
virt-exportproxy-795d79f86b-qgc4c   1/1     Running   0          5d21h
virt-exportproxy-795d79f86b-wxt4b   1/1     Running   0          5d21h
virt-handler-4x55q                  1/1     Running   0          5d21h
virt-handler-b9b27                  1/1     Running   0          5d21h
virt-handler-n8bf8                  1/1     Running   0          5d21h
virt-operator-79bb89f7bd-zrxx6      1/1     Running   0          5d21h

禁用nouveau驱动

  1. 移除模块
]# modprobe -r nouveau
  1. 配置文件

创建文件/etc/modprobe.d/blacklist-nouveau.conf, 并添加如下内容:

blacklist nouveau
options nouveau modeset=0 
  1. 重启内核 initramfs(如报错可忽略):
]# sudo dracut --force
  1. 检查 nouveau 模块是否被禁用:
]# lsmod | grep nouveau

卸载nvidia驱动

使用vfio-pci驱动实现GPU直通,节点操作系统不需要安装nvidia驱动,如已安装,通过如下命令卸载:

nvidia-uninstall

本文环境中节点1、2配置vfio-pci驱动,不安装nvida驱动;节点3提前预安装了nvida驱动(根据gpu-operator部署方式决定)。

主机配置PCI直通

主机设备直通需要在 BIOS 中启用虚拟化扩展和 IOMMU 扩展(Intel VT-d 或 AMD IOMMU)。

要启用 IOMMU,根据 CPU 类型,主机应通过额外的内核参数启动,对于 Intel CPU 使用 intel_iommu=on,对于 AMD CPU 使用 amd_iommu=on

修改grub引导配置文件,如下两种方式供参考:

grub配置开启intel IOMMU

修改 GRUB 配置的模板文件,将参数附加到 grub 配置文件中 GRUB_CMDLINE_LINUX 行的末尾。

]# vi /etc/default/grub
...
GRUB_CMDLINE_LINUX="nofb splash=quiet console=tty0 ... intel_iommu=on
...

]# grub2-mkconfig -o /boot/grub2/grub.cfg

]# reboot
修改最终的引导配置文件

这里看具体的系统引导文件位置,比如H3Linux的引导文件位置为:/boot/efi/EFI/H3Linux/grub.cfg,在linux命令后面添加 intel_iommu=on

...
### BEGIN /etc/grub.d/10_linux ###
menuentry 'H3Linux (5.10.0-136.12.0.86.4.hl202.x86_64) 2.0.2-SP01' --class h3linux --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-5.10.0-136.12.0.86.4.hl202.x86_64-advanced-fdd76f12-53d6-41d2-aaab-be7a10e2009c' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_gpt
        insmod ext2
        set root='hd0,gpt2'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  bb0505b3-0529-4916-af54-c39fca87a752
        else
          search --no-floppy --fs-uuid --set=root bb0505b3-0529-4916-af54-c39fca87a752
        fi
        echo    'Loading Linux 5.10.0-136.12.0.86.4.hl202.x86_64 ...'
        linux   /vmlinuz-5.10.0-136.12.0.86.4.hl202.x86_64 root=/dev/mapper/cloudos-root ro rd.lvm.lv=cloudos/root cgroup_disable=files panic=3 nmi_watchdog=1 console=tty0 crashkernel=512M rhgb quiet no-kvmclock user_namespace.enable=1 intel_pstate=disable cpufreq.off=1 loglevel=3 intel_iommu=on
        echo    'Loading initial ramdisk ...'
        initrd  /initramfs-5.10.0-136.12.0.86.4.hl202.x86_64.img
}
...
BIOS配置开启intel VT-d

里以H3C 服务器BIOS为例,进入BIOS,打开【Socket Configuration】【IIO Configuration】

vtd-enable

加载vfio驱动

加载vfio驱动

]# modprobe vfio_pci

正常情况下可看到vfio内核模块已加载:

]# lsmod | grep vfio_
vfio_pci               81920  0
vfio_virqfd            16384  1 vfio_pci
vfio_iommu_type1       53248  0
vfio                   45056  2 vfio_iommu_type1,vfio_pci
irqbypass              16384  2 vfio_pci,kvm

2. GPU Operator安装

本文使用最新的GPU Operator 24.9.0,参考对应的安装部署。安装场景采用"预安装的NVIDIA GPU驱动程序",driver.enabled=false

查看节点的GPU设备:

]# kubectl get node node3 -ojson | jq -r ".status.capacity"
# 示例输出:
{
  "cpu": "48",
  "devices.kubevirt.io/kvm": "1k",
  "devices.kubevirt.io/tun": "1k",
  "devices.kubevirt.io/vhost-net": "1k",
  "ephemeral-storage": "514937088Ki",
  "h3c.com/vcuda-core": "0",
  "h3c.com/vcuda-memory": "0",
  "hugepages-1Gi": "0",
  "hugepages-2Mi": "0",
  "memory": "790609008Ki",
  "nvidia.com/GV100GL_TESLA_V100_PCIE_16GB": "4",
  "nvidia.com/gpu": "0",
  "pods": "250"
}

3. 节点配置GPU工作负载

语法:

# 虚拟机gpu直通负载
kubectl label node <node-name> --overwrite nvidia.com/gpu.workload.config=vm-passthrough
# 容器工作负载
kubectl label node <node-name> --overwrite nvidia.com/gpu.workload.config=container

查看节点可分配的GPU资源:

]# kubectl get node node1 -o json | jq '.status.allocatable | with_entries(select(.key | startswith("nvidia.com/"))) | with_entries(select(.value != "0"))'
{
  "nvidia.com/GV100GL_TESLA_V100_PCIE_16GB": "4"
}

本文测试环境中将node1/2节点配置虚拟机GPU直通工作负载,node3节点配置容器GPU工作负载:

kubectl label node node1 --overwrite nvidia.com/gpu.workload.config=vm-passthrough
kubectl label node node2 --overwrite nvidia.com/gpu.workload.config=vm-passthrough
kubectl label node node3 --overwrite nvidia.com/gpu.workload.config=container

4. 向 KubeVirt CR 中添加 GPU 资源

  1. 确定GPU设备的资源名称
[root@node3 ~]# kubectl get node node1 -o json | jq '.status.allocatable | with_entries(select(.key | startswith("nvidia.com/"))) | with_entries(select(.value != "0"))'

示例输出:

{
  "nvidia.com/GV100GL_TESLA_V100_PCIE_16GB": "4"
}

或者通过如下命令查看:

]# kubectl get node node1 -ojson | jq -r ".status.capacity"
{
  "cpu": "48",
  "devices.kubevirt.io/kvm": "1k",
  "devices.kubevirt.io/tun": "1k",
  "devices.kubevirt.io/vhost-net": "1k",
  "ephemeral-storage": "514937088Ki",
  "h3c.com/vcuda-core": "0",
  "h3c.com/vcuda-memory": "0",
  "hugepages-1Gi": "0",
  "hugepages-2Mi": "0",
  "memory": "790609008Ki",
  "nvidia.com/GV100GL_TESLA_V100_PCIE_16GB": "4",
  "nvidia.com/gpu": "0",
  "pods": "250"
}
  1. 确定 GPU 的 PCI 设备 ID。

可以在 PCI IDs 数据库中按设备名称进行搜索。

如果有节点的主机访问权限,可以使用以下命令列出 NVIDIA GPU 设备:

lspci -nnk -d 10de:

示例输出

]# lspci -nnk -d 10de:
60:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)
        Subsystem: NVIDIA Corporation Device [10de:1214]
        Kernel driver in use: nvidia
        Kernel modules: nouveau, nvidia_drm, nvidia
64:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)
        Subsystem: NVIDIA Corporation Device [10de:1214]
        Kernel driver in use: nvidia
        Kernel modules: nouveau, nvidia_drm, nvidia
65:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)
        Subsystem: NVIDIA Corporation Device [10de:1214]
        Kernel driver in use: nvidia
        Kernel modules: nouveau, nvidia_drm, nvidia
66:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)
        Subsystem: NVIDIA Corporation Device [10de:1214]
        Kernel driver in use: nvidia
        Kernel modules: nouveau, nvidia_drm, nvidia

或者通过如下命令查看设备的vid和pid:

]#  lspci -nnv | grep -i nvidia
60:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)
        Subsystem: NVIDIA Corporation Device [10de:1214]
        Kernel driver in use: nvidia
        Kernel modules: nouveau, nvidia_drm, nvidia
64:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)
        Subsystem: NVIDIA Corporation Device [10de:1214]
        Kernel driver in use: nvidia
        Kernel modules: nouveau, nvidia_drm, nvidia
65:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)
        Subsystem: NVIDIA Corporation Device [10de:1214]
        Kernel driver in use: nvidia
        Kernel modules: nouveau, nvidia_drm, nvidia
66:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)
        Subsystem: NVIDIA Corporation Device [10de:1214]
        Kernel driver in use: nvidia
        Kernel modules: nouveau, nvidia_drm, nvidia
  1. 修改kubevirt CRD,添加GPU资源配置。
kubectl edit kubevirts.kubevirt.io -n kubevirt kubevirt

添加如下内容:

...
spec:
  certificateRotateStrategy: {}
  configuration:
    developerConfiguration:
      cpuAllocationRatio: 2
      featureGates:
      - HotplugVolumes
      - LiveMigration
      - Snapshot
      - AutoResourceLimitsGate
      - VMExport
      - ExpandDisks
      - HotplugNICs
      - VMLiveUpdateFeatures
      - GPU     # 增加的配置
      - DisableMDEVConfiguration    # 增加的配置。设置 DisableMDEVConfiguration 功能门控
    liveUpdateConfiguration:
      maxCpuSockets: 48
      maxGuest: 128Gi
    migrations:
      parallelMigrationsPerCluster: 30
      parallelOutboundMigrationsPerNode: 20
    permittedHostDevices:
      pciHostDevices:
      - externalResourceProvider: true
        pciVendorSelector: 10DE:1214    # 增加的配置,vid:pid
        resourceName: nvidia.com/GV100GL_TESLA_V100_PCIE_16GB   # 增加的配置,gpu型号
    vmRolloutStrategy: LiveUpdate
  customizeComponents: {}
  imagePullPolicy: IfNotPresent
...

根据您的设备替换 YAML 中的值:

  • pciHostDevices 下,将 pciVendorSelectorresourceName 替换为您的 GPU 型号。

设置 externalResourceProvider=true,以表明该资源由外部设备插件(即 GPU Operator 部署的 sandbox-device-plugin)提供。

5. 配置虚拟机GPU直通

在 GPU Operator 完成将沙箱设备插件和 VFIO 管理器 pod 部署到工作节点上,并将 GPU 资源添加到 KubeVirt 允许列表之后,可以通过编辑 VirtualMachineInstance 清单中的 spec.domain.devices.gpus 字段,将 GPU 分配给虚拟机。

apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachineInstance
...
spec:
  domain:
    devices:
      gpus:
      - deviceName: nvidia.com/GV100GL_TESLA_V100_PCIE_16GB
        name: gpu1
...
  • deviceName 是表示设备的资源名称。
  • name 是在虚拟机中用于标识该设备的名称。

已经存在的虚拟机配置单GPU直通

这里以已经创建的虚拟机为例。

 kubectl edit vm -n vm-a34ceaea   i-1hwrg6bn

在spec-domain-devices里新增gpu资源。

...
          - cdrom:
              bus: sata
            name: img-vm-0p9i3k9z
          - bootOrder: 3
            cdrom:
              bus: sata
            name: img-vm-rg29oicy
          gpus:
          - deviceName: nvidia.com/GV100GL_TESLA_V100_PCIE_16GB
            name: gpu1
          interfaces:
          - macAddress: 00:00:00:78:5F:66
...
  • deviceName 是表示设备的资源名称。
  • name 是在虚拟机中用于标识该设备的名称。

配置多GPU直通

如果虚拟机需要配置多块GPU,则在 spec-domain-devices 里新增多个 gpus 资源。

...
          - cdrom:
              bus: sata
            name: img-vm-0p9i3k9z
          - bootOrder: 3
            cdrom:
              bus: sata
            name: img-vm-rg29oicy
          gpus:
          - deviceName: nvidia.com/GV100GL_TESLA_V100_PCIE_16GB
            name: gpu1
          - deviceName: nvidia.com/GV100GL_TESLA_V100_PCIE_16GB
            name: gpu2
          interfaces:
          - macAddress: 00:00:00:78:5F:66
...

注意:

虚拟机配置的GPU数量不超过所在节点的GPU数量。

6. 验证GPU直通

如果配置虚拟机时处于开机状态,修改完成后,需要重启虚拟机,进入系统后查看GPU设备是否直通成功。

]# lspci | grep -i nvidia

gpu-operator不会给该虚机安装nvidia驱动,虚拟机内使用GPU需要自行安装驱动。

7. 节点负载变更

将gpu直通工作节点配置为容器节点:

  1. 将该节点上挂载gpu资源的vm进行gpu资源卸载并关机

  2. label修改节点工作负载为container

kubectl label node node3 --overwrite nvidia.com/gpu.workload.config=container

  1. 节点安装英伟达驱动

  2. 最终三台节点运行的gpu-operator组件列表如下

可以看出运行容器gpu负载的node3与运行虚拟机gpu负载的node1/2节点运行的组件是不同的。

dcgm-exporter-k48tk                                1/1     Running   0          node3
gg-node-feature-discovery-master-8c4456d6d-d5rh2   1/1     Running   0          node3
gg-node-feature-discovery-worker-h25wc             1/1     Running   0          node3
gg-node-feature-discovery-worker-kqsqc             1/1     Running   0          node2
gg-node-feature-discovery-worker-sw74t             1/1     Running   0          node1
gpu-feature-discovery-24vgc                        1/1     Running   0          node3
gpu-operator-56b9f58d9c-dzsk6                      1/1     Running   0          node3
nvidia-container-toolkit-daemonset-htlvx           1/1     Running   0          node3
nvidia-device-plugin-daemonset-hdmwc               1/1     Running   0          node3
nvidia-operator-validator-m7kch                    1/1     Running   0          node3
nvidia-sandbox-device-plugin-daemonset-fwb2q       1/1     Running   0          node2
nvidia-sandbox-device-plugin-daemonset-h4dtn       1/1     Running   0          node1
nvidia-sandbox-validator-294bd                     1/1     Running   0          node1
nvidia-sandbox-validator-s4qrg                     1/1     Running   0          node2
nvidia-vfio-manager-8f7xx                          1/1     Running   0          node2
nvidia-vfio-manager-jszqg                          1/1     Running   0          node1
smi-exporter-9s6x2                                 1/1     Running   0          node1
smi-exporter-b8wzc                                 1/1     Running   0          node3
smi-exporter-xg7rs                                 1/1     Running   0          node2

说明

gpu-operator设置driver.enabled=false,所以node3上默认没有驱动程序安装pod。

8. 参考

  1. GPU Operator with KubeVirt:https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/gpu-operator-kubevirt.html

  2. Host Devices Assignment:https://kubevirt.io/user-guide/compute/host-devices/#listing-permitted-devices

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/920911.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

How to update the content of one column in Mysql

How to update the content of one column in Mysql by another column name? UPDATE egg.eggs_record SET sold 2024-11-21 WHERE id 3 OR id 4;UPDATE egg.eggs_record SET egg_name duck egg WHERE id 2;

【K8S系列】imagePullSecrets配置正确,但docker pull仍然失败,进一步排查详细步骤

如果 imagePullSecrets 配置正确,但在执行 docker pull 命令时仍然失败,可能存在以下几种原因。以下是详细的排查步骤和解决方案。 1. 检查 Docker 登录凭证 确保你使用的是与 imagePullSecrets 中相同的凭证进行 Docker 登录: 1.1 直接登录 在命令行中,执行以下命令: …

机器学习基础06

目录 1.梯度下降 1.1梯度下降概念 1.2梯度下降公式 1.3学习率 1.4实现梯度下降 1.5API 1.5.1随机梯度下降SGD 1.5.2小批量梯度下降MBGD 1.6梯度下降优化 2.欠拟合过拟合 2.1欠拟合 2.2过拟合 2.3正则化 2.3.1L1正则项&#xff08;曼哈顿距离&#xff09; 2.3.2…

徒手从零搭建一套ELK日志平台

徒手从零搭建一套ELK日志平台 日志分析的概述日志分析的作用主要收集工具集中式日志系统主要特点采集日志分类ELK概述初级版ELK终极版ELK高级版ELKELK收集日志的两种形式 搭建ELK平台Logstash工作原理Logstash核心概念环境准备安装部署docker添加镜像加速器安装部署Elasticsear…

开源科学工程技术软件介绍 – EDA工具KLayout

link 今天向各位知友介绍的 KLayout是一款由德国团队开发的开源EDA工具。 KLayout是使用C开发的&#xff0c;用户界面基于Qt。它支持Windows、MacOS和Linux操作系统。安装程序可以从下面的网址下载&#xff1a; https://www.klayout.de/build.html KLayout图形用户界面&…

Linux离线安装Docker命令,简单镜像操作

解压安装包 首先&#xff0c;使用 tar 命令解压 docker-27.3.1.tgz 安装包&#xff1a; tar -zxvf docker-27.3.1.tgz 将二进制文件移动到可执行路径上的目录 接着&#xff0c;将解压出来的 Docker 二进制文件复制到系统的可执行路径&#xff08;通常是 /usr/bin/&#xff09…

Redis中常见的数据类型及其应用场景

五种常见数据类型 Redis中的数据类型指的是 value存储的数据类型&#xff0c;key都是以String类型存储的&#xff0c;value根据场景需要&#xff0c;可以以String、List等类型进行存储。 各数据类型介绍&#xff1a; Redis数据类型对应的底层数据结构 String 类型的应用场景 常…

redis中的set类型及常用命令

集合就是把一些有关联的数据放到一起。与list不同的是&#xff0c;集合中的顺序不重要&#xff0c;变换了元素的顺序&#xff0c;仍是同一个集合。集合中的元素是不能重复的。和list类似&#xff0c;集合中的每个元素&#xff0c;也都是string类型。 关于集合的相关命令 sadd/…

Python的顺序表

一、脑图 二、封装一个顺序表的类 1.构造函数 class SeqList:#显性定义出构造函数def __init__(self,capacity 10):#初始化顺序表 &#xff0c;设置初始容量和已有元素self.capacity capacity #线性表的最大容量self.size 0 #已存储的元素个数self.data [None]*capacity…

OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算

本文实现Python库d和OpenCV来实现眼部闭合检测&#xff0c;主要用于评估用户是否眨眼。 步骤一&#xff1a;导入必要的库和设置参数 首先&#xff0c;代码导入了必要的Python库&#xff0c;如dlib、OpenCV和scipy。通过argparse设置了输入视频和面部标记预测器的参数。 from…

windows下,用CMake编译qt项目,出现错误By not providing “FindQt5.cmake“...

开发环境&#xff1a;windows10 qt5.14&#xff0c; 编译器msvc2017x64&#xff0c;CMake3.30&#xff1b; 现象&#xff1a; CMakeList文件里&#xff0c;如有find_package(Qt5 COMPONENTS Widgets REQUIRED) target_link_libraries(dis_lib PRIVATE Qt5::Widgets) 用CMak…

基于SpringBoot+Vue的影院管理系统(含演示视频+运行截图+说明文档)

web启动链接地址&#xff1a; http://localhost:8082&#xff08;管理端&#xff09; http://localhost:8081&#xff08;用户端&#xff09; http://localhost:8082&#xff08;员工端&#xff09; 一、项目介绍 基于框架的系统&#xff0c;系统分为用户、员工和管理员三个…

SpringBoot3+Vue3开发图书馆管理系统

1 项目介绍 图书馆管理系统&#xff0c;管理图书、用户、借书、还书、实时监测归还是否逾期&#xff0c;逾期未归还会生成违规记录。违规状态不可借阅图书。需缴纳罚金&#xff0c;消除违规记录。可动态设置图书最多累计借阅数量上限和最长借阅天数上限&#xff0c;当用户满足…

Figure 02迎重大升级!!人形机器人独角兽[Figure AI]商业化加速

11月19日知名人形机器人独角兽公司【Figure AI】发布公司汽车巨头【宝马】最新合作进展&#xff0c;旗下人形机器人Figure 02在生产线上的性能得到了显著提升&#xff0c;机器人组成自主舰队&#xff0c;依托端到端技术&#xff0c;速度提高了400%&#xff0c;执行任务成功率提…

Oracle之Rman非归档模式下的完全恢复

引言 首先Oracle必须处在非归档模式下才能模拟各种情况,Oracle处在非归档模式,做数据库脱机备份,并且rman的参数使用快闪恢复区作为备份文件的存储目录,配置了控制文件的自动备份。 联机全备 示例1:控制文件、数据文件以及重做日志文件丢失的恢复 数据文件以及重做日志…

Android Google登录接入

官方文献&#xff1a; 1、前期准备&#xff1a; https://developers.google.cn/identity/sign-in/android/legacy-start-integrating?hlzh-cnhttps://developers.google.cn/identity/sign-in/android/legacy-start-integrating?hlzh-cn 2、具体开发&#xff1a; 新版 Googl…

Java 同步锁性能的最佳实践:从理论到实践的完整指南

目录 一、同步锁性能分析 &#xff08;一&#xff09;性能验证说明 1. 使用同步锁的代码示例 2. 不使用同步锁的代码示例 3. 结果与讨论 &#xff08;二&#xff09;案例初步优化分析说明 1. 使用AtomicInteger原子类尝试优化分析 2. 对AtomicInteger原子类进一步优化 …

Docker+Nginx | Docker(Nginx) + Docker(fastapi)反向代理

在DockerHub搜 nginx&#xff0c;第一个就是官方镜像库&#xff0c;这里使用1.27.2版本演示 1.下载镜像 docker pull nginx:1.27.2 2.测试运行 docker run --name nginx -p 9090:80 -d nginx:1.27.2 这里绑定了宿主机的9090端口&#xff0c;只要访问宿主机的9090端口&#…

C#编写的日志记录组件 - 开源研究系列文章

以前编写过一个日志记录组件的博文&#xff0c;这次发布一个修改过的完善版本。 1、 项目目录&#xff1b; 2、 源码介绍&#xff1b; 1) 实现&#xff1b; 2) 使用&#xff1b; 后面的参数为级别设置&#xff0c;只有大于这个级别的才进行日志记录&#xff0c;限制了日志记录的…

win10+vs2019+cmake+opencv4.10+opencv_contrib编译记录

win10vs2019cmakeopencv4.10opencv_contrib编译记录 第一章 环境配置 本机环境已经安装好vs2019和cmake。 第二章 下载opencv相关 1.Opencv4.10下载 下载链接&#xff1a;opencv 下载时选择"Sources" 2.opencv_contrib 下载链接&#xff1a;opencv_contrib 第三…