昇思 MindSpore 关键特性深度解析:全场景 AI 框架的架构、编程范式与极致性能优化

发布时间:2026/10/3 8:12:31
昇思 MindSpore 关键特性深度解析:全场景 AI 框架的架构、编程范式与极致性能优化
文档教程人工智能【免费下载链接】AISystemAISystem 主要是指AI系统包括AI芯片、AI编译器、AI推理和训练框架等AI全栈底层技术项目地址https://gitcode.com/GitHub_Trending/ai/AISystem点击查看免费下载昇思 MindSpore 是华为推出的面向端-边-云全场景设计的开源 AI 计算框架本文基于 AISystem 仓库中 05MindSpore.md 的内容系统梳理其四层架构、三类编程范式、动静统一机制以及图算融合、Ascend 加速、梯度累积、自适应梯度求和等性能优化技术并结合本仓库 AI 框架基础 系列文档中的编程范式、自动微分与昇腾全栈知识进行纵深解读。读完本文你将能够理解 MindSpore 相比传统 AI 框架的设计差异掌握面向对象、函数式与融合编程的写法并了解其如何通过编译技术实现训练与推理的全场景落地。MindSpore 基本介绍MindSpore 定位昇思 MindSpore 是面向端-边-云全场景设计的 AI 框架旨在弥合 AI 算法研究与生产部署之间的鸿沟算法研究阶段为开发者提供动静统一的编程体验提升算法的开发效率生产阶段自动并行可以极大加快分布式训练的开发和调试效率同时充分挖掘异构硬件的算力部署阶段基于端-边-云统一架构应对企业级部署和安全可信方面的挑战。开源以来MindSpore 秉持全场景协同、全流程极简、全架构统一三大价值主张致力于增强开发易用性、提升原生支持大模型和 AI科学计算的体验。从整个昇腾计算产业看MindSpore 是昇腾基础软件体系中与 CANN 异构计算架构配套的 AI 计算框架向上使能 AI 模型创新向下兼容多样性算力NPU、GPU、CPU。这一点在仓库文档 08AscendBase.md 中有完整描述昇腾 AI 全栈自下而上依次为 AI 芯片硬件、基础软件CANN、驱动、运行时、编译器、AI 计算框架MindSpore 及 PyTorch 等生态框架、应用使能 MindXMindSpore 处于框架层承担将算法模型编译调度到昇腾硬件执行的关键角色。昇思 MindSpore 架构昇思 MindSpore 整体架构分为四层模型层为开发者提供开箱即用的功能该层主要包含预置的模型和开发套件以及图神经网络GNN、深度概率编程等热点研究领域拓展库表达层MindExpression为开发者提供 AI 模型开发、训练、推理的接口支持开发者用原生 Python 语法开发和调试神经网络。其特有的动静态图统一能力使开发者可以兼顾开发效率和执行性能同时在生产和部署阶段提供全场景统一的 C 接口编译优化MindCompiler作为 AI 框架的核心以全场景统一中间表达MindIR为媒介将前端表达编译成执行效率更高的底层语言同时进行全局性能优化包括自动微分、代数化简等硬件无关优化以及图算融合、算子生成等硬件相关优化运行时按照上层编译优化的结果对接并调用底层硬件算子同时通过端-边-云统一的运行时架构支持包括联邦学习在内的端-边-云 AI 协同。这一模型层 → 表达层 → 编译优化 → 运行时的分层设计与仓库中 03History.md 对 AI 框架目的的分析一一对应前端要解决如何灵活表达神经网络模型算子层要保证执行性能与泛化性微分要自动高效地提供求导运算后端要解决同一算子跑在不同加速设备上运行时负责自动优化和调度网络模型进行计算。MindSpore 正是沿着这条全栈路径构建的第三代 AI 框架。昇思 MindSpore 特性昇思 MindSpore 为开发者提供 Python 等语言的编程范式。借助基于源码转换的机制开发者可以使用原生 Python 控制语法和其他高级 API如元组Tuple、列表List和 Lambda 表达式。前端编程昇思 MindSpore 提供面向对象和面向函数的编程范式开发者可以基于nn.Cell类派生定义所需功能的 AI 网络或网络的某一层layer并通过对象嵌套调用的方式将已定义的各种 layer 进行组装完成整个 AI 网络的定义开发者也可以定义一个可被昇思 MindSpore 源到源编译转换的 Python 纯函数通过昇思 MindSpore 提供的函数变换接口或装饰器将其加速执行。关于编程范式在 AI 框架中的演变仓库文档 04Programing.md 指出主流 AI 框架以 Python 为前端主要提供声明式define-and-run如 TensorFlow 1.X与命令式define-by-run如 PyTorch两种编程体验而 JAX 与 MindSpore 则采用了函数式编程范式在高性能计算、科学计算、分布式方面有独特优势。MindSpore 的三类编程范式正是在这一背景下为兼顾易用性与性能而设计的。面向对象编程面向对象编程Object-oriented programmingOOP将程序分解为封装数据及相关操作的模块类对象为类class的实例。类通常由两部分构成方法Methods对应 code属性Attributes对应 data。对于同一个 Class 实例化后得到的不同对象方法和属性相同、属性的值不同。不同的属性值决定了对象的内部状态因此 OOP 能够很好地进行状态管理。下面是 Python 构造简单类的示例class Sample: #class declaration def __init__(self, name): # class constructor (code) self.name name # attribute (data) def set_name(self, name): # method declaration (code) self.name name # method implementation (code)对于构造神经网络来说首要的组件是网络层Layer一个神经网络层包含 Tensor 操作Operation和权重Weights两部分恰好与类的 Methods 和 Attributes 一一对应同时权重本身就是神经网络层的内部状态因此使用类来构造 Layer 天然符合其定义。使用 OOP 编程可以很容易地通过 Layer 对象组合构造新的 Layer 类。下面是使用昇思 MindSpore 构造神经网络类的示例from mindspore import nn, Parameter from mindspore.common.initializer import initializer class Linear(nn.Cell): def __init__(self, in_features, out_features, has_bias): # class constructor (code) super().__init__() self.weight Parameter( initializer(normal, [out_features, in_features], mindspore.float32), weight) # layer weight (data) self.bias Parameter( initializer(zeros, [out_features], mindspore.float32), bias) # layer weight (data) def construct(self, inputs): # method declaration (code) output ops.matmul(inputs, self.weight.transpose( 0, 1)) # tensor transformation (code) output output self.bias # tensor transformation (code) return output除神经网络层的构造外MindSpore 支持纯面向对象编程方式构造神经网络训练逻辑此时正向计算、反向传播、梯度优化等操作均使用类进行构造。下面是纯面向对象编程的示例import mindspore import mindspore.nn as nn from mindspore import value_and_grad class TrainOneStepCell(nn.Cell): def __init__(self, network, optimizer): super().__init__() self.network network self.optimizer optimizer self.grad_fn value_and_grad(self.network, None, self.optimizer.parameters) def construct(self, *inputs): loss, grads self.grad_fn(*inputs) self.optimizer(grads) return loss network nn.Dense(5, 3) loss_fn nn.BCEWithLogitsLoss() network_with_loss nn.WithLossCell(network, loss_fn) optimizer nn.SGD(network.trainable_params(), 0.001) trainer TrainOneStepCell(network_with_loss, optimizer)此时不论是神经网络还是其训练过程均使用继承nn.Cell的类进行管理可以方便地作为计算图进行编译加速。这正对应 02Fundamentals.md 中所述的核心思想AI 框架的核心功能是自动微分开发者定义好网络后框架主动完成求导与参数更新。函数式编程函数式编程Functional programming将计算机运算视为函数运算避免使用程序状态以及可变对象。函数被视为一等公民可以绑定到名称、作为参数传递、从其他函数返回从而以声明性和可组合的风格编写程序。当使用给定参数调用纯函数时它总是返回相同结果不受可变状态或其他副作用的影响。函数式编程有两个核心特点使其十分符合科学计算的需要编程函数语义与数学函数语义完全对等确定性给定相同输入必然返回相同输出无副作用。由于确定性这一特点通过限制副作用程序可以有更少的错误更容易调试和测试更适合形式验证。下面是使用函数式编程的示例import mindspore.numpy as mnp from mindspore import grad grad_tanh grad(mnp.tanh) print(grad_tanh(2.0)) # 0.070650816 print(grad(grad(mnp.tanh))(2.0)) print(grad(grad(grad(mnp.tanh)))(2.0)) # -0.13621868 # 0.25265405配合函数式编程范式的需要昇思 MindSpore 提供了多种函数变换接口涵盖自动微分、自动向量化、自动并行、即时编译、数据下沉等功能模块自动微分grad、value_and_grad提供微分函数变换功能自动向量化vmap用于沿参数轴映射函数 fn 的高阶函数自动并行shard函数式算子切分指定函数输入/输出 Tensor 的分布策略即时编译jit将 Python 函数编译为一张可调用的 MindSpore 图数据下沉data_sink对输入的函数进行变换获得可使用数据下沉模式的函数。基于上述函数变换接口在使用函数式编程范式时可以快速高效地实现复杂功能。融合编程函数式面向对象融合编程的典型过程用类构建神经网络实例化神经网络对象构造正向函数连接神经网络和损失函数使用函数变换获得梯度计算反向传播函数构造训练过程函数调用函数进行训练。下面是函数式面向对象融合编程的简单示例# Class definition class Net(nn.Cell): def __init__(self): ...... def construct(self, inputs): ...... # Object instantiation net Net() # network loss_fn nn.CrossEntropyLoss() # loss function optimizer nn.Adam(net.trainable_params(), lr) # optimizer # define forward function def forword_fn(inputs, targets): logits net(inputs) loss loss_fn(logits, targets) return loss, logits # get grad function grad_fn value_and_grad(forward_fn, None, optim.parameters, has_auxTrue) # define train step function def train_step(inputs, targets): # get values and gradients (loss, logits), grads grad_fn(inputs, targets) optimizer(grads) # update gradient return loss, logits for i in range(epochs): for inputs, targets in dataset(): loss train_step(inputs, targets)在神经网络构造时使用面向对象编程符合 AI 编程的习惯在进行前向计算和反向传播时使用函数式编程将前向计算构造为函数然后通过函数变换获得grad_fn最后通过执行grad_fn获得权重对应的梯度。这种融合编程既保证了神经网络构建的易用性又提高了前向计算和反向传播等训练过程的灵活性是昇思 MindSpore 推荐的默认编程范式。函数式微分编程目前主流的 AI 框架有三种自动微分技术基于静态计算图的转换在编译时将网络转换为静态数据流图然后将链式规则转换为数据流图实现自动微分基于动态计算图的转换以算子重载的方式记录前向执行时网络的操作轨迹然后将链式规则应用到动态生成的数据流图中实现自动微分基于源码的转换从函数式编程框架演化而来对中间表达程序在编译过程中的表达形式以即时Just-In-TimeJIT编译的形式进行自动微分变换支持复杂的流程控制场景、高阶函数和闭包。昇思 MindSpore 开发了一种新的策略即基于源码转换的自动微分一方面它支持流程控制的自动微分因此构建像 PyTorch 这样的模型非常方便另一方面MindSpore 可以对神经网络进行静态编译优化从而获得良好的性能。其实现可以理解为对程序本身进行符号微分——因为 MindSpore IR 是函数式的中间表达与基本代数中的复合函数有直观的对应关系只要已知基础函数的求导公式就能推导出由任意基础函数组成的复合函数的求导公式。MindSpore IR 中每个原语操作可对应基础代数中的基础函数这些基础函数可以构建更复杂的流程控制。这与 02Fundamentals.md 中反向求导复用前一次计算结果、基于计算图构建对称的反向计算图的链式法则原理一脉相承。动静统一传统 AI 框架主要有两种编程执行形态静态图模式基于开发者调用的框架接口在编译执行时先生成神经网络的图结构再执行图中涉及的计算操作。它能有效感知各层算子间的关系基于编译技术进行有效的编译优化以提升性能。但传统静态图需要开发者感知构图接口组建或调试网络比较复杂且难于与常用 Python 库、自定义 Python 函数穿插使用动态图模式能有效解决静态图编程较复杂的问题但程序按照代码编写顺序执行系统难以进行整图编译优化性能优化空间相对较少特别是面向 DSA 等专有硬件的优化难以使能。昇思 MindSpore 由于基于源码转换机制构建神经网络的图结构相比传统静态图模式有更易用的表达能力同时能更好地兼容动态图和静态图的编程接口。以控制流为例动态图可以直接基于 Python 的控制流关键字编程而静态图需要基于特殊的控制流算子编程或开发者显式指示分支导致动静态图编程差异大。MindSpore 的源码转换机制可基于 Python 控制流关键字直接使能静态图模式的执行使动静态图的编程统一性更高。同时开发者可以灵活地对 Python 代码片段进行动静态图模式控制将程序局部函数以静态图模式执行而其他函数按动态图模式执行从而在与常用 Python 库、自定义 Python 函数穿插执行时既能指定片段进行静态图优化加速又不牺牲穿插执行的编程易用性。静态编译机制昇思 MindSpore 在静态图模式下先将 Python 代码编译成静态计算图再执行静态计算图。通过 MindCompiler 编译器将 Python 代码的 AST 表示转换成 ANF 范式的 MindIR 表示并基于 MindIR 展开编译优化和自动微分处理。MindIR 是一种基于图表示的函数式 IR从函数式编程规定来看它与 Python 命令式编程有所区别开发者编写程序时需要遵循 MindSpore 静态图语法支持语法使用存在约束限制。JIT Fallback是从静态图角度出发实现静动统一的关键特性它主要作用于 MindCompiler 编译器应用于图模式场景下的 Python 语法解析和支持将纯底层算子执行的计算图改造成开发者的 Python 代码和算子执行交替混合执行的计算图。主要过程包括检测不支持语法在图编译阶段识别检测出图模式不支持的 Python 语法生成解释节点针对不支持的 Python 语法将相关语句保留下来生成解释节点并将解释节点转换为 ANF IR 表示推导和执行解释节点解释节点有两种执行方式——编译时运行和运行时运行。解释节点是在编译时进行推导的一般而言尽量在编译时执行另一种方式则是在运行时执行。通过 JIT Fallback静态图可以支持尽量多的动态图语法使静态图提供接近动态图的语法使用体验从而实现动静统一。动静混合编程在昇思 MindSpore 中动态图模式被称为PyNative 模式因为代码使用 Python 解释器在该模式下运行。在动态图模式下框架按照 Python 执行模型的所有算子为每个算子生成计算图并传递给后端进行前向计算在完成前向计算的同时根据前向算子对应的反向传播源码转换成单算子反向图最终在完成整体模型的前向计算后生成模型对应的完整反向图并传递给后端执行。由于编译器能获得静态图的全局信息静态图在大多数情况下表现出更好的运行性能动态图则保证更好的易用性使开发者能够更方便地构建和修改模型。为了同时支持静态图和动态图大多数先进的训练框架需要维护两种自动微分机制基于 Tape 的自动微分机制和基于图的自动微分机制。端边云全场景昇思 MindSpore 是训推一体的 AI 框架同时支持训练和推理等功能。它支持 CPU、GPU、NPU 等多种芯片在不同芯片上提供统一的编程使用接口以及可生成在多种硬件上加载执行的离线模型。按照实际执行环境和业务需求MindSpore 提供多种规格的版本形态支持部署在云端、服务器端、手机等嵌入式设备端以及耳机等超轻量级设备端。从昇腾全栈视角看08AscendBase.md端边云设备均采用统一的华为达芬奇架构MindSpore 面向端、边、云全场景可以实现全场景自适应感知与协同模型训练好后可根据不同硬件形态自适应生成相应大小的模型还支持在端侧直接对模型进行轻量训练、更新本地的推理参数既保护个人隐私又提升模型精度实现模型私人订制。轻量化推理轻量化推理是将训练好的模型部署到运行环境中进行推理的过程需要解决模型转换、硬件资源限制、推理时延功耗内存指标以及模型安全等一系列问题模型转换与优化模型完成训练后需将模型及参数持久化成文件不同训练框架导出的模型数据结构不同推理系统需要将模型文件中的数据转换成统一的数据结构在训练模型转推理模型的过程中还需进行算子融合、常量折叠等模型优化以提升推理性能硬件限制适配推理模型部署到不同场景需满足不同的硬件设备限制。具有强大算力的计算中心可部署大规模模型而边缘服务器、个人电脑和智能手机上算力和内存相对有限部署的模型规模要相应降低在超低功耗微控制器上只能部署非常简单的机器学习模型。不同硬件对不同数据类型float32、float16、bfloat16、int8 等的支持程度不同因此有些场景下需要对训练好的模型进行压缩降低复杂度或数据精度、减少参数推理性能优化推理的时延、内存占用、功耗是影响开发者使用的关键因素。优化方式一是设计专有的机器学习芯片相对通用计算芯片在能效比上具有很大优势二是通过软硬协同最大程度发挥硬件能力。以 CPU 为例如何切分数据块以满足 cache 大小、如何对数据重排以便计算时连续访问、如何减少计算时的数据依赖以提升硬件流水线并行、如何使用扩展指令集提升计算性能都需要针对不同 CPU 架构进行设计和优化。联邦学习随着 AI 的飞速发展大规模和高质量的数据对模型效果越来越重要但隐私、监管和工程等问题造成设备与设备之间的数据不能共享导致数据孤岛问题。联邦学习Federated LearningFL概念最早在 2016 年被提出能在满足用户隐私保护、数据安全和政府法规要求的情况下有效使用多方机构的数据进行机器学习建模。MindSpore Federated 是华为昇思 MindSpore 提出的开源联邦学习框架支持千万级无状态终端设备商用化部署在用户数据留存在本地的情况下使能全场景智能应用。它专注于大规模参与方的横向联邦应用场景使参与联邦学习的各用户在不共享本地数据的前提下共建 AI 模型主要解决隐私安全、大规模联邦聚合、半监督联邦学习、通信压缩和跨平台部署等联邦学习在工业场景部署的难点。极致性能昇思 MindSpore 基于编译技术提供了丰富的硬件无关优化如 IR 融合、代数化简、常数折叠、公共子表达式消除等同时针对 NPU、GPU 等不同硬件提供各种硬件优化能力从而更好地发挥硬件的大规模计算加速能力。除传统 AI 框架常用优化外MindSpore 还提供一些比较有特色的技术。图算融合主流 AI 计算框架对开发者提供的算子通常从开发者可理解、易使用角度定义每个算子承载的计算量不等、复杂度不同。但从硬件执行角度看这种基于开发者角度的算子计算量划分并不高效主要体现在计算量过大、过复杂的算子通常很难生成切分较好的高性能算子降低设备利用率计算量过小的算子由于计算无法有效隐藏数据搬移开销可能造成计算的空等时延硬件 Device 通常为多核、众核结构当算子 shape 较小或其它原因引起计算并行度不够时可能造成部分核的空闲。特别是基于专用处理器架构Domain Specific ArchitectureDSA的芯片对这些因素更为敏感。在 AI 框架设计方面业界主流采用图层和算子层分层的实现方法图层负责对计算图进行融合或重组算子层负责将融合或重组后的算子编译为高性能的可执行算子。图层通常采用基于 Tensor 的 High-Level IR 处理和优化算子层采用基于计算指令的 Low-Level IR 分析和优化这种人为分层显著增加了图、算两层协同优化的难度。MindSpore 采用图算融合技术较好地解决了这个问题。Ascend 加速昇腾芯片上集成了 AICORE、AICPU 和 CPUAICORE 负责大型 Tensor Vector 运算AICPU 负责标量运算CPU 负责逻辑控制和任务分发。Host 侧 CPU 负责将图或算子下发到昇腾芯片。昇腾芯片由于具备了运算、逻辑控制和任务分发的功能不需要与 Host 侧 CPU 频繁交互只需将计算完的最终结果返回 Host 侧实现整图下沉到 Device 执行避免 Host-Device 频繁交互减小开销。为充分使用昇腾芯片硬件功能MindSpore 提供了整图下沉功能目的是减少 Host-Device 交互开销有效提升训练与推理性能。MindSpore 构建的图包含数据图和计算图通过将数据图下沉和计算图下沉减少 Host-Device 交互开销且结合循环下沉可以实现多个 Step 下沉进一步减少 Host 和 Device 的交互次数。梯度累积梯度累积是一种将训练神经网络的数据样本按 Batch size 拆分为几个小 Batch然后按顺序进行计算的技术。神经网络模型由许多相互连接的单元组成样本数据在各层中不断前向传播输出预测值通过损失函数计算损失值误差神经网络通过反向传播计算损失值相对于模型参数的梯度最后这些梯度信息用于更新模型参数。梯度累积只计算神经网络模型并不及时更新网络模型的参数而是在计算时累积梯度信息最后统一使用累积的梯度更新参数$$ \text{accumulated} \sum_{i0}^{N} \text{grad}_i $$在不更新模型变量时相当于把原来的数据 Batch size 分成几个小的 Mini-Batch每个 step 中使用的样本是更小的数据集。在 N 个 step 内不更新变量使所有 Mini-Batch 使用相同的模型变量来计算梯度以确保计算得到相同的梯度和权重信息算法上等价于使用原来未切分的 Batch size。即$$ \theta_i \theta_{i-1} - \text{lr} \sum_{i0}^{N} \text{grad}_i $$最终累积梯度会产生与使用全局 Batch size 大小相同的梯度总和。自适应梯度求和与传统的分布式训练中的梯度更新不同**自适应梯度求和Adasum**考虑到梯度的方向在网络训练初期不同 batch 获得的梯度更新方向基本是平行的但随着训练进行梯度更新方向趋向于正交而且网络不同层梯度的正交性差异也比较大。以两个训练节点为例梯度的更新原理如下$$ \begin{aligned} w w_0 - \alpha \left[ \left( 1 - \frac{(g_2^T \cdot g_1)}{2 \cdot | g_1 |^2} \right) g_1 \left( 1 - \frac{(g_2^T \cdot g_1)}{2 \cdot | g_2 |^2} \right) g_2 \right] \ w_0 - \alpha \cdot \text{Adasum}(g_1, g_2) \end{aligned} $$其中g1 是训练节点 1 的梯度g2 是训练节点 2 的梯度。当训练节点拓展到 nn2^xx1,2,3⋯个时采用递归的方式对问题进行分解递归公式如下$$ \begin{aligned} \text{Adasum}(g_{[0,n]}) \text{Adasum}\left( \text{Adasum}(g_{[0,n/2]}), \text{Adasum}(g_{[n/2,n]}) \right) \end{aligned} $$从公式可见Adasum 针对梯度更新考虑了方向因素由于优化器optimizer对梯度的操作不一定满足线性转换实际实现中优化为对经过 optimizer 后的网络权重差值delta weights做 Adasum 操作。另外在实际应用过程中为了优化通信开销通常会采取 Adasum 和传统 Reducesum 混合的执行方式。小结与思考昇思 MindSpore 是华为推出的全场景 AI 计算框架通过统一架构支持端、边、云的 AI 算法研究与部署简化开发流程并提升效率与性能MindSpore 的架构由模型层、表达层、编译优化层和运行时组成实现了从高级 API 到硬件算子的全栈优化保证了执行效率该框架支持面向对象和函数式编程范式以及动静态图统一编程提供了灵活性和易用性同时保持高性能MindSpore 在端边云全场景下的应用包括轻量化推理、联邦学习、图算融合和 Ascend 加速等技术以极致性能满足不同硬件和场景需求。如需进一步深入学习 MindSpore 所处的框架生态与底层原理可继续阅读仓库中的 04Programing.mdAI 框架编程范式、02Fundamentals.md自动微分与反向求导、03History.mdAI 框架三代演进以及 08AscendBase.md昇腾 AI 全栈架构。赞分享文档教程人工智能【免费下载链接】AISystemAISystem 主要是指AI系统包括AI芯片、AI编译器、AI推理和训练框架等AI全栈底层技术项目地址https://gitcode.com/GitHub_Trending/ai/AISystem点击查看免费下载相关推荐深入解析昇思MindSpore框架的10大核心特性从架构到实战的完整指南深入解析昇思MindSpore框架的10大核心特性从架构到实战的完整指南 昇思MindSpore作为华为自研的全场景AI计算框架在AI系统领域展现出了强大的文档教程人工智能Yii框架深度解析高性能PHP框架的核心特性与应用场景Yii框架深度解析高性能PHP框架的核心特性与应用场景 引言认识Yii框架 Yii发音为Yee或 ji: 是一个基于组件的高性能PHP框架专为快速后端Web框架Thorium浏览器比Chrome快的优化版Chromium3大能力一文讲清Thorium浏览器比Chrome快的优化版Chromium3大能力一文讲清 打开同一个网站标准 Chromium 转圈Thorium 已经加载完——这桌面应用跨平台上一篇【亲测免费】 lunar-python 项目教程下一篇【亲测免费】 PX4-Avoidance 项目教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考