Windowsで音楽生成モデル「ACE-Step-Portable 」(1.5)を動かす

どうも管理人です。
ACE-Stepをご存じですか?ローカル環境で使用できるでオープンソース音楽生成モデルなのですが、1.5にバージョンアップされ曲の完成度や生成スピードがあがり実用レベルになったと感じましたので導入しました。私の環境下だとまともに動くまで色々と詰まったので備忘録も兼ねて残しておきたいと思います。生成AIを用いて導入中でハマっている方もこのページをAIに読ませれば、何かの解決になるかもしれません。
対象: Windows + ACE-Step-Portable(埋め込みPython環境)で 歌詞(Lyrics)付きの音楽生成を安定させるまでにやったことの整理。


スポンサーリンク
  1. 先に結論だけ
  2. 動作環境(当時の確認値)
  3. 症状: 歌詞付き生成で NaN になって失敗
  4. このチャットでやったこと(引継ぎ前:shift3導入〜LM試行〜歌詞無音の切り分け)
    1. A) Portable UIに「モデル選択」が見当たらない問題 → --config_path / .env で指定する
    2. B) “shift3を実際に使う” 起動に変更 → モデル自動DLまで確認
    3. C) まずは “LMなし” でベースライン確認(= 歌詞なしは確実に音が出る)
    4. D) .env を “shift3 + 安定化(LMなし)” に寄せた値(当時の確認値)
    5. E) LMあり起動の試行①:0.6B が “無い” ので初期化失敗
    6. F) LMあり起動の試行②:1.7B は存在 → 初期化は通るが、生成でCUDA assert
    7. G) 「ボーカル言語 ja 手動固定」は、ログで “本当に渡っているか” を必ず確認する必要あり
    8. H) ここまでの暫定結論(引継ぎ前の段階)
  5. やったこと(時系列メモ)
    1. 1) transformers の torch.finfo(dtype).min を float16 固定にするパッチ(結局やめた)
    2. 2) LLM / nano-vllm まわり
    3. 3) CPU offload を切って最小構成で再テスト(改善せず)
    4. 4) SDPA のカーネルを固定(これが本命)
      1. 4-1) sitecustomize.py に SDPA固定コードを入れる
      2. 4-2) “どこかで enable_* が上書きされてないか” を検索
  6. 起動コマンド(最終・安定版)
    1. 重要: --init_service true を付ける(UIの「Model not fully initialized」回避)
  7. 追記: acestep-v15-sft と DiT 推論ステップ(品質・歌詞反映の改善)
    1. 1) モデルは acestep-v15-sft が良かった
    2. 2) DiT 推論ステップを増やすと、歌詞が「よりそれっぽく」なる
    3. 3) DiT 推論ステップ上限をファイル修正で引き上げた
  8. 生成の成功判定(NaNが止まったか)
  9. 「30秒だと歌詞が乗らない」→「60秒で乗る」について
  10. Guidance / CFG をいじった件(元に戻した)
  11. よくある詰まりポイントまとめ
  12. 付録: ログ確認テンプレ
    1. 起動できたか
    2. 生成が成功したか(NaNがないか)
  13. 免責・注意

