深度解读DeepSeek:开源周(Open Source Week)技术解读
深度解读DeepSeek:开源周(Open Source Week)技术解读
深度解读DeepSeek:源码解读 DeepSeek-V3
深度解读DeepSeek:技术原理
深度解读DeepSeek:发展历程
文章目录
- 一、开源内容概览
- Day1:FlashMLA
- Day2:DeepEP
- Day3:DeepGEMM
- Day4:DualPipe & EPLB
- Day5:3FS
- 二、技术突破与创新
- 三、技术原理
- DeepEP
2025年2月24日至28日,DeepSeek通过连续五天的“开源周”活动,向全球开源了8个核心项目,覆盖AI训练、推理、并行计算等多个关键领域。
一、开源内容概览
DeepSeek 开源周共发布 五个核心项目 及多个辅助工具,涵盖 AI 开发的三大核心领域:计算优化、通信效率、存储加速。以下是各项目的核心价值:
Day1:FlashMLA
功能:针对 NVIDIA Hopper GPU 优化的多头线性注意力解码内核,支持可变长度序列处理。
突破:在 H800 GPU 上实现 580 TFLOPS 计算性能 和 3000 GB/s 内存带宽,推理效率提升 2-3 倍,适用于实时翻译、长文本处理等场景18。
意义:打破大厂对高效推理工具的垄断,降低开发者使用门槛,推动边缘设备部署。
Day2:DeepEP
功能:专为混合专家模型(MoE)设计的通信库,优化节点间数据分发与合并。
突破:通过低延迟内核和通信-计算重叠技术,实现 训练速度提升 3 倍、延迟降低 5 倍,支持 FP8 低精度通信。
意义:挑战英伟达 NCCL 生态,打破硬件与软件耦合的技术壁垒。
Day3:DeepGEMM
功能:基于 FP8 的高效矩阵乘法库,专为 MoE 模型优化。
突破:代码仅 300 行,通过即时编译(JIT)和 CUDA 核心双层累加技术,实现 1.1-2.7 倍加速,最高性能达 1350 TFLOPS。
意义:推动低精度计算普及,降低千亿参数模型部署成本,成为“AI 工业革命的基石”。
Day4:DualPipe & EPLB
功能:创新双向流水线并行算法(DualPipe)与动态负载均衡工具(EPLB)。
突破:通过任务交叉排布和专家模型动态复制,减少 GPU 空闲时间,优化资源利用率。
意义:类比“泰勒管理制”和“福特流水线”,重构 AI 训练流程,提升工业级效率。
Day5:3FS
功能:高性能分布式文件系统,支持 RDMA 网络和 SSD 存储。
突破:实现 6.6 TB/s 读取速度,加速海量数据训练与推理阶段的向量搜索。
意义:补全 AI 基础设施的最后一块拼图,解决存储瓶颈问题。
二、技术突破与创新
DeepSeek 开源周的核心技术突破体现在以下三方面:
-
硬件性能压榨
-
GPU 极限优化:如 FlashMLA 将 H800 GPU 的内存带宽利用率提升至理论极限的 90%,DeepGEMM 通过直接编写机器指令绕过 CUDA 生态限制。
-
低精度计算革命:FP8 的广泛应用(如 DeepGEMM)在保证精度损失 <0.5% 的前提下,将存储和算力需求降低至 FP32 的 1/4。
-
-
并行计算重构
- 通信与计算重叠:DeepEP 通过钩子机制实现通信与计算并行,减少 GPU 空闲时间。
- 动态负载均衡:EPLB 根据专家模型调用频率动态调整任务分配,避免 GPU 资源浪费。
-
开源生态挑战
- 对抗英伟达垄断:DeepGEMM 和 DeepEP 直接挑战 CUDA 和 NCCL 生态,推动国产软硬件适配。
- 透明化技术黑箱:公开训练框架分析数据,推动行业技术共享与协作。
三、技术原理
DeepEP
网络知识扫盲:GPU通信互联技术介绍
MoE介绍:深度解读DeepSeek
DeepEP是由DeepSeek团队推出的首个专为混合专家模型(MoE)设计的专家并行(EP)通信库。主要解决MoE模型在分布式训练和推理中的通信瓶颈问题,通过优化数据传输和资源调度,实现“降本增效”。
-
高效的全对全通信(All-to-All):支持节点内(NVLink)和节点间(RDMA)的高带宽通信,优化数据在不同专家子网络间的快速交换。
-
动态资源调控:基于群组限制门控算法(group-limited gating),动态分配GPU计算单元(SM)数量,任务多时增加资源,任务少时降低功耗,减少资源浪费。支持低精度运算:原生支持FP8格式,减少内存占用并加速计算,适用于大规模分布式训练
传统的基于NVSwitch的All-to-All通信结构:
通信内核(通信SM控制代码)的实现与MoE门控算法和集群网络拓扑是按照软硬件协同的思路来进行设计的。具体来说,在集群中,跨节点GPU与IB完全互连,节点内(单台服务器内)通信通过NVLink完成。NVLink 提供 160 GB/s 的带宽,约是IB的 3.2 倍 (50 GB/s)。
之前的MoE普遍使用NCCL的p2p通信进行all-to-all,结果纷纷吐槽all-to-all性能差,带宽利用率低。但是,很少有人真的去分析all-to-all性能差的原因,并尝试去改进。而DeepEP的出现,可以说彻底解决了all-to-all打不满带宽的问题。DeepEP直接放弃了NCCL,转而使用更底层的NVSHMEM进行通信,结果基本用满了NVLink和IB的带宽。
ps:NCCL(NVIDIA Collective Communications Library)是英伟达(NVIDIA)开发的一个专为多GPU和多节点通信优化的库,主要用于加速分布式深度学习训练和科学计算中的集体通信操作。,支持以下关键操作:
- All-Reduce:将多个GPU上的数据汇总(如梯度求和)并分发回所有GPU。
- Broadcast:将单个GPU的数据广播到其他所有GPU。
- All-Gather:将每个GPU的数据收集到所有GPU。
- Reduce-Scatter:将数据汇总后按块分发给各个GPU。
- Point-to-Point:单GPU到单GPU的直接数据传输。
为了有效利用IB和NVLink的不同带宽,DeepSeek将每个Token(词元)的分发限制为最多4 个节点,从而减少IB流量限制的影响。 对于每个Token,在做节点间路由决策时,先通过IB传输到目标节点上具有相同节点内索引的GPU;到达目标节点后,再通过NVLink 转发到托管目标专家的特定GPU。通过这种方式,通过IB和NVLink的通信重叠,平均每个Token可以在每个节点选择3.2名专家,而不会产生额外的NVLink开销。
实际算法中,V3/R1只通过路由选择了8个专家,但在保持相同通信成本的情况下,该架构可以扩展到最多13 个专家(4 个节点x3.2个专家/节点)。
DeepSeek还采用了warp(线程束)专用化技术,将20个SM划分为10个通信信道。
1)在调度过程中,(a)IB 发送、(b)IB 到NVLink 转发、(c) NVLink 接收由相应的warp处理。分配给每个通信任务的warp数量会根据所有SM的实际工作负载动态调整。
2)在合并过程中,(a) NVLink 发送、(b)NVLink到IB的转发和累积、(c)IB接收和累积也由动态调整的warp处理。
3)dispatching 和combining kernel都与计算流重叠,采用定制的PTX(Parallel Thread Execution)指令以自动调整通信块大小,减少了对L2缓存的使用和对其他 SM 的干扰。
DeepEP主要实现了EP通信过程(dispatch分发+combine聚合),涉及两种实现模式:
- Normal kernel模式:Nvlink+RDMA混合模式,用于训练/推理prefill阶段
- Low-latency kernel模式:IBGDA+纯RDMA模式,用于推理decode阶段
性能测试结果:
https://github.com/deepseek-ai/DeepEP
下面我们沿着README.md里的例子,分析一下DeepEP究竟是如何实现的。
初始化:
_buffer = Buffer(group, num_nvl_bytes, num_rdma_bytes)
Buffer是DeepEP的核心数据结构,位于deep_ep/buffer.py。
class Buffer:"""专家并行(EP)通信核心缓冲区,专为混合专家(MoE)模型设计,支持以下通信模式:1. 节点内高吞吐量all-to-all通信(dispatch和combine操作,使用NVLink)2. 跨节点高吞吐量all-to-all通信(使用RDMA,不支持原子操作AR)3. 低延迟all-to-all通信(使用RDMA,支持原子操作AR)主要功能:- 管理节点内(NVLink)和跨节点(RDMA)的通信缓冲区- 提供高效的dispatch(分发)和combine(聚合)操作- 支持通信-计算重叠优化属性说明:num_sms: 用于高性能计算内核的流式多处理器(Streaming Multiprocessors)数量(SM是GPU的计算单元,影响并行计算能力)rank: 当前进程在通信组中的唯一标识(本地rank号),范围[0, group_size-1]例如:在4机8卡训练中,rank 0-7对应机器1的8个GPUgroup_size: 通信组中的总进程数(即world size)group: PyTorch的进程组(ProcessGroup)对象,管理分布式通信上下文num_nvl_bytes: 节点内通过NVLink通信的缓冲区大小(字节)NVLink是NVIDIA GPU间的高速互联技术num_rdma_bytes: 跨节点RDMA通信的缓冲区大小(字节)(在低延迟模式下也用于节点内通信)RDMA是远程直接内存访问技术,可绕过CPUruntime: 底层C++运行时对象,实际执行通信操作的核心组件"""
Dispatch(分发):
- dispatch_forward:前向传播,将输入数据(x)根据topk_idx和topk_weights分配到不同的专家(可能位于不同GPU/进程)。
- dispatch_backward:反向传播,通过combine操作合并来自各节点的梯度(反向传播的Dispatch对应正向Combine的逆过程)。
Combine(合并):
- combine_forward:前向传播,聚合各专家处理后的结果,生成最终输出。
- combine_backward:反向传播,通过dispatch操作将梯度分发回各节点(反向传播的Combine对应正向Dispatch的逆过程)。
接下来我们看下dispatch_forward 过程:
def dispatch_forward(x: Union[torch.Tensor, Tuple[torch.Tensor, torch.Tensor]],topk_idx: torch.Tensor, topk_weights: torch.Tensor,num_experts: int, previous_event: Optional[EventOverlap] = None
) -> Tuple[Union[torch.Tensor, Tuple[torch.Tensor, torch.Tensor]], # recv_xtorch.Tensor, # recv_topk_idxtorch.Tensor, # recv_topk_weightsList, # num_recv_tokens_per_expert_listTuple, # handle (通信句柄,用于后续操作)EventOverlap # event (CUDA事件,用于同步)
]:"""MoE(混合专家)模型的前向分发(dispatch)操作。将输入数据根据topk索引和权重分发到不同的专家(可能位于不同GPU/进程)。Args:x: 输入数据,可以是单个张量或包含数据和门控值的元组。topk_idx: [num_tokens, top_k] 形状的张量,表示每个token选择的topk专家索引。topk_weights: [num_tokens, top_k] 形状的张量,对应topk专家的权重。num_experts: 专家总数(用于确定分发目标范围)。previous_event: 可选的CUDA事件,用于建立操作间的依赖关系(实现通信-计算重叠)。Returns:recv_x: 接收到的数据(来自其他进程的专家结果)。recv_topk_idx: 接收到的专家索引(可能与本地索引不同)。recv_topk_weights: 接收到的专家权重。num_recv_tokens_per_expert_list: 每个专家接收到的token数量统计列表。handle: 通信句柄,用于后续反向传播(combine操作)。event: CUDA事件,用于同步通信完成状态。"""global _buffer # 使用全局通信缓冲区# === 步骤1: 计算分发布局 ===# 确定每个rank/专家需要处理的token数量及通信策略# 返回值:# - num_tokens_per_rank: 每个进程接收的token总数# - num_tokens_per_rdma_rank: 通过RDMA通信的token数(跨节点)# - num_tokens_per_expert: 每个专家处理的token数# - is_token_in_rank: 标记token是否应由当前rank处理# - updated_event: 更新后的CUDA事件(包含新依赖)num_tokens_per_rank, num_tokens_per_rdma_rank, num_tokens_per_expert, is_token_in_rank, previous_event = \_buffer.get_dispatch_layout(topk_idx, num_experts,previous_event=previous_event, # 继承事件依赖async_finish=True, # 异步执行allocate_on_comm_stream=previous_event is not None # 内存分配绑定到通信流)# === 步骤2: 执行MoE分发 ===# 实际的数据分发操作(可能涉及跨GPU/NVLink或跨节点/RDMA通信)# 注意:# - 此操作会阻塞CPU直到GPU完成,因此不兼容CUDA Graph# - 使用async_finish=True实现异步通信recv_x, recv_topk_idx, recv_topk_weights, num_recv_tokens_per_expert_list, handle, event = \_buffer.dispatch(x,topk_idx=topk_idx,topk_weights=topk_weights,num_tokens_per_rank=num_tokens_per_rank, # 布局计算结果num_tokens_per_rdma_rank=num_tokens_per_rdma_rank,is_token_in_rank=is_token_in_rank,num_tokens_per_expert=num_tokens_per_expert,previous_event=previous_event, # 确保在依赖事件完成后执行async_finish=True, # 异步通信allocate_on_comm_stream=True # 内存分配在通信流执行(避免阻塞计算流))# 返回结果及通信元信息(用于后续操作和反向传播)return recv_x, recv_topk_idx, recv_topk_weights, num_recv_tokens_per_expert_list, handle, event
我们来看其中两个具体的函数:
- get_dispatch_layout:
布局计算,确定分发策略(如每个进程处理的Token数量)
根据本地的topk_idx,来计算本地要发往每个rank和每个expert的token数量。其内部使用了GPU来加速计算,具体的kernel代码我们略过。 - dispatch:
数据分发,将输入数据分发到目标进程
如果需要机间通信,则调用internode_dispatch。因为DeepEP主要就是对机间通信进行了很大的优化,因此我们来看其内部是怎么实现的。
Buffer的 self.internode_dispatch直接调用了self.runtime.internode_dispatch,代码位于csrc/deep_ep.cpp
std::tuple<torch::Tensor, ...>
Buffer::internode_dispatch(const torch::Tensor& x, ...) {bool cached_mode = cached_rank_prefix_matrix.has_value();// 1个channel对应2个SMconst int num_channels = config.num_sms / 2;// 设置comm_stream// Allocate all tensors on comm stream if set// NOTES: do not allocate tensors upfront!auto compute_stream = at::cuda::getCurrentCUDAStream();if (allocate_on_comm_stream) {EP_HOST_ASSERT(previous_event.has_value() and async);at::cuda::setCurrentCUDAStream(comm_stream);}// 等待前置任务完成// Wait previous tasks to be finishedif (previous_event.has_value()) {stream_wait(comm_stream, previous_event.value());} else {stream_wait(comm_stream, compute_stream);}if (cached_mode) {// 如果之前进行过dispatch,则可以重用之前的结果internode::cached_notify(...);}else {// 否则,需要进行计算internode::notify_dispatch(...);}// 等待notify_dispatch完成,正式进行dispatchinternode::dispatch(...);
}
notify_dispatch在使用NVSHMEM在所有rank之间进行通信,计算互相发送的token数量以及负责的token区域,具体包括如下内容:
rdma_channel_prefix_matrix:形状(num_rdma_ranks, num_channels),每个channel要发往每个RDMA节点token数量的前缀和
recv_rdma_rank_prefix_sum:形状(num_rdma_ranks),每个RDMA节点要接收的token数量
gbl_channel_prefix_matrix:形状(num_ranks, num_channels),每个channel要发往每个GPU的token数量的前缀和
recv_gbl_rank_prefix_sum:形状(num_ranks),每个GPU要接收的token数量
moe_recv_counter:int,总共要接收的token数量
moe_recv_expert_counter:int[NUM_MAX_LOCAL_EXPERTS],每个本地的expert要接收的token数量
然后,创建接收数据的tensor。最后,正式进行dispatch。dispatch的核心代码位于csrc/kernels/internode.cu,由于代码非常长,我们这里用文字来讲解它的流程。
在MoE里,一个token可能会发往多个GPU,这些GPU可能位于多个节点上(Deepseek-V3规定了一个token最多发往4个节点)。对于一个token,它首先经过rdma channel,从本地传输到所有的远端节点上编号相同的GPU。然后再经过nvl_channel,传输远端节点中所有的目标GPU上。
DeepEP使用多个channel发送数据。DeepEP将每个GPU上的数据划分为num_channels个连续的段,每一段用一个channel发送。其中每个channel包含一个rdma_channel和一个nvl_channel。rdma_channel和nvl_channel本质上都是环形队列。
下面这张图展示了整体的工作流程,注意:为了方便,这里只展示了一个token发往一个目标GPU的过程。实际上,每个token至多发往4个dst rdma rank,8个dst nvl rank。图中的黄框代表GPU,实线代表数据流经的路径,虚线代表控制信息。
参考:
https://blog.csdn.net/bit_mike/article/details/145566512
https://www.cnblogs.com/CQzhangyu/p/18741625
相关文章:
深度解读DeepSeek:开源周(Open Source Week)技术解读
深度解读DeepSeek:开源周(Open Source Week)技术解读 深度解读DeepSeek:源码解读 DeepSeek-V3 深度解读DeepSeek:技术原理 深度解读DeepSeek:发展历程 文章目录 一、开源内容概览Day1:FlashMLAD…...
【算法】十大排序算法(含时间复杂度、核心思想)
以下是 **十大经典排序算法** 的时间复杂度、空间复杂度及稳定性总结,适用于面试快速回顾:排序算法对比表 排序算法最佳时间复杂度平均时间复杂度最差时间复杂度空间复杂度稳定性核心思想冒泡排序O(n)O(n)O(n)O(1)稳定相邻元素交换,大数沉底…...
TCP传输---计算机网络
TCP结构 源端口和目标端口:标识通信的应用程序。序列号:标记发送的数据段的顺序序号。确认号 ( ACK):确认接收到的数据序号。标志位:控制连接状态,包括 SYN(同步)、ACK(确认…...
创建vue2项目
1、前往 Node.js 官网下载并安装 Node.js,安装完成后,npm 会随之安装。确认 Node.js 和 npm 是否成功安装,可以在命令行中运行以下命令检查版本: node -v npm -v 运行结果:(如下,表示node和n…...
从投机到可持续发展:ETHDenver 2025 的关键启示!
ETHDenver 2025 重点讨论了 Web3 向可持续发展转型,特别强调了人才培养、去中心化治理和激励机制的紧密结合。Polkadot 一直以来的长期观点也进一步支持了行业从投机转向长期、社区驱动增长的趋势。随着 ETHDenver 2025 会议的的落幕,Polkadot 生态中的贡…...
WPS宏开发手册——使用、工程、模块介绍
目录 系列文章前言1、开始1.1、宏编辑器使用步骤1.2、工程1.3、工程 系列文章 使用、工程、模块介绍 JSA语法 第三篇练习练习题,持续更新中… 前言 如果你是开发人员,那么wps宏开发对你来说手拿把切。反之还挺吃力,需要嘻嘻…...
操作系统为ubantu的服务器上部署nginx软件基础步骤总结
今天在这里,我们总结一下ubantu的服务器上部署nginx软件,请按照以下步骤进行安装: 1、更新包列表: 首先更新你系统中的可用软件包列表,以确保你可以安装最新版本。 sudo apt update2、 Ubuntu上更新已安装软件包&…...
批量给 PPT 文档添加或删除保护,批量设置打开密码和只读密码
为了保护保护档的安全,我们经常会给 PPT 文档添加打开密码或者只读密码保护。有些场景下,我们也可能会碰到需要删除 PPT 文档的打开密码或者只读密码的需求。今天就给大家介绍一种方法可以一次性批量给多个 PPT 文档添加打开密码或者只读密码保护&#x…...
Elasticsearch 中的数据分片问题
Elasticsearch 分片机制 Elasticsearch 在存储数据时采用 分片(Shard)机制,以提高性能和可扩展性。它索引中的数据被划分成多个 主分片(Primary Shard) 和 副本分片(Replica Shard),…...
如何在IPhone 16Pro上运行python文件?
在 iPhone 16 Pro 上运行 Python 文件需要借助第三方工具或远程服务,以下是具体实现方法和步骤: 一、本地运行方案(无需越狱) 使用 Python 编程类 App 以下应用可在 App Store 下载,支持直接在 iPhone 上编写并运行 …...
Xinference安装、使用详细笔记
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Xinference安装、使用详细笔记 支持推理引擎安装Xinference启动Xinference关于模型的推理引擎运行 qwen2.5-instruct管理模型官方详细文档:具体使用:对…...
NAT 模式
使用LVS的 NAT 模式实现 3 台RS的轮询访问。IP地址和主机自己规划。 1.节点规划 主机角色系统网络IPclientclientredhat 9.5仅主机192.168.180.100/24lvslvsredhat 9.5仅主机 NAT192.168.180.200/24 VIP 192.168.72.8/24 DIPnginxrs1redhat 9.5NAT192.168.226.7/24nginxrs2r…...
【中间件】Rabbit离线部署操作
准备安装包: 1.rabbitmq-server-4.0.7-1.el8.noarch.rpm 2.erlang-26.2.5.4-1.el9.x86_64.rpm 3.socat-1.7.4.1-6.el9.x86_64.rpm 操作步骤: 1.上传将RabbitMQ文件夹上传至服务器的home中 2.先安装erlang服务,顺序执行以下命令 设置服务的S…...
thinkphp漏洞再现
Thinkphp5x远程命令执行及getshell 1、开环境 2、使用工具攻击 开启工具 输入地址,点击漏洞检测 存在漏洞之后,选择漏洞,执行命令 3、也可以执行远程命令 执行命令 ?sindex/think\app/invokefunction&functioncall_user_func_array&…...
a-date-picker 格式化日期格式 YYYY-MM-DD HH:mm:ss
<template><a-range-pickerv-model:value"dateRange":show-time"{ format: HH:mm:ss, // 时间部分格式defaultValue: [moment(00:00:00, HH:mm:ss), moment(23:59:59, HH:mm:ss)] // 默认时间范围}"format"YYYY-MM-DD HH:mm:ss" // 整体…...
【前端】在<el-form>里循环插入list内容
这里的list为日志list【logList】 <el-row v-if"logList && logList.length > 0" style"display: flex; flex-direction: column; align-items: center;"><el-rowv-for"(log, index) in logList" :key"index" s…...
Spring Boot 一个接口实现任意表的 Excel 导入导出
Java的web开发需要excel的导入导出工具,所以需要一定的工具类实现,如果是使用easypoi、Hutool导入导出excel,会非常的损耗内存,因此可以尝试使用easyexcel解决大数据量的数据的导入导出,且可以通过Java8的函数式编程解…...
华为交换相关
端口模式 (1)access:只能属于单个VLAN,一般用于连接计算机端口 (2)trunk:端口允许多个VLAN通过,可以接收和发送多个VLAN报文,默认情况下只有管理VLAN不携带标签信息 &…...
「宇树科技」13家核心零部件供应商梳理!
2025年2月6日,摩根士丹利(Morgan Stanley)发布最新人形机器人研报:Humanoid 100: Mapping the Humanoid Robot Value Chain(人形机器人100:全球人形机器人产业链梳理)。 2025年2月20日…...
Kafka Snappy 压缩异常分析与解决方案
1. 问题描述 在使用 Kafka 进行消息发送时,遇到了以下异常: org.apache.kafka.common.KafkaException: java.lang.UnsatisfiedLinkError: /tmp/snappy-1.1.7-ee0a2284-1d05-4116-9ddc-a0d5d4b3f8cd-libsnappyjava.so: Error loading shared library ld…...
Agent系列——Manus调研
一、Manus核心技术解析(代码实现原理) 1. 多智能体协同架构 class PlanningAgent: # 任务规划代理def decompose_task(self, task):return ["unzip_files", "extract_info", "match_skills"]class ExecutionAgent: # …...
CS实现票据样式效果
效果图 代码 <template> <div class"outer"><div class"outer-container"></div></div> </template> <script langts> import { reactive, toRefs, onBeforeMount, onMounted } from vue import { useRouter, …...
Maven 简介及其核心概念
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和 依赖管理。 官网: Introduction – Maven 下载地址: Download Apache Maven – Maven 1 Introduction Maven, a Yiddish word meaning accumulator of knowledge, began as an …...
阿里开源的免费数据集成工具——DataX
企业里真实的数据流转是什么样子的呢? 左侧描述了一个企业真实的样子,我们总是需要把数据从一个地方搬到另一个地方,最后就是搬来搬去搬成了一张张解不开的网。 右侧则表达了使用DataX为中心实现数据的同步。 什么是DataX DataX是一个异构…...
医学图像分割数据集肺分割数据labelme格式6299张2类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图像分辨率:1024x1024 图片数量(jpg文件个数):6299 标注数量(json文件个数):6299 标注类别数:2 标注类别名称:["leftl…...
Spring IoC的设计与实现
IoC,Inversion of Control 控制反转,将原本由应用程序负责对象创建的工作,交给IOC容器来完成。容器通过依赖注入(DI,Dependency Injection)来实现。 作用:降低类对象之间的耦合度,减少代码量。…...
微信小程序开发:页面结构与样式设计
微信小程序页面结构与样式设计研究 摘要 微信小程序作为移动互联网的重要应用形式,其页面结构与样式设计对于用户体验和功能实现具有关键作用。本文深入探讨微信小程序的页面结构与样式设计,包括WXML语法与页面结构搭建、WXSS样式编写与页面美化提升以…...
Linux paste命令
目录 一. 简介二. 基本语法三. 小案例 一. 简介 paste 命令用于合并多个文件的行,按列方式输出,默认以制表符(Tab)分隔。 ⏹基本语法 paste [选项] 文件1 文件2 ...二. 基本语法 <()的方式模拟文件流paste命令将2个文件流粘…...
关于Object.assign
Object.assign 基本用法 Object.assign() 方法用于将所有可枚举属性的值从一个或者多个源对象source复制到目标对象。它将返回目标对象target const target { a: 1, b: 2 } const source { b: 4, c: 5 }const returnedTarget Object.assign(target, source)target // { a…...
新能源汽车充换站如何实现光储充一体化管理?
长三角某换电站光伏板晒到发烫,却因电网限电被迫切机;北京五环充电站每月多缴6万超容费;深圳物流车充电高峰排队3小时...当95%的充换站深陷“用不起绿电、扛不住扩容、算不清碳账”困局,安科瑞用一组真实数据撕开行业潜规则&#…...
Flink 流处理框架的核心特性
文章目录 事件时间支持Flink状态编程一、状态的类型1. 托管状态(Managed State)2. 原始状态(Raw State) 二、状态的管理和容错 Flink端到端的一致性1、检查点机制2、幂等3、事务 水位线窗口操作1、窗口类型2、窗口操作的时间语义 …...
蓝桥杯之AT24C02的页写页读
一、原理: 1、页写:一次性向AT24C02里的多个数据存储单元地址写入多个数据 (1)在AT24C02的页写模式下,每次写入数据后,存储单元地址会自动加1。 (2)一页有8个数据存储单元ÿ…...
计算机二级web易错点(7)-选择题
在 JavaScript 中,substr() 方法用于从字符串中提取子字符串。它接受两个参数,第一个参数表示开始提取的位置(索引从 0 开始),第二个参数表示要提取的字符数量。 在代码 var str"abcdefgh"; alert(str.subs…...
WordPress子主题插件 Child Theme Configurator
一、插件介绍 Child Theme Configurator 是一款强大的 WordPress 插件,专为创建和管理子主题(Child Theme)而设计。使用子主题可以安全地自定义 WordPress 站点,而不会影响原主题(Parent Theme),同时确保主题更新时不会丢失修改。 该插件适用于初学者和高级开发者,提…...
[网鼎杯 2020 白虎组]PicDown1 [反弹shell] [敏感文件路径] [文件描述符]
常见读取路径 /etc/passwd一些用户和权限还有一些乱七八糟的 /proc/self/cmdline包含用于开始当前进程的命令 /proc/self/cwd/app.py当前工作目录的app.py /proc/self/environ包含了可用进程的环境变量 /proc/pid/exe 包含了正在进程中运行的程序链接; /proc/pid…...
基于Spring Boot的乡村养老服务管理系统的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
ElasticSearch 可观测性最佳实践
ElasticSearch 概述 ElasticSearch 是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别(大数据时代)的数据。ES 也使用 Java 开…...
Java----正则表达式的学习
正则表达式可以检验字符串是否满足一定规则,并用来校验数据格式的合法性。 在一段文本当中查找满足需求的内容: import java.math.BigDecimal; import java.math.BigInteger; import java.util.Random;import static java.lang.Math.abs; import static…...
为何AI系统比以往任何时候都更需要红队测试
AI 系统已深度融入现代生活,但并非无懈可击。红队测试作为一项关键技术,正通过系统性地挖掘 AI 漏洞,显著提升其安全性与可靠性。随着人工智能技术的快速迭代,这种全面测试的需求愈发迫切,不仅能防范潜在危害ÿ…...
ElementPlus 快速入门
目录 前言 为什么要学习 ElementPlus? 正文 步骤 1 创建 一个工程化的vue 项目 2 安装 element-Plus :Form 表单 | Element Plus 1 点击 当前界面的指南 2 点击左边菜单栏上的安装,选择包管理器 3 运行该命令 demo(案例1 ) 步骤 …...
vue3 ts 请求封装后端接口
一 首页-广告区域-小程序 首页-广告区域-小程序 GET/home/banner1.1 请求封装 首页-广告区域 home.ts export const getHomeBannerApi (distributionSite 1) > {return http<BannerItem[]>({method: GET,url: /home/banner,data: {distributionSite,},}) }函数定…...
[ACTF2020 新生赛]BackupFile-3.23BUUCTF练习day5(1)
[ACTF2020 新生赛]BackupFile-3.23BUUCTF练习day5(1) 解题过程 打开题目环境 看题目意思应该是让我找备份文件 备份文件一般的后缀名为 .rar .zip .7z .tar.gz .bak .swp .txt .html .bak 直接扫描一下 在url中输入/index.php.bak 弱类型比较 为弱相等,即当…...
信创-人大金仓数据库创建
一. 官文 资源下载地址 https://download.kingbase.com.cn/xzzx/index.htm 下载安装文件 下载授权文件 产品文档地址:https://help.kingbase.com.cn/v8/index.html 二. 概念 2.1 体系结构 实例结构 :由数据库文件和 KingbaseES 实例组成。数据…...
【QT】QTCreator测试程序
使用QTCreator实现窗体,其中拟合程度图左侧是测点列表,右侧是改测点的拟合程度图(不使用UI,使用代码编写实现) 实现思路 创建主窗口:继承 QMainWindow 类来创建主窗口。布局管理:使用 QSplitt…...
Python入门基础
python基础类型转换 str()与int()类型转换 name 张三 age 20 print(type(name),type(age))print(我叫name 今年, str(age)岁 )a10 b198.8 cFalse print(type(a),type(b),type(c)) print(str(a),str(b),str(c))s1 128 f198.7 s276.77 ffTrue s3hello print(type(s…...
Debug-037-table列表勾选回显方案
效果展示: 图1 图2 最近实现一个支持勾选的el-table可以回显之前勾选项的功能。实现了一个“编辑”的功能: 在图1中的列表中有三行数据,当点击“更换设备”按钮时,打开抽屉显示el-table组件如图2所示,可以直接回显勾选…...
Zotero·Awesome GPT配置
使用API配置(稳定,氪金) 配置1-1 (方式1)在DeepSeek 开放平台获得API Key,输入Awesome GPT的api key中;base api选项选择deepseek;Temperature设置1,Related Number设置…...
在 Simulink 里构建输水隧洞充水过程模型的基本步骤与思路
下面为你介绍在 Simulink 里构建输水隧洞充水过程模型的基本步骤与思路,不过由于没办法直接生成 Simulink 模型文件,这里会给出一个模拟该过程的 Matlab 脚本代码示例。 建模思路 输水隧洞充水过程一般能够用一阶常微分方程来描述,其方程如…...
网络基础梳理
为什么要有网络呢? 在一开始科学家们都是自己在计算机当中做实验但是难免需要共同进行科研。假设现在一个业务需要三个人共同完成,那么现在就有问题了: 由于第一个人完成工作前,其他两人无法开始,这导致工作流程是串行…...
Android开发检查是否是各大厂商手机的工具类
Android开发检查是否是各大厂商手机的工具类 有时需要知道该手机是vivo,oppo,xiaomi,huawei等手机时,需要用到 public class RomUtils {private static final String TAG "Rom";public static final String ROM_MIUI "MIUI";public static …...