Kubernetes容器平台下的 GPU 集群算力管控

news2024/11/23 2:17:16

引言

随着最近一两年生成式大模型的迭代出新,尤其是以 ChartGPT 为代表的大语言模型,几乎一夜间让所有人都看到了人工智能改变世界的潜力。而作为持续发力 GPU 通用计算(CUDA)的 AI 专业显卡提供商,Nvidia 公司成为了当之无愧的技术赢家,从其屡创新高的市值中就可见一瞥。

Kubernetes(简称K8S)作为一种容器编排平台,具有许多独特的优势,尤其是其弹性伸缩的能力,可以实现底层资源的超高利用率。纵观当下的科技产业界,到处是大模型推理、微调训练的需求与 Nvidia 专业显卡一卡难求的矛盾局面。在这种矛盾背景下,将 NVIDIA 显卡与 K8S 容器平台结合起来,组成一个高效的 GPU 算力调度平台,无疑是解决这一难题的最佳技术方案。这种结合将充分发挥每块显卡的算力,并通过 Kubernetes 的弹性伸缩特性,实现对 GPU 算力的灵活调度和管理,为大规模 AI 模型的训练和推理提供了可靠的基础支持。

本文将重点介绍 Nvidia GPU 在 K8S 容器平台上的包括虚拟化、调度和安全性在内的算力管控相关技术。

名词解释

CUDA

CUDA(Compute Unified Device Architecture)是 NVIDIA 公司推出的并行计算平台和编程模型。它允许开发人员利用 NVIDIA GPU 的并行计算能力来加速应用程序的执行。CUDA 包含了一系列的编程接口和工具,使得开发者可以通过使用标准的 C/C++ 编程语言来编写 GPU 加速的程序。

RootFS

根文件系统(Root Filesystem),是 Linux 系统启动后所加载的文件系统,也是文件系统的最顶层。它包含了操作系统中的核心文件和目录结构,包括 /bin、/sbin、/etc、/lib、/dev、/proc、/sys 等

Volta、Pascal、Kepler 等

不同的 nvidia GPU 架构名称。完整定义如下:

图片

基于 K8S 的 GPU 虚拟化框架

GPU 虚拟化,除了 GPU 厂商能够在硬件和驱动层面对各种资源进行划分进而形成隔离的虚拟化方案之外,其他主流方案本质上都是对 CUDA 调用的劫持与管控,这里包括阿里的 cGPU、百度的 qGPU、火山引擎的 mGPU 和灵雀云的 vGPU 方案等。考虑到厂商对于硬件的把控和深入理解,即使出自厂商的 “软” 虚拟化方案,也可以通过硬件配合从而获得更好的效果。下文会重点介绍 Nvidia 公司的虚拟化方案以及基于 Nvidia 方案增强的灵雀云 vGPU 方案。

容器侧:CUDA 工具集

在 K8S 容器平台下,一个典型的 GPU 应用软件栈如下图所示。其中,最上层的是多个包含了业务应用在内的容器。每个容器都分别包含了业务应用、CUDA 工具集(CUDA Toolkit)和容器 RootFS;中间层是容器引擎(docker)和安装了 CUDA 驱动程序的宿主机操作系统;最底层是部署了多个 GPU 硬件显卡的服务器硬件。

图片

图示:基于 Nvidia 的 GPU 应用软件栈

主要组件

CUDA 工具集包含了 nvidia-container-runtime(shim)、nvidia-container-runtime-hook 和 nvidia-container library、CLI 工具。对比 CUDA 工具集嵌入前后架构图的差异,我们可以很清楚地看到 CUDA 工具集中的组件嵌入位置,甚至推断出其作用。

图片

图示:CUDA toolset 嵌入前的容器软件栈

图片

图示:CUDA toolkit 嵌入后的容器软件栈

  • nvidia-container-runtime(shim):

该组件曾经是 runc 的一个完整分支,其中注入了特定于 NVIDIA 的代码。自2019年以来,它已经成为安装在主机系统上的本机 runC 的一个轻量级包装器。nvidia-container-runtime 接受 runc spec作为输入,将 NVIDIA 容器运行时钩子(nvidia-container-runtime-hook)作为预启动钩子注入其中,然后调用本机 runc,并传递修改后的具有该钩子设置的 runc spec。对于 NVIDIA 容器运行时 v1.12.0 版本及更高版本,这个运行时(runtime)还对 OCI 运行时规范进行了额外修改,以注入特定的设备和挂载点,这些设备和挂载点不受 NVIDIA 容器 CLI 控制。

  • nvidia-container-runtime-hook:

