几个你需要关注的 Kubernetes 迁移 Cgroup V2 注意事项

Docker底层原理:Cgroup V2的使用 若系统没有加载cgroup2文件系统,需要执行下面这条命令。 阅读详情

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

892bc45104baec272d5392764cf6bcc7.png

随着Kubernetes 1.25关于cgroup v2 特性的正式发布(GA),  kubelet容器资源管理能力得到加强。本文针对K8s迁移cgroup v2做了如下的checklist,主要分为:cgroup v2是什么,对于K8s意味着什么以及如何迁移等相关内容。

d960ab1337286bcce11cb82af0afbb59.gif

“简介”

Pod资源管理

Kubernetes通过配置Pod中容器的request和limit来设置资源请求和限制(声明式),其中request字段描述了Pod应该拥有的资源量,而limit字段描述了Pod可以使用的最大限度,例如CPU资源中request对于的cpu.shares,limit对应的cpu.cfs_period_us 和cpu.cfs_quota_us,主要原理是Linux的CFS调度算法,cgroups 可以限制、记录、隔离进程组所使用的物理资源(包括:CPU、memory、IO 等),为容器实现虚拟化提供了基本保证,其是容器运行时管理工具的底层技术。

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    resources:
      requests:
        memory: 128Mi
        cpu: 250m
      limits:
        memory: 128Mi
        cpu: 500m

cgroup的接口以cgroupfs的虚拟文件系统方式进行公开,该文件系统通常挂载在/sys/fs/cgroup上,其主要提供资源限制、优先级分配、资源统计及进程控制等能力,其中关于资源统计,在K8s生态中,一般使用cAdvisor来收集与容器相关的监控指标,关于cgroup相关的内容可以参看kernel文档,后续会有两篇相关内容的具体介绍。

这里以一个Pod为例,其中一个容器配置了resources.limits.memory,通过kubectl get pod -o wide可以查看其是处于Pending还是已经调度至某一节点,接着SSH至调度节点,通过crictl ps查看其容器ID(crictl是K8s社区提供的CRI运行时的交互工具,关于CRI的相关内容可以参看Containerd深度剖析-CRI篇),最后输入crictl inspect查看其cgroup路径,示例中显示为/sys/fs/cgroup/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf9a04ecc_1875_491b_926c_d2f64757704e.slice/cri-containerd-47e320f795efcec1ecf2001c3a09c95e3701ed87de8256837b70b10e23818251.scope,通过slice后缀可以知道kubelet以systemd方式启动,示例结果如下所示:

$ # This is an example for cgroup v2.
$ # Kubernetes translates resources.limits into cgroup parameters.
$ # Accessed from within a container
$ cd /sys/fs/cgroup
$ cat memory.max
134217728  # 128Mi


$ # cgroup.procs shows what processes it contains.
$ cat cgroup.procs
1   # container's main process
34  # sh
41  # cat


$ # It also delivers some measurements.
$ cat cpu.stat
usage_usec 106492566
user_usec 66687448
system_usec 39805118
nr_periods 0
nr_throttled 0
throttled_usec 0

在探讨cgroup v2的优点之前,可以简要分析一下cgroup v1和v2有何不同。如下所示,v1对不同的资源类型使用不同的层次结构,关于v1中子系统跟层级相关概念,暂不做详细介绍。

5a00709964da7499b45826672c7ccf34.png

图中的每个框表示一个目录,由于CPU和内存的树是分开的,如果希望应用这两种资源类型的控制策略,就需要将一个进程同时放入这两个树中。例如,将相同的进程放入B组和E组,允许B组最多使用两核CPU,E组最多使用128MiB的内存。

但是v1的多层级在使用时会产生一些问题,cgroup v2使用统一的层次结构来避免上述问题。

cgroup v2

cgroup v2 是 Linux cgroup API 的最新版本, 自 2016 年以来,cgroup v2 一直在 Linux 内核中进行开发, 近年来随着容器生态的逐步推广,cgroup v2也随之逐渐成熟。在 Kubernetes 1.25 中, 对于 cgroup v2 的支持也变得水到渠成。

默认情况下,许多Linux 发行版已经默认支持 cgroup v2, cgroup v2 较 cgroup v1 有了多项增强,例如:

  • API 中单个统一的层次结构设计

  • 为容器提供更安全的子树委派能力

  • 全局inotify支持、容器级别OOM等

  • 增强的资源分配管理和跨多个资源的隔离

    • 统一管理不同类型的内存分配(网络和内核内存等)

    • 考虑非即时资源变更,例如页面缓存回写

