皮皮网
皮皮网

【查看opencv源码版本】【闲玩麻将源码】【苹果群控源码】docker源码架构

来源:Symbian塞班源码 发表时间:2024-12-22 16:05:10

1.在 Nvidia Docker 容器编译构建显存优化加速组件 xFormers
2.Docker 源码分析
3.技术系列开源之DrawDocker源码略读(一)
4.DockerMySQL 源码构建 Docker 镜像(基于 ARM 64 架构)
5.docker是源码什么
6.深入 Dify 源码,洞察 Dify RAG 核心机制

docker源码架构

在 Nvidia Docker 容器编译构建显存优化加速组件 xFormers

       本篇文章,架构聊聊如何在新版本 PyTorch 和 CUDA 容器环境中完成 xFormers 的源码编译构建。

       让你的架构模型应用能够跑的更快。

       写在前面

       xFormers[1] 是源码 FaceBook Research (Meta)开源的使用率非常高的 Transformers 加速选型,当我们使用大模型的架构查看opencv源码版本时候,如果启用 xFormers 组件,源码能够获得非常明显的架构性能提升。

       因为 xFormers 对于 Pytorch 和 CUDA 新版本支持一般会晚很久。源码所以,架构时不时的源码我们能够看到社区提出不能在新版本 CUDA 中构建的问题( #[2]或 #[3]),以及各种各样的架构编译失败的问题。

       另外,源码xFormers 的架构安装还有一个问题,会在安装的源码时候调整当前环境已经安装好的 PyTorch 和 Numpy 版本,比如我们使用的是已经被验证过的环境,比如 Nvidia 的月度发布的容器环境,这显然是我们不乐见的事情。

       下面,我们就来解决这两个问题,让 xFormers 能够在新的 CUDA 环境中完成编译,以及让 xFormers 的安装不需要变动我们已经安装好的 Pytorch 或者 Numpy。

       环境准备

       环境的准备一共有两步,下载容器和 xFormers 源代码。

       Nvidia 容器环境

       在之前的 许多文章[4]中,我提过很多次为了高效运行模型,我推荐使用 Nvidia 官方的容器镜像( nvcr.io/nvidia/pytorch:.-py3[5])。

       下载镜像很简单,一条命令就行:

       完成镜像下载后,准备工作就完成了一半。

       准备好镜像后,我们可以检查下镜像中的具体组件环境,使用docker run 启动镜像:

       然后,闲玩麻将源码使用python -m torch.utils.collect_env 来获取当前环境的信息,方便后续完成安装后确认原始环境稳定:

       获取 xFormers

       下载 xFormers 的源代码,并且记得使用--recursive 确保所有依赖都下载完毕:

       xFormers 的源码包含三个核心组件cutlass、flash-attention、sputnik,除去最后一个开源软件在 xFormers 项目 sputnik 因为 Google 不再更新,被固定了代码版本,其他两个组件的版本分别为:cutlass@3.2 和 flash-attention@2.3.6。

       Dao-AILab/flash-attention[6]目前最新的版本是 v2.4.2,不过更新的主干版本包含了更多错误的修复,推荐直接升级到最新版本。在 v2.4.2 版本中,它依赖的 cutlass 版本为 3.3.0,所以我们需要升级 cutlass 到合适的版本。

       Nvidia/cutlass[7] 在 3.1+ 的版本对性能提升明显。

       不过如果直接更新 3.2 到目前最新的 3.4flash-attention 找不到合适的版本,会发生编译不通过的问题,所以我们将版本切换到 v3.3.0 即可。

       另外,在前文中提到了在安装 xFormers 的时候,会连带更新本地已经安装好的依赖。想要保护本地已经安装好的环境不被覆盖,尤其是 Nvidia 容器中的依赖不被影响,我们需要将xformers/requirements.txt 内容清空。

       好了,到这里准备工作就结束了。

       完成容器中的 xFormers 的安装

       想要顺利完成 xFormers 的构建,还有一些小细节需要注意。为了让我们能够从源码进行构建,我们需要关闭我们下载 xFormers 路径的 Git 安全路径检查:

       为了让构建速度有所提升,我们需要安装一个能够让我们加速完成构建的工具ninja:

       当上面的工具都完成后,我们就可以执行命令,苹果群控源码开始构建安装了:

       需要注意的是,默认情况下安装程序会根据你的 CPU 核心数来设置构建进程数,不过过高的工作进程,会消耗非常多的内存。如果你的 CPU 核心数非常多,那么默认情况下直接执行上面的命令,会得到非常多的Killed 的编译错误。

       想要解决这个问题,我们需要设置合理的MAX_JOBS 参数。如果你的硬件资源有限,可以设置 MAX_JOBS=1,如果你资源较多,可以适当增加数值。我的构建设备有 G 内存,我一般会选择设置 MAX_JOBS=3 来使用大概最多 GB 的内存,来完成构建过程,MAX_JOBS 的构建内存消耗并不是完全严格按照线性增加的,当我们设置为 1 的时候,GB 的设备就能够完成构建、当我们设置为 2 的时候,使用 GB 的设备构建会比较稳妥,当设置到 4 的时候,构建需要的内存就需要 GB 以上了。

       构建的过程非常漫长,过程中我们可以去干点别的事情。

       当然,为了我们后续使用镜像方便,最好的方案是编写一个 Dockerfile,然后将构建的产物保存在镜像中,以方便后续各种场景使用:

       在构建的时候,我们可以使用类似下面的命令,来搞定既使用了最新的猴王水果源码 Nvidia 镜像,包含最新的 Pytorch 和 CUDA 版本,又包含 xFormers 加速组件的容器环境。

       如果你是在本机上进行构建,没有使用 Docker,那么构建成功,你将看到类似下面的日志:

       等待漫长的构建结束,我们可以使用下面的命令,来启动一个包含构建产物的容器,来测试下构建是否成功:

       当我们进入容器的交互式命令行之后,我们可以执行python -m xformers.info,来验证 xFromers 是否构建正常:

       以及,使用python -m torch.utils.collect_env 再次确认下环境是否一致:

       最后

       好了,这篇文章就先写到这里啦。

Docker 源码分析

       本文旨在解析Docker的核心架构设计思路,内容基于阅读《Docker源码分析》系文章后,整理的核心架构设计与关键部分摘抄。Docker是Docker公司开源的基于轻量级虚拟化技术的容器引擎项目,使用Go语言开发,遵循Apache 2.0协议。Docker提供快速自动化部署应用的能力,利用内核虚拟化技术(namespaces及cgroups)实现资源隔离与安全保障。相比虚拟机,Docker容器运行时无需额外的系统开销,提升资源利用率与性能。

       Docker迅速获得业界认可,包括Google、Microsoft、VMware在内的领导者支持。Google推出Kubernetes提供Docker容器调度服务,Microsoft宣布Azure支持Kubernetes,VMware与Docker合作。Docker在分布式应用领域获得万美元的小程序 店铺源码C轮融资。

       Docker的架构主要由Docker Client、Docker Daemon、Docker Registry、Graph、Driver、libcontainer以及Docker container组成。

Docker Client:用户通过命令行工具与Docker Daemon建立通信,发起容器管理请求。

Docker Daemon:后台运行的系统进程,接收并处理Docker Client请求,通过路由与分发调度执行相应任务。

Docker Registry:存储容器镜像的仓库,支持公有与私有注册。

Graph:存储已下载镜像,并记录镜像间关系的数据库。

Driver:驱动模块,实现定制容器执行环境,包括graphdriver、networkdriver和execdriver。

libcontainer:库,使用Go语言设计,直接访问内核API,提供容器管理功能。

Docker container:Docker架构的最终服务交付形式。

       架构内各模块功能如下:

Docker Client:用户与Docker Daemon通信的客户端。

Docker Daemon:后台服务,接收并处理请求,执行job。

Graph:存储容器镜像,记录镜像间关系。

Driver:实现定制容器环境,包括管理、网络与执行驱动。

libcontainer:库,提供内核访问,实现容器管理。

Docker container:执行容器,提供隔离环境。

       核心功能包括从Docker Registry下载镜像、创建容器、运行命令与网络配置。

       总结,通过Docker源码学习,深入了解其设计、功能与价值,有助于在分布式系统实现中找到与已有平台的契合点。同时,熟悉Docker架构与设计思想,为云计算PaaS领域带来实践与创新启发。

技术系列开源之DrawDocker源码略读(一)

       本文由神州数码云基地团队整理撰写,若需转载,请注明出处。本文将简要解析开源图形化工具“神笔马良”(DrawDocker)的设计引擎和设计试图视角功能,以供后续开发者参考。分析基于年月日的master分支代码,读者应依据实际情况进行判断。

       项目包含侧栏、画布和右侧格式栏,以及上方工具栏。侧栏提供搜索图形、便笺本、自定义Kubeapps组件栏、更多图形按钮等功能。其中,搜索图形功能通过关键字实现,由Sidebar对象的addSearchPalette方法控制。便笺本功能则用于保存临时图形模板,自定义Kubeapps组件栏则能展示并生成自定义应用组件。Kubeapps应用组件栏显示所有应用组件模板,通过读取kubeappsPalette.json文件的数据,创建包含图形、应用名、chart名和chart地址等信息的应用组件。

       创建新的组件栏需新增添加面板方法,并在初始化时调用。更多图形方法位于MoreShapesDialog中,新建的组件栏需添加至条目中才能在“更多图形”中显示。自定义属性或格式图形模板需在shapes和stencils目录下创建相应文件。

       画布部分主要由mxGraph对象实现,提供选中、获得样式等功能。右侧格式栏提供绘图、样式、文本、调整图形和安装参数栏,依据选中状态动态显示。样式栏显示图形属性及其值,若为Kubeapps图形,显示应用名、安装状态等。安装参数栏显示安装或删除按钮等。工具栏包含菜单、撤销、重做、删除、重命名、保存、语言等功能,通过Actions、EditorUi等对象实现。

       如需改进安装功能,可在Actions对象中修改或定义新动作,甚至在AppController.java文件中调整。项目已开源在GitHub,有兴趣的开发者可自行探索和优化。

DockerMySQL 源码构建 Docker 镜像(基于 ARM 架构)

       基于 ARM 架构,为避免MySQL版本变化带来的额外成本,本文将指导你如何从头构建MySQL 5.7.的Docker镜像。首先,我们从官方镜像的Dockerfile入手,但官方仅提供MySQL 8.0以上版本的ARM镜像,因此需要采取特殊步骤。

       步骤一,使用dfimage获取MySQL 5.7.的原始Dockerfile,注意其原文件中通过yum安装的逻辑不适用于ARM,因为官方yum源缺少该版本的ARM rpm。所以,你需要:

       在ARM环境中安装必要的依赖

       下载源码并安装

       修改源码配置以适应ARM架构

       编译源码生成rpm文件,结果存放在/root/rpmbuild/RPMS/aarch目录

       构建镜像的Dockerfile、docker-entrypoint.sh脚本(解决Kylin V兼容性问题,会在后续文章详细说明)以及my.cnf文件是构建过程中的关键组件。虽然原Dockerfile需要调整以消除EOF块的报错,但整个过程需要细心处理和定制化以适应ARM平台。

docker是什么

       Docker 是一种开源的应用容器引擎,它允许开发者将应用程序及其依赖关系打包进容器镜像中,这个镜像可以在任何支持 Docker 的操作系统上运行。这些容器镜像包括运行应用程序所需的所有组件,如库、系统工具、代码和运行时环境。

       作为软件平台,Docker 支持开发人员快速地构建、测试和部署容器化应用程序。其设计理念源自集装箱,即在大船上通过标准化的集装箱来整齐地装载各种货物,使得不同货物之间的相互影响得到隔离。

       Docker 采用客户端-服务器 (C/S) 架构模式,通过远程 API 来管理和创建 Docker 容器。在这种架构中,Docker 守护进程作为服务端,接收并处理客户端的请求,负责容器的创建、运行和管理。客户端和服务端可以运行在同一台机器上,也可以通过 socket 通信或 RESTful API 进行远程通信。

       Docker 的起源可以追溯到 PaaS 提供商 dotCloud 开源的一个基于 LXC 的容器引擎。这个项目源代码托管在 Github 上,并且是用 Go 语言编写的,遵循 Apache2.0 协议开源。

深入 Dify 源码,洞察 Dify RAG 核心机制

       深入探究Dify源码,揭示RAG核心机制的关键环节

       在对Dify的完整流程有了初步了解后,发现其RAG检索效果在实际部署中不尽如人意。因此,针对私有化部署的Dify,我结合前端配置和实现流程,详细解析了技术细节,旨在帮助调整知识库配置或进行定制化开发。

       Docker私有化部署技术方案

       本文重点聚焦于Dify docker私有化部署的默认技术方案,特别是使用Dify和Xinference的GPU环境部署。若想了解更多,可查阅Dify与Xinference的集成部署教程。

       RAG核心流程详解

       Extractor:负责原始文件内容的提取,主要在api/core/rag/extractor/extract_processor.py中实现。分为Dify默认解析和Unstructured解析,后者可能涉及付费,通常Dify解析更为常用。

       Cleaner:清洗解析内容,减少后续处理负担,主要基于规则进行过滤,用户可在前端进行调整。

       Splitter:文件分片策略,Dify提供自动和自定义两种,影响检索效果。

       Retrieval:Dify支持多种检索模式,包括关键词检索和向量数据库检索,向量库的选择对效果有很大影响。

       Rerank:对检索结果进行排序,配置Top K和score阈值,但存在设计上的不足。

       总结与优化建议

       Dify的RAG服务提供了基础框架,但性能优化空间大。通过调整配置,特别是针对特定业务场景,可以改善检索效果。对RAG效果要求高的用户,可能需要进行定制化的二次开发和优化。

相关栏目:百科