该组件包含一个可执行文件,实现了 runC 预启动钩子所需的接口。此脚本由 runC 在容器创建后启动前调用,并且被授予对容器关联的 config.json(例如,该 config.json )的访问权限。然后,它会提取 config.json 中包含的信息,并使用这些信息调用 nvidia-container-cli CLI,并附带适当的一组标志。其中最重要的标志之一是应该注入到该容器中的特定 GPU 设备。

  • nvidia-container library 和 CLI:

这些组件提供了一个库和一个简单的 CLI 实用程序,用于自动配置 GNU/Linux 容器使用 NVIDIA GPU。该实现依赖于内核原语,并设计为与容器运行时无关。

K8S 侧:Device Plugin

在 Kubernetes(K8S)中,Device Plugin 是一种扩展机制,用于将节点上的设备资源(例如 GPU、FPGA、TPU 等)纳入到 Kubernetes 资源管理的范围内。Device Plugin 允许集群管理员将节点上的设备资源暴露给 Kubernetes API 服务器,使得集群中的 Pod 可以通过资源调度机制使用这些设备。

实现步骤

得益于可扩展性的架构设计,Volcano 支持用户自定义 plugin 和 action 以支持更多调度算法。更多关于 Volcano 的介绍,请查阅参考资料。

灵雀云一站式解决方案

在前文中,我们深入探讨了不同的GPU虚拟化技术以及调度框架和策略。然而,要在标准的Kubernetes容器平台上实施这些方案,并借助监控机制对GPU资源进行实时管理和运维,无疑是一项复杂又耗时的任务。那么,是否存在一种全面且高效的解决方案,答案是肯定的。灵雀云全新研发的AI 开发运维一体化平台中深度集成vGPU方案,以高效集成和灵活调度为核心优势,实现GPU资源的全面优化和快速响应。

AML

在生成式 AI 如火如荼、大行其道的今天,灵雀云始终致力于拥抱生成式 AI 的发展趋势,近期将发布面向大模型的 AI 开发运维一体化平台:AML。AML 为企业用户提供了丰富的开箱即用大模型选择、一站式的模型推理、优化与应用开发能力,助力企业轻松开启 AI 赋能之旅,释放无限业务潜力。

AML针对大模型的全生命周期做了深入优化,从模型选择、模型发布、AI 应用开发、模型线上运维监控到模型微调和优化,每个环节都集成了业界最前沿的研究成果和最佳实践,使企业节省大量的时间和成本,提高生产效率。

AML支持一键发布多种类型的模型,包括但不限于文本生成、图像生成和音视频生成等,使用户能够轻松训练和部署各种 AI 应用。全流程管理功能使 AML 成为一站式 AI 工作台,简化了工作流程管理,提高了用户的操作便捷性。

与传统的 SaaS 服务相比,AML 使用私有化的数据存储提供了更高级别的数据安全性,让企业可以放心地存储和管理其敏感数据,满足内部数据安全的合规性要求。

AML 允许企业根据自身的安全规范自定义模型发布过程,确保模型发布符合企业安全规范。

AML 基于标准开源产品,具有高度的社区兼容性。AML 不仅全面兼容 HuggingFace 的模型库和接口定义,还支持常见主流深度学习框架,如 PyTorch 和 TensorFlow。

AML 支持各种常见模型格式,使企业能够基于已有框架灵活选择模型进行开发。

