CN117971236B - 基于词法和语法分析的算子解析方法、装置、设备及介质 - Google Patents
基于词法和语法分析的算子解析方法、装置、设备及介质 Download PDFInfo
- Publication number
- CN117971236B CN117971236B CN202410380906.4A CN202410380906A CN117971236B CN 117971236 B CN117971236 B CN 117971236B CN 202410380906 A CN202410380906 A CN 202410380906A CN 117971236 B CN117971236 B CN 117971236B
- Authority
- CN
- China
- Prior art keywords
- operator
- parsing
- basic
- lexical
- target complex
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/20—Natural language analysis
- G06F40/205—Parsing
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/20—Natural language analysis
- G06F40/253—Grammatical analysis; Style critique
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/425—Lexical analysis
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Audiology, Speech & Language Pathology (AREA)
- Computational Linguistics (AREA)
- General Health & Medical Sciences (AREA)
- Machine Translation (AREA)
Abstract
本申请公开了基于词法和语法分析的算子解析方法、装置、设备及介质,涉及人工智能技术领域。该方法包括:从人工智能模型和/或深度学习算法框架中获取待实现的复杂算子需求,并根据复杂算子需求确定待解析的目标复杂算子;获取词法分析器预定义的第一解析规则,并根据第一解析规则将目标复杂算子对应的字符串解析为词素;获取语法分析器预定义的第二解析规则,并根据第二解析规则将目标复杂算子对应的词素转化为相应的树状结构体;根据树状结构体将目标复杂算子解析成相应的基础算子,以便基于解析后得到的基础算子进行运算得到目标复杂算子对应的计算结果。通过本申请的技术方案,可以实现对复杂算子的自动解析,有效提高开发效率。
Description
技术领域
本发明涉及人工智能技术领域,特别涉及一种基于词法和语法分析的算子解析方法、装置、设备及介质。
背景技术
近年来,人工智能(Artificial Intelligence,AI)的发展热度不断攀升,技术日益更新迭代。其中,深度学习算法被认为是推动人工智能发展的关键。深度学习算法由计算单元构成,这些计算单元也可以被称为算子。在计算机编程中,算子是执行特定操作的函数或操作符。为了确保AI芯片能够处理日益增长的复杂算子任务,开发者必须挑选与芯片兼容的编程语言,并且依据复杂算子特定的数学逻辑精心设计和实现相应的编程代码,通常涉及到定义新的算子或优化已有的算子。目前最常见的方法是手动编写各个新算子,开发成本较高、效率较低。
因此,如何自动生成复杂算子相应的算子代码以提高开发效率和代码的可维护性,减少手动编写和维护的工作量是本领域技术人员目前需要解决的问题。
发明内容
有鉴于此,本发明的目的在于提供一种基于词法和语法分析的算子解析方法、装置、设备及介质,能够将复杂算子自动解析为基础算子再进行开发,通过自动生成算子代码减少手动编写和维护的工作量。其具体方案如下:
第一方面,本申请公开了一种基于词法和语法分析的算子解析方法,包括:
从人工智能模型和/或深度学习算法框架中获取待实现的复杂算子需求,并根据所述复杂算子需求确定待解析的目标复杂算子;所述复杂算子需求为将复杂算子解析为基础算子的需求,其中,所述基础算子为用于进行单一运算的算子,所述复杂算子为通过至少两个所述基础算子组合得到的算子;
获取词法分析器预定义的第一解析规则,并根据所述第一解析规则将所述目标复杂算子对应的字符串解析为词素;
获取语法分析器预定义的第二解析规则,并根据所述第二解析规则将所述目标复杂算子对应的词素转化为相应的树状结构体;
根据所述树状结构体将所述目标复杂算子解析成相应的基础算子,以便基于解析后得到的基础算子进行运算得到所述目标复杂算子对应的计算结果。
可选的,所述根据所述复杂算子需求确定待解析的目标复杂算子之后,还包括:
将所述目标复杂算子解析记录为对应的第一数学表达式,以便根据所述第一数学表达式确定所述目标复杂算子对应的字符串;
构建预设数据格式的数据管理文件,并通过所述数据管理文件对所述目标复杂算子对应的字符串进行管理;
相应的,所述获取词法分析器预定义的第一解析规则,并根据所述第一解析规则将所述目标复杂算子对应的字符串解析为词素,包括:
从所述数据管理文件中确定所述目标复杂算子对应的字符串;
获取词法分析器预定义的第一解析规则,并根据所述第一解析规则将所述字符串解析为词素。
可选的,所述从所述数据管理文件中确定所述目标复杂算子对应的字符串之前,还包括:
调用第一预设接口获取所述数据管理文件中所述基础算子的第二数学表达式;
根据所述第一数学表达式与所述第二数学表达式,调用第二预设接口判断所述数据管理文件中是否存在缺少的基础算子和/或各所述基础算子是否已经完成解析。
可选的,所述的基于词法和语法分析的算子解析方法,还包括:
若当前存在新接入的人工智能模型和/或深度学习算法框架,则根据所述新接入的人工智能模型和/或深度学习算法框架确定相应的新算子开发需求;
根据所述新算子开发需求和所述复杂算子需求确定所述数据管理文件中不存在的目标算子,并将所述目标算子添加至所述数据管理文件。
可选的,所述的基于词法和语法分析的算子解析方法,还包括:
获取正则表达式定义、数据结构定义以及辅助函数声明;所述正则表达式定义用于生成对所述目标复杂算子对应的字符串进行分解的预设正则匹配规则;所述数据结构定义用于生成存储所述基础算子的结构体;所述辅助函数声明用于定义除所述词法分析器与所述语法分析器声明的函数以外的函数;
基于所述正则表达式定义、所述数据结构定义以及所述辅助函数声明构建辅助文件,以便基于所述辅助文件执行所述基于词法和语法分析的算子解析方法。
可选的,所述根据所述第二解析规则将所述目标复杂算子对应的词素转化为相应的树状结构体之后,还包括:
根据所述辅助文件中的所述数据结构定义对所述树状结构体进行存储,并判断所述树状结构体中是否存在缺少的基础算子;
如果所述树状结构体中存在所述缺少的基础算子,则直接将所述缺少的基础算子添加至所述数据管理文件。
可选的,所述从人工智能模型和/或深度学习算法框架中获取待实现的复杂算子需求,并根据所述复杂算子需求确定待解析的目标复杂算子之后,还包括:
调用第三预设接口,针对所述目标复杂算子对应输入的名称字符串和数据进行规范化正则,以得到相应的规范表达字符。
可选的,所述根据所述第一解析规则将所述目标复杂算子对应的字符串解析为词素,包括:
利用预设正则匹配规则对所述目标复杂算子对应的字符串进行分解,以得到多个分解后字符;
将所述分解后字符与识别字符进行匹配,以将所述目标复杂算子对应的字符串解析为词素;其中,所述识别字符为设置了输出标记的字符。
可选的,所述根据所述第二解析规则将所述目标复杂算子对应的词素转化为相应的树状结构体,包括:
基于预设解析顺序并利用产生式依次确定所述词素对应的节点结构体,并基于所述节点结构体生成所述树状结构体。
可选的,所述的基于词法和语法分析的算子解析方法,还包括:
利用所述词法分析器和/或所述语法分析器对算子的数学表达式进行检测,并针对检测过程中发现的算子的数学表达式错误和异常进行提示。
可选的,所述的基于词法和语法分析的算子解析方法,还包括:
若当前存在仅通过所述基础算子实现的算子开发需求,则确定所述算子开发需求对应的目标基础算子,并根据所述数据管理文件对所述目标基础算子进行预处理,以得到处理后字符串;
构建用于输入所述目标基础算子的算子代码的第四预设接口,并通过所述第四预设接口获取所述目标基础算子的第一算子代码;
基于所述第一算子代码对所述目标基础算子进行计算以得到相应的计算结果。
可选的,所述根据所述树状结构体将所述目标复杂算子解析成相应的基础算子,以便基于解析后得到的基础算子进行运算得到所述目标复杂算子对应的计算结果,包括:
通过第五预设接口对所述树状结构体中的各节点进行调用,以遍历所述树状结构体得到与所述解析后得到的基础算子对应的第二算子代码;
基于所述第二算子代码对所述目标复杂算子进行计算以得到相应的计算结果。
第二方面,本申请公开了一种基于词法和语法分析的算子解析装置,包括:
需求提取模块,用于从人工智能模型和/或深度学习算法框架中获取待实现的复杂算子需求,并根据所述复杂算子需求确定待解析的目标复杂算子;所述复杂算子需求为将复杂算子解析为基础算子的需求,其中,所述基础算子为用于进行单一运算的算子,所述复杂算子为通过多个所述基础算子组合得到的算子;
第一解析模块,用于获取词法分析器预定义的第一解析规则,并根据所述第一解析规则将所述目标复杂算子对应的字符串解析为词素;
第二解析模块,用于获取语法分析器预定义的第二解析规则,并根据所述第二解析规则将所述目标复杂算子对应的词素转化为相应的树状结构体;
算子解析模块,用于根据所述树状结构体将所述目标复杂算子解析成相应的基础算子,以便基于解析后得到的基础算子进行运算得到所述目标复杂算子对应的计算结果。
第三方面,本申请公开了一种电子设备,包括:
存储器,用于存储计算机程序;
处理器,用于加载并执行所述计算机程序以实现如前所述的基于词法和语法分析的算子解析方法的步骤。
第四方面,本申请公开了一种计算机可读存储介质,用于存储计算机程序;其中所述计算机程序被处理器执行时实现如前所述的基于词法和语法分析的算子解析方法。
本申请提供了一种基于词法和语法分析的算子解析方法,包括:从人工智能模型和/或深度学习算法框架中获取待实现的复杂算子需求,并根据所述复杂算子需求确定待解析的目标复杂算子;所述复杂算子需求为将复杂算子解析为基础算子的需求,其中,所述基础算子为用于进行单一运算的算子,所述复杂算子为通过至少两个所述基础算子组合得到的算子;获取词法分析器预定义的第一解析规则,并根据所述第一解析规则将所述目标复杂算子对应的字符串解析为词素;获取语法分析器预定义的第二解析规则,并根据所述第二解析规则将所述目标复杂算子对应的词素转化为相应的树状结构体;根据所述树状结构体将所述目标复杂算子解析成相应的基础算子,以便基于解析后得到的基础算子进行运算得到所述目标复杂算子对应的计算结果。
本申请的有益技术效果为:对于多种AI模型和深度学习算法框架的多种复杂算子开发需求,通过使用词法分析器和语法分析器实现目标复杂算子到基础算子的自动解析。同时,根据其中复杂算子的解析规则,可以处理多种类型复杂算子的输入并解析为对应的基础算子,具有良好的可用性和可扩展性。当基于由多个基础算子组成的树状结构体自动生成算子解析代码进行开发时,不仅可以减少手动编写和维护的工作量,还可以减少错误和提供更好的维护性,并使代码能够适应不断更新的AI芯片和多芯片的环境。如此一来,有效提高开发效率,减少开发成本。
此外,本申请提供的一种基于词法和语法分析的算子解析装置、设备及存储介质,与上述基于词法和语法分析的算子解析方法对应,效果同上。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为现有技术方案中实现复杂算子开发功能的流程示意图;
图2为本申请公开的一种基于词法和语法分析的算子解析方法流程图;
图3为本申请公开的一种Flex和Bison实现算子解析的流程示意图;
图4为本申请公开的一种具体的基于词法和语法分析的算子解析方法流程图;
图5为本申请公开的一种复杂算子atanh的解析示意图;
图6为本申请公开的一种基于词法和语法分析的算子解析系统示意图;
图7为本申请公开的一种基于词法和语法分析的算子解析装置结构示意图;
图8为本申请公开的一种电子设备结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
随着人工智能模型和深度学习算法的快速发展,算子的数学逻辑和复杂度也在逐渐上升。当前,在计算机编程中实现复杂算子的开发通常涉及到定义新的算子或优化已有的算子。同时,基于不同芯片的AI模型,算子开发任务也不完全相同,复杂算子的适应性有限。如图1所示为示例性提供的一种实现复杂算子开发的流程示意图。对于人工智能模型/深度学习算法框架中的待实现的复杂算子需求,现有技术中最常见的方法包括直接进行复杂算子开发或是手动编写解析器。对于不需要解析复杂算子直接进行复杂算子开发的情况,需要对需求列表中的算子依次进行开发以实现功能;对于需要解析复杂算子手动编写解析器的情况,如果是首次针对该复杂算子进行解析,在设计解析器时需要根据特定的算子语法规则编写解析代码以将复杂算子转化为基础算子;如果是非首次针对该复杂算子进行解析,则进一步判断现有解析器是否满足需求,当现有解析器不满足需求时还需要针对解析器进行重开发;只有当现有解析器满足需求时才能够利用现有解析器执行算子开发实现功能。目前基于AI模型中的复杂算子开发工作存在以下几种问题:
(1)最新的深度学习算法框架中存在很多复杂的算子,包括大量的矩阵操作、激活函数、卷积操作等等,这些复杂算子具有较高的复杂度,直接进行开发需要大量的人力和时间成本,也很容易出错或产生漏洞;
(2)软件算子需要频繁更新以保持灵活性,并且需要及时大量的更新。不同开发者的代码习惯等不同,后续维护成本较高;
(3)手动开发的代码的可扩展性较低,不仅需要消耗大量时间维护同一个代码开发标准,而且在满足多种芯片多类复杂算子的适配需求上也面临着很大的挑战。
为此,本申请提供了一种基于词法和语法分析的算子解析方案,能够针对复杂算子自动生成相应的算子代码,减少手动编写和维护的工作量,提高开发效率和代码的可维护性。
下面开始详细介绍本发明提供的一种基于词法和语法分析的算子解析方法实施例一,参见图2所示,该方法包括:
步骤S11:从人工智能模型和/或深度学习算法框架中获取待实现的复杂算子需求,并根据所述复杂算子需求确定待解析的目标复杂算子;所述复杂算子需求为将复杂算子解析为基础算子的需求,其中,所述基础算子为用于进行单一运算的算子,所述复杂算子为通过至少两个所述基础算子组合得到的算子。
当前,人工智能芯片正在越来越多的场景中得到应用,能够专门用于处理人工智能应用中的大量计算任务,而这些处理通常需要较为复杂的算子,从而需要消耗较大的运算资源。因此,针对不同应用场景下的算子开发任务,如果能够实现复杂算子的自动解析,然后再对其进行开发生成算子代码,那么将可以大大提高开发效率。
本申请实施例中,提出了一种在人工智能框架下种基于词法和语法分析的算子解析方法。首先,从人工智能模型和/或深度学习算法框架中获取待实现的复杂算子需求。其中,复杂算子需求为将复杂算子解析为基础算子的需求,也即,需要实现的复杂算子自动解析任务。
值得注意的是,基础算子为用于进行单一运算的算子,例如log(求自然对数)、加、减、除等;复杂算子为通过至少两个所述基础算子组合得到的算子,例如atanh(x)=log((1+x)/(1-x))/2。
当从人工智能模型和/或深度学习算法框架中提取出待实现的复杂算子需求后,根据复杂算子需求确定待解析的目标复杂算子。可以理解的是,针对目标复杂算子的开发需求,需要输入其对应的名称字符串和数据,完成其自动化解析。本申请实施例中,针对目标复杂算子的输入,将其对应的输入进行规范化正则。具体的,调用第三预设接口,针对所述目标复杂算子对应输入的名称字符串和数据进行规范化正则,以得到相应的规范表达字符。
示例性的,对于复杂算子atanh,调用getRegex()接口进行规范化正则,这样无论输入“ATANH”、“atanh”、“Atanh”还是“Atanh(x)”,最终都会指向算子atanh。这样不仅能够降低数据冗余,同时还能提高识别效率。
步骤S12:获取词法分析器预定义的第一解析规则,并根据所述第一解析规则将所述目标复杂算子对应的字符串解析为词素。
步骤S13:获取语法分析器预定义的第二解析规则,并根据所述第二解析规则将所述目标复杂算子对应的词素转化为相应的树状结构体。
为方便描述,将上述步骤S12、步骤S13结合起来进行说明。
本申请实施例中,首先利用词法分析器负责将目标复杂算子对应的字符串分割成词素(token),为后续的语法分析提供基础。其次,利用语法分析器负责将词素转化为多个基础算子组合而成的树状结构体。这样可以自动完成一个复杂算子从输入公式字符串到词素,再到一个树状结构体的解析。该树状结构体完成了将复杂算子解析为各个基础算子。
在一种具体的实施方式中,通过Flex&Bison(F&B)工具自动化生成树状结构体,完成复杂算子到基础算子的自动解析。本领域普通技术人员可以理解,Flex&Bison(F&B)工具仅为示意,并不对上述算子的自动解析过程的技术造成限定,以下实施例中均以Flex&Bison为例进行说明,后面不再进行赘述。
Flex&Bison是一对基于C/C++语言的自动代码生成工具。其中,Flex作为词法分析器,它能够将输入的源代码字符串分割成一个一个的词素,为后续的语法分析提供基础;Bison作为语法分析器,它能够根据语法规则和产生式,通过词法分析器生成的词素再进行必要的操作。Flex和Bison提供了强大的功能和灵活的配置选项,通过使用Flex和Bison工具可以帮助开发人员更轻松地构建出解析器和转换器,并自动生成可执行代码。
需要指出的是,Flex&Bison具有的完善的错误检测和处理能力,因此,在对目标复杂算子进行解析的过程中,还包括:利用所述词法分析器和/或所述语法分析器对算子的数学表达式进行检测,并针对检测过程中发现的算子的数学表达式错误和异常进行提示。如此一来,可以帮助开发人员检测和处理算子表达式中的错误和异常情况,提高代码的健壮性和可靠性。
可见,本申请实施例中能够通过使用Flex和Bison工具实现高效、准确和可靠的复杂算子解析,进而实现一个用于对复杂算子进行解析的自动生成解析器的功能。相比手动编写解析器的方法大大提高了开发效率,减少错误和提供更好的维护性。
如图3所示为基于词法和语法分析实现的自动生成解析器的实现流程图。其中,当使用Flex和Bison工具实现复杂算子解析时,Flex作为词法分析器预定义第一解析规则,然后根据第一解析规则自动生成实现将算子对应的字符串解析为词素;而Bison作为语法分析器预定义第二解析规则,然后根据第二解析规则自动生成实现根据词素完成产生式,如此一来,能够将词素转化为多个基础算子组合而成的树状结构体。可以理解的是,在后续实现的过程中可以通过主程序直接调用所实现的自动生成解析器完成复杂算子的自动解析,只需要输入复杂算子的数学表达式即可。例如,在此处通过getParse()接口,调用Flex&Bison生成的自动生成解析器,将复杂算子解析为树状结构体。
步骤S14:根据所述树状结构体将所述目标复杂算子解析成相应的基础算子,以便基于解析后得到的基础算子进行运算得到所述目标复杂算子对应的计算结果。
本申请实施例中,依次通过词法分析器和语法分析器生成的树状结构体完成了目标复杂算子到基础算子的自动解析,进而完成可以将不同芯片的AI模型中的不同复杂算子解析为可通用的公共基础算子。由于基础算子的复杂度较低,开发难度也较低,因此基于解析后得到的基础算子对目标复杂算子进行运算得到相应的计算结果,可以有效提高开发效率。
具体的,基于基础算子自动完成复杂算子的计算过程,包括:通过第五预设接口对所述树状结构体中的各节点进行调用,以遍历所述树状结构体得到与所述解析后得到的基础算子对应的第二算子代码;基于所述第二算子代码对所述目标复杂算子进行计算以得到相应的计算结果。
示例性的,调用Execute()接口,根据树状结构体,从根节点到叶节点进行调用。这里根节点是所有的输入,叶节点为各种基础算子。调用后对基础算子开发,根据基础算子的算子代码完成目标复杂算子的计算。
需要指出的是,本申请实施例中还通过构建一个辅助文件用于包含整个解析流程中所需的额外结构和规则。例如正则表达式定义、数据结构定义、辅助函数声明等等。
具体的,获取正则表达式定义、数据结构定义以及辅助函数声明;所述正则表达式定义用于生成对所述目标复杂算子对应的字符串进行分解的预设正则匹配规则;所述数据结构定义用于生成存储所述基础算子的结构体;所述辅助函数声明用于定义除所述词法分析器与所述语法分析器声明的函数以外的函数;基于所述正则表达式定义、所述数据结构定义以及所述辅助函数声明构建辅助文件,以便基于所述辅助文件执行所述基于词法和语法分析的算子解析方法。
在一种具体实施方式中,本申请的技术方案可以应用在自动驾驶领域。即:从用于提供自动驾驶服务的人工智能模型和/或深度学习算法框架中获取待实现的复杂算子需求,并根据自动驾驶场景中的复杂算子需求确定待解析的目标复杂算子;所述复杂算子需求为将复杂算子解析为基础算子的需求,其中,所述基础算子为用于进行单一运算的算子,所述复杂算子为通过至少两个所述基础算子组合得到的算子;获取词法分析器预定义的第一解析规则,并根据所述第一解析规则将自动驾驶场景中的所述目标复杂算子对应的字符串解析为词素;获取语法分析器预定义的第二解析规则,并根据所述第二解析规则将自动驾驶场景中的所述目标复杂算子对应的词素转化为相应的树状结构体;根据所述树状结构体将自动驾驶场景中的所述目标复杂算子解析成相应的基础算子,以便基于解析后得到的基础算子进行运算得到自动驾驶场景中的所述目标复杂算子对应的计算结果。可以理解的是,除了可以将本申请的技术方案应用在自动驾驶领域,还可以其他的存在复杂算子开发需求的场景,如人脸图像识别、语音识别等,在此不再一一举例说明。
本申请提供了一种基于词法和语法分析的算子解析方法,包括:从人工智能模型和/或深度学习算法框架中获取待实现的复杂算子需求,并根据所述复杂算子需求确定待解析的目标复杂算子;所述复杂算子需求为将复杂算子解析为基础算子的需求,其中,所述基础算子为用于进行单一运算的算子,所述复杂算子为通过至少两个所述基础算子组合得到的算子;获取词法分析器预定义的第一解析规则,并根据所述第一解析规则将所述目标复杂算子对应的字符串解析为词素;获取语法分析器预定义的第二解析规则,并根据所述第二解析规则将所述目标复杂算子对应的词素转化为相应的树状结构体;根据所述树状结构体将所述目标复杂算子解析成相应的基础算子,以便基于解析后得到的基础算子进行运算得到所述目标复杂算子对应的计算结果。
本申请的有益技术效果为:对于多种AI模型和深度学习算法框架的多种复杂算子开发需求,通过使用词法分析器和语法分析器实现目标复杂算子到基础算子的自动解析。同时,根据其中复杂算子的解析规则,可以处理多种类型复杂算子的输入并解析为对应的基础算子,具有良好的可用性和可扩展性。当基于由多个基础算子组成的树状结构体自动生成算子解析代码进行开发时,不仅可以减少手动编写和维护的工作量,还可以减少错误和提供更好的维护性,并使代码能够适应不断更新的AI芯片和多芯片的环境。如此一来,有效提高开发效率,减少开发成本。
下面开始详细介绍本发明提供的一种基于词法和语法分析的算子解析方法实施例二,实施例二基于实施例一实现,并在实施例一的基础上进行了一定程度的拓展。参见图4所示,该方法包括:
步骤S21:从人工智能模型和/或深度学习算法框架中获取待实现的复杂算子需求,并根据所述复杂算子需求确定待解析的目标复杂算子。
其中,关于上述步骤S21更加具体的处理过程可以参考前述实施例中公开的相应内容,在此不再进行赘述。
步骤S22:将所述目标复杂算子解析记录为对应的第一数学表达式,以便根据所述第一数学表达式确定所述目标复杂算子对应的字符串;构建预设数据格式的数据管理文件,并通过所述数据管理文件对所述目标复杂算子对应的字符串进行管理。
本申请实施例中,在从AI模型和/或深度学习算法框架中提取得到待实现的复杂算子需求后,将其中待解析的目标复杂算子解析记录为对应的数学表达式,根据其数学表达式能够确定目标复杂算子对应的字符串。
进一步的,通过一个数据管理文件对目标复杂算子的数学表达式以及对应的字符串进行管理。例如YAML(YAML Ain't Markup Language,另一种标记语言,是一个可读性高,用来表达数据序列化的格式)、JSON(Java Script Object Notation,JS对象简谱,一种轻量级的数据交换格式,JS全称为Java Script,是一种编程语言)、XML(Extensible MarkupLanguage,可扩展标记语言)、INI(Initialization File,初始化文件)工具等等。在一种具体的实施方式中,以YAML格式管理为例,本申请的.yaml文件中部分代码示例如下:
FundamentalFuncs:
- func: Add
cpu_impl: "v[0] + v[1]"
output_info: GetBinaryOpsOutInfo
- func: Exp
cpu_impl: "std::exp(v[0])"
output_info: CloneOutInfoFromInput0
- func: Log
cpu_impl: "std::log(v[0])"
output_info: CloneOutInfoFromInput0
…
CompoundFuncs:
- func: out = Acosh(x)
expressions:
- out: Log(x + Sqrt(x ** ScalarToTensor(2) - 1))
- func: out = Asinh(x)
expressions:
- out: Log(x + Sqrt(x ** ScalarToTensor(2) + 1))
- func: out = Atanh(x)
expressions:
- out: Log((1+x)/(1-x))/2
# divide_grad: dx = dout/y = 1/y * dout, dy = -output * (dout/y) = -output/y * dout
- func: dx, dy = Divide_Grad(x, y, output, dout, axis)
expressions:
- ti: Initial(x, y, output, dout, axis)
- t0: dout / y
- t2: -output / y * dout
- t3: GetReduceAxes(axis, dout, out_dx, x, y)
- t4: GetReduceAxes(axis, dout, out_dy, x, y)
- t5: ReduceAdd(t0, t3)
- t6: ReduceAdd(t2, t4)
- t7: IsShapeEqual(out_dx, dout)
- t8: IsShapeEqual(out_dy, dout)
- out_dx: if(t7, t0, t5)
- out_dy: if(t8, t2, t6);
需要指出的是,数据管理文件不仅能够对不同的公共的基础算子进行管理,如在.yaml中定义Add、Exp、Log等基础算子;也能够对一些基础的已经实现的复杂算子进行管理,如Acosh、Asinh、Atanh等可解析为基础算子的复杂算子。同时,数据管理文件也能够针对每次接入的新算子开发需求,对其中的算子进行管理,仅需要在.yaml文件中添加即可。如此一来,可以通过开发通用公共算子利用数据管理文件进行管理以有效提高开发效率。
具体的,对于当前存在新接入的人工智能模型和/或深度学习算法框架,根据所述新接入的人工智能模型和/或深度学习算法框架确定相应的新算子开发需求;根据所述新算子开发需求和所述复杂算子需求确定所述数据管理文件中不存在的目标算子,并将所述目标算子添加至所述数据管理文件。
步骤S23:从所述数据管理文件中确定所述目标复杂算子对应的字符串;获取词法分析器预定义的第一解析规则,并根据所述第一解析规则将所述字符串解析为词素。
本申请实施例中,由于通过数据管理文件对算子的数学表达式以及相应的字符串进行管理,那么在对目标复杂算子进行解析的过程中,可以从数据管理文件中确定目标复杂算子对应的字符串。该字符串可以为构成所述目标复杂算子的多个基础算子的字符串,也可以为所述目标复杂算子本身对应的字符串。可以理解的是,如果之前针对该目标复杂算子进行解析后,该目标复杂算子的数学表达式也可由数据管理文件进行管理。那么,当目标复杂算子是原来解析过的算子时,此时确定的字符串则为该目标复杂算子本身的字符串。
需要指出的是,在进行后端算子开发任务时,需要对数据管理文件中的各算子进行管理与预处理。具体的,调用第一预设接口获取所述数据管理文件中所述基础算子的第二数学表达式;根据所述第一数学表达式与所述第二数学表达式,调用第二预设接口判断所述数据管理文件中是否存在缺少的基础算子和/或各所述基础算子是否已经完成解析。
示例性的,首先调用CallOp()接口,获取.yaml文件中的所有基础算子的数学表达式。然后通过IsSupport()接口,完成算子的支持情况判断,比如各个基础算子的解析是否已实现,缺少哪些基础算子等等。
需要指出的是,通过数据管理文件对基础算子的数学表达式进行管理时,也会对基础算子对应输入的名称字符串和数据进行规范化正则。此时同样通过调用getRegex()接口对基础算子的名称字符串和数据进行规范化正则。
步骤S24:获取语法分析器预定义的第二解析规则,并根据所述第二解析规则将所述目标复杂算子对应的词素转化为相应的树状结构体。
需要指出的是,当存在新算子开发需求时,词法分析器和语法分析器也会根据新算子开发需求在各自对应的解析规则中添加新的解析规则,实现解析规则的更新,以此来适应多种AI模型和深度学习算法框架的多种复杂算子开发需求。其中,关于上述步骤S24更加具体的处理过程可以参考前述实施例中公开的相应内容,在此不再进行赘述。
步骤S25:根据所述辅助文件中的所述数据结构定义对所述树状结构体进行存储,并判断所述树状结构体中是否存在缺少的基础算子;如果所述树状结构体中存在所述缺少的基础算子,则直接将所述缺少的基础算子添加至所述数据管理文件。
基于前述实施例中的内容可知,本申请中构建了包含整个解析流程中所需的额外结构和规则的辅助文件。因此,本申请实施例中,在对目标复杂算子解析得到由多个基础算子组成的树状结构体后,根据辅助文件中的数据结构定义对树状结构体进行存储。具体的,辅助文件中定义了一个node结构体,部分代码示例如下:
struct Node {
std::string node_label_;
std::string operator_str_;
std::vector<Node*>branches_;
std::vector<Tensor*>tensor_values_;
};
这个结构体为一个树状形式,用于存储复杂算子解析出的基础算子。如果发现有缺少的基础算子,直接在.yaml文件中添加即可。
步骤S26:根据所述树状结构体将所述目标复杂算子解析成相应的基础算子,以便基于解析后得到的基础算子进行运算得到所述目标复杂算子对应的计算结果。
其中,关于上述步骤S26更加具体的处理过程可以参考前述实施例中公开的相应内容,在此不再进行赘述。
可见,通过本实施例,通过一个数据管理文件对不同的算子的数学表达式以及相应的字符串进行管理。这样在进行算子的自动解析过程时,能够使得生成的代码适应不断更新的AI芯片和多芯片的环境。对于新芯片对应的AI模型的接入,即新的复杂算子需求,可以直接在算子管理部分中添加算子需求,然后相应的通过Flex和Bison添加解析规则,具有很好的可扩展性。
基于上述实施例,为了同时能够实现基础算子的开发,在一种可行的实施方式中,本实施例三,针对当前存在仅通过基础算子实现的算子开发需求进行开发工作。具体的,还可以包括如下步骤:
步骤一:确定所述算子开发需求对应的目标基础算子,并根据所述数据管理文件对所述目标基础算子进行预处理,以得到处理后字符串;
步骤二:构建用于输入所述目标基础算子的算子代码的第四预设接口,并通过所述第四预设接口获取所述目标基础算子的第一算子代码;
步骤三:基于所述第一算子代码对所述目标基础算子进行计算以得到相应的计算结果。
本申请实施例中,如果算子开发需求不涉及复杂算子的解析过程,也即,当前的算子开发需求为仅通过基础算子就可以实现的开发需求。确定当前的算子开发需求对应的目标基础算子。然后根据所述数据管理文件对所述目标基础算子进行预处理,以得到处理后字符串。例如,当前如果要实现a + b,那么预处理后将其处理为a Add b。
可以理解的是,由于基础算子的复杂度较低,开发难度也较低。因此本申请实施例中对于所有的基础算子需要开发者通过手动来实现算子的开发。通过构建用于输入基础算子的代码的接口实现基础算子代码的手动输入。进一步的,针对基础算子的开发,基于所述第一算子代码对所述目标基础算子进行计算以得到相应的计算结果。
可见,本实施例中同时提供了灵活的扩展接口,允许开发者手动实现不同基础算子的开发,进一步的基于该基础算子实现按需扩展和优化,满足新芯片的AI模型的接入和新需求实现。
基于上述实施例,本实施例四将对上述实施例中的S12进行具体的阐述。其中,为了使得词法分析器自动生成实现从字符串解析为词素,所述根据所述第一解析规则将所述目标复杂算子对应的字符串解析为词素的过程可以包括如下步骤:
步骤一:利用预设正则匹配规则对所述目标复杂算子对应的字符串进行分解,以得到多个分解后字符;
步骤二:将所述分解后字符与识别字符进行匹配,以将所述目标复杂算子对应的字符串解析为词素;其中,所述识别字符为设置了输出标记的字符。
本申请实施例中对Flex用于生成词法分析器的具体过程进行描述。词法分析器的主要作用是读取源代码(或任何文本文件),将其分解为一系列的词素(tokens),根据词素对应的规则完成动作解析。具体而言,Flex负责将正则表达式翻译成C代码格式的函数yylex(),可以认为是一个有限状态的自动机。
Flex的标准格式大体分为四个部分,用“%{”、“%}”、%%进行分隔。具体实现伪码如下所示;其中,输入:复杂算子的数学表达式(字符串形式);输出:词素组。
%{
// 声明(Declarations)——包含于%{和%}中,C代码,一般在这里声明全局变量和函数,会被原样复制到生成的.cpp文件中。
#include<string.h>
#include "parser.h" // 各类头文件
extern int yylex(); // 接口声明
%}
// 定义(Definitions)——一些额外可选的定义。
%option outfile="lexer.cpp" header-file="lexer.h" // 控制生成.cpp文件和.h头文件的名称
%%
// 规则(Rules)——在这一部分中完成动作解析。其中一行是一条规则,每条规则由匹配模式pattern(在前,正则表达)和事件action(在后,C代码)组成,当一个模式被匹配到时,执行对应的action。
在本发明的实例中,需要将复杂算子对应的数学公式作为字符串输入,通过自拟的正则匹配规则分解字符串,并实现如下的操作:
[ \t\n] ;
[-+*/%@\^(){}:,\[\]] { return yytext[0]; } // 识别到符号字符时,输出yytext[0],表示输出这个字符,不进行变换;
"**" { return POWER; } // 识别到"**"时,输出一个词素POWER
pi { return PI; }
out { yylval.strval = strdup(yytext); return RESULT; }
out_[a-zA-Z0-9][a-zA-Z0-9_]* { yylval.strval = strdup(yytext); returnRESULT; } // 识别到“out”或者“out_”加其他字符时,yylval.strval = strdup(yytext)表示记录下该段字符串(在Bison中会用到),并输出一个词素RESULT;
[a-zA-Z_][a-zA-Z0-9_]* { yylval.strval = strdup(yytext); returnIDENTIFIER; } // 识别到变量名([a-zA-Z_][a-zA-Z0-9_]*表示首字符必须是英文字母(大写或小写)或下划线_,随后的字符可以是英文字母(大写或小写)、数字 0-9 或下划线_),记录该段字符串,并输出一个词素IDENTIFIER;
-?[0-9]+(\.[0-9]+)? { yylval.strval = strdup(yytext); return NUMBER;} // 识别到数字组(-?[0-9]+(\.[0-9]+)?表示正负数、小数均可),记录该段字符串,并输出一个词素NUMBER;
{ printf("Invalid character: %s\n", yytext); }
%%
// 用户子程序(User subroutines)——C代码,会被原样复制到生成的.cpp文件中,一般在此定义Declarations中声明的函数。这部分可以省略。
可见,在上述的伪代码中,针对不同的字符形式分别设置了相应的输出标记。例如,识别到"**"时,输出一个词素对应的输出标记POWER、识别到变量名([a-zA-Z_][a-zA-Z0-9_](首字符必须是英文字母(大写或小写)或下划线,随后的字符可以是英文字母(大写或小写)、数字0-9或下划线),输出一个词素对应的输出标记IDENTIFIER等。
下面以Flex实现举例:
以一个“简单”的复杂算子atanh为例,这个复杂算子可以进行如下的数学分解:out=atanh(x)=log((1+x)/(1-x))/2
即atanh可以由“log、+、-、/”完成实现。首先将该表达式进行规范化正则,改为out∶log((1+x)/(1-x))/2;经过上述定义的Flex后,该表达式的字符串会自动被解析为[“out”,“:”,“log”,“(”,“(”,“1”,“+”,“x”,“/”“1”,“-”,“x”,“)”,“)”,“/”“2”]的一个有序词素组。
基于上述实施例,本实施例五将对上述实施例中的S13进行具体的阐述。其中,为了使得语法分析器自动生成实现根据词素转化为多个基础算子组合而成的树状结构体,所述根据所述第二解析规则将所述目标复杂算子对应的词素转化为相应的树状结构体的过程可以包括如下步骤:
基于预设解析顺序并利用产生式依次确定所述词素对应的节点结构体,并基于所述节点结构体生成所述树状结构体。
当通过Flex获得词素组后,就需要通过Bison对这些词素组进行解析。本申请实施例中对Bison用于生成语法分析器的具体过程进行描述。Bison的标准格式也分为四个部分,同样用“%{”、“%}”、%%进行分隔。Bison的具体实现伪码如下所示;其中,输入:词素组;输出:node结构体,存储复杂算子解析而成的基础算子组。
%{
// 声明(Declarations)——与Flex相同,原样拷贝到生成的.cpp文件中。这部分中需要定义一些函数接口,这部分函数用于第三部分产生式中。
#include<string.h> // 各类头文件
#include<iostream>
#include "/include/node.h"
extern int yylex(); // 接口声明
std::stack<std::vector<char*>>parser_stack; // 变量的初始化
std::map<std::string, Node*>tree_map_;
std::vector<char*>allocated_ptr;
void leafNodeCreation(char* chartemp, std::string nodelabel) {
auto itl = tree_map_.find(std::string(chartemp));
if (itl == tree_map_.end()) {
tree_map_[std::string(chartemp)]=new Node(std::string(nodelabel));
// serial number update
if (std::regex_match(nodelabel, input_regex)){
inputcount += 1;
} else if (std::regex_match(nodelabel,:output_regex)){
outputcount += 1;
} else if (std::regex_match(nodelabel, constant_regex_v2)) {
}
}
} // 一些在产生式用到的函数,这里仅列出leafNodeCreation{}用于创建一个叶节点
%}
// 定义(Definitions)——定义Bison专有变量,一般包括%union,%start,%token,%type,%left,
%right,%nonassoc等等
%token<strval>IDENTIFIER
%token<strval>NUMBER
%token<strval>PI
%token<strval>POWER
%token<strval>RESULT // 表明IDENTIFIER等是一个词素,是一个字符串值
%type<strval>expr // 声明了非终结符 expr,也是一个字符串值
%start expr // 指定了开始符号,解析器会从expr开始分析输入
%%
// 产生式(Productions)———用户编写的语法产生式,即告诉解析器,需要如何处理各个词素。
expr:
expr '+' expr // 处理两个expr中有一个 '+ '这样的词素组合,创建一个node结构体,结构体operator_str_为“Add”,两个branches分别为两个expr
{
size_t maxLength = getLength();
char* tempIndex = (char*)malloc(maxLength);
getTempIndex(tempIndex, maxLength);
char* chartemp1 = $1;
char* chartemp3 = $3;
// subnode creation check
leafNodeCreation(chartemp1, std::string("parsing add, should notreach here"));
leafNodeCreation(chartemp3, std::string("parsing add, should notreach here"));
// internode creation
std::vector<Node*>internodetemp;
internodetemp.emplace_back(tree_map_[std::string($1)]);
internodetemp.emplace_back(tree_map_[std::string($3)]);
interNodeCreation(tempIndex, "Add", internodetemp);
allocated_ptr.emplace_back(tempIndex);
$$ = tempIndex;
count += 1;
}
| IDENTIFIER // 处理expr是一个IDENTIFIER的情况,例如处理x,创建一个叶节点。
{
char* chartemp1 = $1;
std::string nodelabel = std::string("node##input")+std::to_string(inputcount);
leafNodeCreation(chartemp1, nodelabel);
allocated_ptr.emplace_back($1);
$$ = $1;
}
| NUMBER // 处理expr是一个NUMBER的情况,例如处理x,创建一个叶节点。
{
char* chartemp1 = $1;
std::string nodelabel = std::string("node##constant_")+std::string($1);
leafNodeCreation(chartemp1, nodelabel);
allocated_ptr.emplace_back($1);
$$ = $1;
}
%%
// 用户子程序(User subroutines)——与Flex相同,原样拷贝到生成的.cpp文件中,可以省略
void yyerror(const char* s) {
throw std::runtime_error(s);
} // 抛出异常处理。
可见,根据上述的伪代码可知,利用语法分析器自动生成实现根据词素完成产生式。例如处理expr是一个IDENTIFIER的情况,如处理x,创建一个叶节点;处理两个expr中有一个“+”这样的词素组合,创建一个node结构体,结构体operator_str_为“Add”,两个branches(分支)分别为两个expr。
下面以Bison实现举例:
在伪码第三部分中列出了一部分产生式的代码。首先,在辅助文件中定义了一个node结构体,该结构体的部分代码可参考前述实施例中给出的node结构体代码示例。
以out=log((1+x)/(1-x))/2为例,下面将简单分析运作方式。
首先,经过Flex分析后,out∶log((1+x)/(1-x))/2已经转换为[“out”,“:”,“log”,“(”,“(”,“1”,“+”,“x”,“/”“1”,“-”,“x”,“)”,“)”,“/”“2”]的有序词素组。依照预定义的解析顺序,首先定位到满足产生式expr:NUMBER的词素“1”,依照代码将这个NUMBER解析为一个expr,并生成一个node结构体,记录为:{"1": Leafnode, label_: node##constant_1,no any branches_.};然后定位到满足产生式expr:IDENTIFIER的词素“x”,将这个IDENTIFIER解析为一个expr,并生成一个node结构体,记录为:{"x": Leafnode, label_:node ##input0, no any branches_.};接着解析式会定位到1+x满足expr: expr '+'expr,于是将1+x生成一个node结构体:{"node##tmp1000Atanh": label_: node##tmp1000, str_: Add, branches_ are: { node##constant_1 node##input0 }}。
依次类推,根据Bison中定义的产生式,最终将得到:
{"1": Leafnode, label_: node##constant_1, no any branches_.}
{"2": Leafnode, label_: node##constant_2, no any branches_.}
{"node##out0Atanh": label_: node##out0, str_: Divide, branches_ are:{ node##tmp1003 node##constant_2 }}.
{"node##tmp1000Atanh": label_: node##tmp1000, str_: Add, branches_are: { node##constant_1 node##input0 }}.
{"node##tmp1001Atanh": label_: node##tmp1001, str_: Subtract,branches_ are: {node##constant_1 node##input0 }}.
{"node##tmp1002Atanh": label_: node##tmp1002, str_: Divide, branches_are: { node##tmp1000 node##tmp1001 }}.
{"node##tmp1003Atanh": label_: node##tmp1003, str_: log, branches_are: { node##tmp1002 }}.
{"x": Leafnode, label_: node##input0, no any branches_.}。
如图5所示为atanh在经过Flex&Bison解析后生成的可用于后续代码处理的node结构体的树状具体结构。首先对于输入的复杂算子atanh的表达式进行规范化正则后得到:out:log((1+x)/(1-x))/2;进一步的通过Flex&Bison实现预定义的自动生成解析器得到复杂算子的树状结构体;通过树状结构体能够确定其中的根节点、内部节点、叶节点,各节点分别与上述伪代码中定义的相关节点结构体的内容对应。从图5中可以看到,经过Flex&Bison中预定义的操作,可以自动完成一个复杂算子从输入公式字符串到词素组,再到一个树状结构体的解析。该树状结构体完成了将复杂算子解析为各个基础算子。
下面以一个具体的实施例对基于词法和语法分析的算子解析方法的实现过程进行说明,利用基于词法和语法分析的算子解析方法实现一种自动解析系统。参见图6所示为示例性提供的一种系统架构图。在此系统运行流程具体如下:
(1)需求提取:从人工智能模型和/或深度学习算法框架中获取待实现的复杂算子需求;
(2)需求管理:主要实现利用数据管理文件对复杂算子需求进行预处理和管理。具体的,这一步骤分为两个子阶段,分别为基础算子管理和复杂算子解析。利用数据管理文件对各种基础算子进行管理,同时对目标复杂算子预处理时可以通过调用前述实施例中公开的利用Flex&Bison工具,基于词法和语法解析得到的自动生成解析器自动完成复杂算子的基础化;
需要指出的是,在预处理步骤中,两个子阶段会通过调用getRegex()接口,对字符串进行规范化正则。
(3)算子开发:这一步骤也分为两个子阶段,分别为基础算子开发和复杂算子基础化实现。对于规范化正则后的算子,判断其是否为复杂算子;如果否,则对于所有的基础算子,在基础算子预处理后开发者手动进行基础算子的开发;如果是,则对于复杂算子,解析器自动完成复杂算子基础化,将复杂算子解析为基础算子组成的树状结构体。具体的,通过调用Execute()接口,根据node树状结构体,从根节点到叶节点进行调用,基于基础算子以自动完成复杂算子的计算。
(4)系统调用:在完成以上步骤的流程后,即可简单通过输入复杂算子的名称字符串和数据完成复杂算子的自动化解析。例如可以调用预设接口Compute(“atanh”,x)完成算子计算,获得计算结果。
可见,基于词法和语法分析的算子解析方法,可以完成一个完整的基础算子生成系统,能够实现AI模型与底层基础算子的对接,完成所需任务;AI场景下该系统可以处理多种类型的输入并解析为对应的基础算子。该系统基于C++实现完整的系统架构,以词法分析器和语法分析器为基础,配合其他必要的模块和组件,完整实现深度学习算法中复杂算子的开发、管理与维护,具有良好的可用性和可扩展性。
相应的,本申请实施例还公开了一种基于词法和语法分析的算子解析装置,参见图7所示,该装置包括:
需求提取模块11,用于从人工智能模型和/或深度学习算法框架中获取待实现的复杂算子需求,并根据所述复杂算子需求确定待解析的目标复杂算子;所述复杂算子需求为将复杂算子解析为基础算子的需求,其中,所述基础算子为用于进行单一运算的算子,所述复杂算子为通过多个所述基础算子组合得到的算子;
第一解析模块12,用于获取词法分析器预定义的第一解析规则,并根据所述第一解析规则将所述目标复杂算子对应的字符串解析为词素;
第二解析模块13,用于获取语法分析器预定义的第二解析规则,并根据所述第二解析规则将所述目标复杂算子对应的词素转化为相应的树状结构体;
算子解析模块14,用于根据所述树状结构体将所述目标复杂算子解析成相应的基础算子,以便基于解析后得到的基础算子进行运算得到所述目标复杂算子对应的计算结果。
其中,关于上述各个模块更加具体的工作过程可以参考前述实施例中公开的相应内容,在此不再进行赘述。
由此可见,通过本实施例的上述方案,包括:从人工智能模型和/或深度学习算法框架中获取待实现的复杂算子需求,并根据所述复杂算子需求确定待解析的目标复杂算子;所述复杂算子需求为将复杂算子解析为基础算子的需求,其中,所述基础算子为用于进行单一运算的算子,所述复杂算子为通过至少两个所述基础算子组合得到的算子;获取词法分析器预定义的第一解析规则,并根据所述第一解析规则将所述目标复杂算子对应的字符串解析为词素;获取语法分析器预定义的第二解析规则,并根据所述第二解析规则将所述目标复杂算子对应的词素转化为相应的树状结构体;根据所述树状结构体将所述目标复杂算子解析成相应的基础算子,以便基于解析后得到的基础算子进行运算得到所述目标复杂算子对应的计算结果。
本申请的有益技术效果为:对于多种AI模型和深度学习算法框架的多种复杂算子开发需求,通过使用词法分析器和语法分析器实现目标复杂算子到基础算子的自动解析。同时,根据其中复杂算子的解析规则,可以处理多种类型复杂算子的输入并解析为对应的基础算子,具有良好的可用性和可扩展性。当基于由多个基础算子组成的树状结构体自动生成算子解析代码进行开发时,不仅可以减少手动编写和维护的工作量,还可以减少错误和提供更好的维护性,并使代码能够适应不断更新的AI芯片和多芯片的环境。如此一来,有效提高开发效率,减少开发成本。
在一种具体的实施方式中,所述的基于词法和语法分析的算子解析装置,还包括:
字符串获取模块,用于将所述目标复杂算子解析记录为对应的第一数学表达式,以便根据所述第一数学表达式确定所述目标复杂算子对应的字符串;
管理文件构建模块,用于构建预设数据格式的数据管理文件,并通过所述数据管理文件对所述目标复杂算子对应的字符串进行管理;
相应的,所述第一解析模块12,具体用于:
从所述数据管理文件中确定所述目标复杂算子对应的字符串;获取词法分析器预定义的第一解析规则,并根据所述第一解析规则将所述字符串解析为词素。
在一种具体的实施方式中,所述的基于词法和语法分析的算子解析装置,还包括:
预处理模块,用于调用第一预设接口获取所述数据管理文件中所述基础算子的第二数学表达式;根据所述第一数学表达式与所述第二数学表达式,调用第二预设接口判断所述数据管理文件中是否存在缺少的基础算子和/或各所述基础算子是否已经完成解析。
在一种具体的实施方式中,所述的基于词法和语法分析的算子解析装置,还包括:
新开发需求获取模块,用于若当前存在新接入的人工智能模型和/或深度学习算法框架,则根据所述新接入的人工智能模型和/或深度学习算法框架确定相应的新算子开发需求;
算子添加模块,用于根据所述新算子开发需求和所述复杂算子需求确定所述数据管理文件中不存在的目标算子,并将所述目标算子添加至所述数据管理文件。
在一种具体的实施方式中,所述的基于词法和语法分析的算子解析装置,还包括:
定义数据获取模块,用于获取正则表达式定义、数据结构定义以及辅助函数声明;所述正则表达式定义用于生成对所述目标复杂算子对应的字符串进行分解的预设正则匹配规则;所述数据结构定义用于生成存储所述基础算子的结构体;所述辅助函数声明用于定义除所述词法分析器与所述语法分析器声明的函数以外的函数;
辅助文件构建模块,用于基于所述正则表达式定义、所述数据结构定义以及所述辅助函数声明构建辅助文件,以便基于所述辅助文件执行所述基于词法和语法分析的算子解析方法。
在一种具体的实施方式中,所述的基于词法和语法分析的算子解析装置,还包括:
算子检查模块,用于根据所述辅助文件中的所述数据结构定义对所述树状结构体进行存储,并判断所述树状结构体中是否存在缺少的基础算子;如果所述树状结构体中存在所述缺少的基础算子,则直接将所述缺少的基础算子添加至所述数据管理文件。
在一种具体的实施方式中,所述的基于词法和语法分析的算子解析装置,还包括:
规范正则模块,用于调用第三预设接口,针对所述目标复杂算子对应输入的名称字符串和数据进行规范化正则,以得到相应的规范表达字符。
在一种具体的实施方式中,所述第一解析模块12,具体用于:
利用预设正则匹配规则对所述目标复杂算子对应的字符串进行分解,以得到多个分解后字符;将所述分解后字符与识别字符进行匹配,以将所述目标复杂算子对应的字符串解析为词素;其中,所述识别字符为设置了输出标记的字符。
在一种具体的实施方式中,所述第二解析模块13,具体用于:
基于预设解析顺序并利用产生式依次确定所述词素对应的节点结构体,并基于所述节点结构体生成所述树状结构体。
在一种具体的实施方式中,所述的基于词法和语法分析的算子解析装置,还包括:
异常检测模块,用于利用所述词法分析器和/或所述语法分析器对算子的数学表达式进行检测,并针对检测过程中发现的算子的数学表达式错误和异常进行提示。
在一种具体的实施方式中,所述的基于词法和语法分析的算子解析装置,还包括:
基础算子开发模块,用于若当前存在仅通过所述基础算子实现的算子开发需求,则确定所述算子开发需求对应的目标基础算子,并根据所述数据管理文件对所述目标基础算子进行预处理,以得到处理后字符串;构建用于输入所述目标基础算子的算子代码的第四预设接口,并通过所述第四预设接口获取所述目标基础算子的第一算子代码;基于所述第一算子代码对所述目标基础算子进行计算以得到相应的计算结果。
在一种具体的实施方式中,所述算子解析模块14,具体用于:
通过第五预设接口对所述树状结构体中的各节点进行调用,以遍历所述树状结构体得到与所述解析后得到的基础算子对应的第二算子代码;基于所述第二算子代码对所述目标复杂算子进行计算以得到相应的计算结果。
进一步的,本申请实施例还公开了一种电子设备,图8是根据一示例性实施例示出的电子设备结构图,图中内容不能认为是对本申请的使用范围的任何限制。
图8为本申请实施例提供的一种电子设备的结构示意图。该电子设备,具体可以包括:至少一个处理器21、至少一个存储器22、电源23、通信接口24、输入输出接口25和通信总线26。其中,所述存储器22用于存储计算机程序,所述计算机程序由所述处理器21加载并执行,以实现前述任一实施例公开的基于词法和语法分析的算子解析方法中的相关步骤。另外,本实施例中的电子设备具体可以为计算机。
本实施例中,电源23用于为电子设备上的各硬件设备提供工作电压;通信接口24能够为电子设备创建与外界设备之间的数据传输通道,其所遵循的通信协议是能够适用于本申请技术方案的任意通信协议,在此不对其进行具体限定;输入输出接口25,用于获取外界输入数据或向外界输出数据,其具体的接口类型可以根据具体应用需要进行选取,在此不进行具体限定。
另外,存储器22作为资源存储的载体,可以是只读存储器、随机存储器、磁盘或者光盘等,其上所存储的资源可以包括操作系统221、计算机程序222及数据223等,数据223可以包括各种各样的数据。存储方式可以是短暂存储或者永久存储。
其中,操作系统221用于管理与控制电子设备上的各硬件设备以及计算机程序222,其可以是Windows Server、Netware、Unix、Linux等。计算机程序222除了包括能够用于完成前述任一实施例公开的由电子设备执行的基于词法和语法分析的算子解析方法的计算机程序之外,还可以进一步包括能够用于完成其他特定工作的计算机程序。
进一步的,本申请实施例还公开了一种计算机可读存储介质,这里所说的计算机可读存储介质包括随机存取存储器(Random Access Memory,RAM)、内存、只读存储器(Read-Only Memory,ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、磁碟或者光盘或技术领域内所公知的任意其他形式的存储介质。其中,所述计算机程序被处理器执行时实现前述基于词法和语法分析的算子解析方法。关于该方法的具体步骤可以参考前述实施例中公开的相应内容,在此不再进行赘述。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
结合本文中所公开的实施例描述的基于词法和语法分析的算子解析方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本发明所提供的一种基于词法和语法分析的算子解析方法、装置、设备及介质进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (15)
1.一种基于词法和语法分析的算子解析方法,其特征在于,包括:
从人工智能模型和/或深度学习算法框架中获取待实现的复杂算子需求,并根据所述复杂算子需求确定待解析的目标复杂算子;所述复杂算子需求为将复杂算子解析为基础算子的需求,其中,所述基础算子为用于进行单一运算的算子,所述复杂算子为通过至少两个所述基础算子组合得到的算子;
获取词法分析器预定义的第一解析规则,并根据所述第一解析规则将所述目标复杂算子对应的字符串解析为词素;其中,目标复杂算子对应的字符串为通过将所述目标复杂算子解析记录为对应的第一数学表达式,并根据所述第一数学表达式确定得到的字符串;
获取语法分析器预定义的第二解析规则,并根据所述第二解析规则将所述目标复杂算子对应的词素转化为相应的树状结构体;
根据所述树状结构体将所述目标复杂算子解析成相应的基础算子,以便基于解析后得到的基础算子进行运算得到所述目标复杂算子对应的计算结果。
2.根据权利要求1所述的基于词法和语法分析的算子解析方法,其特征在于,所述根据所述复杂算子需求确定待解析的目标复杂算子之后,还包括:
将所述目标复杂算子解析记录为对应的第一数学表达式,以便根据所述第一数学表达式确定所述目标复杂算子对应的字符串;
构建预设数据格式的数据管理文件,并通过所述数据管理文件对所述目标复杂算子对应的字符串进行管理;
相应的,所述获取词法分析器预定义的第一解析规则,并根据所述第一解析规则将所述目标复杂算子对应的字符串解析为词素,包括:
从所述数据管理文件中确定所述目标复杂算子对应的字符串;
获取词法分析器预定义的第一解析规则,并根据所述第一解析规则将所述字符串解析为词素。
3.根据权利要求2所述的基于词法和语法分析的算子解析方法,其特征在于,所述从所述数据管理文件中确定所述目标复杂算子对应的字符串之前,还包括:
调用第一预设接口获取所述数据管理文件中所述基础算子的第二数学表达式;
根据所述第一数学表达式与所述第二数学表达式,调用第二预设接口判断所述数据管理文件中是否存在缺少的基础算子和/或各所述基础算子是否已经完成解析。
4.根据权利要求2所述的基于词法和语法分析的算子解析方法,其特征在于,还包括:
若当前存在新接入的人工智能模型和/或深度学习算法框架,则根据所述新接入的人工智能模型和/或深度学习算法框架确定相应的新算子开发需求;
根据所述新算子开发需求和所述复杂算子需求确定所述数据管理文件中不存在的目标算子,并将所述目标算子添加至所述数据管理文件。
5.根据权利要求2所述的基于词法和语法分析的算子解析方法,其特征在于,还包括:
获取正则表达式定义、数据结构定义以及辅助函数声明;所述正则表达式定义用于生成对所述目标复杂算子对应的字符串进行分解的预设正则匹配规则;所述数据结构定义用于生成存储所述基础算子的结构体;所述辅助函数声明用于定义除所述词法分析器与所述语法分析器声明的函数以外的函数;
基于所述正则表达式定义、所述数据结构定义以及所述辅助函数声明构建辅助文件,以便基于所述辅助文件执行所述基于词法和语法分析的算子解析方法。
6.根据权利要求5所述的基于词法和语法分析的算子解析方法,其特征在于,所述根据所述第二解析规则将所述目标复杂算子对应的词素转化为相应的树状结构体之后,还包括:
根据所述辅助文件中的所述数据结构定义对所述树状结构体进行存储,并判断所述树状结构体中是否存在缺少的基础算子;
如果所述树状结构体中存在所述缺少的基础算子,则直接将所述缺少的基础算子添加至所述数据管理文件。
7.根据权利要求1所述的基于词法和语法分析的算子解析方法,其特征在于,所述从人工智能模型和/或深度学习算法框架中获取待实现的复杂算子需求,并根据所述复杂算子需求确定待解析的目标复杂算子之后,还包括:
调用第三预设接口,针对所述目标复杂算子对应输入的名称字符串和数据进行规范化正则,以得到相应的规范表达字符。
8.根据权利要求1所述的基于词法和语法分析的算子解析方法,其特征在于,所述根据所述第一解析规则将所述目标复杂算子对应的字符串解析为词素,包括:
利用预设正则匹配规则对所述目标复杂算子对应的字符串进行分解,以得到多个分解后字符;
将所述分解后字符与识别字符进行匹配,以将所述目标复杂算子对应的字符串解析为词素;其中,所述识别字符为设置了输出标记的字符。
9.根据权利要求1所述的基于词法和语法分析的算子解析方法,其特征在于,所述根据所述第二解析规则将所述目标复杂算子对应的词素转化为相应的树状结构体,包括:
基于预设解析顺序并利用产生式依次确定所述词素对应的节点结构体,并基于所述节点结构体生成所述树状结构体。
10.根据权利要求1所述的基于词法和语法分析的算子解析方法,其特征在于,还包括:
利用所述词法分析器和/或所述语法分析器对算子的数学表达式进行检测,并针对检测过程中发现的算子的数学表达式错误和异常进行提示。
11.根据权利要求2至6任一项所述的基于词法和语法分析的算子解析方法,其特征在于,还包括:
若当前存在仅通过所述基础算子实现的算子开发需求,则确定所述算子开发需求对应的目标基础算子,并根据所述数据管理文件对所述目标基础算子进行预处理,以得到处理后字符串;
构建用于输入所述目标基础算子的算子代码的第四预设接口,并通过所述第四预设接口获取所述目标基础算子的第一算子代码;
基于所述第一算子代码对所述目标基础算子进行计算以得到相应的计算结果。
12.根据权利要求1至10任一项所述的基于词法和语法分析的算子解析方法,其特征在于,所述根据所述树状结构体将所述目标复杂算子解析成相应的基础算子,以便基于解析后得到的基础算子进行运算得到所述目标复杂算子对应的计算结果,包括:
通过第五预设接口对所述树状结构体中的各节点进行调用,以遍历所述树状结构体得到与所述解析后得到的基础算子对应的第二算子代码;
基于所述第二算子代码对所述目标复杂算子进行计算以得到相应的计算结果。
13.一种基于词法和语法分析的算子解析装置,其特征在于,包括:
需求提取模块,用于从人工智能模型和/或深度学习算法框架中获取待实现的复杂算子需求,并根据所述复杂算子需求确定待解析的目标复杂算子;所述复杂算子需求为将复杂算子解析为基础算子的需求,其中,所述基础算子为用于进行单一运算的算子,所述复杂算子为通过多个所述基础算子组合得到的算子;
第一解析模块,用于获取词法分析器预定义的第一解析规则,并根据所述第一解析规则将所述目标复杂算子对应的字符串解析为词素;其中,目标复杂算子对应的字符串为通过将所述目标复杂算子解析记录为对应的第一数学表达式,并根据所述第一数学表达式确定得到的字符串;
第二解析模块,用于获取语法分析器预定义的第二解析规则,并根据所述第二解析规则将所述目标复杂算子对应的词素转化为相应的树状结构体;
算子解析模块,用于根据所述树状结构体将所述目标复杂算子解析成相应的基础算子,以便基于解析后得到的基础算子进行运算得到所述目标复杂算子对应的计算结果。
14.一种电子设备,其特征在于,包括:
存储器,用于存储计算机程序;
处理器,用于加载并执行所述计算机程序以实现如权利要求1至12任一项所述的基于词法和语法分析的算子解析方法的步骤。
15.一种计算机可读存储介质,其特征在于,用于存储计算机程序;其中所述计算机程序被处理器执行时实现如权利要求1至12任一项所述的基于词法和语法分析的算子解析方法。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202410380906.4A CN117971236B (zh) | 2024-03-31 | 2024-03-31 | 基于词法和语法分析的算子解析方法、装置、设备及介质 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202410380906.4A CN117971236B (zh) | 2024-03-31 | 2024-03-31 | 基于词法和语法分析的算子解析方法、装置、设备及介质 |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| CN117971236A CN117971236A (zh) | 2024-05-03 |
| CN117971236B true CN117971236B (zh) | 2024-06-18 |
Family
ID=90859844
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| CN202410380906.4A Active CN117971236B (zh) | 2024-03-31 | 2024-03-31 | 基于词法和语法分析的算子解析方法、装置、设备及介质 |
Country Status (1)
| Country | Link |
|---|---|
| CN (1) | CN117971236B (zh) |
Families Citing this family (2)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN118394348B (zh) * | 2024-06-28 | 2024-10-22 | 浪潮电子信息产业股份有限公司 | 一种算子调度方法、装置、设备及计算机可读存储介质 |
| CN118586477B (zh) * | 2024-06-30 | 2025-11-28 | 浪潮电子信息产业股份有限公司 | 多元异构算力适配方法、装置、设备、介质及产品 |
Family Cites Families (15)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| DE102017103951A1 (de) * | 2017-02-24 | 2018-08-30 | Volume Graphics Gmbh | Verfahren und Vorrichtung zur Mehrfachkantenerkennung |
| CN111666077B (zh) * | 2020-04-13 | 2022-02-25 | 北京百度网讯科技有限公司 | 算子处理方法、装置、电子设备及存储介质 |
| CN111309757B (zh) * | 2020-05-14 | 2020-09-01 | 深圳市赢时胜信息技术股份有限公司 | 一种HBase的SQL解释器和优化方法 |
| CN111880807A (zh) * | 2020-07-31 | 2020-11-03 | Oppo广东移动通信有限公司 | 深度学习编译方法、装置、设备及存储介质 |
| CN112580805B (zh) * | 2020-12-25 | 2024-11-08 | 三星(中国)半导体有限公司 | 神经网络模型的量化方法和量化神经网络模型的装置 |
| KR102298766B1 (ko) * | 2021-02-15 | 2021-09-07 | 주식회사 딥이티 | 타겟 디바이스에 대한 딥러닝 모델 변환 장치 및 방법 |
| CN113420865A (zh) * | 2021-06-15 | 2021-09-21 | 之江实验室 | 一种基于多算子融合的深度神经网络推理加速方法和系统 |
| CN114327405A (zh) * | 2021-12-28 | 2022-04-12 | 杭州海康威视数字技术股份有限公司 | 数据处理方法、装置、设备及存储介质 |
| KR102777879B1 (ko) * | 2022-02-10 | 2025-03-11 | 한국전자통신연구원 | 이종 컴퓨팅 플랫폼 지원 딥러닝 컴파일러 및 그 방법 |
| CN114218929B (zh) * | 2022-02-22 | 2022-05-17 | 之江实验室 | 一种基于元算子融合的多平台算子智能化开发系统及方法 |
| CN114841326B (zh) * | 2022-05-19 | 2024-01-12 | 北京百度网讯科技有限公司 | 深度学习框架的算子处理方法、装置、设备和存储介质 |
| CN116185416A (zh) * | 2022-12-12 | 2023-05-30 | 深圳鲲云信息科技有限公司 | 算子的接口文件生成方法、装置、设备及存储介质 |
| CN117270871A (zh) * | 2023-09-25 | 2023-12-22 | 亿咖通(湖北)技术有限公司 | Ai算子构建方法、运算方法、服务器和存储介质 |
| CN117762404A (zh) * | 2023-11-29 | 2024-03-26 | 中国建设银行股份有限公司 | 用于数据挖掘的可配置算子处理方法及装置 |
| CN117610555A (zh) * | 2023-12-05 | 2024-02-27 | 中国农业银行股份有限公司 | 一种字符串表达式处理方法、装置、设备及存储介质 |
-
2024
- 2024-03-31 CN CN202410380906.4A patent/CN117971236B/zh active Active
Non-Patent Citations (2)
| Title |
|---|
| 人工智能算子接口标准化研究;黎子毅;李克森;李雨芮;范睿博;敖玉龙;杨超;;人工智能;20200610(03);全文 * |
| 面向计算机视觉的领域特定语言;姜靖;郑启龙;;小型微型计算机系统;20200315(03);全文 * |
Also Published As
| Publication number | Publication date |
|---|---|
| CN117971236A (zh) | 2024-05-03 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| CN117971236B (zh) | 基于词法和语法分析的算子解析方法、装置、设备及介质 | |
| US8091071B2 (en) | Method and system for template-based code generation | |
| CN110673854B (zh) | Sas语言编译方法、装置、设备及可读存储介质 | |
| US9298427B2 (en) | Creating inferred symbols from code usage | |
| CN111736813B (zh) | Jpa代码的生成方法、装置、终端设备及存储介质 | |
| US20040158820A1 (en) | System for generating an application framework and components | |
| US9405518B2 (en) | Leveraging legacy applications for use with modern applications | |
| CN109857389B (zh) | 模型数据生成方法、装置、计算机设备及存储介质 | |
| CN112667287B (zh) | 规则文件的创建方法、装置、设备及计算机可读存储介质 | |
| US11604774B2 (en) | Method and apparatus of converting schema in deep learning framework, and computer storage medium | |
| CN114356964A (zh) | 数据血缘构建方法、装置、存储介质及电子设备 | |
| CN112306493A (zh) | 热修复补丁生成方法、装置、存储介质及计算机设备 | |
| CN114443041A (zh) | 抽象语法树的解析方法及计算机程序产品 | |
| CN109325217A (zh) | 一种文件转换方法、系统、装置及计算机可读存储介质 | |
| Zhang et al. | Automated extraction of grammar optimization rule configurations for metamodel-grammar co-evolution | |
| CN110928535B (zh) | 衍生变量部署方法、装置、设备及可读存储介质 | |
| CN116893963A (zh) | Fuzz驱动程序生成方法、装置、电子设备及存储介质 | |
| Kastens | Attribute grammars in a compiler construction environment | |
| CN111831288B (zh) | 一种自动生成Thrift IDL数据结构及自动转换函数的方法及系统 | |
| CN111240681B (zh) | 一种不同编程语言的转换方法及装置 | |
| CN118760437A (zh) | 多语言前端翻译成网络安全专用编译器的yak字节码的方法 | |
| CN118246033A (zh) | 跨平台代码异常漏洞检测方法、系统、设备、介质及产品 | |
| CN117591095A (zh) | 一种基于表达式ast解析和可配置模板的代码生成方法 | |
| CN117539752A (zh) | 差异生成方法、显示方法、装置、设备及存储介质 | |
| CN119938048A (zh) | 数据流图的生成方法、装置、设备、存储介质及程序产品 |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| PB01 | Publication | ||
| PB01 | Publication | ||
| SE01 | Entry into force of request for substantive examination | ||
| SE01 | Entry into force of request for substantive examination | ||
| GR01 | Patent grant | ||
| GR01 | Patent grant |