为什么你的Dify在K8s上频繁OOMKilled?(深度解析资源配置陷阱)

第一章:Dify在K8s上频繁OOMKilled的背景与现象

在将Dify部署至Kubernetes(K8s)集群后,系统运行初期表现稳定,但随着用户请求量上升和长时间运行,Pod频繁出现“OOMKilled”状态。该现象表现为容器因内存使用超出其限制而被节点内核强制终止,严重影响服务可用性与用户体验。

问题背景

Dify作为一个AI应用开发平台,集成了大语言模型推理、工作流编排及前端交互功能,在高并发场景下对内存资源消耗较大。当部署在K8s环境中时,若未合理配置资源限制(resources.limits.memory),极易触发Linux的OOM Killer机制。

典型现象描述

通过以下命令可观察到Pod频繁重启:

kubectl get pods -n dify
# 输出示例:
# NAME                      READY   STATUS      RESTARTS   AGE
# dify-backend-7d6f8b4c5-abcx   1/1     OOMKilled   5          12m
进一步查看终止原因:

kubectl describe pod dify-backend-7d6f8b4c5-abcx -n dify | grep -A 10 "Last State"
# 输出包含:
# Last State:  Terminated
#   Reason:    OOMKilled
#   Exit Code: 137

资源配置现状对比

组件requests.memorylimits.memory实际峰值使用
dify-backend512Mi1Gi1.3Gi
dify-worker256Mi1Gi1.5Gi
  • Pod在处理批量任务或加载大型模型缓存时,内存瞬时增长迅速
  • K8s节点的cgroup内存控制机制检测到超限后立即终止容器
  • 监控数据显示,JVM堆内存或Python进程未有效限制,导致失控增长
graph TD A[用户请求增加] --> B[Dify后端处理负载] B --> C[加载模型/缓存数据] C --> D[内存使用上升] D --> E{超过memory limit?} E -->|是| F[OOMKilled] E -->|否| G[正常运行]

第二章:Kubernetes资源模型与Dify运行机制解析

2.1 Kubernetes中requests和limits的工作原理

在Kubernetes中,`requests`和`limits`用于管理容器的资源分配与使用上限。`requests`定义了容器启动时所需保障的最小资源量,调度器依据此值将Pod分配到合适的节点上。
核心概念解析
  • requests:容器期望获得的CPU和内存资源,影响调度决策
  • limits:容器可使用的资源最大值,防止资源滥用
资源配置示例
resources:
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"
上述配置表示容器启动时请求250毫核CPU和64Mi内存,最多可使用500毫核CPU和128Mi内存。当容器内存超过limits时会被终止;CPU超过limits则会被限流。 该机制确保集群资源合理分配,提升整体稳定性与利用率。

2.2 容器内存超限触发OOMKilled的底层机制

当容器使用的内存超过其cgroup限制时,Linux内核会触发OOM(Out of Memory)killer机制来终止占用大量内存的进程。
内存控制组与OOM判定
Kubernetes通过cgroup v1或v2为容器设置内存限制。一旦容器进程的实际内存使用(含缓存)超出memory.limit_in_bytes,内核OOM killer将被激活。
cat /sys/fs/cgroup/memory/mycontainer/memory.usage_in_bytes
cat /sys/fs/cgroup/memory/mycontainer/memory.limit_in_bytes
上述命令可查看容器当前内存使用量和硬限制。若前者持续高于后者,OOM风险极高。
OOM Killer执行流程
内核遍历cgroup中的任务,依据oom_score评分决定优先终止对象:
  • 评分基于内存占用比例、进程运行时长等因素计算
  • 得分最高的进程将被发送SIGKILL信号
  • 容器主进程被杀则表现为OOMKilled

2.3 Dify组件资源消耗特征分析(API Server、Worker等)

核心组件资源行为概览
Dify系统中,API Server与Worker承担主要负载。API Server处理高并发HTTP请求,CPU与内存占用随QPS线性增长;Worker执行LLM推理任务,显存与GPU利用率显著升高。
资源消耗对比表
组件CPU占用内存/显存典型场景
API Server中等1–2 GB请求路由、鉴权
Worker高4–16 GB(GPU显存)模型推理、异步任务
性能监控代码示例