Kubernetes可以依托cgroup v2可以实现一系列亮眼的特性,例如:

  • 容器级别的OOM

  • 支持rootless

  • 利用eBPF

cgroup v2可以支持容器级别的(但还没有实现)OOM而非某个进程。一个容器或Pod可以运行多个进程,以前OOM killer不考虑它们的整体性,只杀死其中的一些进程,这种方式可能导致Pod进入不一致的状态。cgroup v2接口允许我们判断特定cgroup中的进程是否相互依赖,从而确定是否应该同时关闭。

另一个使用场景是可以加强集群安全性。管理没有root权限的容器的技术称为rootless容器,其允许由受限用户运行Kubernetes节点组件(如kubelet),提高安全性,并允许非管理用户在共享机器上创建Kubernetes集群等。

最后,eBPF需要cgroup v2来启用它的所有功能,当前Cilium是一个依托eBPF技术实现cni插件的开源项目,它的一些功能需要使用cgroup v2,当启用cgroup v2时,可以替换kube-proxy。

dbbd729847026df9598245a7c33fa945.gif

“迁移”

如果决定采用cgroup v2,在此之前有三件事要做。

Linux OS

启用cgroup v2 具有以下要求:

  • 操作系统发行版启用 cgroup v2

  • Linux 内核为 5.8 或更高版本

可以通过修改内核 cmdline 引导参数在你的 Linux 发行版上手动启用 cgroup v2。如果你的发行版使用 GRUB,则应在 /etc/default/grub 下的 GRUB_CMDLINE_LINUX 中添加 systemd.unified_cgroup_hierarchy=1, 然后执行 sudo update-grub。但还是推荐使用已默认启用 cgroup v2 的Linux发行版。

要检查发行版使用的是哪个 cgroup 版本,需要执行以下命令:

stat -fc %T /sys/fs/cgroup/

对于 cgroup v2,输出为 cgroup2fs;对于 cgroup v1,输出为 tmpfs。

需要注意的是,cgroup v2还不支持实时进程,如果需要在系统上部署一些实时进程,应该将其放在root cgroup中。

这里介绍一个案例,在每个工作节点上运行bird和chrony,其作为实时进程,正常工作需要很小的延迟,我们将Docker服务以systemd方式启动,然后修改ExecStartPost指令将它们移动到根cgroup。

以下为示例配置,等待Docker启动容器,然后获取进程ID,并将其写入cgroup,最后使用chrt命令使bird成为一个实时进程。

ExecStart=/usr/bin/docker run --name bird ...
ExecStartPost=/bin/sh -c 'while ! docker container inspect bird >/dev/null; do sleep 1; done'
ExecStartPost=/bin/sh -c 'echo $(docker inspect bird | jq ".[0].State.Pid") > /sys/fs/cgroup/cgroup.procs'
ExecStartPost=/bin/sh -c 'chrt --pid --rr 50 $(docker inspect bird | jq ".[0].State.Pid")'

K8s生态

在cgroup v2下,层次结构中的每个cgroup都由一个进程进行管理,在大多数情况下,systemd管理根cgroup并创建整个系统使用的层级。

配置kubelet使用systemd的cgroup管理Pod:

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

其中如果选用Containerd作为容器引擎,那么cgroup配置如下:

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

Kubernetes官方文档提供了其他容器运行时关于cgroup的配置。

迁移之后,需要检查cgroup2文件系统是否正常启用,当然也可以通过运行测试Pod,通过设置资源限制,查看其值是否转换为相应的cgroup参数即可。

$ mount | grep cgroup
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,seclabel)
none on /run/cilium/cgroupv2 type cgroup2 (rw,relatime,seclabel)

启用cgroup v2之后,如果前期使用cadvisor采集监控指标,那么需要使用合适的cAdvisor版本,因为cgroup接口从v1到v2,发生了重大变化。当前cAdvisor v0.43支持cgroup v2,但存在一个BUG,已经在v0.44中修复。

我们有以下选项来使用适当的cAdvisor版本:

1. 更新Kubernetes到v1.23,因为该版本的kubelet嵌入了cAdvisor v0.43。

2. 将最新的cAdvisor以DaemonSet方式部署,因为kubelet计划移除cAdvisor。


应用变更

Go