通过支持 pGPU/vGPU 解决方案、RDMA 网卡和高性能存储等系列方案,AML 实现了卓越的计算性能,能够更好的支持大规模分布式训练和推理。

  • 初始化。在这个阶段,设备插件将执行特定于供应商的初始化和设置,以确保设备处于就绪状态。

  • 插件使用主机路径 /var/lib/kubelet/device-plugins/ 下的 UNIX 套接字启动一个 gRPC 服务,该服务实现以下接口:

    
    service DevicePlugin {
       // GetDevicePluginOptions 返回与设备管理器沟通的选项。
       rpc GetDevicePluginOptions(Empty) returns (DevicePluginOptions) {}
    
       // ListAndWatch 返回 Device 列表构成的数据流。
       // 当 Device 状态发生变化或者 Device 消失时,ListAndWatch
       // 会返回新的列表。
       rpc ListAndWatch(Empty) returns (stream ListAndWatchResponse) {}
    
       // Allocate 在容器创建期间调用,这样设备插件可以运行一些特定于设备的操作,
       // 并告诉 kubelet 如何令 Device 可在容器中访问的所需执行的具体步骤
       rpc Allocate(AllocateRequest) returns (AllocateResponse) {}
    
       // GetPreferredAllocation 从一组可用的设备中返回一些优选的设备用来分配,
       // 所返回的优选分配结果不一定会是设备管理器的最终分配方案。
       // 此接口的设计仅是为了让设备管理器能够在可能的情况下做出更有意义的决定。
       rpc GetPreferredAllocation(PreferredAllocationRequest) returns (PreferredAllocationResponse) {}
    
       // PreStartContainer 在设备插件注册阶段根据需要被调用,调用发生在容器启动之前。
       // 在将设备提供给容器使用之前,设备插件可以运行一些诸如重置设备之类的特定于
       // 具体设备的操作,
       rpc PreStartContainer(PreStartContainerRequest) returns (PreStartContainerResponse) {}
    }
    
    说明:
    
    插件并非必须为 GetPreferredAllocation() 或 PreStartContainer() 提供有用的实现逻辑, 调用 GetDevicePluginOptions() 时所返回的 DevicePluginOptions 消息中应该设置一些标志,表明这些调用(如果有)是否可用。kubelet 在直接调用这些函数之前,总会调用 GetDevicePluginOptions() 来查看哪些可选的函数可用。

  • 插件通过位于主机路径/var/lib/kubelet/device-plugins/kubelet.sock 下的 UNIX 套接字向 kubelet 注册自身。(说明:工作流程的顺序很重要。插件必须在向 kubelet 注册自己之前开始提供 gRPC 服务,才能保证注册成功。)

  • 成功注册自身后,设备插件将以提供服务的模式运行,在此期间,它将持续监控设备运行状况, 并在设备状态发生任何变化时向 kubelet 报告。它还负责响应 Allocate gRPC 请求。在 Allocate 期间,设备插件可能还会做一些特定于设备的准备;例如 GPU 清理或 QRNG 初始化。如果操作成功,则设备插件将返回 AllocateResponse,其中包含用于访问被分配的设备容器运行时的配置。kubelet 将此信息传递到容器运行时。

    AllocateResponse 包含零个或多个 ContainerAllocateResponse 对象。设备插件在这些对象中给出为了访问设备而必须对容器定义所进行的修改。这些修改包括:注解、设备节点、环境变量、挂载点、完全限定的 CDI 设备名称。

    小结

    至此,GPU 在容器中使用和虚拟化所需要的所有技术框架就都齐备了。Nvidia 公司利用这两个组件,结合不同的硬件特性,分别实现了 Time-slicing、MPS 和 MIG 等不同的 GPU 虚拟化技术。

    Nvidia 虚拟化方案

    在容器中,GPU 虚拟化就是将一个物理 GPU 切分为多个虚拟CPU以供不同容器应用使用。

    Time-slicing

    时间片调度机制,可以使用简单的超额订阅策略来调用GPU的时间片调度器,从而实现多个 CUDA 应用程序通过 GPU 时间的共享达到并发执行的效果。时间片调度得益于自 Pascal 架构开始支持的 GPU 计算抢占机制。计算抢占允许在指令级粒度上中断 GPU 上运行的任务。当时间片被激活时,GPU 通过以固定时间间隔(可配置)在进程上下文之间切换,以公平共享的方式在不同进程之间共享其计算资源。此方式是在 Kubernetes 集群中共享 GPU 的最简单解决方案。

    虽然是最简单的解决方案,这个方案也是有明显缺陷的。CUDA 应用程序频繁的上下文切换会带来额外的时间开销,进一步转化为性能抖动和更高的计算延迟。同时,时间片调度不会在共享 GPU 的进程之间提供任何级别的内存隔离,也不会提供任何内存分配限制,这可能导致频繁的内存不足 (OOM) 错误;同时,由于没有内存隔离,任何一个进程的内存不足,都会导致所有在同一个设备上执行的 CUDA 程序退出。

    MPS

    多进程服务(Multi-Process Service)是CUDA应用程序编程接口(API)的替代二进制兼容实现。从Kepler的GP10架构开始,NVIDIA就引入了MPS(基于软件的多进程服务,当时称为Hyper-Q技术),它允许多个流(stream)或者 CPU 的进程同时向 GPU 发射 CUDA Kernel 函数调用,并结合为一个单一应用程序上下文在 GPU 上运行,从而实现更好的GPU利用率。在单个进程的任务处理,对GPU利用率不高的情况下是非常有用的。

    在 nvidia 不同架构的 GPU 卡中,MPS的实现是在持续改进的。例如,Volta 架构的 MPS 相比 Pascal MPS 有以下改进点,如下图所示:

  • Volta MPS client提交GPU任务不需要经过MPS服务器

  • 每个client有属于自己的显存地址

  • Volta提供了为QoS提供有限的执行资源

    图示:Volta 架构的 MPS 相比 Pascal MPS 的改进点

    优势

  • 增加GPU的利用率

  • 单个进程大部分情况下不能充分利用GPU上可用的资源(算力、内存和内存带宽)。MPS允许不同进程的内核和内存请求操作在GPU上堆叠执行,从而实现更高的利用率和更短的运行时间。

  • 减少GPU上下文存储空间

  • 如果没有 MPS,使用 GPU 的每个 CUDA 进程会在 GPU 上单独分配存储和调度资源。而 MPS server 只分配一份GPU存储和调度资源,并由所有客户端共享。Volta 架构的MPS在MPS client 之间的隔离有所加强,因此资源占用相比 pre-Volta MPS 会多一点。

  • 减少GPU上下文切换

  • 如果没有 MPS,当进程共享GPU时,这些进程的调度资源必须在 GPU 上交换。MPS服务器在所有客户端之间共享一组调度资源,消除了 GPU 在这些客户端之间调度时交换的开销。

    同时,MPS实际上也是有一些使用限制的,比方它现在仅支持 Linux 操作系统,还要求 GPU 的运算能力必须大于3.5。

    MIG

    多实例GPU (Multi-Instance GPU) 功能 (从NVIDIA Ampere架构开始) 允许把 GPU 安全地划分为多达七个独立的 GPU 实例,为多用户提供独立的 GPU 资源以最大化提高GPU的利用率。

    使用MIG技术,每个实例在系统中都具有独立且隔离的各项 GPU 资源(显存、缓存与计算核心)。由于每个实例具有可控的计算资源,因此单个用户的工作负载便能够在可预测的性能下运行且不受其他用户工作负载情况的影响。MIG对系统可用的 GPU 计算资源 (包括流多处理器、SMs、 GPU引擎等) 进行分区,可以为不同的客户端 (如虚拟机、容器或进程) 提供具有故障隔离的质量保证。MIG 使多个 GPU 实例能够在单个物理 Ampere 架构上并行。

    使用 MIG,用户能够在新的虚拟 GPU 实例上查看和调度作业,就如同使用物理 GPU 一样。MIG 与 Linux 操作系统配合使用,支持使用 Docker 引擎的容器,并支持使用 Red Hat Virtualization 和 VMware vSphere 等管理程序的 Kubernetes 和虚拟机。MIG分配遵循一定的规则,如下图所示(以A100 40GB显存GPU为例):

    A100 的 SM 单元 (streaming multiprocessor) 数量 (类似CPU的核心数) 为108,每个 GPU 运算实例的最小粒度是 14 个 SM 单元,也就是说在分配 GPU 的 SM 单元数量时必须是 14 的整数倍。比如:申请规模为 28 SM 单元数、10GB 显存的运算实例,设在单张 A100 上这样的实例个数最多为 X 个,那么必须满足28 * X <= 108 (SM单元总数限制) 且 10 *X <= 40 (GPU显存限制),所以 X 最大为3。

    MIG 共享 GPU 需要手动预先配置,这种方式缺乏灵活性、支持的实例少且只有较新的芯片架构上支持。

    优势

  • 扩展 GPU 的应用范围

  • 借助 MIG 技术,您可以在单个 GPU 上获得多达原来 7 倍的 GPU 资源。MIG 为研发人员提供了更多的资源和更大的灵活性。

  • 优化 GPU 利用率

  • MIG 允许您灵活选择许多不同的实例大小,从而为每项工作负载提供适当规模的 GPU 实例,最终优化利用率并使数据中心投资充分发挥成效。

  • 同时运行工作负载

  • 凭借 MIG,能以确定性延迟和吞吐量,在单个 GPU 上同时运行推理、训练和高性能计算 (HPC) 工作负载。与时间分片不同,各工作负载并行运行,能够实现高性能。

  • 方案对比

    特性MPSMIGTime-Slicing
    类型(Partition Type)LogicalPhysicalTemporal (Single process)
    最大分区数量(Max Partitions)487Unlimited
    SM 性能隔离(SM Performance Isolation)Yes (by percentage, not partitioning)YesYes
    内存保护(Memory Protection)YesYesNo
    内存带宽质量保证(Memory Bandwidth QoS)NoYesNo
    错误隔离(Error Isolation)YesYesNo
    跨区互操作(Cross-Partition Interop)IPCLimited IPCLimited IPC
    更新配置(Reconfigure)仅在 mps server 进程启动/重启时当显卡空闲时N/A

    GPU 调度和增强

    通过在前面章节介绍的组件和机制,GPU 的各种计算资源已经实现了资源上报、量化、分配、隔离和使用监控等;所以基于原生的 K8S Scheduler,也可以实现基础的 GPU 容器应用的调度(默认调度策略)。如果用户不满足于默认的调度策略,还可以通过扩展、新增调度策略来实现诸如优先调度到同一张显卡实现更高的利用率和更低的碎片化、同一个业务的不同 pod 分布到不同显卡实现更好的鲁棒性等。如果用户不满足于默认的调度策略,又没有时间去执行扩展调度器,那么也可以直接使用后面介绍的 Volcano 调度器。

    K8S scheduler framework

    调度框架是面向 Kubernetes 调度器的一种插件架构, 它由一组直接编译到调度程序中的“插件” API 组成。这些 API 允许大多数调度功能以插件的形式实现,同时使调度“核心”保持简单且可维护。调度框架定义了一些扩展点。调度器插件注册后在一个或多个扩展点处被调用。这些插件中的一些可以改变调度决策,而另一些仅用于提供信息。一个典型的 Pod 调度流程如下图所示。更多关于 K8S scheduler framework 的介绍,请查阅参考材料。

    图片

    图示:Pod 调度流程

    Volcano 调度器

    Volcano是 CNCF 下首个也是唯一的基于Kubernetes的容器批量计算平台,主要用于高性能计算场景。它提供了Kubernetes目前缺 少的一套机制,这些机制通常是机器学习大数据应用、科学计算、特效渲染等多种高性能工作负载所需的。作为一个通用批处理平台,Volcano 与几乎所有的主流计算框 架无缝对接,如 Spark 、TensorFlow 、PyTorch 、 Flink 、Argo 、MindSpore 、 PaddlePaddle 等。它还提供了包括基于各种主流架构的 CPU、GPU 在内的异构设备混合调度能力。Volcano 的设计 理念建立在15年来多种系统和平台大规模运行各种高性能工作负载的使用经验之上,并结合来自开源社区的最佳思想和实践。

    Volcano支持各种调度策略,包括:

  • Gang-scheduling

    Gang调度策略是 volcano-scheduler 的核心调度算法之一,它满足了调度过程中的 “All or nothing” 的调度需求,避免 Pod 的任意调度导致集群资源的浪费。

  • Fair-share scheduling

  • Queue scheduling

  • Preemption scheduling

  • Topology-based scheduling

  • Reclaims

  • Backfill

  • Resource Reservation

  • 大模型时代的生产力工具

  • 出色的易用性

  • 企业级安全性

  • 广泛的兼容扩展性

  • 卓越的性能表现

图片

图示:AML 的概览页

AML 的 vGPU 方案

AML 中支持的 GPU 能力是成熟且完备的,不仅全面支持 Nvidia 官方的 GPU 虚拟化方案,还强化了产品层面的易用性,提升了稳定性。

AML 的 vGPU 方案主要特性包括:

  • 支持包括 Nvidia、昇腾、天数在内的所有市面上主流品牌

  • 支持 GPU 物理卡(pGPU)和虚拟卡(vGPU)

  • 支持市面上主流 CUDA 版本(v11.4 到 v12.2)

  • 开箱即用的GPU 能力

  • 全面支持计算隔离、显存隔离和故障隔离,用户可以放心使用虚拟化 GPU,无惧扰动

  • 提供针对 GPU 资源的多种增强调度能力,完美支持微调训练等高性能运算场景

用户典型 GPU 使用场景,如图所示:

  • 创建/初始化集群:用户在部署集群时,可以标定 GPU 节点并部署对应的驱动包,也可以在集群使用过程中更新、新增 GPU 节点。GPU 资源使用情况会以图表形式直观的展示给用户。

    图片

  • 绑定和使用:用户只需在容器应用中声明特定的 GPU 资源,调度器即可自动完成绑定和调度工作。声明示例如下:

    
    apiVersion: v1
    kind: Pod
    metadata:
      name: mps-gpu-pod
    spec:
      restartPolicy: Never
      hostIPC: true
      securityContext:
        runAsUser: 1000
      containers:
        - name: cuda-container
          image: <test-image>
          resources:
            limits:
              nvidia.com/mps-core: 50
              nvidia.com/mps-memory: 8

  • 监控面板:监控面板将提供详细的GPU监控图表,使用户对GPU的使用情况一目了然,实现直观可视化的管理。

  • 图片

    图示:vGPU 资源使用监控面板

    更多关于 AML 产品的信息,敬请期待后续内容

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人大金仓数据库介绍与使用指南

