为什么你的Docker构建依然缓慢?——Buildx缓存卷挂载避坑全指南

第一章:为什么你的Docker构建依然缓慢?

即使你已经使用了多阶段构建和缓存机制,Docker 构建过程仍可能异常缓慢。问题往往隐藏在镜像层的设计与依赖管理中。

无效的缓存利用率

Docker 采用分层缓存机制,一旦某一层发生变化,其后的所有层都将失效。最常见的问题是将代码复制操作放在依赖安装之前,导致每次代码变更都会重新安装依赖。 例如,以下 Dockerfile 片段会导致不必要的重复安装:
# 错误示例:代码复制早于依赖安装
FROM node:18
COPY . /app
WORKDIR /app
RUN npm install  # 每次代码变更都会触发此步骤
正确做法是先复制并安装依赖,再复制应用代码,利用缓存跳过重复安装:
# 正确示例:分离依赖与代码
FROM node:18
WORKDIR /app
COPY package.json .
RUN npm install  # 仅当 package.json 变化时执行
COPY . .
CMD ["npm", "start"]

未优化的构建上下文

Docker 默认发送整个当前目录作为构建上下文,若包含 node_modules、日志或大型资源文件,会显著拖慢构建速度。 通过 .dockerignore 文件排除无关文件:
  1. 创建 .dockerignore 文件
  2. 添加无需构建的目录和文件

node_modules
.git
logs/
*.log
dist/

基础镜像选择不当

使用体积庞大的基础镜像(如 ubuntu)会增加下载和构建时间。推荐使用轻量级镜像,如 alpine 或 distroless 镜像。
镜像类型典型大小适用场景
node:18~900MB开发调试
node:18-alpine~120MB生产环境

第二章:Buildx缓存机制核心原理

2.1 理解Buildx中的缓存类型与作用域

Docker Buildx 提供了多种缓存机制,用于加速镜像构建过程。主要分为两类:本地缓存和远程缓存。
缓存类型详解
  • local cache:缓存数据存储在本地目录中,适用于单机环境。
  • inline cache:将缓存信息嵌入镜像层中,便于共享。
  • registry cache:缓存推送至镜像仓库,支持跨主机复用。
配置远程缓存示例
docker buildx build \
  --cache-to type=registry,ref=example.com/app:cache \
  --cache-from type=registry,ref=example.com/app:cache \
  -t example.com/app:latest .
该命令通过 --cache-to 将本次构建的元数据推送到注册表,--cache-from 则拉取已有缓存,显著提升后续构建效率。其中 ref 指定缓存存储路径,需与镜像在同一命名空间下管理。

2.2 cache_from与cache_to的工作流程解析

在数据缓存同步机制中,`cache_from`与`cache_to`定义了缓存的源与目标节点,控制数据流动方向。
工作流程概述
系统首先从 `cache_from` 指定的源节点拉取最新缓存数据,经由中间层校验后推送至 `cache_to` 目标节点。
// 示例:缓存同步配置
type CacheConfig struct {
    CacheFrom string `json:"cache_from"` // 源节点地址
    CacheTo   string `json:"cache_to"`   // 目标节点地址
}
上述结构体定义了缓存流向。`CacheFrom` 通常为只读副本,`CacheTo` 为待更新节点。同步前需验证源节点数据一致性。
同步触发条件
  • 定时任务触发周期性同步
  • 源节点数据版本变更
  • 目标节点缓存失效事件

2.3 本地缓存与远程缓存的性能对比

在高并发系统中,缓存是提升性能的关键组件。本地缓存(如Guava Cache)直接运行在应用进程中,访问延迟通常在微秒级;而远程缓存(如Redis)通过网络通信,延迟在毫秒级。
性能指标对比
类型读取延迟吞吐量数据一致性
本地缓存~50μs极高弱(多实例不一致)
远程缓存~1ms高强(集中管理)
典型使用场景
  • 本地缓存适合存储高频访问且容忍短暂不一致的数据,如配置信息;
  • 远程缓存适用于共享状态管理,如用户会话、分布式锁。

// Guava本地缓存示例
Cache<String, String> cache = Caffeine.newBuilder()
    .expireAfterWrite(5, TimeUnit.MINUTES)
    .maximumSize(10_000)
    .build();
上述代码创建了一个基于Caffeine的本地缓存,设置过期时间和最大容量,避免内存溢出。

2.4 构建层复用条件与命中策略深度剖析

在持续集成系统中,构建层的复用机制能显著提升效率。其核心在于缓存命中策略的精准控制。
复用触发条件
构建层复用需满足以下前提:
  • 基础镜像哈希值一致
  • 构建上下文文件树无变更
  • Dockerfile 指令序列完全相同
命中策略实现逻辑
// CheckCacheHit 判断当前构建层是否可复用
func (c *LayerCache) CheckCacheHit(layerDigest string) bool {
    // 查询本地缓存是否存在该层摘要
    if cached, exists := c.store.Get(layerDigest); exists {
        return cached.Valid() // 验证缓存有效性(如过期时间)
    }
    return false
}
上述代码通过内容寻址(layerDigest)检索缓存层,确保只有完全匹配的构建输出才被复用,避免隐式副作用。
缓存匹配优先级
优先级匹配项说明
1镜像层摘要基于内容哈希唯一标识
2构建参数环境变量、ARG 值必须一致
3文件元信息包括大小、修改时间等

2.5 缓存失效的常见场景与规避方法

缓存失效是影响系统性能的关键问题,常见于数据更新不及时、缓存过期策略不当和并发竞争等场景。
典型失效场景
  • 缓存穿透:查询不存在的数据,导致请求直达数据库。
  • 缓存雪崩:大量缓存同时过期,瞬时压力击穿后端。
  • 缓存击穿:热点数据过期,高并发访问集中冲击单一key。
代码级规避策略
// 使用双检锁防止缓存击穿
func GetUserData(userId string) *User {
    data := redis.Get("user:" + userId)
    if data == nil {
        mutex.Lock()
        defer mutex.Unlock()
        // 二次检查
        data = redis.Get("user:" + userId)
        if data == nil {
            data = db.QueryUser(userId)
            redis.Setex("user:"+userId, data, 300)
        }
    }
    return data
}
该函数通过双重检查加互斥锁,避免高并发下重复重建缓存。关键参数:Setex 设置5分钟过期时间,防止雪崩;mutex 控制临界区执行。
优化建议
采用随机过期时间、布隆过滤器拦截非法查询、以及多级缓存架构可显著提升系统稳定性。

第三章:缓存卷挂载实践配置

3.1 配置Docker Buildx builder实例并启用缓存支持

创建自定义Buildx构建器实例
默认的Docker构建器不支持多平台和高级缓存功能。需通过以下命令创建支持多架构的builder实例:
docker buildx create --name mybuilder --use --bootstrap
该命令创建名为 `mybuilder` 的builder,并设为当前使用状态。`--bootstrap` 参数会立即启动构建节点。
启用构建缓存后端
Buildx支持多种缓存模式,推荐使用 `registry` 模式将缓存推送到镜像仓库,供CI/CD流水线复用:
docker buildx build --cache-to type=registry,ref=myrepo/app:cache --cache-from myrepo/app:cache ...
其中 `cache-to` 表示推送缓存至远程仓库,`cache-from` 表示拉取已有缓存,显著提升后续构建效率。

3.2 使用--cache-to和--cache-from实现跨构建缓存共享

在持续集成环境中,频繁的镜像构建会导致重复的层构建操作,降低效率。Docker BuildKit 提供了 `--cache-to` 和 `--cache-from` 参数,支持将构建缓存导出到外部存储,并在后续构建中复用。
缓存导出与导入配置
使用以下命令可将缓存推送到镜像仓库:

docker buildx build \
  --cache-to type=registry,ref=example.com/app:cache \
  --cache-from type=registry,ref=example.com/app:cache \
  -t example.com/app:v1 .
其中,`--cache-to` 指定缓存输出目标,`--cache-from` 声明前置缓存来源,均通过镜像仓库共享缓存数据。
缓存类型说明
  • registry:将缓存作为 OCI 镜像推送到注册表,适合 CI/CD 跨节点共享
  • local:缓存保存在本地目录,适用于单机多环境场景
该机制显著减少重复构建时间,尤其在多分支并行开发中提升整体流水线效率。

3.3 挂载外部缓存卷提升CI/CD中构建效率

在CI/CD流水线中,频繁的依赖下载和重复构建显著拖慢整体流程。通过挂载外部缓存卷,可实现跨构建任务的依赖复用,大幅提升执行效率。
缓存卷配置示例

- name: Mount cache
  uses: actions/cache@v3
  with:
    path: /build/cache
    key: ${{ runner.os }}-deps-${{ hashFiles('**/dependencies.lock') }}
该配置将构建依赖目录挂载为持久化缓存卷,key值基于依赖锁文件生成,确保内容变更时自动失效旧缓存。
性能对比
策略平均构建时间带宽节省
无缓存6m22s0%
挂载缓存卷1m48s72%
缓存机制减少了重复下载,尤其在多阶段构建和并行任务中优势显著。

第四章:典型问题排查与优化策略

4.1 构建缓存未命中的日志分析技巧

在高并发系统中,缓存未命中是影响性能的关键瓶颈。通过精细化的日志记录与分析,可快速定位问题根源。
关键日志字段设计
为有效追踪缓存行为,日志应包含以下核心字段:
  • cache_key:请求的缓存键名
  • hit_status:命中(hit)或未命中(miss)
  • request_id:关联上下游调用链
  • upstream_latency:回源耗时(毫秒)
示例日志结构化输出(Go)
logrus.WithFields(logrus.Fields{
    "cache_key":      key,
    "hit_status":     hitStatus,
    "request_id":     reqID,
    "upstream_latency": latency.Milliseconds(),
}).Info("Cache operation")
该代码段使用 logrus 记录结构化日志,便于后续通过 ELK 或 Prometheus 进行聚合分析。其中 hit_status 字段可用于构建缓存命中率仪表盘。
高频未命中模式识别
通过日志聚合工具(如 Grafana)可绘制缓存命中趋势图,并设置告警规则检测异常波动。

4.2 多阶段构建中的缓存隔离与传递问题

在多阶段构建中,各阶段的缓存机制默认相互隔离,导致依赖重复下载与编译,影响构建效率。
缓存隔离的影响
每个构建阶段拥有独立的文件系统上下文,即使前一阶段已下载依赖,后续阶段也无法直接复用。
缓存传递解决方案
通过 --from 引用前一阶段并结合构建参数,可实现缓存共享。例如:
FROM golang:1.21 AS builder
WORKDIR /app
COPY go.mod .
RUN go mod download

FROM builder AS compiler
COPY . .
RUN go build -o main .

FROM alpine:latest
WORKDIR /root/
COPY --from=compiler /app/main .
CMD ["./main"]
该示例中,go mod download 结果被保留在 builder 阶段,compiler 阶段继承该层缓存,避免重复拉取依赖,提升构建速度。

4.3 并行构建对缓存一致性的挑战与解决方案

在并行构建环境中,多个构建任务可能同时访问和修改共享的缓存资源,导致缓存数据不一致问题。尤其在分布式CI/CD系统中,不同节点间的本地缓存若缺乏同步机制,极易产生“脏读”或构建结果不可复现。
缓存竞争示例

# 构建脚本片段
if [ ! -f "node_modules" ]; then
  npm install --cache ./npm-cache
fi
当多个流水线并发执行时,npm-cache 目录可能被不同版本的依赖覆盖,造成缓存污染。
常见解决方案
  • 使用内容哈希作为缓存键,确保输入唯一性
  • 引入分布式锁控制缓存写入临界区
  • 采用中心化缓存服务(如 Redis)统一管理元数据
一致性策略对比
策略一致性强度性能开销
写穿透 + 哈希键中低
分布式锁高高

4.4 基于Registry的远程缓存管理最佳实践

在分布式系统中,通过注册中心(Registry)实现远程缓存的统一管理,可显著提升缓存一致性与运维效率。
服务注册与缓存监听
当缓存节点启动时,向Registry注册自身信息,并订阅其他节点变更事件。利用心跳机制维持活跃状态,失效时自动触发集群重新平衡。
  • 使用ZooKeeper或etcd作为高可用注册中心
  • 节点变更通过Watcher机制实时通知
  • 避免单点故障,确保元数据强一致性
配置同步示例

// 注册缓存节点到etcd
cli, _ := clientv3.New(clientv3.Config{Endpoints: []string{"localhost:2379"}})
cli.Put(context.TODO(), "/cache/nodes/node1", "192.168.1.10:6379")

// 监听其他节点变化
watchCh := cli.Watch(context.Background(), "/cache/nodes/", clientv3.WithPrefix())
for resp := range watchCh {
    for _, ev := range resp.Events {
        fmt.Printf("缓存节点变更: %s -> %s\n", ev.Kv.Key, ev.Kv.Value)
    }
}
上述代码实现将缓存实例注册至etcd并监听路径前缀下的变更事件,确保集群状态实时感知。

第五章:构建速度革命:从缓存到持续交付效能跃迁

缓存策略驱动的构建加速
现代CI/CD流水线中,重复下载依赖和重建未变更模块是性能瓶颈。通过引入分层缓存机制,可显著缩短构建时间。例如,在GitHub Actions中配置缓存Node.js依赖:

- name: Cache dependencies
  uses: actions/cache@v3
  with:
    path: ~/.npm
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-node-
该策略将npm包缓存命中率提升至85%以上,平均构建耗时从6分钟降至1.2分钟。
增量构建与产物复用
在微服务架构中,采用基于Git变更的增量构建方案,仅重建受影响的服务。结合Docker多阶段构建与BuildKit缓存:

DOCKER_BUILDKIT=1 docker build \
  --cache-from type=registry,ref=registry/app:buildcache \
  --cache-to type=registry,ref=registry/app:buildcache,mode=max \
  -t app:latest .
此方式使镜像构建效率提升40%,并减少Registry存储压力。
持续交付流水线优化对比
优化项优化前优化后
平均构建时间8分15秒2分08秒
部署频率每日3次每小时多次
失败恢复时间25分钟3分钟
自动化触发与环境分级
  • 开发分支推送触发单元测试与代码扫描
  • 合并至staging分支自动部署预发环境
  • 生产发布需手动确认,但部署过程完全自动化
  • 结合Feature Flag实现无感上线
流程图:CI/CD效能跃迁路径
代码提交 → 增量检测 → 缓存恢复 → 并行测试 → 构建推送 → 环境部署 → 监控反馈
用python将dycom .dcm格式图像转换为nifti .nii 因为发现目前搜索到的多数中文教程并不能正确将FMRI图像正确转换,例如很多用simpleITk的seriesreader的,所以写了一下自己正确转换的方法。因为FMRI是一个4D数据,有时间轴,所以用seriesreader读写出来的图像把时间轴维度给降维了。当然你用SPM12工具的dycom import也是能正确转换的,但是我还是喜欢python这样的,代码直接简单。 阅读详情

相关推荐

KEGG数据库与KAAS工具:基因功能注释的实用指南

本文提供了使用KEGG数据库与KAAS工具进行基因功能注释的完整实用指南。详细阐述了如何从准备基因或蛋白序列开始,通过KAAS服务器获取KEGG Orthology(KO)编号,并解读注释结果。文章进一步介绍了如何利用KOBAS工具进行通路富集分析,将定性观察转化为定量洞察,并分享了提高注释准确率、处理大数据集及使用API等避坑技巧与高阶方法,为基因组学、转录组学研究者奠定坚实的数据分析基础。

weixin_29292535的博客 390

docker build速度过慢问题

docker速度过慢的原因在于,docker的默认源主要是在国外,因此会慢,解决办法是替换掉它. 我这里使用的是阿里的源: RUN sed -i "s/archive.ubuntu./mirrors.aliyun./g" /etc/apt/sources.list RUN sed -i "s/deb.debian.org/mirrors.aliyun.com/g" /etc/apt/sources.list RUN sed -i "s/security.debian.org/mirrors.aliyun.c

笑笑布丁的博客 1万+

【VisualStdio】手把手教你做一个上位机(1)控件设计布局

网上有很多形形色色的制作上位机教程,有些写的挺好的,但是过于单调。

m0_73409202的博客 5435

忍无可忍!一次解决docker build的痛点!

在 Docker 环境下构建镜像时,由于网络问题,国内开发者往往会遇到令人头疼的构建速度慢、依赖无法下载等问题。本文将介绍如何在 Dockerfile 中设置代理和缓存,以提升构建速度并减少构建过程中的卡顿现象。