先に結論だけ

  • 歌詞付き生成で pred_latents contains NaN/Inf が出る → Windows + CUDA の組み合わせで SDPAのカーネル(flash/mem/math)選択が不安定になるケースがある。
  • 最終的に、SDPAを math カーネルに固定したら(flash=False, mem_efficient=False, math=TrueNaNが止まって生成成功した。
  • UIで 「Model not fully initialized」が出る場合は、起動時に --init_service true(必要なら --config_path ...)を付ける。
  • 歌詞が30秒で乗らないことがある → 60秒にすると歌詞が乗る(用途によって割り切りOK)。
  • モデルは acestep-v15-sft を使い、DiT 推論ステップを増やすと歌詞の反映や安定性が上がった(turbo / turbo-shift3 より良好)
  • DiT 推論ステップの上限が UI で足りなかったため、UI 定義ファイルを編集して上限値を引き上げた(アップデートで戻るのでバックアップ必須)

スポンサーリンク

動作環境(当時の確認値)

PowerShell: 7.5.4
Python: 埋め込み python_embeded\python.exe(3.11)
pip: 26.0
PyTorch / CUDA:

cd K:\ACE-Step\ACE-Step-Portable
$py = ".\python_embeded\python.exe"
& $py -c "import torch; print('torch=',torch.__version__,' cuda=',torch.version.cuda); print('flash_sdp=',torch.backends.cuda.flash_sdp_enabled()); print('mem_efficient_sdp=',torch.backends.cuda.mem_efficient_sdp_enabled()); print('math_sdp=',torch.backends.cuda.math_sdp_enabled())"

出力例:

  • torch= 2.7.1+cu128 cuda= 12.8
  • flash_sdp=True / mem_efficient_sdp=True / math_sdp=True(= 使えるが、どれが使われるかは実行時の条件で変わる)

flash-attn / xformers の有無:

& $py -c "import importlib.util as u; print('flash_attn=',u.find_spec('flash_attn') is not None); print('xformers=',u.find_spec('xformers') is not None)"

例: flash_attn=False / xformers=False
→ この状態だと「flash_attention_2 を入れて切り替える」方向は、Windowsでは現実的に面倒(ビルド/互換性)になりがち。

GPU: 8GB(ログ上: tier3)
→ 自動でCPU offloadが有効化されることがある(ログに出る)。


スポンサーリンク

症状: 歌詞付き生成で NaN になって失敗

起動・生成のログに以下が出て止まる:

  • pred_latents.min()=tensor(nan, ...)
  • pred_latents contains NaN/Inf -> abort
  • RuntimeError: pred_latents contains NaN/Inf

ログ抽出(確認用):

cd K:\ACE-Step\ACE-Step-Portable
Select-String -Path .\run_7860_gpu.log -SimpleMatch -Pattern @(
  "Attempting to load model with attention implementation:",
  "Starting generation...",
  "pred_latents:",
  "contains NaN/Inf",
  "Saved audio to",
  "Audio 1 path:"
) | Select-Object -Last 260

スポンサーリンク

このチャットでやったこと(引継ぎ前:shift3導入〜LM試行〜歌詞無音の切り分け)

目的: 「キャプション+歌詞」で無音にならない状態に持っていくため、まずは モデル/起動/LM有無 を整理して “再現条件” を固めた。

A) Portable UIに「モデル選択」が見当たらない問題 → --config_path / .env で指定する

Portable版はUIでモデル選択が出ない構成があり、モデルは起動引数 or .env で固定される。

  • .env(例)
  • ACESTEP_CONFIG_PATH=acestep-v15-turbo-shift3
  • 起動引数(例)
  • --config_path acestep-v15-turbo-shift3

優先順位は 起動引数 > .env(実ログでも .env 読み込みが出るが、引数指定がある場合は引数側が実質優先)。

補足:起動に使っている acestep_v15_pipeline.py は、--config_path が指定されていればその値を使い、未指定の時だけ .envACESTEP_CONFIG_PATH を読む実装だったため、スクリプト自体が shift3 を阻害している形跡はなし(今回の挙動も --config_path acestep-v15-turbo-shift3 で自動DL→起動できている)。


B) “shift3を実際に使う” 起動に変更 → モデル自動DLまで確認

起動で --config_path acestep-v15-turbo-shift3 を指定したところ、初回はログに

  • DiT model 'acestep-v15-turbo-shift3' not found, starting auto-download...
  • Downloading acestep-v15-turbo-shift3 ...
  • Successfully downloaded ...
  • Attempting to load model with attention implementation: sdpa

が出て、shift3モデルが取得・起動できることを確認できた。


C) まずは “LMなし” でベースライン確認(= 歌詞なしは確実に音が出る)

この段階で確定した事実:

  • キャプションのみ:音ありで生成OK(10〜30秒でもOK / 1分以上でもOK)
  • キャプション+歌詞:無音mp3が出る(=「生成は走るが中身が無音」の系)