人大金仓数据库是一款强大的关系型数据库管理系统&#xff0c;具有简单易用、高性能和稳定可靠的特点。本文将介绍人大金仓数据库的安装方法、常用的SQL语法以及相关工具的使用。 一、安装方法&#xff1a; 1、下载人大金仓数据库安装程序&#xff1b; 2、运行安装程序&#…

事件穿透效果

讲述一下事件穿透的需求&#xff0c;大家可以根据实际情况来考虑是否采用这种方式来制作页面&#xff0c;&#xff08;项目中遇到了底部是地图&#xff0c;两侧面板&#xff0c;但是UI在设计的时候为了好看&#xff0c;会有很大的遮罩阴影部分&#xff0c;如果按照时间制作会导…

pip永久修改镜像地址

修改命令&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/ 效果&#xff1a; 会在C:\Users\PC(用户名)\AppData\Roaming\pip目录下新增或修改文件pip.ini 文件内容&#xff1a; [global] index-url https://pypi.tuna.tsinghua.e…

关于柔性阵列(/三维阵列)波束形成的仿真实践以及稳健波束形成的思考(1)

说明 关于波束形成&#xff0c;我之前写过几篇相关的博文&#xff0c;如参考资料[1]、[2]、[3]。除去在博文[2]中有讨论过阵元相对位置关系对波束形成的影响&#xff1a;“如何基于遗传算法优化阵元相对位置关系以压低旁瓣峰值”以外&#xff0c;似乎我认知里的天线阵列&#x…

