【问题标题】:How to hide or encrypt my own keras model file(like h5) when deploying?部署时如何隐藏或加密我自己的keras模型文件(如h5)?
【发布时间】:2020-04-16 07:58:21
【问题描述】:

我为应用程序制作了自己的模型并将其保存在 Keras 中为 .h5 文件。我使用 PyQt5 制作了 GUI 应用程序,这个应用程序使用了这个模型。我正在尝试在没有任何有关深度学习模型的信息的情况下部署此应用程序。 我对这种情况有一些疑问。

  1. 我可以隐藏或加密我的模型以防止其架构和重量暴露吗?
  2. 如果 Keras 不支持加密模型,是否还有其他库(如 PyTorch)支持此功能?

我期待听到任何建议。谢谢你的回答。

【问题讨论】:

    标签: keras deployment deep-learning


    【解决方案1】:

    模型加密既不是keras 也不是pytorch 的正式组成部分。

    如果你想隐藏某些东西,我认为 Python 是一个大问题。 AFAIK 使用它来隐藏你的解决方案是不可能的,我将概述我将如何“保护”模型(这些很长,所以请确保你真的需要这种保护[或确切的保护级别]) .

    提供的 Python 解决方案

    存在PySyft,它同时处理 PyTorch 和 Keras,但它用于安全多方计算。由于用户可以访问您的 Python 代码(您提到了 PyQT5)和所有敏感数据(在本例中为模型),他们将能够很容易地恢复它。

    可能的解决方案

    如果我是你,我会选择简单的受密码保护的存档(AES 或 .zip)。对于第一种情况,我找到了this post 和相关的TFSecured repository,它们通过 Python 对 tensorflow 模型进行 AES 加密,并允许您在 C++ 中加载保存的加密 protobuf 模型文件(这应该是您的方式,原因如下) .

    别管 Python

    您是否想认真保护您的模型(不仅仅是某种混淆),您根本不应该在用户端使用 Python。

    没有办法编译 Python 的代码,尤其是使用 Keras、Tensorflow 或 PyTorch 等重型机器学习库的代码。尽管有像PyInstaller 这样的程序,但众所周知,要让它与复杂的依赖项一起工作是非常困难的。即使你这样做了,用户仍然可以访问代码,尽管它可能会有点困难(PyInstaller 只是将 Python、你的依赖项和应用程序捆绑为一个存档,然后再解压缩)。

    您可以使用pyarmor 或类似的方式进一步混淆代码,但如果有人下定决心,这一切都很容易逆转。

    C++

    无论您选择keras/tensorflow 还是pytorch,您都可以使用较低级别并使用 C++ 加载您的网络。

    由于它是一种编译语言,您所要做的就是提供一个二进制文件(如果是静态链接)或带有共享库的二进制文件。在 C++ 源代码中,您保留 AES/zip 密钥,如有关 TFSecured 的博客文章所示:

    #include <GraphDefDecryptor.hpp>
    
        ........
    
    
        tensorflow::GraphDef graph;
        // Decryption: 
        const std::string key = "JHEW8F7FE6F8E76W8F687WE6F8W8EF5";
        auto status = tfsecured::GraphDefDecryptAES(path,         // path to *.pb file (encrypted graph)
                                                    graph,
                                                    key);         // your key
        if (!status.ok()) {
            std::cout << status.error_message() << std::endl;
            return;
        }
    
        // Create session :
        std::unique_ptr<Session> session(NewSession(options));
        status = session->Create(graph);
    

    要对已编译的 C++ 代码进行逆向工程以获取隐藏在其中的密钥会更加困难。也可以通过一些第三方工具/库对PyTorch 执行类似的过程。另一方面,您必须使用 Qt5 在 C++ 中重写您的 PyQt5 应用程序。

    【讨论】:

    • 感谢您的回答。这对我的问题非常有帮助。我将不得不考虑另一种方式。
    猜你喜欢
    • 2019-08-03
    • 2019-12-21
    • 2021-12-03
    • 1970-01-01
    • 2019-07-30
    • 2019-09-29
    • 2020-12-24
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多