当想要限制容器的CPU(配额)时,可以配置Pod中容器的resources.limits.cpu字段,其意味着cgroup为容器中的进程在固定的时间周期内消耗一定量的CPU时间。时间周期通常为100ms(可配)。

如果容器中的一个进程运行16个线程(它应该决定这样做,因为主机有16个内核),它将在12.5ms内耗尽配额,那么容器中的进程在剩余的87.5ms内无法执行任何工作,并且可能会拒绝 readiness请求,因此需要告诉进程应该使用两个线程。

209e50a0cd3666710f4ad902defe9903.png

设置线程数的方法因程序的实现语言而定,对于Go程序,可以通过环境变量GOMAXPROCS设置为合适的数值,当然sautomaxprocs是一个比较实用的工具,其可从cgroup接口读取CPU配额并自动设置环境变量。如果正在使用v1.4.0之前的版本,则需要更新mod以支持cgroup v2功能。

Java

我们需要使用JDK 15或更高版本才能在启用了cgroup v2的系统中正常运行Java应用程序。JDK从版本8u131开始就支持容器环境,在JDK 10版本中引入了+UseContainerSupport选项,并默认启用了该选项。当使用该选项时,JDK检查cgroup文件系统以读取CPU和内存配额供应用使用,CPU配额信息可以通过Runtime.availableProcessors()获得。内存配额影响其堆内存使用。这种机制应该针对cgroup v2进行调整,JDK 15提供了相关的修复。

由于笔者时间、视野、认知有限,本文难免出现错误、疏漏等问题,期待各位读者朋友、业界专家指正交流。

参考文献

    1. https://kubernetes.io/zh-cn/docs/concepts/architecture/cgroups

2. https://blog.kintone.io/entry/2022/03/08/170206#Two-things-to-prepare-for-workloads

3. https://www.infoq.cn/article/docker-kernel-knowledge-cgroups-resource-isolation

本文转载自:「DCOS」,原文:https://url.hi-linux.com/WOoUp,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

76f9ab748dfb0d47dc9f5065e062f504.gif

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

2fee1dd87bdb88c85a9a52ebdf7d50ce.png

你可能还喜欢

点击下方图片即可阅读

159d401bde89e05a2c0b7169dcaab53d.png

探秘 Docker 容器化技术黑科技 Cgroups

0b566ba41fc5a9c78e4a538d5f68fa3a.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

a1d499ab52c3e49dbdf877dd4eafdb97.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

【容器底层技术】cgroup v2使用与测试 如果输出只有cgroup,说明内核还未挂载cgroup v2或者内核不支持cgroup v2出现了cgroup v2说明内核是支持的,可以继续接下来的操作对于使用 systemd 引导的系统,可以在引导文件的中添加如下一行,启用 v2 版本可以使用防止cgroup v1抢占所有controller,体验纯cgroup v2环境最后再进行重启,就可以使用cgroup v2了。 阅读详情

相关推荐

docker启用cgroup v2

启动Docker服务。如果你已经按照上面的步骤进行了配置,Docker会自动检测并使用cgroup v2。确认Docker是否在cgroup v2中运行。如果你这里是2那么说明启用了,如果是1,那么就未启用。确认cgroup v2已经启用。系统已经启用Cgroups v2,可以通过。Docker版本在20.10及以上。Linux内核版本在4.15以上。重启系统以应用内核启动参数。

qq_56313338的博客 2598

10.2 cgroup-v2原理介绍

cgroup v1的问题v1 多个 hierarchy 并没有太大的用处,因为控制器(controller)只能属于一个 hierarchyCgroups v2 的五点改进Cgroups v2 中所有的 controller 都会被挂载到一个 unified hierarchy 下,不在存在像 v1 中允许不同的 controller 挂载到不同的 hierarchy 的情况Proess 只能绑定到 cgroup 的根(“/“)目录和 cgroup 目录树中的叶子节点。

福大大架构师每日一题 1871

Linux CGROUP v2 CPU资源管理:从内核原理到服务实战

在服务器运维和后台服务开发中,进程资源争抢是常见的性能瓶颈。Linux内核提供的CGROUP(控制组)机制,是实现精细化资源管控的核心技术。其原理是通过统一的层级结构,将进程分组并施加资源限制,由内核调度器(如CFS)负责执行。这项技术的价值在于,它能将资源分配从“能用”提升到“好用”的层面,实现服务间的隔离与公平共享,是保障系统稳定性和多租户环境公平性的基石。其应用场景广泛,从确保高优先级的Web服务(如Nginx)响应延迟不受后台计算任务影响,到构建复杂的微服务集群资源管控体系,都离不开它。本文将以CG