// 监控Worker资源使用率
func MonitorWorker() {
    usage := GetGPUUsage() // 获取GPU利用率
    if usage > 0.8 {
        log.Warn("GPU usage exceeds 80%")
    }
}
该函数周期性采集GPU使用率,当超过阈值时触发告警,适用于动态扩缩容决策。参数usage反映当前设备负载强度,是弹性调度的关键指标。

2.4 QoS等级对Pod调度与驱逐策略的影响

Kubernetes根据Pod的资源请求与限制自动分配QoS等级,直接影响其在节点上的调度优先级和系统压力下的驱逐顺序。
QoS等级分类
  • Guaranteed:所有容器都设置了CPU和内存的request与limit,且值相等;
  • Burstable:至少一个容器设置了资源request,但未达到Guaranteed标准;
  • BestEffort:未设置任何资源request或limit,优先级最低。
驱逐优先级顺序
当节点资源紧张时,kubelet按以下顺序驱逐Pod:
  1. BestEffort
  2. Burstable
  3. Guaranteed
apiVersion: v1
kind: Pod
metadata:
  name: qos-demo
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      requests:
        memory: "200Mi"
        cpu: "500m"
      limits:
        memory: "200Mi"
        cpu: "500m"
该配置使Pod获得Guaranteed等级,享有最高稳定性保障,在资源争抢中最后被驱逐。

2.5 实际案例:从监控数据定位资源瓶颈点

在一次高并发服务性能下降事件中,通过 Prometheus 采集的监控数据显示 CPU 使用率持续超过 90%,但内存和磁盘 I/O 均处于正常范围。
关键指标分析
我们重点观察以下指标:
  • 每秒请求数(QPS)突增 3 倍
  • 平均响应时间从 50ms 上升至 800ms
  • Go 协程数从 1k 飙升至 10k
代码层排查

func handleRequest(w http.ResponseWriter, r *http.Request) {
    go processTask(r) // 错误:无限制地启动协程
}
上述代码在每次请求中启动一个新协程,未使用协程池或限流机制,导致协程爆炸,引发频繁的上下文切换和 CPU 资源耗尽。
优化方案
引入带缓冲队列的 worker 池模型,限制最大并发处理数,系统恢复稳定。

第三章:常见资源配置陷阱与规避策略

3.1 误区一:仅设置limits不设requests导致调度失衡

在 Kubernetes 资源管理中,若仅为容器配置 limits 而忽略 requests,将导致调度器无法准确评估节点资源需求,进而引发调度失衡。
资源配置缺失的影响
当未显式设置 requests 时,Kubernetes 默认使用 limits 值作为 requests,可能导致 Pod 被调度到实际资源不足的节点上。
  • 调度器依据 requests 决定 Pod 放置位置
  • 仅设 limits 会使节点资源预留给值过高,造成资源浪费
  • 突发负载下易触发驱逐机制,影响服务稳定性
正确配置示例
resources:
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"
上述配置明确划分了基础资源需求与上限,使调度器能精准分配 Pod,同时保障运行时资源可控。requests 应贴近应用常态使用量,limits 可略高以应对波动。

3.2 误区二:统一配置所有副本忽略负载差异

在微服务架构中,盲目为所有副本设置相同的资源配置(CPU、内存、副本数)会导致资源浪费或性能瓶颈。不同业务路径的负载特征差异显著,例如读多写少的服务副本若与计算密集型副本采用相同配置,将导致资源利用率失衡。
基于负载特征的差异化配置策略
应根据实际流量和资源消耗动态调整副本配置。可通过监控指标(如CPU使用率、请求延迟)对副本进行分类管理:
副本类型CPU请求内存请求适用场景
高并发读500m256Mi缓存查询服务
计算密集型2000m1Gi数据分析任务
代码示例:Kubernetes中差异化资源配置
apiVersion: apps/v1
kind: Deployment
metadata:
  name: high-concurrency-service