無音でも Audio 1 path: が出てmp3は保存されるので、
“保存に失敗” ではなく 生成内容(音声テンソル/デコード結果)が無音 側の問題が濃厚。


D) .env を “shift3 + 安定化(LMなし)” に寄せた値(当時の確認値)

当時の固定値(最低限):

  • ACESTEP_CONFIG_PATH=acestep-v15-turbo-shift3
  • ACESTEP_USE_FLASH_ATTENTION=false
  • ACESTEP_LM_BACKEND=pt
  • ACESTEP_INIT_LLM=false(まずLM無しで切り分け)
  • ACESTEP_LM_MODEL_PATH=acestep-5Hz-lm-0.6B(後でLMを使う可能性に備えて残す)

この構成でログ上 pred_latents数値(NaNなし) で、音ありmp3が生成できることを確認した。


E) LMあり起動の試行①:0.6B が “無い” ので初期化失敗

--init_llm true --lm_model_path acestep-5Hz-lm-0.6B で起動すると

  • Warning: 5Hz LM initialization failed: ❌ 5Hz LM model not found at ...\checkpoints\acestep-5Hz-lm-0.6B

となった。

つまり 「0.6Bをダウンロードしていない(または配置が違う)」 がまず原因。


F) LMあり起動の試行②:1.7B は存在 → 初期化は通るが、生成でCUDA assert

--lm_model_path acestep-5Hz-lm-1.7B で起動したところ、

  • nano-vllm is not installed ... falling back to PyTorch backend
  • 5Hz LM initialized successfully using PyTorch backend on cuda

まで進んで LLM初期化は成功した。

しかし生成開始直後に

  • Assertion input[0] != 0 failed(CUDA側 assertion)
  • RuntimeError: CUDA error: device-side assert triggered
  • 例外箇所:torch.multinomial(probs, num_samples=1)(サンプリング)

で落ちた。

この時のログには、初期化中に

  • Found ... audio code tokens with values outside valid range [0, 63999]

も出ており、“LMのチェックポイント/語彙・トークン仕様が想定とズレている” 可能性が高い。
またGPU設定表示では Available LM Models が 0.6B しか出ないため、
Portable側が 0.6B前提になっている可能性も示唆される。

ここまでで言えること:

  • “LMを有効化すれば歌詞が直る” とは限らない(むしろLM側で別のクラッシュが出る)
  • まず 0.6Bを正しく入れる(= 仕様通りのLM)ことが先。

G) 「ボーカル言語 ja 手動固定」は、ログで “本当に渡っているか” を必ず確認する必要あり

UIで ja 固定を選んでも、ログ上の formatted_prompt

  • # Caption が空
  • # Lyric が空
  • “vocal_language=unknown” 相当の値が混ざる

のように見えるケースがあった。

そのため、UIでの設定が内部に渡っているかは、次のログ抽出で “証拠” を取るのが必須。

cd K:\ACE-Step\ACE-Step-Portable
Select-String -Path .\run_7860_gpu.log -SimpleMatch -Pattern @(
  "[DEBUG] DiT TEXT ENCODER INPUT",
  "text_prompt:",
  "# Caption",
  "# Lyric",
  "vocal_language",
  "language"
) | Select-Object -Last 220
  • # Lyric の直下に、入力した歌詞テキストが そのままログに出ていること
  • “unknown/auto” ではなく、jaが入っていること(どのキー名で出るかは実装依存)

これが満たされていない場合は、「歌詞が無音」の原因が “歌詞が渡っていない” 側に寄る。


H) ここまでの暫定結論(引継ぎ前の段階)

  • shift3の導入とLMなし生成(歌詞なし音あり)は安定した
  • “歌詞あり無音” は (1) 歌詞入力が内部に渡っていない(2) 歌詞条件でDiT/SDPAが不安定(3) デコードは動くがボーカルが乗らない のどれか
  • LMは 0.6Bが正しく入っていないのが先に解決すべき点
  • 1.7Bを無理に使うと、token/語彙不整合っぽいログ + device-side assert で別問題になる可能性が高い

