-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
VOICEVOXコアのプロプライエタリ部分をonnxruntimeに逃がして別々にビルド可能にする #24
Comments
まず手を付け始められるのは1と、あと3もあります。 |
2つ目の「暗号化・復号化を組み込めるような関数を用意する」ですが、私が前試したときはまず こういうRust[profile.release]
opt-level = "z"
lto = true
codegen-units = 1
panic = "abort"
strip = true
[package]
name = "voicevox_decrypt"
version = "0.0.0"
edition = "2021"
publish = false
[lib]
crate-type = ["staticlib", "cdylib"]
[dependencies]
cxx = "1.0.91"
thiserror = "1.0.38" use thiserror::Error;
#[cxx::bridge(namespace = "voicevox")]
mod ffi {
extern "Rust" {
pub fn decrypt_model(content: &[u8]) -> Result<Vec<u8>>;
}
}
fn decrypt_model(content: &[u8]) -> Result<Vec<u8>, DecryptModelError> {
Ok(content.to_owned())
}
#[derive(Error, Debug)]
#[error("Could not decrypt")]
struct DecryptModelError; (追記) ついでなので zeroizeで囲ってもいいかも でlibvoicevox_decrypt.aとvoicevox_decrypt.hを作って/voicevox_decryptに突っ込み、こうやってリンクしました。 diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
index a5d28fb516..5582bf838f 100644
--- a/cmake/CMakeLists.txt
+++ b/cmake/CMakeLists.txt
@@ -966,6 +966,12 @@ function(onnxruntime_add_include_to_target dst_target)
endforeach()
endfunction()
+if(UNIX)
+ list(APPEND onnxruntime_EXTERNAL_LIBRARIES "${REPO_ROOT}/voicevox_decrypt/libvoicevox_decrypt.a")
+elseif(WIN32)
+ list(APPEND onnxruntime_EXTERNAL_LIBRARIES "${REPO_ROOT}/voicevox_decrypt/voicevox_decrypt.lib")
+endif()
+
# ACL
if (onnxruntime_USE_ACL OR onnxruntime_USE_ACL_1902 OR onnxruntime_USE_ACL_1905 OR onnxruntime_USE_ACL_1908 OR onnxruntime_USE_ACL_2002)
set(onnxruntime_USE_ACL ON) |
なーーーるほどです!! 静的リンクは全く考えてませんでした。 |
バイナリ解析まで視野に入れると基本的に防御は難しいと思います。推論時には復号済みのweightsがどこかに置いてある必要があり、そもそもユーザーは自分のマシンのメモリを見ることができるので (バイナリ解析を妨害する技術もありますがあまり詳しくないです...) |
まあそのあたりはここで議論しちゃうと・・・って感じかなと思いました。 できる範囲で考えると、暗号部分のコードやビルドコマンドを全部含めて秘匿しておいてactionsで実行、が一番強い気がしました。 |
議題の1つに、普通のonnxモデル(OSS内にあるもの)を読めるものと、製品版のonnxモデルを読めるものとで別のdllを用意する必要があってしまうという議論がありました。 (thx. @PickledChair !) 提案されているようにonnxruntimeを使う部分も外部ライブラリとして切り出す方法があると思います。 |
このタスク、そろそろ進めたい気持ちになってきました。 (時間ができたらリスト作ろうと思いますが、もしご興味ある方いたら作ってくださるとすごく嬉しいです!!!!!) |
思い付くままに書いてみようとしたのですが、細かいタスクリストに落とし込む前に方針の認識合わせが必要かと思いました。方針としてはDiscordとかで話したことから次のようになるかと思っているのですが、どうでしょうか?
あとVOICEVOX/voicevox_core#388ですが、正直VOICEVOXとしてはメリットが薄く、私個人のモチベーションに大きく左右されるかと思うので、であればここまでやってから気長にリリースという形にしたいなと思っています。 Rust API提供タスクリスト案
|
なるほどです、そんな感じで進められると良いのかなと思いました!
こちらはこのissueと関係性が高くないので、関係性の高い VOICEVOX/voicevox_core#388 で書くのが適当なのかなと思いました!! |
(あまり暗号化とかに詳しくないのですが) |
たしかに引数がなくなると追従しやすそうですね! |
頂いたコメントをもとに、自分でビルドした場合はサンプルモデルしか読み込め ないことがわかるようにする。 #492 (comment) 実際は自分で作ったonnxモデルなども読み込めるといえば読み込めるため、「製 品版VOICEVOXのvvmは読み込めません。」の方が適切かもしれない。ただ VOICEVOX/voicevox_project#24 を完遂したら不要になる一文であるため、あま り考えすぎる必要もないということで元の文章からほとんど変わらない形を採用 した。 close #492
概要
今VOICEVOXのコードは大半がOSSですが、唯一コアのonnxモデル暗号化の部分だけがプロプライエタリになっています。
そのせいでコアはいくつかの問題が浮き彫りになっています。
特に2つ目が厄介で、Rust化してからヒホの技量不足により足を引っ張ってしまい、OSS本来の力を出せていません。
そこで生まれたのが 暗号化部分(バイナリの変換)を全部onnxruntime内に逃がす という発想です。(thx @qryxip !)
これにより↑の1~4が全部解決し、特にOSS的には「専用のonnxruntimeライブラリさえ用意できればOSS版コアは独立に開発・バージョンアップできる」というかっこいい状態になります。
ちなみにキャラ追加部分は独立できないのですが、これはこちらで取り組み中です。(thx @qwerty2501 !)
手法
この「コアの製品版コードをonnxruntimeに逃がすプロジェクト」は大きく分けて3段階の工程があると思っていて、その工程ごとに人を募集したい感じです。
まず1つ目が「通常のonnxruntimeをGithub Actionsでビルドする」ことです。
Windows CPU/DirectML/CUDA、Mac CPU、Linux CPU/CUDAでのビルドが必要です。
ぶっちゃけここが一番難しい気がしています。
2つ目が「暗号化・復号化を組み込めるような関数を用意する」ことです。
これはload関数の中や外に復号化専用の経路を用意する必要があります。
ぶっちゃけここはこの発想に至ること自体は難しい一方、実装はある程度簡単な気がしています。
3つ目が製品部分、つまり暗号化・復号化処理です。
これはOSSではないため、秘匿コード開発専用のチームに参加して頂くことになります。
ここは難度が不明です。セキュリティ周り詳しい方がいたらぜひ意見聞きたいです。
成果物ができてもコードは公開できませんが、誰と一緒に作ったかはちゃんと公表させていただこうと思います。
その他
興味あれば 👀 リアクションなどいただければ・・・!
参考
Linux armhf版などのonnxruntimeをGithub Actions上でビルドしている例
https://github.com/VOICEVOX/onnxruntime-builder
Rustから直接VOICEVOX Coreを使いたい
VOICEVOX/voicevox_core#388
The text was updated successfully, but these errors were encountered: