DeepSeek-V3:AI语言模型的高效训练与推理之路
参考:【论文学习】DeepSeek-V3 全文翻译
在人工智能领域,语言模型的发展日新月异。从早期的简单模型到如今拥有数千亿参数的巨无霸模型,技术的进步令人瞩目。然而,随着模型规模的不断扩大,训练成本和推理效率成为了摆在研究者面前的两道难题。DeepSeek-V3,这个拥有671B(6710亿)参数的大型混合专家(MoE)语言模型,却以其高效的训练和卓越的性能,成为了开源模型中的佼佼者。今天,就让我们一起走进DeepSeek-V3的世界,探索它是如何在保持高精度的同时,将训练成本降低到GPT的十分之一。
一、DeepSeek-V3的架构创新
DeepSeek-V3的架构设计是其高效训练和推理的基础。它采用了多头潜在注意力(MLA)和DeepSeekMoE架构,这两种技术在DeepSeek-V2中已经得到了充分验证。MLA通过低秩联合压缩注意力的键(Key)和值(Value),减少了推理时的KV缓存和训练时的激活内存。而DeepSeekMoE则通过细粒度的专家并行,隔离一些共享专家,提高了模型的计算效率和性能。
1. 多头潜在注意力(MLA)
MLA的核心在于对注意力机制的优化。传统的多头注意力机制在处理大规模数据时,会消耗大量的内存和计算资源。而MLA通过低秩联合压缩,将注意力的键和值进行压缩,减少了KV缓存的大小。同时,对注意力查询(Query)也进行了类似的低秩压缩,进一步降低了训练时的激活内存。这种压缩策略在显著减少内存占用的同时,保持了与标准多头注意力相当的性能。
2. DeepSeekMoE架构
DeepSeekMoE架构是DeepSeek-V3的另一个重要创新。它采用了细粒度的专家并行,将输入数据通过共享专家和路由专家进行处理。路由专家的选择基于Top-K选择机制,确保每个token都能被发送到最合适的专家进行处理。这种设计不仅提高了计算效率,还使得模型能够更好地利用专家的多样性,从而提升整体性能。
3. 无辅助损失的负载均衡策略
为了进一步提高训练效率,DeepSeek-V3引入了一种无辅助损失的负载均衡策略。传统的负载均衡方法通常需要引入辅助损失来鼓励负载均衡,但这可能会对模型性能产生不利影响。DeepSeek-V3通过动态调整每个专家的偏置项,实现了负载均衡,同时避免了因负载均衡导致的性能下降。这种策略不仅提高了训练效率,还保持了模型的高性能。
二、训练框架的优化
DeepSeek-V3 的训练由 HAI-LLM 框架支持,这是一个由工程师从零开始打造的高效轻量级训练框架。
1. DualPipe算法
DeepSeek-V3采用了DualPipe算法,这是一种创新的流水线并行算法。它通过重叠正向和反向的计算-通信阶段,减少了流水线气泡,提高了训练效率。具体来说,DualPipe将每个块划分为四个部分:注意力机制、全到全分发(dispatch)、MLP和全到全合并(combine)。通过重新排列这些部分,并手动调整GPU SMs用于通信与计算的比例,DualPipe确保了在执行过程中全到全和PP通信都可以被完全隐藏。这种高效的重叠策略使得DeepSeek-V3在训练过程中能够充分利用计算资源,显著提高了训练效率。
2. 高效的跨节点全到全通信内核
为了进一步提高通信效率,DeepSeek-V3开发了高效的跨节点全到全通信内核。这些内核充分利用了InfiniBand(IB)和NVLink的带宽,减少了通信开销。通过定制的通信内核,DeepSeek-V3节省了用于通信的流处理器(SMs),提高了通信效率。这种优化使得DeepSeek-V3在跨节点通信时能够保持高效的训练速度,进一步降低了训练成本。
3. 内存优化
DeepSeek-V3在内存优化方面也做了大量工作。通过重新计算RMSNorm操作和MLA上投影,DeepSeek-V3减少了存储激活值所需的内存。此外,它还采用了指数移动平均值(EMA)来存储模型参数,进一步降低了内存占用。这些内存优化措施使得DeepSeek-V3能够在不使用昂贵的张量并行(TP)的情况下进行训练,显著降低了训练成本。
三、FP8混合精度训练
DeepSeek-V3采用了FP8混合精度训练框架,这是其高效训练的另一个关键因素。FP8混合精度训练通过使用FP8数据格式进行大多数计算密集型操作,显著提高了训练速度并减少了内存消耗。
1. 混合精度框架
在FP8混合精度框架中,大多数核心计算内核,如GEMM操作,以FP8精度实现。这些操作接受FP8张量作为输入,并产生BF16或FP32的输出。通过这种方式,DeepSeek-V3的计算速度比原始的BF16方法翻倍,同时显著减少了内存消耗。
2. 细粒度量化
为了提高低精度训练的准确性,DeepSeek-V3采用了细粒度量化策略。它按1×128的瓦片或128×128的块进行分组和缩放,以适应异常值,提高量化精度。这种细粒度量化方法能够更好地适应激活值和权重的分布,减少了量化误差,提高了训练精度。
3. 增加累加精度
DeepSeek-V3还通过将累加提升到CUDA Cores,提高了FP8 GEMM的累加精度。通过这种方式,它能够保留更高的精度,减少了下溢问题,提高了训练的稳定性。
四、数据和超参数优化
除了架构和训练框架的优化,DeepSeek-V3在数据和超参数方面也进行了精心设计。
1. 数据构建
DeepSeek-V3的预训练语料库包含14.8万亿个高质量且多样化的token。通过增加数学和编程样本的比例,扩展多语言覆盖范围,优化了预训练语料库。此外,它的数据处理流程经过改进,以减少冗余,同时保持语料库的多样性。这种高质量的数据为DeepSeek-V3的训练提供了坚实的基础。
2. 超参数设置
DeepSeek-V3的超参数设置也非常精细。它采用了AdamW优化器,并设置了合适的学习率调度和批量大小调度。通过精心设计的学习率调度,DeepSeek-V3在训练过程中保持了稳定的学习速度,提高了训练效率。同时,批量大小的逐步增加也使得训练过程更加高效。
五、后训练优化
在后训练阶段,DeepSeek-V3通过监督微调(SFT)和强化学习(RL)进一步提升了模型的性能。
1. 监督微调(SFT)
DeepSeek-V3使用了精心策划的指令调优数据集,涵盖多个领域,共包含150万个实例。通过两轮微调,DeepSeek-V3在特定任务上的表现得到了显著提升。这种微调策略使得DeepSeek-V3能够更好地理解并遵循用户定义的格式约束,提高了模型的实用性。
2. 强化学习(RL)
在强化学习阶段,DeepSeek-V3使用了基于规则的奖励模型和基于模型的奖励模型。通过Group Relative Policy Optimization(GRPO),DeepSeek-V3优化了策略模型,进一步提升了模型的性能。这种强化学习策略使得DeepSeek-V3在复杂任务中表现出色,接近甚至超过了领先的闭源模型。
六、DeepSeek-V3的训练成本与性能
通过上述一系列优化措施,DeepSeek-V3不仅在性能上达到了领先水平,还在训练成本上实现了显著降低。DeepSeek-V3的完整训练仅需278.8万H800 GPU小时,而其预训练阶段每万亿个token仅需180K H800 GPU小时。这种高效的训练成本使得DeepSeek-V3成为了目前最强的开源模型之一,其性能与领先的闭源模型相当,甚至在某些领域超过了这些模型。
七、总结
DeepSeek-V3的成功之路充满了创新和优化。从架构设计到训练框架,从数据处理到后训练优化,DeepSeek-V3在每一个环节都进行了精心设计和优化。通过多头潜在注意力(MLA)、DeepSeekMoE架构、无辅助损失的负载均衡策略、FP8混合精度训练等技术,DeepSeek-V3不仅提高了训练效率,还保持了高精度的性能。它的成功为开源语言模型的发展提供了宝贵的经验,也为未来AI技术的发展指明了方向。
相关文章:
DeepSeek-V3:AI语言模型的高效训练与推理之路
参考:【论文学习】DeepSeek-V3 全文翻译 在人工智能领域,语言模型的发展日新月异。从早期的简单模型到如今拥有数千亿参数的巨无霸模型,技术的进步令人瞩目。然而,随着模型规模的不断扩大,训练成本和推理效率成为了摆在…...
计算机毕设-基于springboot的社团管理系统的设计与实现(附源码+lw+ppt+开题报告)
博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…...
[IP] DDR_FIFO(DDR3 用户FIFO接口)
IP(DDR_FIFO)将DDR3 IP的用户侧复杂接口修改为简易的FIFO接口,用户侧更加简易例化使用MIG 核 IP介绍 c0_xx (连接DDR app接口) 此IP 仅需根据MIG配置进行有限修改,即可使用! 关于IP详细使用说明,参考IP datasheet! 示…...
第 11 章:当代定价问题总结
本章重点讨论了商品化(Commoditization)、折扣对利润的影响、价格战(Price Wars)及超级竞争(Hypercompetition),并提供了相应的应对策略。 1. 商品化(Commoditization) …...
基于ssm的校园跑腿管理系统+vue
作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统共有管理员、用户两个角色 管理员主要的功能用户信息管理、任务信息管理、任务类型管理、接单信息管理、公告信息管理、投诉信息管理、公告类型管…...
36. Spring Boot 2.1.3.RELEASE 中实现监控信息可视化并添加邮件报警功能
1. 创建 Spring Boot Admin Server 项目 1.1 添加依赖 在 pom.xml 中添加 Spring Boot Admin Server 和邮件相关依赖: <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-w…...
C# WinForm程序中如何调试dll接口
公司的SF系统是自主开发的。不同的机种会有不同数据记录保存的需求,尤其是客户SQE更是各种奇思妙想......于是做了一个接口,实践之下效果还不错呢。 每每总是忘记怎么调试接口,特记录下备查。首先要将, 1 DLL项目与WinForms项目…...
SslConnection::SslConnection()详解
一、🔍 SslConnection::SslConnection() 详解 这个构造函数的主要作用是: 创建 SSL 对象创建 BIO(I/O 缓冲区)初始化 SSL 服务器模式绑定回调函数(onRead() 处理接收数据) 📌 1. 初始化 SSL 相…...
I2C驱动(九) -- i2c_adapter控制器驱动框架编写
相关文章 I2C驱动(一) – I2C协议 I2C驱动(二) – SMBus协议 I2C驱动(三) – 驱动中的几个重要结构 I2C驱动(四) – I2C-Tools介绍 I2C驱动(五) – 通用驱动i2c-dev.c分析 I2C驱动(六) – I2C驱动程序模型 I2C驱动(七) – 编写I2C设备驱动之i2c_driver I2C驱动(八) – 编写I2C…...
计算机等级考试
一、计算机等级考试——标准评分 (1)选择题 (2)基本操作题 (3)上网题 (4)文字题 (5)表格题 (6)演示文稿 总分:97 满分&…...
cuda-12.4.0 devel docker 中源码安装 OpenAI triton
1,准备 docker 容器 下载docker image: $ sudo docker pull nvidia/cuda:12.6.2-devel-ubuntu20.04 创建容器: sudo docker run --gpus all -it --name cuda_LHL_01 -v /home/hongleili/ex_triton/tmp1:/root/ex_triton/tmp1 nvidia/cuda:12.6…...
软件测试中的BUG
文章目录 软件测试的生命周期BugBug 的概念描述 Bug 的要素案例Bug 级别Bug 的生命周期与开发产生争执怎么办?【高频面试题】先检查自身,Bug 是否描述的不清楚站在用户角度考虑并抛出问题Bug 的定级要有理有据提⾼自身技术和业务水平,做到不仅…...
【Uniapp-Vue3】开发userStore用户所需的相关操作
在项目根路径下创建的stores文件夹中创建user.js文件 并将以下内容复制到user.js中 import {ref} from "vue" import { defineStore } from pinia; const uniIdCo uniCloud.importObject("uni-id-co") const db uniCloud.database(); const usersTable…...
控制kinova机械臂沿给定的末端轨迹运动
一、背景 我们通过不同的方法规划出一条轨迹后,需要验证是否可以让机械臂执行,因此需要将生成的一个一个坐标点发给机械臂,下面记录一下控制kinova机械臂沿给定的末端轨迹运动的方法。 写在前面: a、重新创建了包含kinova官方ro…...
【计网】计算机网络概述
第一章 计算机网络概述 1.2 因特网概述1.2.1 网络、互联网和因特网1.2.2 因特网发展的三个阶段1.2.3 因特网的标准化工作1.2.4 因特网的组成 1.3 三种交换方式1.3.1 电路交换1.3.2 分组交换1.3.3 报文交换1.3.4 三种交换的对比 1.4 计网的定义与分类1.4.1 定义1.4.2 分类 1.5 计…...
docker和containerd从TLS harbor拉取镜像
私有镜像仓库配置了自签名证书,https访问,好处是不需要处理免费证书和付费证书带来的证书文件变更,证书文件变更后需要重启服务,自签名证书需要将一套客户端证书存放在/etc/docker/cert.d目录下,或者/etc/containerd/c…...
1-kafka单机环境搭建
本文介绍kafka单机环境的搭建及可视化环境配置,虽然没有java代码,但是麻雀虽小五脏俱全,让大家在整体感官上对kafka有个认识。在文章的最后,我介绍了几个重要的配置参数,供大家参考。 0、环境 kafka:2.8.…...
怎么进行mysql的优化?
MySQL 的优化是一个系统性的工作,涉及多个层面,包括查询优化、索引优化、配置优化、架构优化等。以下是一些常见的 MySQL 优化方法: 查询优化 避免全表扫描:确保查询能够使用索引,避免 SELECT *,只选择需要…...
yolov8,yolo11,yolo12 服务器训练到部署全流程 笔记
正在进行中,随时更新 一. Anaconda配置 1.安装anaconda (1)下载.sh文件 Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror (2)scp到服务器后,运行安装包 bash Anaconda3-2020.07-Linux-x86_64.sh (3)安装anacond…...
基于fast-whisper模型的语音识别工具的设计与实现
目录 摘 要 第1章 绪 论 1.1 论文研究主要内容 1.1.1模型类型选择 1.1.2开发语言的选择 1.2 国内外现状 第2章 关键技术介绍 2.1 关键性开发技术的介绍 2.1.1 Faster-Whisper数据模型 2.1.2 Django 第3章 系统分析 3.1 构架概述 3.1.1 功能构架 3.1.2 模块需求描述 3.2 系统开…...
FFmpeg+vvenc实现H.266的视频编解码教程
Linux系统:FFmpegvvenc实现H.266的视频编解码教程(视频压缩) 关键网址 ffmpeg目前支持libvvenc,因此配置好libvvenc只会在一些make、sudo make install命令时遇到问题,例如默认安装或配置路径指定错误、ffmpeg版本、v…...
Hive-01之数仓、架构、数据类型、DDL、内外部表
一、主题 hive的核心概念hive与数据库的区别hive的架构原理hive的安装部署hive的交互式方式hive的数据类型hive的DDL语法操作 二、要点 1.数据仓库的基本概念 1.数据仓库的基本概念 英文名称为Data Warehouse,可简写为DW或DWH。数据仓库的目的是构建面向分析的…...
NIO是什么?它与传统的IO有什么区别?
NIO(Non-blocking I/O)是Java 1.4版本引入的一种新的I/O模型,旨在解决传统IO模型的局限性,提高网络通信和文件操作的效率。本文将详细解释NIO的概念、与传统IO的区别,并通过示例代码展示其实际应用。 一、NIO的概念 …...
模块七_面向对象
模块七_面向对象 模块六回顾:1.概述:拥有功能性代码的代码块将来干开发一个功能就应该对应一个方法2.方法的通用定义格式:修饰符 返回值类型 方法名(参数){方法体return 结果}a.修饰符:public staticb.返回值类型:方法最终返回的结果的数据类型c.方法名:给方法取的名字,见名知…...
初识uniApp
详细思考一下uniApp这个跨平台开发框架。首先,我对uniApp还不是很了解,所以需要从基本概念开始,逐步深入。 什么是uniApp? 我记得uniApp是基于Vue.js的,可能是一个用来开发多个平台的应用的框架。用户可能想了解它是什…...
蓝桥 发现环
0发现环 - 蓝桥云课 找到环 不过在最近一次维护网络时,管理员误操作使得某两台电脑之间增加了一条数据链接,于是网络中出现了环路。环路上的电脑由于两两之间不再是只有一条路径,使得这些电脑上的数据传输出现了BUG。 为了恢复正常传输&am…...
Compose 手势处理,增进交互体验
Compose 手势处理,增进交互体验 概述常用手势处理Modifierclickable()combinedClickable()draggable()swipeable()transformable()scrollable()nestedScrollNestedScrollConnectionNestedScrollDispatcher 定制手势处理使用 PointerInput ModifierPointerInputScope…...
【愚公系列】《Python网络爬虫从入门到精通》036-DataFrame日期数据处理
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
FastAdmin 与其他后台框架的对比分析
FastAdmin 与其他后台框架的对比分析 引言 在现代Web开发中,后台管理系统是支持各种应用程序的核心部分。随着需求的多样化,许多后台框架应运而生。本文将对FastAdmin与其他常见后台框架(如Django Admin、Laravel Nova、AdminLTE࿰…...
自学微信小程序的第六天
DAY6 1、使用录音API首先需要通过wx.getRecorderManager()方法获取到一个RecorderManager实例,该实例是一个全局唯一的录音管理器,用于实现录音功能。 表32:RecorderManager实例的常用方法 方法名称 说明 start() 开始录音 pause() 暂停录音 resume() 继续录音 stop() 停止…...
KTV点歌系统
收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…...
(上)基于机器学习的图像识别——遥感图像分类(LeNet-5;AlexNet;VGGNet;GoogLeNet;ResNet)
遥感图像识别: 专业词汇: kernel:卷积 目录 遥感图像分类 1.1 LeNet-5 视频来源: 任务:使用什么网络实现遥感图像的分类 LeNet-5结构: 遥感图像分类 1.2 AlexNet(冠军) 视频…...
深入探索 STM32 微控制器:从基础到实践
一、引言 在当今的嵌入式系统领域,STM32 系列微控制器凭借其高性能、低功耗、丰富的外设以及广泛的应用场景,成为了众多开发者的首选。无论是在工业控制、智能家居、医疗设备,还是在消费电子等领域,STM32 都展现出了强大的生命力…...
windows下玩转vllm:在wsl下安装vllm
文章目录 前言安装wsl启动wsl的默认分发使用python部署vllm创建并激活虚拟环境直接说结论试错过程安装vllm简单测试一下,看看行不行附录,安装wsl安装ubuntu分发步骤 3: 设置用户和密码步骤 4: 更新系统步骤 5: 使用 WSL前言 当前,部署通义千问2.5-vl已经是一件箭在弦上,不…...
SGLang部署大模型
SGLang部署大模型 环境信息基础组件安装创建python虚拟环境安装python模块下载模型部署模型 显存需求较高, 本地4G显存0.5B都无法部署 支持多机多卡部署 支持GPU、CPU混合运行 支持运行格式pt,safetensors,npcache,dummy,gguf,bitsandbytes,layered 环境信息 机器01…...
Ubuntu 防火墙iptables和 ufw
文章目录 iptables 和 ufw 的区别Ubuntu 上使用 ufw 配置 iptables 和 ufw 的区别 iptables 和 ufw 是 Linux 系统中用于管理防火墙的工具,但它们的设计目标和使用方式有所不同。 iptables:功能强大,适合高级用户和复杂场景,但配…...
NAT 代理服务 内网穿透
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 NAT 技术背景二:🔥 NAT IP 转换过程三:🔥 NAPT四:🔥 代理服务器🦋 正向…...
C++20 Lambda表达式新特性:包扩展与初始化捕获的强强联合
文章目录 一、Lambda表达式的历史回顾二、C20 Lambda表达式的两大新特性(一)初始化捕获(Init-Capture)(二)包扩展(Pack Expansion) 三、结合使用初始化捕获与包扩展(一&a…...
ES scroll=1m:表示快照的有效时间为1分钟。怎么理解
在Elasticsearch中,scroll1m 表示你创建的 scroll 上下文 的有效时间为 1分钟。这个参数控制了你可以在多长时间内继续使用这个 scroll_id 来获取更多的数据。 什么是 Scroll 上下文? 当你使用 scroll API 时,Elasticsearch 会为你的查询创…...
【IoU变体对比:WIOU、SIOU、EIOU、GIOU、CIOU】
IoU变体对比:WIOU、SIOU、EIOU、GIOU、CIOU 1. 基本概念与公式(1) GIOU (Generalized Intersection over Union)(2) CIOU (Complete Intersection over Union)(3) EIOU (Efficient Intersection over Union)(4) SIOU (Shape-Enhanced Intersection over Union)(5) W…...
【MySQL】数据库-图书管理系统(CC++实现)
一.预期功能 该图书管理系统设计提供基本的设计模版,涉及数据库的增删查改等操作,包含登录功能,图书管理功能,图书借阅功能,用户管理功能等基础功能,详细功能查看以下菜单表,共包含三个菜单&am…...
【leetcode hot 100 560】和为K的子数组
解法一:用左右指针寻找字串,如果和>k,则减少一个数(left);如果和<k,则加上一个数(right)。 class Solution {public int subarraySum(int[] nums, int k) {int nu…...
【漫话机器学习系列】110.线性可分(Linearly Separable)
线性可分与线性不可分的概念详解 1. 引言 在机器学习和模式识别领域,分类问题是一个重要的研究方向。在分类任务中,我们通常需要将不同类别的数据点分开,而如何进行分割是一个关键问题。线性可分(Linearly Separable)…...
单细胞分析(19)—— 单细胞转录组基因集评分方法
下面是每种基因集评分方法的原理介绍代码示例,适用于R语言和Python两种主流生信分析环境。可以直接应用于单细胞转录组(scRNA-seq)数据分析中。 🔬 单细胞转录组基因集评分方法(附代码示例) 在单细胞RNA测…...
【数据挖掘】Pandas
Pandas 是 Python 进行 数据挖掘 和 数据分析 的核心库之一,提供了强大的 数据清洗、预处理、转换、分析 和 可视化 功能。它通常与 NumPy、Matplotlib、Seaborn、Scikit-Learn 等库结合使用,帮助构建高效的数据挖掘流程。 📌 1. 读取数据 P…...
Spring Boot 中 @Transactional 注解全面解析
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...
【网络】数据链路层(以太网帧格式、MTU、ARP)、NAT、内网穿透
文章目录 1. 数据链路层2. 以太网帧格式3. MTU3.1 认识MTU3.2 MTU 对于 TCP 协议的影响 4. 局域网通信原理5. ARP协议5.1 基本概念5.2 原理5.3 ARP 数据报的格式 6. NAT技术7. 内网穿透8. 内网打洞9. 代理服务器9.1 正向代理9.2 反向代理9.3 NAT VS 代理服务器 10.网络总结 1. …...
ASPNET Core笔试题 【面试宝典】
文章目录 一、如何在ASP.NET Core中激活Session功能?二、什么是中间件?三、ApplicationBuilder的Use和Run方法有什么区别?四、如何使TagHelper在元素这一层上失效?五、什么是ASP.NET Core?六、ASP.NET Core中AOP的支持…...
Harmony os next~鸿蒙原子化服务开发实战:天气卡片开发全解析
鸿蒙原子化服务开发实战:天气卡片开发全解析 一、原子化服务与HarmonyOS卡片概述 (1)原子化服务特性 HarmonyOS原子化服务具有独立入口(桌面图标/智慧搜索)、免安装、跨设备流转三大核心特性。服务卡片作为其可视化载…...
【pytest框架源码分析三】pluggy源码分析之hook注册调用流程
pluggy的hook调用,最重要的就是使用了__call__魔法函数,这个函数能够在我们调用实例时,自动调用这个函数,无需自己手动调用。 前面介绍了各个类的方法,这里简述下pluggy的调用流程(主要介绍主流程ÿ…...