spec:
  replicas: 4
  template:
    spec:
      containers:
      - name: server
        resources:
          requests:
            cpu: "500m"
            memory: "256Mi"
上述配置为高并发读服务设置适配其负载的资源请求,避免资源过度分配。合理划分副本类型并精细化资源配置,可显著提升集群整体资源效率。

3.3 误区三:未考虑Python应用内存膨胀特性

Python在长时间运行的应用中容易出现内存膨胀,主要源于对象缓存、循环引用和垃圾回收机制的局限性。
常见内存问题场景
  • 频繁创建临时对象导致GC压力增大
  • 使用缓存未设置过期或容量限制
  • 全局变量持有大量数据引用
代码示例:不当缓存引发内存增长
cache = {}

def get_user_data(user_id):
    if user_id not in cache:
        cache[user_id] = fetch_from_db(user_id)  # 无清理机制
    return cache[user_id]
上述代码中,cache 持续增长且无淘汰策略,随着用户ID增多,内存占用线性上升,最终可能导致服务崩溃。
优化建议
使用有界缓存如 functools.lru_cache 控制内存使用:
@functools.lru_cache(maxsize=1000)
def get_user_data(user_id):
    return fetch_from_db(user_id)
该装饰器限制缓存最多保存1000个结果,自动淘汰最近最少使用项,有效防止内存无限膨胀。

第四章:Dify在生产环境中的优化实践

4.1 基于压测结果的合理资源边界设定

在系统性能优化中,压力测试是确定资源边界的基石。通过模拟真实场景下的并发负载,可精准识别CPU、内存与I/O的瓶颈点。
压测指标采集
关键指标包括响应延迟、吞吐量及错误率。例如,使用Prometheus采集容器资源使用率:

scrape_configs:
  - job_name: 'stress-test-metrics'
    static_configs:
      - targets: ['localhost:9090']
该配置定期抓取压测期间的服务监控数据,为后续分析提供依据。
资源边界制定策略
根据压测结果,采用“80/20法则”设定安全阈值:
  • CPU使用率不超过80%
  • 堆内存保留20%余量防止OOM
  • 连接池最大值设为压测最优值的1.5倍
场景并发用户数推荐CPU(核)推荐内存(GiB)
低负载10024
高负载50001632

4.2 使用Vertical Pod Autoscaler实现资源智能推荐

Vertical Pod Autoscaler(VPA)通过分析容器的历史和实时资源使用情况,自动调整Pod的CPU和内存请求值,从而优化资源分配并提升集群利用率。
核心组件与工作模式
VPA包含三个主要组件:Admission Controller、Updater和Recommendation Engine。其支持三种模式:Auto(自动更新资源)、Initial(仅初始化时设置)和Off(仅提供推荐不修改)。
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: example-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: nginx-deployment
  updatePolicy:
    updateMode: "Auto"
该配置为名为 nginx-deployment 的应用启用VPA,并设置为自动更新模式。VPA会持续监控其资源使用,动态推荐并应用最优资源配置。
推荐结果查看方式
可通过命令行查询VPA的推荐建议:
  1. kubectl describe vpa example-vpa 查看推荐详情;
  2. 输出中 RecommendedRequest 字段提供CPU与内存建议值。

4.3 结合Prometheus监控实现OOM预警与根因分析

在Kubernetes环境中,内存溢出(OOM)是导致应用崩溃的常见原因。通过集成Prometheus监控系统,可实现对容器内存使用率的实时采集与预警。
指标采集与告警规则配置
Prometheus通过cAdvisor采集容器内存数据,关键指标包括container_memory_usage_bytes和container_memory_max_usage_bytes。以下为OOM风险告警规则示例:

- alert: HighMemoryUsage
  expr: (container_memory_usage_bytes{container!="",pod!=""} / container_memory_max_usage_bytes) > 0.9
  for: 2m
  labels:
    severity: warning
  annotations:
    summary: "Pod {{ $labels.pod }} 内存使用超过90%"
