如何在 Tensorflow.js 中保护(混淆/DRM)训练模型权重?
IT技术
javascript
reactjs
tensorflow
tensorflow.js
2021-05-14 12:29:18
2个回答
客户端代码混淆永远不会完全阻止它。改用服务器。
混淆
如果您的客户端应用程序包含模型,那么用户将能够以某种方式提取它。你可以让用户更难,但它永远是可能的。一些使它更难的技术是:
- 混淆您的代码:这样用户将无法轻松阅读您的代码和注释。根据您的构建工具,当您生成“生产就绪”构建时,这可能已经为您完成。
- 混淆库及其公共 API:即使您的代码被混淆,用户仍然可以通过查看库的公共 API 调用来猜测发生了什么。示例:在
model.predict
函数处设置断点并从那里开始调试代码是相当容易的。通过混淆库及其 API,这将变得更加困难。 - 在您的代码中放置“特殊检查”:您还可以检查代码运行所在的页面是否是您的页面(例如,域是否匹配)等。您还想混淆此代码。
即使您的代码被完全混淆并受到良好保护,您的客户端代码仍然在某处包含您的模型。使用这些方法总是可以以某种方式提取您的模型。
服务器端方法
为了使您的模型无法获得,您需要一种不同的方法。只把你的“愚蠢的逻辑”放在客户端上。排除要保护的代码部分。相反,您在服务器上提供一个 API 来执行代码的“受保护部分”。
这样,您无需model.predict
在客户端运行,而是向后端发出 AJAX 请求(带有参数),然后返回结果。这样用户只能看到输入和输出,而不能提取模型本身。
请记住,这意味着更多的工作,因为您不仅需要为客户端应用程序编写代码,还需要为服务器端应用程序编写代码,包括 API。根据您的应用程序的外观(例如:它有登录名吗?),这可能需要更多的代码。
另一种保护模型的方法是将模型拆分为多个块。在服务器端放置一些块,在客户端放置一些块。这种方法也可能会引入很多工程工作,但是一旦你这样做了,你就可以权衡服务器和客户端之间的计算负载和网络延迟。用户只能得到一些无用的模型块,而无需与服务器端块配合。