-
Notifications
You must be signed in to change notification settings - Fork 120
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
Windows向けONNX RuntimeのビルドでDirectMLとCUDAが一緒くたになっている #804
Comments
まあダウンロードサイズは50MBくらいなので、一緒でもいいかもですね・・・!! |
300MBは解凍後ですね。 drwx------ - ryo ryo 2024-07-02 17:29 ./voicevox_core-windows-x64-directml-999.999.999
.rw-r--r-- 17M ryo ryo 2024-07-02 17:29 ├── onnxruntime.dll
.rw-r--r-- 324M ryo ryo 2024-07-02 17:29 ├── onnxruntime_providers_cuda.dll
.rw-r--r-- 11k ryo ryo 2024-07-02 17:29 ├── onnxruntime_providers_shared.dll
.rw-r--r-- 11k ryo ryo 2024-07-02 17:29 ├── README.txt
.rw-r--r-- 12 ryo ryo 2024-07-02 17:29 ├── VERSION
.rw-r--r-- 3.6M ryo ryo 2024-07-02 17:29 ├── voicevox_core.dll
.rw-r--r-- 54k ryo ryo 2024-07-02 17:29 ├── voicevox_core.h
.rw-r--r-- 18k ryo ryo 2024-07-02 17:29 └── voicevox_core.lib microsoft/onnxruntimeだとCPU版とDirectML版とCUDA版を分けてて、pykeio/ortだとCPU&DirectML版とCUDA版という分け方にしてますね。 正直onnxruntime_providers_cuda.dllみたいなのが入ってくるのは見通しが悪くなるし混乱もしそうなので、microsoft/onnxruntime式か、あるいはpykeio/ort式でもいいんじゃないか?と思っています。 あと |
良いと思います!どっちの仕様にしようか迷いますねぇ。
|
気付いたのですがpykeio/ort式だと静的リンクなのに対し、DirectML版の動的リンクだとDirectML.dllの管理を別途しなければならないですね。なのでCPU版とDirectML版を一緒にしてしまうと、CPU版も余計な手間が一つ増えることに…
これの補足ですが、こんな感じに二つの // 「このVOICEVOX COREのビルドがサポートしているもの」
SupportedDevices::THIS == SupportedDevices { cuda: true, dml: true } // 「ONNX Runtimeがサポートしているもの」
ort.supported_devices() == Ok(SupportedDevices { cuda: false, dml: true }) // 「このVOICEVOC COREのビルドとONNX Runtimeの両方がサポートしているもの」
SupportedDevices::THIS & ort.supported_devices().unwrap() == SupportedDevices { cuda: false, dml: true} |
なーーるほどです!たぁしかに。
andでandが取れるのなるほどです。 …あれ、そもそもボイボコアはGPU版とCPU版で全く同じビルドになる気がしてきました!! |
確かONNX RuntimeにはCUDA版とかDirectML版でしか生えないAPIがあったはずで、それらを使うためにRust側のコンパイルをconditionalにする必要がある… のですが、 #802 をやった今ならその必要はもう無いですね。 pykeio/ortとしても、実装を見る限り いずれにせよ少なくともバイナリとしてリリースするWindows版とLinux版はビルドが一種類ずつになりますし、libvoicevox_onnxruntimeを同梱しないのならリリースを分ける必要も無くなりますね。macOS + Swift package + Core MLをやりたいとなったときにまたRust側で分けないといけなくなるくらい? 追記: 今のCargo featureをこうすればよさそう。
まあまずはCORE本体のリリースにONNX Runtimeを含めないようにして、ダウンローダーからダウンロードするようにするところから? |
なるほど!!専用の関数があったりなかったりするんですね。 ビルドするものは少ない方がシンプルで嬉しそうですね! |
ちょっと若干意図が掴めなかったのですが、私の理解ではDLLパス無指定での"load"は"link"と同じ感じで動くはずです。 あとエンジンに組み込むときはlibonnxruntimeもlibvoicevox_coreになる(多分)上に、ONNX Runtime自体のバージョンとかCUDAのバージョンとかも上がり、model/*.binはVVMになっているので、どの道現0.15からはセットアップのしかたが変わると思います。 |
あ、たしかにです!! 簡単に設定できること、あとそもそも他の変更要因が大規模なことから、このlink/loadの件は今のところエンジンについて意識から外して良さそうに思いました! 動作確認と需要満たしができたることを確認するまでしばらくどっちも作るのは方針としてありだと思いますが、まあ一気に置き換えでも良いかも。 |
こっちについては一応、特になんか用意しておく必要はないんじゃないかと思います。 コメントを残すかどうかですが、Rustの経験およびプログラミングの勘と調査能力がある人であれば何も無くても数分で次のような結論に辿り着けるはず…多分。
|
たしかにしっかり確認する工程があれば大丈夫そう!
どこの話かわからないですが、未来の僕たちのためになりそうだったら残しても良いかも。 |
featureを voicevox_core/crates/voicevox_core/src/synthesizer.rs Lines 47 to 57 in d66a8b0
というのも、EPが実際に使えるかどうかは 思い浮かぶ方針は次の四つで、どれにしようか迷っています。
|
↑ ちょっと実装の目算が立ったので、案2. + 案3.で手を付けてみようと思います。 |
ちょっと考え切れてないのですが、先々のことを考えると案3が良さそうに思いました! ユーザーもサードパーティーアプリ開発者もやりたいのは「GPUを使う」なので あと |
案2.についてですが例として、CUDAが使えないLinuxのPCでCUDA版のコア&エンジンの利用を試みた場合を考えます。 エンジンを
コアのC APIでも、現状では同じような挙動をします。
ちなみに これを次のようにする案です。
利点としては、 #783 でCPU版にフォールバックしたときに 案3. (ユーザーからGPUを選択可能)ですが、エンジン(のようなソフトウェア)から使うことを考えると pub enum AccelerationMode {
Auto,
AnyGpu, // `Auto`のようにGPUを試行するが、CPU版にフォールバックせずにエラー
Cpu,
Dml { device_id: i32 },
Cuda { device_id: i32 },
} |
@qryxip なーーーーーーるほどです!!! 案3のAnyGpuもなるほどです!こちらもあると嬉しそうです! |
不具合の内容
#802 (comment)
現象・ログ
割愛
再現手順
割愛
期待動作
download_test
は通るべき。--device directml
と指定するとonnxruntime_providers_cuda.dll (約300MB)まで付いてくる。このような挙動は望ましくないかもしれない。VOICEVOXのバージョン
N/A
OSの種類/ディストリ/バージョン
その他
DirectML版とCUDA版を分離する場合、段取りとしてはonnxruntime-builder (ビルドしなおし) → VOICEVOX/ort (リストの更新) → voicevox_core (voicevox-ortの更新)となるはず。
The text was updated successfully, but these errors were encountered: