当前位置: 首页 > news >正文

DeepSeek 3FS 与 JuiceFS:架构与特性比较

近期,DeepSeek 开源了其文件系统 Fire-Flyer File System (3FS),使得文件系统这一有着 70 多年历时的“古老”的技术,又获得了各方的关注。在 AI 业务中,企业需要处理大量的文本、图像、视频等非结构化数据,还需要应对数据量的爆炸式增长,分布式文件系统因此成为 AI 训练的关键存储技术。

本文旨在通过深入分析 3FS 的实现机制,并与 JuiceFS 进行对比,以帮助用户理解两种文件系统的区别及其适用场景。同时,我们将探讨 3FS 中的值得借鉴的创新技术点。

01 架构对比

3FS

3FS (Fire-Flyer File System) 是一款高性能的分布式文件系统,专为解决 AI 训练和推理工作负载而设计,该系统使用高性能的 NVMe 和 RDMA 网络提供共享存储层。3FS 由 DeepSeek 在 2025 年 2 月开源。
3FS 主要包括以下模块:

  • 集群管理服务(Cluster Manager)
  • 元数据服务(Metadata Service)
  • 存储服务(Storage Service)
  • 客户端 (FUSE Client、Native Client)

所有模块通过 RDMA 网络通信。元数据服务和存储服务向集群管理服务发送心跳信号。集群管理服务负责处理成员变更,并将集群配置分发给其他服务和客户端。为了提高系统的可靠性和避免单点故障,会部署多个集群管理服务,其中一个被选为主节点。当主节点发生故障时,另一个管理器会被提升为主节点。集群配置通常存储在可靠的分布式服务中,例如 ZooKeeper 或 etcd。

当进行文件元数据操作(例如打开或创建文件/目录),请求被发送到元数据服务,以实现文件系统语义。元数据服务有多个,并且是无状态的,它们不直接存储文件元数据,而是依赖支持事务的键值数据库 FoundationDB 来存储这些数据。因此,客户端可以灵活地连接到任意元数据服务。这种设计使得元数据服务可以在没有状态信息的情况下独立运作,进而增强了系统的可伸缩性和可靠性。

每个存储服务管理若干本地 SSD,并提供 chunk 存储接口。存储服务采用 CRAQ ( Chain Replication with Apportioned Queries)来确保强一致性。3FS 中存储的文件被拆分为默认 512K 大小相等的块,并在多个 SSD 上进行复制,从而提高数据的可靠性和访问速度。

3FS 客户端提供两种接入方式: FUSE Client 和 Native Client。 FUSE Client 提供常见 POSIX 接口的支持,简单易用。Native Client 提供更高的性能,但是用户需要调用客户端 API ,具有一定的侵入性,下文我们还将对此作更详尽的解析。

JuiceFS

JuiceFS 是一个云原生分布式文件系统,其数据存储在对象存储中。社区版可与多种元数据服务集成,适用场景广泛,于 2021 年在 GitHub 开源。企业版专为高性能场景设计,广泛应用于大规模 AI 任务,涵盖生成式 AI、自动驾驶、量化金融和生物科技等。
JuiceFS 文件系统包括三部分组成:

  • 元数据引擎:用于存储文件元数据,包括常规文件系统的元数据和文件数据的索引。
  • 数据存储:一般是对象存储服务,可以是公有云的对象存储也可以是私有部署的对象存储服务。
  • JuiceFS 客户端:提供 POSIX(FUSE)、Hadoop SDK、CSI Driver、S3 网关等不同的接入方式。

架构差异

从模块划分上看两个文件系统差异不大,都采用了元数据与数据分离的设计,各个模块功能也较类似。不同于 3FS 和 JuiceFS 企业版,JuiceFS 社区版兼容多种开源数据库存储元数据,对元数据的操作都封装在客户端,用户不需要再单独运维一个无状态的元数据服务。

存储模块

3FS 使用大量本地 SSD 进行数据存储,为了保证数据存储的一致性,3FS 使用 CRAQ 这一简洁的数据一致性算法 。几个副本被组成一个 Chain,写请求从 Chain 的 Head 开始,一直到达 Chain 的 Tail 时返回写成功应答。读请求可以发送到 Chain 的所有副本,如果读到脏节点的数据,该节点会联系 Tail 节点检查状态。如下图所示。

