結構久々のPCネタで御座います。
YouTubeはずーっとカメラネタばかりでしたので結構久々。
で、今回もAIネタで御座いますよ。
今回は実は以前から試してみたかったローカル音楽生成AI ACE-Step をやってみました。
ubuntuでのネイティブな実行はマジで苦労しましたよ。
目次
ローカル音楽生成AI ACE-Step
はい。
では今回の主役【ローカル音楽生成AI ACE-Step】
詳しくは本家サイトを見て下さい。
絶対にそれが一番。
https://github.com/ace-step/ACE-Step
使うPCと詳細情報
今回使うPCは
AOOSTAR GEM12 MAX ミニPC Ryzen 7 8745HS
AOOSTAR GEM12 MAX
メモリは64Gを積んでおります。
OSはデュアルブートの為、
Windows11
ubuntu desktop 24
両方のOSに公式のドライバーを入れており
ubuntuはROCm6.4.3です
とりあえず本件の動画
Windows + ComfyUI で ACE-Step
ではまず、Windows + ComfyUI で ACE-Stepを動かす方法。
コチラは動画の中にある通り、
99%紹介のサイト様を参考にしておりますので
そちらをご覧ください。
Windows上でComfyUIをROCmネイティブで動かす
https://note.com/legal_iguana6508/n/nb4366c20ead3
強いていえば NumPy が無いぞ とComfyUIに怒られますので
numpyをインストール。
pip install numpy
あとはテンプレ選べば動きます。
Ubuntu + ROCm + 内蔵GPU で ACE-Step
はい。
これが私のブログの本題。
このネタ全然書いてる人見つからなかったんですよ。
そもそもUbuntu + ROCm6.4 は radeon780M サポートしてないもんね。
なので無理やりな感じではあるのでしょう。
しかしなが、動画通り動作しましたし、ROCmスゲーなと思いました。
CUDAと互換させてしまうとは・・・。
インストールガイドは分り難いけど、やってることは凄いんだなと思いました。
では、コード・・・ ってかやる事。
多分コードは少ない。
ドライバーのインストール
ROCm installation for Linux
https://rocm.docs.amd.com/projects/install-on-linux/en/docs-6.4.3/index.html
ここを参考にしてドライバー入れます。
まぁ 結構分り難いし、コマンド分からんって人はアウトなんですが・・・
Build HIP
この作業が足りなくてエラーしていたんだろうか??
と思ってる作業。
当初この作業はしませんでしたが、作業後セッティングしてたら警告メッセージは消えて
スムーズに動くようになりました。
Build HIP from source
https://rocm.docs.amd.com/projects/HIP/en/docs-6.4.3/install/build.html
公式の案内通りに作業するのみです。
pip install pip3 install CppHeaderParser apt-get install rocm-llvm-dev
#私の場合は6.4.3 export ROCM_BRANCH=rocm-6.x.x
git clone -b "$ROCM_BRANCH" https://github.com/ROCm/clr.git git clone -b "$ROCM_BRANCH" https://github.com/ROCm/hip.git
export CLR_DIR="$(readlink -f clr)" export HIP_DIR="$(readlink -f hip)"
そんでBuild
cmakeとか入ってなければ入れる。
cd "$CLR_DIR" mkdir -p build; cd build cmake -DHIP_COMMON_DIR=$HIP_DIR -DHIP_PLATFORM=amd -DCMAKE_PREFIX_PATH="/opt/rocm/" -DCMAKE_INSTALL_PREFIX=$PWD/install -DHIP_CATCH_TEST=0 -DCLR_BUILD_HIP=ON -DCLR_BUILD_OCL=OFF .. make -j$(nproc) sudo make install
ACE-Step ROCm
公式の物でも大丈夫そうな感じもあったのですが、
一部コードが異なっていたいので
ACE-Step ROCmバージョン
を使わせていただきました。
ちなみに、オフィシャルのACE-Stepでも、セットアップさえちゃんとやれば動きそうな感じもしました。
コードをちゃんとチェックしてないんで分からんけど・・・
https://github.com/isdood/ACE-Step-ROCm
ここから私のやり方は、githubの説明と異なっています。
具体的には、コミットされた内容を確認して、
変更のあったファイル、追加されたファイルを公式のものとドッキング。
というのも当初CPUモードとはいえ、大半の処理が終わっていたのでそれを活かした感じ。
そのあとPyTorchなどをアンインストールし、再インストール。
その辺の作業は ACE-Step ROCm の
env-init.sh に入っていましたので、そちらを実行すれば良いのだと思いますが
私はもともと自分で色々試していたので、env-init.sh は実行させていません。
変更したコード類
もはや何を変えたかすら微妙に忘れているので、本来GITで出したほうが良いのかもなのですが、
そーゆーが経験無いので変えたであろう部分をUPしておきます。
全コード、当然ながらAIのアシストも相当有
scripts/start-acestep.sh
#!/bin/bash
# Script to run ACE-Step with proper ROCm environment
# ROCmバージョンオーバーライド(必要であれば)
export HSA_OVERRIDE_GFX_VERSION=11.0.2
# ROCmのインストールパス
export ROCM_PATH=/opt/rocm
# Python venv をアクティブにする
if [ -d "/home/sou/tools/ACE-Step/venv" ]; then
source /home/sou/tools/ACE-Step/venv/bin/activate
else
echo "Warning: 'venv' not found at /home/sou/tools/ACE-Step/venv. Proceeding with system Python."
fi
# ROCm ライブラリ PATH を有効化(venv に上書きされるケース対策)
export LD_LIBRARY_PATH=$ROCM_PATH/lib:$ROCM_PATH/lib64:$ROCM_PATH/lib/llvm/lib:$LD_LIBRARY_PATH
export PATH=$ROCM_PATH/bin:$PATH
# GPUデバイスの指定 (通常は0番目のGPUを使用)
export HIP_VISIBLE_DEVICES=0
# garbage_collection_threshold: VRAM使用率がこの閾値を超えた場合にガベージコレクションをトリガー
export PYTORCH_ALLOC_CONF="garbage_collection_threshold:0.9"
# PyTorchのScaled Dot Product Attention (SDPA) の設定
# TORCH_ROCM_AOTRITON_ENABLE_EXPERIMENTAL=1: 実験的なAOTRITONバックエンドを有効化(ROCm GPUでのSDPA最適化のため)
export TORCH_ROCM_AOTRITON_ENABLE_EXPERIMENTAL=1
export MIOPEN_FIND_MODE=2
echo "--- ROCm Environment Settings ---"
echo "ROCM_PATH: $ROCM_PATH"
echo "LD_LIBRARY_PATH: $LD_LIBRARY_PATH"
echo "HIP_VISIBLE_DEVICES: $HIP_VISIBLE_DEVICES"
echo "PYTORCH_ALLOC_CONF: $PYTORCH_ALLOC_CONF"
echo "TORCH_ROCM_AOTRITON_ENABLE_EXPERIMENTAL: $TORCH_ROCM_AOTRITON_ENABLE_EXPERIMENTAL"
echo "---------------------------------"
# PyTorchとROCmの検出テスト(本稼働時にはコメントアウト推奨)
echo "--- Testing PyTorch ROCm Detection (Optional) ---"
python - <<'PY_TEST'
import torch, os, sys
print('PyTorch version:', torch.__version__)
print('hasattr(torch, "hip"):', hasattr(torch, 'hip'))
print('torch.version.hip:', getattr(getattr(torch, 'version', None), 'hip', None))
print('torch.backends.cuda.is_built() (for MIOpen/cuDNN link):', torch.backends.cuda.is_built())
print('torch.cuda.is_available():', torch.cuda.is_available())
if torch.cuda.is_available():
print('torch.cuda.device_count():', torch.cuda.device_count())
if torch.cuda.device_count() > 0:
print('torch.cuda.get_device_name(0):', torch.cuda.get_device_name(0))
PY_TEST
echo "-------------------------------------------------"
echo "Starting ACE-Step web app..."
python -m acestep.gui "$@"
acestep/gui.py
float16 のが良いかなーと思って選択できるように変えました。
なので pipeline_ace_step.py も変更してます。
"""
ACE-Step: A Step Towards Music Generation Foundation Model
https://github.com/ace-step/ACE-Step
Apache 2.0 License
"""
import os
import click
@click.command()
@click.option(
"--checkpoint_path",
type=str,
default="",
help="Path to the checkpoint directory. Downloads automatically if empty.",
)
@click.option(
"--server_name",
type=str,
default="127.0.0.1",
help="The server name to use for the Gradio app.",
)
@click.option(
"--port", type=int, default=7865, help="The port to use for the Gradio app."
)
@click.option("--device_id", type=int, default=0, help="The CUDA device ID to use.")
@click.option(
"--share",
type=click.BOOL,
default=False,
help="Whether to create a public, shareable link for the Gradio app.",
)
@click.option(
"--d_type", # 新しいオプションを追加
type=click.Choice(["bfloat16", "float16", "float32"]), # 選択肢を設定
default="bfloat16", # デフォルト値を設定
help="Precision to use: bfloat16, float16, or float32. bfloat16 is default.",
)
@click.option(
"--torch_compile", type=click.BOOL, default=False, help="Whether to use torch.compile."
)
@click.option(
"--cpu_offload", type=bool, default=False, help="Whether to use CPU offloading (only load current stage's model to GPU)"
)
@click.option(
"--overlapped_decode", type=bool, default=False, help="Whether to use overlapped decoding (run dcae and vocoder using sliding windows)"
)
def main(checkpoint_path, server_name, port, device_id, share, d_type, torch_compile, cpu_offload, overlapped_decode):
"""
Main function to launch the ACE Step pipeline demo.
"""
# Remove hardcoded CUDA_VISIBLE_DEVICES - let the pipeline handle device detection
# os.environ["CUDA_VISIBLE_DEVICES"] = str(device_id)
from acestep.ui.components import create_main_demo_ui
from acestep.pipeline_ace_step import ACEStepPipeline
from acestep.data_sampler import DataSampler
model_demo = ACEStepPipeline(
checkpoint_dir=checkpoint_path,
device_id=device_id, # Pass device_id to use our new device detection logic
dtype=d_type,
torch_compile=torch_compile,
cpu_offload=cpu_offload,
overlapped_decode=overlapped_decode
)
data_sampler = DataSampler()
demo = create_main_demo_ui(
text2music_process_func=model_demo.__call__,
sample_data_func=data_sampler.sample,
load_data_func=data_sampler.load_json,
)
demo.launch(server_name=server_name, server_port=port, share=share)
if __name__ == "__main__":
main()
acestep/pipeline_ace_step.py
このファイルは大きくなるので一部のみ記述します。
なので多分、変更箇所の一部が抜けると思われます・・・
まずは最初のほう部分。
#self.dtype = torch.bfloat16 if dtype == "bfloat16" else torch.float32
#↑ここを変えてfloat16に出来るように
if dtype == "bfloat16":
self.dtype = torch.bfloat16
elif dtype == "float16": # "float16"が渡された場合にtorch.float16を設定
self.dtype = torch.float16
elif dtype == "float32":
self.dtype = torch.float32
else:
logger.warning(f"Unknown dtype: {dtype}, defaulting to bfloat16.")
self.dtype = torch.bfloat16 # 未知のdtypeの場合はbfloat16にフォールバック
↓↓元ファイルのの135行目くらい AIに言われて変えたような・・・
# Use new device detection logic
self.device = self._get_optimal_device(device_id)
# Optimize dtype for the selected device
self.dtype = self._get_optimal_dtype(self.dtype, self.device)
↓↓元ファイルのの141行目くらいに 色々
def _get_optimal_device(self, device_id):
"""Get the optimal device considering ROCm, CUDA, and CPU availability."""
# Check for ROCm first (AMD GPUs)
if hasattr(torch, 'hip') and torch.cuda.is_available():
device_count = torch.cuda.device_count()
if device_count > device_id:
logger.info(f"Using ROCm device {device_id} (HIP available)")
return torch.device(f"hip:{device_id}")
else:
logger.warning(f"Requested ROCm device {device_id} not available, only {device_count} devices found")
if device_count > 0:
logger.info(f"Falling back to ROCm device 0")
return torch.device("hip:0")
# Check for CUDA (NVIDIA GPUs)
if torch.cuda.is_available():
device_count = torch.cuda.device_count()
if device_count > device_id:
logger.info(f"Using CUDA device {device_id}")
return torch.device(f"cuda:{device_id}")
else:
logger.warning(f"Requested CUDA device {device_id} not available, only {device_count} devices found")
if device_count > 0:
logger.info(f"Falling back to CUDA device 0")
return torch.device("cuda:0")
# Check for MPS (Apple Silicon)
if torch.backends.mps.is_available():
logger.info("Using MPS device (Apple Silicon)")
return torch.device("mps")
# Fall back to CPU
logger.info("Using CPU device")
return torch.device("cpu")
def _get_optimal_dtype(self, dtype, device):
"""Get optimal dtype based on device and requested dtype."""
# ROCm (HIP) benefits from float16 for memory efficiency
if device.type == "hip":
if dtype == torch.bfloat16:
logger.info("Using float16 for ROCm (better memory efficiency)")
return torch.float16
return torch.float32
# CUDA typically uses bfloat16
if device.type == "cuda":
if dtype == torch.float16:
logger.info("Using float16 for CUDA (better memory efficiency)") # ROCmからCUDAに修正
return torch.float16
elif dtype == torch.bfloat16: # bfloat16の場合のログを追加
logger.info("Using bfloat16 for CUDA")
return torch.bfloat16
return dtype
# CPU and MPS use float32
if device.type in ["cpu", "mps"]:
return torch.float32
return dtype
多分他にも変えたけど、へんなやり方して変更箇所が良く分らなくなってます。
なにせ、オフィシャルのACE-Stepとフォークされたものを変な風にまぜちゃったので・・・
後は頑張って下さい。
テキトーでホントスイマセン。
でもスパチャとか寄付とか無いし、そこまで共有を頑張る気にはなれない。
ちなみにちゃんと見てなかったんだけど、
フォーク版は
torch.hip.is_available()
とかでhipへの分岐があるんですが、これが true にならなくて
cudaに行ってしまうので、オフィシャルのでも動作するような気がしています。
ちゃんとした外部GPU積んでれば使えるのかな??
で色々終わったら
./scripts/start-acestep.sh --checkpoint_path /home/sou/tools/ACE-Step/checkpoint --port 7865 --device_id 0 --d_type float16 --torch_compile true --overlapped_decode true --server_name 0.0.0.0
でたちあがります。
–server_name 0.0.0.0 を渡しているので、ローカルネットワーク内の端末からなら、
IPアドレス:7865 でアクセス可能です。
ローカルAIで色々出来るのも面白いけど、
個人的にはROCmでCUDA互換で動いているのに感動。
AMD頑張って欲しいなー 安いしwww
ではでは
AOOSTAR GEM12 MAX ミニPC Ryzen 7 8745HS
AOOSTAR GEM12 MAX