(この後の章で、SDPAカーネル固定など “本命の安定化” へ進める、という流れ)

スポンサーリンク

やったこと(時系列メモ)

1) transformers の torch.finfo(dtype).min を float16 固定にするパッチ(結局やめた)

  • transformers/masking_utils.pytransformers/modeling_attn_mask_utils.py
    torch.finfo(dtype).min 等を torch.finfo(torch.float16).min に置換する試行を実施。
  • ただし、今回の NaN 問題の本丸ではなかったため 最終的に .bak を戻して原状復帰した。

教訓: まずは モデル側(DiT/SDPA/精度/カーネル)由来の NaN を疑う。
transformers 側をいきなり書き換えるのは最後。


2) LLM / nano-vllm まわり

ログで

  • nano-vllm is not installed ... falling back to PyTorch backend
    が出ることがあった。

ただしこの時点では

  • LLM usage decision ... use_lm=False
    となっており、LMを使わずに生成する構成でも NaN が出ていたので、
    今回の NaN の主要因は LMではなく DiT/Attention 側と判断。

3) CPU offload を切って最小構成で再テスト(改善せず)

CPU offload の有無を変えても、歌詞付きでは NaN が再現するケースが続いた。
→ ここで「attention実装(sdpa)とWindows/CUDA周り」をより強く疑う流れに。


4) SDPA のカーネルを固定(これが本命)

PyTorchのSDPAは内部で flash / mem_efficient / math のいずれかのカーネルを選ぶ。
Windows + CUDA + モデル条件によって、flash/memで不安定 → NaNになっている可能性が濃厚。

そこで、sitecustomize.py を使い プロセス起動直後にSDPAモードを固定した。

4-1) sitecustomize.py に SDPA固定コードを入れる

(埋め込みPythonでも sitecustomize.pysite-packages 直下に置くと読まれる)

cd K:\ACE-Step\ACE-Step-Portable
$py = ".\python_embeded\python.exe"
$sc = ".\python_embeded\Lib\site-packages\sitecustomize.py"

Copy-Item $sc "$sc.bak_20260209_sdpa" -ErrorAction SilentlyContinue

@'
try:
    import torch
    # SDPA kernel: math only(NaN回避狙い)
    torch.backends.cuda.enable_flash_sdp(False)
    torch.backends.cuda.enable_mem_efficient_sdp(False)
    torch.backends.cuda.enable_math_sdp(True)
    print(f"[SDPA] mode=math flash={torch.backends.cuda.flash_sdp_enabled()} mem_efficient={torch.backends.cuda.mem_efficient_sdp_enabled()} math={torch.backends.cuda.math_sdp_enabled()} tf32_matmul={torch.backends.cuda.matmul.allow_tf32}")
except Exception as e:
    print(f"[SDPA] toggle failed: {e}")
'@ | Set-Content -Path $sc -Encoding UTF8

動作確認([SDPA] が出ればOK):

cd K:\ACE-Step\ACE-Step-Portable
$py = ".\python_embeded\python.exe"
& $py -c "import sitecustomize"

期待値:

  • [SDPA] ... flash=False mem_efficient=False math=True ...

4-2) “どこかで enable_* が上書きされてないか” を検索

ACE-Step側が起動時に enable_* を呼んでいると、こちらの固定が上書きされることがある。
なので acestep\ 配下に残っていないことを確認:

cd K:\ACE-Step\ACE-Step-Portable
Get-ChildItem .\acestep -Filter *.py -File -Recurse |
  Select-String -SimpleMatch -Pattern @(
    "enable_flash_sdp(",
    "enable_mem_efficient_sdp(",
    "enable_math_sdp("
  ) |
  Select-Object -First 50

(最終的にここが ヒットしない状態にしている)


スポンサーリンク

起動コマンド(最終・安定版)

重要: --init_service true を付ける(UIの「Model not fully initialized」回避)

