如何在 Tensorflow.js 中保护(混淆/DRM)训练模型权重?

IT技术 javascript reactjs tensorflow tensorflow.js
2021-05-14 12:29:18

我正在开发一个基于 React 的 Web 应用程序,该应用程序使用 Tensorflow.js 在浏览器的客户端上实时运行 AI 模型。我已经从头开始训练这个 AI 模型,我想保护它不被拦截并用于其他项目。是否有任何保护措施可以做到这一点(混淆、DRM 等)?

从业务角度来看,我希望该模型适用于我的 Web 应用程序,而不是其他任何地方。

我在这方面找到的讨论 ( 1 2 3 ) 更适合本机应用程序,而不是 Web 应用程序。

是一个使用 Tensorflow.js 的开源 Web 应用示例。这些权重是我希望在我的应用程序中保护的示例。

2个回答

客户端代码混淆永远不会完全阻止它。改用服务器。

混淆

如果您的客户端应用程序包含模型,那么用户将能够以某种方式提取它。你可以让用户更难,但它永远是可能的。一些使它更难的技术是:

  • 混淆您的代码:这样用户将无法轻松阅读您的代码和注释。根据您的构建工具,当您生成“生产就绪”构建时,这可能已经为您完成。
  • 混淆库及其公共 API:即使您的代码被混淆,用户仍然可以通过查看库的公共 API 调用来猜测发生了什么。示例:在model.predict函数处设置断点并从那里开始调试代码是相当容易的通过混淆库及其 API,这将变得更加困难。
  • 在您的代码中放置“特殊检查”:您还可以检查代码运行所在的页面是否是您的页面(例如,域是否匹配)等。您还想混淆此代码。

即使您的代码被完全混淆并受到良好保护,您的客户端代码仍然在某处包含您的模型。使用这些方法总是可以以某种方式提取您的模型。

服务器端方法

为了使您的模型无法获得,您需要一种不同的方法。只把你的“愚蠢的逻辑”放在客户端上。排除要保护的代码部分。相反,您在服务器上提供一个 API 来执行代码的“受保护部分”。

这样,您无需model.predict在客户端运行,而是向后端发出 AJAX 请求(带有参数),然后返回结果。这样用户只能看到输入和输出,而不能提取模型本身。

请记住,这意味着更多的工作,因为您不仅需要为客户端应用程序编写代码,还需要为服务器端应用程序编写代码,包括 API。根据您的应用程序的外观(例如:它有登录名吗?),这可能需要更多的代码。

另一种保护模型的方法是将模型拆分为多个块。在服务器端放置一些块,在客户端放置一些块。这种方法也可能会引入很多工程工作,但是一旦你这样做了,你就可以权衡服务器和客户端之间的计算负载和网络延迟。用户只能得到一些无用的模型块,而无需与服务器端块配合。