weixin_46759000的博客 3906

XDMA 驱动安装与性能测试全流程解析

本文详细解析了XDMA驱动的完整安装与性能测试流程。从环境准备、源码获取、编译安装到驱动加载与设备验证,逐步指导用户打通FPGA加速卡与主机间的高速数据通道。重点介绍了如何通过官方测试脚本进行功能验证与带宽性能测试,帮助用户评估XDMA驱动的实际传输效能,为AI推理、高频交易等低延迟高带宽应用奠定基础。

weixin_29216049的博客 524

VCL for PHP,Konopka Signature VCL Controls (Raize Components 6.2.3) for Delphi 10.4

The Raize Components suite includes a variety of interface design tools for Delphi programming language and C ++ Builder, which includes over 125 VCL controls and over 100 different tools for creating...

weixin_42137539的博客 852

Docker build 太慢解决方法

全局代理或者是改容器内的源

人在江湖 7866

避坑指南:QCustomPlot鼠标事件冲突解决方案(左键拖动vs右键框选)

本文深入解析QCustomPlot在QT框架下的高级交互实现,重点解决左键拖动与右键框选的冲突问题。通过自定义事件处理和QRubberBand技术,提供了一套完整的无冲突交互方案,帮助开发者优化数据可视化应用的用户体验。

moss5的博客 660

Dockerfile build速度巨慢优化

docker client会默认把Dockerfile同级所有文件发给docker Deamon

morecccc的博客 2666

深度学习-161-Dify工具之对比使用工作流和聊天流生成图表可视化的html文件

分别使用聊天流和工作流进行数据分析结果的可视化,生成html文件。聊天流可以配置带记忆,这样就可以多次交互优化结果。

qq_20466211的博客 1709

【DaVinci Configurator专题】-2-将CAN 2.0或CANFD Matrix的Arxml/DBC文件导入到CFG

共9页 目录 1 打开DaVinci Configurator,导入Arxml文件 2 解决导入Arxml文件后可能会出现的一些错误 3 验证CFG的配置 4 根据CFG的配置生成代码 5 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键词: Open the Input Files Assistant Complete update process Update ECU configurati

「汽车电子助手」的博客 6125

Dockerfile build时速度慢的解决办法以及ppa国内源的设置

最近在准备运行开源的VDO-SLAM。看到提供了Dockerfile。于是准备试试看学习一下Docker的部署方案。Docker的环境配置好以后运行结果就是漫长的等待,在等待的时候,时间很久,而且中途会报错time out之类的错误。于是发现了Dockerfile中使用的docker镜像,并且没有配置使用国内的软件源,而且这个开源程序框架还添加了一个ppa的源。导致更加慢。

虎子的博客 3670

〖Python接口自动化测试实战篇④〗- 接口自动化测试详解

[接口测试] 是相对来说和我们的功能测试 [最为接近的一种自动化测试手段] ,所以我们首先来学习接口测试的内容。 实现接口的开发与接口的测试,在我们的思维上、想法上、面向的态度上都是不一样的。所以大家要有一个思维上的转换,要认识了解一下 接口测试到底是做什么的、它的功能、意义在哪里。...

易编橙 · 终身成长社群,相遇已是上上签! 5万+

如何用Docker Buildx实现零冗余构建?缓存卷挂载的8个关键细节

掌握Docker Buildx缓存卷挂载技巧,实现高效零冗余构建。适用于CI/CD、多平台镜像编译等场景,通过持久化缓存提升构建速度,节省资源消耗。详解8个关键配置细节,优化容器构建流程,值得收藏。

FuncInk的博客 1022

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

构建速度慢?你必须掌握的Docker Buildx缓存卷挂载7大最佳实践

提升构建效率?掌握Docker Buildx缓存卷挂载7大最佳实践,适用于CI/CD、多架构镜像构建等场景,通过合理配置缓存提升重复构建速度达数倍,减少资源浪费,值得收藏。

ByteChat的博客 675

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Docker Buildx缓存卷挂载实战:5分钟彻底搞懂高效CI/CD加速技巧

掌握Docker Buildx缓存卷挂载技巧,显著提升CI/CD构建效率。本文详解其在多平台镜像构建中的应用,通过实战演示缓存复用方法,减少重复下载,加快构建速度。适用于GitLab CI、GitHub Actions等场景,值得收藏。