该规则持续监测容器内存使用率,当连续2分钟超过阈值即触发告警,便于及时干预。
根因分析流程
告警触发后,结合Prometheus的查询能力与 Grafana 可视化,按以下路径定位问题:
  1. 查看对应Pod的内存增长趋势
  2. 关联分析GC频率与堆内存变化(需JVM应用暴露JMX指标)
  3. 比对日志中OOM异常时间点

4.4 多环境(开发/生产)资源配置分离方案

在微服务架构中,不同部署环境(如开发、测试、生产)需要独立的配置管理,以确保安全性与灵活性。
配置文件结构设计
采用按环境划分的配置目录结构:
  • config/
    • dev.yaml - 开发环境配置
    • prod.yaml - 生产环境配置
    • common.yaml - 公共配置
动态加载机制
通过环境变量指定当前环境,Go语言示例:
env := os.Getenv("APP_ENV")
configFile := fmt.Sprintf("config/%s.yaml", env)
该代码根据APP_ENV变量动态选择配置文件,实现无缝切换。
配置优先级策略
来源优先级说明
环境变量高用于覆盖敏感或动态参数
环境专属配置中如 prod.yaml 中的数据库地址
公共配置低通用日志级别、超时设置等

第五章:总结与长期稳定性建设建议

建立自动化监控体系
为保障系统长期稳定运行,应部署全面的监控方案。Prometheus 与 Grafana 组合是目前主流选择,可实时采集服务指标并可视化展示。

# prometheus.yml 示例配置
scrape_configs:
  - job_name: 'go_service'
    static_configs:
      - targets: ['localhost:8080']
    metrics_path: '/metrics'
实施渐进式发布策略
采用蓝绿部署或金丝雀发布,降低上线风险。例如在 Kubernetes 中通过 Istio 实现流量切分:
  • 将新版本服务部署至独立 Pod 组
  • 通过 VirtualService 控制 5% 流量导入新版本
  • 观察错误率、延迟等关键指标变化
  • 确认无异常后逐步提升流量比例
优化日志管理机制
集中式日志处理对故障排查至关重要。建议使用 ELK(Elasticsearch + Logstash + Kibana)栈统一收集日志。
组件作用部署方式
Filebeat日志采集代理DaemonSet 部署于每台节点
Logstash日志过滤与格式化Deployment + HPA 自动扩缩容
Elasticsearch存储与检索日志StatefulSet 集群模式部署
构建应急响应流程

定义标准事件响应流程:

  1. 告警触发 → 通知值班工程师
  2. 初步诊断 → 确认影响范围
  3. 启动预案 → 执行回滚或扩容
  4. 事后复盘 → 更新 SOP 文档

相关推荐

Kubernetes 触发 OOMKilled(内存杀手)如何排除故障

简单整一下 k8s 中 Pod 故障OOMKilled的原因以及诊断博文内容涉及:k8sOOMKilled分类: 宿主节点行为 / K8s Cgroups 行为什么是OOMKilledK8s 错误,OOMKiller 机制如何工作?OOMKilledK8s 错误和解决的常见原因理解不足小伙伴帮忙指正对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。

山河已无恙 2220

k8s pod OOMKilled 错误原因

k8s oomkilled 错误原因:容器使用的内存资源超过了限制。只要节点有足够的内存资源,那容器就可以使用超过其申请的内存,但是不允许容器使用超过其限制的资源。 在yaml文件的resources.limits.memory 下定义了容器使用的内存限制,如果容器中的进程使用内存超过这个限制,就会出现oomkilled错误,容器被终止。 resources: limits: cpu: '8' memory: 32Gi 解决办法:1.优化程序,使之使用内存大小在范围内 2.修改.

小罗的博客 1万+

保姆级教程:用SOEM主站搞定汇川SV660N伺服驱动器的EtherCAT通讯(附完整C代码)

本文提供了一份详细的SOEM主站与汇川SV660N伺服驱动器EtherCAT通讯的实战教程,涵盖环境搭建、状态机理解、PDO映射配置、CiA402状态机实战、实时性能优化及诊断调试等关键步骤,并附完整C代码示例,帮助开发者快速实现工业级EtherCAT控制。

weixin_28292761的博客 306

K8s: Java应用OOMKilled的原因与分析

