Skip to content
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

onnxruntime-rsからortに乗り換える #725

Merged
merged 42 commits into from
May 22, 2024

Conversation

qryxip
Copy link
Member

@qryxip qryxip commented Jan 10, 2024

内容

関連 Issue

Resolves #718, resolves #307.

その他

@qryxip qryxip mentioned this pull request Jan 20, 2024
12 tasks
@qryxip qryxip marked this pull request as ready for review January 21, 2024 04:46
Cargo.toml Outdated Show resolved Hide resolved
Comment on lines +62 to +68
pub const ORT_LOGGING_LEVEL: &str = if cfg!(debug_assertions) {
"info"
} else {
"warn"
};
format!("error,voicevox_core=info,voicevox_core_c_api=info,ort={ORT_LOGGING_LEVEL}")
.into()
Copy link
Member Author

@qryxip qryxip Jan 23, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

以下のAPI削除のため、warn未満のログを抑える役目をここに移動させる。

Environment-level logging configuration (i.e. EnvironmentBuilder::with_log_level) has been removed because it could cause unnecessary confusion with our tracing integration.

https://ort.pyke.io/migrating/v2#changes-to-logging

(言っていることは真っ当だと思う)

libonnxruntimeのWARNING未満のログだけ、ひとまずはortの中でせきとめる。ort自体のwarn以下のログについては、明示的に出すことができる分にはかまわないものしかないはず。

Comment on lines 61 to 67
let cpu_num_threads = options.cpu_num_threads.try_into().unwrap_or_else(|_| {
warn!(
"`cpu_num_threads={}` is too large. Setting it to 32767",
options.cpu_num_threads,
);
i16::MAX
});
Copy link
Member Author

@qryxip qryxip Jan 23, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ortはi16を要求するため、変換を入れる。

ortの実装はこうなっており、コメントを考慮すると意味がわからない。
https://github.com/pykeio/ort/blob/2fdba8f021924d40c6281427b4f8142e932d9bfb/src/session/mod.rs#L175-L177
(旧onnxruntime-rsの時点であちこちこんな感じだったらしい?)

Cargo.toml Show resolved Hide resolved
@qryxip
Copy link
Member Author

qryxip commented Apr 28, 2024

正しいバージョンのCUDAを入れずににCUDA版のセッションを開始しようとしたときの様子。 ortってこういうとこにも変化が入っているんですね。

Before (エラー):

[INFO] __main__: Loading `../../model/sample.vvm`
Exception: Failed to create session options: Error calling ONNX Runtime C function: /onnxruntime_src/onnxruntime/core/session/provider_bridge_ort.cc:1103 onnxruntime::Provider& onnxruntime::ProviderLibrary::Get() [ONNXRuntimeError] : 1 : FAIL : Failed to load library libonnxruntime_providers_cuda.so with error: libcublasLt.so.11: cannot open shared object file: No such file or directory


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "./run.py", line 98, in <module>
    main()
  File "./run.py", line 41, in main
    synthesizer.load_voice_model(model)
voicevox_core.InvalidModelDataError: `../../model/sample.vvm`の読み込みに失敗しました: モデルデータを読むことができませんでした

After (CPU版にフォールバックして継続):

[WARNING] ort.execution_providers: An error occurred when attempting to register `CUDAExecutionProvider`: /home/runner/work/onnxruntime-builder/onnxruntime-builder/onnxruntime/core/session/provider_bridge_ort.cc:1209 onnxruntime::Provider& onnxruntime::ProviderLibrary::Get() [ONNXRuntimeError] : 1 : FAIL : Failed to load library libonnxruntime_providers_cuda.so with error: libcublasLt.so.11: cannot open shared object file: No such file or directory

[WARNING] ort.execution_providers: No execution providers registered successfully. Falling back to CPU.

@tarepan
Copy link
Contributor

tarepan commented Apr 28, 2024

正しいバージョンのCUDAを入れずににCUDA版のセッションを開始

こちら VOICEVOX/voicevox_engine#709 (comment) で議論されていた CUDA バージョン不一致に関して、実際に不一致が起きた場合に ort 版では CPU フォールバックになる、ということですね。
ユーザーがフォールバックに気づかず「GPU 版を使っているはずなのに遅い」という感想が出てきそうな予感もします。

@qryxip
Copy link
Member Author

qryxip commented Apr 28, 2024

まあコア的にもAccelerationMode::Autoがあるわけですし良くはないですね。ドキュメント見たらこうあったので、EnvironmentBuilder::with_execution_provider SessionBuilder::with_execution_providerじゃなくてExecutionProvider::registerを使う方がよさそう。

To receive these registration errors, instead use ExecutionProvider::register to register an execution provider:

use ort::{CUDAExecutionProvider, ExecutionProvider, Session};

fn main() -> anyhow::Result<()> {
    let builder = Session::builder()?;

    let cuda = CUDAExecutionProvider::default();
    if cuda.register(&builder).is_err() {
        eprintln!("Failed to register CUDA!");
        std::process::exit(1);
    }

    let session = builder.commit_from_file("model.onnx")?;

    Ok(())
}

Fallback behavior - Execution providers - ort

@qryxip
Copy link
Member Author

qryxip commented Apr 28, 2024

コアAPI的には、AccelerationMode::Autoのときに限ってフォールバック挙動(libonnxruntimeが対応してたらAccelerationMode::Gpuと同様にDML/CUDA版の開始を試み、駄目だったらエラーではなくCPU版)にしてもいいかもしれませんね。

@qryxip
Copy link
Member Author

qryxip commented Apr 28, 2024

これでエラー挙動になるはず。
7e74743 (#725)

@sevenc-nanashi
Copy link
Member

コアAPI的には、AccelerationMode::Autoのときに限ってフォールバック挙動(libonnxruntimeが対応してたらAccelerationMode::Gpuと同様にDML/CUDA版の開始を試み、駄目だったらエラーではなくCPU版)にしてもいいかもしれませんね。

Autoという単語からするとこれがかなり自然で良いと思います。

@qryxip
Copy link
Member Author

qryxip commented Apr 29, 2024

#784

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm!!
ありがとうございます!!!

1箇所コメントしてますが、問題なさそうならそのままマージで!
リポジトリ変える場合も変えた後マージでお願いできれば!

Cargo.toml Outdated Show resolved Hide resolved
@qryxip qryxip merged commit 5a644ca into VOICEVOX:main May 22, 2024
37 checks passed
@qryxip qryxip deleted the onnxruntime-rs-to-ort branch May 22, 2024 00:35
@qryxip
Copy link
Member Author

qryxip commented May 22, 2024

@tuna2134 (#693)
@takejohn (#758)

共有です。

  • CUDA版への切り替えが$ORT_USE_CUDAではなく、DirectML版同様にCargo feature経由になりました。
  • $ORT_OUT_DIRは廃止されました。libonnxruntimeはVOICEVOX/ortにより、target/{debug,release}/depsに自動でコピーされます。
  • ONNX Runtimeのバージョンが1.14.0から1.17.3になりました。
  • 手元へのマージ(追従)後、もしテストとかが壊れたりするのなら一度cargo cleanすると動くと思います。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

onnxruntime-rsからortに乗り換える unsafe impl Send for SynthesisEngineをやめる
4 participants