OpenVINO で暗号化モデルを使用

ディープラーニング機能をエッジデバイスにデプロイすると、推論の整合性の確保やディープラーニング・モデルの著作権保護など、セキュリティー上の課題が生じる可能性があります。

考えられる解決策の 1 つは、エッジデバイスにデプロイおよび保存されるモデルを暗号化して保護することです。モデルの暗号化、復号化、および認証は OpenVINO によって提供されませんが、サードパーティー・ツール (OpenSSL など) を使用して実装できます。暗号化を実装するときは、最新バージョンのツールが使用されていることを確認し、暗号化のベスト・プラクティスに従ってください。

このガイドでは、保護されたモデルで OpenVINO を安全に使用する方法を説明します。

モデルデプロイの安全性

モデルはモデル変換 API によって最適化された後、OpenVINO 中間表現 (OpenVINO IR) 形式でターゲットデバイスにデプロイされます。最適化されたモデルはエッジデバイスに保存され、OpenVINO ランタイムによって実行されます。TensorFlow、TensorFlow Lite、ONNX、および PaddlePaddle モデルは、OpenVINO ランタイムによってネイティブに読み取ることもできます。

エッジデバイスにデプロイする前にモデルを暗号化して最適化することで、ディープラーニング・モデルを保護できます。エッジデバイスは、保存されたモデルを常に保護し、OpenVINO ランタイムでの実行時にのみモデルを実行時に復号化する必要があります。

../../_images/deploy_encrypted_model.svg

暗号化されたモデルのロード

OpenVINO ランタイムでは、ロードする前にモデルを復号化する必要があります。モデルの復号化用に一時メモリーブロックを割り当て、ov::Core::read_model メソッドを使用してメモリーバッファーからモデルをロードします。詳細については、ov::Core クラスのリファレンス・ドキュメントを参照してください。

std::vector<uint8_t> model_data, weights_data;

std::string password; // taken from an user
std::ifstream model_file("model.xml"), weights_file("model.bin");

// Read model files and decrypt them into temporary memory block
decrypt_file(model_file, password, model_data);
decrypt_file(weights_file, password, weights_data);

インテル® ソフトウェア・ガード・エクステンション (インテル® SGX) などのハードウェア・ベースの保護を使用して、復号化操作の機密性を保護し、デバイスにバインドできます。詳細については、インテル® ソフトウェア・ガード・エクステンションをご覧ください。

ov::Core::read_model を使用して、モデル表現と重みをそれぞれ設定します。

現在、ONNX モデルのメモリーから外部の重みを読み取る方法はありません。ov::Core::read_model(const std::string& model, const Tensor& weights) メソッドは、空の ov::Tensor として渡された 重み (weights) を使用して呼び出す必要があります。

ov::Core core;
// Load model from temporary memory block
std::string str_model(model_data.begin(), model_data.end());
auto model = core.read_model(str_model,
    ov::Tensor(ov::element::u8, {weights_data.size()}, weights_data.data()));

関連情報