本篇文章是「DevOps云学堂」与你共同进步的第65篇管理 Kubernetes Pod 中运行的 Java 进程的内存使用情况比人们想象的更具挑战性。即使使用正确的 JVM 内存配置,仍然可能会出现OOMKilled问题,您想知道为什么吗?长话短说由于 JVM 仅考虑大小限制,因此无法保证 Java 进程的完整heap内存边界(堆内存);不是non-heap 内存(非堆内存),这取决于多种因素...

DevOps持续集成的博客 1409

【python】import pandas as pd用法

是 Python 里最常用的数据分析库之一。 的意思是:导入 pandas 库,并给它起个别名 。这样用起来更简洁: 下面总结 pandas 的常见用法(配例子)。目录🔹 1. 数据结构(1) Series(一维数据,类似于数组 + 标签)(2) DataFrame(二维数据表,类似于 Excel 表格)🔹 2. 数据读写🔹 3. 数据查看🔹 4. 数据选择与索引🔹 5. 数据清洗🔹 6. 数据运算🔹 7. 数据筛选(布尔索引)🔹 8. 分组与聚合🔹 9. 排序 Pandas 常用方

2401_86285609的博客 1533

【Web实战】微信小程序逆向

2E 70 6E 67”为带存放路径的文件名称,“00 00 11 7C”对应文件在小程序包中的具体偏移位置,“00 01 01 F7“对应文件在小程序包中的数据长度。但这并不是最初的原项目文件结构,原因是微信服务器会将小程序源码中所有的“js”文件压入“app-service.js”文件中,将所有的“json”文件压入“app-config.json”中,将所有的“wxml”文件压入“page-frame.html”文件中,“wxss”则在处理之后以“html”文件的形式存留在对应页面目录之下。

若有战,召必回 1945

OpenClaw部署指南:2026年生产级智能体工作流引擎实战

智能体工作流引擎是大模型落地的关键基础设施,其核心在于将LLM能力解耦为可调度、可验证、可编排的模块化技能单元。OpenClaw正是基于Unix哲学构建的典型代表,强调契约驱动、数据流清晰与错误显式化。它不同于传统LLM应用框架,而是通过Runtime层进程管理、Skill Bus插件总线和Protocol Layer多协议接入,实现跨模型、跨工具、跨向量库的统一调度。技术价值体现在故障隔离性、弹性伸缩性与灰度发布能力,广泛应用于金融分析、网页爬取、知识检索等需强工程可靠性的AI工作流场景。本文聚焦Open

weixin_34323858的博客 432

告别玄学调试:用STM32CubeMX和逻辑分析仪搞定DP83848的RMII与SMI接口

本文详细介绍了如何使用STM32CubeMX和逻辑分析仪调试DP83848的RMII与SMI接口,帮助开发者超越表象,直接观察底层通信波形。通过实战案例和高级调试技巧,解决常见问题如时钟偏移、信号完整性等,提升网络接口的稳定性和可靠性。

weixin_30752699的博客 299

如何分析K8S中的OOMKilled问题(Exit Code 137)

当 Kubernetes 集群中的容器超过其内存限制时,Kubernetes 系统可能会终止该容器并显示“OOMKilled”错误,这表明该进程由于内存不足而被终止。此错误的退出代码是 137。

summer_fish的专栏 7727

关于SVPWM七段式五段式调制后的相电压和线电压波形——大疆DJI技术笔试

1.SVPWM七段式/五段式调制的相电压和线电压波形 脉宽调制(PWM)在并网变流技术中得到了广泛的应用。与正弦脉宽调制(SPWM)的控制方法相比,SVPWM方法具有直流侧电压利用率高,电压谐波小,易于数字化实现等显著的优点,从而使SVPWM在实际的应用中越来越普遍。TMS320F28335是32位浮点的DSP控制器,具有150MHz的高速处理能力,18路PWM输出,与前几代数字信号控制器相比,性能平均提高了50%。其中具体的SVPWM理论实现的原理,请参考我的博客永磁同步电机的矢量控制策略(七)一一一SV