数据的写入是按顺序逐节点传递,因此会带来比较高的延时。如果 Chain 当中的某个副本不可用, 3FS 会把这个副本移到 Chain 的末尾,等副本可用的时候再做恢复。恢复的时候需要把整个 Chunk 的内容复制到这个副本,而非使用不可用期间的增量数据。如果要做到同步写所有副本和增量恢复数据,那写的逻辑会复杂非常多,比如 Ceph 使用 pg log 保证数据一致性。尽管 3FS 这种设计会导致写延迟,但是对于以读为主的 AI 应用场景,影响不大。

JuiceFS 利用对象存储作为数据存储解决方案,从而可享有对象存储带来的若干优势,如数据可靠性、一致性等。存储模块提供了一组用于对象操作的接口,包括 GET/PUT/HEAD/LIST 等,用户可以根据自己的需求对接具体的存储系统。比如不同云厂商的对象存储,也可以选择私有部署的对象存储比如 MinIO、Ceph RADOS 等系统。社区版 JuiceFS 提供本地缓存来应对 AI 场景下的带宽需求,JuiceFS 企业版使用分布式缓存满足更大的聚合读带宽的需求。

元数据模块

在 3FS 中,文件的属性以 KV 的形式存储在元数据服务中。该服务是一个无状态的高可用服务,依靠 FoundationDB 做支撑。FoundationDB 是 Apple 开源的优秀分布式 KV 数据库,具有很高的稳定性。FoundationDB 所有键值使用 Key 做全局排序,然后均匀拆分到不同的节点上。

为了优化 list 目录的效率,3FS 使用字符 “DENT” 前缀加父目录 inode 号和名字作为 dentry 的 Key。Inode 的 Key 是通过将 “INOD” 前缀与 inode ID 连接而构造的,其中 inode ID 采用小端字节序编码,以便将 inodes 分布到多个 FoundationDB 节点上。这个设计与 JuiceFS 使用的 TKV(Transactional Key-Value Database) 进行元数据服务的存储方式类似。

JuiceFS 社区版的元数据模块,与存储模块类似也提供一组操作元数据的接口,可以接入不同的元数据服务,比如 Redis,TiKV 等 KV 数据库,MySQL,PostgreSQL 等关系型数据库,也可以使用 FoundationDB。JuiceFS 企业版使用自研高性能元数据服务,可根据负载情况来平衡数据和热点操作,以避免大规模训练中元数据服务热点集中在某些节点的问题(比如因为频繁操作临近目录文件的元数据引起)。

客户端

3FS 的客户端除了提供 FUSE 操作外,还提供了一组 API 用于绕过 FUSE 直接操作数据,也就是 Native Client,接口的调用方式有点类似于 Linux AIO。这组 API 的作用是避免使用 FUSE 模块带来的数据拷贝,从而减少 I/O 延迟和对内存带宽的占用。下面将详细解析这组 API 如何实现用户进程与 FUSE 进程之间的零拷贝通信。

3FS 通过 hf3fs_iov 保存共享内存的大小,地址和其他一些属性,使用 IoRing 在两个进程间通信。

当用户调用接口,创建 hf3fs_iov 时,会在 /dev/shm 上分配内存,并创建一个指向这个共享内存的软链接,软链接的地址位于 /mount_point/3fs-virt/iovs/,这是个虚拟目录。3FS FUSE 进程收到创建软链接请求,并且发现它的地址位于上述虚拟目录后,就会根据软链接的名字解析出这块共享内存的相关参数,并将内存的地址注册到所有 RDMA 设备(除了 IORing )。ibv_reg_mr 返回的结果被存在 RDMABuf::Inner 数据结构中,用于后续发送 RDMA 请求。

同时,IORing 的内存也使用 hf3fs_iov 保存,只是在创建对应的软链接时,文件名中会有更多的 IORing 相关的信息。如果 FUSE 进程发现这个内存是用于创建 IORing,也会在它的进程内创建对应的 IORing。这样设置之后,用户进程和 FUSE 进程就可以访问相同的 IORing 了。

进程间协作方面,3FS 在 /mount_point/3fs-virt/iovs/ 目录中创建 3 个不同的虚拟文件用于共享 3 个不同优先级的提交信号量 (submit sem ),用户进程将请求放到 IORing 后使用这些信号量通知 FUSE 进程有新的请求。 IORing 尾部包含请求完成信号量,FUSE 进程通过调用 sem_post 通知用户进程 IORing 上有新的请求完成。以上整个机制确保了两个进程间的高效数据通信和操作同步。

3FS 的 FUSE 客户端实现了文件和目录的基本操作,而 JuiceFS FUSE 客户端的实现更加全面。比如,在 3FS 文件系统中文件的长度是最终一致的,这意味着在写的过程中用户可能访问到不正确的文件长度。而 JuiceFS 在每次成功上传对象后会立即更新文件长度。此外,JuiceFS 还提供了以下这些常用的高级文件系统功能:

  • 支持 BSD 锁(flock)和 POSIX 锁(fcntl)
  • 支持 file_copy_range 接口
  • 支持 readdirplus 接口
  • 支持 fallocate 接口

除了 FUSE 客户端,JuiceFS 还提供 Java SDK,S3 Gateway,CSI Driver 等接入方式。企业版还提供 Python SDK,Python SDK 将 JuiceFS 客户端在用户进程中运行,避免了通过 FUSE 导致的额外性能开销。具体见文档:Python SDK。

02 文件分布对比

3FS 文件分布

3FS 将每个文件分成固定长度的 chunk,每个 chunk 位于一个上文提到的链上( CRAQ 算法)。用户使用 3FS 提供的一个脚本,生成一个 chain table。然后将这个表提交到元数据服务。创建新文件时,系统会从表中选取特定数量的 chain (数量由 stripe 定义),并将这些 chain 的信息存入文件的元数据中。

因为 3FS 中的 chunk 是固定的,客户端只需要获取一次 inode 的 chain 信息,就可以根据文件 inode 和 I/O 请求 的 offset,length 计算出这个请求位于哪些 chunk 上,从而避免了每个 I/O 都从数据库查询的需求。可以通过 offset/chunk_size 得到 chunk 的索引。 而 chunk 所在的 chain 的索引就是 chunk_id%stripe。有了 chain 的索引就可以得到 chain 的详细信息(比如这个 chain 由哪些 target 组成)。然后,客户端根据路由信息将 I/O 请求发送到相应的存储服务。存储服务收到写请求后以 copy-on-write (COW)的方式将数据写入新的位置。原来的数据在引用数据清零前仍然是可读的。

为了应对数据不平衡问题,每个文件的第一个 chain 按照轮询( round roubin) 的方式选择。比如当 stripe 为 3 时,创建一个文件,其选择的 chain 为:chain0,chain1,chain2。那么下一个文件的 chain 为:chain1,chain2 和 chain3。系统会将选择的 3 个 chain 做随机排序,然后存储到元数据中。下图为 stripe 为 3 时一个文件的分布示例,chain 随机排序后的顺序是:1,3,2。

JuiceFS 文件分布

JuiceFS 按照 Chunk、Slice、Block 的规则进行数据块管理。每个 Chunk 的大小固定为 64M,主要用于优化数据的查找和定位。实际的文件写入操作则在 Slice 上执行,每个 Slice 代表一次连续的写入过程,属于特定的 Chunk,并且不会跨越 Chunk 的边界,因此长度不超过 64M。Chunk 和 Slice 主要是逻辑上的划分,而 Block(默认大小为 4M)则是物理存储的基本单位,用于在对象存储和磁盘缓存中实现数据的最终存储。更多细节可以参考官网介绍。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

JuiceFS 中的 Slice 是在他文件系统中不常见的一个结构。主要功能是记录文件的写入操作,并在对象存储中进行持久化。对象存储不支持原地文件修改,因此,JuiceFS 通过引入 Slice 结构允许更新文件内容,而无需重写整个文件。这与 Journal File System 有些类似,其中写入操作仅创建新对象,而不是覆盖现有对象。修改文件时,系统会创建新的 Slice,并在该 Slice 上传完毕后更新元数据,从而将文件内容指向新的 Slice。被覆盖的 Slice 内容随后通过异步压缩过程从对象存储中删除,导致在某些时刻对象存储的使用量会暂时超过文件系统实际使用量。

此外,JuiceFS 的所有 Slice 均为一次性写入,这减少了对底层对象存储一致性的依赖,并大大简化了缓存系统的复杂度,使数据一致性更易于保证。这种设计还为实现文件系统的零拷贝语义提供了便利,支持如 copy_file_range 和 clone 等操作。