この形が安定した:

cd K:\ACE-Step\ACE-Step-Portable
$py = ".\python_embeded\python.exe"

Remove-Item .\run_7860_gpu.log -ErrorAction SilentlyContinue

& $py -u .\acestep\acestep_v15_pipeline.py `
  --server-name 127.0.0.1 --port 7860 --language ja `
  --init_service true --init_llm false `
  --config_path acestep-v15-turbo-shift3 `
  2>&1 | Tee-Object -FilePath .\run_7860_gpu.log

起動ログで確認する行:

  • [SDPA] mode=math ... math=True
  • Launching server on 127.0.0.1:7860...
  • Running on local URL: http://127.0.0.1:7860

スポンサーリンク

追記: acestep-v15-sft と DiT 推論ステップ(品質・歌詞反映の改善)

このチャットの後半で分かったのは、NaN を潰して「生成できる状態」になった後の品質面では、モデルと推論ステップの選び方が効く、という点です。

1) モデルは acestep-v15-sft が良かった

私の Windows + ACE-Step-Portable 環境では、デフォルト寄りの acestep-v15-turbo / acestep-v15-turbo-shift3 よりも、acestep-v15-sft の方が歌詞の乗りやすさ・一貫性が良い体感でした(同じ歌詞付き条件で比較)。

起動例(sft を明示):

cd K:\ACE-Step\ACE-Step-Portable
$py = ".\python_embeded\python.exe"

Remove-Item .\run_7860_gpu.log -ErrorAction SilentlyContinue

& $py -u .\acestep\acestep_v15_pipeline.py `
  --server-name 127.0.0.1 --port 7860 --language ja `
  --init_service true --init_llm false `
  --config_path acestep-v15-sft `
  2>&1 | Tee-Object -FilePath .\run_7860_gpu.log

--init_llm false のままで歌詞付き生成が成立するのが確認できているので、LM は「必要なら後回し」でOKです。

2) DiT 推論ステップを増やすと、歌詞が「よりそれっぽく」なる

UI の 「DiT 推論ステップ」(詳細設定の中)を増やすと、生成時間は伸びますが、歌詞の追従・発声の説得力が増える傾向がありました。

  • まずは「生成が安定している」設定(この文書の SDPA/NaN 対策)を優先
  • そのうえで、sft + 推論ステップ増で品質を詰める、という順が安全

3) DiT 推論ステップ上限をファイル修正で引き上げた

UI 側のスライダーに「上限」があり、そこで頭打ちになったため、UI 定義ファイルを編集して上限値を引き上げました。

ポイント(ブログ用メモ):

  • 変更前に必ずバックアップ(アップデートで戻る / 破損すると UI が起動しない)
  • どのファイルかは環境差が出やすいので、まず検索で当たりを付ける

検索(例):

cd K:\ACE-Step\ACE-Step-Portable

Get-ChildItem .\acestep\gradio_ui -Filter *.py -File -Recurse |
  Select-String -SimpleMatch -Pattern @(
    "DiT",
    "推論ステップ",
    "inference_steps",
    "max 200 steps",
    "gr.Slider",
    "maximum="
  ) | Select-Object -First 120

編集のイメージ(見つかった gr.Slider(... maximum=XXX ...)maximum を希望値へ):

  • 例: maximum=200maximum=400(※値は自分の用途に合わせて決める)
  • 保存後は サーバを再起動(起動しっぱなしだと読み込まれない)

注意: ここは「私の環境でやった」という事実の追記です。数値(上限の具体値)は環境・目的で変わるので、ブログでは「どのファイルのどの項目を変えたか」を中心に書くのが安全です(読者が自分の値に置き換えられる)。

(補足)もし「どの値にしたか」をログから辿るなら、run_7860_gpu.log から inference_steps を含む行を拾うのが確実です:

cd K:\ACE-Step\ACE-Step-Portable
Select-String -Path .\run_7860_gpu.log -SimpleMatch -Pattern @("inference_steps","steps") |
  Select-Object -Last 80