PS从入门到精通视频各类教程整理全集,包含素材、作业等

PS从入门到精通视频各类教程整理全集&#xff0c;包含素材、作业等 最新PS以及插件合集&#xff0c;可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制&#xff0c;今天先分享到这里&#xff0c;后续持续更新 【Photoshop 教程】史上最容易听懂的PS...在最后四…

k8s入门到实战(十四)—— Helm详细介绍及使用

Helm 使用 Helm 是一个 k8s 应用的包管理工具&#xff0c;类似于 Ubuntu 的 APT 和 CentOS 中的 YUM。 Helm 使用 chart 来封装 k8s 应用的 yaml 文件&#xff0c;我们只需要设置自己的参数&#xff0c;就可以实现自动化的快速部署应用。 Helm 通过打包的方式&#xff0c;支…

谭浩强第五版C语言课后习题(编程题)+答案

谭浩强第五版作为初学C语言必读的一本教材&#xff0c;课后习题具有非常大的参考价值&#xff0c;也是很多高校期末考试或者考研的重要参考。在这里我整理了一部分个人认为比较重要的编程题&#xff0c;供大家作参考 1.输入两个数&#xff0c;求他们的最大公约数和最小公倍数&…

Cesium.js综合实验

Cesium.js综合实验 1 概述 Cesium是一个跨平台、跨浏览器的展示三维地球和地图的开源 JavaScript 库&#xff0c;是AGI公司计算机图形开发小组与2011年研发的三维地球和地图可视化开源JavaScript库&#xff0c;Cesium一词来源于化学元素铯&#xff0c;铯是制造原子钟的关键元…

VUE+ elementUI 表头动态渲染的两种方法

