*当サイトのリンクにはAmazonアソシエイトやアフィリエイトリンクが含まれております。

ローカル音楽生成AI ACE-Step を ミニPCの内蔵GPUで動かしてみる

結構久々の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


おすすめのコンテンツ

広告

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください