-
Notifications
You must be signed in to change notification settings - Fork 132
perf: CUDAExecutionProviderにおける畳み込みアルゴリズム検索をEXHAUSTIVE (0)からHEURISTIC (1)に変更(CUDA EP使用時のWarmupにかかる時間を短縮) #1162
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
perf: CUDAExecutionProviderにおける畳み込みアルゴリズム検索をEXHAUSTIVE (0)からHEURISTIC (1)に変更(CUDA EP使用時のWarmupにかかる時間を短縮) #1162
Conversation
…UDA EP使用時のWarmupにかかる時間を短縮)
|
100文字と500文字と1000文字で同様のテストを行った結果を追加します。1000文字については、3080tiの12GBのVRAMに乗り切らず、共有GPUメモリを使ってしまっていて、パフォーマンスが大幅に悪化しています。依存関係と実行環境については最初のものと同じです。 実行コードuse std::time::Instant;
use voicevox_core::{
StyleId,
blocking::{Onnxruntime, OpenJtalk, Synthesizer, VoiceModelFile},
};
const VVORT: &str = "./models/voicevox_core/onnxruntime/lib/voicevox_onnxruntime_cuda.dll";
const OJT_DIC: &str = "models/voicevox_core/dict/open_jtalk_dic_utf_8-1.11";
const MODEL_0_VVM: &str = "./models/voicevox_core/models/vvms/0.vvm";
const ZUNDAMON_NORMAL: StyleId = StyleId(3);
const SHIKOKU_NORMAL: StyleId = StyleId(2);
/// 指定された文字数の日本語テキストを生成する
fn generate_japanese_text(char_count: usize) -> String {
let base_sentences = vec![
"今日は良い天気です。",
"音声合成技術の発展により、自然な音声を生成することが可能になりました。",
"プログラミングは論理的思考力を養うのに役立ちます。",
"機械学習は人工知能の重要な分野の一つです。",
"データサイエンスは現代社会において非常に重要な役割を果たしています。",
"自然言語処理技術の進歩により、コンピュータと人間の対話がより自然になってきています。",
"深層学習アルゴリズムは画像認識や音声認識などの分野で革新的な成果を上げています。",
"量子コンピュータは従来のコンピュータでは解決困難な問題を解く可能性を秘めています。",
];
let mut result = String::new();
let mut sentence_index = 0;
while result.chars().count() < char_count {
let sentence = &base_sentences[sentence_index % base_sentences.len()];
if result.chars().count() + sentence.chars().count() <= char_count {
result.push_str(sentence);
} else {
// 残りの文字数だけ追加
let remaining = char_count - result.chars().count();
let chars: Vec<char> = sentence.chars().collect();
for i in 0..remaining.min(chars.len()) {
result.push(chars[i]);
}
break;
}
sentence_index += 1;
}
result
}
#[inline(always)]
fn run_tts(
synth: &Synthesizer<OpenJtalk>,
text: &str,
style_id: StyleId,
) -> anyhow::Result<std::time::Duration> {
let start = Instant::now();
synth.tts(text, style_id).perform()?;
Ok(start.elapsed())
}
fn measure_tts_performance(
synth: &Synthesizer<OpenJtalk>,
text: &str,
char_count: usize,
style_id: StyleId,
style_name: &str,
warmup_runs: usize,
measurement_runs: usize,
) -> anyhow::Result<()> {
println!("\n=== {} characters, {} ===", char_count, style_name);
println!("Text preview: {}...", &text.chars().take(50).collect::<String>());
// ウォームアップ実行
println!("Warmup runs:");
for i in 1..=warmup_runs {
let duration = run_tts(synth, text, style_id)?;
println!(" Warmup #{}: {:?}", i, duration);
}
// 測定実行
println!("Measurement runs:");
let mut durations = Vec::new();
for i in 1..=measurement_runs {
let duration = run_tts(synth, text, style_id)?;
durations.push(duration);
println!(" Run #{}: {:?}", i, duration);
}
// 統計情報
if !durations.is_empty() {
let avg = durations.iter().sum::<std::time::Duration>() / durations.len() as u32;
let min = durations.iter().min().unwrap();
let max = durations.iter().max().unwrap();
println!(" Statistics: avg={:?}, min={:?}, max={:?}", avg, min, max);
}
Ok(())
}
fn main() -> anyhow::Result<()> {
let ort = Onnxruntime::load_once().filename(VVORT).perform()?;
println!("supported providers: {:?}", ort.supported_devices());
let ojt = OpenJtalk::new(OJT_DIC)?;
let synth = Synthesizer::builder(ort)
.text_analyzer(ojt)
.acceleration_mode(voicevox_core::AccelerationMode::Auto)
.build()?;
println!("GPU mode: {}", synth.is_gpu_mode());
let load_start = Instant::now();
synth.load_voice_model(&VoiceModelFile::open(MODEL_0_VVM)?)?;
println!("Loaded {MODEL_0_VVM} in {:?}", load_start.elapsed());
// テスト対象の文字数
let char_counts = vec![100, 500, 1000];
// 各文字数のテキストを生成
let mut test_texts = std::collections::HashMap::new();
for &char_count in &char_counts {
let text = generate_japanese_text(char_count);
println!("Generated {} characters text (actual: {})", char_count, text.chars().count());
test_texts.insert(char_count, text);
}
println!("\n{:=^80}", " TTS Performance Measurements ");
// 各文字数、各スタイルでテスト
let styles = vec![
(ZUNDAMON_NORMAL, "ずんだもん(ノーマル)"),
(SHIKOKU_NORMAL, "四国めたん(ノーマル)"),
];
for &char_count in &char_counts {
let text = &test_texts[&char_count];
for &(style_id, style_name) in &styles {
measure_tts_performance(
&synth,
text,
char_count,
style_id,
style_name,
2, // ウォームアップ回数
3, // 測定回数
)?;
}
}
Ok(())
}修正前修正後 |
CodSpeed Performance ReportMerging #1162 will not alter performanceComparing
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR modifies the CUDA execution provider configuration to use heuristic algorithm search instead of exhaustive search for cuDNN convolution operations. This change significantly reduces warmup time and prevents performance degradation when switching between different text-to-speech styles and texts during CUDA-accelerated inference.
- Changes cuDNN convolution algorithm search from EXHAUSTIVE (0) to HEURISTIC (1)
- Applies the optimization to all CUDA execution provider instances in the codebase
- Maintains the same API while improving performance characteristics
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
| let cuda = CUDAExecutionProvider::default() | ||
| .with_conv_algorithm_search( | ||
| ort::CUDAExecutionProviderCuDNNConvAlgoSearch::Heuristic, | ||
| ) | ||
| .is_available()?; |
Copilot
AI
Sep 28, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The CUDA execution provider configuration is duplicated in three locations. Consider extracting this configuration into a helper function or constant to reduce code duplication and ensure consistency across all instances.
|
私のLinux機でも試してみました。 変更前supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 539.020695ms
Generated 100 characters text (actual: 100)
Generated 500 characters text (actual: 500)
========================= TTS Performance Measurements =========================
=== 100 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
Warmup #1: 2.665482541s
Warmup #2: 201.971057ms
Measurement runs:
Run #1: 194.103234ms
Run #2: 197.453552ms
Run #3: 194.264956ms
Statistics: avg=195.273914ms, min=194.103234ms, max=197.453552ms
=== 100 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
Warmup #1: 2.217781503s
Warmup #2: 172.172232ms
Measurement runs:
Run #1: 176.179134ms
Run #2: 174.38025ms
Run #3: 175.055689ms
Statistics: avg=175.205024ms, min=174.38025ms, max=176.179134ms
=== 500 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
Warmup #1: 7.649543757s
Warmup #2: 920.183518ms
Measurement runs:
Run #1: 924.850963ms
Run #2: 918.358795ms
Run #3: 927.05788ms
Statistics: avg=923.422546ms, min=918.358795ms, max=927.05788ms
=== 500 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
Warmup #1: 6.730740498s
Warmup #2: 807.633767ms
Measurement runs:
Run #1: 807.148062ms
Run #2: 805.204857ms
Run #3: 807.583434ms
Statistics: avg=806.645451ms, min=805.204857ms, max=807.583434ms変更後supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 532.448782ms
Generated 100 characters text (actual: 100)
Generated 500 characters text (actual: 500)
========================= TTS Performance Measurements =========================
=== 100 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
Warmup #1: 391.889144ms
Warmup #2: 212.378793ms
Measurement runs:
Run #1: 204.57531ms
Run #2: 205.301064ms
Run #3: 207.384449ms
Statistics: avg=205.753607ms, min=204.57531ms, max=207.384449ms
=== 100 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
Warmup #1: 224.564762ms
Warmup #2: 189.347449ms
Measurement runs:
Run #1: 189.029466ms
Run #2: 187.089337ms
Run #3: 190.250604ms
Statistics: avg=188.789802ms, min=187.089337ms, max=190.250604ms
=== 500 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
Warmup #1: 1.137926337s
Warmup #2: 958.422919ms
Measurement runs:
Run #1: 951.670034ms
Run #2: 951.175282ms
Run #3: 952.623664ms
Statistics: avg=951.822993ms, min=951.175282ms, max=952.623664ms
=== 500 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
Warmup #1: 956.735212ms
Warmup #2: 824.873811ms
Measurement runs:
Run #1: 829.676507ms
Run #2: 828.642368ms
Run #3: 832.412119ms
Statistics: avg=830.243664ms, min=828.642368ms, max=832.412119ms@Hiroshiba これ、気になるのはwarmup以降のパフォーマンスの方に影響がないかどうかですが、ちょっと怪しいものの大幅に悪影響を受けるというほどではないという感覚でした。初回に2秒かかるよりはUXは向上するかなーと思っているのですが、どうですかね? [追記] あ。divan用のベンチをやればいいか |
|
こちらの書き方と出したコードの例が悪く、一部内容が誤解されているように感じたので追記させていただきます。 少なくともこちらが試した限りでは つまり、同じスタイルでも音声合成する対象のテキストが変わった場合はWarmupと同程度の実行時間になり、同じ文章でも音声合成するスタイルが変わった場合はWarmupと同程度の実行時間になったということです。 少なくとも、毎回異なる文章を短い時間で音声合成するという私の使用目的においては毎回Warmup相当の実行時間になって問題があったので、この変更を直接適用しない場合においても、何らかの形で 以下に同じスタイルで、別のテキストを用いてループするコードと同じテキストで、別のスタイルを用いてループするコードとそれらの実行結果を添付します。変更前の結果では今まで音声合成したことのないスタイルと文字の組み合わせでWarmup相当の実行時間(3~4s程度)になっていることがわかると思います。 同じスタイルで別のテキストコード(warmup_diff_text_loop.rs)use std::time::Instant;
use voicevox_core::{
StyleId,
blocking::{Onnxruntime, OpenJtalk, Synthesizer, VoiceModelFile},
};
const VVORT: &str = "./models/voicevox_core/onnxruntime/lib/voicevox_onnxruntime_cuda.dll";
const OJT_DIC: &str = "models/voicevox_core/dict/open_jtalk_dic_utf_8-1.11";
const MODEL_0_VVM: &str = "./models/voicevox_core/models/vvms/0.vvm";
const ZUNDAMON_NORMAL: StyleId = StyleId(3);
const LOOP_TEXTS: [&str; 5] = [
"あああああ",
"いいいいい",
"ううううう",
"えええええ",
"おおおおお",
];
const INSERT_TEXTS: [&str; 3] = [
"かかかかか",
"ききききき",
"くくくくく",
];
#[inline(always)]
fn run_tts(
synth: &Synthesizer<OpenJtalk>,
text: &str,
style_id: StyleId,
) -> anyhow::Result<std::time::Duration> {
let start = Instant::now();
synth.tts(text, style_id).perform()?;
Ok(start.elapsed())
}
fn main() -> anyhow::Result<()> {
let ort = Onnxruntime::load_once().filename(VVORT).perform()?;
println!("supported providers: {:?}", ort.supported_devices());
let ojt = OpenJtalk::new(OJT_DIC)?;
let synth = Synthesizer::builder(ort)
.text_analyzer(ojt)
.acceleration_mode(voicevox_core::AccelerationMode::Auto)
.build()?;
println!("GPU mode: {}", synth.is_gpu_mode());
let load_start = Instant::now();
synth.load_voice_model(&VoiceModelFile::open(MODEL_0_VVM)?)?;
println!("Loaded {MODEL_0_VVM} in {:?}", load_start.elapsed());
println!("--- Warmup measurements ---");
let warmup_text = "ウォームアップテストです";
let duration_first = run_tts(&synth, warmup_text, ZUNDAMON_NORMAL)?;
println!(
"First TTS (style {:?}, text '{}'): {:?}",
ZUNDAMON_NORMAL, warmup_text, duration_first
);
println!("--- 1回ずつ異なるテキストでループ ---");
for text in LOOP_TEXTS {
let duration = run_tts(&synth, text, ZUNDAMON_NORMAL)?;
println!("TTS (style {:?}, text '{}'): {:?}", ZUNDAMON_NORMAL, text, duration);
}
println!("--- 3回ずつ同じテキストでループ ---");
for text in LOOP_TEXTS {
for i in 0..3 {
let duration = run_tts(&synth, text, ZUNDAMON_NORMAL)?;
println!(
"TTS iter {i} (style {:?}, text '{}'): {:?}",
ZUNDAMON_NORMAL, text, duration
);
let insert_text = INSERT_TEXTS[i % INSERT_TEXTS.len()];
let insert_duration = run_tts(&synth, insert_text, ZUNDAMON_NORMAL)?;
println!(
" Insert TTS (style {:?}, text '{}'): {:?}",
ZUNDAMON_NORMAL, insert_text, insert_duration
);
}
}
Ok(())
}変更前変更後別のスタイルで同じテキストコード(warmup_diff_style_loop.rs)use std::time::Instant;
use voicevox_core::{
StyleId,
blocking::{Onnxruntime, OpenJtalk, Synthesizer, VoiceModelFile},
};
const VVORT: &str = "./models/voicevox_core/onnxruntime/lib/voicevox_onnxruntime_cuda.dll";
const OJT_DIC: &str = "models/voicevox_core/dict/open_jtalk_dic_utf_8-1.11";
const MODEL_0_VVM: &str = "./models/voicevox_core/models/vvms/0.vvm";
// Warmup 用
const TUMUGI_NORMAL: StyleId = StyleId(8);
const METAN_STYLES: [StyleId; 4] = [
StyleId(2), // ノーマル
StyleId(0), // あまあま
StyleId(6), // ツンツン
StyleId(4), // セクシー
];
const ZUNDAMON_STYLES: [StyleId; 4] = [
StyleId(3), // ノーマル
StyleId(1), // あまあま
StyleId(7), // ツンツン
StyleId(5), // セクシー
];
const TTS_TEXT: &str = "こんにちは";
#[inline(always)]
fn run_tts(
synth: &Synthesizer<OpenJtalk>,
text: &str,
style_id: StyleId,
) -> anyhow::Result<std::time::Duration> {
let start = Instant::now();
synth.tts(text, style_id).perform()?;
Ok(start.elapsed())
}
fn main() -> anyhow::Result<()> {
let ort = Onnxruntime::load_once().filename(VVORT).perform()?;
println!("supported providers: {:?}", ort.supported_devices());
let ojt = OpenJtalk::new(OJT_DIC)?;
let synth = Synthesizer::builder(ort)
.text_analyzer(ojt)
.acceleration_mode(voicevox_core::AccelerationMode::Auto)
.build()?;
println!("GPU mode: {}", synth.is_gpu_mode());
let load_start = Instant::now();
synth.load_voice_model(&VoiceModelFile::open(MODEL_0_VVM)?)?;
println!("Loaded {MODEL_0_VVM} in {:?}", load_start.elapsed());
println!("--- Warmup measurements ---");
let duration_first = run_tts(&synth, TTS_TEXT, TUMUGI_NORMAL)?;
println!(
"First TTS (style {:?}, text '{}'): {:?}",
TUMUGI_NORMAL, TTS_TEXT, duration_first
);
println!("--- 1回ずつ異なるスタイルでループ ---");
for style in METAN_STYLES.iter() {
let duration = run_tts(&synth, TTS_TEXT, *style)?;
println!("TTS (style {:?}, text '{}'): {:?}", style, TTS_TEXT, duration);
}
println!("--- 3回ずつ同じスタイルでループ ---");
for (metan_style, zundamon_style) in METAN_STYLES.iter().zip(ZUNDAMON_STYLES.iter()) {
for i in 0..3 {
let duration = run_tts(&synth, TTS_TEXT, *metan_style)?;
println!(
"TTS iter {i} (style {:?}, text '{}'): {:?}",
metan_style, TTS_TEXT, duration
);
let duration2 = run_tts(&synth, TTS_TEXT, *zundamon_style)?;
println!(
"TTS iter {i} (style {:?}, text '{}'): {:?}",
zundamon_style, TTS_TEXT, duration2
);
}
}
Ok(())
}変更前変更後文章を書いている途中に気づいたのですが、変更前の |
|
「初回」と書いたのが悪いのですが、その認識でした。 過去のVOICEVOX COREおよびそれを使っているエンジン・エディタがどうなっているか @Hiroshiba さんと調べたのですが、ちょっと前のVOICEVOX COREは この 時系列にしたらざっとこんな感じになる認識です。
ということで「世の中のCUDA版VOICEVOX」は |
|
そういう観点から、少し早いかもしれませんが感謝を申し上げたいと思います。ありがとうございます。 |
|
一応、Defaultにした状態のbranch(perf/use-cudnn-default-algo-search)を作り、依存関係を以下のようにして今までのプログラムを実行したので、その結果を貼っておきます。 voicevox_core = { git = "https://github.com/Sanzentyo/voicevox_core.git", branch = "perf/use-cudnn-default-algo-search", features = ["load-onnxruntime"] }最初のコード100文字と500文字と1000文字warmup_diff_text_loop.rswarmup_diff_style_loop.rs |
|
うーん。 |
|
@Sanzentyo さんの環境だと、Defaultの方が全体的に少し遅いという感じでしょうか。 ちょっと念の為、 @qryxip さんの環境でも比較のために実行してみていただけないでしょうか 🙇 もし @qryxip さんの環境でも |
|
やってみました。ONNXのロードについては 100文字と500文: Defaultsupported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded /home/ryo/src/github.com/VOICEVOX/voicevox_core/main/voicevox_core/models/vvms/0.vvm in 546.981798ms
Generated 100 characters text (actual: 100)
Generated 500 characters text (actual: 500)
========================= TTS Performance Measurements =========================
=== 100 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
Warmup #1: 397.961417ms
Warmup #2: 213.350105ms
Measurement runs:
Run #1: 205.672017ms
Run #2: 206.535267ms
Run #3: 213.76016ms
Statistics: avg=208.655814ms, min=205.672017ms, max=213.76016ms
=== 100 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
Warmup #1: 221.167884ms
Warmup #2: 183.957512ms
Measurement runs:
Run #1: 184.517918ms
Run #2: 183.813775ms
Run #3: 195.737521ms
Statistics: avg=188.023071ms, min=183.813775ms, max=195.737521ms
=== 500 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
Warmup #1: 1.188565984s
Warmup #2: 956.371638ms
Measurement runs:
Run #1: 956.840772ms
Run #2: 958.321394ms
Run #3: 952.634698ms
Statistics: avg=955.932288ms, min=952.634698ms, max=958.321394ms
=== 500 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
Warmup #1: 961.164867ms
Warmup #2: 820.87154ms
Measurement runs:
Run #1: 833.621627ms
Run #2: 833.620726ms
Run #3: 833.509909ms
Statistics: avg=833.584087ms, min=833.509909ms, max=833.621627ms100文字と500文: Heuristicsupported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded /home/ryo/src/github.com/VOICEVOX/voicevox_core/main/voicevox_core/models/vvms/0.vvm in 612.318582ms
Generated 100 characters text (actual: 100)
Generated 500 characters text (actual: 500)
========================= TTS Performance Measurements =========================
=== 100 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
Warmup #1: 389.594466ms
Warmup #2: 217.259557ms
Measurement runs:
Run #1: 203.6675ms
Run #2: 205.272162ms
Run #3: 207.994949ms
Statistics: avg=205.64487ms, min=203.6675ms, max=207.994949ms
=== 100 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
Warmup #1: 226.965157ms
Warmup #2: 190.98085ms
Measurement runs:
Run #1: 183.034412ms
Run #2: 185.201133ms
Run #3: 184.832835ms
Statistics: avg=184.356126ms, min=183.034412ms, max=185.201133ms
=== 500 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
Warmup #1: 1.195461178s
Warmup #2: 954.970037ms
Measurement runs:
Run #1: 955.27728ms
Run #2: 956.443835ms
Run #3: 965.359572ms
Statistics: avg=959.026895ms, min=955.27728ms, max=965.359572ms
=== 500 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
Warmup #1: 966.647593ms
Warmup #2: 837.71334ms
Measurement runs:
Run #1: 834.051081ms
Run #2: 842.15901ms
Run #3: 841.222545ms
Statistics: avg=839.144212ms, min=834.051081ms, max=842.15901mswarmup_diff_text_loop.rs: Defaultsupported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded /home/ryo/src/github.com/VOICEVOX/voicevox_core/main/voicevox_core/models/vvms/0.vvm in 597.905297ms
--- Warmup measurements ---
First TTS (style StyleId(3), text 'ウォームアップテストです'): 192.153479ms
--- 1回ずつ異なるテキストでループ ---
TTS (style StyleId(3), text 'あああああ'): 49.706947ms
TTS (style StyleId(3), text 'いいいいい'): 52.987584ms
TTS (style StyleId(3), text 'ううううう'): 54.827696ms
TTS (style StyleId(3), text 'えええええ'): 49.540646ms
TTS (style StyleId(3), text 'おおおおお'): 45.695716ms
--- 3回ずつ同じテキストでループ ---
TTS iter 0 (style StyleId(3), text 'あああああ'): 33.826261ms
Insert TTS (style StyleId(3), text 'かかかかか'): 47.711405ms
TTS iter 1 (style StyleId(3), text 'あああああ'): 33.453677ms
Insert TTS (style StyleId(3), text 'ききききき'): 48.649975ms
TTS iter 2 (style StyleId(3), text 'あああああ'): 33.53082ms
Insert TTS (style StyleId(3), text 'くくくくく'): 47.7517ms
TTS iter 0 (style StyleId(3), text 'いいいいい'): 33.382974ms
Insert TTS (style StyleId(3), text 'かかかかか'): 39.184593ms
TTS iter 1 (style StyleId(3), text 'いいいいい'): 33.438518ms
Insert TTS (style StyleId(3), text 'ききききき'): 39.27886ms
TTS iter 2 (style StyleId(3), text 'いいいいい'): 33.694786ms
Insert TTS (style StyleId(3), text 'くくくくく'): 38.94659ms
TTS iter 0 (style StyleId(3), text 'ううううう'): 33.329254ms
Insert TTS (style StyleId(3), text 'かかかかか'): 39.563851ms
TTS iter 1 (style StyleId(3), text 'ううううう'): 40.892559ms
Insert TTS (style StyleId(3), text 'ききききき'): 33.771058ms
TTS iter 2 (style StyleId(3), text 'ううううう'): 39.207867ms
Insert TTS (style StyleId(3), text 'くくくくく'): 33.859693ms
TTS iter 0 (style StyleId(3), text 'えええええ'): 40.279135ms
Insert TTS (style StyleId(3), text 'かかかかか'): 33.45581ms
TTS iter 1 (style StyleId(3), text 'えええええ'): 40.406512ms
Insert TTS (style StyleId(3), text 'ききききき'): 37.98695ms
TTS iter 2 (style StyleId(3), text 'えええええ'): 44.603529ms
Insert TTS (style StyleId(3), text 'くくくくく'): 37.258091ms
TTS iter 0 (style StyleId(3), text 'おおおおお'): 38.415139ms
Insert TTS (style StyleId(3), text 'かかかかか'): 34.052533ms
TTS iter 1 (style StyleId(3), text 'おおおおお'): 39.366512ms
Insert TTS (style StyleId(3), text 'ききききき'): 33.846018ms
TTS iter 2 (style StyleId(3), text 'おおおおお'): 38.794046ms
Insert TTS (style StyleId(3), text 'くくくくく'): 33.360233mswarmup_diff_text_loop.rs: Heuristicsupported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded /home/ryo/src/github.com/VOICEVOX/voicevox_core/main/voicevox_core/models/vvms/0.vvm in 623.579438ms
--- Warmup measurements ---
First TTS (style StyleId(3), text 'ウォームアップテストです'): 219.118596ms
--- 1回ずつ異なるテキストでループ ---
TTS (style StyleId(3), text 'あああああ'): 57.428696ms
TTS (style StyleId(3), text 'いいいいい'): 54.66911ms
TTS (style StyleId(3), text 'ううううう'): 54.405939ms
TTS (style StyleId(3), text 'えええええ'): 56.636098ms
TTS (style StyleId(3), text 'おおおおお'): 53.740228ms
--- 3回ずつ同じテキストでループ ---
TTS iter 0 (style StyleId(3), text 'あああああ'): 44.844479ms
Insert TTS (style StyleId(3), text 'かかかかか'): 54.673078ms
TTS iter 1 (style StyleId(3), text 'あああああ'): 45.147694ms
Insert TTS (style StyleId(3), text 'ききききき'): 55.023602ms
TTS iter 2 (style StyleId(3), text 'あああああ'): 44.957409ms
Insert TTS (style StyleId(3), text 'くくくくく'): 54.311883ms
TTS iter 0 (style StyleId(3), text 'いいいいい'): 44.427862ms
Insert TTS (style StyleId(3), text 'かかかかか'): 45.435491ms
TTS iter 1 (style StyleId(3), text 'いいいいい'): 44.619439ms
Insert TTS (style StyleId(3), text 'ききききき'): 45.457301ms
TTS iter 2 (style StyleId(3), text 'いいいいい'): 44.863083ms
Insert TTS (style StyleId(3), text 'くくくくく'): 49.357885ms
TTS iter 0 (style StyleId(3), text 'ううううう'): 52.978087ms
Insert TTS (style StyleId(3), text 'かかかかか'): 45.838422ms
TTS iter 1 (style StyleId(3), text 'ううううう'): 44.985181ms
Insert TTS (style StyleId(3), text 'ききききき'): 45.550585ms
TTS iter 2 (style StyleId(3), text 'ううううう'): 45.535116ms
Insert TTS (style StyleId(3), text 'くくくくく'): 45.24756ms
TTS iter 0 (style StyleId(3), text 'えええええ'): 47.138477ms
Insert TTS (style StyleId(3), text 'かかかかか'): 45.516422ms
TTS iter 1 (style StyleId(3), text 'えええええ'): 47.586261ms
Insert TTS (style StyleId(3), text 'ききききき'): 45.756369ms
TTS iter 2 (style StyleId(3), text 'えええええ'): 47.394543ms
Insert TTS (style StyleId(3), text 'くくくくく'): 45.313323ms
TTS iter 0 (style StyleId(3), text 'おおおおお'): 44.19637ms
Insert TTS (style StyleId(3), text 'かかかかか'): 45.442033ms
TTS iter 1 (style StyleId(3), text 'おおおおお'): 44.556742ms
Insert TTS (style StyleId(3), text 'ききききき'): 45.640713ms
TTS iter 2 (style StyleId(3), text 'おおおおお'): 43.963305ms
Insert TTS (style StyleId(3), text 'くくくくく'): 44.942902mswarmup_diff_style_loop.rs: Defaultsupported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded /home/ryo/src/github.com/VOICEVOX/voicevox_core/main/voicevox_core/models/vvms/0.vvm in 613.86936ms
--- Warmup measurements ---
First TTS (style StyleId(8), text 'こんにちは'): 213.171786ms
--- 1回ずつ異なるスタイルでループ ---
TTS (style StyleId(2), text 'こんにちは'): 40.242597ms
TTS (style StyleId(0), text 'こんにちは'): 39.203169ms
TTS (style StyleId(6), text 'こんにちは'): 48.172305ms
TTS (style StyleId(4), text 'こんにちは'): 50.154562ms
--- 3回ずつ同じスタイルでループ ---
TTS iter 0 (style StyleId(2), text 'こんにちは'): 39.174495ms
TTS iter 0 (style StyleId(3), text 'こんにちは'): 48.033696ms
TTS iter 1 (style StyleId(2), text 'こんにちは'): 32.390213ms
TTS iter 1 (style StyleId(3), text 'こんにちは'): 39.125914ms
TTS iter 2 (style StyleId(2), text 'こんにちは'): 32.666759ms
TTS iter 2 (style StyleId(3), text 'こんにちは'): 39.055884ms
TTS iter 0 (style StyleId(0), text 'こんにちは'): 32.609683ms
TTS iter 0 (style StyleId(1), text 'こんにちは'): 49.029844ms
TTS iter 1 (style StyleId(0), text 'こんにちは'): 32.401654ms
TTS iter 1 (style StyleId(1), text 'こんにちは'): 39.792608ms
TTS iter 2 (style StyleId(0), text 'こんにちは'): 32.339529ms
TTS iter 2 (style StyleId(1), text 'こんにちは'): 39.925756ms
TTS iter 0 (style StyleId(6), text 'こんにちは'): 33.026349ms
TTS iter 0 (style StyleId(7), text 'こんにちは'): 49.039492ms
TTS iter 1 (style StyleId(6), text 'こんにちは'): 33.027521ms
TTS iter 1 (style StyleId(7), text 'こんにちは'): 39.039594ms
TTS iter 2 (style StyleId(6), text 'こんにちは'): 33.107621ms
TTS iter 2 (style StyleId(7), text 'こんにちは'): 43.506683ms
TTS iter 0 (style StyleId(4), text 'こんにちは'): 40.365887ms
TTS iter 0 (style StyleId(5), text 'こんにちは'): 50.126659ms
TTS iter 1 (style StyleId(4), text 'こんにちは'): 33.520141ms
TTS iter 1 (style StyleId(5), text 'こんにちは'): 39.731624ms
TTS iter 2 (style StyleId(4), text 'こんにちは'): 33.472552ms
TTS iter 2 (style StyleId(5), text 'こんにちは'): 39.628131mswarmup_diff_style_loop.rs: Heuristicsupported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded /home/ryo/src/github.com/VOICEVOX/voicevox_core/main/voicevox_core/models/vvms/0.vvm in 627.398562ms
--- Warmup measurements ---
First TTS (style StyleId(8), text 'こんにちは'): 232.219427ms
--- 1回ずつ異なるスタイルでループ ---
TTS (style StyleId(2), text 'こんにちは'): 48.262122ms
TTS (style StyleId(0), text 'こんにちは'): 47.07576ms
TTS (style StyleId(6), text 'こんにちは'): 53.475715ms
TTS (style StyleId(4), text 'こんにちは'): 55.370618ms
--- 3回ずつ同じスタイルでループ ---
TTS iter 0 (style StyleId(2), text 'こんにちは'): 43.996588ms
TTS iter 0 (style StyleId(3), text 'こんにちは'): 54.210796ms
TTS iter 1 (style StyleId(2), text 'こんにちは'): 43.981059ms
TTS iter 1 (style StyleId(3), text 'こんにちは'): 45.459696ms
TTS iter 2 (style StyleId(2), text 'こんにちは'): 43.863369ms
TTS iter 2 (style StyleId(3), text 'こんにちは'): 45.276023ms
TTS iter 0 (style StyleId(0), text 'こんにちは'): 43.726805ms
TTS iter 0 (style StyleId(1), text 'こんにちは'): 55.466367ms
TTS iter 1 (style StyleId(0), text 'こんにちは'): 43.954779ms
TTS iter 1 (style StyleId(1), text 'こんにちは'): 50.498383ms
TTS iter 2 (style StyleId(0), text 'こんにちは'): 43.924834ms
TTS iter 2 (style StyleId(1), text 'こんにちは'): 50.779306ms
TTS iter 0 (style StyleId(6), text 'こんにちは'): 49.230278ms
TTS iter 0 (style StyleId(7), text 'こんにちは'): 53.669076ms
TTS iter 1 (style StyleId(6), text 'こんにちは'): 43.633911ms
TTS iter 1 (style StyleId(7), text 'こんにちは'): 45.146843ms
TTS iter 2 (style StyleId(6), text 'こんにちは'): 44.408746ms
TTS iter 2 (style StyleId(7), text 'こんにちは'): 45.030406ms
TTS iter 0 (style StyleId(4), text 'こんにちは'): 44.974421ms
TTS iter 0 (style StyleId(5), text 'こんにちは'): 55.585008ms
TTS iter 1 (style StyleId(4), text 'こんにちは'): 45.472992ms
TTS iter 1 (style StyleId(5), text 'こんにちは'): 45.95525ms
TTS iter 2 (style StyleId(4), text 'こんにちは'): 45.149247ms
TTS iter 2 (style StyleId(5), text 'こんにちは'): 46.069284ms |
|
@qryxip Linuxで同タイミングで実行すると差がなかったんですね!! 個人的には、 @Sanzentyo さんが試してくださったWindowsの比較は今回HeuristicとDefaultで実行されたタイミングがかなり違っていて、何らかの要因で計測誤差が発生しているのかも・・・?と感じています。 |
|
@Hiroshiba 最初のコード(Default)最初のコード(Heuristic)100文字と500文字と1000文字(Default)100文字と500文字と1000文字(Heuristic)warmup_diff_text_loop(Default)warmup_diff_text_loop(Heuristic)warmup_diff_style_loop(Default)warmup_diff_style_loop(Heuristic) |
|
@Hiroshiba OSSにPR出すのが初めてで、作法があまりわかっていないのですが、 |
|
@Sanzentyo お~Defaultのが良さそうな気配を感じますね! プルリクの流れの質問もありがとうございます 🙏 |
新しいPRを出し直すかこのPRを改変するかですが、作法という観点だとどちらにするかは人によるかなと思います。前者であればPRの内容と議論内容が一致するというメリットがありますし、後者でも議論が一箇所にまとまるというメリットがあると思います。 で、今回どうするかですが、正直迷うところではありますがせっかくなので、Sanzentyoさんがご提案くださった前者のPRの出し直しをお願いできればと思います。 新しいPRのタイトルですが、こちらも迷うところではありますがcommit typeを
あと現在このPRには #1163 がリンクされていると思います。新しいPRでも#1163をリンクして頂けたらと思います。やりかたとしては、Sanzentyoさん側だと多分"manually linking a pull request to an issue using the pull request sidebar"はできないと思うので、"linking a pull request to an issue using a keyword"でリンクすることになると思います。具体的には以下の一文をdescriptionに入れればOK。 Fixes: #1163こうすることでPRがマージされた瞬間に#1163もクローズされるようになります。 |
|
@qryxip @Hiroshiba |
> - `CUDAExecutionProvider` の `cudnn_conv_algo_search`をデフォルトの > `EXHAUSTIVE (0)`から`DEFAULT(2)`へ変更する > - https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#cudnn_conv_algo_search > - CUDA EP使用時のwarmupにかかる時間を大幅に短縮する > - nbigaouette/onnxruntime-rs から pykeio/ort への移行時に > `DEFAULT (2)`から`EXHAUSTIVE (0)`に変わっていたものを元に戻す > - 詳細については、 #1162 、特に、このコメント > (#1162 (comment)) > を参照のこと Fixes: #1163 Closes: #1162
内容
CUDAExecutionProviderのcudnn_conv_algo_searchをデフォルトのEXHAUSTIVE (0)からHEURISTIC (1)へ変更するtts()のstyle_idとtextを変更した場合に推論時間が大幅に増加(初回実行時と同程度)することを防ぐ実行結果
依存関係
実行したコード
修正前
修正後