スポンサーリンク

生成の成功判定(NaNが止まったか)

ログで pred_latents が NaN になっていないこと、Saved audio to が出ること。

cd K:\ACE-Step\ACE-Step-Portable
Select-String -Path .\run_7860_gpu.log -SimpleMatch -Pattern @(
  "[SDPA] mode=",
  "Attempting to load model with attention implementation:",
  "Starting generation...",
  "pred_latents:",
  "contains NaN/Inf",
  "Saved audio to",
  "Audio 1 path:"
) | Select-Object -Last 260

成功例(ポイント):

  • pred_latents ... dtype=torch.bfloat16 ... min/max/mean/std が数値
  • Saved audio to ... .mp3
  • Audio 1 path: ...

スポンサーリンク

「30秒だと歌詞が乗らない」→「60秒で乗る」について

現象:

  • 30秒: 生成自体は成功するが、歌詞が薄い/乗らないことがあった
  • 60秒: 歌詞が明確に乗った

用途として 30秒にこだわらないなら60秒でOK
(歌詞に関しては、モデルが「歌唱パートとして成立する尺」を必要とする可能性がある)


スポンサーリンク

Guidance / CFG をいじった件(元に戻した)

UI上で guidance_scale を見つけられず、.py を置換して default を 0.5 に固定する試行をしたが、
最終的に デフォルト(7.0 / cfg_interval_end=1.0)へ戻した

確認コマンド(戻っているか):

cd K:\ACE-Step\ACE-Step-Portable
Select-String -Path .\acestep\gradio_ui\api_routes.py -SimpleMatch -Pattern @(
  'get_param("guidance_scale"',
  'get_param("cfg_interval_end"'
) | Select-Object -First 80

Select-String -Path .\acestep\gradio_ui\events\generation_handlers.py -SimpleMatch -Pattern @(
  "metadata.get('guidance_scale'",
  "metadata.get('cfg_interval_end'"
) | Select-Object -First 80

期待値(例):

  • guidance_scale ... default=7.0
  • metadata.get('guidance_scale', 7.0)
  • cfg_interval_end ... 1.0

補足: 今回、歌詞の反映が「前よりちゃんと出てる」感触は、
guidance/cfg の default を戻したこととも整合する(条件追従が強くなる)。


スポンサーリンク

よくある詰まりポイントまとめ

1) NaN/Infで止まる(歌詞付きで再現しやすい)
→ SDPAカーネル固定(math only)で回避できることがある。

2) UIに「Model not fully initialized」
→ 起動に --init_service true(必要なら --config_path ...)を付ける。

3) ログが流れない/取りづらい
-u(unbuffered) + Tee-Objectrun_7860_gpu.log に残す。

4) flash_attention_2 に切り替えたい
→ Windows環境では flash_attn の導入が重くなりがち。
まずは SDPA固定で安定化してから検討するのが現実的。


スポンサーリンク

付録: ログ確認テンプレ

起動できたか

cd K:\ACE-Step\ACE-Step-Portable
Select-String -Path .\run_7860_gpu.log -SimpleMatch -Pattern @(
  "[SDPA] mode=",
  "Launching server",
  "Running on local URL"
) | Select-Object -First 80

生成が成功したか(NaNがないか)

cd K:\ACE-Step\ACE-Step-Portable
Select-String -Path .\run_7860_gpu.log -SimpleMatch -Pattern @(
  "Starting generation...",
  "pred_latents:",
  "contains NaN/Inf",
  "Saved audio to",
  "Audio 1 path:"
) | Select-Object -Last 260

スポンサーリンク

免責・注意

  • sitecustomize.py.py 置換は アップデートで上書きされ得る。バックアップを必ず取る。
  • 本文は「この環境・この時点」での記録。GPU/ドライバ/CUDA/PyTorchの組み合わせで挙動が変わる可能性あり。
  • とはいえ「歌詞付きだけNaNが出る」→「SDPAのカーネル固定で止まる」は、同症状の人にとって再現性のある当たり所になりやすい。

コメント