昔时扬尘处 2万+

Qlib数据获取避坑指南:从CSV导入到自定义数据源的完整解决方案

本文详细解析了Qlib数据获取的完整解决方案,从CSV导入到自定义数据源,涵盖了股票数据处理的关键技巧和常见陷阱。特别针对Qlib平台的数据格式要求和复权处理提供了实用指南,帮助量化投资者高效整合Wind等第三方数据源,确保数据质量与模型性能。

weixin_29047919的博客 304

JVM 内存与 K8s 容器内存不一致引发的 OOMKilled 总结

退出代码0表示特定容器没有附加前台进程该退出代码是所有其他后续退出代码的例外,一般是容器正常退出,程序自动退出。这不一定意味着发生了不好的事情。如果开发人员想要在容器完成其工作后自动停止其容器,则使用此退出代码。比如:kubernetes job 在执行完任务后正常退出码为 0。

因上努力,果上随缘。但行好事,莫问前程。 3171

Codex 接入国产大模型完整指南:CC-Switch 与 Codex++ 的工程化选型

Codex 默认走 OpenAI Responses API,而 DeepSeek、GLM、Kimi 等国产模型只提供 OpenAI-compatible 的 Chat Completions——两套协议在消息结构、流式响应、reasoning 字段、tool call 上都不兼容,所以"改个 Base URL + 填国产 Key"这种朴素操作根本跑不通。本文从架构师视角出发,把 Codex 接入国产大模型这件事讲透:先剖析协议链路到底卡在哪,再对比 CC-Switch和 Codex++两套主流方案的差异

少说,多做 3855

k8s Pod 常见的状态之OOMKilled状态详解

在 Kubernetes (k8s) 中,OOMKilled状态指的是一个 Pod 由于内存不足(Out of Memory,简称 OOM)而被系统杀死。当容器在 Kubernetes 节点上运行时,它可能会消耗过多的内存,导致节点上的内核检测到内存不足,进而杀死该容器以保护系统的稳定性。下面将详细解释OOMKilled状态以及如何处理和避免这种情况。

abcy071213的博客 1008

【stm32+K210项目】基于K210与STM32协同工作的智能垃圾分类系统设计与实现(完整工程资料源码)

本系统采用SG90舵机Maix Bit摄像头STM32C8T6主控板以及LX_TRIG_MP3_V6.0语音播报模块,构建了一套高效的智能垃圾分类系统,综合运用了图像识别、语音播报及精准控制技术。SG90舵机负责控制垃圾桶的开盖操作。该舵机通过接收PWM信号来实现转动,内部有一个基准电路产生周期为20ms的PWM信号,通过外部脉冲信号的控制(高电平时间在0.5ms至2.5ms之间),使得舵机的输出轴转动到指定位置。舵机内的位置反馈电位计。

嵌入式技术开发 5099

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

私有化部署 Dify 并快速搭建 AI 应用

Dify可以切换几乎所有主流的模型,通过模板可以快速创建应用,添加各种类型的文档作为知识库,添加后端API等,相较于LangChain需要通过 Python 代码进行开发,Dify 开箱即用,对于大部分人来说更加的友好,最重要的可以进行私有化部署。

m0_59235699的博客 9851

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

k8s-kublulet-OOM-kill ,容器 OOM , jvm oom故障分析

# 排查参考文章: https://blog.youkuaiyun.com/fly910905/article/details/90179225 # 理解Linux oom https://blog.youkuaiyun.com/run_for_belief/article/details/83446344 # 理解 java oom https://www.cnblogs.com/bhlsheji/p/5330045.html 省略比較小的区域,能够总结JVM占用的内存: JVM内存 ≈ Java永久代 +...

yuezhilangniao的博客 5643

深度学习工具包 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")

精雕软件(JDpaint) 5.5 绿色版

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

k8s部署dify1.1.3详细过程