03 3FS RPC (Remote Procedure Call) 框架

3FS 使用 RDMA 作为底层网络通信协议,目前 JuiceFS 尚未支持,下面对此做一些分析。

3FS 通过实现一个 RPC 框架,来完成对底层 IB 网络的操作。除了网络操作外,RPC 框架还提供序列化,小包合并等能力。因为 C++ 不具有反射能力,所以 3FS 还通过模版实现了一个反射库,用于序列化 RPC 使用的 request、response 等数据结构。需要被序列化的数据结构只需要使用特定的宏定义需要序列化的属性。RPC 调用都是异步完成的,所以序列化后的数据只能从堆上分配,等待调用完成后再释放。为了提高内存的分配和释放速度,分配对象都使用了缓存。3FS 的缓存有两部份组成,一个 TLS 队列和一个全局队列。 从 TLS 队列获取缓存时不需要加锁;当 TLS 缓存为空时就得加锁,从全局队列中获取缓存。所以在最优情况下,获取缓存是不需要加锁的。

与 I/O 请求的负载不同,缓存对象的内存都未注册到 RDMA 设备中。因此,当数据到达 IBSocket 后,会被拷贝到一个在 IB 设备注册过的缓冲区中。多个 RPC 请求可能被合并为一个 IB 请求发送到对端。下图为 FUSE Client 调用 Meta 服务的 RPC 过程。

04 特性对比

对比项3FSJuiceFS 社区版JuiceFS 企业版
元数据无状态元数据服务+FoundationDB独立数据库服务自研高性能分布式元数据引擎(可横向扩展)
数据存储自主管理使用对象存储使用对象存储
冗余保护多副本对象存储提供对象存储提供
数据缓存无缓存本地缓存自研高性能多副本分布式缓存
数据加密不支持支持支持
数据压缩不支持支持支持
配额管理不支持支持支持
网络协议RDMATCPTCP
快照不支持支持克隆支持克隆
POSIX ACL不支持支持支持
POSIX 兼容性少量子集完全兼容完全兼容
CSI 驱动没有官方支持支持支持
客户端FUSE + Native ClientPOSIX(FUSE)、Java SDK、S3 网关POSIX(FUSE)、Java SDK、S3 网关、Python SDK
多云镜像不支持不支持支持
跨云和跨区数据复制不支持不支持支持
主要维护者DeepSeekJuicedataJuicedata
开发语言C++, Rust (本地存储引擎)GoGo
开源协议MITApache License 2.0商业软件

05 总结

大规模 AI 训练中最主要的需求是高读带宽,为此 3FS 采用了性能优先的设计策略,将数据存储在高速磁盘上,并且用户需要自行管理底层数据存储。这种方法提升了性能,但成本较高,维护也更繁重。此外,为了充分发挥底层硬件的性能,其架构实现了客户端到网卡的零拷贝,利用共享内存和信号量减少 I/O 延迟和内存带宽占用。此外,通过带 TLS 的 I/O buffer pool 和合并网络请求,3FS 增强了小 I/O 和文件元数据操作的能力,并引入了性能更优的 RDMA 技术。我们将继续关注 3FS 在性能优化方面的进展,并探索如何将这些技术应用于我们的场景中。

JuiceFS 使用对象存储作为底层数据存储,用户因此可大幅降低存储成本并简化维护工作。为了满足 AI 场景的对读性能的需求,JuiceFS 企业版引入了分布式缓存、分布式元数据服务和 Python SDK,从而提高文件系统的性能和扩展能力,并同时兼顾低存储成本。在接下来发布的 v5.2 企业版中,在 TCP 网络中实现了零拷贝,进一步提升数据传输效率。

JuiceFS 提供完整的 POSIX 兼容性和成熟活跃的开源生态,适应更广泛的使用场景,并支持Kubernetes CSI,极大简化了云平台的部署和运维工作。此外,JuiceFS 还提供了 Quota、安全管理和数据灾备等多项企业级管理功能,让企业可以更便捷地在生产环境中部署和应用 JuiceFS。

希望这篇内容能够对你有一些帮助,如果有其他疑问欢迎加入 JuiceFS 社区与大家共同交流。

相关文章:

DeepSeek 3FS 与 JuiceFS:架构与特性比较