FastDebug的博客 945

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

【Docker Buildx缓存优化终极指南】:掌握多阶段构建与缓存卷挂载的高效实践

掌握Docker Buildx缓存优化方法,提升构建效率。详解多阶段构建与Docker Buildx的缓存卷挂载技术,适用于CI/CD、镜像持续交付等场景,显著减少重复构建耗时。支持跨平台构建缓存复用,加速部署流程。值得收藏的高效实践指南,点击了解完整技巧。

InitPulse的博客 726

【Docker Buildx缓存优化终极指南】:5个你必须掌握的缓存卷挂载技巧

掌握Docker Buildx缓存优化核心技巧,提升构建效率。本文深入解析Docker Buildx 缓存卷挂载的5种实用方法,涵盖CI/CD场景、多阶段构建与远程缓存共享,显著减少重复构建时间。配置简单,兼容性强,值得收藏。

BytePerch的博客 892

(高级进阶)Docker Buildx多阶段构建+缓存卷挂载性能优化实践

掌握Docker Buildx多阶段构建与缓存卷挂载技巧,显著提升镜像构建效率。本文详解CI/CD场景下如何通过Docker Buildx 缓存卷挂载实现依赖缓存复用,减少重复下载,加速构建流程。方法实用,性能提升明显,值得收藏。

QuickProceed的博客 860

从入门到精通:Docker Buildx缓存卷挂载全流程图解(附真实案例)

掌握高效构建秘诀,详解Docker Buildx 缓存卷挂载全流程。涵盖多架构构建、缓存复用场景与实战案例,提升镜像构建速度与CI/CD效率,节省资源开销,值得收藏。

LogicPlex的博客 765

Docker Buildx缓存策略全解析,彻底告别重复构建的烦恼

彻底解决Docker重复构建难题,提升CI/CD效率。本文详解Docker Buildx缓存卷挂载等策略,覆盖多阶段构建与远程缓存应用场景,实现构建速度飞跃。方法实用,适配云端与本地环境,值得收藏。

FastProceed的博客 1044

Docker Buildx缓存卷挂载避坑指南:90%开发者忽略的3大关键点

掌握Docker Buildx缓存卷挂载技巧,提升构建效率3倍以上。详解多阶段构建与buildkit缓存复用机制,避免常见权限与路径错误,支持CI/CD持续集成场景。90%开发者忽略的关键细节全解析,值得收藏

IterStream的博客 964

Docker Buildx缓存管理难题破解:挂载缓存卷的3种高阶应用场景

破解Docker Buildx缓存管理难题,详解缓存卷挂载的3种高阶应用场景。涵盖多阶段构建、跨平台编译与CI/CD流水线中的实战技巧,提升镜像构建效率与资源利用率,显著缩短构建时间。掌握核心方法,实现高效持续集成,值得收藏。

FuncTide的博客 1015

为什么你的CI构建总是慢?Docker Buildx缓存卷正确挂载方式揭秘

解决CI构建缓慢难题,揭秘Docker Buildx缓存卷挂载正确方法。适用于多阶段构建与CI/CD流水线,通过持久化镜像层缓存显著提升构建效率。配置简单、效果显著,值得收藏。

PoliVein的博客 786

为什么你的CI流水线总在重建镜像?揭秘Buildx缓存卷挂载陷阱

解决CI流水线频繁重建镜像问题,揭秘Docker Buildx 缓存卷挂载的正确用法。适用于多阶段构建与持续集成场景,通过持久化缓存提升构建效率,显著缩短编译时间,避免资源浪费,值得收藏。

Algorhythm的博客 973

Docker Buildx缓存卷挂载详解(附7个生产环境最佳实践)

掌握Docker Buildx的缓存卷挂载技巧,提升多平台镜像构建效率。详解缓存机制、典型应用场景与7大生产实践,支持CI/CD加速与资源优化。方法实用,值得收藏。

InstrIsle的博客 422
上一篇: 【Python开发高效指南】:Dify工具requirements安装提速3倍的秘密方法
下一篇: 为什么你的Harbor复制延迟高?深入剖析复制规则性能瓶颈
ProceChat
博客等级 码龄1年 155粉丝 1997原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值