dify官方提供的安装方式是docker-compose方式部署的,单机运行。但是在企业生产环境,单机没法提供冗余,一旦故障,就很麻烦了。如果有大量的APP用户,那么单机承受不住这么多并发,也会出现故障。很多小伙伴们,想在k8s中运行dify,解决冗余以及并发问题,直接扩容节点即可。注意:只有企业版会提供k8s部署,社区版是没有的。对于我们这种个人开发者来说,囊中羞涩,不愿意花费这笔钱。企业版还得联系商务,提供企业相关信息,特别麻烦。对于在k8s中部署dify,确实比较难。

weixin_36879547的博客 376

揭秘Kubernetes中的OOM Killer:追踪内存问题

OOM killer(Out of Memory killer)是Kubernetes中的一个重要机制,它有助于维护系统的稳定性并防止内存耗尽。当内存资源严重不足时,它充当最后的防线。在这种情况下,OOM killer会识别出导致内存超载的进程或Pod,并终止它以释放内存给系统的其他部分使用。通过牺牲一个进程,OOM killer防止了整个系统崩溃,确保了集群的整体稳定性。

sre救赎之路 1941

k8s部署dify1.1.3详细过程,大模型入门到精通,收藏这篇就足够了!

对于我们这种个人开发者来说,囊中羞涩,不愿意花费这笔钱。企业版还得联系商务,提供企业相关信息,特别麻烦。

Y525698136的博客 2646

此次部署在k8s集群中的SpringBoot项目OOMKilled问题汇总

现象1:在执行任务时,在页面上发现任务执行失败了(SprintBoot项目) # kubectl get pod |grep podname  发现有重启的记录 #kubectl describe pod podname  发现Reason:OOMKilled,Exit Code:137 经过测试发现OOMKill的时候pod占用的内存非常接近上图的Limitsmemor...

weixin_30657541的博客 1345

k8s部署dify

以前部署过,最近重新部署发现还是存在很多问题,这里进行记录。

巴菲先生 1555

K8S容器OOM killed排查

docker耗用完内存前,堆内存并没有达到上限,于是没有触发老年代GC,内存没有降下去。如果容器OOM killed,容器里的jvm进程没有Full GC,那么肯定是MaxRAMPercentage参数太高,导致堆内存没有用到上限,无法触发堆内存(老年代)GC。当实例内存超过95%时,对比top显示的的jvm进程内存和ps stats输出的docker实例内存信息,其余进程耗用的内存忽略不计。遂将内存增加到4GB。4 由于堆内存没有的到达上限,但是整个jvm进程内存超出了容器的内存限制。

bruce128的专栏 3517

集群容器频繁OOMKilled的排查经历

发现日志并无异样,也没有相关异常报错信息排查问题细致!注意分析工具的英文解释,每一个英文都得关注(粗心)日常开发引入jar包一定要深入理解最佳实践后才使用,切勿浅尝辄止能用就行一个已经加载的类被卸载的几率是很小的同时被卸载的时间也是不确定的工具方面mat似乎不太好查看已加载类信息,比较侧重不同类加载器加载同一个类导致的重复类问题visualvm也不太好查看已加载类信息arthas不错 功能全面。

CallmeMaybe 3403

生产k8s 应用容器内存溢出OOMKilled问题处理

这表示该 Pod 是因为内存溢出(OOM,Out of Memory)被系统终止的。这种状态一般表示节点上的内存不足,无法满足 pod 的内存需求。不要批量一次将所有文件进行解压,防止磁盘空间不足、jvm直接内存不够问题。通过使用线程池一个线程解压完文件,再数据加载入库,最后删除数据文件,同时需要控制线程数不要太多,防止线程切换耗时且处理多个线程出现内存溢出问题。使用spring batch从上游edb接收数据压缩文件,再将文件解压后使用load将数据入库。cpu: "8" # 1个cpu=1000m。

li371490890的博客 1151

有状态应用dify部署至华为云kubernetes集群

kubernetes部署有状态服务dify,使用云服务作为存储。

nangonghen的博客 1704
上一篇: 【数据科学家私藏秘技】:R语言+Tableau构建智能仪表盘的黄金组合
下一篇: Docker卷数据崩溃怎么办?Restic实时备份拯救生产环境(附脚本)
PixelFlow
博客等级 码龄1年 180粉丝 2207原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值