效果&#xff1a; <template><div><el-alert title"比较麻烦的写法" type"error"></el-alert><el-table border style"width:300px;" :data"tabelData"><el-table-columnv-for"column in colum…

如何在群晖NAS搭建bitwarden密码管理软件并实现无公网IP远程访问

前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊如何在群晖NAS搭建bitwarden密码管理软件并实现无公网IP远程访问&#xff0c;希望大家能觉得实用&#xff01; 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&am…

访问学者如何申请国外信用卡?

作为一名访问学者&#xff0c;如果你计划在国外长期居住或短期停留&#xff0c;并希望申请国外信用卡&#xff0c;这可能是一个相当实用的工具。国外信用卡不仅可以帮助你在海外购物和旅行时更加便利&#xff0c;还能建立起你在国际金融体系中的信用记录&#xff0c;为未来的金…

鼠标不动了怎么办?鼠标不能移动解决方法

鼠标不能移动有可能是鼠标坏了&#xff0c;或者是电脑的软件和硬件有冲突等原因造成。最近有小伙伴就咨询了有关鼠标的问题&#xff0c;昨天鼠标还能使用&#xff0c;不知道为什么今天就突然不能用了。那么我们在排除鼠标坏掉了的情况下&#xff0c;试试对鼠标进行修复吧。下面…

请你记住这3款国产软件,免费又实用,它们值得收藏

闲话不多说&#xff0c;直上干货。 1、坚果云 坚果云是一款极具良心的网盘软件&#xff0c;其免费版本同样无广告干扰&#xff0c;界面设计简约大气&#xff0c;在文件上传与下载速度上&#xff0c;坚果云完全不限速&#xff0c;这一点远超其他同类产品。 用户可以在手机、电…

粗略总结AI大模型学习需要了解的要点

目录 一、概念简介 二、兴起原因 三、相关要点 四、不足之处 五、总结 一、概念简介 AI大模型学习是指利用大规模数据集和强大计算能力进行深度学习模型的训练。随着数据的爆炸式增长和计算资源的提升&#xff0c;AI大模型学习成为了现代人工智能研究的重要方向。 二、兴起…

徽宇阀门现已加入2024第13届生物发酵展会

参展企业介绍 温州徽宇阀门有限公司是专业生产高精度不锈钢过滤器设备及卫生级阀门、管道、管件及泵等系列产品。秉承严谨、实用的作风,所有产品均选用高品质的原材料。公司对产品品质的要求没有止境,生产全部采用CNC等国际一流的数控加工中心设备&#xff0c;所有产品均按照IS…

Linux系统使用Docker部署Portainer结合内网穿透实现远程管理容器和镜像

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

VR全景赋能智慧农业,打造沉浸式种植体验平台

随着人口的增长&#xff0c;传统农业也正在面临着不一样的挑战&#xff0c;加上很多人对农业的固有印象&#xff0c;很少有年轻人愿意下到农田里&#xff0c;那么该如何提高产量、降低成本以及引导年轻人深刻感受现代农业成为了急需解决的问题。 随着城市化脚步的推进&#xff…

代码随想录笔记|C++数据结构与算法学习笔记-栈和队列(〇)|stack、queue、单调队列和优先队列(priority_queue)、大顶堆和小顶堆

文章目录 stack容器stack 基本概念常用接口构造函数赋值操作数据存取大小操作 queue容器queue常用接口构造函数&#xff1a;赋值操作数据存取大小操作 单调队列优先队列大顶堆小顶堆 stack容器 stack 基本概念 栈中只有顶端的元素才可以被外界使用&#xff0c;因此栈不允许有遍…

ubuntu22.04安装dnsmasq最详细易懂

安装 准确的来说&#xff0c;不是安装&#xff0c;因为默认ubuntu22版本自带的有dnsmasq&#xff0c;所以我们不用下载了&#xff0c;直接使用即可&#xff0c;否则就会产生冲突&#xff0c;这块吃了大亏。 最好在root账户下操作&#xff0c;没有设置root密码的&#xff0c;可…

AWS SES发送邮件时常见的错误及解决方法?

AWS SES发送邮件如何做配置&#xff1f;使用AWS SES发信的限制&#xff1f; 在使用AWS SES发送邮件时&#xff0c;可能会遇到一些常见的错误。AokSend将介绍一些常见的AWS SES发送邮件错误及其相应的解决方法&#xff0c;帮助用户更好地利用AWS SES进行邮件发送。 AWS SES发送…