近期,DeepSeek 开源了其文件系统 Fire-Flyer File System (3FS),使得文件系统这一有着 70 多年历时的“古老”的技术,又获得了各方的关注。在 AI 业务中,企业需要处理大量的文本、图像、视频等非结构化数据,还需要应对…...

汽车PKE无钥匙进入系统一键启动系统定义与原理

汽车智能钥匙(PKE无钥匙进入系统)一键启动介绍 系统定义与原理 汽车无钥匙进入系统,简称PKE(Passive Keyless Entry),该系统采用了RFID无线射频技术和车辆身份编码识别系统,率先应用小型化、小…...

【深度学习与大模型基础】第6章-对角矩阵,对称矩阵,正交矩阵

一、对角矩阵 对角矩阵(Diagonal Matrix)是一种特殊的方阵,其非对角线上的元素均为零,只有对角线上的元素可能非零。具体来说,对于一个 nn的矩阵 A[],如果满足 则 AA 称为对角矩阵。对角矩阵通常表示为&am…...

go语言中切片的长度和容量详解

Go 语言中,切片(Slice) 是一种动态数组,它的核心特性由 长度(Length) 和 容量(Capacity) 共同定义。这两个概念是操作切片时的关键,理解它们的含义和区别能帮助你高效管理内存并避免常见错误。 一、长度(Length) 定义:切片的长度表示当前包含的实际元素个数,即可以…...

在Vue3中使用$router.push方法进行路由跳转时,如何传递多个路径参数?

