CN116974583A - 数据处理方法、装置、计算机设备、存储介质及程序产品 - Google Patents
数据处理方法、装置、计算机设备、存储介质及程序产品 Download PDFInfo
- Publication number
- CN116974583A CN116974583A CN202210431717.6A CN202210431717A CN116974583A CN 116974583 A CN116974583 A CN 116974583A CN 202210431717 A CN202210431717 A CN 202210431717A CN 116974583 A CN116974583 A CN 116974583A
- Authority
- CN
- China
- Prior art keywords
- module
- target
- model
- model service
- code
- 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.)
- Pending
Links
- 238000003672 processing method Methods 0.000 title abstract description 31
- 238000006243 chemical reaction Methods 0.000 claims abstract description 72
- 238000012545 processing Methods 0.000 claims abstract description 27
- 230000006870 function Effects 0.000 claims description 220
- 238000000034 method Methods 0.000 claims description 79
- 230000008569 process Effects 0.000 claims description 32
- 238000013475 authorization Methods 0.000 claims description 30
- 238000004590 computer program Methods 0.000 claims description 22
- 230000004044 response Effects 0.000 claims description 3
- 238000013473 artificial intelligence Methods 0.000 abstract description 23
- 238000004422 calculation algorithm Methods 0.000 description 21
- 238000005516 engineering process Methods 0.000 description 14
- 238000010586 diagram Methods 0.000 description 13
- 238000012937 correction Methods 0.000 description 7
- 230000003993 interaction Effects 0.000 description 5
- 238000013461 design Methods 0.000 description 4
- 238000011160 research Methods 0.000 description 4
- 230000003287 optical effect Effects 0.000 description 3
- 238000012795 verification Methods 0.000 description 3
- 125000000174 L-prolyl group Chemical group [H]N1C([H])([H])C([H])([H])C([H])([H])[C@@]1([H])C(*)=O 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 2
- 238000004891 communication Methods 0.000 description 2
- 238000005336 cracking Methods 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 230000008676 import Effects 0.000 description 2
- 238000010801 machine learning Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000002093 peripheral effect Effects 0.000 description 2
- 230000011664 signaling Effects 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 238000013519 translation Methods 0.000 description 2
- 230000006978 adaptation Effects 0.000 description 1
- 230000002155 anti-virotic effect Effects 0.000 description 1
- 238000012098 association analyses Methods 0.000 description 1
- 238000012550 audit Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000008571 general function Effects 0.000 description 1
- 238000002955 isolation Methods 0.000 description 1
- 238000012954 risk control Methods 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/35—Creation or generation of source code model driven
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/51—Source to source
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请提供一种数据处理方法、装置、计算机设备、存储介质及程序产品,涉及人工智能、云安全、智慧交通技术领域。通过基于目标代码确定第一程序语言对应的目标解释器,基于该目标解释器对第一程序语言的模型服务源代码和钩子源代码进行程序语言转换,得到第二程序语言的目标源代码,并将该目标源代码编译为该动态共享库。再基于第二设备的部署请求向其返回动态共享库以及模型关键数据,使得第二设备无需修改解释器也可以完成对模型服务模块的加载,且该动态共享库为可直接使用处理器执行的可执行文件,既避免了经由解释器执行泄露源码的风险,同时提高了代码执行效率,提高了动态共享库的安全性,进而提高了服务部署的安全性和可靠性。
Description
技术领域
本申请涉及人工智能、云安全、智慧交通技术领域,本申请涉及一种数据处理方法、装置、计算机设备、存储介质及程序产品。
背景技术
随着互联网技术发展,Python语言因其简洁、高兼容性等优势被广泛应用于AI(Artificial Intelligence,人工智能)算法模型的开发。但因Python语言是解释型语言,本领域技术人员通常将用Python语言实现的AI算法模型进一步处理,以保护AI算法模型的知识产权。
相关技术中,通常采用Python脚本编译成字节码文本进行混淆的数据处理方式,以对AI算法模型进行保护。然而,目前已有的非常成熟反编译工具,可对字节码文件进行反编译,甚至能得到可读性很高的Python源代码,因此,上述数据处理方式对算法模型的保护的安全性较差。
发明内容
本申请提供了一种数据处理方法、装置、计算机设备、存储介质及程序产品,可以解决相关技术中安全性较差的问题。所述技术方案如下:
一方面,提供了一种数据处理方法,所述方法应用于第一设备,所述方法包括:
响应于任一第二设备的部署请求,向所述第二设备发送动态共享库以及模型关键数据,所述部署请求用于请求部署模型服务;
其中,所述共享库文件包括模型服务源代码对应的模型服务模块、以及钩子源代码对应的钩子模块,所述模型服务模块包括基于所述模型关键数据提供模型服务的执行逻辑,所述钩子模块包括对所述模型服务模块的加载逻辑;
其中,所述动态共享库的生成方式,包括:
基于目标代码,确定第一程序语言对应的目标解释器,所述目标代码至少包括将源代码由第一程序语言转换为第二程序语言的执行逻辑;
基于所述目标解释器,对第一程序语言的模型服务源代码和钩子源代码进行程序语言转换,得到第二程序语言的目标源代码,并将所述目标源代码编译为所述动态共享库。
另一方面,提供了一种数据处理方法,所述方法应用于第二设备,所述方法包括:
接收第一设备发送的动态共享库以及模型关键数据;
其中,所述共享库文件包括模型服务模块以及钩子模块,所述模型服务模块包括基于所述模型关键数据提供模型服务的执行逻辑,所述钩子模块包括对所述模型服务模块的加载逻辑;
在初始化所述动态共享库时,将所述动态共享库加载至所述第二设备的内存中,并在所述第二设备的解释器中注册所述钩子模块;
响应于对所述模型服务模块的加载指令,基于所述钩子模块加载所述模型服务模块,并通过所述第二设备的处理器执行所述模型服务模块对应的执行逻辑,以基于所述模型关键数据提供所述模型服务。
另一方面,提供了一种数据处理装置,所述装置应用于第一设备,所述装置包括:
发送模块,用于响应于任一第二设备的部署请求,向所述第二设备发送动态共享库以及模型关键数据,所述部署请求用于请求部署模型服务;
其中,所述共享库文件包括模型服务源代码对应的模型服务模块、以及钩子源代码对应的钩子模块,所述模型服务模块包括基于所述模型关键数据提供模型服务的执行逻辑,所述钩子模块包括对所述模型服务模块的加载逻辑;
其中,所述装置还用于生成动态共享库,所述装置在生成所述动态共享库时,包括:
目标解释器确定模块,用于基于目标代码,确定第一程序语言对应的目标解释器,所述目标代码至少包括将源代码由第一程序语言转换为第二程序语言的执行逻辑;
转换模块,用于基于所述目标解释器,对第一程序语言的模型服务源代码和钩子源代码进行程序语言转换,得到第二程序语言的目标源代码,并将所述目标源代码编译为所述动态共享库。
在一个可能实现方式中,所述目标代码还包括基于预配置的目标命名方式命名模块名的执行逻辑;
相应的,所述装置还包括目标代码获取模块,所述目标代码获取模块用于:
在程序语言转换代码中的入口函数生成代码中增加模块命名代码,得到所述目标代码;
其中,所述模块命名代码包括基于预配置的目标命名方式命名模块名的执行逻辑,所述目标命名方式与所述加载逻辑中的模块名变量的参数赋值方式相同,所述加载逻辑用于指示基于所述模块名变量对应参数、文件变量对应参数加载所述模型服务模块。
在一个可能实现方式中,所述转换模块,还用于在基于所述程序语言转换代码对模型服务源代码进行程序语言转换时,基于所述入口函数生成代码中的模块命名代码,按照目标命名方式命名所述模型服务源代码对应模型服务模块的模块名。
在一个可能实现方式中,所述目标代码还包括所述模型服务模块和钩子模块在所述动态共享库中被隐藏的执行逻辑、以及入口函数在所述动态库中可见的执行逻辑;
相应的,所述装置还包括目标代码获取模块,所述目标代码获取模块用于:
在程序语言转换代码中增加目标隐藏代码,并在所述程序语言转换代码中的入口函数生成代码中增加目标可见代码,得到所述目标代码,所述目标隐藏代码包括所述钩子模块和模型服务模块在所述动态共享库被隐藏的执行逻辑,所述目标可见代码包括将所述入口函数属性定义为可见的执行逻辑。
在一个可能实现方式中,所述转换模块,还用于将所述目标源代码进行编译为至少一个目标对象文件,并将所述至少一个目标对象文件链接为动态共享库;在编译和链接过程中,基于所述目标隐藏代码,将所述动态共享库各个符号设置为隐藏,并基于所述目标可见代码,将所述动态共享库对应的入口函数的属性定义为可见。
在一个可能实现方式中,所述钩子模块包括查找函数和加载函数所对应的类的执行逻辑;
其中,所述查找函数和加载函数所对应的类的执行逻辑包括:查找待加载模块是否属于所述模型服务模块中的模块;如果所述待加载模块属于所述模型服务模块中的模块,则基于所述加载函数执行对所述待加载模块名的加载逻辑。
在一个可能实现方式中,所述转换模块,还用于:
基于所述目标解释器,将第一源代码中的数据打开函数修改为目标打开函数,得到所述模型服务源代码;
在第二源代码中增加解密代码和授权校验代码,得到所述钩子源代码;
其中,所述第一源代码包括基于模型关键数据提供模型服务的执行逻辑,所述目标打开函数用于指示对所述模型关键数据进行解密并打开;所述第二源代码包括对所述模型服务模块的加载逻辑,所述解密代码包括对所述模型关键数据进行解密并打开的执行逻辑;所述授权校验代码用于指示对待部署设备进行授权校验的执行逻辑;
将所述模型服务源代码和钩子源代码由第一程序语言转换为第二程序语言,得到所述目标源代码。
在一个可能实现方式中,所述装置还包括:
获取模块,用于基于所述钩子模块的注册函数,获取所述动态共享库的初始化文件,所述注册函数用于指示在所述第二设备的解释器中注册所述钩子模块;
相应的,所述发送模块还用于向所述第二设备发送动态共享库、所述动态共享库的初始化文件以及所述模型关键数据。
另一方面,提供了一种数据处理装置,所述装置应用于第二设备,所述装置包括:
接收模块,用于接收第一设备发送的动态共享库以及模型关键数据;
其中,所述共享库文件包括模型服务模块以及钩子模块,所述模型服务模块包括基于所述模型关键数据提供模型服务的执行逻辑,所述钩子模块包括对所述模型服务模块的加载逻辑;
注册模块,用于在初始化所述动态共享库时,将所述动态共享库加载至所述第二设备的内存中,并在所述第二设备的解释器中注册所述钩子模块;
加载模块,用于响应于对所述模型服务模块的加载指令,基于所述钩子模块加载所述模型服务模块,并通过所述第二设备的处理器执行所述模型服务模块对应的执行逻辑,以基于所述模型关键数据提供所述模型服务。
在一个可能实现方式中,所述注册模块,用于调用所述动态共享库的初始化文件中的钩子注册函数,以在所述解释器中注册所述钩子模块所包括的查找函数和加载函数所对应的类;
其中,所述钩子注册函数用于执行所述钩子模块所包括的钩子注册逻辑,所述钩子注册逻辑包括在所述解释器中注册所述钩子模块所对应的查找函数和加载函数所对应的类;
相应的,所述加载模块,用于响应于对所述模型服务模块的加载指令,基于所述解释器传入的待加载模块名,调用所述查找函数和加载函数所对应的类所包括的加载函数,以加载模型服务模块。
在一个可能实现方式中,所述加载函数的变量包括模块名变量和文件变量;
相应的,所述加载模块,用于:
将所述文件变量赋值为文件对象,并获取所述文件对象对应的文件描述符和文件设备;
基于所述解释器传入的待加载模块名、所述文件描述符和文件设备,从句柄数组中查找所述待加载模块名在所述动态共享库中对应的待加载文件,并加载所述待加载文件。
另一方面,提供了一种计算机设备,包括存储器、处理器及存储在存储器上的计算机程序,所述处理器执行所述计算机程序以实现上述的数据处理方法。
另一方面,提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述的数据处理方法。
另一方面,提供了一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现上述的数据处理方法。
本申请实施例提供的技术方案带来的有益效果是:
本申请提供的数据处理方法,通过基于目标代码,确定第一程序语言对应的目标解释器,该目标代码至少包括将源代码由第一程序语言转换为第二程序语言的执行逻辑;基于该目标解释器,对第一程序语言的模型服务源代码和钩子源代码进行程序语言转换,得到第二程序语言的目标源代码,并将该目标源代码编译为该动态共享库。再基于第二设备的部署请求向其返回动态共享库以及模型关键数据,使得第二设备无需修改解释器也可以基于钩子模块完成对模型服务模块的加载,且钩子模块和模型服务模块位于动态共享库,该动态共享库为可执行文件,从而使得第二设备可直接使用处理器执行模型服务对应的执行逻辑,既避免了经由解释器执行泄露源码的风险,同时提高了代码执行效率,提高了动态共享库的安全性,进而提高了基于本申请的数据处理方法进行服务部署的安全性和可靠性。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对本申请实施例描述中所需要使用的附图作简单地介绍。
图1为本申请实施例提供的一种数据处理方法的实施环境示意图;
图2为本申请实施例提供的一种动态数据库生成方法的流程示意图;
图3为本申请实施例提供的一种动态数据库的目录结构示意图;
图4为本申请实施例提供的一种动态数据库生成方法的流程示意图;
图5为本申请实施例提供的一种数据处理的信令交互图;
图6为本申请实施例提供的一种钩子模块的注册和加载的流程示意图;
图7为本申请实施例提供的一种加密和解密过程的示意图;
图8为本申请实施例提供的一种数据处理装置的结构示意图;
图9为本申请实施例提供的一种数据处理装置的结构示意图;
图10为本申请实施例提供的一种计算机设备的结构示意图。
具体实施方式
下面结合本申请中的附图描述本申请的实施例。应理解,下面结合附图所阐述的实施方式,是用于解释本申请实施例的技术方案的示例性描述,对本申请实施例的技术方案不构成限制。
可以理解的是,在本申请的具体实施方式中,涉及到对象的设备中的信息,如第二设备中的解释器、第二设备中的处理器等任何与对象相关的数据,当本申请以下实施例运用到具体产品或技术中时,需要获得对象许可或者同意,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。
本申请提供的数据处理方法,涉及以下的人工智能技术、云安全、云计算技术等。示例性的,本申请中服务提供方和服务待部署方可以利用大数据处理、云计算等技术,实现对模型服务源代码、钩子源代码的程序语言转换、编译等过程,对模型关键数据的加解密,以保证服务部署的安全性。另外,本申请提供的模型服务可以是以人工智能技术为技术支撑的服务。例如,服务提供方利用机器学习、计算机视觉技术等训练具备一定功能的模型,以向服务待部署方提供相应的模型服务。
应理解的是,人工智能(Artificial Intelligence,AI)是利用数字计算机或者数字计算机控制的机器模拟、延伸和扩展人的智能,感知环境、获取知识并使用知识获得最佳结果的理论、方法、技术及应用系统。换句话说,人工智能是计算机科学的一个综合技术,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器。人工智能也就是研究各种智能机器的设计原理与实现方法,使机器具有感知、推理与决策的功能。人工智能基础技术一般包括如传感器、专用人工智能芯片、云计算、分布式存储、大数据处理技术、操作/交互系统、机电一体化等技术。
示例性的,本申请可利用云安全技术,在私有化部署模型服务时,服务提供方可预对模型服务源代码和钩子源代码进行程序语言转换、编译,得到动态共享库;还可以在编译、链接得到动态共享库过程中,对该动态共享库中的符号进行隐藏,以保证私有化部署流程中服务提供方和服务待部署方所涉及的各个环节的安全性。
应理解的是,云安全(Cloud Security)是指基于云计算商业模式应用的安全软件、硬件、对象、机构、安全云平台的总称。云安全主要研究方向包括:1、云计算安全,主要研究如何保障云自身及云上各种应用的安全,包括云计算机系统安全、对象数据的安全存储与隔离、对象接入认证、信息传输安全、网络攻击防护、合规审计等;2、安全基础设施的云化,主要研究如何采用云计算新建与整合安全基础设施资源,优化安全防护机制,包括通过云计算技术构建超大规模安全事件、信息采集与处理平台,实现对海量信息的采集与关联分析,提升全网安全事件把控能力及风险控制能力;3、云安全服务,主要研究各种基于云计算平台为对象提供的安全服务,如防病毒服务等。
应理解的是,云计算(Cloud Computing)是一种计算模式,它将计算任务分布在大量计算机构成的资源池上,使各种应用系统能够根据需要获取计算力、存储空间和信息服务。提供资源的网络被称为“云”。“云”中的资源在使用者看来是可以无限扩展的,并且可以随时获取,按需使用,随时扩展,按使用付费。
图1为本申请提供的一种数据处理方法的实施环境示意图。如图1所示,该实施环境包括:第一设备11、第二设备12和终端13。
该第一设备11与第二设备12之间建立网络连接。该第二设备12可以基于该网络连接向第一设备11发送部署请求,该部署请求用于请求在第二设备11部署模型服务。该第一设备11基于该部署请求向该第二设备12返回动态共享库和模型关键数据。示例性的,该模型关键数据可以是采用加密算法进行加密的数据。该动态共享库包括模型服务模块和钩子模块。该第二设备12接收该动态共享库和模型关键数据,可基于该动态共享库的钩子模块,加载该模型服务模块,以执行基于该模型关键数据提供模型服务的执行逻辑,从而对外提供模型服务。
该第二设备12与该终端13之间建立网络连接。该终端13可以基于该网络连接向该第二设备12发送服务请求,该服务请求用于请求提供模型服务。该第二设备12基于该服务请求,利用动态共享库和模型关键数据得到该服务请求对应的模型服务结果,并向终端13返回该模型服务结果。
示例性的,该第二设备12可以为提供模型服务的目标应用程序所对应的后台服务器。该终端13上可以安装该目标应用程序。该终端13和该后台服务可以基于该目标应用程序进行数据交互。例如,该终端13显示该目标应用程序中的应用页面,并基于目标对象在某一应用页面中的触发操作所触发的模型服务,向第二设备12发送服务请求。该第二设备12运行有模型服务程序,而该模型服务程序可以是利用对该动态共享库和模型关键数据、以对外提供模型服务的程序应用;因此,该第二设备12通过运行该模型服务程序来向终端13提供该模型服务。
该目标应用程序可以是具备提供模型服务的任一应用、程序插件、小程序、应用平台等。示例性的,该目标应用程序可以是纠错应用,该模型服务可以是纠错服务。例如,通过纠错模型识别出目标语言的语句中可能存在的错误。其中,本申请对该目标语言的种类、所识别的错误类型等不做限定;例如,该目标语言可以为汉语、英语等语言;所识别的错误可以包括但不限于文字书写错误、语法错误、单词拼写错误、标点错误等。当然,该模型服务也可以是其它模型所提供的服务,本申请实施例对该模型服务具体为哪种模型服务不做限定。例如,该模型服务也可以是物体识别模型所提供的物体识别服务,如识别交通道路图像中的交通信号灯、周围车辆、车道线、路障、障碍物等。
上述第一设备11、第二设备12可以被提供为服务器。服务器可以是独立的物理服务器,或是多个物理服务器构成的服务器集群或者分布式系统,或是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、以及大数据和人工智能平台等基础云计算服务的云服务器或服务器集群。上述终端13可以是智能手机、平板电脑、笔记本电脑、数字广播接收器、台式计算机、车载终端(例如车载导航终端、车载电脑等)、智能家电、智能音箱、智能手表、车机终端、语音交互设备等。服务器与服务器之间、以及终端与服务器之间可以通过有线或无线通信方式进行直接或间接地连接,也可基于实际应用场景需求确定,在此不作限定。
下面对本申请涉及的术语及相关技术进行介绍和解释:
第一设备:服务提供方的设备;本申请中,该服务提供方可以提供模型服务。
第二设备:向服务提供方请求部署模型服务的服务待部署方的设备,也可以称为待部署设备。
动态共享库:包括模型服务源代码对应的模型服务模块和钩子源代码对应的钩子模块,该动态共享库可以是可执行文件,如.so扩展名文件。本申请中,是对第一程序语言的模型服务源代码和钩子源代码进行程序语言转换,得到第二程序语言的目标源代码,将目标源代码进行编译得到该动态共享库。
目标代码:用于将源代码由第一程序语言转换为第二程序语言。例如,可采用目标代码将源代码由Python程序语言的转换为C程序语言,该目标代码可以是一个C-Extensions for Python(为Python做C扩展)的Cython工具。本申请中,采用用于将Python转换C的程序语言转换代码进行修改得到该目标代码,具体修改过程在后续步骤中进行介绍。
解释器:是一种能够将高级程序语言进行转译运行的程序;本申请中,该解释器可以是用于执行第一程序语言的解释器。例如,可由Python解释器读取Python程序并执行。
目标解释器:是包括目标代码的解释器,本申请中,是通过目标解释器,执行对模型服务源代码和钩子源代码进行程序语言转换、编译、链接,以生成动态共享库。示例性的,该目标解释器可以是包括目标代码的Python解释器。
模型服务模块:包括基于该模型关键数据提供模型服务的执行逻辑。
钩子模块:包括对该模型服务模块的加载逻辑。
模型服务:以利用AI(Artificial Intelligence,人工智能)技术得到的AI模型为支撑的服务;示例性的,该AI模型可以是利用AI技术中机器学习训练得到纠错模型,该纠错模型用于识别指定信息中的错误;例如,指定语句中的语法错误、单词拼写错误等。例如,该服务待部署方可以对应有应用平台,该服务待部署方可以利用服务提供方提供的纠错模型,向该应用平台的使用对象提供纠错服务。
模型关键数据:用于提供模型服务的数据,本申请中,该模型关键数据可以是经过加密的数据。示例性的,该模型关键数据可以包括模型数据和资源文件。例如,该模型关键数据可以包括提供模型服务的AI模型的模型结构、模型所包括的网络层、各个网络层的权重、网络参数等,该资源文件包括AI模型对应的资源,例如,资源文件可以包括使用纠错模型时需用到的词典、词表等。
图2为本申请实施例提供的一种数据处理方法的流程示意图。该方法的执行主体可以为第一设备。如图2所示,该方法包括以下步骤。
步骤201、第一设备基于目标代码,确定第一程序语言对应的目标解释器。
本申请中,该目标代码用于将源代码由第一程序语言转换为第二程序语言。该目标解释器用于执行对模型服务源代码和钩子源代码的转换、编译、链接等过程,以得到动态共享库。该目标解释器可以包括该目标代码。该第一程序语言可以是Python程序语言,第二程序语言可以是C程序语言。
示例性的,该目标代码可以是一个C-Extensions for Python(为Python做C扩展)的Cython工具,则可采用Cython工具将源代码由Python程序语言转换为C程序语言。示例性的,该目标解释器可以是带有修改后的Cython工具的Python语言的解释器,例如该目标解释器可以表示为PythonM解释器。
本申请可利用该目标代码得到该目标解释器。本步骤中,该第一设备可以获取目标代码,基于该目标代码和该第一程序语言对应的通用解释器,确定该目标解释器。
示例性的,步骤201可以通过以下步骤2011至步骤2012实现。
步骤2011、该第一设备获取该目标代码。
该第一设备可以获取用于对源代码进行程序语言转换的程序语言转换代码,并基于该程序转换代码获取该目标代码。该程序语言转换代码可以包括将源代码由第一程序语言转换为第二程序语言的执行逻辑。例如,该程序转换代码可以是Python代码编写的Cython工具。
一可能设计中,该第一设备可以在目标代码中配置模块命名方式,以便基于目标代码对源代码进行转换、编译过程中,对动态共享库中各个模块或子模块进行规则命名,以保证动态共享库的准确性。另一可能设计中,该第一设备还可以在目标代码中配置对模块对应符号的可见属性,以便对动态共享库中各个模块对应符号进行隐藏或设为可见等,以保证动态共享库的安全性。相应的,步骤2011的实施方式可以包括以下两种实施方式中的至少一种。
第一种实施方式、该第一设备在程序语言转换代码中的入口函数生成代码中增加模块命名代码,得到该目标代码。
在第一种实施方式中,该目标代码还可以包括基于预配置的目标命名方式命名模块名的执行逻辑。该模块命名代码包括基于预配置的目标命名方式命名模块名的执行逻辑,该目标命名方式与该加载逻辑中的模块名变量的参数赋值方式相同。示例性的,该加载逻辑是指钩子模块所包括的对模型服务模块的加载逻辑;该加载逻辑用于指示基于该模块名变量对应参数、文件变量对应参数加载该模型服务模块。
需要说明的是,该加载逻辑是基于模块名变量的参数值、对动态共享库中的模块进行加载。因此,在基于源代码生成动态共享库时,按照与该参数赋值方式相同的方式对模块进行命名,使得目标代码对应的执行逻辑与加载逻辑保持一致,保证动态共享库对应执行逻辑的准确性,进一步以本申请的数据处理过程进行部署服务的可靠性。
该目标命名方式是:基于对完整模块名和目录名拼接来命名模块名的方式。完整模块名中包括目录名和文件名,该目录名表示待生成的模块在动态共享库中对应的目录,该文件名表示待生成的模块在动态共享库中对应文件的名称。一可能示例中,该目标命名方式可以包括:从完整模块名中拆分得到目录名,并对完整模块名中符号进行替换,将目录名与符号替换之后的完整模块名进行拼接,得到模块名。
示例性的,某个完整子模块名可以为foo.bar222.bar2,其中,“foo”表示一级目录,“bar222”表示二级目录,“bar2”表示该子模块在动态共享库中对应文件的名称。该目标命名方式可以为从“foo.bar222.bar2”中拆出目录名“foo.bar222”,将完整模块名foo.bar222.bar2中的符号“.”替换成符号“_”,得到“foo_bar222_bar2”,再将“foo_bar222_bar2”与目录名“foo.bar222”进行拼接,从而得到最终的模块名为“foo.bar222.foo_bar222_bar2”。
示例性的,可以在入口函数生成代码中增加模块命名代码。以程序语言转换代码为Cython工具进行举例,该入口函数生成代码可以包括位于Cython/Compiler/ModuleNode.py文件中的函数process_implementation,例如,该第一设备在函数process_implementation中增加的模块命名代码可以如下所示:
env.module_name=self.full_module_name.replace('.','_')
需要说明的是,本申请是通过将模型服务程序源代码和钩子源代码进行程序语言转换、编译等过程生成动态共享库,所生成的动态共享库中包括了各个模块以及各个模块下的子模块,由于各个模块都生成到一个动态共享库文件中,当不同的目录中存在同名文件时,同名的两个或多个文件之间易存在命名冲突;例如符号冲突。例如,由于入口函数名的定义方式是完整模块名中除目录名以外的文件名,也即是,入口函数名是“init+不带目录名的完整模块名”。例如,某一子模块的完整子模块名是“foo.bar222.bar2”,不带目录名的完整模块名,也即是文件名为“bar2”,则该子模块的入口函数则为initbar2。而通上述第一种实施方式,则可得到该子模块名为“foo.bar222.foo_bar222_bar2”,则该子模块的入口函数则为initfoo_bar222_bar2,入口函数名中包括了一级目录名、二级目录名以及文件名,从而使得不同目录下的相同文件名的各个子模块所对应的入口函数名,也不会存在符号冲突。因此,通过上述第一种实施方式,在程序语言转换代码中增加模块命名代码,可避免命名冲突的问题,能够有效保证动态共享库的准确性,进一步提高了基于本申请的数据处理方法来部署服务的准确性和可靠性。
第二种实施方式、该第一设备在程序语言转换代码中增加目标隐藏代码,并在该程序语言转换代码中的入口函数生成代码中增加目标可见代码,得到该目标代码。
在第二种实施方式中,目标代码还包括该模型服务模块和钩子模块在该动态共享库中被隐藏的执行逻辑、以及入口函数在该动态库中可见的执行逻辑。该目标隐藏代码包括该钩子模块和模型服务模块在该动态共享库被隐藏的执行逻辑;该目标可见代码包括将该入口函数属性定义为可见的执行逻辑。
示例性的,入口函数在该动态共享库中可见的执行逻辑可以是:增加入口函数的属性为可见,也即是,该目标可见代码可以包括增加入口函数的属性为可见执行逻辑。
示例性的,以程序语言转换代码为Cython工具进行举例,该入口函数生成代码可以包括位于Cython/Compiler/ModuleNode.py文件中的函数generate_module_init_func,该第一设备将函数generate_module_init_func中“code.putln("%s CYTHON_SMALL_CODE;/*proto*/"%header2)”修改为如下代码:“code.putln("%s__attribute__((visibility(\"default\")))CYTHON_SMALL_CODE;/*proto*/"%header2)”;其中,通过“attribute”增加属性“visibility”,也即是增加了入口函数的可见属性。
该程序语言转换代码还可以包括将第二程序语言的源代码编译为动态共享库的编译逻辑。该编译逻辑可以包括对源代码进行编译、链接等过程的执行逻辑。该目标隐藏代码可以是在编译和链接过程中对模型服务模块和钩子模块进行隐藏的执行逻辑,本步骤中,该第一设备可在程序语言转换代码中程序编译代码中,增加该目标隐藏代码,并在程序语言转换代码的入口函数生成代码中增加目标可见代码,得到该目标代码;其中,该程序编译代码为编译逻辑对应的代码。
需要说明的是,上述仅以程序语言转换代码中还包括编译逻辑为例说明,在另一种可能实施方式中,该编译逻辑,也即是程序编译代码也可以是独立于程序语言转换代码之外的代码,例如,该程序编译代码可以是编译器的形式,则第二种实施方式的步骤可以替换为:第一设备在程序编译代码中增加目标隐藏代码,得到目标编译代码,第一设备在程序语言转换代码中增加目标可见代码,得到目标转换代码;该第一设备基于该目标编译代码和目标转换代码,得到该目标代码。其中,该目标代码可以包括目标编译代码和目标转换代码。
其中,在程序编译代码中增加的目标隐藏代码的步骤可以包括:在程序编译代码中增加编译和链接参数“-fvisibility=hidden”。
需要说明的是,该第一设备可以采用上述两种实施方式中任一种,来获取目标代码;也可以结合上述两种实施方式获取目标代码,也即是,该目标代码中还包括:基于预配置的目标命名方式命名模块名的执行逻辑、该模型服务模块和钩子模块在该动态共享库中被隐藏的执行逻辑、以及入口函数在该动态库中可见的执行逻辑。当结合上述两种实施方式获取目标代码时,第一设备可以先执行第一种实施方式、再执行第二种实施方式,也可以先执行第二种实施方式、再执行第一种实施方式;本申请对第一种实施方式、第二种实施方式的执行顺序不做限定。例如,该第一设备可以在程序语言转换代码中的入口函数生成代码中,增加模块命名代码和目标可见代码;并在程序语言转换代码中增加目标隐藏代码,得到该目标代码。
通过在程序编译代码中增加目标隐藏代码,例如增加编译和链接参数,在对C语言的源代码编译、链接为机器码以生成动态共享库过程中,可使得所生成的动态共享库中钩子模块和模型服务模块对应的符号被隐藏,从而保证动态共享库中符号无法被导出,极大地增加反编译和破解难度,提高了对动态共享库中算法保护的可靠性,进而提高动态共享库的安全性。且又通过在入口函数生成代码中增加目标可见代码,例如使得Cython工具对Python源代码转换为C语言源代码时,增加入口函数的属性为可见,使得各个模块的入口函数对应符号不会被隐藏,从而保证后续基于钩子模块的加载逻辑加载模型服务模块时能够找到模块对应入口函数,也即是,使得钩子模中的加载逻辑能被正常执行,在提高所生成的动态共享库的安全性前提下,同时又保证了动态共享库被正常执行,提高了动态共享库的实用性和可靠性。
步骤2012、该第一设备将该目标代码添加至该第一程序语言对应的通用解释器,得到该目标解释器。
该通用解释器可以是用于执行第一程序语言编写的源代码的解释器,如通用的Python解释器。该第一设备可将目标代码添加至该通用解释器,使得该解释器在执行第一程序语言的源代码时也能够执行该目标代码所包括的执行逻辑。
需要说明的是,本申请是通过将模型服务源代码和钩子源代码进行程序语言转换、编译等过程生成动态共享库;该动态共享库中包括模型服务源代码对应的模型服务模块以及钩子源代码对应的钩子模块,而该模型服务模块或者钩子模块中可以包括子模块;通过上述第一种实施方式在程序语言转换代码中增加模块命名代码,可避免命名冲突的问题,能够有效保证动态共享库的准确性;通过上述第二种实施方式增加目标隐藏代码、目标可见代码,保证动态共享库被正常执行的前提下,尽可能提高了动态共享库的安全性,进而提高了基于本申请的数据处理方法来部署服务的安全性和可靠性。
并且,通过步骤201中目标代码进行程序语言转换、编译得到的动态共享库,其包括的钩子模块、模型服务模块均为机器码,可由第二设备的处理器直接执行动态共享库中的机器码,既避免了经由Python解释器泄露源码的风险,同时提高了代码执行效率。
步骤202、第一设备基于该目标解释器,对第一程序语言的模型服务源代码和钩子源代码进行程序语言转换,得到第二程序语言的目标源代码,并将该目标源代码编译为该动态共享库。
该第一设备可以通过目标解释器,对第一程序语言的模型服务源代码和钩子源代码进行合并,得到初始源代码;并基于上述该目标解释器的目标代码,在目标解释器中对该初始源代码执行以下步骤:将初始源代码转换为第二程序语言的目标源代码,并对该目标源代码进行编译为至少一个目标对象文件,将该至少一个目标对象文件链接为动态共享库对应的库文件。本申请中,可通过Cython工具将Python程序语言编写的模型服务源代码、钩子源代码转换为C程序语言,并将C程序语言的型服务源代码、钩子源代码编译得到动态共享库。
该第一设备可以获取钩子源代码和模型服务源代码,基于该目标解释器,执行对钩子源代码和模型服务源代码的程序语言转换。再将该目标源代码编译为动态共享库。相应的,该步骤202可以包括以下步骤2021至步骤2022。
步骤2021、该第一设备获取第一程序语言的钩子源代码和模型服务源代码。
该模型服务源代码和该钩子源代码是第一程序语言编写的源代码,其中,该模型服务源代码包括基于模型关键数据提供模型服务的执行逻辑。该钩子源代码可以包括对该模型服务源代码在动态共享库中对应的模型服务模块的加载逻辑。
下面对该模型服务源代码的获取方式进行介绍:
该模型服务源代码至少包括基于模型关键数据提供模型服务的执行逻辑,该模型服务源代码还可以包括对模型关键数据的加载逻辑,一可能实施方式中,该第一设备可以对模型关键数据进行加密,以保证模型关键数据不易被破解,则该加载逻辑可以是针加密数据的逻辑;示例性的,该模型服务源代码的获取方式可以通过以下步骤S1实现:
步骤S1、该第一设备基于该目标解释器,将第一源代码中数据打开函数修改为目标打开函数,得到该模型服务源代码。
该目标打开函数用于指示对该模型关键数据进行解密并打开。
第一源代码包括基于模型关键数据提供模型服务的执行逻辑。该第一源代码中用于打开模型关键数据的函数为数据打开函数,本申请中,该数据打开函数是用于打开不加密的数据的通用函数,该目标打开函数为针对模型关键数据的打开函数。示例性的,第一设备可对Python的第一源代码中打开文件的代码进行替换,例如,第一设备可将通用的数据打开函数open函数替换为目标打开函数openNew。
需要说明的是,该模型服务源代码可以包括对模型关键数据的加载逻辑,而该模型关键数据为加密的数据,因此该对模型关键数据的加载逻辑可以包括针对加密的模型关键数据的打开函数。也即是,该模型服务源代码包括对加密的模型关键数据的目标打开函数。
为配合模型关键数据的加密、解密和加载过程,该第一设备可以对模型服务源代码中数据打开函数修改为针对加密的模型关键数据的目标打开函数,以便第二设备基于该目标打开函数实现对模型关键数据的解密、打开等过程。其中,该第一设备可以在模型服务源代码中定义目标打开函数,而在钩子模块中定义该目标打开函数对应的执行解密、打开、授权校验等过程的执行逻辑。
下面对钩子源代码的获取方式进行介绍:
一可能实施方式中,该钩子源代码至少包括对模型服务模块的加载逻辑。该加载逻辑可以包括查找函数和加载函数所对应的类的执行逻辑。该钩子模块包括查找函数和加载函数所对应的类的执行逻辑。示例性的,查找函数和加载函数所对应的类的执行逻辑可以包括:查找待加载模块是否属于该模型服务模块中的模块名;如果待加载模块属于模型服务模块中的模块,则基于加载函数执行对该待加载模块名的加载过程。示例性的,该钩子源代码的获取过程通过以下步骤S2实现:
步骤S2、该第一设备可以基于该模型服务源代码,确定查找函数和加载函数所对应的类;该第一设备基于该查找函数和加载函数所对应的类,得到钩子源代码。
例如,钩子源代码可包含查找模块的查找函数find_module和加载模块的加载函数load_module所对应的类FinderLoader。通过查找函数find_module确定Python解释器待加载模块为待保护的模型服务模块中的模块时,可向Python解释器返回类实例FinderLoader,以通知Python解释器已经找到了该待加载模块。由加载函数load_module从动态共享库加载该待加载模块。否则,如果待加载模块不属于待保护的模型服务模块中的模块,find_module向Python解释器返回None。
该加载函数的执行逻辑包括:基于模块名变量对应的模块名参数、以及文件变量对应的文件对象加载模型服务模块的加载逻辑。
例如,在加载函数load_module中,可以使用Python的imp模块来实现动态加载动态共享库中的模块,即imp.load_dynamic(name,pathname[,file])。其中,name表示查找函数的模块名变量,pathname表示查找函数的模块路径变量,file表示查找函数的文件变量。示例性的,该查找函数的模块名变量的参数赋值方式可以与上述步骤201中目标命名方式相同,此处不再赘述。例如,结合步骤201中对目标命名方式的举例,此处查找函数的模块名变量name可以赋值为“foo.bar222.foo_bar222_bar2”。示例性的,该模块路径变量的路径赋值方式可以与模块名变量的参数赋值方式相同,也即是,查找函数的模块路径变量pathname也可以被赋值为“foo.bar222.foo_bar222_bar2”。
示例性的,该查找函数的文件变量可以赋值为文件对象。
需要说明的是,该模型服务模块为待保护的模块,通过查找函数的类和加载函数的类,在需要加载该待保护的模型服务模块时,采用钩子模块中预配置的加载逻辑,对该模型服务模块进行加载,因此,本申请对服务提供方和服务待部署方都完全透明,尤其对于服务待部署方而言,不需要服务待部署方对自己的Python脚本文件做任何修改和适配、也不需要使用修改后的Python解释器,而是使用通用的解释器即可直接加载运行动态共享库;因此,使用本申请的数据处理方法进行服务部署,大大提高了服务部署效率。并且,本申请的使用成本非常低,具备极高的实用性。
又一可能实施方式中,该钩子源代码还可以包括钩子模块的注册逻辑。该注册逻辑包括在解释器中注册该钩子模块的执行逻辑。
又一可能实施方式中,该第一设备还可以设计针对模型服务部署的授权校验逻辑,进一步保护服务提供方对该模型服务所涉及的模型关键数据、动态共享库等的知识产权。因此,该钩子源代码可以包括解密代码和授权校验代码。示例性的,钩子源代码的获取方式可以通过以下步骤S3实现。
步骤S3、该第一设备在第二源代码中增加解密代码和授权校验代码,得到该钩子源代码。
第二源代码包括对该模型服务模块的加载逻辑。该解密代码包括对该模型关键数据进行解密并打开的执行逻辑。该授权校验代码用于指示对待部署设备进行授权校验的执行逻辑。
该解密模型关键数据并打开的执行逻辑可以包括:获取预配置的密钥或密钥生成算法,采用预配置的解密算法和解密执行逻辑,执行对该模型关键数据的解密过程,还原得到该模型关键数据的明文数据。该明文数据可以包括模型服务运行时需使用的模型、资源文件等数据。
该授权校验的执行逻辑可以包括基于授权文件验证待部署设备是否具备模型服务部署权限的逻辑。例如,该授权校验的执行逻辑包括但不限于:校验该模型服务对应的授权文件是否有效、该授权文件是否和服务待部署方当前使用的设备匹配、当前时间是否在授权有效期内等。示例性的,该第一设备可以将该授权校验逻辑嵌入该钩子源代码中的注册代码中,以便于第二设备在注册钩子模块时,基于授权校验代码验证该第二设备是否具备模型服务权限,进而判断出第二设备当前基于钩子模块的加载操作是否具备权限,若不具备权限则中断当前的加载过程,以使第二设备无法加载模型服务模块,保证服务提供方的对模型服务模块、模型关键数据等的知识产权。
该密钥可以为对称加密算法对应的密钥、或非对称加密算法对应的密钥对,该第一设备可以采用Shamir(秘密共享算法)门限秘密共享算法将密钥内置到钩子源代码中,后续将内置解密代码、密钥、授权校验代码的钩子源代码和模型服务源代码一起编译到动态共享库中。
步骤2022、该第一设备通过目标解释器,执行对该钩子源代码和模型服务源代码进行程序语言转换的过程,得到该目标源代码。
该第一设备可以通过目标解释器中的目标代码,将该钩子源代码和模型服务源代码由第一程序语言转换为第二程序语言,得到目标源代码。示例性的,例如,第一设备可通过调用Cython工具的cythonize函数,执行将Python编写的钩子源代码和模型服务源代码转换为C程序语言编写的目标源代码。
本步骤可结合步骤2011中第一种实施方式实现。
对应于步骤2011中第一种实施方式,该第一设备可以结合目标代码中模块命名代码进行程序语言转换,相应的,该模型服务源代码的程序语言转换方式可以包括:该第一设备在基于该程序语言转换代码对模型服务源代码进行程序语言转换时,基于该入口函数生成代码中的模块命名代码,按照目标命名方式命名该模型服务源代码对应的模型服务模块的模块名。其中,该目标命名方式可以是预先配置的命名方式,该第一设备可通过执行该模块命名代码,按照该预配置的目标命名方式,将模型服务模块的模块名定义为预配置的模块名。
对于任一待命名的模块,该第一设备可以基于该目标命名方式,对该任一待命名模块的完整模块名和目录名拼接,得到该任一待命名模块的模块名。完整模块名中包括目录名和文件名,该目录名表示待生成的模块在动态共享库中对应的目录,该文件名表示待生成的模块在动态共享库中对应文件的名称。一可能示例中,该第一设备可以获取该任一待命名模块的完整模块名,并从完整模块名中拆分得到目录名;该第一设备对完整模块名中符号进行替换,并将目录名与符号替换之后的完整模块名进行拼接,得到该任一待命名模块的模块名。该任一待命名模块可以是模型服务模块或模型服务模块中任一模块或子模块。当然,本步骤仅以模型服务模块进行举例说明,该任一待命名模块也可以是钩子模块或钩子模块下的子模块等;本申请对该任一待命名模块是动态共享库中哪个模块不做限定。
示例性的,某个子模块的完整模块名为foo.bar222.bar2,该第一设备可以从“foo.bar222.bar2”中拆出目录名“foo.bar222”,将完整模块名foo.bar222.bar2中的符号“.”替换成符号“_”,得到“foo_bar222_bar2”,再将“foo_bar222_bar2”与目录名“foo.bar222”进行拼接,将拼接得到的“foo.bar222.foo_bar222_bar2”作为子模块foo.bar222.bar2的模块名。
由于将加载函数load_dynamic中的name变量的赋值方式修改为与pathname变量的赋值方式相同,即load_dynamic的name和pathname参数值相同。且通过包括模块命名代码的目标代码,对Cython工具中入口函数生成代码进行了调整,使得load_dynamic能顺利找到模块的入口函数,保证了钩子模块的加载逻辑的正常执行,提高基于本申请的数据处理过程进行模型服务部署的可靠性。
步骤2023、该第一设备通过目标解释器,将该目标源代码编译为至少一个目标对象文件,并将该至少一个目标对象文件进行链接,得到动态共享库。
本步骤可结合步骤2011中第二种实施方式实现。
对应于步骤2011中第二种实施方式,该第一设备可以结合目标代码中目标隐藏代码、目标可见代码进行编译、链接,得到动态共享库,相应的,该将该第二源代码编译为动态共享库,包括:该第一设备将该目标源代码进行编译为至少一个目标对象文件,并将该至少一个目标对象文件链接为动态共享库;并且,在编译和链接过程中,该第一设备基于该目标隐藏代码,将该动态共享库各个符号设置为隐藏,并基于该目标可见代码,将该动态共享库对应的入口函数的属性定义为可见。
需要说明的是,以基于Cython工具的由Python语言转换为C语言为例,在使用Cython工具的cythonize对Python源代码转换、编译、链接生成动态共享库时,可基于增加的编译和链接参数-fvisibility=hidden,执行将各个符号在动态共享库中进行隐藏的步骤。然而,该隐藏步骤会使得所有符号被隐藏,例如,若所生成的入口函数也被隐藏,则第二设备的Python解释器在使用dlsym函数加载子模块时,dlsym函数无法找到入口函数,也就无法查找子模块名,导致无法加载子模块。因此,通过目标可见代码,执行对入口函数的属性定义为可见,保证子模块加载过程被正常执行,从而在保证执行的前提下,尽可能的增强动态共享库的反编译难度和破解难度,提高其安全性。
示例性的,该第一设备可将目标源代码编译为至少一个目标对象文件,将至少一个目标对象文件链接为动态共享库。例如,该目标对象文件可以为.o目标文件,该库文件可以为一个.so文件。例如,该第一设备通过目标解释器pythonM执行上述步骤2021至上述步骤2022,并将钩子源代码和模型服务源代码进行合并,例如,合并为Python语言的初始源代码,并将Python初始源代码转换为C语言的目标源代码;进一步将该C语言的目标源代码编译为多个.o目标文件,将各个.o目标文件链接为一个动态共享库.so库文件。
示例性的,该动态共享库中包括模型服务模块和钩子模块,该模型服务模块可以是模型服务源代码对应的模块,该钩子模块可以是该钩子源代码对应的模块,该钩子模块还可以包括查找函数和加载函数所对应的类的执行逻辑。示例性的,钩子模块也可以包括解密代码对应的执行逻辑以及授权校验代码对应的执行逻辑。示例性的,钩子模块还可以包括钩子注册逻辑,该钩子注册逻辑包括在所述解释器中注册所述钩子模块所对应的查找函数和加载函数所对应的类。
需要说明的是,该第一设备还可以生成该动态共享库对应的初始化文件,该初始化文件可以包括钩子模块的钩子注册函数,该钩子注册函数用于执行该钩子模块所包括的钩子注册逻辑,该钩子注册逻辑包括在该解释器中注册该钩子模块所包括的查找函数和加载函数所对应的类。例如,该第一设备可以在初始化文件中添加该钩子注册函数,得到该动态共享库的初始化文件。
需要说明的是,该第一设备可以基于预配置代码执行上述步骤2021-2023的步骤,也即是,该预配置代码可以包括上述步骤2021至步骤2023的执行逻辑。例如,该预配置代码可以是Python项目编译转换脚本setup.py,该Python项目是模型服务源代码的项目,该第一设备可使用目标解释器pythonM执行setup.py,并指定待保护的Python项目的根目录,执行该setup.py即可自动完成上述步骤2021-2023。如图3所示,该第一设备执行上述步骤201,并执行setup.py,以完成上述步骤2021-2023,最终会在待保护的Python模型服务项目的根目录的同级目录下创建一个build目录,在build目录中包括Python模型服务项目同名的目录proj,proj目录下对应为基于上述步骤202所完成保护的Python模型服务模块,该同名的目录即为经过上述步骤201-202生成的动态共享库,该动态共享库可以是项目根目录名加_bootstrap.so命名的.so文件,动态共享库可以是图3中的proj_bootstrap.so文件。如图3所示,该第一设备还可以生成该动态共享库的初始化文件,该初始化文件可以是图3中的__init__.py文件。
如图4所示,第一设备可以获取预先准备的解释器和Python模型服务项目(图4中简称为Python项目),并基于上述步骤201确定带修改后Cython工具的Python解释器pythonM执行setup.py,其中,该setup.py为用于对Python项目编译转换的脚本。该第一设备获取Python钩子模块脚本bootstrap.py,该bootstrap.py包括钩子源代码、注册代码等,并获取待保护的Python项目的根目录proj。该第一设备通过执行setup.py,已完成上述步骤202,实现对Python项目中各个文件的遍历、程序语言转换、编译、链接并嵌入包括钩子注册函数的钩子源代码,并基于目标隐藏代码执行符号隐藏,基于目标可见代码执行字符串的可见属性的定义,得到动态共享库,完成保护的Python模块代码包括proj_bootstrap.so和_init__.py。该第一设备还可以执行setup.py对模型、资源文件等模型关键数据进行加密保护,得到加密保护的模型、资源文件等模型关键数据。
本申请提供的数据处理方法,通过基于目标代码,确定第一程序语言对应的目标解释器,该目标代码至少包括将源代码由第一程序语言转换为第二程序语言的执行逻辑;基于该目标解释器,对第一程序语言的模型服务源代码和钩子源代码进行程序语言转换,得到第二程序语言的目标源代码,并将该目标源代码编译为该动态共享库。再基于第二设备的部署请求向其返回动态共享库以及模型关键数据,使得第二设备无需修改解释器也可以基于钩子模块完成对模型服务模块的加载,且钩子模块和模型服务模块位于动态共享库,该动态共享库为可执行文件,从而使得第二设备可直接使用处理器执行模型服务对应的执行逻辑,既避免了经由解释器执行泄露源码的风险,同时提高了代码执行效率,提高了动态共享库的安全性,进而提高了基于本申请数据处理方法进行服务部署的安全性和可靠性。
图5为本申请实施例提供的一种数据处理方法的信令交互图。该方法的可以由第一设备和第二设备交互执行。如图5所示,该方法包括以下步骤。
步骤501、第二设备向第一设备发送部署请求。
该部署请求用于请求部署该模型服务。第二设备可以是服务待部署方的待进行部署模型服务的设备。
步骤502、第一设备响应于第二设备的部署请求,向该第二设备发送动态共享库以及模型关键数据。
该动态共享库是基于上述步骤201至202得到的,该模型关键数据可以是加密的数据,例如,该第一设备可以采用预配置的密钥或密钥生成算法,采用预配置的解密算法和解密执行逻辑,对模型服务运行时需使用的模型、资源文件等进行加密,得到该模型关键数据。其中,该预配置的加密算法和加密执行逻辑,是解密代码所包括的解密模型关键数据使用的解密算法和解密执行逻辑所对应的加密算法和加密执行逻辑。解密算法和解密。示例性的,该共享库文件包括模型服务模块以及钩子模块,该模型服务模块包括基于该模型关键数据提供模型服务的执行逻辑,该钩子模块包括对该模型服务模块的加载逻辑。
示例性的,该第一设备还可以向该第二设备发送该动态共享库、模型关键数据以及该动态共享库对应的初始化文件。该初始化文件可以包括钩子模块的钩子注册函数,该钩子注册函数用于执行该钩子模块所包括的钩子注册逻辑,该钩子注册逻辑包括在该解释器中注册该钩子模块所包括的查找函数和加载函数所对应的类。例如,该第一设备可以在初始化文件中添加该钩子注册函数,得到该动态共享库的初始化文件。
步骤503、该第二设备接收第一设备发送的动态共享库以及模型关键数据。
示例性的,该第二设备可以接收第一设备发送的动态共享库、模型关键数据以及该动态共享库对应的初始化文件。
步骤504、该第二设备在初始化该动态共享库时,将该动态共享库加载至该第二设备的内存中,并在该第二设备的解释器中注册该钩子模块。
该第二设备的解释器可以为通用解释器,例如,通用的Python解释器。一可能实施方式中,该第二设备可以基于初始化文件对该动态共享库进行初始化,例如,将该动态共享库加载至内容。
一可能实施方式中,在初始化时,该第二设备可以基于钩子注册函数来执行钩子模块的注册过程。该第二设备注册该钩子模块的过程可以包括:该第二设备调用该动态共享库的初始化文件中的钩子注册函数,以在该解释器中注册该钩子模块所包括的查找函数和加载函数所对应的类。其中,该钩子注册函数用于执行该钩子模块所包括的钩子注册逻辑,该钩子注册逻辑包括在该解释器中注册该钩子模块所包括的查找函数和加载函数所对应的类。
需要说明的是,基于上述步骤202可知,该钩子模块包括查找函数find_module和加载函数load_module所对应的类FinderLoader。该第二设备可以调用初始化文件中的钩子注册函数,以执行钩子模块所包括的钩子注册逻辑,完成在该解释器中注册该钩子模块所包括的查找函数和加载函数所对应的类。
步骤505、该第二设备响应于对该模型服务模块的加载指令,基于该钩子模块加载该模型服务模块,并通过该第二设备的处理器执行该模型服务模块对应的执行逻辑,以基于该模型关键数据提供该模型服务。
该处理器可以为第二设备的CPU,或者也可以是GPU或其它处理器。
该第二设备可以通过解释器加载需要加载的模块。在一种可能实施方式中,该第二设备基于该钩子模块加载该模型服务模块的步骤包括:响应于对该模型服务模块的加载指令,该第二设备基于该解释器传入的待加载模块名,调用该查找函数和加载函数所对应的类所包括的加载函数,以加载模型服务模块。其中,该加载指令可以是对模型服务模块中任一模块或子模块的加载指令。该解释器传入的待加载模块名即为待加载的任一模块或子模块的模块名。一可能示例中,当该第二设备触发对任一待加载模块的加载指令时,该第二设备可以基于该查找函数和加载函数所对应的类的执行逻辑,判断该待加载模块是否属于所述模型服务模块中的模块;如果所述待加载模块属于所述模型服务模块中的模块,则基于所述加载函数执行对所述待加载模块名的加载逻辑。其中,该第二设备可以基于查找函数来查找该待加载模块是否属于该模型服务中的模块。
在一种可能示例中,该加载函数的变量包括模块名变量和文件变量;相应的,该第二设备基于待加载模块名,调用查找函数和加载函数所对应的类所包括的加载函数,以加载模型服务模块包括:该第二设备将该文件变量赋值为文件对象,并获取该文件对象对应的文件描述符和文件设备;该第二设备基于该解释器传入的待加载模块名、该文件描述符和文件设备,从句柄数组中查找该待加载模块名在该动态共享库中对应的待加载文件,并加载该待加载文件。其中,该文件描述符可以为inode编号。
在加载函数load_module中,可以使用Python的imp模块来实现动态加载动态共享库中的模块,即imp.load_dynamic(name,pathname[,file])。其中,name表示查找函数的模块名变量,pathname表示查找函数的模块路径变量,file表示查找函数的文件变量。其中,查找函数的模块名变量name可以赋值为“foo.bar222.foo_bar222_bar2”,pathname也可以被赋值为“foo.bar222.foo_bar222_bar2”,该查找函数的文件变量file可以赋值为动态共享库的文件对象。
需要说明的是,在Python解释器的缓存机制中,通过设置以load_dynamic中的pathname为key,缓存已经加载的动态共享库,以防止多次加载同一个动态库。因此,在已经将动态共享库加载至内存后,可将file参数设置为动态共享库的文件对象,便可在file参数存在的情况下,执行基于file对应的文件指针fp以找到文件设备和inode编号,由于动态共享库已经打开且在句柄(handles)数组中缓存,则直接使用dlsym函数在动态共享库中查找以解释器传入的待加载模块名name对应的入口函数指针,调用该入口函数指针加载该待加载模块名对应的模块,也即是从缓存中加载该待加载模块名对应的动态共享库中的文件。
该第二设备还可以调用该模型服务模块的目标打开函数,以执行钩子中对应的解码代码、授权校验代码,以对模型关键数据进行解密,并基于授权文件对该第二设备进行授权校验。
如图6所示,在第二设备侧,第二设备通过Python解释器import函数加载动态共享库,该import函数可触发该动态共享库对应的初始化文件,该第二设备通过该初始化函数将动态共享库加载至内存。并且,该初始化文件中包括钩子注册函数,该第二设备可调用钩子注册函数,来完成在该解释器中注册该钩子模块所包括的查找函数和加载函数所对应的类。该钩子注册代码可以嵌入有授权校验代码,在钩子注册过程中,可以完成第二设设备的授权校验过程。当第二设备通过Python解释器加载待加载的模块时,该第二设备通过Python解释器传入参数值为待加载模块名,当基于钩子模块的查找函数确定该待加载模块属于要保护的模型服务模块时,则该第二设备基于该钩子模块返回的类FinderLoader,调用的加载函数,例如,基于加载函数的name、fp、pathname、description(文件描述符)等变量的参数值,执行从待保护的模型服务模块、也即是图6中Python模块中加载该待加载模块的加载过程,并向Python解释器返回所加载的模块。另外,该第二设备还可以通过模型服务模块、也即是图6中Python模块中的目标打开函数openNew函数,以执行钩子模块中对模型关键数据的打开过程,如对模型关键数据解密,并返回解密后的模型、资源文件等模型关键数据。当然,当基于钩子模块的查找函数确定该待加载模块不属于要保护的模型服务模块时,该钩子模块的查找函数可以向Python解释器返回None,结束。
如图7所示,待部署和保护的算法模型可以包括Python项目中的脚本文件和Python项目的模型和资源文件,其中,Python项目中的脚本文件可以为Python语言的模型服务源代码,通过基于Python项目中的脚本文件和Python项目的模型和资源文件,执行代码保护和模型资源加密过程,得到保护后的Python模块和加密后的模型、资源文件等模型关键数据,Python模块可以包括动态共享库(proj_bootstrap.so)和初始化文件(__init__.py)。并将Python模块和加密后的模型、资源文件等模型关键数据部署在第二设备上加载运行,从而完成对待部署模型服务所涉及的算法模型的部署运行。
本申请提供的数据处理方法,通过第二设备在初始化该动态共享库时,将该动态共享库加载至该第二设备的内存中,并在该第二设备的解释器中注册该钩子模块;从而在加载模型服务模块时,可直接基于该钩子模块加载该模型服务模块,并通过该第二设备的处理器执行该模型服务模块对应的执行逻辑,以便基于该模型关键数据提供该模型服务。第二设备无需修改解释器也可以基于钩子模块完成对模型服务模块的加载,且该动态共享库为可执行文件,第二设备可直接使用处理器执行模型服务对应的执行逻辑,既避免了经由解释器执行泄露源码的风险,同时提高了代码执行效率,提高了动态共享库的安全性,进而提高了基于本申请数据处理方法进行服务部署的安全性和可靠性。
图8为本申请实施例提供的一种数据处理装置的结构示意图。该装置应用于第一设备,如图8所示,该装置包括:
发送模块801,用于响应于任一第二设备的部署请求,向该第二设备发送动态共享库以及模型关键数据,该部署请求用于请求部署模型服务;
其中,该共享库文件包括模型服务源代码对应的模型服务模块、以及钩子源代码对应的钩子模块,该模型服务模块包括基于该模型关键数据提供模型服务的执行逻辑,该钩子模块包括对该模型服务模块的加载逻辑;
其中,该装置还用于生成动态共享库,该装置在生成该动态共享库时,包括:
目标解释器确定模块802,用于基于目标代码,确定第一程序语言对应的目标解释器,该目标代码至少包括将源代码由第一程序语言转换为第二程序语言的执行逻辑;
转换模块803,用于基于该目标解释器,对第一程序语言的模型服务源代码和钩子源代码进行程序语言转换,得到第二程序语言的目标源代码,并将该目标源代码编译为该动态共享库。
在一个可能实现方式中,该目标代码还包括基于预配置的目标命名方式命名模块名的执行逻辑;
相应的,该装置还包括目标代码获取模块,
该目标代码获取模块,用于:
在程序语言转换代码中的入口函数生成代码中增加模块命名代码,得到该目标代码;
其中,该模块命名代码包括基于预配置的目标命名方式命名模块名的执行逻辑,该目标命名方式与该加载逻辑中的模块名变量的参数赋值方式相同,该加载逻辑用于指示基于该模块名变量对应参数、文件变量对应参数加载该模型服务模块。
在一个可能实现方式中,该转换模块803,还用于在基于该程序语言转换代码对模型服务源代码进行程序语言转换时,基于该入口函数生成代码中的模块命名代码,按照目标命名方式命名该模型服务源代码对应模型服务模块的模块名。
在一个可能实现方式中,该目标代码还包括该模型服务模块和钩子模块在该动态共享库中被隐藏的执行逻辑、以及入口函数在该动态库中可见的执行逻辑;
相应的,该装置还包括目标代码获取模块,
该目标代码获取模块用于:
在程序语言转换代码中增加目标隐藏代码,并在该程序语言转换代码中的入口函数生成代码中增加目标可见代码,得到该目标代码,该目标隐藏代码包括该钩子模块和模型服务模块在该动态共享库被隐藏的执行逻辑,该目标可见代码包括将该入口函数属性定义为可见的执行逻辑。
在一个可能实现方式中,该转换模块803,还用于将该目标源代码进行编译为至少一个目标对象文件,并将该至少一个目标对象文件链接为动态共享库;在编译和链接过程中,基于该目标隐藏代码,将该动态共享库各个符号设置为隐藏,并基于该目标可见代码,将该动态共享库对应的入口函数的属性定义为可见。
在一个可能实现方式中,该钩子模块包括查找函数和加载函数所对应的类的执行逻辑;
其中,该查找函数和加载函数所对应的类的执行逻辑包括:查找待加载模块是否属于该模型服务模块中的模块;如果该待加载模块属于该模型服务模块中的模块,则基于该加载函数执行对该待加载模块名的加载逻辑。
在一个可能实现方式中,该转换模块803,还用于:
基于该目标解释器,将第一源代码中的数据打开函数修改为目标打开函数,得到该模型服务源代码;
在第二源代码中增加解密代码和授权校验代码,得到该钩子源代码;
其中,该第一源代码包括基于模型关键数据提供模型服务的执行逻辑,该目标打开函数用于指示对该模型关键数据进行解密并打开;该第二源代码包括对该模型服务模块的加载逻辑,该解密代码包括对该模型关键数据进行解密并打开的执行逻辑;该授权校验代码用于指示对待部署设备进行授权校验的执行逻辑;
将该模型服务源代码和钩子源代码由第一程序语言转换为第二程序语言,得到该目标源代码。
在一个可能实现方式中,该装置还包括:
获取模块,用于基于该钩子模块的注册函数,获取该动态共享库的初始化文件,该注册函数用于指示在该第二设备的解释器中注册该钩子模块;
相应的,该发送模块801,还用于向该第二设备发送动态共享库、该动态共享库的初始化文件以及该模型关键数据。
本申请提供的数据处理方法,通过基于目标代码,确定第一程序语言对应的目标解释器,该目标代码至少包括将源代码由第一程序语言转换为第二程序语言的执行逻辑;基于该目标解释器,对第一程序语言的模型服务源代码和钩子源代码进行程序语言转换,得到第二程序语言的目标源代码,并将该目标源代码编译为该动态共享库。再基于第二设备的部署请求向其返回动态共享库以及模型关键数据,使得第二设备无需修改解释器也可以基于钩子模块完成对模型服务模块的加载,且钩子模块和模型服务模块位于动态共享库,该动态共享库为可执行文件,从而使得第二设备可直接使用处理器执行模型服务对应的执行逻辑,既避免了经由解释器执行泄露源码的风险,同时提高了代码执行效率,提高了动态共享库的安全性,进而提高了基于本申请数据处理方法进行服务部署的安全性和可靠性。
图9为本申请实施例提供的一种数据处理装置的结构示意图。该装置应用于第二设备,如图9所示,该装置包括:
接收模块901,用于接收第一设备发送的动态共享库以及模型关键数据;
其中,该共享库文件包括模型服务模块以及钩子模块,该模型服务模块包括基于该模型关键数据提供模型服务的执行逻辑,该钩子模块包括对该模型服务模块的加载逻辑;
注册模块902,用于在初始化该动态共享库时,将该动态共享库加载至该第二设备的内存中,并在该第二设备的解释器中注册该钩子模块;
加载模块903,用于响应于对该模型服务模块的加载指令,基于该钩子模块加载该模型服务模块,并通过该第二设备的处理器执行该模型服务模块对应的执行逻辑,以基于该模型关键数据提供该模型服务。
在一个可能实现方式中,该注册模块902,用于调用该动态共享库的初始化文件中的钩子注册函数,以在该解释器中注册该钩子模块所包括的查找函数和加载函数所对应的类;
其中,该钩子注册函数用于执行该钩子模块所包括的钩子注册逻辑,该钩子注册逻辑包括在该解释器中注册该钩子模块所对应的查找函数和加载函数所对应的类;
相应的,该加载模块903,用于响应于对该模型服务模块的加载指令,基于该解释器传入的待加载模块名,调用该查找函数和加载函数所对应的类所包括的加载函数,以加载模型服务模块。
在一个可能实现方式中,该加载函数的变量包括模块名变量和文件变量;
相应的,该加载模块903,用于:
将该文件变量赋值为文件对象,并获取该文件对象对应的文件描述符和文件设备;
基于该解释器传入的待加载模块名、该文件描述符和文件设备,从句柄数组中查找该待加载模块名在该动态共享库中对应的待加载文件,并加载该待加载文件。
本申请提供的数据处理方法,通过第二设备在初始化该动态共享库时,将该动态共享库加载至该第二设备的内存中,并在该第二设备的解释器中注册该钩子模块;从而在加载模型服务模块时,可直接基于该钩子模块加载该模型服务模块,并通过该第二设备的处理器执行该模型服务模块对应的执行逻辑,以便基于该模型关键数据提供该模型服务。第二设备无需修改解释器也可以基于钩子模块完成对模型服务模块的加载,且该动态共享库为可执行文件,第二设备可直接使用处理器执行模型服务对应的执行逻辑,既避免了经由解释器执行泄露源码的风险,同时提高了代码执行效率,提高了动态共享库的安全性,进而提高了基于本申请数据处理方法进行服务部署的安全性和可靠性。
本申请实施例的装置可执行本申请实施例所提供的方法,其实现原理相类似,本申请各实施例的装置中的各模块所执行的动作是与本申请各实施例的方法中的步骤相对应的,对于装置的各模块的详细功能描述具体可以参见前文中所示的对应方法中的描述,此处不再赘述。
图10是本申请实施例中提供了一种计算机设备的结构示意图。如图10所示,该计算机设备包括:存储器、处理器及存储在存储器上的计算机程序,该处理器执行上述计算机程序以实现数据处理方法的步骤,与相关技术相比可实现:
本申请提供的数据处理方法,通过基于目标代码,确定第一程序语言对应的目标解释器,该目标代码至少包括将源代码由第一程序语言转换为第二程序语言的执行逻辑;基于该目标解释器,对第一程序语言的模型服务源代码和钩子源代码进行程序语言转换,得到第二程序语言的目标源代码,并将该目标源代码编译为该动态共享库。再基于第二设备的部署请求向其返回动态共享库以及模型关键数据,使得第二设备无需修改解释器也可以基于钩子模块完成对模型服务模块的加载,且钩子模块和模型服务模块位于动态共享库,该动态共享库为可执行文件,从而使得第二设备可直接使用处理器执行模型服务对应的执行逻辑,既避免了经由解释器执行泄露源码的风险,同时提高了代码执行效率,提高了动态共享库的安全性,进而提高了基于本申请数据处理方法进行服务部署的安全性和可靠性。
在一个可选实施例中提供了一种计算机设备,如图10所示,图10所示的计算机设备1000包括:处理器1001和存储器1003。其中,处理器1001和存储器1003相连,如通过总线1002相连。可选地,计算机设备1000还可以包括收发器1004,收发器1004可以用于该计算机设备与其他计算机设备之间的数据交互,如数据的发送和/或数据的接收等。需要说明的是,实际应用中收发器1004不限于一个,该计算机设备1000的结构并不构成对本申请实施例的限定。
处理器1001可以是CPU(Central Processing Unit,中央处理器),通用处理器,DSP(Digital Signal Processor,数据信号处理器),ASIC(Application SpecificIntegrated Circuit,专用集成电路),FPGA(Field Programmable Gate Array,现场可编程门阵列)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本申请公开内容所描述的各种示例性的逻辑方框,模块和电路。处理器1001也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,DSP和微处理器的组合等。
总线1002可包括一通路,在上述组件之间传送信息。总线1002可以是PCI(Peripheral Component Interconnect,外设部件互连标准)总线或EISA(ExtendedIndustry Standard Architecture,扩展工业标准结构)总线等。总线1002可以分为地址总线、数据总线、控制总线等。为便于表示,图10中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
存储器1003可以是ROM(Read Only Memory,只读存储器)或可存储静态信息和指令的其他类型的静态存储设备,RAM(Random Access Memory,随机存取存储器)或者可存储信息和指令的其他类型的动态存储设备,也可以是EEPROM(Electrically ErasableProgrammable Read Only Memory,电可擦可编程只读存储器)、CD-ROM(Compact DiscRead Only Memory,只读光盘)或其他光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质\其他磁存储设备、或者能够用于携带或存储计算机程序并能够由计算机读取的任何其他介质,在此不做限定。
存储器1003用于存储执行本申请实施例的计算机程序,并由处理器1001来控制执行。处理器1001用于执行存储器1003中存储的计算机程序,以实现前述方法实施例所示的步骤。
其中,电子设备包括但不限于:服务器、终端或云计算中心设备等。
本申请实施例提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时可实现前述方法实施例的步骤及相应内容。
本申请实施例还提供了一种计算机程序产品,包括计算机程序,计算机程序被处理器执行时可实现前述方法实施例的步骤及相应内容。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。本申请实施例所使用的术语“包括”以及“包含”是指相应特征可以实现为所呈现的特征、信息、数据、步骤、操作,但不排除实现为本技术领域所支持其他特征、信息、数据、步骤、操作等。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”、“1”、“2”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除图示或文字描述以外的顺序实施。
应该理解的是,虽然本申请实施例的流程图中通过箭头指示各个操作步骤,但是这些步骤的实施顺序并不受限于箭头所指示的顺序。除非本文中有明确的说明,否则在本申请实施例的一些实施场景中,各流程图中的实施步骤可以按照需求以其他的顺序执行。此外,各流程图中的部分或全部步骤基于实际的实施场景,可以包括多个子步骤或者多个阶段。这些子步骤或者阶段中的部分或全部可以在同一时刻被执行,这些子步骤或者阶段中的每个子步骤或者阶段也可以分别在不同的时刻被执行。在执行时刻不同的场景下,这些子步骤或者阶段的执行顺序可以根据需求灵活配置,本申请实施例对此不限制。
以上所述仅是本申请部分实施场景的可选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请的方案技术构思的前提下,采用基于本申请技术思想的其他类似实施手段,同样属于本申请实施例的保护范畴。
Claims (16)
1.一种数据处理方法,其特征在于,所述方法应用于第一设备,所述方法包括:
响应于任一第二设备的部署请求,向所述第二设备发送动态共享库以及模型关键数据,所述部署请求用于请求部署模型服务;
其中,所述共享库文件包括模型服务源代码对应的模型服务模块、以及钩子源代码对应的钩子模块,所述模型服务模块包括基于所述模型关键数据提供模型服务的执行逻辑,所述钩子模块包括对所述模型服务模块的加载逻辑;
其中,所述动态共享库的生成方式,包括:
基于目标代码,确定第一程序语言对应的目标解释器,所述目标代码至少包括将源代码由第一程序语言转换为第二程序语言的执行逻辑;
基于所述目标解释器,对第一程序语言的模型服务源代码和钩子源代码进行程序语言转换,得到第二程序语言的目标源代码,并将所述目标源代码编译为所述动态共享库。
2.根据权利要求1所述的方法,其特征在于,所述目标代码还包括基于预配置的目标命名方式命名模块名的执行逻辑;
相应的,所述目标代码的获取方式包括:
在程序语言转换代码中的入口函数生成代码中增加模块命名代码,得到所述目标代码;
其中,所述模块命名代码包括基于预配置的目标命名方式命名模块名的执行逻辑,所述目标命名方式与所述加载逻辑中的模块名变量的参数赋值方式相同,所述加载逻辑用于指示基于所述模块名变量对应参数、文件变量对应参数加载所述模型服务模块。
3.根据权利要求2所述的方法,其特征在于,所述模型服务源代码的程序语言转换方式包括:
在基于所述程序语言转换代码对模型服务源代码进行程序语言转换时,基于所述入口函数生成代码中的模块命名代码,按照目标命名方式命名所述模型服务源代码对应模型服务模块的模块名。
4.根据权利要求1所述的方法,其特征在于,所述目标代码还包括所述模型服务模块和钩子模块在所述动态共享库中被隐藏的执行逻辑、以及入口函数在所述动态库中可见的执行逻辑;
相应的,所述目标代码的获取方式包括:
在程序语言转换代码中增加目标隐藏代码,并在所述程序语言转换代码中的入口函数生成代码中增加目标可见代码,得到所述目标代码,所述目标隐藏代码包括所述钩子模块和模型服务模块在所述动态共享库被隐藏的执行逻辑,所述目标可见代码包括将所述入口函数属性定义为可见的执行逻辑。
5.根据权利要求4所述的方法,其特征在于,所述将所述目标源代码编译为所述动态共享库包括:
将所述目标源代码进行编译为至少一个目标对象文件,并将所述至少一个目标对象文件链接为动态共享库;
在编译和链接过程中,基于所述目标隐藏代码,将所述动态共享库各个符号设置为隐藏,并基于所述目标可见代码,将所述动态共享库对应的入口函数的属性定义为可见。
6.根据权利要求1所述的方法,其特征在于,所述钩子模块包括查找函数和加载函数所对应的类的执行逻辑;
其中,所述查找函数和加载函数所对应的类的执行逻辑包括:查找待加载模块是否属于所述模型服务模块中的模块;如果所述待加载模块属于所述模型服务模块中的模块,则基于所述加载函数执行对所述待加载模块名的加载逻辑。
7.根据权利要求1所述的方法,其特征在于,所述基于所述目标解释器,对第一程序语言的模型服务源代码和钩子源代码进行程序语言转换,得到第二程序语言的目标源代码包括:
基于所述目标解释器,将第一源代码中的数据打开函数修改为目标打开函数,得到所述模型服务源代码;
在第二源代码中增加解密代码和授权校验代码,得到所述钩子源代码;
其中,所述第一源代码包括基于模型关键数据提供模型服务的执行逻辑,所述目标打开函数用于指示对所述模型关键数据进行解密并打开;所述第二源代码包括对所述模型服务模块的加载逻辑,所述解密代码包括对所述模型关键数据进行解密并打开的执行逻辑;所述授权校验代码用于指示对待部署设备进行授权校验的执行逻辑;
将所述模型服务源代码和钩子源代码由第一程序语言转换为第二程序语言,得到所述目标源代码。
8.根据权利要求1所述的方法,其特征在于,所述方法还包括:
基于所述钩子模块的注册函数,获取所述动态共享库的初始化文件,所述注册函数用于指示在所述第二设备的解释器中注册所述钩子模块;
相应的,所述向所述第二设备发送动态共享库以及模型关键数据包括:
向所述第二设备发送动态共享库、所述动态共享库的初始化文件以及所述模型关键数据。
9.一种数据处理方法,其特征在于,所述方法应用于第二设备,所述方法包括:
接收第一设备发送的动态共享库以及模型关键数据;
其中,所述共享库文件包括模型服务模块以及钩子模块,所述模型服务模块包括基于所述模型关键数据提供模型服务的执行逻辑,所述钩子模块包括对所述模型服务模块的加载逻辑;
在初始化所述动态共享库时,将所述动态共享库加载至所述第二设备的内存中,并在所述第二设备的解释器中注册所述钩子模块;
响应于对所述模型服务模块的加载指令,基于所述钩子模块加载所述模型服务模块,并通过所述第二设备的处理器执行所述模型服务模块对应的执行逻辑,以基于所述模型关键数据提供所述模型服务。
10.根据权利要求9所述的方法,其特征在于,所述在所述第二设备的解释器中注册所述钩子模块包括:
调用所述动态共享库的初始化文件中的钩子注册函数,以在所述解释器中注册所述钩子模块所包括的查找函数和加载函数所对应的类;
其中,所述钩子注册函数用于执行所述钩子模块所包括的钩子注册逻辑,所述钩子注册逻辑包括在所述解释器中注册所述钩子模块所对应的查找函数和加载函数所对应的类;
相应的,所述响应于对所述模型服务模块的加载指令,基于所述钩子模块加载所述模型服务模块,包括:
响应于对所述模型服务模块的加载指令,基于所述解释器传入的待加载模块名,调用所述查找函数和加载函数所对应的类所包括的加载函数,以加载模型服务模块。
11.根据权利要求10所述的方法,其特征在于,所述加载函数的变量包括模块名变量和文件变量;
相应的,所述基于所述解释器传入的待加载模块名,调用所述查找函数和加载函数所对应的类所包括的加载函数,以加载模型服务模块包括:
将所述文件变量赋值为文件对象,并获取所述文件对象对应的文件描述符和文件设备;
基于所述解释器传入的待加载模块名、所述文件描述符和文件设备,从句柄数组中查找所述待加载模块名在所述动态共享库中对应的待加载文件,并加载所述待加载文件。
12.一种数据处理装置,其特征在于,所述装置应用于第一设备,所述装置包括:
发送模块,用于响应于任一第二设备的部署请求,向所述第二设备发送动态共享库以及模型关键数据,所述部署请求用于请求部署模型服务;
其中,所述共享库文件包括模型服务源代码对应的模型服务模块、以及钩子源代码对应的钩子模块,所述模型服务模块包括基于所述模型关键数据提供模型服务的执行逻辑,所述钩子模块包括对所述模型服务模块的加载逻辑;
其中,所述装置还用于生成动态共享库,所述装置在生成所述动态共享库时,包括:
目标解释器确定模块,用于基于目标代码,确定第一程序语言对应的目标解释器,所述目标代码至少包括将源代码由第一程序语言转换为第二程序语言的执行逻辑;
转换模块,用于基于所述目标解释器,对第一程序语言的模型服务源代码和钩子源代码进行程序语言转换,得到第二程序语言的目标源代码,并将所述目标源代码编译为所述动态共享库。
13.一种数据处理装置,其特征在于,所述装置应用于第二设备,所述装置包括:
接收模块,用于接收第一设备发送的动态共享库以及模型关键数据;
其中,所述共享库文件包括模型服务模块以及钩子模块,所述模型服务模块包括基于所述模型关键数据提供模型服务的执行逻辑,所述钩子模块包括对所述模型服务模块的加载逻辑;
注册模块,用于在初始化所述动态共享库时,将所述动态共享库加载至所述第二设备的内存中,并在所述第二设备的解释器中注册所述钩子模块;
加载模块,用于响应于对所述模型服务模块的加载指令,基于所述钩子模块加载所述模型服务模块,并通过所述第二设备的处理器执行所述模型服务模块对应的执行逻辑,以基于所述模型关键数据提供所述模型服务。
14.一种计算机设备,包括存储器、处理器及存储在存储器上的计算机程序,其特征在于,所述处理器执行所述计算机程序以实现权利要求1至11任一项所述方法的步骤。
15.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至11任一项所述方法的步骤。
16.一种计算机程序产品,包括计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至11任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210431717.6A CN116974583A (zh) | 2022-04-22 | 2022-04-22 | 数据处理方法、装置、计算机设备、存储介质及程序产品 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210431717.6A CN116974583A (zh) | 2022-04-22 | 2022-04-22 | 数据处理方法、装置、计算机设备、存储介质及程序产品 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116974583A true CN116974583A (zh) | 2023-10-31 |
Family
ID=88480228
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210431717.6A Pending CN116974583A (zh) | 2022-04-22 | 2022-04-22 | 数据处理方法、装置、计算机设备、存储介质及程序产品 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116974583A (zh) |
-
2022
- 2022-04-22 CN CN202210431717.6A patent/CN116974583A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11100546B2 (en) | Method and system for provenance tracking in software ecosystems | |
US11120018B2 (en) | Spark query method and system supporting trusted computing | |
US20180260199A1 (en) | Method and apparatus for intermediate representation of applications | |
CN111931154B (zh) | 基于数字凭证的业务处理方法、装置及设备 | |
CN107092518A (zh) | 一种保护拟态防御系统软件层安全的编译方法 | |
CN110245518B (zh) | 一种数据存储方法、装置及设备 | |
US20170249492A1 (en) | Two-dimensional code scanning interaction methods and apparatuses | |
CN104965712A (zh) | 应用程序加固保护方法、装置及移动终端 | |
US10241759B2 (en) | Detecting open source components built into mobile applications | |
CN109614774B (zh) | 一种基于sgx的程序控制流混淆方法及系统 | |
US10733303B1 (en) | Polymorphic code translation systems and methods | |
KR101823226B1 (ko) | 코드 보호 방법 및 시스템 | |
CN116910712A (zh) | 代码保护方法、系统、电子设备及存储介质 | |
CN116342283A (zh) | 可信智能合约实现方法、装置、设备及可读存储介质 | |
Fischer et al. | RPC based framework for partitioning IoT security software for trusted execution environments | |
CN116974583A (zh) | 数据处理方法、装置、计算机设备、存储介质及程序产品 | |
US8332834B2 (en) | Generation of a program code in a load format and provision of an executable program code | |
CN113420313A (zh) | 程序安全运行、加密方法及其装置、设备、介质 | |
CN111880805A (zh) | 软件项目的包文件生成方法及装置、设备、存储介质 | |
CN106648770A (zh) | 一种应用程序安装包的生成方法、加载方法及装置 | |
JP2018005915A (ja) | アプリケーションパッケージを提供する方法およびシステム、アプリケーションを実行する方法およびシステム | |
CN117150515B (zh) | Eda二次开发源代码的安全保护方法、电子设备及存储介质 | |
CN111562916B (zh) | 共享算法的方法和装置 | |
WO2023159900A1 (zh) | 远程开发的方法及装置 | |
CN116956297A (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 |