weixin_34413103的博客 308

k8s--架构基础--cgroup v2

cgroup v2是Linux cgroup API的下一个版本。cgroup v2提供了一个统一的控制系统,具有增强的资源管理能力。单一统一的层次结构设计更安全的子树委派给容器支持新特性,如Pressure Stall Information(压力停顿信息)提供跨多个资源的增强资源分配管理和隔离对不同类型的内存分配(网络内存、内核内存等)进行统一的记账记账非即时资源变化,例如页面缓存写回某些Kubernetes特性专门使用cgroup v2来增强资源管理和隔离。

IT艺术家-rookie的博客 3041

深入解析Linux Kernel中的cgroup2架构与核心特性

本文深入解析Linux Kernel中的cgroup2架构与核心特性,详细介绍了其单一层级树状结构设计、线程粒度控制实战、资源分配模型对比及容器化场景最佳实践。通过实际案例和性能调优分析,展示了cgroup2在资源管理上的显著改进,适用于物联网、AI推理等高需求场景。

weixin_29224309的博客 39

Python介绍与安装

Python介绍与安装

acegi13579的专栏 3210

Kubernetes v1.35 Timbernetes(世界树) 来了!垂直扩容、KYAML 优化、废弃 cgroup v1 和 ipvs,更稳定、更安全、更易运维

为核心,通过无中断资源调整、原生工作负载身份、动态硬件分配等特性,为大规模云原生部署提供了更精细的调度能力与更强的安全基线。同时,废弃旧版组件(如 cgroup v1、ipvs)的强制升级,虽需用户提前规划迁移路径,但长远看将显著降低运维复杂度。桌面环境全面升级,向更稳定、更易用、更现代化的桌面操作系统进化。Nginx Proxy Manager 2.13 正式发布,界面焕新、架构重构、性能更强,更安全、更易用。全新内核、细节打磨、组件优化、界面更美观、操作更流畅。减少日志解析成本,提升故障排查效率。

民工哥的博客 1109

Windows安装WSL子系统及docker,以及WSL和docker配置、使用及问题解决

在Windows操作系统中,Ubuntu子系统(也称为Windows Subsystem for Linux, WSL)为开发者提供了一个在Windows环境下运行Linux环境的平台。然而,有时用户在按照Ubuntu子系统或者使用WSL时,可能会遇到各种问题,下面总结一下解决方式。想要在Windows上安装Docker(实际上是基于Hyper-V或者WSL2这两项虚拟化技术),需要开启虚拟化功能,所以不管是对于系统还是硬件都有一定的要求。

sym的博客 9761

K8S 生态周报| Kubernetes v1.25.0 正式发布,新特性一览

大家好,我是张晋涛。Kubernetes 正式发布了,包含了 40 项目增强更新。本次 LOGO 的主要表达的意思是 尊重协作和开放的精神 ,这种精神将我们凝聚到一起转变为能改变世界的力量。其实我每期的 「k8s生态周报」都有一个叫上游进展的部分,所以很多值得关注的内容在之前的文章中已经发过了。这篇中我会再额外介绍一些之前未涵盖的,和之前介绍过的值得关注的内容。core CSI Migration...

k8s 生态 635

LinuxMint 22.1(Ubuntu24.04)下通过Wine完美运行同花顺远航版的实战指南

本文详细介绍了在LinuxMint 22.1(Ubuntu24.04)系统下通过Wine完美运行同花顺远航版的实战指南。从基础环境准备到深度优化,包括Wine环境配置、同花顺远航版安装、字体显示调优、任务栏兼容性修复等关键步骤,帮助Linux用户高效使用同花顺远航版进行股票交易和行情分析。

weixin_30919429的博客 560

基于深度视觉实现机械臂对目标的识别与定位

Marker ID 和 Marker size 自选,在 launch 文件中做相应的修改(本教程演示使用 Marker ID:582,Marker size:30mm)根据相机和机械臂的安装方式不同,手眼标定分为眼在手上和眼在手外两种方式,双臂机器人的相机和机械臂基座的相对位置固定,所以应该采用眼在手外的手眼标定方式。后续的视觉引导机械臂抓取测试实验基于本实验实现,通过视觉引导右臂完成抓取目标物,所以默认已使用机械臂右臂和相机完成了手眼标定。文件,根据打印的marker 标签,需要配置。

