CANN/GE 流分配特性分析

news2026/5/15 6:22:19
Stream Allocator流分配特性分析【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge1 特性背景昇腾 AI 处理器上的计算任务通过流Stream来组织和调度。流是设备侧的执行队列——同一条流内的任务严格按序执行不同流之间的任务可以并行执行。流分配的质量直接影响模型的执行效率分配的流太少无法充分利用硬件并行能力分配的流太多又会带来过多的同步开销Event/Notify和资源占用。GE 图编译器在将 AscendIR 编译为可执行模型OM 文件的过程中需要在编译期完成流的分配决策。这一决策涉及三个核心问题哪些算子可以并行执行需要根据引擎类型、数据依赖关系、用户标注等信息决定。并行执行的算子之间如何同步不同流之间需要插入 Event/Notify 来保证数据一致性。物理流的容量有限时如何拆分一条逻辑流承载的 task 数量有上限超出时需要拆分为多条物理流。流分配特性正是为系统性地解决这些问题而设计的。适用场景流分配特性适用于以下典型场景场景说明静态 Shape 模型编译模型的输入 shape 在编译期已知GE 可以基于完整的图拓扑进行精细的多流分配动态 Shape 模型编译模型的输入 shape 在运行时才确定GE 需要采用更保守的分流策略混合引擎模型模型中同时包含 AI Core、HCCL集合通信、AI CPU、DVPP 等不同引擎的算子需要按引擎特性分流训练场景的 AllReduce 并行梯度聚合AllReduce与反向计算并行执行以加速训练用户自定义分流用户通过 StreamLabel 属性指定特定算子分配到特定流2 总体架构流分配特性横跨编译器和运行时两个阶段形成逻辑流分配 → 同步事件插入 → 物理流拆分 → 运行时流创建的完整流水线。模块分工模块所在目录职责StreamAllocatorcompiler/graph/build/stream/编译期流分配的总入口协调逻辑流分配、同步插入、物理流拆分LogicalStreamAllocatorcompiler/graph/build/stream/静态 Shape 下的逻辑流分配基于 Pass 链式架构DynamicStreamAllocatorcompiler/graph/build/stream/动态 Shape 下的流分配策略更简洁StreamUtilscompiler/graph/build/stream/流分配的公共工具函数gert::StreamAllocatorinc/framework/runtime/运行时 V2 路径的流创建接口ge::ReusableStreamAllocatorruntime/v1/运行时 V1 路径的流复用池3 对外接口3.1 编译期 API编译期流分配作为图编译流水线的一部分不直接暴露给终端用户。但编译完成后用户可通过以下接口查询流分配结果。GetStreamAllocationSummary获取流分配概要信息包括逻辑流、物理流、附着流的分配情况。头文件ge/ge_graph_compile_summary.h库文件libge_compiler.so函数原型Status GetStreamAllocationSummary( std::shared_ptrStreamAllocationSummary stream_allocation) const;返回的StreamAllocationSummary对象提供以下查询接口接口说明GetAllLogicalStreamInfos()获取所有逻辑流的分配信息GetUsrStreamLabels()获取用户流标签列表GetPhysicalStreamNums()获取物理流数量GetAttachedStreamIds()获取附着流 ID 列表GetHcclFollowedStreamNums()获取 HCCL 后续流数量IsAssignedByStreamPass()判断是否由 StreamPass 分配LogicalStreamAllocationInfo每条逻辑流的详细信息包括接口说明GetLogicalStreamId()逻辑流 IDGetUsrStreamLabel()用户流标签GetAttachedStreamIds()附着流 IDGetPhysicalStreamNum()物理流数量GetHcclFollowedStreamNum()HCCL 后续流数量GetAllNodes()该流上所有节点3.2 运行时 APIgert::StreamAllocatorV2 路径运行时流创建接口按需创建和管理设备流。头文件framework/runtime/stream_allocator.h核心接口namespace gert { class StreamAllocator { // 最多支持 2024 条流 static constexpr size_t kMaxStreamNum 2024U; StreamAllocator(int32_t priority RT_STREAM_PRIORITY_DEFAULT, uint32_t flags RT_STREAM_DEFAULT); ~StreamAllocator(); // 按需获取流返回连续向量不足部分自动创建 TypedContinuousVectorrtStream_t *AcquireStreams(size_t stream_num) const; }; }该接口在模型加载阶段被调用根据编译期确定的流数量一次性创建所需的全部设备流。实现上使用ContinuousVector预分配最大容量2024 条流通过SetSize标记实际使用的流数量避免频繁的内存分配。ge::ReusableStreamAllocatorV1 路径运行时流复用池用于跨模型复用设备流减少流创建/销毁开销。头文件runtime/v1/graph/load/model_manager/reusable_stream_allocator.h核心接口namespace ge { class ReusableStreamAllocator { static ReusableStreamAllocator *Create(); Status GetOrCreateRtStream(aclrtStream stream, uint32_t rt_model_id, int32_t priority, uint32_t stream_flag, uint32_t task_num 0U); Status DestroyStream(aclrtStream stream, bool is_force_destroy false); }; }ReusableStreamAllocator维护一个以priority, stream_flag为键的流池按 task_num 排序。新模型加载时优先从已有流池中查找可复用的流避免重复调用rtStreamCreate。每个流通过rt_model_id集合追踪使用它的模型确保不会复用自身模型的流。3.3 用户可配置项用户可通过以下方式影响流分配行为配置项影响范围说明SINGLE_STREAM_ENABLE静态 Shape开启单流模式所有算子在一条流上执行AC_PARALLEL_ENABLE动态 Shape取值为 0、1 或空控制 AI CPU 与 AI Core 是否并行EVENT静态 Shape设为 notify 时使用 Notify 替代 Event 进行同步STREAM_LABEL节点属性所有场景算子级别的流标签相同标签的算子分配到同一条流USER_STREAM_LABEL节点属性所有场景用户级流标签优先级最高PARALLEL_GROUP节点属性静态 Shape并行组标识同组算子分配到独立流ATTACHED_STREAM_INFO节点属性静态 Shape附着流信息一个节点可产生多条流4 具体实现4.1 静态 Shape 逻辑流分配静态 Shape 下的逻辑流分配采用Pass 链式架构每个 Pass 负责一类分流规则按优先级依次执行。这套架构的设计哲学是关注点分离——每种分流逻辑独立封装为 Pass新增分流规则只需添加新 Pass无需修改已有逻辑。4.1.1 Pass 链详解UpdateForMdeGroupPass根据NewStreamId属性为节点分配新流。这是最高优先级的分流规则用于支持 MDEMulti-Data Execution场景下特定算子的独立流需求。AssignByLabelPass根据StreamLabel属性分流。相同 StreamLabel 的子图分配到同一条流不同 StreamLabel 分配新流。这让上层编译优化如融合 Pass可以通过设置 StreamLabel 来指导流分配。IndependentStreamPass为独立引擎如 HCCL的子图分配独立流。独立引擎的算子需要独占一条流不能与其他引擎复用。同一个独立引擎内相同 StreamLabel 的子图共享流。AssignByDependencyPass最核心的分流 Pass根据引擎子图之间的数据依赖关系进行流分配和流复用。该 Pass 的工作方式是遍历所有未分流的子图查找前驱子图中是否存在可复用的流若可复用则复用否则分配新流流复用需要满足三个条件scheduler_id 相同、不是独立引擎/带标签的流、无引擎冲突NodeStreamUpdatePass将子图级别的流分配结果映射到节点级别。每个节点获得其所属子图的 stream_id。特殊地带有ATTR_NAME_RTS_LABEL_NODE属性的节点会被分配到父流而非子图流用于支持控制流场景。UpdateForParallelGroupPass根据PARALLEL_GROUP属性为节点重新分配流。同一并行组的节点分配到同一条新流。对于 HCOM 算子如果并行组名为 -1 且只有一个输入则尝试复用输入节点的流。AllReduceParallelPass当开启hcom_parallel时将 AllReduce 算子的后继非 HCOM 节点分配到新流使 AllReduce 与反向计算可以并行执行。这是训练加速的关键优化。UpdateForSkippedEnginePass优化跳过引擎skipped engine子图中的节点流分配。对于NodeA(stream1) → Const(stream2) → NodeB(stream1)这类模式将 Const 节点的流改为 stream1从而减少两个流之间不必要的同步事件。OptimizeIneffectiveMultiStreamPass拓扑优化 Pass消除名义上多流但实际不产生并行收益的情况。如果某个节点在所有输入输出方向上都与另一条流相连且在该流上输入输出节点之间没有其他节点则将当前节点移到那条流上从而减少同步开销。4.1.2 附着流分配附着流Attached Stream是一个节点产生的除主流之外的额外流。某些算子如 SuperKernel需要多条流来执行不同的计算任务。附着流分配在主流分配完成后进行。AssignAttachedStreamPass通过ATTR_NAME_ATTACHED_STREAM_INFO或ATTR_NAME_ATTACHED_STREAM_INFO_LIST属性获取附着流信息包括流数量和复用键reuse_key。相同 reuse_key 的附着流共享同一条流避免不必要的流创建。附着流分流完成后总的流数量 主流数量 附着流数量。4.2 动态 Shape 流分配动态 Shape 下的流分配策略相比静态 Shape 更为保守——默认只分配一条流单流模式只有在配置开启多流时才启用多流。这是因为动态 Shape 的图结构在编译期不完整无法进行精确的依赖分析。与静态 Shape 的关键差异差异点静态 Shape动态 Shape默认模式多流单流分流粒度Pass 链式处理规则精细按引擎分流规则简洁流复用策略基于依赖关系的复杂复用判断前驱/后继子图复用节点级约束较少Data、Variable、NetOutput、FILECONSTANT 等强制在主流附着流支持通过独立接口AssignAttachedResource支持同步机制Event Notify 双模式仅 Event4.3 同步事件管理流分配完成后不同流上的算子之间需要同步事件来保证执行顺序正确性。同步事件的管理是流分配特性中最复杂的部分。4.3.1 事件类型类型说明适用场景kEvent普通 EventSend/Recv 配对默认模式kNotifyNotify支持更细粒度的同步通过EVENTnotify配置开启4.3.2 事件插入规则系统在以下场景插入同步事件事件插入的核心逻辑在StreamAllocator::InsertOneEventInTwoNodes中遍历整图的所有数据边和控制边当相邻两个节点属于不同流时在两个节点之间插入一对 Send/Recv 事件。4.3.3 事件优化插入事件后系统会通过三重优化消除冗余事件OptimizeBySendEvents在同一条流内如果 Send 节点 A 的事件已经确保了流 B 上的 Recv 节点 C 在 A 之后执行那么 A 和 C 之间不需要额外的事件。OptimizeByRecvEvents类似地在接收方向上消除冗余。OptimizeByStreamActivate通过StreamActive机制优化跨流事件。当流 A 上的节点通过StreamActive激活了流 B则流 A 到流 B 之间不需要额外的 Event——因为StreamActive本身就隐含了同步语义。该优化通过IsRecvNodeActivatedBySendNode方法判断沿着激活链回溯检查是否存在激活关系。4.3.4 事件复用在多档位multi-dims场景下不同档位在同一时刻只有一个会执行因此它们的 Event 可以复用。ReuseEventForMultiDims方法为每个档位独立编号 Event然后取最大值作为最终 Event 数量。例如dim0: event 0, 1, 2, 3 → 0, 1, 2, 3 dim1: event 4, 5, 6, 7, 8 → 0, 1, 2, 3, 4 dim2: event 9, 10, 11 → 0, 1, 2 最终 event_num max(4, 5, 3) 5此外算子可以通过ATTR_NAME_EVENT_MULTIPLEXING属性显式声明 Event 的复用关系系统据此替换对应的事件 ID。4.3.5 事件连续性保证RTSRuntime Service要求 Event ID 必须从 0 开始连续分配。因此在所有优化和复用处理完成后系统通过RefreshContinuousEvents方法重新映射 Event ID确保连续性。该逻辑同样适用于 Notify。4.4 物理流拆分逻辑流分配不考虑 task 数量限制但物理流承载的 task 数量有上限。物理流拆分阶段负责将超出限制的逻辑流拆分为多条物理流。拆分触发条件StreamAllocator::NeedSpiltNewStream不是流的首个节点当前流上的 task 数量 预留数量 上限节点没有子图非控制流节点不是StreamActive的首节点不是LabelSet/LabelGotoEx/LabelSwitchByIndex等控制流标签节点拆分时需处理的事项更新节点的 stream_id 为新的物理流 ID在拆分点的前后节点之间插入同步事件维护split_stream_id_to_logic_stream_id_映射处理ContinuousStreamLabel相同标签的节点必须拆分到同一条流Huge Stream当单流模式的 task 数量超过普通流上限时系统尝试使用 Huge Stream大流大流具有更高的 task 容量。4.5 流激活机制流激活Stream Activate是昇腾设备侧的流调度机制。当一条流需要唤醒另一条流时通过StreamActive算子发送激活信号。激活关系的建立过程标签激活SetActiveStreamsByLabel遍历所有带有ATTR_NAME_ACTIVE_LABEL_LIST属性的节点将标签映射到实际的流 ID写入ATTR_NAME_ACTIVE_STREAM_LIST属性。子图激活SetActiveStreamsForSubgraphs为 While/For 等循环子图的首个StreamActive节点设置激活流列表确保子图内所有流都被正确激活。Switch 节点激活UpdateActiveStreamsForSwitchNodeStreamSwitch节点后面会插入StreamActive节点根据条件分支激活对应的流。循环激活SetActiveStreamsForLoop处理训练场景的 FpBp 循环StreamActive节点需要激活所有未被特定激活的流确保每次迭代开始时所有流都被正确启动。流拆分后的激活更新物理流拆分会产生新的流 ID系统需要更新所有StreamActive节点的激活列表将拆分后的新流加入激活范围。4.6 同步事件节点生成在流分配的最后阶段系统需要将记录在数据结构中的事件信息node_to_send_events_、node_to_recv_events_等转化为图中的实际节点Send/Recv 算子。GenerateSyncEventNodes方法遍历所有节点的事件映射为每个事件创建对应的 Send 和Recv 节点并通过控制边将它们插入到图中的正确位置。这些节点在后续的 Task 生成阶段会被转换为设备侧的 Event Record/Wait 任务。4.7 运行时流创建编译期确定了流数量后运行时在模型加载阶段创建对应的设备流。V2 路径gert::StreamAllocatorgert::StreamAllocator预分配一个最多容纳 2024 条rtStream_t的连续向量。首次调用AcquireStreams时依次创建指定数量的流调用rtStreamCreateWithFlags后续调用则复用已创建的流。流的销毁在析构函数中统一完成。V1 路径ge::ReusableStreamAllocatorV1 路径支持跨模型复用流。ReusableStreamAllocator维护以priority, stream_flag为键的流池每个流记录其task_num和使用它的模型 ID 集合。当新模型请求流时从流池中查找匹配的priority, stream_flag筛选不属于当前模型的流按task_num排序优先选择 task 数相近的流复用若无可用流则创建新流5 关键设计决策5.1 为什么静态和动态采用不同的分流策略静态 Shape 的图拓扑在编译期完全已知GE 可以精确分析所有数据依赖关系并进行细粒度的流复用。而动态 Shape 的图结构在编译期不完整部分子图是运行时才展开的无法进行精确的依赖分析。因此动态 Shape 采用更保守的策略默认单流仅在用户明确配置时开启多流且分流规则以引擎粒度为主而非依赖分析。5.2 为什么使用 Pass 链而非单一分配算法Pass 链架构的核心优势是可扩展性和可维护性。每种分流规则标签分流、引擎分流、依赖分流、AllReduce 并行等封装为独立 Pass各自维护状态互不干扰。新增分流规则只需添加新 Pass 到链中无需修改已有逻辑。如果采用单一算法所有规则交织在一起代码的可读性和可维护性会急剧下降。5.3 为什么需要图结构稳定性原则流分配依赖于拓扑排序和 topo ID 的连续性。如果在流分配过程中图结构发生变化增删节点会导致 topo ID 不连续进而影响后续的内存复用依赖 topo 顺序分配内存块和物理流拆分依赖 topo 顺序计算 task 数量。因此流分配阶段严格禁止改图操作——所有需要插入的节点如 Send/Recv、StreamActive都在流分配完成后统一插入。5.4 为什么附着流要在主流分配完成后才能分配附着流的 ID 是在主流 ID 的基础上递增的。如果附着流和主流混合分配会导致流 ID 不连续增加同步管理的复杂度。主流分配完成后一次性分配附着流可以确保流 ID 的连续性和可预测性。6 约束与限制约束说明单流模式不支持 StreamLabel单流模式只有一条流StreamLabel 会导致冲突Event ID 必须连续RTS 对 Event ID 有连续性校验必须通过RefreshContinuousEvents保证图结构不可变流分配期间图结构不能改变topo ID 必须连续Notify 数量上限最大支持 1024 个 Notify单节点附着流数量一个节点最多支持一个附着流通过 reuse_key 复用多线程安全StreamAllocator支持多线程但需保护共享资源ScalableAllocator不支持多线程并发动态图 While 约束动态图上 While 算子的静态 body 子图的 NetOutput 必须在 stream 0分档场景标签约束分档场景下添加 StreamLabel 时需要加上档位信息以区分【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2599185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…