モデル・リソースの暗号化

AI モデルやその他のバイナリ資産を暗号化し、実行時に平文をディスクへ書き込むことなく読み戻します。

magiclock protect-model は、モデル、重みファイル、その他任意のリソースを .enc エンベロープへ暗号化します。アプリは実行時に bootstrap()open_model() を使ってメモリ上でそれを復号します — 平文のバイト列がディスクに触れることは一切ありません。

モデルの暗号化

shell
magiclock protect-model models/face.onnx                       # -> models/face.onnx.enc
magiclock protect-model weights/net.pt --feature ai_model -o net.enc

--feature は、これを解錠するためにライセンスが付与している必要があるケーパビリティの名前を指定します — デフォルトは ai_model です。コードの暗号化で紹介した有効期限系(--trial / --expires-in / --expires-at)、ポータブル系(--no-bind-machine--passphrase--emit-key)、--lock-passphrase の各フラグは、ここでもすべて同様に使えます。

実行時の読み戻し

python
import magiclock
import onnxruntime

magiclock.bootstrap()  # brings the gate up against this machine's license
model_bytes = magiclock.open_model("models/face.onnx.enc")  # plaintext, in memory only
session = onnxruntime.InferenceSession(model_bytes)

open_model() は、エンベロープの中身が ONNX、PyTorch の state dict、生の重み配列、あるいは設定バンドルやデータセットのような任意のバイナリリソースであっても、同じように動作します。bytes として渡したものは、bytes として戻ってきます。

関数リファレンス

シグネチャ備考
magiclock.bootstrap()bootstrap(vault_dir=None, *, app_version="1.0.0") -> MagicLockRuntimeopen_model()(またはゲートされたコード)が実行される前に、一度だけ呼び出します。magiclock build の成果物ではエントリモジュールにこの呼び出しが自動で挿入されます — 手動で呼び出す必要があるのは、コンパイルしない通常のスクリプトの場合のみです。このマシンが有効化されていない場合は例外を送出します。
magiclock.open_model()open_model(path, *, vault_dir=None, passphrase=None, key=None) -> bytesマシンロック形式かポータブル形式かを自動判定します。ポータブル形式や二要素形式の成果物では、プロンプトの代わりに passphrase/key を渡してください。

例外やエッジケースについては、Python API リファレンスを参照してください。

常にメモリ上のみ

復号されたモデルのバイト列は、参照を保持している間だけプロセスのメモリ上に存在します — open_model() が平文のコピーをディスクや一時ディレクトリなどに書き込むことは一切ありません。推論フレームワークがバイト列ではなくファイルパスを必要とする場合は、自分でファイルに書き出すのではなく、メモリ上に保持される場所(例えばインメモリのファイルオブジェクト)に置いてください。そうしないと、平文が MagicLock の保護の外側でディスク上に残ってしまいます。