realman_Rop的博客 3755

K8S 生态周报| K8s v1.25 将 GlusterFS 卷插件废弃

“「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息。欢迎订阅知乎专栏「k8s生态」[1]。”大家好,我是张晋涛。本周事情比较多,空闲时间基本都在关注上游的进展,没折腾其他的东西。Kubernetes v1.25 正常情况下会在本月发布正式版本。我来介绍一些本周关注到比较值得注意的内容:上游进展deprecate GlusterFS p...

k8s 生态 1128

看28377代码笔记

使用的是20MHz外部晶振,为取200MHz系统时钟,倍频设为20,分频设为2,这样sysclock = 20MHz * 20 / 2,正好200MHz。注意:SPISTE配置成普通的GPIO端口,是为了更好控制芯片,配置芯片的时序。FMULT_0:小数点位数,小数只能有0,0.25,0.5,0.75四个选择。XTAL_OSC:表示使用外部晶振。GPIO_MUX_CPU1:复用类型。GPIO_MUX_CPU1:复用类型。PLLCLK_BY_2:表示2分频。IMULT_20:表示倍频数。

小柚子的博客 801

Docker工业部署稳定性攻坚手册(K8s边缘节点调度失效大揭秘):从CPU热斑到cgroup v2内存泄漏的全栈归因

解决Docker工业部署调试中K8s边缘节点调度失效难题,覆盖CPU热斑识别、cgroup v2内存泄漏定位与修复。适用于智能制造、能源物联网等高稳定性场景,提供全栈归因方法与生产级调优实践,值得收藏。

AlgoInk的博客 377

数据库课程案例——电力公司收费管理系统分析与实践,完整带SQL语句

某电力公司收费管理信息系统实现客户信息、用电类型(类别号、类别名、电价)及业务员管理;实现客户用电信息管理(客户号、月份、用电类别号、用电度数);实现客户费用管理(客户号、月份、费用、收费标志),收费标志的默认值为“未收”;实现收费登记(客户、月份、应收费用、实收费用、业务员),并自动修改收费标志(用触发器实现);创建触发器,实现收费时自动更加应收费用和实收费用,计算本次结余,然后修改客户信息表中的结余金额;创建存储过程统计指定月份应收费用和实收费用;创建存储过程查询指定月份未交费的用户信息,以便崔费;创建

qq_44242804的博客 2757

巡检类机器人电池容量计算方法论(原理+算法+真实案例)

摘要:本文系统阐述了巡检机器人电池容量的计算方法,重点解析了;能量平衡;核心原理和三种主流算法。通过光伏电站履带式巡检机器人的真实案例,详细演示了从工况拆解、功耗采集到容量计算的完整流程。文章指出:室内轻载场景可采用静态平均功耗法,户外常规工况推荐动态负载积分法,而复杂环境需采用融合估算算法。特别强调需考虑温度修正(冬季容量衰减20%)、冗余系数(1.2-1.5)和放电深度(磷酸铁锂DoD取80%)等关键参数。

start_up_go的博客 238

Kubernetes v1.6 版本深度解析与升级指南:etcd3 存储迁移、RBAC Beta、调度“注解迁移到字段“全景解读