在 Vue 3 里,你可以借助 $router.push 方法进行路由跳转,同时传递多个路径参数。下面为你详细介绍具体实现方式: 1. 路由配置 首先,要在路由配置中定义好需要的路径参数。示例如下: import { createRouter, createW…...

C语言学习笔记(第三部份)

说明:由于所有内容放在一个md文件中会非常卡顿,本文件将接续C_1.md文件的第三部分 整型存储和大小端 引例: int main(void) {// printf("%d\n", SnAdda(2, 5));// PrintDaffodilNum(10000);// PrintRhombus(3);int i 0;int arr[…...

软考 中级软件设计师 考点知识点笔记总结 day05

文章目录 4、栈和队列4.1、栈的定义4.2、队列定义 5、串、数组、矩阵和广义表5.1、串5.2、 数组5.3、稀疏矩阵5.4、广义表 4、栈和队列 4.1、栈的定义 线性表是具有相同数据类型的n个数据元素的有限序列, n为表厂。n0时 线性表是一个空表 L (a1,a2,a3…...

【Linux】system V消息队列,信号量

🔥个人主页:Quitecoder 🔥专栏:linux笔记仓 目录 01.消息队列System V 消息队列接口 02.信号量System V 信号量接口 03.OS对system V ipc的管理消息队列管理结构共享内存管理结构信号量管理结构 01.消息队列 消息队列提供了一个…...

【新能源汽车“心脏”赋能:三电系统研发、测试与应用匹配的恒压恒流源技术秘籍】

新能源汽车“心脏”赋能:三电系统研发、测试与应用匹配的恒压恒流源技术秘籍 在新能源汽车蓬勃发展的浪潮中,三电系统(电池、电机、电控)无疑是其核心驱动力。而恒压源与恒流源,作为电源管理的关键要素,在…...

在 Vue.js 中使用递归组件:轻松处理嵌套数据结构

在开发前端应用时,我们经常会遇到需要处理嵌套数据结构的场景,比如树形菜单、评论列表、文件夹结构等。Vue.js 提供了一种优雅的方式来解决这类问题——递归组件。通过递归组件,我们可以轻松地渲染嵌套数据,并保持代码的简洁和可维…...

飞腾2000+/64核加固服务器

在当今信息化高速发展的时代,数据中心作为信息技术的核心支撑,其稳定性、安全性和高效性成为了各行各业关注的焦点。特别是在国防、金融、电信等关键领域,对服务器的性能、可靠性和安全性提出了前所未有的高要求。正是在这样的背景下&#xf…...

AutoMQ x OSS 的 Iceberg 数据入湖的最佳实践

背景 在数字化转型进程中,用户交互行为产生的多维度数据已成为企业的重要战略资产。以短视频平台为例,基于用户点赞事件的实时推荐算法能显著提升用户活跃度和平台粘性。这类实时数据主要通过 Apache Kafka 流处理平台进行传输,通过其扇出&a…...

深度学习大模型补充知识点

文章目录 VIT用途处理方法与CNN区别 多模态LLM:大语言模型预训练指令微调强化学习 总结 VIT ViT(Vision Transformer) 首次将 Transformer架构成功应用于计算机视觉领域(尤其是图像分类任务)。传统视觉任务主要依赖卷…...

定义模型生成数据表

1. 数据库配置 js import { Sequelize, DataTypes } from sequelize; // 创建一个 Sequelize 实例,连接到 SQLite 数据库。 export const sequelize new Sequelize(test, sa, "123456", { host: localhost, dialect: sqlite, storage: ./blog.db })…...

C++与C的基本不同

文章目录 变量定义规则1. 基本语法2. 初始化3. 作用域4. 存储类别 函数定义规则1. 基本语法2. 函数声明和定义3. 默认参数4. 内联函数 解析输出流void BluetoothA2DPSink::start(const char* name)class BluetoothA2DPSink : public BluetoothA2DPCommon C是在C语言基础上发展而…...

React19源码系列之createRoot的执行流程是怎么的?

2024年12月5日,react发布了react19版本。后面一段时间都将学习它的源码,并着手记录。 react官网:react19新特性 https://react.dev/blog/2024/12/05/react-19 在用vite创建react项目的使用,main.tsx主文件都会有以下代码。 //i…...

【CXX-Qt】1.5 使用CMake构建

在本示例中,我们将演示如何使用CMake将CXX-Qt代码集成到C应用程序中。Cargo将CXX-Qt代码构建为静态库,然后CMake将其链接到C可执行文件中。 我们首先需要修改项目结构,以分离项目的不同部分。 tutorial cpp qml rust将Rust项目移动到rust文…...

前端面试项目拷打

Axios相关 1.在Axios二次封装时,具体封装了哪些内容,如何处理请求拦截和响应拦截? axios二次封装的目的:为了统一处理请求和响应拦截器、错误处理、请求超时、请求头配置等,提高代码可维护性和复用性。 首先创建axios…...

“Ubuntu禁止root用户通过SSH直接登录”问题的解决

目录 1 前言 2 问题的解决 2.1 修改sshd_config文件 2.2 重启 SSH 服务 1 前言 最近在做毕设的时候,由于使用普通用户,在MobaXterm的图形界面上,无法正常查看/root文件夹内容,如下图所示: 于是我就想直接想用oot…...

Kafka的零拷贝

Kafka的零拷贝(Zero-Copy)技术是其实现高吞吐量的关键优化之一,主要通过减少数据在内核空间和用户空间之间的冗余复制及上下文切换来提升性能。以下是其核心要点: 1. 传统数据拷贝的问题 多次复制:传统文件传输需经历…...

《大语言模型》学习笔记(三)

GPT系列模型的技术演变 2022 年11月底,OpenAI推出了基于大语言模型的在线对话应用—ChatGPT。由于具备出色的人机对话能力和任务解决能力,ChatGPT一经发布就引发了全社会对于大语言模型的广泛关注,众多的大语言模型应运而生,并且…...

华为OD机试 - 最长回文字符串 - 贪心算法(Java 2024 E卷 100分)

题目描述 如果一个字符串正读和反读都一样(大小写敏感),则称之为一个「回文串」。例如: level 是一个「回文串」,因为它的正读和反读都是 level。art 不是一个「回文串」,因为它的反读 tra 与正读不同。Level 不是一个「回文串」,因为它的反读 leveL 与正读不同(因大小…...

K8S-etcd服务无法启动问题排查

一、环境、版本信息说明 k8s:v1.19.16 etcdctl version: 3.5.1 3台etcd(10.xxx.xx.129、10.xxx.xx.130、10.xxx.xx.131)组成的集群。 二、问题根因 129节点的etcd数据与其他两台数据不一致,集群一致性校验出错导致无法加入集…...

基于WebRTC的嵌入式音视频通话SDK:EasyRTC跨平台兼容性技术架构实时通信的底层实现

EasyRTC的核心架构围绕WebRTC技术构建,同时通过扩展信令服务、媒体服务器和NAT穿透机制,解决了WebRTC在实际部署中的痛点。其架构可以分为以下几个核心模块: 1)WebRTC基础层 媒体捕获与处理:通过getUserMediaAPI获取…...

SpringBoot-已添加并下载的依赖,reload和mvn clean 后还是提示找不到jar包问题

背景: 添加spring-jdbc依赖时,原来是指定版本的,担心版本冲突,就改成依赖托管,悲剧的是反复reload和mvn clean,import到类的该包一直标红,提示jar包找不到。。。 解决方案: Idea左上…...

HTML5扫雷游戏开发实战

HTML5扫雷游戏开发实战 这里写目录标题 HTML5扫雷游戏开发实战项目介绍技术栈项目架构1. 游戏界面设计2. 核心类设计 核心功能实现1. 游戏初始化2. 地雷布置算法3. 数字计算逻辑4. 扫雷功能实现 性能优化1. DOM操作优化2. 算法优化 项目亮点技术难点突破1. 首次点击保护2. 连锁…...

机器学习——数据清洗(缺失值处理、异常值处理、数据标准化)

数据清洗(缺失值处理、异常值处理、数据标准化) 在数据处理与分析流程中,数据清洗占据着极为关键的地位。原始数据往往充斥着各种问题,如缺失值、异常值,且数据的尺度和分布也可能存在差异,这些问题会严重影响后续数据分析和机器学习模型的准确性与性能。因此,有效的数据…...

【综述】An Introduction to Vision-Language Modeling【一】

介绍 发表在预印本上的综述,长达76页,其中正文46页。 来自Meta 在Meta工作期间完成 ‡蒙特利尔大学, Mila ♡麦吉尔大学, Mila †多伦多大学 ♠卡内基梅隆大学 ♣麻省理工学院 ∧纽约大学 △加州大学伯克利分校 ▽马里兰大学 ♢阿卜杜拉国王科技大学 •…...

MySQL常用函数详解及SQL代码示例

MySQL常用函数详解及SQL代码示例 引言当前日期和时间函数字符串函数数学函数聚合函数结论 引言 MySQL作为一种广泛使用的关系型数据库管理系统,提供了丰富的内置函数来简化数据查询、处理和转换。掌握这些函数可以大大提高数据库操作的效率和准确性。本文将详细介绍…...

Unity教程(二十二)技能系统 分身技能

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…...

‌RTSPtoWeb, 一个将rtsp转换成webrtc的开源项目

RTSPtoWeb是一个开源项目,旨在将RTSP流转换为可在现代web浏览器中消费的格式,如Media Source Extensions (MSE)、WebRtc或HLS。该项目完全使用golang编写,不依赖于ffmpeg或gstreamer,确保了高效的性能和轻量…...

AIAgent有哪些不错的开源平台

AIAgent领域有许多优秀的开源平台和框架,以下是一些值得推荐的开源平台: AutoGPT AutoGPT 是一个基于 OpenAI 的 GPT-4 和 GPT-3.5 大型语言模型的开源框架,能够根据用户给定的目标自动生成所需提示,并利用多种工具 API 执行多步骤…...

Java---JavaSpringMVC解析(1)

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC" 1.MVC MVC是Model View Controller的缩写&#…...

Vector 的模拟实现:从基础到高级

文章目录 1. 引言2. vector的核心设计3. vector的常用接口介绍3.1 构造函数和析构函数3.1.1 默认构造函数3.1.2 带初始容量的构造函数3.1.3 析构函数 3.2 拷贝构造函数和拷贝赋值运算符3.2.1 拷贝构造函数3.2.2 拷贝赋值运算符 3.5 数组长度调整和动态扩容3.5.1 调整大小&#…...

【大模型科普】大模型:人工智能的前沿(一文读懂大模型)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能(AI)通过算法模拟人类智能,利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络(如ChatGPT&…...

[漏洞修复]用yum update修openssh漏洞

[漏洞修复]用yum update修openssh漏洞 1. 需求2. 更新Yum仓库2.1 生成本地仓库2.2 生成内网仓库2.3 将Openssh的包更新到仓库 3. 客户端升级3.1 客户端repo文件配置3.2 升级Openssh3.3 升级后的确认 1. 需求 最近经常有朋友问Openssh 漏洞修复的问题,我也在自己的gitee仓库里更…...

[RH342]iscsi配置与排错

[RH342]iscsi配置与排错 1. 服务端配置1.1 安装targetcli1.2 准备磁盘1.3 服务端配置1.4 防火墙配置 2. 客户端配置2.1 安装客户端软件2.2 配置客户端2.3 连接登录服务端2.4 挂载使用 3. 安全验证扩展3.1 服务端3.2 客户端 4. 常见的排错点4.1 服务端常见错误4.2 客户端常见错误…...

Nginx 代理访问一个 Web 界面时缺少内容

1. 资源路径问题 Web 页面中的静态资源(如图片、CSS、JavaScript 文件)可能使用了相对路径或绝对路径,而这些路径在代理后无法正确加载。 解决方法: 检查资源路径:打开浏览器的开发者工具(按 F12&#xf…...

HOVER:人形机器人的多功能神经网络全身控制器

编辑:陈萍萍的公主一点人工一点智能 HOVER:人形机器人的多功能神经网络全身控制器HOVER通过策略蒸馏和统一命令空间设计,为人形机器人提供了通用、高效的全身控制框架。https://mp.weixin.qq.com/s/R1cw47I4BOi2UfF_m-KzWg 01 介绍 1.1 摘…...

SEO新手基础优化三步法

内容概要 在网站优化的初始阶段,新手常因缺乏系统性认知而陷入技术细节的误区。本文以“三步法”为核心框架,系统梳理从关键词定位到内容布局、再到外链构建的完整优化链路。通过拆解搜索引擎工作原理,重点阐明基础操作中容易被忽视的底层逻…...

遨游科普:三防平板是哪三防?有哪些应用场景?

在工业智能化与数字化转型的浪潮中,电子设备的耐用性和环境适应性成为关键需求。普通消费级平板电脑虽然功能强大,但在极端环境下往往“水土不服”。而三防平板凭借其独特的防护性能,正逐步成为“危、急、特”场景的核心工具。 AORO P300 Ult…...

Etcd 服务搭建

💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Etcd 服务搭建预编译的二进制文件安装下载 etcd 的…...

C++《红黑树》

在之前的篇章当中我们已经了解了基于二叉搜索树的AVL树,那么接下来在本篇当中将继续来学习另一种基于二叉搜索树的树状结构——红黑树,在此和之前学习AVL树类似还是通过先了解红黑树是什么以及红黑树的结构特点,接下来在试着实现红黑树的结构…...

Axios 请求取消:从原理到实践

Axios 请求取消:从原理到实践 在现代前端开发中,网络请求是不可或缺的一部分。Axios 是一个基于 Promise 的 HTTP 客户端,广泛应用于浏览器和 Node.js 环境中。然而,在某些场景下,我们可能需要取消正在进行的请求&…...

【css酷炫效果】纯CSS实现照片堆叠效果

【css酷炫效果】纯CSS实现照片堆叠效果 缘创作背景html结构css样式完整代码基础版进阶版(增加鼠标悬停查看) 效果图 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u011561335/90492022 缘 创作随缘,不定时更新。 创…...

论文精度:Transformers without Normalization

前言 论文题目:Transformers without Normalization 作者:Jiachen Zhu 1,2 , Xinlei Chen 1 , Kaiming He 3 , Yann LeCun 1,2 , Zhuang Liu 1,4,† 论文地址:https://arxiv.org/pdf/2503.10282 摘要 这篇论文探讨了现代神经网络中广泛使用的归一化层是否是必不可少的。…...

基于香橙派 KunpengPro学习CANN(3)——pytorch 模型迁移

通用模型迁移适配可以分为四个阶段:迁移分析、迁移适配、精度调试与性能调优。 迁移分析 迁移支持度分析: 准备NPU环境,获取模型的源码、权重和数据集等文件;使用迁移分析工具采集目标网络中的模型/算子清单,识别第三方…...

微软远程桌面即将下架?Splashtop:更稳、更快、更安全的 RDP 替代方案

近日,Windows 官方博客宣布:将于2025年5月27日起,在 Windows 10 和 Windows 11 应用商店中下架“Microsoft 远程桌面”应用,建议用户迁移至新的 Windows App。这一变动引发了广大用户对远程访问解决方案的关注。作为全球领先的远程…...

【Python】Python与算法有应用关系吗?

李升伟 整理 是的,Python与算法有着密切的应用关系。Python作为一种高级编程语言,因其简洁的语法和强大的库支持,被广泛应用于算法设计、实现和应用中。以下是Python与算法之间的一些主要应用关系: 1. 算法学习与教学&#xff1…...

js,html,css,vuejs手搓级联单选

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>级联选择器</title><script src"h…...