Skip to content

Conversation

@Sanzentyo
Copy link
Contributor

内容

OS: Microsoft Windows 11 Pro 10.0.26100 64 ビット
CPU: Core i7 12700
GPU: GeForce RTX 3080 Ti
CUDA Version: 12.9
Driver Version: 576.02

実行結果

依存関係
anyhow = "1.0.99"
# 修正前
voicevox_core = { git = "https://github.com/Sanzentyo/voicevox_core.git", branch = "main", features = ["load-onnxruntime"] }
# 修正後
voicevox_core = { git = "https://github.com/Sanzentyo/voicevox_core.git", branch = "perf/use-cudnn-heuristic-algo-search", features = ["load-onnxruntime"] }
実行したコード
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"; // donwloaderでdeviceをcudaに設定した時にダウンロードされるvoicevox_onnxruntime.dll をrenameしたもの
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);

#[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
    );

    let duration_same_style = run_tts(&synth, warmup_text, ZUNDAMON_NORMAL)?;
    println!("Same style/text after warmup: {:?}", duration_same_style);

    let other_text = "テキストを変更してみます";
    let duration_other_text = run_tts(&synth, other_text, ZUNDAMON_NORMAL)?;
    println!("Same style, different text: {:?}", duration_other_text);

    let duration_other_style = run_tts(&synth, warmup_text, SHIKOKU_NORMAL)?;
    println!(
        "Different style (四国めたん ノーマル): {:?}",
        duration_other_style
    );

    let duration_other_style2 = run_tts(&synth, other_text, SHIKOKU_NORMAL)?;
    println!(
        "Different style/text (四国めたん ノーマル): {:?}",
        duration_other_style2
    );

    let duration_other_style3 = run_tts(&synth, other_text, SHIKOKU_NORMAL)?;
    println!(
        "Same style/text as above (四国めたん ノーマル): {:?}",
        duration_other_style3
    );

    println!("styleを変えた後、元のstyleに戻す");
    let duration_back_to_first_style = run_tts(&synth, warmup_text, ZUNDAMON_NORMAL)?;
    println!(
        "Back to first style/text: {:?}",
        duration_back_to_first_style
    );
    let duration_back_to_first_style2 = run_tts(&synth, "あああ", ZUNDAMON_NORMAL)?;
        println!(
            "Same style, text 'あああ': {:?}",
        duration_back_to_first_style2
    );
    let duration_back_to_first_style3 = run_tts(&synth, "いいい", ZUNDAMON_NORMAL)?;
        println!(
            "Same style, text 'いいい': {:?}",
        duration_back_to_first_style3
    );

    Ok(())
}
修正前
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_probe_differ
    Updating git repository `https://github.com/Sanzentyo/voicevox_core.git`
     Locking 2 packages to latest compatible versions
      Adding voicevox_core v0.0.0 (https://github.com/Sanzentyo/voicevox_core.git?branch=main#868289d3)
      Adding voicevox_core_macros v0.0.0 (https://github.com/Sanzentyo/voicevox_core.git?branch=main#868289d3)
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 7.77s
     Running `target\release\warmup_probe_differ.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 693.5346ms
--- Warmup measurements ---
First TTS (style StyleId(3), text 'ウォームアップテストです'): 4.155918s
Same style/text after warmup: 25.6278ms
Same style, different text: 522.0348ms
Different style (四国めたん ノーマル): 3.9290173s
Different style/text (四国めたん ノーマル): 3.8996648s
Same style/text as above (四国めたん ノーマル): 18.1223ms
styleを変えた後、元のstyleに戻す
Back to first style/text: 20.8202ms
Same style, text 'あああ': 3.8551208s
Same style, text 'いいい': 3.870608s
修正後
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_probe_differ
    Updating git repository `https://github.com/Sanzentyo/voicevox_core.git`
     Locking 2 packages to latest compatible versions
      Adding voicevox_core v0.0.0 (https://github.com/Sanzentyo/voicevox_core.git?branch=perf%2Fuse-cudnn-heuristic-algo-search#5e2c9450)
      Adding voicevox_core_macros v0.0.0 (https://github.com/Sanzentyo/voicevox_core.git?branch=perf%2Fuse-cudnn-heuristic-algo-search#5e2c9450)
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 4.39s
     Running `target\release\warmup_probe_differ.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 715.0655ms
--- Warmup measurements ---
First TTS (style StyleId(3), text 'ウォームアップテストです'): 191.4152ms
Same style/text after warmup: 27.2623ms
Same style, different text: 36.141ms
Different style (四国めたん ノーマル): 29.5294ms
Different style/text (四国めたん ノーマル): 29.9159ms
Same style/text as above (四国めたん ノーマル): 23.4251ms
styleを変えた後、元のstyleに戻す
Back to first style/text: 20.375ms
Same style, text 'あああ': 28.8798ms
Same style, text 'いいい': 20.667ms

@Sanzentyo
Copy link
Contributor Author

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(())
}
修正前
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_probe_long_text
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 8.66s
     Running `target\release\warmup_probe_long_text.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 777.6897ms
Generated 100 characters text (actual: 100)
Generated 500 characters text (actual: 500)
Generated 1000 characters text (actual: 1000)

========================= TTS Performance Measurements =========================

=== 100 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 2.4709109s
  Warmup #2: 105.1676ms
Measurement runs:
  Run #1: 100.0076ms
  Run #2: 96.3762ms
  Run #3: 96.6639ms
  Statistics: avg=97.682566ms, min=96.3762ms, max=100.0076ms

=== 100 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 1.6718435s
  Warmup #2: 90.6141ms
Measurement runs:
  Run #1: 88.6492ms
  Run #2: 90.7449ms
  Run #3: 87.1251ms
  Statistics: avg=88.839733ms, min=87.1251ms, max=90.7449ms

=== 500 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 7.8102807s
  Warmup #2: 467.2963ms
Measurement runs:
  Run #1: 467.3924ms
  Run #2: 457.6454ms
  Run #3: 459.1288ms
  Statistics: avg=461.388866ms, min=457.6454ms, max=467.3924ms

=== 500 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 6.8097159s
  Warmup #2: 404.5639ms
Measurement runs:
  Run #1: 403.6612ms
  Run #2: 405.6321ms
  Run #3: 401.1147ms
  Statistics: avg=403.469333ms, min=401.1147ms, max=405.6321ms

=== 1000 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 40.6802869s
  Warmup #2: 20.2475361s
Measurement runs:
  Run #1: 20.968574s
  Run #2: 20.9305106s
  Run #3: 20.2200196s
  Statistics: avg=20.706368066s, min=20.2200196s, max=20.968574s

=== 1000 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 6.1899549s
  Warmup #2: 2.8992669s
Measurement runs:
  Run #1: 3.0520733s
  Run #2: 3.23436s
  Run #3: 2.9220219s
  Statistics: avg=3.069485066s, min=2.9220219s, max=3.23436s
修正後
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_probe_long_text
    Updating git repository `https://github.com/Sanzentyo/voicevox_core.git`
     Locking 2 packages to latest compatible versions
      Adding voicevox_core v0.0.0 (https://github.com/Sanzentyo/voicevox_core.git?branch=perf%2Fuse-cudnn-heuristic-algo-search#5e2c9450)
      Adding voicevox_core_macros v0.0.0 (https://github.com/Sanzentyo/voicevox_core.git?branch=perf%2Fuse-cudnn-heuristic-algo-search#5e2c9450)
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 8.85s
     Running `target\release\warmup_probe_long_text.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 669.1692ms
Generated 100 characters text (actual: 100)
Generated 500 characters text (actual: 500)
Generated 1000 characters text (actual: 1000)

========================= TTS Performance Measurements =========================

=== 100 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 343.5427ms
  Warmup #2: 106.7114ms
Measurement runs:
  Run #1: 104.3426ms
  Run #2: 100.4765ms
  Run #3: 102.988ms
  Statistics: avg=102.602366ms, min=100.4765ms, max=104.3426ms

=== 100 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 116.7136ms
  Warmup #2: 89.4673ms
Measurement runs:
  Run #1: 89.6337ms
  Run #2: 90.4203ms
  Run #3: 91.6291ms
  Statistics: avg=90.561033ms, min=89.6337ms, max=91.6291ms

=== 500 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 663.6874ms
  Warmup #2: 474.2499ms
Measurement runs:
  Run #1: 476.5048ms
  Run #2: 478.7982ms
  Run #3: 478.0051ms
  Statistics: avg=477.769366ms, min=476.5048ms, max=478.7982ms

=== 500 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 488.3704ms
  Warmup #2: 408.9493ms
Measurement runs:
  Run #1: 415.2329ms
  Run #2: 426.0133ms
  Run #3: 414.7592ms
  Statistics: avg=418.668466ms, min=414.7592ms, max=426.0133ms

=== 1000 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 18.919545s
  Warmup #2: 15.8057463s
Measurement runs:
  Run #1: 15.8135957s
  Run #2: 15.9452193s
  Run #3: 16.6362529s
  Statistics: avg=16.1316893s, min=15.8135957s, max=16.6362529s

=== 1000 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 2.4792527s
  Warmup #2: 2.4141034s
Measurement runs:
  Run #1: 2.3804472s
  Run #2: 2.388611s
  Run #3: 2.5739707s
  Statistics: avg=2.4476763s, min=2.3804472s, max=2.5739707s

@Sanzentyo Sanzentyo marked this pull request as ready for review September 28, 2025 08:38
@codspeed-hq
Copy link

codspeed-hq bot commented Sep 28, 2025

CodSpeed Performance Report

Merging #1162 will not alter performance

Comparing Sanzentyo:perf/use-cudnn-heuristic-algo-search (5e2c945) with main (868289d)

⚠️ Unknown Walltime execution environment detected

Using the Walltime instrument on standard Hosted Runners will lead to inconsistent data.

For the most accurate results, we recommend using CodSpeed Macro Runners: bare-metal machines fine-tuned for performance measurement consistency.

Summary

✅ 16 untouched
⏩ 8 skipped1

Footnotes

  1. 8 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@Hiroshiba Hiroshiba requested review from Copilot and qryxip September 28, 2025 14:59
Copy link
Contributor

Copilot AI left a 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.

Comment on lines +50 to +54
let cuda = CUDAExecutionProvider::default()
.with_conv_algorithm_search(
ort::CUDAExecutionProviderCuDNNConvAlgoSearch::Heuristic,
)
.is_available()?;
Copy link

Copilot AI Sep 28, 2025

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.

Copilot uses AI. Check for mistakes.
@qryxip
Copy link
Member

qryxip commented Sep 28, 2025

私のLinux機でも試してみました。

OS: Arch Linux (x86_64, 6.12.47-1-lts)
CPU: AMD Ryzen 7 5800H with Radeon Graphics (16) @ 4.463GHz
GPU: NVIDIA GeForce RTX 3070 Mobile / Max-Q
CUDA Version: 忘れた
変更前
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用のベンチをやればいいか

@Sanzentyo
Copy link
Contributor Author

こちらの書き方と出したコードの例が悪く、一部内容が誤解されているように感じたので追記させていただきます。

少なくともこちらが試した限りではsynth.tts(text, style_id).perform()? の書き方では、過去に実行したことのない textstyle_idの組み合わせを与えると、Warmup時と同程度の長い実行時間を要しました。(声の高さなどを変更した場合については試していないので不明)

つまり、同じスタイルでも音声合成する対象のテキストが変わった場合はWarmupと同程度の実行時間になり、同じ文章でも音声合成するスタイルが変わった場合はWarmupと同程度の実行時間になったということです。

少なくとも、毎回異なる文章を短い時間で音声合成するという私の使用目的においては毎回Warmup相当の実行時間になって問題があったので、この変更を直接適用しない場合においても、何らかの形でcudnn_conv_algo_searchを変更できる機能の追加などを検討していただきたいです。

以下に同じスタイルで、別のテキストを用いてループするコードと同じテキストで、別のスタイルを用いてループするコードとそれらの実行結果を添付します。変更前の結果では今まで音声合成したことのないスタイルと文字の組み合わせで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(())
}
変更前
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_diff_text_loop
    Updating git repository `https://github.com/Sanzentyo/voicevox_core.git`
     Locking 2 packages to latest compatible versions
      Adding voicevox_core v0.0.0 (https://github.com/Sanzentyo/voicevox_core.git?branch=main#868289d3)
      Adding voicevox_core_macros v0.0.0 (https://github.com/Sanzentyo/voicevox_core.git?branch=main#868289d3)
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 4.57s
     Running `target\release\warmup_diff_text_loop.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 726.7811ms
--- Warmup measurements ---
First TTS (style StyleId(3), text 'ウォームアップテストです'): 4.0491152s
--- 1回ずつ異なるテキストでループ ---
TTS (style StyleId(3), text 'あああああ'): 3.786991s
TTS (style StyleId(3), text 'いいいいい'): 3.7759613s
TTS (style StyleId(3), text 'ううううう'): 3.7699045s
TTS (style StyleId(3), text 'えええええ'): 3.8216741s
TTS (style StyleId(3), text 'おおおおお'): 3.7857674s
--- 3回ずつ同じテキストでループ ---
TTS iter 0 (style StyleId(3), text 'あああああ'): 16.7067ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 3.8041107s
TTS iter 1 (style StyleId(3), text 'あああああ'): 15.3673ms
  Insert TTS (style StyleId(3), text 'ききききき'): 3.7996387s
TTS iter 2 (style StyleId(3), text 'あああああ'): 17.4171ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 3.7724355s
TTS iter 0 (style StyleId(3), text 'いいいいい'): 14.6336ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 17.465ms
TTS iter 1 (style StyleId(3), text 'いいいいい'): 15.3689ms
  Insert TTS (style StyleId(3), text 'ききききき'): 18.4587ms
TTS iter 2 (style StyleId(3), text 'いいいいい'): 18.4667ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 17.446ms
TTS iter 0 (style StyleId(3), text 'ううううう'): 16.6736ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 17.2754ms
TTS iter 1 (style StyleId(3), text 'ううううう'): 18.9598ms
  Insert TTS (style StyleId(3), text 'ききききき'): 17.4916ms
TTS iter 2 (style StyleId(3), text 'ううううう'): 20.506ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 18.748ms
TTS iter 0 (style StyleId(3), text 'えええええ'): 20.3182ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 20.6056ms
TTS iter 1 (style StyleId(3), text 'えええええ'): 18.5328ms
  Insert TTS (style StyleId(3), text 'ききききき'): 18.5016ms
TTS iter 2 (style StyleId(3), text 'えええええ'): 18.8373ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 20.3386ms
TTS iter 0 (style StyleId(3), text 'おおおおお'): 17.7582ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 16.1077ms
TTS iter 1 (style StyleId(3), text 'おおおおお'): 17.0408ms
  Insert TTS (style StyleId(3), text 'ききききき'): 17.2263ms
TTS iter 2 (style StyleId(3), text 'おおおおお'): 15.7087ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 15.826ms
変更後
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_diff_text_loop
    Updating git repository `https://github.com/Sanzentyo/voicevox_core.git`
     Locking 2 packages to latest compatible versions
      Adding voicevox_core v0.0.0 (https://github.com/Sanzentyo/voicevox_core.git?branch=perf%2Fuse-cudnn-heuristic-algo-search#5e2c9450)
      Adding voicevox_core_macros v0.0.0 (https://github.com/Sanzentyo/voicevox_core.git?branch=perf%2Fuse-cudnn-heuristic-algo-search#5e2c9450)
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 8.21s
     Running `target\release\warmup_diff_text_loop.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 741.9559ms
--- Warmup measurements ---
First TTS (style StyleId(3), text 'ウォームアップテストです'): 215.4436ms
--- 1回ずつ異なるテキストでループ ---
TTS (style StyleId(3), text 'あああああ'): 24.3893ms
TTS (style StyleId(3), text 'いいいいい'): 31.6048ms
TTS (style StyleId(3), text 'ううううう'): 28.0976ms
TTS (style StyleId(3), text 'えええええ'): 26.684ms
TTS (style StyleId(3), text 'おおおおお'): 24.8016ms
--- 3回ずつ同じテキストでループ ---
TTS iter 0 (style StyleId(3), text 'あああああ'): 19.2512ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 22.1433ms
TTS iter 1 (style StyleId(3), text 'あああああ'): 16.4891ms
  Insert TTS (style StyleId(3), text 'ききききき'): 22.4209ms
TTS iter 2 (style StyleId(3), text 'あああああ'): 17.3235ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 21.6089ms
TTS iter 0 (style StyleId(3), text 'いいいいい'): 17.1009ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 17.1088ms
TTS iter 1 (style StyleId(3), text 'いいいいい'): 17.5105ms
  Insert TTS (style StyleId(3), text 'ききききき'): 21.1627ms
TTS iter 2 (style StyleId(3), text 'いいいいい'): 17.8494ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 17.4092ms
TTS iter 0 (style StyleId(3), text 'ううううう'): 17.1202ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 19.2556ms
TTS iter 1 (style StyleId(3), text 'ううううう'): 18.7724ms
  Insert TTS (style StyleId(3), text 'ききききき'): 25.0377ms
TTS iter 2 (style StyleId(3), text 'ううううう'): 18.2324ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 20.4556ms
TTS iter 0 (style StyleId(3), text 'えええええ'): 18.933ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 17.301ms
TTS iter 1 (style StyleId(3), text 'えええええ'): 19.6518ms
  Insert TTS (style StyleId(3), text 'ききききき'): 16.625ms
TTS iter 2 (style StyleId(3), text 'えええええ'): 18.1929ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 21.9809ms
TTS iter 0 (style StyleId(3), text 'おおおおお'): 16.7327ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 17.3025ms
TTS iter 1 (style StyleId(3), text 'おおおおお'): 17.4188ms
  Insert TTS (style StyleId(3), text 'ききききき'): 17.3174ms
TTS iter 2 (style StyleId(3), text 'おおおおお'): 16.7487ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 16.8231ms

別のスタイルで同じテキスト

コード(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(())
}
変更前
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_diff_style_loop
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 8.94s
     Running `target\release\warmup_diff_style_loop.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 780.7257ms
--- Warmup measurements ---
First TTS (style StyleId(8), text 'こんにちは'): 4.4553883s
--- 1回ずつ異なるスタイルでループ ---
TTS (style StyleId(2), text 'こんにちは'): 18.2374ms
TTS (style StyleId(0), text 'こんにちは'): 15.35ms
TTS (style StyleId(6), text 'こんにちは'): 3.8797764s
TTS (style StyleId(4), text 'こんにちは'): 3.8590532s
--- 3回ずつ同じスタイルでループ ---
TTS iter 0 (style StyleId(2), text 'こんにちは'): 13.6031ms
TTS iter 0 (style StyleId(3), text 'こんにちは'): 3.8357767s
TTS iter 1 (style StyleId(2), text 'こんにちは'): 15.2326ms
TTS iter 1 (style StyleId(3), text 'こんにちは'): 15.9365ms
TTS iter 2 (style StyleId(2), text 'こんにちは'): 15.8564ms
TTS iter 2 (style StyleId(3), text 'こんにちは'): 17.4948ms
TTS iter 0 (style StyleId(0), text 'こんにちは'): 18.7591ms
TTS iter 0 (style StyleId(1), text 'こんにちは'): 3.9153946s
TTS iter 1 (style StyleId(0), text 'こんにちは'): 13.8346ms
TTS iter 1 (style StyleId(1), text 'こんにちは'): 24.0975ms
TTS iter 2 (style StyleId(0), text 'こんにちは'): 19.3966ms
TTS iter 2 (style StyleId(1), text 'こんにちは'): 16.2908ms
TTS iter 0 (style StyleId(6), text 'こんにちは'): 23.317ms
TTS iter 0 (style StyleId(7), text 'こんにちは'): 3.9859572s
TTS iter 1 (style StyleId(6), text 'こんにちは'): 14.1441ms
TTS iter 1 (style StyleId(7), text 'こんにちは'): 20.7458ms
TTS iter 2 (style StyleId(6), text 'こんにちは'): 18.5065ms
TTS iter 2 (style StyleId(7), text 'こんにちは'): 17.3572ms
TTS iter 0 (style StyleId(4), text 'こんにちは'): 16.2415ms
TTS iter 0 (style StyleId(5), text 'こんにちは'): 3.9888492s
TTS iter 1 (style StyleId(4), text 'こんにちは'): 15.2475ms
TTS iter 1 (style StyleId(5), text 'こんにちは'): 23.2887ms
TTS iter 2 (style StyleId(4), text 'こんにちは'): 17.5205ms
TTS iter 2 (style StyleId(5), text 'こんにちは'): 18.4244ms
変更後
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_diff_style_loop
    Updating git repository `https://github.com/Sanzentyo/voicevox_core.git`
     Locking 2 packages to latest compatible versions
      Adding voicevox_core v0.0.0 (https://github.com/Sanzentyo/voicevox_core.git?branch=perf%2Fuse-cudnn-heuristic-algo-search#5e2c9450)
      Adding voicevox_core_macros v0.0.0 (https://github.com/Sanzentyo/voicevox_core.git?branch=perf%2Fuse-cudnn-heuristic-algo-search#5e2c9450)
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 8.37s
     Running `target\release\warmup_diff_style_loop.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 717.1213ms
--- Warmup measurements ---
First TTS (style StyleId(8), text 'こんにちは'): 203.988ms
--- 1回ずつ異なるスタイルでループ ---
TTS (style StyleId(2), text 'こんにちは'): 24.3425ms
TTS (style StyleId(0), text 'こんにちは'): 16.8444ms
TTS (style StyleId(6), text 'こんにちは'): 26.6288ms
TTS (style StyleId(4), text 'こんにちは'): 24.1177ms
--- 3回ずつ同じスタイルでループ ---
TTS iter 0 (style StyleId(2), text 'こんにちは'): 21.5729ms
TTS iter 0 (style StyleId(3), text 'こんにちは'): 26.1374ms
TTS iter 1 (style StyleId(2), text 'こんにちは'): 16.3359ms
TTS iter 1 (style StyleId(3), text 'こんにちは'): 17.3413ms
TTS iter 2 (style StyleId(2), text 'こんにちは'): 19.4049ms
TTS iter 2 (style StyleId(3), text 'こんにちは'): 19.5422ms
TTS iter 0 (style StyleId(0), text 'こんにちは'): 17.182ms
TTS iter 0 (style StyleId(1), text 'こんにちは'): 30.2159ms
TTS iter 1 (style StyleId(0), text 'こんにちは'): 15.5657ms
TTS iter 1 (style StyleId(1), text 'こんにちは'): 23.3985ms
TTS iter 2 (style StyleId(0), text 'こんにちは'): 17.8721ms
TTS iter 2 (style StyleId(1), text 'こんにちは'): 17.1084ms
TTS iter 0 (style StyleId(6), text 'こんにちは'): 16.6336ms
TTS iter 0 (style StyleId(7), text 'こんにちは'): 21.5957ms
TTS iter 1 (style StyleId(6), text 'こんにちは'): 20.5359ms
TTS iter 1 (style StyleId(7), text 'こんにちは'): 16.3573ms
TTS iter 2 (style StyleId(6), text 'こんにちは'): 16.6051ms
TTS iter 2 (style StyleId(7), text 'こんにちは'): 17.5059ms
TTS iter 0 (style StyleId(4), text 'こんにちは'): 18.3396ms
TTS iter 0 (style StyleId(5), text 'こんにちは'): 23.6875ms
TTS iter 1 (style StyleId(4), text 'こんにちは'): 18.1294ms
TTS iter 1 (style StyleId(5), text 'こんにちは'): 17.8005ms
TTS iter 2 (style StyleId(4), text 'こんにちは'): 16.7922ms
TTS iter 2 (style StyleId(5), text 'こんにちは'): 22.3454ms

文章を書いている途中に気づいたのですが、変更前のwarmup_diff_style_loop.rsの実行結果で、最初のStyleId(2)とStyleId(0)についてはその時点で初めてのtextstyle_idの組み合わせであるのに、以下のようにWarmup後相当の推論時間になっていました。複数回実行してみましたが、同様の結果になりました。それ以外の部分については、初めての組み合わせであれば、Warmup相当の推論時間(3~4s程度)がかかっていました。StyleIdの0と2と8が畳み込み層の形状的に似通っているのかもしれません。

TTS (style StyleId(2), text 'こんにちは'): 18.2374ms
TTS (style StyleId(0), text 'こんにちは'): 15.35ms

@qryxip
Copy link
Member

qryxip commented Sep 28, 2025

「初回」と書いたのが悪いのですが、その認識でした。


過去のVOICEVOX COREおよびそれを使っているエンジン・エディタがどうなっているか @Hiroshiba さんと調べたのですが、ちょっと前のVOICEVOX COREはExhaustive=0でもHeuristic=1でもなくDefault=2で動いていることがわかりました。現行のVOICEVOX ENGINEの最新版はまだVOICEVOX CORE v0.14/0.15ベースなので、世の「CUDA版VOICEVOX」はまだDefault=2で動いていると思います。

このDefault=2は、nbigaouette/onnxruntime-rsのフォークであるVOICEVOX/onnxruntimeで設定されたものですが (VOICEVOX/onnxruntime-rs@85e42e6)、#725 でpykeio/ortに移行する際に見落していたようです。オリジナルのnbigaouette/onnxruntime-rsではOrtCudnnConvAlgoSearchの設定自体無かったので、意識の範囲外だった。

時系列にしたらざっとこんな感じになる認識です。

  1. (詳しく調査していない): VOICEVOX COREがC++製だった頃、CUDA実行は多分Exhaustive=0で動いていた
  2. 2023-01-31: C++からRustになり、ついでにExhaustive=0Default=2になったVOICEVOX CORE v0.14.0がリリース。同日VOICEVOX ENGINE v0.14.0およびVOICEVOXエディタ v0.14.0がリリース
  3. 2025-03-01: #725が入ってExhaustiveになっちゃったVOICEVOX CORE v0.16.0-preview.0がリリース
  4. 2025-08-16: ExhaustiveになっちゃったCORE v0.16を使うPRがENGINEにマージ。現在まだENGINEのリリースはされていないが、特に問題が無ければそのままリリースされる…予定だった

ということで「世の中のCUDA版VOICEVOX」はDefault=2で動いているということなので、そっちが従来ということでDefaultとの比較検討もした方がよさそう?今日はもう夜遅いので私は後からやろうかなと思ってます。

@qryxip
Copy link
Member

qryxip commented Sep 28, 2025

Defaultに戻すかHeuristicにするかはさておき、Exhaustiveになっちゃってたのは盛大なリグレッションに他ならないと思います。このプルリクエストが無ければ気付くのが遅れたと思います。

そういう観点から、少し早いかもしれませんが感謝を申し上げたいと思います。ありがとうございます。
@Sanzentyo

@Sanzentyo
Copy link
Contributor Author

一応、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"] }
最初のコード
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_probe_differ   
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 4.93s
     Running `target\release\warmup_probe_differ.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 730.8253ms
--- Warmup measurements ---
First TTS (style StyleId(3), text 'ウォームアップテストです'): 218.0282ms
Same style/text after warmup: 27.5647ms
Same style, different text: 39.3497ms
Different style (四国めたん ノーマル): 29.111ms
Different style/text (四国めたん ノーマル): 29.203ms
Same style/text as above (四国めたん ノーマル): 21.695ms
styleを変えた後、元のstyleに戻す
Back to first style/text: 19.1476ms
Same style, text 'あああ': 29.7961ms
Same style, text 'いいい': 23.3325ms
100文字と500文字と1000文字
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_probe_long_text
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 13.15s
     Running `target\release\warmup_probe_long_text.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 793.6402ms
Generated 100 characters text (actual: 100)
Generated 500 characters text (actual: 500)
Generated 1000 characters text (actual: 1000)

========================= TTS Performance Measurements =========================

=== 100 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 690.8209ms
  Warmup #2: 99.9629ms
Measurement runs:
  Run #1: 102.5513ms
  Run #2: 101.8011ms
  Run #3: 101.2466ms
  Statistics: avg=101.866333ms, min=101.2466ms, max=102.5513ms

=== 100 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 110.9648ms
  Warmup #2: 93.1852ms
Measurement runs:
  Run #1: 96.2752ms
  Run #2: 93.9098ms
  Run #3: 92.4269ms
  Statistics: avg=94.203966ms, min=92.4269ms, max=96.2752ms

=== 500 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 692.2702ms
  Warmup #2: 484.6962ms
Measurement runs:
  Run #1: 489.5558ms
  Run #2: 480.0429ms
  Run #3: 476.5648ms
  Statistics: avg=482.0545ms, min=476.5648ms, max=489.5558ms

=== 500 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 481.908ms
  Warmup #2: 427.2713ms
Measurement runs:
  Run #1: 416.5697ms
  Run #2: 431.3334ms
  Run #3: 420.6402ms
  Statistics: avg=422.847766ms, min=416.5697ms, max=431.3334ms

=== 1000 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 31.3496061s
  Warmup #2: 17.616013s
Measurement runs:
  Run #1: 17.5999696s
  Run #2: 18.426671s
  Run #3: 17.9287521s
  Statistics: avg=17.9851309s, min=17.5999696s, max=18.426671s

=== 1000 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 3.1391636s
  Warmup #2: 3.0543163s
Measurement runs:
  Run #1: 2.9423698s
  Run #2: 2.9648804s
  Run #3: 2.9631406s
  Statistics: avg=2.956796933s, min=2.9423698s, max=2.9648804s
warmup_diff_text_loop.rs
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_diff_text_loop
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 4.35s
     Running `target\release\warmup_diff_text_loop.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 772.8236ms
--- Warmup measurements ---
First TTS (style StyleId(3), text 'ウォームアップテストです'): 202.7301ms
--- 1回ずつ異なるテキストでループ ---
TTS (style StyleId(3), text 'あああああ'): 31.1464ms
TTS (style StyleId(3), text 'いいいいい'): 26.6643ms
TTS (style StyleId(3), text 'ううううう'): 36.5988ms
TTS (style StyleId(3), text 'えええええ'): 32.2086ms
TTS (style StyleId(3), text 'おおおおお'): 27.1387ms
--- 3回ずつ同じテキストでループ ---
TTS iter 0 (style StyleId(3), text 'あああああ'): 16.3389ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 27.2629ms
TTS iter 1 (style StyleId(3), text 'あああああ'): 17.6804ms
  Insert TTS (style StyleId(3), text 'ききききき'): 30.5943ms
TTS iter 2 (style StyleId(3), text 'あああああ'): 18.685ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 25.7343ms
TTS iter 0 (style StyleId(3), text 'いいいいい'): 17.8592ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 16.8002ms
TTS iter 1 (style StyleId(3), text 'いいいいい'): 20.6386ms
  Insert TTS (style StyleId(3), text 'ききききき'): 18.6965ms
TTS iter 2 (style StyleId(3), text 'いいいいい'): 16.7996ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 22.4754ms
TTS iter 0 (style StyleId(3), text 'ううううう'): 22.7376ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 19.2632ms
TTS iter 1 (style StyleId(3), text 'ううううう'): 16.8144ms
  Insert TTS (style StyleId(3), text 'ききききき'): 18.6313ms
TTS iter 2 (style StyleId(3), text 'ううううう'): 16.4239ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 17.099ms
TTS iter 0 (style StyleId(3), text 'えええええ'): 18.5215ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 17.6801ms
TTS iter 1 (style StyleId(3), text 'えええええ'): 20.5018ms
  Insert TTS (style StyleId(3), text 'ききききき'): 18.1314ms
TTS iter 2 (style StyleId(3), text 'えええええ'): 27.0013ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 20.1786ms
TTS iter 0 (style StyleId(3), text 'おおおおお'): 20.3465ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 17.8797ms
TTS iter 1 (style StyleId(3), text 'おおおおお'): 19.8756ms
  Insert TTS (style StyleId(3), text 'ききききき'): 21.8751ms
TTS iter 2 (style StyleId(3), text 'おおおおお'): 20.7722ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 18.2446ms
warmup_diff_style_loop.rs
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_diff_style_loop
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 4.44s
     Running `target\release\warmup_diff_style_loop.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 695.9349ms
--- Warmup measurements ---
First TTS (style StyleId(8), text 'こんにちは'): 236.0251ms
--- 1回ずつ異なるスタイルでループ ---
TTS (style StyleId(2), text 'こんにちは'): 20.2191ms
TTS (style StyleId(0), text 'こんにちは'): 17.1849ms
TTS (style StyleId(6), text 'こんにちは'): 29.5609ms
TTS (style StyleId(4), text 'こんにちは'): 31.799ms
--- 3回ずつ同じスタイルでループ ---
TTS iter 0 (style StyleId(2), text 'こんにちは'): 16.6786ms
TTS iter 0 (style StyleId(3), text 'こんにちは'): 26.6254ms
TTS iter 1 (style StyleId(2), text 'こんにちは'): 17.4076ms
TTS iter 1 (style StyleId(3), text 'こんにちは'): 18.2115ms
TTS iter 2 (style StyleId(2), text 'こんにちは'): 17.0897ms
TTS iter 2 (style StyleId(3), text 'こんにちは'): 18.3546ms
TTS iter 0 (style StyleId(0), text 'こんにちは'): 18.5567ms
TTS iter 0 (style StyleId(1), text 'こんにちは'): 33.7438ms
TTS iter 1 (style StyleId(0), text 'こんにちは'): 16.3132ms
TTS iter 1 (style StyleId(1), text 'こんにちは'): 27.0398ms
TTS iter 2 (style StyleId(0), text 'こんにちは'): 18.5144ms
TTS iter 2 (style StyleId(1), text 'こんにちは'): 17.1161ms
TTS iter 0 (style StyleId(6), text 'こんにちは'): 20.5949ms
TTS iter 0 (style StyleId(7), text 'こんにちは'): 28.7161ms
TTS iter 1 (style StyleId(6), text 'こんにちは'): 16.4116ms
TTS iter 1 (style StyleId(7), text 'こんにちは'): 16.4956ms
TTS iter 2 (style StyleId(6), text 'こんにちは'): 21.883ms
TTS iter 2 (style StyleId(7), text 'こんにちは'): 20.4169ms
TTS iter 0 (style StyleId(4), text 'こんにちは'): 17.6741ms
TTS iter 0 (style StyleId(5), text 'こんにちは'): 26.1286ms
TTS iter 1 (style StyleId(4), text 'こんにちは'): 18.9535ms
TTS iter 1 (style StyleId(5), text 'こんにちは'): 18.462ms
TTS iter 2 (style StyleId(4), text 'こんにちは'): 16.3933ms
TTS iter 2 (style StyleId(5), text 'こんにちは'): 16.8673ms

@qryxip
Copy link
Member

qryxip commented Sep 30, 2025

うーん。Defaultに戻すかHeuristicにしちゃうべきなのかは悩むところではありますね。
@Hiroshiba どうしましょうか?

@Hiroshiba
Copy link
Member

Hiroshiba commented Oct 1, 2025

@Sanzentyo さんの環境だと、Defaultの方が全体的に少し遅いという感じでしょうか。
ちょっと予想外でした。Defaultのが最適化が短くなって早くなりそうだなと思っていたので。

ちょっと念の為、 @qryxip さんの環境でも比較のために実行してみていただけないでしょうか 🙇
100文字と500文字と1000文字の結果があれば比較しやすいのかなと思っています。
(もし可能なら実行環境の微妙な差異を減らしてなるべく条件を揃えるために、もう一度Heuristicも測定いただけると正確性が上がって助かります!! 🙇 バックグラウンドで動いてるものが違ってたりしうるので・・・)

もし @qryxip さんの環境でもHeuristicの方が早そうなら、Heuristicが良いのかなと思いました!!

@qryxip
Copy link
Member

qryxip commented Oct 2, 2025

やってみました。ONNXのロードについてはDefaultの方が明らかに若干速そうでした。ただどちらが良いのかは正直私には判断しにくいです。

100文字と500文: Default
supported 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.621627ms
100文字と500文: Heuristic
supported 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.15901ms
warmup_diff_text_loop.rs: Default
supported 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.360233ms
warmup_diff_text_loop.rs: Heuristic
supported 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.942902ms
warmup_diff_style_loop.rs: Default
supported 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.628131ms
warmup_diff_style_loop.rs: Heuristic
supported 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

@Hiroshiba
Copy link
Member

@qryxip Linuxで同タイミングで実行すると差がなかったんですね!!

個人的には、 @Sanzentyo さんが試してくださったWindowsの比較は今回HeuristicとDefaultで実行されたタイミングがかなり違っていて、何らかの要因で計測誤差が発生しているのかも・・・?と感じています。
なので仮にHeuristicに変更する場合は、念の為もう一度計測していただきたいなと感じました 🙇

@Sanzentyo
Copy link
Contributor Author

Sanzentyo commented Oct 2, 2025

@Hiroshiba
先ほど、連続してコードを実行してみました。初回の実行については、Defaultの方が明確に早いように感じました。それ以外についても、Heuristicの方が明確に高速な場面がなさそうなのと、推論時間の安定性についてもDefaultの方が高かったので、Defaultの方がいいのではないかと思いました。

最初のコード(Default)
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_probe_differ   
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 4.00s
     Running `target\release\warmup_probe_differ.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 663.0961ms
--- Warmup measurements ---
First TTS (style StyleId(3), text 'ウォームアップテストです'): 186.5344ms
Same style/text after warmup: 23.3293ms
Same style, different text: 32.5551ms
Different style (四国めたん ノーマル): 29.8164ms
Different style/text (四国めたん ノーマル): 28.86ms
Same style/text as above (四国めたん ノーマル): 21.0324ms
styleを変えた後、元のstyleに戻す
Back to first style/text: 19.8413ms
Same style, text 'あああ': 27.212ms
Same style, text 'いいい': 26.0796ms
最初のコード(Heuristic)
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_probe_differ  
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 4.14s
     Running `target\release\warmup_probe_differ.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 648.8205ms
--- Warmup measurements ---
First TTS (style StyleId(3), text 'ウォームアップテストです'): 185.7124ms
Same style/text after warmup: 26.6926ms
Same style, different text: 49.5122ms
Different style (四国めたん ノーマル): 25.4969ms
Different style/text (四国めたん ノーマル): 28.1117ms
Same style/text as above (四国めたん ノーマル): 23.073ms
styleを変えた後、元のstyleに戻す
Back to first style/text: 20.8792ms
Same style, text 'あああ': 20.5311ms
Same style, text 'いいい': 20.9904ms
100文字と500文字と1000文字(Default)
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_probe_long_text
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 4.27s
     Running `target\release\warmup_probe_long_text.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 653.9839ms
Generated 100 characters text (actual: 100)
Generated 500 characters text (actual: 500)
Generated 1000 characters text (actual: 1000)

========================= TTS Performance Measurements =========================

=== 100 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 357.0665ms
  Warmup #2: 98.2632ms
Measurement runs:
  Run #1: 100.824ms
  Run #2: 99.0439ms
  Run #3: 98.2121ms
  Statistics: avg=99.36ms, min=98.2121ms, max=100.824ms

=== 100 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 118.6912ms
  Warmup #2: 94.0394ms
Measurement runs:
  Run #1: 92.3286ms
  Run #2: 117.4214ms
  Run #3: 99.2504ms
  Statistics: avg=103.000133ms, min=92.3286ms, max=117.4214ms

=== 500 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 665.9546ms
  Warmup #2: 476.8493ms
Measurement runs:
  Run #1: 477.6102ms
  Run #2: 482.3814ms
  Run #3: 471.8795ms
  Statistics: avg=477.290366ms, min=471.8795ms, max=482.3814ms

=== 500 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 477.9166ms
  Warmup #2: 412.8877ms
Measurement runs:
  Run #1: 419.9784ms
  Run #2: 409.0901ms
  Run #3: 419.4262ms
  Statistics: avg=416.1649ms, min=409.0901ms, max=419.9784ms

=== 1000 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 11.872807s
  Warmup #2: 11.668192s
Measurement runs:
  Run #1: 11.6616188s
  Run #2: 10.6488569s
  Run #3: 10.1910277s
  Statistics: avg=10.833834466s, min=10.1910277s, max=11.6616188s

=== 1000 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 2.0060265s
  Warmup #2: 1.7697946s
Measurement runs:
  Run #1: 1.639479s
  Run #2: 1.6427161s
  Run #3: 1.5793345s
  Statistics: avg=1.620509866s, min=1.5793345s, max=1.6427161s
100文字と500文字と1000文字(Heuristic)
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_probe_long_text
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 4.46s
     Running `target\release\warmup_probe_long_text.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 714.9044ms
Generated 100 characters text (actual: 100)
Generated 500 characters text (actual: 500)
Generated 1000 characters text (actual: 1000)

========================= TTS Performance Measurements =========================

=== 100 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 350.893ms
  Warmup #2: 110.8582ms
Measurement runs:
  Run #1: 104.8168ms
  Run #2: 106.5609ms
  Run #3: 103.7578ms
  Statistics: avg=105.045166ms, min=103.7578ms, max=106.5609ms

=== 100 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 107.1277ms
  Warmup #2: 92.4675ms
Measurement runs:
  Run #1: 95.6504ms
  Run #2: 92.5461ms
  Run #3: 89.8522ms
  Statistics: avg=92.6829ms, min=89.8522ms, max=95.6504ms

=== 500 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 704.4906ms
  Warmup #2: 487.3241ms
Measurement runs:
  Run #1: 487.1181ms
  Run #2: 495.2505ms
  Run #3: 480.4672ms
  Statistics: avg=487.611933ms, min=480.4672ms, max=495.2505ms

=== 500 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 474.5901ms
  Warmup #2: 422.8264ms
Measurement runs:
  Run #1: 426.5837ms
  Run #2: 420.1569ms
  Run #3: 406.9346ms
  Statistics: avg=417.891733ms, min=406.9346ms, max=426.5837ms

=== 1000 characters, ずんだもん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 13.884698s
  Warmup #2: 11.1865277s
Measurement runs:
  Run #1: 10.8275907s
  Run #2: 12.176622s
  Run #3: 11.4003822s
  Statistics: avg=11.4681983s, min=10.8275907s, max=12.176622s

=== 1000 characters, 四国めたん(ノーマル) ===
Text preview: 今日は良い天気です。音声合成技術の発展により、自然な音声を生成することが可能になりました。プログラミ...
Warmup runs:
  Warmup #1: 2.2272199s
  Warmup #2: 2.1967788s
Measurement runs:
  Run #1: 2.1754446s
  Run #2: 2.2819629s
  Run #3: 2.2335499s
  Statistics: avg=2.230319133s, min=2.1754446s, max=2.2819629s
warmup_diff_text_loop(Default)
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_diff_text_loop 
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 3.90s
     Running `target\release\warmup_diff_text_loop.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 679.0428ms
--- Warmup measurements ---
First TTS (style StyleId(3), text 'ウォームアップテストです'): 205.5028ms
--- 1回ずつ異なるテキストでループ ---
TTS (style StyleId(3), text 'あああああ'): 26.62ms
TTS (style StyleId(3), text 'いいいいい'): 24.8038ms
TTS (style StyleId(3), text 'ううううう'): 27.0584ms
TTS (style StyleId(3), text 'えええええ'): 25.8907ms
TTS (style StyleId(3), text 'おおおおお'): 25.1708ms
--- 3回ずつ同じテキストでループ ---
TTS iter 0 (style StyleId(3), text 'あああああ'): 17.8124ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 25.476ms
TTS iter 1 (style StyleId(3), text 'あああああ'): 17.6997ms
  Insert TTS (style StyleId(3), text 'ききききき'): 26.5077ms
TTS iter 2 (style StyleId(3), text 'あああああ'): 16.529ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 25.9881ms
TTS iter 0 (style StyleId(3), text 'いいいいい'): 15.8898ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 16.4974ms
TTS iter 1 (style StyleId(3), text 'いいいいい'): 16.5571ms
  Insert TTS (style StyleId(3), text 'ききききき'): 17.0152ms
TTS iter 2 (style StyleId(3), text 'いいいいい'): 16.0955ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 17.0846ms
TTS iter 0 (style StyleId(3), text 'ううううう'): 16.6243ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 18.343ms
TTS iter 1 (style StyleId(3), text 'ううううう'): 17.68ms
  Insert TTS (style StyleId(3), text 'ききききき'): 20.5171ms
TTS iter 2 (style StyleId(3), text 'ううううう'): 17.7712ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 17.6695ms
TTS iter 0 (style StyleId(3), text 'えええええ'): 16.9629ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 16.7824ms
TTS iter 1 (style StyleId(3), text 'えええええ'): 17.4268ms
  Insert TTS (style StyleId(3), text 'ききききき'): 17.2365ms
TTS iter 2 (style StyleId(3), text 'えええええ'): 18.4292ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 16.5072ms
TTS iter 0 (style StyleId(3), text 'おおおおお'): 16.3475ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 17.1007ms
TTS iter 1 (style StyleId(3), text 'おおおおお'): 16.1223ms
  Insert TTS (style StyleId(3), text 'ききききき'): 16.6491ms
TTS iter 2 (style StyleId(3), text 'おおおおお'): 16.2579ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 17.0803ms
warmup_diff_text_loop(Heuristic)
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_diff_text_loop 
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 5.36s
     Running `target\release\warmup_diff_text_loop.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 841.65ms
--- Warmup measurements ---
First TTS (style StyleId(3), text 'ウォームアップテストです'): 289.3428ms
--- 1回ずつ異なるテキストでループ ---
TTS (style StyleId(3), text 'あああああ'): 47.9116ms
TTS (style StyleId(3), text 'いいいいい'): 32.7712ms
TTS (style StyleId(3), text 'ううううう'): 37.9962ms
TTS (style StyleId(3), text 'えええええ'): 46.3813ms
TTS (style StyleId(3), text 'おおおおお'): 40.548ms
--- 3回ずつ同じテキストでループ ---
TTS iter 0 (style StyleId(3), text 'あああああ'): 21.8ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 34.3134ms
TTS iter 1 (style StyleId(3), text 'あああああ'): 23.647ms
  Insert TTS (style StyleId(3), text 'ききききき'): 29.5962ms
TTS iter 2 (style StyleId(3), text 'あああああ'): 23.8461ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 29.6164ms
TTS iter 0 (style StyleId(3), text 'いいいいい'): 22.0998ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 25.2468ms
TTS iter 1 (style StyleId(3), text 'いいいいい'): 24.7706ms
  Insert TTS (style StyleId(3), text 'ききききき'): 23.8084ms
TTS iter 2 (style StyleId(3), text 'いいいいい'): 19.925ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 17.7923ms
TTS iter 0 (style StyleId(3), text 'ううううう'): 17.8507ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 17.8694ms
TTS iter 1 (style StyleId(3), text 'ううううう'): 19.2704ms
  Insert TTS (style StyleId(3), text 'ききききき'): 19.3332ms
TTS iter 2 (style StyleId(3), text 'ううううう'): 22.6598ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 21.3075ms
TTS iter 0 (style StyleId(3), text 'えええええ'): 20.8676ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 19.0633ms
TTS iter 1 (style StyleId(3), text 'えええええ'): 21.2338ms
  Insert TTS (style StyleId(3), text 'ききききき'): 23.6176ms
TTS iter 2 (style StyleId(3), text 'えええええ'): 20.3515ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 19.4156ms
TTS iter 0 (style StyleId(3), text 'おおおおお'): 18.1641ms
  Insert TTS (style StyleId(3), text 'かかかかか'): 19.9336ms
TTS iter 1 (style StyleId(3), text 'おおおおお'): 19.739ms
  Insert TTS (style StyleId(3), text 'ききききき'): 18.412ms
TTS iter 2 (style StyleId(3), text 'おおおおお'): 17.4848ms
  Insert TTS (style StyleId(3), text 'くくくくく'): 17.5588ms
warmup_diff_style_loop(Default)
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_diff_style_loop
    Updating git repository `https://github.com/Sanzentyo/voicevox_core.git`
     Locking 2 packages to latest compatible versions
      Adding voicevox_core v0.0.0 (https://github.com/Sanzentyo/voicevox_core.git?branch=perf%2Fuse-cudnn-default-algo-search#4cd88772)
      Adding voicevox_core_macros v0.0.0 (https://github.com/Sanzentyo/voicevox_core.git?branch=perf%2Fuse-cudnn-default-algo-search#4cd88772)
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 8.32s
     Running `target\release\warmup_diff_style_loop.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 657.0795ms
--- Warmup measurements ---
First TTS (style StyleId(8), text 'こんにちは'): 198.4948ms
--- 1回ずつ異なるスタイルでループ ---
TTS (style StyleId(2), text 'こんにちは'): 20.8893ms
TTS (style StyleId(0), text 'こんにちは'): 16.501ms
TTS (style StyleId(6), text 'こんにちは'): 25.4963ms
TTS (style StyleId(4), text 'こんにちは'): 27.2537ms
--- 3回ずつ同じスタイルでループ ---
TTS iter 0 (style StyleId(2), text 'こんにちは'): 16.3838ms
TTS iter 0 (style StyleId(3), text 'こんにちは'): 25.9937ms
TTS iter 1 (style StyleId(2), text 'こんにちは'): 16.8826ms
TTS iter 1 (style StyleId(3), text 'こんにちは'): 18.1752ms
TTS iter 2 (style StyleId(2), text 'こんにちは'): 16.5539ms
TTS iter 2 (style StyleId(3), text 'こんにちは'): 16.3502ms
TTS iter 0 (style StyleId(0), text 'こんにちは'): 14.9301ms
TTS iter 0 (style StyleId(1), text 'こんにちは'): 26.0865ms
TTS iter 1 (style StyleId(0), text 'こんにちは'): 15.4436ms
TTS iter 1 (style StyleId(1), text 'こんにちは'): 16.7222ms
TTS iter 2 (style StyleId(0), text 'こんにちは'): 15.3502ms
TTS iter 2 (style StyleId(1), text 'こんにちは'): 16.6023ms
TTS iter 0 (style StyleId(6), text 'こんにちは'): 15.8605ms
TTS iter 0 (style StyleId(7), text 'こんにちは'): 25.3526ms
TTS iter 1 (style StyleId(6), text 'こんにちは'): 18.5538ms
TTS iter 1 (style StyleId(7), text 'こんにちは'): 18.8366ms
TTS iter 2 (style StyleId(6), text 'こんにちは'): 16.2942ms
TTS iter 2 (style StyleId(7), text 'こんにちは'): 16.5074ms
TTS iter 0 (style StyleId(4), text 'こんにちは'): 16.1234ms
TTS iter 0 (style StyleId(5), text 'こんにちは'): 24.608ms
TTS iter 1 (style StyleId(4), text 'こんにちは'): 17.9087ms
TTS iter 1 (style StyleId(5), text 'こんにちは'): 17.1723ms
TTS iter 2 (style StyleId(4), text 'こんにちは'): 16.013ms
TTS iter 2 (style StyleId(5), text 'こんにちは'): 16.8078ms
warmup_diff_style_loop(Heuristic)
PS D:\git\signage-backend> cargo run -r -p voicevox-tts --bin warmup_diff_style_loop
   Compiling voicevox-tts v0.1.0 (D:\git\signage-backend\voicevox-tts)
    Finished `release` profile [optimized] target(s) in 23.71s
     Running `target\release\warmup_diff_style_loop.exe`
supported providers: Ok(SupportedDevices { cpu: true, cuda: true, dml: false })
GPU mode: true
Loaded ./models/voicevox_core/models/vvms/0.vvm in 897.8739ms
--- Warmup measurements ---
First TTS (style StyleId(8), text 'こんにちは'): 695.5116ms
--- 1回ずつ異なるスタイルでループ ---
TTS (style StyleId(2), text 'こんにちは'): 24.6297ms
TTS (style StyleId(0), text 'こんにちは'): 19.015ms
TTS (style StyleId(6), text 'こんにちは'): 28.2519ms
TTS (style StyleId(4), text 'こんにちは'): 26.1673ms
--- 3回ずつ同じスタイルでループ ---
TTS iter 0 (style StyleId(2), text 'こんにちは'): 17.5159ms
TTS iter 0 (style StyleId(3), text 'こんにちは'): 28.8344ms
TTS iter 1 (style StyleId(2), text 'こんにちは'): 19.7344ms
TTS iter 1 (style StyleId(3), text 'こんにちは'): 19.2687ms
TTS iter 2 (style StyleId(2), text 'こんにちは'): 19.8719ms
TTS iter 2 (style StyleId(3), text 'こんにちは'): 17.0577ms
TTS iter 0 (style StyleId(0), text 'こんにちは'): 16.2513ms
TTS iter 0 (style StyleId(1), text 'こんにちは'): 26.1753ms
TTS iter 1 (style StyleId(0), text 'こんにちは'): 24.3749ms
TTS iter 1 (style StyleId(1), text 'こんにちは'): 20.9166ms
TTS iter 2 (style StyleId(0), text 'こんにちは'): 18.9221ms
TTS iter 2 (style StyleId(1), text 'こんにちは'): 20.8435ms
TTS iter 0 (style StyleId(6), text 'こんにちは'): 20.3515ms
TTS iter 0 (style StyleId(7), text 'こんにちは'): 35.5847ms
TTS iter 1 (style StyleId(6), text 'こんにちは'): 22.8746ms
TTS iter 1 (style StyleId(7), text 'こんにちは'): 22.1146ms
TTS iter 2 (style StyleId(6), text 'こんにちは'): 24.9629ms
TTS iter 2 (style StyleId(7), text 'こんにちは'): 19.2386ms
TTS iter 0 (style StyleId(4), text 'こんにちは'): 18.2707ms
TTS iter 0 (style StyleId(5), text 'こんにちは'): 25.0666ms
TTS iter 1 (style StyleId(4), text 'こんにちは'): 20.6798ms
TTS iter 1 (style StyleId(5), text 'こんにちは'): 27.8692ms
TTS iter 2 (style StyleId(4), text 'こんにちは'): 29.0052ms
TTS iter 2 (style StyleId(5), text 'こんにちは'): 25.7484ms

@Sanzentyo
Copy link
Contributor Author

@Hiroshiba OSSにPR出すのが初めてで、作法があまりわかっていないのですが、Defaultに戻す場合はこのPRをCloseした上で、perf/use-cudnn-default-algo-search からPRを出し直せばいいのでしょうか?

@Hiroshiba
Copy link
Member

@Sanzentyo
再計測ありがとうございます!!

お~Defaultのが良さそうな気配を感じますね!
Heuristicの方が速いこともありそうだけど、まあ微差だし、Defaultで良さそうな印象です!!

プルリクの流れの質問もありがとうございます 🙏
こちらは @qryxip さんにお任せできればと思います!!

@qryxip
Copy link
Member

qryxip commented Oct 3, 2025

@Sanzentyo

Defaultに戻す場合はこのPRをCloseした上で、perf/use-cudnn-default-algo-search からPRを出し直せばいいのでしょうか?

新しいPRを出し直すかこのPRを改変するかですが、作法という観点だとどちらにするかは人によるかなと思います。前者であればPRの内容と議論内容が一致するというメリットがありますし、後者でも議論が一箇所にまとまるというメリットがあると思います。

で、今回どうするかですが、正直迷うところではありますがせっかくなので、Sanzentyoさんがご提案くださった前者のPRの出し直しをお願いできればと思います。

新しいPRのタイトルですが、こちらも迷うところではありますがcommit typeperfからfixにして頂けたらと思っています。理由としては、changelogおよびkey changesでは"Fix"として書くことになると思うからです。まあcommit typeなんてものは後で人間が見てわかりやすければいいはずなので、さほど強い理由ではないですが。

In a worst case scenario, it’s not the end of the world if a commit lands that does not meet the Conventional Commits specification. It simply means that commit will be missed by tools that are based on the spec.

あと現在この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
Copy link
Member

qryxip commented Oct 3, 2025

あ、ちなみに「リンク」ですが、実はissueだけではなく他PRも指定できます。なのでこの#1162は一旦閉じずに新しいPRでこう書けば、新しいPRのマージの瞬間に#1162がクローズされる、ということも行えます。せっかくなので今回やってみたらいいのかなと。

Fixes: #1163
Closes: #1162

[追記] 例: #1108#1105

@Sanzentyo
Copy link
Contributor Author

@qryxip @Hiroshiba
色々ありがとうございます
#1164 にPRを出し直しました

@qryxip qryxip closed this in #1164 Oct 14, 2025
qryxip pushed a commit that referenced this pull request Oct 14, 2025
> - `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
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.

cudnn_conv_algo_searchが誤って変更されたため、CUDAでの音声合成が数秒かかっている

3 participants