本文以 Kubernetes 官方仓库中的历史发布记录 [CHANGELOG/CHANGELOG-1.6.md](https://link.gitcode.com/i/c4b9acb7cd2a1af8a599dc4dd65c61f7) 为主体素材,系统梳理 v1.6.0 正式版及其后 13 个补丁版本(v1.6.1~v1.6.13)的技术全貌,重点覆盖 etcd3 存储层切换与 protobuf

gitblog_00617的博客 347

FineBI学习总结

交叉表:一组作为行标题显示在表的左部,另一组作为列标题显示在表的顶部。连接到数据,如果数据不满足数据分析的需求,先进行自助数据集处理。数据集分类:DB表、SQL、Excel、自助数据集。分组表:将报表中的数据按相同项合并为一组显示。1、数据准备2、制作仪表板3、分享仪表板。左合并:保留左边全部数据,合并右边。右合并:保留右边全部数据,合并左边。上下拼接:上下拼接到一张表数据。3、如何实现拼表:多表拼一张。分组–业务包–数据集–字段。字段分类:数值、文本和日期。目录–仪表板–数据准备。维度:文本和日期类型。

Rsun2018的博客 1559

Docker 容器运行时 cgroup 版本切换实战指南

本文详细介绍了Docker容器运行时cgroup版本切换的实战指南,重点解决新旧版本Kubernetes集群兼容性问题。通过修改GRUB引导参数、更新配置并重启系统,实现从cgroup v2到v1的安全切换,适用于Ubuntu等Linux发行版,帮助开发者在混合环境中高效管理容器资源。

weixin_30576827的博客 406

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Kubernetes v1.35 版本全解析:从升级前必读到补丁演进(CHANGELOG-1.35 深度指南)

> 本文以 Kubernetes 官方仓库的 [CHANGELOG/CHANGELOG-1.35.md](https://link.gitcode.com/i/95b42f5e963fe41ee54a73ee210af90d) 为主体,结合 [pkg/features/kube_features.go](https://link.gitcode.com/i/35dbcfa3fa0b9b7c5618

gitblog_00399的博客 523

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Kubernetes 学习总结(48)—— Kubernetes v1.35 重磅发布 :迈向更现代、更稳定的生产级基础设施能力

Kubernetes v1.35(代号Timbernetes)正式发布,聚焦基础能力优化而非新增功能。本次更新包含60项增强功能,重点包括:清理历史技术债务(如移除cgroupv1支持)、推动Pod资源原地更新等17项功能进入稳定版、提升集群可维护性。关键改进涉及StatefulSet滚动更新增强、节点能力声明机制及原生Pod证书功能。升级需注意cgroupv1移除等破坏性变更,建议提前评估环境并采用灰度升级策略。该版本通过系统性优化,为企业用户提供了更稳定可靠的Kubernetes基座。

科技D人生 1073

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

K8S 生态周报| Docker v20.10.7 发布,修复了死锁和容器启动失败的问题

“「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息。欢迎订阅知乎专栏「k8s生态」[1]。”大家好,我是张晋涛。抱歉拖更了,这次为大家带来了近一段时间...

k8s 生态 736

2026年K8s实战指南:集群搭建、监控GPU、高并发与若依迁移压测

Kubernetes(K8s)是当前云原生基础设施的默认标准,它解决了大规模容器集群中“如何调度、自愈与伸缩”这一核心问题。从Docker镜像打包到Pod、Deployment、Service的抽象模型,掌握这些基础概念才能理解K8s的设计原理。在生产环境中,集群搭建、监控告警、GPU资源调度、证书自动续签以及HPA弹性伸缩是高并发业务落地的关键技术点。以若依微服务迁移上云为例,结合JMeter压测实践,完整呈现从零搭建集群到业务验证的闭环路径,帮助读者建立系统化实战能力。

weixin_34116110的博客 376

Kubernetes 1.11 发布全解:v1.11.0 到 v1.11.10 的版本演进、升级注意事项与源码级细节

Kubernetes 1.11 是 1.x 版本线中一次承上启下的发布:Pod 优先级与抢占(Pod Priority and Preemption)在此版本转正为默认开启,CoreDNS 与 IPVS 负载均衡毕业到 GA,kubeadm 配置体系升级到 v1alpha2。本文基于官方仓库中的 [CHANGELOG-1.11.md](https://link.gitcode.com/i/960b

gitblog_00725的博客 698

Kubernetes 1.10 版本全景解析与升级迁移指南

本文以本仓库 [CHANGELOG/CHANGELOG-1.10.md](https://link.gitcode.com/i/f47f6d0532e034fc37243bc15266a9c4) 为核心骨架,系统梳理 Kubernetes 1.10 主版本(v1.10.0)的九大发布主题、升级前必读的破坏性变更、已知问题、弃用项与外部依赖版本,并回顾 v1.10.1 至 v1.10.13 的补丁版

gitblog_01022的博客 537

Kubernetes v1.28 发行说明深度解读:调度框架破坏性变更、Sidecar 容器与全系列安全修复

本篇技术指南以本仓库的 [CHANGELOG/CHANGELOG-1.28.md](https://link.gitcode.com/i/b2420d57597c645fc7d6894b965afc0d) 为蓝本,系统梳理 Kubernetes v1.28 主版本(v1.28.0)及后续 15 个补丁版本(v1.28.1~v1.28.15)的完整变更史。你将掌握升级前必须关注的调度框架破坏性变更与

gitblog_00925的博客 792
上一篇: ChatGPT for Google :将 ChatGPT 整合到搜索引擎,ChatGPT 和谷歌不必二选一
下一篇: 生产级可用的 Linux 内存性能调优指南
运维之美
博客等级 码龄21年 2800粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值